tryUnpackRobust static method

Uint8List? tryUnpackRobust(
  1. Uint8List embedded, {
  2. required Uint8List keyBytes,
})

Implementation

static Uint8List? tryUnpackRobust(
  Uint8List embedded, {
  required Uint8List keyBytes,
}) {
  if (embedded.length < _robustHeaderLen) return null;
  for (var i = 0; i < 4; i++) {
    if (embedded[i] != robustMagic[i]) return null;
  }
  final version = embedded[4];
  if (version != _robustVersion) return null;
  final repetition = embedded[5];
  if (repetition < 1 || repetition > 15) return null;
  final originalLen = _readBe32(embedded, 8);
  final encodedLen = _readBe32(embedded, 12);
  final expectedCrc = _readBe32(embedded, 16);
  if (originalLen < 0 || encodedLen < 0) return null;
  if (_robustHeaderLen + encodedLen > embedded.length) return null;

  final encoded = Uint8List.sublistView(
    embedded,
    _robustHeaderLen,
    _robustHeaderLen + encodedLen,
  );
  final seed = _seedFromKey(keyBytes);
  final deinterleaved = _invertPermuteBytes(encoded, seed);
  final decoded = _repeatDecodeBits(deinterleaved, repetition, originalLen);
  if (decoded == null) return null;
  if (_crc32(decoded) != expectedCrc) return null;
  return decoded;
}