Skip to content

Commit b602b7b

Browse files
Add SHA256 counter tests
Those tests verify that the SHA256 bit counter wraps correctly at bit lengths 20 to 34. This wide range aims at being independent of the implementation of the counter and it catches multiple natural 32-bit overflows (e.g., counting bits, counting bytes, counting blocks, ...). The test vectors have been generated using cloudtools/sha256@e0645d1 and the following Python script ``` from sha256 import sha256 from copy import copy def midstate_c_definition(hasher): ret = ' {{UINT32_C(0x' + hasher.state[0].hex('_', 4).replace('_', '), UINT32_C(0x') + ')},\n' ret += ' {0x00}, UINT64_C(' + str(hasher.state[1]) + ')}' return ret def output_c_literal(hasher): return '{0x' + hasher.digest().hex('_').replace('_', ', 0x') + '}' MESSAGE = b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno' ITER_BOUNDARIES = [(2**b)//len(MESSAGE) - 1 for b in range(20, 34)] midstates = [] digests = [] hasher = sha256() for i in range(ITER_BOUNDARIES[-1] + 1): if i in ITER_BOUNDARIES: midstates.append(midstate_c_definition(hasher)) hasher_copy = copy(hasher) hasher_copy.update(MESSAGE) digests.append(output_c_literal(hasher_copy)) hasher.update(MESSAGE) for x in midstates: print(x + ',') for x in digests: print(x + ',') ```
1 parent 6823d3b commit b602b7b

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

src/tests.c

+60
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,65 @@ void run_sha256_tests(void) {
463463
}
464464
}
465465

