private static void DoEncKeySetup(byte[] mk, int[] rk, int keyBits) {
var j = 0;
var w0 = new int[4];
var w1 = new int[4];
var w2 = new int[4];
var w3 = new int[4];
w0[0] = ToInt(mk[0], mk[1], mk[2], mk[3]);
w0[1] = ToInt(mk[4], mk[5], mk[6], mk[7]);
w0[2] = ToInt(mk[8], mk[9], mk[10], mk[11]);
w0[3] = ToInt(mk[12], mk[13], mk[14], mk[15]);
var q = (keyBits - 128) / 64;
var t0 = w0[0] ^ KRK[q][0];
var t1 = w0[1] ^ KRK[q][1];
var t2 = w0[2] ^ KRK[q][2];
var t3 = w0[3] ^ KRK[q][3];
t0 = TS1[(t0 >> 24) & 0xff] ^ TS2[(t0 >> 16) & 0xff] ^ TX1[(t0 >> 8) & 0xff] ^ TX2[t0 & 0xff];
t1 = TS1[(t1 >> 24) & 0xff] ^ TS2[(t1 >> 16) & 0xff] ^ TX1[(t1 >> 8) & 0xff] ^ TX2[t1 & 0xff];
t2 = TS1[(t2 >> 24) & 0xff] ^ TS2[(t2 >> 16) & 0xff] ^ TX1[(t2 >> 8) & 0xff] ^ TX2[t2 & 0xff];
t3 = TS1[(t3 >> 24) & 0xff] ^ TS2[(t3 >> 16) & 0xff] ^ TX1[(t3 >> 8) & 0xff] ^ TX2[t3 & 0xff];
t1 ^= t2;
t2 ^= t3;
t0 ^= t1;
t3 ^= t1;
t2 ^= t0;
t1 ^= t2;
t1 = Badc(t1);
t2 = Cdab(t2);
t3 = Dcba(t3);
t1 ^= t2;
t2 ^= t3;
t0 ^= t1;
t3 ^= t1;
t2 ^= t0;
t1 ^= t2;
if(keyBits > 128) {
w1[0] = ToInt(mk[16], mk[17], mk[18], mk[19]);
w1[1] = ToInt(mk[20], mk[21], mk[22], mk[23]);
if(keyBits > 192) {
w1[2] = ToInt(mk[24], mk[25], mk[26], mk[27]);
w1[3] = ToInt(mk[28], mk[29], mk[30], mk[31]);
}
else {
w1[2] = w1[3] = 0;
}
}
else {
w1[0] = w1[1] = w1[2] = w1[3] = 0;
}
w1[0] ^= (int)t0;
w1[1] ^= (int)t1;
w1[2] ^= (int)t2;
w1[3] ^= (int)t3;
t0 = w1[0];
t1 = w1[1];
t2 = w1[2];
t3 = w1[3];
q = (q == 2) ? 0 : (q + 1);
t0 ^= KRK[q][0];
t1 ^= KRK[q][1];
t2 ^= KRK[q][2];
t3 ^= KRK[q][3];
t0 = TX1[(t0 >> 24) & 0xff] ^ TX2[(t0 >> 16) & 0xff] ^ TS1[(t0 >> 8) & 0xff] ^ TS2[t0 & 0xff];
t1 = TX1[(t1 >> 24) & 0xff] ^ TX2[(t1 >> 16) & 0xff] ^ TS1[(t1 >> 8) & 0xff] ^ TS2[t1 & 0xff];
t2 = TX1[(t2 >> 24) & 0xff] ^ TX2[(t2 >> 16) & 0xff] ^ TS1[(t2 >> 8) & 0xff] ^ TS2[t2 & 0xff];
t3 = TX1[(t3 >> 24) & 0xff] ^ TX2[(t3 >> 16) & 0xff] ^ TS1[(t3 >> 8) & 0xff] ^ TS2[t3 & 0xff];
t1 ^= t2;
t2 ^= t3;
t0 ^= t1;
t3 ^= t1;
t2 ^= t0;
t1 ^= t2;
t3 = Badc(t3);
t0 = Cdab(t0);
t1 = Dcba(t1);
t1 ^= t2;
t2 ^= t3;
t0 ^= t1;
t3 ^= t1;
t2 ^= t0;
t1 ^= t2;
t0 ^= w0[0];
t1 ^= w0[1];
t2 ^= w0[2];
t3 ^= w0[3];
w2[0] = (int)t0;
w2[1] = (int)t1;
w2[2] = (int)t2;
w2[3] = (int)t3;
q = (q == 2) ? 0 : (q + 1);
t0 ^= KRK[q][0];
t1 ^= KRK[q][1];
t2 ^= KRK[q][2];
t3 ^= KRK[q][3];
t0 = TS1[(t0 >> 24) & 0xff] ^ TS2[(t0 >> 16) & 0xff] ^ TX1[(t0 >> 8) & 0xff] ^ TX2[t0 & 0xff];
t1 = TS1[(t1 >> 24) & 0xff] ^ TS2[(t1 >> 16) & 0xff] ^ TX1[(t1 >> 8) & 0xff] ^ TX2[t1 & 0xff];
t2 = TS1[(t2 >> 24) & 0xff] ^ TS2[(t2 >> 16) & 0xff] ^ TX1[(t2 >> 8) & 0xff] ^ TX2[t2 & 0xff];
t3 = TS1[(t3 >> 24) & 0xff] ^ TS2[(t3 >> 16) & 0xff] ^ TX1[(t3 >> 8) & 0xff] ^ TX2[t3 & 0xff];
t1 ^= t2;
t2 ^= t3;
t0 ^= t1;
t3 ^= t1;
t2 ^= t0;
t1 ^= t2;
t1 = Badc(t1);
t2 = Cdab(t2);
t3 = Dcba(t3);
t1 ^= t2;
t2 ^= t3;
t0 ^= t1;
t3 ^= t1;
t2 ^= t0;
t1 ^= t2;
w3[0] = (int)t0 ^ w1[0];
w3[1] = (int)t1 ^ w1[1];
w3[2] = (int)t2 ^ w1[2];
w3[3] = (int)t3 ^ w1[3];
Gsrk(w0, w1, 19, rk, j);
j += 4;
Gsrk(w1, w2, 19, rk, j);
j += 4;
Gsrk(w2, w3, 19, rk, j);
j += 4;
Gsrk(w3, w0, 19, rk, j);
j += 4;
Gsrk(w0, w1, 31, rk, j);
j += 4;
Gsrk(w1, w2, 31, rk, j);
j += 4;
Gsrk(w2, w3, 31, rk, j);
j += 4;
Gsrk(w3, w0, 31, rk, j);
j += 4;
Gsrk(w0, w1, 67, rk, j);
j += 4;
Gsrk(w1, w2, 67, rk, j);
j += 4;
Gsrk(w2, w3, 67, rk, j);
j += 4;
Gsrk(w3, w0, 67, rk, j);
j += 4;
Gsrk(w0, w1, 97, rk, j);
j += 4;
if(keyBits > 128) {
Gsrk(w1, w2, 97, rk, j);
j += 4;
Gsrk(w2, w3, 97, rk, j);
j += 4;
}
if(keyBits > 192) {
Gsrk(w3, w0, 97, rk, j);
j += 4;
Gsrk(w0, w1, 109, rk, j);
}
}