| 565 | |
| 566 | |
| 567 | static void Transform512(word64* digest_, word64* buffer_) |
| 568 | { |
| 569 | const word64* K = K512; |
| 570 | |
| 571 | word64 W[16]; |
| 572 | word64 T[8]; |
| 573 | |
| 574 | // Copy digest to working vars |
| 575 | memcpy(T, digest_, sizeof(T)); |
| 576 | |
| 577 | // 64 operations, partially loop unrolled |
| 578 | for (unsigned int j = 0; j < 80; j += 16) { |
| 579 | R( 0); R( 1); R( 2); R( 3); |
| 580 | R( 4); R( 5); R( 6); R( 7); |
| 581 | R( 8); R( 9); R(10); R(11); |
| 582 | R(12); R(13); R(14); R(15); |
| 583 | } |
| 584 | |
| 585 | // Add the working vars back into digest |
| 586 | |
| 587 | digest_[0] += a(0); |
| 588 | digest_[1] += b(0); |
| 589 | digest_[2] += c(0); |
| 590 | digest_[3] += d(0); |
| 591 | digest_[4] += e(0); |
| 592 | digest_[5] += f(0); |
| 593 | digest_[6] += g(0); |
| 594 | digest_[7] += h(0); |
| 595 | |
| 596 | // Wipe variables |
| 597 | memset(W, 0, sizeof(W)); |
| 598 | memset(T, 0, sizeof(T)); |
| 599 | } |
| 600 | |
| 601 | |
| 602 | void SHA512::Transform() |