==> tests/sha256.c <==1/* sha256_compress: FIPS 180-4's one-block example, SHA-256("abc"), and the
2 * two-block "abcdbcde...nopq" message. */
3#include "sha256_compress.h"
4#include "mesh/check.h"
5
6static void pad_one_block(const char *s, uint32_t w[16]) {
7 uint8_t b[64] = {0};
8 size_t n = strlen(s);
9 memcpy(b, s, n);
10 b[n] = 0x80;
11 uint64_t bits = (uint64_t)n * 8;
12 for (int i = 0; i < 8; i++) b[63 - i] = (uint8_t)(bits >> (8 * i));
13 for (int i = 0; i < 16; i++) w[i] = (uint32_t)b[4 * i] << 24 | (uint32_t)b[4 * i + 1] << 16 | (uint32_t)b[4 * i + 2] << 8 | b[4 * i + 3];
14}
15
16int main(void) {
17 uint32_t h[8], w[16];
18 memcpy(h, SHA256_H0, sizeof h);
19 pad_one_block("abc", w);
20 sha256_compress(h, w);
21 const uint32_t abc[8] = {0xba7816bf, 0x8f01cfea, 0x414140de, 0x5dae2223, 0xb00361a3, 0x96177a9c, 0xb410ff61, 0xf20015ad};
22 for (int i = 0; i < 8; i++) CHECK_U(h[i], abc[i]);
23 /* "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq": 56 bytes, two blocks. */
24 const char *s = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
25 uint8_t b[128] = {0};
26 memcpy(b, s, 56);
27 b[56] = 0x80;
28 b[126] = 0x01, b[127] = 0xc0; /* 448 bits */
29 memcpy(h, SHA256_H0, sizeof h);
30 for (int blk = 0; blk < 2; blk++) {
31 for (int i = 0; i < 16; i++) {
32 const uint8_t *p = b + 64 * blk + 4 * i;
33 w[i] = (uint32_t)p[0] << 24 | (uint32_t)p[1] << 16 | (uint32_t)p[2] << 8 | p[3];
34 }
35 sha256_compress(h, w);
36 }
37 const uint32_t two[8] = {0x248d6a61, 0xd20638b8, 0xe5c02693, 0x0c3e6039, 0xa33ce459, 0x64ff2167, 0xf6ecedd4, 0x19db06c1};
38 for (int i = 0; i < 8; i++) CHECK_U(h[i], two[i]);
39 return mesh_check_done();
40}