Added extensive testing
This commit is contained in:
parent
cba84edcb5
commit
6f35ae7007
55
README.md
55
README.md
|
@ -21,12 +21,6 @@ At the moment, only SHA-256 is implemented.
|
||||||
[Wikipedia](https://en.wikipedia.org/wiki/SHA-2). At the moment,
|
[Wikipedia](https://en.wikipedia.org/wiki/SHA-2). At the moment,
|
||||||
no effort at all has been put on optimization.
|
no effort at all has been put on optimization.
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
Some testing has been performed, that hopefully proves that the
|
|
||||||
implementation is correct. However, no effort has so far been put into
|
|
||||||
testing large sizes of data.
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
The Makefile is as minimal as possible. No effort was put into making
|
The Makefile is as minimal as possible. No effort was put into making
|
||||||
|
@ -36,8 +30,53 @@ include in any project, may it use GNU make or any other build tool.
|
||||||
|
|
||||||
## Code review
|
## Code review
|
||||||
|
|
||||||
This code has been posted for review at [Stack Exchange CODE
|
This code has been reviewed at [Stack Exchange CODE
|
||||||
REVIEW](https://codereview.stackexchange.com/questions/182812/self-contained-sha-256-implementation-in-c).
|
REVIEW](https://codereview.stackexchange.com/questions/182812/self-contained-sha-256-implementation-in-c),
|
||||||
|
and the implementation has been improved accordingly.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
The implementation has been successfully tested on an x86-64 machine
|
||||||
|
under Linux as well as on a 16-bit DSP. On the x86-64 machine, all the
|
||||||
|
available NIST test vectors where successfully tested ([SHA-256
|
||||||
|
examples](https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/SHA256.pdf)
|
||||||
|
and [SHA-2 Additional
|
||||||
|
examples](https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/SHA2_Additional.pdf),
|
||||||
|
plus a few others):
|
||||||
|
|
||||||
|
`Input Message: "abc"
|
||||||
|
Message Digest is BA7816BF 8F01CFEA 414140DE 5DAE2223 B00361A3 96177A9C B410FF61 F20015AD`
|
||||||
|
|
||||||
|
`Input Message: "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
|
||||||
|
Message Digest is 248D6A61 D20638B8 E5C02693 0C3E6039 A33CE459 64FF2167 F6ECEDD4 19DB06C1`
|
||||||
|
|
||||||
|
`SHA-256 Test Data
|
||||||
|
#1) 1 byte 0xbd
|
||||||
|
68325720 aabd7c82 f30f554b 313d0570 c95accbb 7dc4b5aa e11204c0 8ffe732b
|
||||||
|
#2) 4 bytes 0xc98c8e55
|
||||||
|
7abc22c0 ae5af26c e93dbb94 433a0e0b 2e119d01 4f8e7f65 bd56c61c cccd9504
|
||||||
|
#3) 55 bytes of zeros
|
||||||
|
02779466 cdec1638 11d07881 5c633f21 90141308 1449002f 24aa3e80 f0b88ef7
|
||||||
|
#4) 56 bytes of zeros
|
||||||
|
d4817aa5 497628e7 c77e6b60 6107042b bba31308 88c5f47a 375e6179 be789fbb
|
||||||
|
#5) 57 bytes of zeros
|
||||||
|
65a16cb7 861335d5 ace3c607 18b5052e 44660726 da4cd13b b745381b 235a1785
|
||||||
|
#6) 64 bytes of zeros
|
||||||
|
f5a5fd42 d16a2030 2798ef6e d309979b 43003d23 20d9f0e8 ea9831a9 2759fb4b
|
||||||
|
#7) 1000 bytes of zeros
|
||||||
|
541b3e9d aa09b20b f85fa273 e5cbd3e8 0185aa4e c298e765 db87742b 70138a53
|
||||||
|
#8) 1000 bytes of 0x41 ‘A’
|
||||||
|
c2e68682 3489ced2 017f6059 b8b23931 8b6364f6 dcd835d0 a519105a 1eadd6e4
|
||||||
|
#9) 1005 bytes of 0x55 ‘U’
|
||||||
|
f4d62dde c0f3dd90 ea1380fa 16a5ff8d c4c54b21 740650f2 4afc4120 903552b0
|
||||||
|
#10) 1000000 bytes of zeros
|
||||||
|
d29751f2 649b32ff 572b5e0a 9f541ea6 60a50f94 ff0beedf b0b692b9 24cc8025
|
||||||
|
#11) 0x20000000 (536870912) bytes of 0x5a ‘Z’
|
||||||
|
15a1868c 12cc5395 1e182344 277447cd 0979536b adcc512a d24c67e9 b2d4f3dd
|
||||||
|
#12) 0x41000000 (1090519040) bytes of zeros
|
||||||
|
461c19a9 3bd4344f 9215f5ec 64357090 342bc66b 15a14831 7d276e31 cbc20b53
|
||||||
|
#13) 0x6000003e (1610612798) bytes of 0x42 ‘B’
|
||||||
|
c23ce8a7 895f4b21 ec0daf37 920ac0a2 62a22004 5a03eb2d fed48ef9 b05aabea`
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|
138
test.c
138
test.c
|
@ -4,12 +4,12 @@
|
||||||
|
|
||||||
#include "sha-256.h"
|
#include "sha-256.h"
|
||||||
|
|
||||||
struct vector {
|
struct string_vector {
|
||||||
const char *input;
|
const char *input;
|
||||||
const char *output;
|
const char *output;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct vector VECTORS[] = {
|
static const struct string_vector STRING_VECTORS[] = {
|
||||||
{
|
{
|
||||||
"",
|
"",
|
||||||
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||||
|
@ -65,6 +65,115 @@ static const struct vector VECTORS[] = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define LARGE_MESSAGES 0
|
||||||
|
|
||||||
|
static uint8_t data1[] = { 0xbd };
|
||||||
|
static uint8_t data2[] = { 0xc9, 0x8c, 0x8e, 0x55 };
|
||||||
|
static uint8_t data7[1000];
|
||||||
|
static uint8_t data8[1000];
|
||||||
|
static uint8_t data9[1005];
|
||||||
|
#if LARGE_MESSAGES
|
||||||
|
static uint8_t data11[536870912];
|
||||||
|
static uint8_t data12[1090519040];
|
||||||
|
static uint8_t data13[1610612798];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void construct_binary_messages(void)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < sizeof data7; i++)
|
||||||
|
data7[i] = 0;
|
||||||
|
for (i = 0; i < sizeof data8; i++)
|
||||||
|
data8[i] = 0x41;
|
||||||
|
for (i = 0; i < sizeof data9; i++)
|
||||||
|
data9[i] = 0x55;
|
||||||
|
#if LARGE_MESSAGES
|
||||||
|
for (i = 0; i < sizeof data11; i++)
|
||||||
|
data11[i] = 0x5a;
|
||||||
|
for (i = 0; i < sizeof data12; i++)
|
||||||
|
data12[i] = 0;
|
||||||
|
for (i = 0; i < sizeof data13; i++)
|
||||||
|
data13[i] = 0x42;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
struct vector {
|
||||||
|
const uint8_t *input;
|
||||||
|
size_t input_len;
|
||||||
|
const char *output;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct vector VECTORS[] = {
|
||||||
|
{
|
||||||
|
data1,
|
||||||
|
sizeof data1,
|
||||||
|
"68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data2,
|
||||||
|
sizeof data2,
|
||||||
|
"7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data7,
|
||||||
|
55,
|
||||||
|
"02779466cdec163811d078815c633f21901413081449002f24aa3e80f0b88ef7"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data7,
|
||||||
|
56,
|
||||||
|
"d4817aa5497628e7c77e6b606107042bbba3130888c5f47a375e6179be789fbb"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data7,
|
||||||
|
57,
|
||||||
|
"65a16cb7861335d5ace3c60718b5052e44660726da4cd13bb745381b235a1785"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data7,
|
||||||
|
64,
|
||||||
|
"f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data7,
|
||||||
|
sizeof data7,
|
||||||
|
"541b3e9daa09b20bf85fa273e5cbd3e80185aa4ec298e765db87742b70138a53"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data8,
|
||||||
|
sizeof data8,
|
||||||
|
"c2e686823489ced2017f6059b8b239318b6364f6dcd835d0a519105a1eadd6e4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data9,
|
||||||
|
sizeof data9,
|
||||||
|
"f4d62ddec0f3dd90ea1380fa16a5ff8dc4c54b21740650f24afc4120903552b0"
|
||||||
|
}
|
||||||
|
#if LARGE_MESSAGES
|
||||||
|
,
|
||||||
|
{
|
||||||
|
data12,
|
||||||
|
1000000,
|
||||||
|
"d29751f2649b32ff572b5e0a9f541ea660a50f94ff0beedfb0b692b924cc8025"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data11,
|
||||||
|
sizeof data11,
|
||||||
|
"15a1868c12cc53951e182344277447cd0979536badcc512ad24c67e9b2d4f3dd"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data12,
|
||||||
|
sizeof data12,
|
||||||
|
"461c19a93bd4344f9215f5ec64357090342bc66b15a148317d276e31cbc20b53"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data13,
|
||||||
|
sizeof data13,
|
||||||
|
"c23ce8a7895f4b21ec0daf37920ac0a262a220045a03eb2dfed48ef9b05aabea"
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
static void hash_to_string(char string[65], const uint8_t hash[32])
|
static void hash_to_string(char string[65], const uint8_t hash[32])
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
@ -73,7 +182,7 @@ static void hash_to_string(char string[65], const uint8_t hash[32])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test(const char input[], const char output[])
|
static void string_test(const char input[], const char output[])
|
||||||
{
|
{
|
||||||
uint8_t hash[32];
|
uint8_t hash[32];
|
||||||
char hash_string[65];
|
char hash_string[65];
|
||||||
|
@ -87,14 +196,33 @@ static void test(const char input[], const char output[])
|
||||||
printf("SUCCESS!\n\n");
|
printf("SUCCESS!\n\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test(const uint8_t * input, size_t input_len, const char output[])
|
||||||
|
{
|
||||||
|
uint8_t hash[32];
|
||||||
|
char hash_string[65];
|
||||||
|
calc_sha_256(hash, input, input_len);
|
||||||
|
hash_to_string(hash_string, hash);
|
||||||
|
printf("input starts with 0x%02x, length %lu\n", *input, input_len);
|
||||||
|
printf("hash : %s\n", hash_string);
|
||||||
|
if (strcmp(output, hash_string)) {
|
||||||
|
printf("FAILURE!\n\n");
|
||||||
|
} else {
|
||||||
|
printf("SUCCESS!\n\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
for (i = 0; i < (sizeof STRING_VECTORS / sizeof (struct string_vector)); i++) {
|
||||||
|
const struct string_vector *vector = &STRING_VECTORS[i];
|
||||||
|
string_test(vector->input, vector->output);
|
||||||
|
}
|
||||||
|
construct_binary_messages();
|
||||||
for (i = 0; i < (sizeof VECTORS / sizeof (struct vector)); i++) {
|
for (i = 0; i < (sizeof VECTORS / sizeof (struct vector)); i++) {
|
||||||
const struct vector *vector = &VECTORS[i];
|
const struct vector *vector = &VECTORS[i];
|
||||||
test(vector->input, vector->output);
|
test(vector->input, vector->input_len, vector->output);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue