derive static method
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;
}
}
}