.todo/miapp.tools.aes.js
function keyExpansion(key) {  // generate Key Schedule (byte-array Nr+1 x Nb) from Key [�5.2]
        var Nb = 4; // Number of columns (32-bit words) comprising the State. For this standard, Nb = 4.
        var Nk = key.length / 4;  // Number of 32-bit words comprising the Cipher Key. Nk = 4/6/8 for 128/192/256-bit keys
        var Nr = Nk + 6;       // Number of rounds. Nr = 10/12/14 for 128/192/256-bit keys
        var trace;

        var w = new Array(Nb * (Nr + 1));
        var temp = new Array(4);

        for (var i = 0; i < Nk; i++) {
            var r = [key[4 * i], key[4 * i + 1], key[4 * i + 2], key[4 * i + 3]];
            w[i] = r;
            /*
             trace = new Array(4);
             for (var t = 0; t < 4; t++) trace[t] = String.fromCharCode(w[i][t]);
             console.log('w['+i+']='+fidj.Hex.encode(trace.join('')));
             */
        }

        for (var i = Nk; i < (Nb * (Nr + 1)); i++) {
            w[i] = new Array(4);
            for (var t = 0; t < 4; t++) temp[t] = w[i - 1][t];
            if (i % Nk == 0) {
                temp = subWord(rotWord(temp));
                for (var t = 0; t < 4; t++) temp[t] ^= rCon[i / Nk][t];
            } else if (Nk > 6 && i % Nk == 4) {
                temp = subWord(temp);
            }
            for (var t = 0; t < 4; t++) w[i][t] = w[i - Nk][t] ^ temp[t];
            /*
             trace = new Array(4);
             for (var t = 0; t < 4; t++) trace[t] = String.fromCharCode(w[i][t]);
             console.log('w['+i+']='+fidj.Hex.encode(trace.join('')));
             */
        }

        return w;
    }
function keyExpansion(key) {  // generate Key Schedule (byte-array Nr+1 x Nb) from Key [�5.2]
        var Nb = 4; // Number of columns (32-bit words) comprising the State. For this standard, Nb = 4.
        var Nk = key.length / 4;  // Number of 32-bit words comprising the Cipher Key. Nk = 4/6/8 for 128/192/256-bit keys
        var Nr = Nk + 6;       // Number of rounds. Nr = 10/12/14 for 128/192/256-bit keys
        var trace;

        var w = new Array(Nb * (Nr + 1));
        var temp = new Array(4);

        for (var i = 0; i < Nk; i++) {
            var r = [key[4 * i], key[4 * i + 1], key[4 * i + 2], key[4 * i + 3]];
            w[i] = r;
            /*
             trace = new Array(4);
             for (var t = 0; t < 4; t++) trace[t] = String.fromCharCode(w[i][t]);
             console.log('w['+i+']='+fidj.Hex.encode(trace.join('')));
             */
        }

        for (var i = Nk; i < (Nb * (Nr + 1)); i++) {
            w[i] = new Array(4);
            for (var t = 0; t < 4; t++) temp[t] = w[i - 1][t];
            if (i % Nk == 0) {
                temp = subWord(rotWord(temp));
                for (var t = 0; t < 4; t++) temp[t] ^= rCon[i / Nk][t];
            } else if (Nk > 6 && i % Nk == 4) {
                temp = subWord(temp);
            }
            for (var t = 0; t < 4; t++) w[i][t] = w[i - Nk][t] ^ temp[t];
            /*
             trace = new Array(4);
             for (var t = 0; t < 4; t++) trace[t] = String.fromCharCode(w[i][t]);
             console.log('w['+i+']='+fidj.Hex.encode(trace.join('')));
             */
        }

        return w;
    }
function keyExpansion ( key ) { // generate Key Schedule (byte-array Nr+1 x Nb) from Key [�5.2] var Nb = 4 ; // Number of columns (32-bit words) comprising the State. For this standard, Nb = 4. var Nk = key . length / 4 ; // Number of 32-bit words comprising the Cipher Key. Nk = 4/6/8 for 128/192/256-bit keys var Nr = Nk + 6 ; // Number of rounds. Nr = 10/12/14 for 128/192/256-bit keys var trace ; var w = new Array ( Nb * ( Nr + 1 ) ) ; var temp = new Array ( 4 ) ; for ( var i = 0 ; i < Nk ; i ++ ) { var r = [ key [ 4 * i ] , key [ 4 * i + 1 ] , key [ 4 * i + 2 ] , key [ 4 * i + 3 ] ] ; w [ i ] = r ; /*
             trace = new Array(4);
             for (var t = 0; t < 4; t++) trace[t] = String.fromCharCode(w[i][t]);
             console.log('w['+i+']='+fidj.Hex.encode(trace.join('')));
             */ } for ( var i = Nk ; i < ( Nb * ( Nr + 1 ) ) ; i ++ ) { w [ i ] = new Array ( 4 ) ; for ( var t = 0 ; t < 4 ; t ++ ) temp [ t ] = w [ i - 1 ] [ t ] ; if ( i % Nk == 0 ) { temp = subWord ( rotWord ( temp ) ) ; for ( var t = 0 ; t < 4 ; t ++ ) temp [ t ] ^= rCon [ i / Nk ] [ t ] ; } else if ( Nk > 6 && i % Nk == 4 ) { temp = subWord ( temp ) ; } for ( var t = 0 ; t < 4 ; t ++ ) w [ i ] [ t ] = w [ i - Nk ] [ t ] ^ temp [ t ] ; /*
             trace = new Array(4);
             for (var t = 0; t < 4; t++) trace[t] = String.fromCharCode(w[i][t]);
             console.log('w['+i+']='+fidj.Hex.encode(trace.join('')));
             */ } return w ; }
Perform Key Expansion to generate a Key Schedule

@param {Number[]} key Key as 16/24/32-byte array
@returns {Number[][]} Expanded key schedule as 2D byte-array (Nr+1 x Nb bytes)
Perform Key Expansion to generate a Key Schedule