/* * Copyright 2012 Rui Araújo, Luís Fonseca * * This file is part of Router Keygen. * * Router Keygen is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Router Keygen is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Router Keygen. If not, see <http://www.gnu.org/licenses/>. */ package org.exobel.routerkeygen.algorithms; import android.os.Parcel; import android.os.Parcelable; import org.exobel.routerkeygen.R; import org.exobel.routerkeygen.config.AliceMagicInfo; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.List; import java.util.Locale; public class AliceItalyKeygen extends Keygen { public final static byte ALICE_SEED[/* 32 */] = {0x64, (byte) 0xC6, (byte) 0xDD, (byte) 0xE3, (byte) 0xE5, 0x79, (byte) 0xB6, (byte) 0xD9, (byte) 0x86, (byte) 0x96, (byte) 0x8D, 0x34, 0x45, (byte) 0xD2, 0x3B, 0x15, (byte) 0xCA, (byte) 0xAF, 0x12, (byte) 0x84, 0x02, (byte) 0xAC, 0x56, 0x00, 0x05, (byte) 0xCE, 0x20, 0x75, (byte) 0x91, 0x3F, (byte) 0xDC, (byte) 0xE8}; public static final Parcelable.Creator<AliceItalyKeygen> CREATOR = new Parcelable.Creator<AliceItalyKeygen>() { public AliceItalyKeygen createFromParcel(Parcel in) { return new AliceItalyKeygen(in); } public AliceItalyKeygen[] newArray(int size) { return new AliceItalyKeygen[size]; } }; final static private String preInitCharset = "0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvWxyz0123"; final private String ssidIdentifier; final private List<AliceMagicInfo> supportedAlice; public AliceItalyKeygen(String ssid, String mac, List<AliceMagicInfo> supportedAlice) { super(ssid, mac); this.ssidIdentifier = ssid.substring(ssid.length() - 8); this.supportedAlice = supportedAlice; } @SuppressWarnings("unchecked") private AliceItalyKeygen(Parcel in) { super(in); ssidIdentifier = in.readString(); supportedAlice = in .readArrayList(AliceMagicInfo.class.getClassLoader()); } @Override public List<String> getKeys() { if (supportedAlice == null || supportedAlice.isEmpty()) { setErrorCode(R.string.msg_erralicenotsupported); return null; } MessageDigest md; try { md = MessageDigest.getInstance("SHA-256"); } catch (NoSuchAlgorithmException e1) { setErrorCode(R.string.msg_nosha256); return null; } for (int j = 0; j < supportedAlice.size(); ++j) {/* For pre AGPF 4.5.0sx */ String serialStr = supportedAlice.get(j).getSerial() + "X"; int k = supportedAlice.get(j).getMagic()[0]; int Q = supportedAlice.get(j).getMagic()[1]; int serial = (Integer.valueOf(ssidIdentifier) - Q) / k; String tmp = Integer.toString(serial); for (int i = 0; i < 7 - tmp.length(); i++) { serialStr += "0"; } serialStr += tmp; byte[] mac = new byte[6]; String key = ""; byte[] hash; if (getMacAddress().length() == 12) { for (int i = 0; i < 12; i += 2) mac[i / 2] = (byte) ((Character.digit(getMacAddress() .charAt(i), 16) << 4) + Character.digit( getMacAddress().charAt(i + 1), 16)); md.reset(); md.update(ALICE_SEED); try { md.update(serialStr.getBytes("ASCII")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } md.update(mac); hash = md.digest(); for (int i = 0; i < 24; ++i) { key += preInitCharset.charAt(hash[i] & 0xFF); } addPassword(key); } /* For post AGPF 4.5.0sx */ String macEth = getMacAddress().substring(0, 6); for (int extraNumber = 0; extraNumber < 10; extraNumber++) { String calc = Integer.toHexString( Integer.valueOf(extraNumber + ssidIdentifier)) .toUpperCase(Locale.getDefault()); if (macEth.charAt(5) == calc.charAt(0)) { macEth += calc.substring(1); break; } } if (macEth.equals(getMacAddress().substring(0, 6))) { continue; } for (int i = 0; i < 12; i += 2) mac[i / 2] = (byte) ((Character.digit(macEth.charAt(i), 16) << 4) + Character .digit(macEth.charAt(i + 1), 16)); md.reset(); md.update(ALICE_SEED); try { md.update(serialStr.getBytes("ASCII")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } md.update(mac); key = ""; hash = md.digest(); for (int i = 0; i < 24; ++i) key += preInitCharset.charAt(hash[i] & 0xFF); addPassword(key); } return getResults(); } public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeString(ssidIdentifier); dest.writeList(supportedAlice); } }