skip to content
==> 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}