derive static method

Uint8List derive(
  1. DeriveKeyType keyType,
  2. Uint8List keySeed, {
  3. bool paceMode = false,
})

Returns key from keySeed bytes for specific keyType and counter mode specific for key type (1 - ENC mode, 2 - MAC mode). If paceMode is true counter 3 for encryption key types.

Implementation

static Uint8List derive(final DeriveKeyType keyType, final Uint8List keySeed, { final bool paceMode = false }) {
  Int32 mode =  Int32(paceMode ? 3 : 1); // PACE/ENC mode
  if(keyType == DeriveKeyType.ISO9797MacAlg3 ||
     keyType == DeriveKeyType.CMAC128        ||
     keyType == DeriveKeyType.CMAC192        ||
     keyType == DeriveKeyType.CMAC256) {
    mode = Int32(2); // MAC mode
  }

  switch(keyType) {
    case DeriveKeyType.DESede:
    case DeriveKeyType.ISO9797MacAlg3: {
      final key = KDF(sha1, keySeed, mode).sublist(0, 16); // use only 128 bits = 8 * 16;

      // Adjust even parity bits
      for (int i = 0; i < key.length; i++) {
        // count set bits
        var count = 0;
        for(int j = 0; j < 8; j++) {
          count += (key[i] >> j) & 0x01;
        }
        if(count % 2 == 0) { // if even bit count
          key[i] ^= 0x01;
        }
      }
      return key;
    }
    case DeriveKeyType.AES128:
    case DeriveKeyType.CMAC128: {
      return KDF(sha1, keySeed, mode).sublist(0, 16); // use only 128 bits = 8 * 16;
    }
    case DeriveKeyType.AES192:
    case DeriveKeyType.AES256:
    case DeriveKeyType.CMAC192:
    case DeriveKeyType.CMAC256: {
      var key = KDF(sha256, keySeed, mode);
      if(keyType == DeriveKeyType.AES192 ||
         keyType == DeriveKeyType.CMAC192) {
        key = key.sublist(0, 24); // use only 192 bits = 8 * 24;
      }
      return key;
    }
  }
}