decryptCbc method

Uint8List decryptCbc(
  1. Uint8List data, {
  2. Uint8List? iv,
  3. bool stripPadding = true,
})

Implementation

Uint8List decryptCbc(Uint8List data, {Uint8List? iv, bool stripPadding = true}) {
  if (data.length < 16) return Uint8List(0);
  final Uint8List vector = iv ?? Uint8List.sublistView(data, 0, 16);
  final int start = iv == null ? 16 : 0;
  final int blocks = (data.length - start) ~/ 16;
  final Uint8List out = Uint8List(blocks * 16);
  final Uint8List previous = Uint8List.fromList(vector);
  for (int block = 0; block < blocks; block++) {
    final Uint8List cipher = Uint8List.sublistView(data, start + block * 16, start + block * 16 + 16);
    final Uint8List state = Uint8List.fromList(cipher);
    _decryptBlock(state);
    for (int i = 0; i < 16; i++) {
      out[block * 16 + i] = state[i] ^ previous[i];
    }
    previous.setAll(0, cipher);
  }
  if (!stripPadding || out.isEmpty) return out;
  final int pad = out[out.length - 1];
  if (pad < 1 || pad > 16 || pad > out.length) return out;
  return Uint8List.sublistView(out, 0, out.length - pad);
}