/* * 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.JenkinsHash; import org.exobel.routerkeygen.R; import java.util.List; /* * The algorithm for the FASTWEB Telsey * SSID of the form: * FASTWEB-1-002196XXXXXX * FASTWEB-1-00036FXXXXXX * where X is a hexadecimal digit. * Algorithm: * Get the mac as an array of bytes and scramble them * as the mentioned on the link. * Use the hashword from Bob Jenkins to compute recursively * a hash from the array calculated above. * Save the resulting hash as a hexadecimal string. * Produce a second vector with the rules specified below * Use the hashword from Bob Jenkins to compute recursively * a hash from the array calculated above. * Save the resulting hash as a hexadecimal string. * The key will be the final 5 characters of the first string * and first 5 from the second string. * Credit: * http://www.pcpedia.it/Hacking/algoritmi-di-generazione-wpa-alice-e-fastweb-e-lavidita-del-sapere.html * http://wifiresearchers.wordpress.com/2010/09/09/telsey-fastweb-full-disclosure/ */ public class TelseyKeygen extends Keygen implements Parcelable { public static final Parcelable.Creator<TelseyKeygen> CREATOR = new Parcelable.Creator<TelseyKeygen>() { public TelseyKeygen createFromParcel(Parcel in) { return new TelseyKeygen(in); } public TelseyKeygen[] newArray(int size) { return new TelseyKeygen[size]; } }; public TelseyKeygen(String ssid, String mac) { super(ssid, mac); } private TelseyKeygen(Parcel in) { super(in); } //Scramble Function private long[] scrambler(String mac) { long[] vector = new long[64]; byte[] macValue = new byte[6]; for (int i = 0; i < 12; i += 2) macValue[i / 2] = (byte) ((Character.digit(mac.charAt(i), 16) << 4) + Character.digit(mac.charAt(i + 1), 16)); vector[0] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[5]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[0]) << 8) | (0xFF & macValue[5]))); vector[1] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[1]) << 24) | ((0xFF & macValue[0]) << 16) | ((0xFF & macValue[1]) << 8) | (0xFF & macValue[5]))); vector[2] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[4]) << 24) | ((0xFF & macValue[2]) << 16) | ((0xFF & macValue[3]) << 8) | (0xFF & macValue[2]))); vector[3] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[4]) << 24) | ((0xFF & macValue[3]) << 16) | ((0xFF & macValue[2]) << 8) | (0xFF & macValue[2]))); vector[4] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[2]) << 24) | ((0xFF & macValue[4]) << 16) | ((0xFF & macValue[2]) << 8) | (0xFF & macValue[0]))); vector[5] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[2]) << 24) | ((0xFF & macValue[5]) << 16) | ((0xFF & macValue[3]) << 8) | (0xFF & macValue[1]))); vector[6] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[0]) << 24) | ((0xFF & macValue[4]) << 16) | ((0xFF & macValue[0]) << 8) | (0xFF & macValue[1]))); vector[7] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[1]) << 24) | ((0xFF & macValue[4]) << 16) | ((0xFF & macValue[1]) << 8) | (0xFF & macValue[0]))); vector[8] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[2]) << 24) | ((0xFF & macValue[4]) << 16) | ((0xFF & macValue[2]) << 8) | (0xFF & macValue[2]))); vector[9] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[3]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[3]) << 8) | (0xFF & macValue[4]))); vector[10] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[4]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[4]) << 8) | (0xFF & macValue[3]))); vector[11] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[5]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[5]) << 8) | (0xFF & macValue[5]))); vector[12] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[2]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[0]) << 8) | (0xFF & macValue[5]))); vector[13] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[1]) << 24) | ((0xFF & macValue[0]) << 16) | ((0xFF & macValue[1]) << 8) | (0xFF & macValue[1]))); vector[14] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[4]) << 24) | ((0xFF & macValue[2]) << 16) | ((0xFF & macValue[1]) << 8) | (0xFF & macValue[3]))); vector[15] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[3]) << 24) | ((0xFF & macValue[3]) << 16) | ((0xFF & macValue[5]) << 8) | (0xFF & macValue[2]))); vector[16] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[4]) << 24) | ((0xFF & macValue[4]) << 16) | ((0xFF & macValue[5]) << 8) | (0xFF & macValue[4]))); vector[17] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[5]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[4]) << 8) | (0xFF & macValue[0]))); vector[18] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[2]) << 24) | ((0xFF & macValue[5]) << 16) | ((0xFF & macValue[0]) << 8) | (0xFF & macValue[5]))); vector[19] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[2]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[3]) << 8) | (0xFF & macValue[5]))); vector[20] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[5]) << 24) | ((0xFF & macValue[2]) << 16) | ((0xFF & macValue[2]) << 8) | (0xFF & macValue[4]))); vector[21] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[2]) << 24) | ((0xFF & macValue[3]) << 16) | ((0xFF & macValue[1]) << 8) | (0xFF & macValue[4]))); vector[22] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[0]) << 24) | ((0xFF & macValue[4]) << 16) | ((0xFF & macValue[4]) << 8) | (0xFF & macValue[3]))); vector[23] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[3]) << 24) | ((0xFF & macValue[0]) << 16) | ((0xFF & macValue[5]) << 8) | (0xFF & macValue[3]))); vector[24] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[4]) << 24) | ((0xFF & macValue[3]) << 16) | ((0xFF & macValue[0]) << 8) | (0xFF & macValue[0]))); vector[25] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[3]) << 24) | ((0xFF & macValue[2]) << 16) | ((0xFF & macValue[1]) << 8) | (0xFF & macValue[1]))); vector[26] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[2]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[2]) << 8) | (0xFF & macValue[5]))); vector[27] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[1]) << 24) | ((0xFF & macValue[3]) << 16) | ((0xFF & macValue[4]) << 8) | (0xFF & macValue[3]))); vector[28] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[0]) << 24) | ((0xFF & macValue[2]) << 16) | ((0xFF & macValue[3]) << 8) | (0xFF & macValue[4]))); vector[29] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[0]) << 24) | ((0xFF & macValue[0]) << 16) | ((0xFF & macValue[2]) << 8) | (0xFF & macValue[2]))); vector[30] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[0]) << 24) | ((0xFF & macValue[0]) << 16) | ((0xFF & macValue[0]) << 8) | (0xFF & macValue[5]))); vector[31] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[1]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[1]) << 8) | (0xFF & macValue[4]))); vector[32] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[4]) << 24) | ((0xFF & macValue[0]) << 16) | ((0xFF & macValue[2]) << 8) | (0xFF & macValue[2]))); vector[33] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[3]) << 24) | ((0xFF & macValue[3]) << 16) | ((0xFF & macValue[3]) << 8) | (0xFF & macValue[0]))); vector[34] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[0]) << 24) | ((0xFF & macValue[2]) << 16) | ((0xFF & macValue[4]) << 8) | (0xFF & macValue[1]))); vector[35] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[5]) << 24) | ((0xFF & macValue[5]) << 16) | ((0xFF & macValue[5]) << 8) | (0xFF & macValue[0]))); vector[36] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[0]) << 24) | ((0xFF & macValue[4]) << 16) | ((0xFF & macValue[5]) << 8) | (0xFF & macValue[0]))); vector[37] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[1]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[5]) << 8) | (0xFF & macValue[2]))); vector[38] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[2]) << 24) | ((0xFF & macValue[2]) << 16) | ((0xFF & macValue[5]) << 8) | (0xFF & macValue[1]))); vector[39] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[3]) << 24) | ((0xFF & macValue[3]) << 16) | ((0xFF & macValue[2]) << 8) | (0xFF & macValue[3]))); vector[40] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[1]) << 24) | ((0xFF & macValue[0]) << 16) | ((0xFF & macValue[2]) << 8) | (0xFF & macValue[4]))); vector[41] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[1]) << 24) | ((0xFF & macValue[5]) << 16) | ((0xFF & macValue[2]) << 8) | (0xFF & macValue[5]))); vector[42] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[0]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[4]) << 8) | (0xFF & macValue[0]))); vector[43] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[1]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[1]) << 8) | (0xFF & macValue[4]))); vector[44] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[2]) << 24) | ((0xFF & macValue[2]) << 16) | ((0xFF & macValue[2]) << 8) | (0xFF & macValue[2]))); vector[45] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[3]) << 24) | ((0xFF & macValue[3]) << 16) | ((0xFF & macValue[3]) << 8) | (0xFF & macValue[3]))); vector[46] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[5]) << 24) | ((0xFF & macValue[4]) << 16) | ((0xFF & macValue[0]) << 8) | (0xFF & macValue[1]))); vector[47] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[4]) << 24) | ((0xFF & macValue[0]) << 16) | ((0xFF & macValue[5]) << 8) | (0xFF & macValue[5]))); vector[48] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[1]) << 24) | ((0xFF & macValue[0]) << 16) | ((0xFF & macValue[5]) << 8) | (0xFF & macValue[0]))); vector[49] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[0]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[5]) << 8) | (0xFF & macValue[1]))); vector[50] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[2]) << 24) | ((0xFF & macValue[2]) << 16) | ((0xFF & macValue[4]) << 8) | (0xFF & macValue[2]))); vector[51] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[3]) << 24) | ((0xFF & macValue[4]) << 16) | ((0xFF & macValue[4]) << 8) | (0xFF & macValue[3]))); vector[52] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[4]) << 24) | ((0xFF & macValue[3]) << 16) | ((0xFF & macValue[1]) << 8) | (0xFF & macValue[5]))); vector[53] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[5]) << 24) | ((0xFF & macValue[5]) << 16) | ((0xFF & macValue[1]) << 8) | (0xFF & macValue[4]))); vector[54] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[3]) << 24) | ((0xFF & macValue[0]) << 16) | ((0xFF & macValue[1]) << 8) | (0xFF & macValue[5]))); vector[55] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[3]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[0]) << 8) | (0xFF & macValue[4]))); vector[56] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[4]) << 24) | ((0xFF & macValue[2]) << 16) | ((0xFF & macValue[2]) << 8) | (0xFF & macValue[5]))); vector[57] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[4]) << 24) | ((0xFF & macValue[3]) << 16) | ((0xFF & macValue[3]) << 8) | (0xFF & macValue[1]))); vector[58] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[2]) << 24) | ((0xFF & macValue[4]) << 16) | ((0xFF & macValue[3]) << 8) | (0xFF & macValue[0]))); vector[59] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[2]) << 24) | ((0xFF & macValue[3]) << 16) | ((0xFF & macValue[5]) << 8) | (0xFF & macValue[1]))); vector[60] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[3]) << 24) | ((0xFF & macValue[1]) << 16) | ((0xFF & macValue[2]) << 8) | (0xFF & macValue[3]))); vector[61] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[5]) << 24) | ((0xFF & macValue[0]) << 16) | ((0xFF & macValue[1]) << 8) | (0xFF & macValue[2]))); vector[62] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[5]) << 24) | ((0xFF & macValue[3]) << 16) | ((0xFF & macValue[4]) << 8) | (0xFF & macValue[1]))); vector[63] = 0xFFFFFFFFL & ((long) (((0xFF & macValue[0]) << 24) | ((0xFF & macValue[2]) << 16) | ((0xFF & macValue[3]) << 8) | (0xFF & macValue[0]))); return vector; } @Override public List<String> getKeys() { JenkinsHash hash = new JenkinsHash(); if (getMacAddress().length() < 12) { setErrorCode(R.string.msg_nomac); return null; } long[] key = scrambler(getMacAddress()); long seed = 0; for (int x = 0; x < 64; x++) { seed = hash.hashword(key, x, seed); } String S1 = Long.toHexString(seed); while (S1.length() < 8) S1 = "0" + S1; for (int x = 0; x < 64; x++) { if (x < 8) key[x] = (key[x] << 3); else if (x < 16) key[x] >>>= 5; else if (x < 32) key[x] >>>= 2; else key[x] = (key[x] << 7); } seed = 0; for (int x = 0; x < 64; x++) { seed = hash.hashword(key, x, seed); } String S2 = Long.toHexString(seed); while (S2.length() < 8) S2 = "0" + S2; addPassword(S1.substring(S1.length() - 5) + S2.substring(0, 5)); return getResults(); } }