aes256CbcEncrypt function

Uint8List aes256CbcEncrypt(
  1. Uint8List key32,
  2. Uint8List iv16,
  3. Uint8List plaintext
)

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;
}