void SHA512::transform (const unsigned char *message, unsigned int block_nb) { uint64 w[80]; uint64 wv[8]; uint64 t1, t2; const unsigned char *sub_block; int i, j; for (i = 0; i < (int)block_nb; i++) { sub_block = message + (i << 7); for (j = 0; j < 16; j++) { SHA2_PACK64(&sub_block[j << 3], &w[j]); } for (j = 16; j < 80; j++) { w[j] = SHA512_F4(w[j - 2]) + w[j - 7] + SHA512_F3(w[j - 15]) + w[j - 16]; } for (j = 0; j < 8; j++) { wv[j] = m_h[j]; } for (j = 0; j < 80; j++) { t1 = wv[7] + SHA512_F2(wv[4]) + SHA2_CH(wv[4], wv[5], wv[6]) + sha512_k[j] + w[j]; t2 = SHA512_F1(wv[0]) + SHA2_MAJ(wv[0], wv[1], wv[2]); wv[7] = wv[6]; wv[6] = wv[5]; wv[5] = wv[4]; wv[4] = wv[3] + t1; wv[3] = wv[2]; wv[2] = wv[1]; wv[1] = wv[0]; wv[0] = t1 + t2; } for (j = 0; j < 8; j++) { m_h[j] += wv[j]; } } }
void SHA256::transform(const SHA256::uint8 *message, unsigned int block_nb) { uint32 w[64]; uint32 wv[8]; uint32 t1, t2; const SHA256::uint8 *sub_block; int i; int j; for (i = 0; i < (int) block_nb; i++) { sub_block = message + (i << 6); for (j = 0; j < 16; j++) { SHA2_PACK32(&sub_block[j << 2], &w[j]); } for (j = 16; j < 64; j++) { w[j] = SHA256_F4(w[j - 2]) + w[j - 7] + SHA256_F3(w[j - 15]) + w[j - 16]; } for (j = 0; j < 8; j++) { wv[j] = m_h[j]; } for (j = 0; j < 64; j++) { t1 = wv[7] + SHA256_F2(wv[4]) + SHA2_CH(wv[4], wv[5], wv[6]) + sha256_k[j] + w[j]; t2 = SHA256_F1(wv[0]) + SHA2_MAJ(wv[0], wv[1], wv[2]); wv[7] = wv[6]; wv[6] = wv[5]; wv[5] = wv[4]; wv[4] = wv[3] + t1; wv[3] = wv[2]; wv[2] = wv[1]; wv[1] = wv[0]; wv[0] = t1 + t2; } for (j = 0; j < 8; j++) { m_h[j] += wv[j]; } } }
void SHA512_HashBlock (SHA512_CONTEXT * context) { uint64_t a, b, c, d, e, f, g, h; uint8_t i; uint64_t t1, t2; uint8_t * dataPtr = context->partialBlock;; uint64_t * schedulePtr; #if defined (CRYPTO_HASH_CONFIG_SHA_SMALL_RAM) uint8_t j; #endif schedulePtr = context->workingBuffer; for (i = 0; i < 16; i++) { t1 = *dataPtr++; t1 <<= 8; t1 += *dataPtr++; t1 <<= 8; t1 += *dataPtr++; t1 <<= 8; t1 += *dataPtr++; t1 <<= 8; t1 += *dataPtr++; t1 <<= 8; t1 += *dataPtr++; t1 <<= 8; t1 += *dataPtr++; t1 <<= 8; t1 += *dataPtr++; *(schedulePtr + i) = t1; } #if !defined (CRYPTO_HASH_CONFIG_SHA_SMALL_RAM) for (i = 16; i < 80; i++) { schedulePtr = context->workingBuffer + i; *schedulePtr = SHA2_SIG_L1(*(schedulePtr - 2)) + *(schedulePtr - 7) + SHA2_SIG_L0(*(schedulePtr - 15)) + *(schedulePtr - 16); } #endif a = context->h[0]; b = context->h[1]; c = context->h[2]; d = context->h[3]; e = context->h[4]; f = context->h[5]; g = context->h[6]; h = context->h[7]; schedulePtr = context->workingBuffer; for (i = 0; i < 80; i++) { #if defined (CRYPTO_HASH_CONFIG_SHA_SMALL_RAM) j = i & 0xf; if (i >= 16) { *(schedulePtr + j) = SHA2_SIG_L1(*(schedulePtr + ((14 + j) & 0xf))) + *(schedulePtr + ((9 + j) & 0xf)) + SHA2_SIG_L0(*(schedulePtr + ((1 + j) & 0xf))) + *(schedulePtr + j); } t1 = h + SHA2_SIG_U1(e) + SHA2_CH(e,f,g) + SHA512_K[i] + *(schedulePtr + j); #else t1 = h + SHA2_SIG_U1(e) + SHA2_CH(e,f,g) + SHA512_K[i] + *(schedulePtr + i); #endif t2 = SHA2_SIG_U0(a) + SHA2_MAJ(a,b,c); h = g; g = f; f = e; e = d + t1; d = c; c = b; b = a; a = t1 + t2; } context->h[0] += a; context->h[1] += b; context->h[2] += c; context->h[3] += d; context->h[4] += e; context->h[5] += f; context->h[6] += g; context->h[7] += h; }