Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ ReadAsyncCore()

async ValueTask< int > System.Security.Cryptography.CryptoStream.ReadAsyncCore ( Memory< byte > buffer,
CancellationToken cancellationToken,
bool useAsync )
inlineprivate

Definition at line 285 of file CryptoStream.cs.

286 {
287 while (true)
288 {
289 if (_outputBufferIndex != 0)
290 {
291 int num = Math.Min(_outputBufferIndex, buffer.Length);
292 if (num != 0)
293 {
294 new ReadOnlySpan<byte>(_outputBuffer, 0, num).CopyTo(buffer.Span);
295 _outputBufferIndex -= num;
296 _outputBuffer.AsSpan(num).CopyTo(_outputBuffer);
297 CryptographicOperations.ZeroMemory(_outputBuffer.AsSpan(_outputBufferIndex, num));
298 }
299 return num;
300 }
302 {
303 break;
304 }
305 int num2 = 0;
306 bool flag = false;
307 int num3 = buffer.Length / _outputBlockSize;
309 {
310 int numWholeBlocksInBytes = checked(num3 * _inputBlockSize);
311 byte[] tempInputBuffer = ArrayPool<byte>.Shared.Rent(numWholeBlocksInBytes);
312 try
313 {
314 int num4 = ((!useAsync) ? _stream.Read(tempInputBuffer, _inputBufferIndex, numWholeBlocksInBytes - _inputBufferIndex) : (await _stream.ReadAsync(new Memory<byte>(tempInputBuffer, _inputBufferIndex, numWholeBlocksInBytes - _inputBufferIndex), cancellationToken).ConfigureAwait(continueOnCapturedContext: false)));
315 num2 = num4;
316 flag = num2 == 0;
317 int num5 = _inputBufferIndex + num2;
318 if (num5 >= _inputBlockSize)
319 {
320 Buffer.BlockCopy(_inputBuffer, 0, tempInputBuffer, 0, _inputBufferIndex);
321 CryptographicOperations.ZeroMemory(new Span<byte>(_inputBuffer, 0, _inputBufferIndex));
322 num2 += _inputBufferIndex;
323 int num6 = num2 / _inputBlockSize;
324 int num7 = num6 * _inputBlockSize;
325 _inputBufferIndex = num2 - num7;
326 if (_inputBufferIndex != 0)
327 {
328 Buffer.BlockCopy(tempInputBuffer, num7, _inputBuffer, 0, _inputBufferIndex);
329 }
330 int num8;
331 if (MemoryMarshal.TryGetArray((ReadOnlyMemory<byte>)buffer, out ArraySegment<byte> segment))
332 {
333 num8 = _transform.TransformBlock(tempInputBuffer, 0, num7, segment.Array, segment.Offset);
334 }
335 else
336 {
337 byte[] array = ArrayPool<byte>.Shared.Rent(num6 * _outputBlockSize);
338 num8 = num6 * _outputBlockSize;
339 try
340 {
341 num8 = _transform.TransformBlock(tempInputBuffer, 0, num7, array, 0);
342 array.AsSpan(0, num8).CopyTo(buffer.Span);
343 }
344 finally
345 {
346 CryptographicOperations.ZeroMemory(new Span<byte>(array, 0, num8));
348 }
349 }
350 if (num8 != 0)
351 {
352 return num8;
353 }
354 }
355 else
356 {
357 Buffer.BlockCopy(tempInputBuffer, _inputBufferIndex, _inputBuffer, _inputBufferIndex, num2);
358 _inputBufferIndex = num5;
359 }
360 }
361 finally
362 {
363 CryptographicOperations.ZeroMemory(new Span<byte>(tempInputBuffer, 0, numWholeBlocksInBytes));
364 ArrayPool<byte>.Shared.Return(tempInputBuffer);
365 }
366 }
367 if (!flag)
368 {
370 {
371 int num9 = ((!useAsync) ? _stream.Read(_inputBuffer, _inputBufferIndex, _inputBlockSize - _inputBufferIndex) : (await _stream.ReadAsync(new Memory<byte>(_inputBuffer, _inputBufferIndex, _inputBlockSize - _inputBufferIndex), cancellationToken).ConfigureAwait(continueOnCapturedContext: false)));
372 num2 = num9;
373 if (num2 <= 0)
374 {
375 break;
376 }
377 _inputBufferIndex += num2;
378 }
379 }
380 if (num2 <= 0)
381 {
385 }
386 else
387 {
389 }
391 }
392 return 0;
393 }
static ArrayPool< T > Shared
Definition ArrayPool.cs:7
int Read(byte[] buffer, int offset, int count)
Task< int > ReadAsync(byte[] buffer, int offset, int count)
Definition Stream.cs:762
readonly ICryptoTransform _transform
byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount)
int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset)

References System.Security.Cryptography.CryptoStream._finalBlockTransformed, System.Security.Cryptography.CryptoStream._inputBlockSize, System.Security.Cryptography.CryptoStream._inputBuffer, System.Security.Cryptography.CryptoStream._inputBufferIndex, System.Security.Cryptography.CryptoStream._outputBlockSize, System.Security.Cryptography.CryptoStream._outputBuffer, System.Security.Cryptography.CryptoStream._outputBufferIndex, System.Security.Cryptography.CryptoStream._stream, System.Security.Cryptography.CryptoStream._transform, System.array, System.Buffer.BlockCopy(), System.buffer, System.cancellationToken, System.Security.Cryptography.ICryptoTransform.CanTransformMultipleBlocks, System.ReadOnlySpan< T >.CopyTo(), System.Math.Min(), System.IO.Stream.Read(), System.IO.Stream.ReadAsync(), System.Buffers.ArrayPool< T >.Shared, System.Security.Cryptography.ICryptoTransform.TransformBlock(), System.Security.Cryptography.ICryptoTransform.TransformFinalBlock(), and System.Security.Cryptography.CryptographicOperations.ZeroMemory().

Referenced by System.Security.Cryptography.CryptoStream.Read(), and System.Security.Cryptography.CryptoStream.ReadAsyncInternal().