/*
* 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 .
*/
#include "TelseyKeygen.h"
#include
#include
TelseyKeygen::TelseyKeygen(QString ssid, QString mac) :
Keygen(ssid, mac) {
kgname = "Telsey";
}
QVector & TelseyKeygen::getKeys() {
if ( getMacAddress() == "" )
{
throw ERROR;
}
uint32_t * key = scrambler(getMacAddress());
uint32_t seed = 0;
for (int x = 0; x < 64; x++) {
seed = hashword(key,x, seed);
}
QString S1 = "";
S1.setNum(seed,16);
while ( S1.length() < 8 )
S1 = "0" + S1;
for ( int x = 0; x <64; x++) {
if (x <8)
key[x] =( key[x]<< 3 ) & 0xFFFFFFFF;
else if ( x<16)
key[x] >>= 5;
else if (x < 32 )
key[x] >>= 2;
else
key[x] =( key[x]<< 7 ) & 0xFFFFFFFF;
}
seed = 0;
for (int x = 0; x < 64; x++) {
seed = hashword(key, x, seed);
}
QString S2 = "";
S2.setNum(seed,16);
while ( S2.length() < 8 )
S2 = "0" + S2;
results.append(S1.right(5) + S2.left(5));
return results;
}
//Scramble Function
uint32_t * TelseyKeygen::scrambler(QString mac){
uint32_t * vector = new uint32_t [64];
bool status;
char macValue[6];
for (int i = 0; i < 12; i += 2)
macValue[i / 2] = (mac.mid(i,1).toInt(&status, 16) << 4)
+ mac.mid(i + 1,1).toInt(&status, 16);
vector[0] =( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[5] ) );
vector[1] =( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[5] ) );
vector[2] =( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[2] ) );
vector[3] =( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) );
vector[4] =( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[0] ) );
vector[5] =( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[1] ) );
vector[6] =( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[1] ) );
vector[7] =( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[0] ) );
vector[8] =( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) );
vector[9] =( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[4] ) );
vector[10]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[3] ) );
vector[11]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[5] ) );
vector[12]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[5] ) );
vector[13]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[1] ) );
vector[14]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[3] ) );
vector[15]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[2] ) );
vector[16]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[4] ) );
vector[17]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[0] ) );
vector[18]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[5] ) );
vector[19]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[5] ) );
vector[20]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[4] ) );
vector[21]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[4] ) );
vector[22]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[3] ) );
vector[23]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[3] ) );
vector[24]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[0] ) );
vector[25]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[1] ) );
vector[26]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[5] ) );
vector[27]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[3] ) );
vector[28]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[4] ) );
vector[29]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) );
vector[30]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[5] ) );
vector[31]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[4] ) );
vector[32]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) );
vector[33]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[0] ) );
vector[34]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[1] ) );
vector[35]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[0] ) );
vector[36]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[0] ) );
vector[37]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[2] ) );
vector[38]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[1] ) );
vector[39]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[3] ) );
vector[40]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[4] ) );
vector[41]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[5] ) );
vector[42]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[0] ) );
vector[43]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[4] ) );
vector[44]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[2] ) );
vector[45]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[3] ) );
vector[46]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[1] ) );
vector[47]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[5] ) );
vector[48]=( ( ( 0xFF & macValue[1] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[0] ) );
vector[49]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[1] ) );
vector[50]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[2] ) );
vector[51]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[3] ) );
vector[52]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[5] ) );
vector[53]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[5] ) << 16 ) |
( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[4] ) );
vector[54]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[5] ) );
vector[55]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[0] ) << 8 )|( 0xFF & macValue[4] ) );
vector[56]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[5] ) );
vector[57]=( ( ( 0xFF & macValue[4] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[1] ) );
vector[58]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[4] ) << 16 ) |
( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[0] ) );
vector[59]=( ( ( 0xFF & macValue[2] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
( ( 0xFF & macValue[5] ) << 8 )|( 0xFF & macValue[1] ) );
vector[60]=( ( ( 0xFF & macValue[3] ) << 24 )|( ( 0xFF & macValue[1] ) << 16 ) |
( ( 0xFF & macValue[2] ) << 8 )|( 0xFF & macValue[3] ) );
vector[61]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[0] ) << 16 ) |
( ( 0xFF & macValue[1] ) << 8 )|( 0xFF & macValue[2] ) );
vector[62]=( ( ( 0xFF & macValue[5] ) << 24 )|( ( 0xFF & macValue[3] ) << 16 ) |
( ( 0xFF & macValue[4] ) << 8 )|( 0xFF & macValue[1] ) );
vector[63]=( ( ( 0xFF & macValue[0] ) << 24 )|( ( 0xFF & macValue[2] ) << 16 ) |
( ( 0xFF & macValue[3] ) << 8 )|( 0xFF & macValue[0] ) );
return vector;
}
//lookup3.c, by Bob Jenkins, May 2006, Public Domain.
#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
#define mix(a,b,c) \
{ \
a -= c; a ^= rot(c, 4); c += b; \
b -= a; b ^= rot(a, 6); a += c; \
c -= b; c ^= rot(b, 8); b += a; \
a -= c; a ^= rot(c,16); c += b; \
b -= a; b ^= rot(a,19); a += c; \
c -= b; c ^= rot(b, 4); b += a; \
}
#define final(a,b,c) \
{ \
c ^= b; c -= rot(b,14); \
a ^= c; a -= rot(c,11); \
b ^= a; b -= rot(a,25); \
c ^= b; c -= rot(b,16); \
a ^= c; a -= rot(c,4); \
b ^= a; b -= rot(a,14); \
c ^= b; c -= rot(b,24); \
}
uint32_t TelseyKeygen::hashword(
const uint32_t * k, /* the key, an array of uint32_t values */
size_t length, /* the length of the key, in uint32_ts */
uint32_t initval) /* the previous hash, or an arbitrary value */
{
uint32_t a,b,c;
/* Set up the internal state */
a = b = c = 0xdeadbeef + (((uint32_t)length)<<2) + initval;
/*------------------------------------------------- handle most of the key */
while (length > 3)
{
a += k[0];
b += k[1];
c += k[2];
mix(a,b,c);
length -= 3;
k += 3;
}
/*------------------------------------------- handle the last 3 uint32_t's */
switch(length) /* all the case statements fall through */
{
case 3 : c+=k[2];
/* Falls through. */
case 2 : b+=k[1];
/* Falls through. */
case 1 : a+=k[0];
final(a,b,c);
/* Falls through. */
case 0: /* case 0: nothing left to add */
break;
}
/*------------------------------------------------------ report the result */
return c;
}