public static void Initialize(SHA256 *instance) { instance->state[0] = 0x6a09e667; instance->state[1] = 0xbb67ae85; instance->state[2] = 0x3c6ef372; instance->state[3] = 0xa54ff53a; instance->state[4] = 0x510e527f; instance->state[5] = 0x9b05688c; instance->state[6] = 0x1f83d9ab; instance->state[7] = 0x5be0cd19; }
public static void Update(SHA256 *instance, byte *buffer, int sz) { for (int i = 0; i < sz; ++i) { instance->data[instance->datalen] = buffer[i]; instance->datalen++; if (instance->datalen == 64) { Transform(instance); instance->bitlen += 512; instance->datalen = 0; } } }
public static void Final(SHA256 *instance, NativeArray <byte> hash) { int i = instance->datalen; if (instance->datalen < 56) { instance->data[i++] = 0x80; while (i < 56) { instance->data[i++] = 0x00; } } else { instance->data[i++] = 0x80; while (i < 64) { instance->data[i++] = 0x00; } Transform(instance); } instance->bitlen += (ulong)instance->datalen * 8; instance->data[63] = (byte)(instance->bitlen); instance->data[62] = (byte)(instance->bitlen >> 8); instance->data[61] = (byte)(instance->bitlen >> 16); instance->data[60] = (byte)(instance->bitlen >> 24); instance->data[59] = (byte)(instance->bitlen >> 32); instance->data[58] = (byte)(instance->bitlen >> 40); instance->data[57] = (byte)(instance->bitlen >> 48); instance->data[56] = (byte)(instance->bitlen >> 56); Transform(instance); for (i = 0; i < 4; ++i) { hash[i] = (byte)(((instance->state[0]) >> (int)(24 - i * 8)) & 0x000000ff); hash[i + 4] = (byte)(((instance->state[1]) >> (int)(24 - i * 8)) & 0x000000ff); hash[i + 8] = (byte)(((instance->state[2]) >> (int)(24 - i * 8)) & 0x000000ff); hash[i + 12] = (byte)((instance->state[3] >> (int)(24 - i * 8)) & 0x000000ff); hash[i + 16] = (byte)((instance->state[4] >> (int)(24 - i * 8)) & 0x000000ff); hash[i + 20] = (byte)((instance->state[5] >> (int)(24 - i * 8)) & 0x000000ff); hash[i + 24] = (byte)((instance->state[6] >> (int)(24 - i * 8)) & 0x000000ff); hash[i + 28] = (byte)((instance->state[7] >> (int)(24 - i * 8)) & 0x000000ff); } }
private static void Transform(SHA256 *instance) { uint a, b, c, d, e, f, g, h, i, j, t1, t2; var m = stackalloc uint[64]; for (i = 0, j = 0; i < 16; ++i, j += 4) { m[i] = (uint)((instance->data[(int)j] << 24) | (instance->data[(int)j + 1] << 16) | (instance->data[(int)j + 2] << 8) | (instance->data[(int)j + 3])); } for (; i < 64; ++i) { m[i] = SIG1(m[i - 2]) + m[i - 7] + SIG0(m[i - 15]) + m[i - 16]; } a = instance->state[0]; b = instance->state[1]; c = instance->state[2]; d = instance->state[3]; e = instance->state[4]; f = instance->state[5]; g = instance->state[6]; h = instance->state[7]; for (i = 0; i < 64; ++i) { t1 = h + EP1(e) + CH(e, f, g) + k[i] + m[i]; t2 = EP0(a) + MAJ(a, b, c); h = g; g = f; f = e; e = d + t1; d = c; c = b; b = a; a = t1 + t2; } instance->state[0] += a; instance->state[1] += b; instance->state[2] += c; instance->state[3] += d; instance->state[4] += e; instance->state[5] += f; instance->state[6] += g; instance->state[7] += h; }