static void SHA512_Process(SHA512_CTX *ctx) { int t; uint64_t temp1; uint64_t temp2; // Initialize the 8 working registers uint64_t a = ctx->h_dig.h[0]; uint64_t b = ctx->h_dig.h[1]; uint64_t c = ctx->h_dig.h[2]; uint64_t d = ctx->h_dig.h[3]; uint64_t e = ctx->h_dig.h[4]; uint64_t f = ctx->h_dig.h[5]; uint64_t g = ctx->h_dig.h[6]; uint64_t h = ctx->h_dig.h[7]; // Process message in 16-word blocks uint64_t *w = ctx->w_buf.w; // Convert from big-endian byte order to host byte order for (t = 0; t < 16; t++) w[t] = be64toh(w[t]); // Prepare the message schedule for (t = 16; t < 80; t++) w[t] = SIGMA4(w[t - 2]) + w[t - 7] + SIGMA3(w[t - 15]) + w[t - 16]; // SHA-512 hash computation for (t = 0; t < 80; t++) { // Calculate T1 and T2 temp1 = h + SIGMA2(e) + CH(e, f, g) + k[t] + w[t]; temp2 = SIGMA1(a) + MAJ(a, b, c); // Update the working registers h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } // Update the hash value ctx->h_dig.h[0] += a; ctx->h_dig.h[1] += b; ctx->h_dig.h[2] += c; ctx->h_dig.h[3] += d; ctx->h_dig.h[4] += e; ctx->h_dig.h[5] += f; ctx->h_dig.h[6] += g; ctx->h_dig.h[7] += h; }
void sha512ProcessBlock(Sha512Context *context) { uint_t t; uint64_t temp1; uint64_t temp2; //Initialize the 8 working registers uint64_t a = context->h[0]; uint64_t b = context->h[1]; uint64_t c = context->h[2]; uint64_t d = context->h[3]; uint64_t e = context->h[4]; uint64_t f = context->h[5]; uint64_t g = context->h[6]; uint64_t h = context->h[7]; //Process message in 16-word blocks uint64_t *w = context->w; //Convert from big-endian byte order to host byte order for(t = 0; t < 16; t++) w[t] = betoh64(w[t]); //SHA-512 hash computation (alternate method) for(t = 0; t < 80; t++) { //Prepare the message schedule if(t >= 16) W(t) += SIGMA4(W(t + 14)) + W(t + 9) + SIGMA3(W(t + 1)); //Calculate T1 and T2 temp1 = h + SIGMA2(e) + CH(e, f, g) + k[t] + W(t); temp2 = SIGMA1(a) + MAJ(a, b, c); //Update the working registers h = g; g = f; f = e; e = d + temp1; d = c; c = b; b = a; a = temp1 + temp2; } //Update the hash value 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; }