blob: 11ebcb95e987b59a9201b380c84a4a94d155bd82 [file] [log] [blame]
/** 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;