/** Compile SBOXes */ | |
function toHex(n) { | |
n = n >>> 0; | |
return (n < 0) ? ("-0x" + (-n).toString(16)) : ("0x" + n.toString(16)); | |
} | |
/** | |
* The bits the SBOXes operate upon | |
*/ | |
var SBOX_BITS = new Array(8); | |
SBOX_BITS[0] = [ 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x08000000, | |
0x00000001 ]; | |
SBOX_BITS[1] = [ 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x00800000, | |
0x10000000 ]; | |
SBOX_BITS[2] = [ 0x00100000, 0x00200000, 0x00400000, 0x00800000, 0x00080000, | |
0x01000000 ]; | |
SBOX_BITS[3] = [ 0x00010000, 0x00020000, 0x00040000, 0x00080000, 0x00008000, | |
0x00100000 ]; | |
SBOX_BITS[4] = [ 0x00001000, 0x00002000, 0x00004000, 0x00008000, 0x00000800, | |
0x00010000 ]; | |
SBOX_BITS[5] = [ 0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00000080, | |
0x00001000 ]; | |
SBOX_BITS[6] = [ 0x00000010, 0x00000020, 0x00000040, 0x00000080, 0x00000008, | |
0x00000100 ]; | |
SBOX_BITS[7] = [ 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x80000000, | |
0x00000010 ]; | |
/** The raw SBOXes */ | |
var SBOX = new Array(8); | |
SBOX[0] = [ 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, | |
14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, | |
12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, | |
6, 13 ]; | |
SBOX[1] = [ 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, | |
15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7, 11, 10, 4, 13, 1, 5, | |
8, 12, 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, | |
14, 9 ]; | |
SBOX[2] = [ 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, | |
3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, | |
1, 2, 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, | |
2, 12 ]; | |
SBOX[3] = [ 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, | |
6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 10, 6, 9, 0, 12, 11, 7, 13, 15, | |
1, 3, 14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, | |
14 ]; | |
SBOX[4] = [ 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 14, 11, 2, | |
12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 4, 2, 1, 11, 10, 13, 7, 8, | |
15, 9, 12, 5, 6, 3, 0, 14, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, | |
4, 5, 3 ]; | |
SBOX[5] = [ 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 10, 15, 4, 2, | |
7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 9, 14, 15, 5, 2, 8, 12, 3, 7, | |
0, 4, 10, 1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, | |
8, 13 ]; | |
SBOX[6] = [ 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 0, 11, 7, | |
4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 1, 4, 11, 13, 12, 3, 7, 14, 10, | |
15, 6, 8, 0, 5, 9, 2, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, | |
12 ]; | |
SBOX[7] = [ 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 1, 15, 13, 8, | |
10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 7, 11, 4, 1, 9, 12, 14, 2, 0, | |
6, 10, 13, 15, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, | |
6, 11 ]; | |
/** | |
* Post SBOX permutation. This calls the MSB bit 1 and the LSB bit 32. | |
*/ | |
var PERM1 = [ 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 2, | |
8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 ]; | |
// invert the permutation | |
var PERM = new Array(32); | |
for ( var i = 0; i < 32; i++) { | |
PERM[PERM1[i] - 1] = i; | |
} | |
// this produces: | |
// 8,16,22,30 box 0 | |
// 12,27, 1,17 box 1 | |
// 23,15,29, 5 box 2 | |
// 25,19, 9, 0 box 3 | |
// 7,13,24, 2 box 4 | |
// 3,28,10,18 box 5 | |
// 31,11,21, 6 box 6 | |
// 4,26,14,20 box 7 | |
for ( var box = 0; box <= 7; box++) { | |
print("\nSBOX[" + box + "] = new Array();"); | |
for ( var ind = 0; ind <= 63; ind++) { | |
var n = ind; | |
var match = 0; | |
for ( var i = 0; i < 6; i++) { | |
if (n & 1) { | |
match = match + SBOX_BITS[box][i]; | |
} | |
n = n >> 1; | |
} | |
var res = 0; | |
var n = SBOX[box][ind]; | |
var b = 1; | |
for ( var i = 0; i < 4; i++) { | |
if (n & b) { | |
var bit = box * 4 + (3 - i); | |
bit = PERM[bit]; | |
bit = 31 - bit; | |
res += Math.pow(2, bit); | |
} | |
b *= 2; | |
} | |
var mm = match; | |
match = (match ^ 1) ^ 1; | |
print("SBOX[" + box + "][" + match + "]= 0x" + res.toString(16) | |
+ "; // " + mm.toString(16) + " (" + (ind >> 4) + ", " | |
+ (ind & 15) + ") = " + n); | |
} | |
} | |
exit; |