docs: function makeKey(aKey) {
  
          if (aKey &&
            utils.isAnArray(aKey)) {
  
            var keyLenght = aKey.length
              , tmpKey = []
              , index = 0
              , nValue
              , limitedKey
              , k64Cnt = keyLenght / 8
              , subkeyCnt = ROUND_SUBKEYS + 2 * ROUNDS
              , k32e = []
              , k32o = []
              , sBoxKey = []
              , i
              , j
              , offset = 0
              , q
              , A
              , B
              , subKeys = []
              , lB0
              , lB1
              , lB2
              , lB3
              , sBox = []
              , k0
              , k1
              , k2
              , k3;
            if (keyLenght < 8 ||
                keyLenght > 8 && keyLenght < 16 ||
                keyLenght > 16 && keyLenght < 24 ||
                keyLenght > 24 && keyLenght < 32) {
  
              for (index = 0; index < aKey.length + (8 - aKey.length); index += 1) {
  
                nValue = aKey[index];
                if (nValue !== undefined) {
  
                  tmpKey.push(nValue);
                } else {
  
                  tmpKey.push(0x00);
                }
              }
              aKey = tmpKey;
            } else if (keyLenght > 32) {
  
              limitedKey = [];
              for (index = 0; index < 32; index += 1) {
  
                limitedKey.push(aKey[index]);
              }
              aKey = limitedKey;
            }
            aKey = new Uint8Array(aKey);
            keyLenght = aKey.length;
            for (i = 0, j = k64Cnt - 1; i < 4 && offset < keyLenght; i += 1, j -= 1) {
  
              /*eslint-disable no-plusplus*/
              k32e[i] = aKey[offset++] & 0xFF | (aKey[offset++] & 0xFF) << 8 | (aKey[offset++] & 0xFF) << 16 | (aKey[offset++] & 0xFF) << 24;
              k32o[i] = aKey[offset++] & 0xFF | (aKey[offset++] & 0xFF) << 8 | (aKey[offset++] & 0xFF) << 16 | (aKey[offset++] & 0xFF) << 24;
              /*eslint-enable no-plusplus*/
              sBoxKey[j] = rsMDSEncode(k32e[i], k32o[i]);
            }
            for (i = q = 0; i < subkeyCnt / 2; i += 1, q += SK_STEP) {
  
              A = f32(k64Cnt, q, k32e);
              B = f32(k64Cnt, q + SK_BUMP, k32o);
              B = B << 8 | B >>> 24;
              A += B;
              subKeys[2 * i] = A;
              A += B;
              subKeys[2 * i + 1] = A << SK_ROTL | A >>> 32 - SK_ROTL;
            }
            k0 = sBoxKey[0];
            k1 = sBoxKey[1];
            k2 = sBoxKey[2];
            k3 = sBoxKey[3];
            for (i = 0; i < 256; i += 1) {
  
              lB0 = lB1 = lB2 = lB3 = i;
              switch (k64Cnt & 3) {
  
                case 1:
                  sBox[2 * i] = MDS[0][P[P_01][lB0] & 0xFF ^ b0(k0)];
                  sBox[2 * i + 1] = MDS[1][P[P_11][lB1] & 0xFF ^ b1(k0)];
                  sBox[0x200 + 2 * i] = MDS[2][P[P_21][lB2] & 0xFF ^ b2(k0)];
                  sBox[0x200 + 2 * i + 1] = MDS[3][P[P_31][lB3] & 0xFF ^ b3(k0)];
                  break;
  
                case 0:
                  lB0 = P[P_04][lB0] & 0xFF ^ b0(k3);
                  lB1 = P[P_14][lB1] & 0xFF ^ b1(k3);
                  lB2 = P[P_24][lB2] & 0xFF ^ b2(k3);
                  lB3 = P[P_34][lB3] & 0xFF ^ b3(k3);
                  /* falls through */
  
                case 3:
                  lB0 = P[P_03][lB0] & 0xFF ^ b0(k2);
                  lB1 = P[P_13][lB1] & 0xFF ^ b1(k2);
                  lB2 = P[P_23][lB2] & 0xFF ^ b2(k2);
                  lB3 = P[P_33][lB3] & 0xFF ^ b3(k2);
                  /* falls through */
  
                case 2:
                  sBox[2 * i] = MDS[0][P[P_01][P[P_02][lB0] & 0xFF ^ b0(k1)] & 0xFF ^ b0(k0)];
                  sBox[2 * i + 1] = MDS[1][P[P_11][P[P_12][lB1] & 0xFF ^ b1(k1)] & 0xFF ^ b1(k0)];
                  sBox[0x200 + 2 * i] = MDS[2][P[P_21][P[P_22][lB2] & 0xFF ^ b2(k1)] & 0xFF ^ b2(k0)];
                  sBox[0x200 + 2 * i + 1] = MDS[3][P[P_31][P[P_32][lB3] & 0xFF ^ b3(k1)] & 0xFF ^ b3(k0)];
                  break;
  
                default:
              }
            }
  
            return [sBox, subKeys];
          }
  
          throw 'key passed is undefined or not an array';
        }