26 template <
typename T_Argument>
31 static constexpr size_t BlockSize = 16;
32 static constexpr size_t MaximumUpdateOverhead = BlockSize - 1;
34 virtual Result onProcess(Span<const char> input, Span<char> output)
override
36 if (output.sizeInBytes() < BlockSize)
40 Result::Error(
"AsyncCipherTransformStreamT - output buffers must be at least 16 bytes"));
41 AsyncTransformStream::afterProcess({}, output);
45 const size_t inputSize = input.sizeInBytes() < output.sizeInBytes() - MaximumUpdateOverhead
47 : output.sizeInBytes() - MaximumUpdateOverhead;
48 Span<const char> inputChunk;
49 SC_TRY(input.sliceStartLength(0, inputSize, inputChunk));
51 size_t bytesWritten = 0;
52 Result result = cipher.update(inputChunk.reinterpret_as_span_of<
const uint8_t>(),
53 output.reinterpret_as_span_of<uint8_t>(), bytesWritten);
54 if (not result or bytesWritten > output.sizeInBytes())
59 AsyncTransformStream::afterProcess({}, output);
63 Span<const char> inputAfter;
64 Span<char> outputAfter;
65 SC_TRY(input.sliceStart(inputSize, inputAfter));
66 SC_TRY(output.sliceStart(bytesWritten, outputAfter));
67 AsyncTransformStream::afterProcess(inputAfter, outputAfter);
71 virtual Result onFinalize(Span<char> output)
override
73 if (output.sizeInBytes() < BlockSize)
77 Result::Error(
"AsyncCipherTransformStreamT - output buffers must be at least 16 bytes"));
78 AsyncTransformStream::afterFinalize(output,
true);
82 size_t bytesWritten = 0;
83 Result result = cipher.finish(output.reinterpret_as_span_of<uint8_t>(), bytesWritten);
84 if (not result or bytesWritten > output.sizeInBytes())
89 AsyncTransformStream::afterFinalize(output,
true);
93 Span<char> outputAfter;
94 SC_TRY(output.sliceStart(bytesWritten, outputAfter));
95 AsyncTransformStream::afterFinalize(outputAfter,
true);
99 virtual Result asyncDestroyReadable()
override
105 virtual Result asyncDestroyWritable()
override
void finishedWriting(AsyncBufferView::ID bufferID, Function< void(AsyncBufferView::ID)> &&cb, Result res)
Signals that the given buffer (previously queued by write) has been fully written.