addSlice method
Adds the next chunk to this.
Adds the bytes defined by start and end-exclusive to this.
If isLast is true closes this.
Contrary to add the given chunk must not be held onto.
Once the method returns, it is safe to overwrite the data in it.
Implementation
@mustCallSuper
@override
void addSlice(List<int> chunk, int start, int end, bool isLast) {
if (isClosed) {
throw StateError('Closed already');
}
RangeError.checkValidRange(start, end, chunk.length);
// We need to support browsers, which don't have 64-bit integers.
//
// We originally had a BigInt implementation, but it was slow.
// This new implementation uses 16-bit integer arrays.
//
// The implementation has been inspired by "poly1305-donna-16.h" by Andrew
// Moon, which has "MIT or PUBLIC DOMAIN" license. It can be found at:
// https://github.com/floodyberry/poly1305-donna/blob/master/poly1305-donna-16.h
final chunkLength = end - start;
if (chunkLength > 0) {
// Increment length
_length += chunkLength;
// For each byte
final buffer = _buffer;
var blockLength = _blockLength;
for (var i = start; i < end; i++) {
// Set byte
buffer.setUint8(blockLength, chunk[i]);
blockLength++;
// Full block?
if (blockLength == 16) {
buffer.setUint8(16, 1);
process(
block: buffer,
blockLength: 16,
a: _a,
r: _r,
s: _s,
tmp: _tmp,
isLast: false,
);
blockLength = 0;
}
}
_blockLength = blockLength;
}
if (isLast) {
// Call a protected method we needed for implementing
// ChaCha20-Poly1305-AEAD
afterData();
// Final block
_finalize();
}
}