in src/aes.js [118:188]
init: function(m, nk, key, iv) { /* Key=16 bytes */
/* Key Scheduler. Create expanded encryption key */
var CipherKey = [],
b = [],
i, j, k, N, nr;
nk /= 4;
if (nk != 4 && nk != 6 && nk != 8) {
return false;
}
nr = 6 + nk;
this.Nk = nk;
this.Nr = nr;
this.reset(m, iv);
N = 4 * (nr + 1);
for (i = j = 0; i < nk; i++, j += 4) {
for (k = 0; k < 4; k++) {
b[k] = key[j + k];
}
CipherKey[i] = AES.pack(b);
}
for (i = 0; i < nk; i++) {
this.fkey[i] = CipherKey[i];
}
for (j = nk, k = 0; j < N; j += nk, k++) {
this.fkey[j] = this.fkey[j - nk] ^ AES.SubByte(AES.ROTL24(this.fkey[j - 1])) ^ (AES.rco[k]) & 0xff;
if (nk<=6)
{
for (i = 1; i < nk && (i + j) < N; i++) {
this.fkey[i + j] = this.fkey[i + j - nk] ^ this.fkey[i + j - 1];
}
} else {
for (i = 1; i < 4 && (i + j) < N; i++) {
this.fkey[i + j] = this.fkey[i + j - nk] ^ this.fkey[i + j - 1];
}
if ((j + 4) < N) {
this.fkey[j + 4] = this.fkey[j + 4 - nk] ^ AES.SubByte(this.fkey[j + 3]);
}
for (i = 5; i < nk && (i + j) < N; i++) {
this.fkey[i + j] = this.fkey[i + j - nk] ^ this.fkey[i + j - 1];
}
}
}
/* now for the expanded decrypt key in reverse order */
for (j = 0; j < 4; j++) {
this.rkey[j + N - 4] = this.fkey[j];
}
for (i = 4; i < N - 4; i += 4) {
k = N - 4 - i;
for (j = 0; j < 4; j++) {
this.rkey[k + j] = AES.InvMixCol(this.fkey[i + j]);
}
}
for (j = N - 4; j < N; j++) {
this.rkey[j - N + 4] = this.fkey[j];
}
},