/// <summary> /// Finalizes SHA-512 hashing /// </summary> /// <param name="output">Output buffer</param> public void Finalize(ArraySegment <byte> output) { Contract.Requires <ArgumentNullException>(output.Array != null); Contract.Requires <ArgumentException>(output.Count == 64); Update(_padding, 0, _padding.Length); Array16 <ulong> block; ByteIntegerConverter.Array16LoadBigEndian64(out block, _buffer, 0); CryptoBytes.InternalWipe(_buffer, 0, _buffer.Length); int bytesInBuffer = (int)_totalBytes & (BlockSize - 1); if (bytesInBuffer > BlockSize - 16) { Sha512Internal.Core(out _state, ref _state, ref block); block = default(Array16 <ulong>); } block.x15 = (_totalBytes - 1) * 8; Sha512Internal.Core(out _state, ref _state, ref block); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 0, _state.x0); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 8, _state.x1); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 16, _state.x2); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 24, _state.x3); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 32, _state.x4); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 40, _state.x5); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 48, _state.x6); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 56, _state.x7); _state = default(Array8 <ulong>); }
public void Finish(ArraySegment <byte> output) { if (output.Array == null) { throw new ArgumentNullException(nameof(output)); } if (output.Count != 64) { throw new ArgumentException("output.Count must be 64"); } Update(Padding, 0, Padding.Length); ByteIntegerConverter.Array16LoadBigEndian64(out var block, _buffer, 0); CryptoBytes.InternalWipe(_buffer, 0, _buffer.Length); var bytesInBuffer = (int)_totalBytes & (BlockSize - 1); if (bytesInBuffer > BlockSize - 16) { Sha512Internal.Core(out _state, ref _state, ref block); block = default(Array16 <ulong>); } block.x15 = (_totalBytes - 1) * 8; Sha512Internal.Core(out _state, ref _state, ref block); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 0, _state.x0); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 8, _state.x1); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 16, _state.x2); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 24, _state.x3); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 32, _state.x4); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 40, _state.x5); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 48, _state.x6); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 56, _state.x7); _state = default(Array8 <ulong>); }
/// <summary> /// Finalizes SHA-512 hashing /// </summary> /// <param name="output"> /// Output buffer /// </param> public void Finalize(ArraySegment <byte> output) { Update(Padding, 0, Padding.Length); Array16 <ulong> block; ByteIntegerConverter.Array16LoadBigEndian64(out block, _buffer, 0); CryptoBytes.InternalWipe(_buffer, 0, _buffer.Length); var bytesInBuffer = (int)_totalBytes & (BlockSize - 1); if (bytesInBuffer > BlockSize - 16) { Sha512Internal.Core(out _state, ref _state, ref block); block = default; } block.X15 = (_totalBytes - 1) * 8; Sha512Internal.Core(out _state, ref _state, ref block); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 0, _state.X0); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 8, _state.X1); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 16, _state.X2); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 24, _state.X3); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 32, _state.X4); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 40, _state.X5); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 48, _state.X6); ByteIntegerConverter.StoreBigEndian64(output.Array, output.Offset + 56, _state.X7); _state = default; }