466+
void run_sha256_counter_tests(void) {
467+
static const char *input = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno";
468+
static const secp256k1_sha256 midstates[14] = {
469+
{{UINT32_C(0xa2b5c8bb), UINT32_C(0x26c88bb3), UINT32_C(0x2abdc3d2), UINT32_C(0x9def99a3), UINT32_C(0xdfd21a6e), UINT32_C(0x41fe585b), UINT32_C(0x7ef2c440), UINT32_C(0x2b79adda)},
470+
{0x00}, UINT64_C(1048512)},
471+
{{UINT32_C(0xa0d29445), UINT32_C(0x9287de66), UINT32_C(0x76aabd71), UINT32_C(0x41acd765), UINT32_C(0x0c7528b4), UINT32_C(0x84e14906), UINT32_C(0x942faec6), UINT32_C(0xcc5a7b26)},
472+
{0x00}, UINT64_C(2097088)},
473+
{{UINT32_C(0x50449526), UINT32_C(0xb9f1d657), UINT32_C(0xa0fc13e9), UINT32_C(0x50860f10), UINT32_C(0xa550c431), UINT32_C(0x3fbc97c1), UINT32_C(0x7bbb2d89), UINT32_C(0xdb67bac1)},
474+
{0x00}, UINT64_C(4194240)},
475+
{{UINT32_C(0x54a6efdc), UINT32_C(0x46762e7b), UINT32_C(0x88bfe73f), UINT32_C(0xbbd149c7), UINT32_C(0x41620c43), UINT32_C(0x1168da7b), UINT32_C(0x2c5960f9), UINT32_C(0xeccffda6)},
476+
{0x00}, UINT64_C(8388544)},
477+
{{UINT32_C(0x2515a8f5), UINT32_C(0x5faa2977), UINT32_C(0x3a850486), UINT32_C(0xac858cad), UINT32_C(0x7b7276ee), UINT32_C(0x235c0385), UINT32_C(0xc53a157c), UINT32_C(0x7cb3e69c)},
478+
{0x00}, UINT64_C(16777152)},
479+
{{UINT32_C(0x34f39828), UINT32_C(0x409fedb7), UINT32_C(0x4bbdd0fb), UINT32_C(0x3b643634), UINT32_C(0x7806bf2e), UINT32_C(0xe0d1b713), UINT32_C(0xca3f2e1e), UINT32_C(0xe38722c2)},
480+
{0x00}, UINT64_C(33554368)},
481+
{{UINT32_C(0x389ef5c5), UINT32_C(0x38c54167), UINT32_C(0x8f5d56ab), UINT32_C(0x582a75cc), UINT32_C(0x8217caef), UINT32_C(0xf10947dd), UINT32_C(0x6a1998a8), UINT32_C(0x048f0b8c)},
482+
{0x00}, UINT64_C(67108800)},
483+
{{UINT32_C(0xd6c3f394), UINT32_C(0x0bee43b9), UINT32_C(0x6783f497), UINT32_C(0x29fa9e21), UINT32_C(0x6ce491c1), UINT32_C(0xa81fe45e), UINT32_C(0x2fc3859a), UINT32_C(0x269012d0)},
484+
{0x00}, UINT64_C(134217664)},
485+
{{UINT32_C(0x6dd3c526), UINT32_C(0x44d88aa0), UINT32_C(0x806a1bae), UINT32_C(0xfbcc0d32), UINT32_C(0x9d6144f3), UINT32_C(0x9d2bd757), UINT32_C(0x9851a957), UINT32_C(0xb50430ad)},
486+
{0x00}, UINT64_C(268435392)},
487+
{{UINT32_C(0x2add4021), UINT32_C(0xdfe8a9e6), UINT32_C(0xa56317c6), UINT32_C(0x7a15f5bb), UINT32_C(0x4a48aacd), UINT32_C(0x5d368414), UINT32_C(0x4f00e6f0), UINT32_C(0xd9355023)},
488+
{0x00}, UINT64_C(536870848)},
489+
{{UINT32_C(0xb66666b4), UINT32_C(0xdbeac32b), UINT32_C(0x0ea351ae), UINT32_C(0xcba9da46), UINT32_C(0x6278b874), UINT32_C(0x8c508e23), UINT32_C(0xe16ca776), UINT32_C(0x8465bac1)},
490+
{0x00}, UINT64_C(1073741760)},
491+
{{UINT32_C(0xb6744789), UINT32_C(0x9cce87aa), UINT32_C(0xc4c478b7), UINT32_C(0xf38404d8), UINT32_C(0x2e38ba62), UINT32_C(0xa3f7019b), UINT32_C(0x50458fe7), UINT32_C(0x3047dbec)},
492+
{0x00}, UINT64_C(2147483584)},
493+
{{UINT32_C(0x8b1297ba), UINT32_C(0xba261a80), UINT32_C(0x2ba1b0dd), UINT32_C(0xfbc67d6d), UINT32_C(0x61072c4e), UINT32_C(0x4b5a2a0f), UINT32_C(0x52872760), UINT32_C(0x2dfeb162)},
494+
{0x00}, UINT64_C(4294967232)},
495+
{{UINT32_C(0x24f33cf7), UINT32_C(0x41ad6583), UINT32_C(0x41c8ff5d), UINT32_C(0xca7ef35f), UINT32_C(0x50395756), UINT32_C(0x021b743e), UINT32_C(0xd7126cd7), UINT32_C(0xd037473a)},
496+
{0x00}, UINT64_C(8589934528)}
497+
};
498+
static const unsigned char outputs[14][32] = {
499+
{0x0e, 0x83, 0xe2, 0xc9, 0x4f, 0xb2, 0xb8, 0x2b, 0x89, 0x06, 0x92, 0x78, 0x04, 0x03, 0x48, 0x5c, 0x48, 0x44, 0x67, 0x61, 0x77, 0xa4, 0xc7, 0x90, 0x9e, 0x92, 0x55, 0x10, 0x05, 0xfe, 0x39, 0x15},
500+
{0x1d, 0x1e, 0xd7, 0xb8, 0xa3, 0xa7, 0x8a, 0x79, 0xfd, 0xa0, 0x05, 0x08, 0x9c, 0xeb, 0xf0, 0xec, 0x67, 0x07, 0x9f, 0x8e, 0x3c, 0x0d, 0x8e, 0xf9, 0x75, 0x55, 0x13, 0xc1, 0xe8, 0x77, 0xf8, 0xbb},
501+
{0x66, 0x95, 0x6c, 0xc9, 0xe0, 0x39, 0x65, 0xb6, 0xb0, 0x05, 0xd1, 0xaf, 0xaf, 0xf3, 0x1d, 0xb9, 0xa4, 0xda, 0x6f, 0x20, 0xcd, 0x3a, 0xae, 0x64, 0xc2, 0xdb, 0xee, 0xf5, 0xb8, 0x8d, 0x57, 0x0e},
502+
{0x3c, 0xbb, 0x1c, 0x12, 0x5e, 0x17, 0xfd, 0x54, 0x90, 0x45, 0xa7, 0x7b, 0x61, 0x6c, 0x1d, 0xfe, 0xe6, 0xcc, 0x7f, 0xee, 0xcf, 0xef, 0x33, 0x35, 0x50, 0x62, 0x16, 0x70, 0x2f, 0x87, 0xc3, 0xc9},
503+
{0x53, 0x4d, 0xa8, 0xe7, 0x1e, 0x98, 0x73, 0x8d, 0xd9, 0xa3, 0x54, 0xa5, 0x0e, 0x59, 0x2c, 0x25, 0x43, 0x6f, 0xaa, 0xa2, 0xf5, 0x21, 0x06, 0x3e, 0xc9, 0x82, 0x06, 0x94, 0x98, 0x72, 0x9d, 0xa7},
504+
{0xef, 0x7e, 0xe9, 0x6b, 0xd3, 0xe5, 0xb7, 0x41, 0x4c, 0xc8, 0xd3, 0x07, 0x52, 0x9a, 0x5a, 0x8b, 0x4e, 0x1e, 0x75, 0xa4, 0x17, 0x78, 0xc8, 0x36, 0xcd, 0xf8, 0x2e, 0xd9, 0x57, 0xe3, 0xd7, 0x07},
505+
{0x87, 0x16, 0xfb, 0xf9, 0xa5, 0xf8, 0xc4, 0x56, 0x2b, 0x48, 0x52, 0x8e, 0x2d, 0x30, 0x85, 0xb6, 0x4c, 0x56, 0xb5, 0xd1, 0x16, 0x9c, 0xcf, 0x32, 0x95, 0xad, 0x03, 0xe8, 0x05, 0x58, 0x06, 0x76},
506+
{0x75, 0x03, 0x80, 0x28, 0xf2, 0xa7, 0x63, 0x22, 0x1a, 0x26, 0x9c, 0x68, 0xe0, 0x58, 0xfc, 0x73, 0xeb, 0x42, 0xf6, 0x86, 0x16, 0x24, 0x4b, 0xbc, 0x24, 0xf7, 0x02, 0xc8, 0x3d, 0x90, 0xe2, 0xb0},
507+
{0xdf, 0x49, 0x0f, 0x15, 0x7b, 0x7d, 0xbf, 0xe0, 0xd4, 0xcf, 0x47, 0xc0, 0x80, 0x93, 0x4a, 0x61, 0xaa, 0x03, 0x07, 0x66, 0xb3, 0x38, 0x5d, 0xc8, 0xc9, 0x07, 0x61, 0xfb, 0x97, 0x10, 0x2f, 0xd8},
508+
{0x77, 0x19, 0x40, 0x56, 0x41, 0xad, 0xbc, 0x59, 0xda, 0x1e, 0xc5, 0x37, 0x14, 0x63, 0x7b, 0xfb, 0x79, 0xe2, 0x7a, 0xb1, 0x55, 0x42, 0x99, 0x42, 0x56, 0xfe, 0x26, 0x9d, 0x0f, 0x7e, 0x80, 0xc6},
509+
{0x50, 0xe7, 0x2a, 0x0e, 0x26, 0x44, 0x2f, 0xe2, 0x55, 0x2d, 0xc3, 0x93, 0x8a, 0xc5, 0x86, 0x58, 0x22, 0x8c, 0x0c, 0xbf, 0xb1, 0xd2, 0xca, 0x87, 0x2a, 0xe4, 0x35, 0x26, 0x6f, 0xcd, 0x05, 0x5e},
510+
{0xe4, 0x80, 0x6f, 0xdb, 0x3d, 0x7d, 0xba, 0xde, 0x50, 0x3f, 0xea, 0x00, 0x3d, 0x46, 0x59, 0x64, 0xfd, 0x58, 0x1c, 0xa1, 0xb8, 0x7d, 0x5f, 0xac, 0x94, 0x37, 0x9e, 0xa0, 0xc0, 0x9c, 0x93, 0x8b},
511+
{0x2c, 0xf3, 0xa9, 0xf6, 0x15, 0x25, 0x80, 0x70, 0x76, 0x99, 0x7d, 0xf1, 0xc3, 0x2f, 0xa3, 0x31, 0xff, 0x92, 0x35, 0x2e, 0x8d, 0x04, 0x13, 0x33, 0xd8, 0x0d, 0xdb, 0x4a, 0xf6, 0x8c, 0x03, 0x34},
512+
{0xec, 0x12, 0x24, 0x9f, 0x35, 0xa4, 0x29, 0x8b, 0x9e, 0x4a, 0x95, 0xf8, 0x61, 0xaf, 0x61, 0xc5, 0x66, 0x55, 0x3e, 0x3f, 0x2a, 0x98, 0xea, 0x71, 0x16, 0x6b, 0x1c, 0xd9, 0xe4, 0x09, 0xd2, 0x8e}
513+
};
514+
unsigned int i;
515+
for (i = 0; i < sizeof(midstates)/sizeof(midstates[0]); i++) {
516+
unsigned char out[32];
517+
secp256k1_sha256 hasher;
518+
secp256k1_sha256_initialize_midstate(&hasher, &midstates[i]);
519+
secp256k1_sha256_write(&hasher, (const unsigned char*)input, strlen(input));
520+
secp256k1_sha256_finalize(&hasher, out);
521+
CHECK(memcmp(out, outputs[i], 32) == 0);
522+
}
523+
}
524+
466525
void run_hmac_sha256_tests(void) {
467526
static const char *keys[6] = {
468527
"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
@@ -5269,6 +5328,7 @@ int main(int argc, char **argv) {
52695328
run_rand_int();
52705329

52715330
run_sha256_tests();
5331+
run_sha256_counter_tests();
52725332
run_hmac_sha256_tests();
52735333
run_rfc6979_hmac_sha256_tests();
52745334

0 commit comments

Comments
 (0)