Files
Dec2017-Script-Dump/mscorlib/System/Security/Cryptography/SHA256Managed.cs
T
2026-06-04 11:42:34 +02:00

203 lines
6.8 KiB
C#

using System;
using System.Runtime.InteropServices;
namespace System.Security.Cryptography
{
/// <summary>Computes the <see cref="T:System.Security.Cryptography.SHA256" /> hash for the input data using the managed library. </summary>
// Token: 0x0200052F RID: 1327
[ComVisible(true)]
public class SHA256Managed : SHA256
{
/// <summary>Initializes a new instance of the <see cref="T:System.Security.Cryptography.SHA256Managed" /> class using the managed library.</summary>
/// <exception cref="T:System.InvalidOperationException">The Federal Information Processing Standards (FIPS) security setting is enabled. This implementation is not part of the Windows Platform FIPS-validated cryptographic algorithms.</exception>
// Token: 0x060030A3 RID: 12451 RVA: 0x000A6AEC File Offset: 0x000A4CEC
public SHA256Managed()
{
this._H = new uint[8];
this._ProcessingBuffer = new byte[64];
this.buff = new uint[64];
this.Initialize();
}
/// <summary>When overridden in a derived class, routes data written to the object into the <see cref="T:System.Security.Cryptography.SHA256" /> hash algorithm for computing the hash.</summary>
/// <param name="rgb">The input data. </param>
/// <param name="ibStart">The offset into the byte array from which to begin using data. </param>
/// <param name="cbSize">The number of bytes in the array to use as data. </param>
// Token: 0x060030A4 RID: 12452 RVA: 0x000A6B2C File Offset: 0x000A4D2C
protected override void HashCore(byte[] rgb, int ibStart, int cbSize)
{
this.State = 1;
if (this._ProcessingBufferCount != 0)
{
if (cbSize < 64 - this._ProcessingBufferCount)
{
Buffer.BlockCopy(rgb, ibStart, this._ProcessingBuffer, this._ProcessingBufferCount, cbSize);
this._ProcessingBufferCount += cbSize;
return;
}
int i = 64 - this._ProcessingBufferCount;
Buffer.BlockCopy(rgb, ibStart, this._ProcessingBuffer, this._ProcessingBufferCount, i);
this.ProcessBlock(this._ProcessingBuffer, 0);
this._ProcessingBufferCount = 0;
ibStart += i;
cbSize -= i;
}
for (int i = 0; i < cbSize - cbSize % 64; i += 64)
{
this.ProcessBlock(rgb, ibStart + i);
}
if (cbSize % 64 != 0)
{
Buffer.BlockCopy(rgb, cbSize - cbSize % 64 + ibStart, this._ProcessingBuffer, 0, cbSize % 64);
this._ProcessingBufferCount = cbSize % 64;
}
}
/// <summary>When overridden in a derived class, finalizes the hash computation after the last data is processed by the cryptographic stream object.</summary>
/// <returns>The computed hash code.</returns>
// Token: 0x060030A5 RID: 12453 RVA: 0x000A6C08 File Offset: 0x000A4E08
protected override byte[] HashFinal()
{
byte[] array = new byte[32];
this.ProcessFinalBlock(this._ProcessingBuffer, 0, this._ProcessingBufferCount);
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 4; j++)
{
array[i * 4 + j] = (byte)(this._H[i] >> 24 - j * 8);
}
}
this.State = 0;
return array;
}
/// <summary>Initializes an instance of <see cref="T:System.Security.Cryptography.SHA256Managed" />.</summary>
// Token: 0x060030A6 RID: 12454 RVA: 0x000A6C78 File Offset: 0x000A4E78
public override void Initialize()
{
this.count = 0UL;
this._ProcessingBufferCount = 0;
this._H[0] = 1779033703U;
this._H[1] = 3144134277U;
this._H[2] = 1013904242U;
this._H[3] = 2773480762U;
this._H[4] = 1359893119U;
this._H[5] = 2600822924U;
this._H[6] = 528734635U;
this._H[7] = 1541459225U;
}
// Token: 0x060030A7 RID: 12455 RVA: 0x000A6CFC File Offset: 0x000A4EFC
private void ProcessBlock(byte[] inputBuffer, int inputOffset)
{
uint[] k = SHAConstants.K1;
uint[] array = this.buff;
this.count += 64UL;
for (int i = 0; i < 16; i++)
{
array[i] = (uint)(((int)inputBuffer[inputOffset + 4 * i] << 24) | ((int)inputBuffer[inputOffset + 4 * i + 1] << 16) | ((int)inputBuffer[inputOffset + 4 * i + 2] << 8) | (int)inputBuffer[inputOffset + 4 * i + 3]);
}
for (int i = 16; i < 64; i++)
{
uint num = array[i - 15];
num = ((num >> 7) | (num << 25)) ^ ((num >> 18) | (num << 14)) ^ (num >> 3);
uint num2 = array[i - 2];
num2 = ((num2 >> 17) | (num2 << 15)) ^ ((num2 >> 19) | (num2 << 13)) ^ (num2 >> 10);
array[i] = num2 + array[i - 7] + num + array[i - 16];
}
uint num3 = this._H[0];
uint num4 = this._H[1];
uint num5 = this._H[2];
uint num6 = this._H[3];
uint num7 = this._H[4];
uint num8 = this._H[5];
uint num9 = this._H[6];
uint num10 = this._H[7];
for (int i = 0; i < 64; i++)
{
uint num = num10 + (((num7 >> 6) | (num7 << 26)) ^ ((num7 >> 11) | (num7 << 21)) ^ ((num7 >> 25) | (num7 << 7))) + ((num7 & num8) ^ (~num7 & num9)) + k[i] + array[i];
uint num2 = ((num3 >> 2) | (num3 << 30)) ^ ((num3 >> 13) | (num3 << 19)) ^ ((num3 >> 22) | (num3 << 10));
num2 += (num3 & num4) ^ (num3 & num5) ^ (num4 & num5);
num10 = num9;
num9 = num8;
num8 = num7;
num7 = num6 + num;
num6 = num5;
num5 = num4;
num4 = num3;
num3 = num + num2;
}
this._H[0] += num3;
this._H[1] += num4;
this._H[2] += num5;
this._H[3] += num6;
this._H[4] += num7;
this._H[5] += num8;
this._H[6] += num9;
this._H[7] += num10;
}
// Token: 0x060030A8 RID: 12456 RVA: 0x000A6F74 File Offset: 0x000A5174
private void ProcessFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount)
{
ulong num = this.count + (ulong)((long)inputCount);
int num2 = 56 - (int)(num % 64UL);
if (num2 < 1)
{
num2 += 64;
}
byte[] array = new byte[inputCount + num2 + 8];
for (int i = 0; i < inputCount; i++)
{
array[i] = inputBuffer[i + inputOffset];
}
array[inputCount] = 128;
for (int j = inputCount + 1; j < inputCount + num2; j++)
{
array[j] = 0;
}
ulong num3 = num << 3;
this.AddLength(num3, array, inputCount + num2);
this.ProcessBlock(array, 0);
if (inputCount + num2 + 8 == 128)
{
this.ProcessBlock(array, 64);
}
}
// Token: 0x060030A9 RID: 12457 RVA: 0x000A7020 File Offset: 0x000A5220
internal void AddLength(ulong length, byte[] buffer, int position)
{
buffer[position++] = (byte)(length >> 56);
buffer[position++] = (byte)(length >> 48);
buffer[position++] = (byte)(length >> 40);
buffer[position++] = (byte)(length >> 32);
buffer[position++] = (byte)(length >> 24);
buffer[position++] = (byte)(length >> 16);
buffer[position++] = (byte)(length >> 8);
buffer[position] = (byte)length;
}
// Token: 0x040013D0 RID: 5072
private const int BLOCK_SIZE_BYTES = 64;
// Token: 0x040013D1 RID: 5073
private const int HASH_SIZE_BYTES = 32;
// Token: 0x040013D2 RID: 5074
private uint[] _H;
// Token: 0x040013D3 RID: 5075
private ulong count;
// Token: 0x040013D4 RID: 5076
private byte[] _ProcessingBuffer;
// Token: 0x040013D5 RID: 5077
private int _ProcessingBufferCount;
// Token: 0x040013D6 RID: 5078
private uint[] buff;
}
}