aes256CbcEncrypt function
AES-256-CBC encryption with PKCS#7 padding.
PKCS#7 padding is always applied, even when the plaintext is already a multiple of the block size (in which case a full extra block of 0x10 bytes is appended). Output length is always a positive multiple of 16.
Implementation
Uint8List aes256CbcEncrypt(Uint8List key32, Uint8List iv16, Uint8List plaintext) {
_checkKeyIv(key32, iv16);
final roundKeys = _expandKey(key32);
// Apply PKCS#7 padding.
final padLen = _blockSize - (plaintext.length % _blockSize);
final padded = Uint8List(plaintext.length + padLen);
padded.setRange(0, plaintext.length, plaintext);
for (var i = plaintext.length; i < padded.length; i++) {
padded[i] = padLen;
}
final out = Uint8List(padded.length);
final prev = Uint8List.fromList(iv16);
final block = Uint8List(_blockSize);
for (var off = 0; off < padded.length; off += _blockSize) {
for (var i = 0; i < _blockSize; i++) {
block[i] = padded[off + i] ^ prev[i];
}
final enc = aesEncryptBlock(roundKeys, block);
out.setRange(off, off + _blockSize, enc);
prev.setRange(0, _blockSize, enc);
}
return out;
}