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(AsyncStreamsResultCategory, AsyncStreamsError::CipherOutputBufferTooSmall));
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 auto 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 Result::Error(AsyncStreamsResultCategory, AsyncStreamsError::CipherInvalidOutputSize));
62 AsyncTransformStream::afterProcess({}, output);
66 Span<const char> inputAfter;
67 Span<char> outputAfter;
68 SC_TRY(input.sliceStart(inputSize, inputAfter));
69 SC_TRY(output.sliceStart(bytesWritten, outputAfter));
70 AsyncTransformStream::afterProcess(inputAfter, outputAfter);
74 virtual Result onFinalize(Span<char> output)
override
76 if (output.sizeInBytes() < BlockSize)
80 Result::Error(AsyncStreamsResultCategory, AsyncStreamsError::CipherOutputBufferTooSmall));
81 AsyncTransformStream::afterFinalize(output,
true);
85 size_t bytesWritten = 0;
86 auto result = cipher.finish(output.reinterpret_as_span_of<uint8_t>(), bytesWritten);
87 if (not result or bytesWritten > output.sizeInBytes())
92 Result::Error(AsyncStreamsResultCategory, AsyncStreamsError::CipherInvalidOutputSize));
95 AsyncTransformStream::afterFinalize(output,
true);
99 Span<char> outputAfter;
100 SC_TRY(output.sliceStart(bytesWritten, outputAfter));
101 AsyncTransformStream::afterFinalize(outputAfter,
true);
105 virtual Result asyncDestroyReadable()
override
111 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.