void sha256_transf(sha256_ctx *ctx, const unsigned char *message, unsigned int block_nb) { uint32 w[64], wv[8], t1, t2; const unsigned char *sub_block; int i; #ifndef UNROLL_LOOPS int j; #endif for (i = 0; i < (int) block_nb; i++) { sub_block = message + (i << 6); #ifndef UNROLL_LOOPS for (j = 0; j < 16; j++) { PACK32(&sub_block[j << 2], &w[j]); } for (j = 16; j < 64; j++) { SHA256_SCR(j); } for (j = 0; j < 8; j++) { wv[j] = ctx->h[j]; } for (j = 0; j < 64; j++) { t1 = wv[7] + SHA256_F2(wv[4]) + CH(wv[4], wv[5], wv[6]) + sha256_k[j] + w[j]; t2 = SHA256_F1(wv[0]) + 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++) { ctx->h[j] += wv[j]; } #else PACK32(&sub_block[ 0], &w[ 0]); PACK32(&sub_block[ 4], &w[ 1]); PACK32(&sub_block[ 8], &w[ 2]); PACK32(&sub_block[12], &w[ 3]); PACK32(&sub_block[16], &w[ 4]); PACK32(&sub_block[20], &w[ 5]); PACK32(&sub_block[24], &w[ 6]); PACK32(&sub_block[28], &w[ 7]); PACK32(&sub_block[32], &w[ 8]); PACK32(&sub_block[36], &w[ 9]); PACK32(&sub_block[40], &w[10]); PACK32(&sub_block[44], &w[11]); PACK32(&sub_block[48], &w[12]); PACK32(&sub_block[52], &w[13]); PACK32(&sub_block[56], &w[14]); PACK32(&sub_block[60], &w[15]); SHA256_SCR(16); SHA256_SCR(17); SHA256_SCR(18); SHA256_SCR(19); SHA256_SCR(20); SHA256_SCR(21); SHA256_SCR(22); SHA256_SCR(23); SHA256_SCR(24); SHA256_SCR(25); SHA256_SCR(26); SHA256_SCR(27); SHA256_SCR(28); SHA256_SCR(29); SHA256_SCR(30); SHA256_SCR(31); SHA256_SCR(32); SHA256_SCR(33); SHA256_SCR(34); SHA256_SCR(35); SHA256_SCR(36); SHA256_SCR(37); SHA256_SCR(38); SHA256_SCR(39); SHA256_SCR(40); SHA256_SCR(41); SHA256_SCR(42); SHA256_SCR(43); SHA256_SCR(44); SHA256_SCR(45); SHA256_SCR(46); SHA256_SCR(47); SHA256_SCR(48); SHA256_SCR(49); SHA256_SCR(50); SHA256_SCR(51); SHA256_SCR(52); SHA256_SCR(53); SHA256_SCR(54); SHA256_SCR(55); SHA256_SCR(56); SHA256_SCR(57); SHA256_SCR(58); SHA256_SCR(59); SHA256_SCR(60); SHA256_SCR(61); SHA256_SCR(62); SHA256_SCR(63); wv[0] = ctx->h[0]; wv[1] = ctx->h[1]; wv[2] = ctx->h[2]; wv[3] = ctx->h[3]; wv[4] = ctx->h[4]; wv[5] = ctx->h[5]; wv[6] = ctx->h[6]; wv[7] = ctx->h[7]; SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 0); SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 1); SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 2); SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 3); SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 4); SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 5); SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 6); SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 7); SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 8); SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 9); SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 10); SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 11); SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 12); SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 13); SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 14); SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 15); SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 16); SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 17); SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 18); SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 19); SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 20); SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 21); SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 22); SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 23); SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 24); SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 25); SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 26); SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 27); SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 28); SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 29); SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 30); SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 31); SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 32); SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 33); SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 34); SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 35); SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 36); SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 37); SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 38); SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 39); SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 40); SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 41); SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 42); SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 43); SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 44); SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 45); SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 46); SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 47); SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 48); SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 49); SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 50); SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 51); SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 52); SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 53); SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 54); SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 55); SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, 56); SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, 57); SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, 58); SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, 59); SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, 60); SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, 61); SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, 62); SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, 63); ctx->h[0] += wv[0]; ctx->h[1] += wv[1]; ctx->h[2] += wv[2]; ctx->h[3] += wv[3]; ctx->h[4] += wv[4]; ctx->h[5] += wv[5]; ctx->h[6] += wv[6]; ctx->h[7] += wv[7]; #endif } }
void sha512_transf(sha512_ctx *ctx, 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); #ifndef UNROLL_LOOPS for (j = 0; j < 16; j++) { PACK64(&sub_block[j << 3], &w[j]); } for (j = 16; j < 80; j++) { SHA512_SCR(j); } for (j = 0; j < 8; j++) { wv[j] = ctx->h[j]; } for (j = 0; j < 80; j++) { t1 = wv[7] + SHA512_F2(wv[4]) + CH(wv[4], wv[5], wv[6]) + sha512_k[j] + w[j]; t2 = SHA512_F1(wv[0]) + 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++) { ctx->h[j] += wv[j]; } #else PACK64(&sub_block[ 0], &w[ 0]); PACK64(&sub_block[ 8], &w[ 1]); PACK64(&sub_block[ 16], &w[ 2]); PACK64(&sub_block[ 24], &w[ 3]); PACK64(&sub_block[ 32], &w[ 4]); PACK64(&sub_block[ 40], &w[ 5]); PACK64(&sub_block[ 48], &w[ 6]); PACK64(&sub_block[ 56], &w[ 7]); PACK64(&sub_block[ 64], &w[ 8]); PACK64(&sub_block[ 72], &w[ 9]); PACK64(&sub_block[ 80], &w[10]); PACK64(&sub_block[ 88], &w[11]); PACK64(&sub_block[ 96], &w[12]); PACK64(&sub_block[104], &w[13]); PACK64(&sub_block[112], &w[14]); PACK64(&sub_block[120], &w[15]); SHA512_SCR(16); SHA512_SCR(17); SHA512_SCR(18); SHA512_SCR(19); SHA512_SCR(20); SHA512_SCR(21); SHA512_SCR(22); SHA512_SCR(23); SHA512_SCR(24); SHA512_SCR(25); SHA512_SCR(26); SHA512_SCR(27); SHA512_SCR(28); SHA512_SCR(29); SHA512_SCR(30); SHA512_SCR(31); SHA512_SCR(32); SHA512_SCR(33); SHA512_SCR(34); SHA512_SCR(35); SHA512_SCR(36); SHA512_SCR(37); SHA512_SCR(38); SHA512_SCR(39); SHA512_SCR(40); SHA512_SCR(41); SHA512_SCR(42); SHA512_SCR(43); SHA512_SCR(44); SHA512_SCR(45); SHA512_SCR(46); SHA512_SCR(47); SHA512_SCR(48); SHA512_SCR(49); SHA512_SCR(50); SHA512_SCR(51); SHA512_SCR(52); SHA512_SCR(53); SHA512_SCR(54); SHA512_SCR(55); SHA512_SCR(56); SHA512_SCR(57); SHA512_SCR(58); SHA512_SCR(59); SHA512_SCR(60); SHA512_SCR(61); SHA512_SCR(62); SHA512_SCR(63); SHA512_SCR(64); SHA512_SCR(65); SHA512_SCR(66); SHA512_SCR(67); SHA512_SCR(68); SHA512_SCR(69); SHA512_SCR(70); SHA512_SCR(71); SHA512_SCR(72); SHA512_SCR(73); SHA512_SCR(74); SHA512_SCR(75); SHA512_SCR(76); SHA512_SCR(77); SHA512_SCR(78); SHA512_SCR(79); wv[0] = ctx->h[0]; wv[1] = ctx->h[1]; wv[2] = ctx->h[2]; wv[3] = ctx->h[3]; wv[4] = ctx->h[4]; wv[5] = ctx->h[5]; wv[6] = ctx->h[6]; wv[7] = ctx->h[7]; j = 0; do { SHA512_EXP(0,1,2,3,4,5,6,7,j); j++; SHA512_EXP(7,0,1,2,3,4,5,6,j); j++; SHA512_EXP(6,7,0,1,2,3,4,5,j); j++; SHA512_EXP(5,6,7,0,1,2,3,4,j); j++; SHA512_EXP(4,5,6,7,0,1,2,3,j); j++; SHA512_EXP(3,4,5,6,7,0,1,2,j); j++; SHA512_EXP(2,3,4,5,6,7,0,1,j); j++; SHA512_EXP(1,2,3,4,5,6,7,0,j); j++; } while (j < 80); ctx->h[0] += wv[0]; ctx->h[1] += wv[1]; ctx->h[2] += wv[2]; ctx->h[3] += wv[3]; ctx->h[4] += wv[4]; ctx->h[5] += wv[5]; ctx->h[6] += wv[6]; ctx->h[7] += wv[7]; #endif /* !UNROLL_LOOPS */ } }