| 459 | |
| 460 | |
| 461 | static void Transform256(word32* digest_, word32* buffer_) |
| 462 | { |
| 463 | const word32* K = K256; |
| 464 | |
| 465 | word32 W[16]; |
| 466 | word32 T[8]; |
| 467 | |
| 468 | // Copy digest to working vars |
| 469 | memcpy(T, digest_, sizeof(T)); |
| 470 | |
| 471 | // 64 operations, partially loop unrolled |
| 472 | for (unsigned int j = 0; j < 64; j += 16) { |
| 473 | R( 0); R( 1); R( 2); R( 3); |
| 474 | R( 4); R( 5); R( 6); R( 7); |
| 475 | R( 8); R( 9); R(10); R(11); |
| 476 | R(12); R(13); R(14); R(15); |
| 477 | } |
| 478 | |
| 479 | // Add the working vars back into digest |
| 480 | digest_[0] += a(0); |
| 481 | digest_[1] += b(0); |
| 482 | digest_[2] += c(0); |
| 483 | digest_[3] += d(0); |
| 484 | digest_[4] += e(0); |
| 485 | digest_[5] += f(0); |
| 486 | digest_[6] += g(0); |
| 487 | digest_[7] += h(0); |
| 488 | |
| 489 | // Wipe variables |
| 490 | memset(W, 0, sizeof(W)); |
| 491 | memset(T, 0, sizeof(T)); |
| 492 | } |
| 493 | |
| 494 | |
| 495 | // undef for 256 |