1 
2 #define TEST_NAME "generichash2"
3 #include "cmptest.h"
4 
5 int
main(void)6 main(void)
7 {
8 #define MAXLEN 64
9     crypto_generichash_state *st;
10     unsigned char            in[MAXLEN];
11     unsigned char            out[crypto_generichash_BYTES_MAX];
12     unsigned char            k[crypto_generichash_KEYBYTES_MAX];
13     size_t                   h, i, j;
14 
15     assert(crypto_generichash_statebytes() >= sizeof *st);
16     st = (crypto_generichash_state *)
17         sodium_malloc(crypto_generichash_statebytes());
18     for (h = 0; h < crypto_generichash_KEYBYTES_MAX; ++h) {
19         k[h] = (unsigned char) h;
20     }
21     for (i = 0; i < MAXLEN; ++i) {
22         in[i] = (unsigned char) i;
23         if (crypto_generichash_init(st, k,
24                                     1 + i % crypto_generichash_KEYBYTES_MAX,
25                                     1 + i % crypto_generichash_BYTES_MAX) != 0) {
26             printf("crypto_generichash_init()\n");
27             return 1;
28         }
29         crypto_generichash_update(st, in, i);
30         crypto_generichash_update(st, in, i);
31         crypto_generichash_update(st, in, i);
32         if (crypto_generichash_final(st, out,
33                                      1 + i % crypto_generichash_BYTES_MAX) != 0) {
34             printf("crypto_generichash_final() should have returned 0\n");
35         }
36         for (j = 0; j < 1 + i % crypto_generichash_BYTES_MAX; ++j) {
37             printf("%02x", (unsigned int) out[j]);
38         }
39         printf("\n");
40         if (crypto_generichash_final(st, out,
41                                      1 + i % crypto_generichash_BYTES_MAX) != -1) {
42             printf("crypto_generichash_final() should have returned -1\n");
43         }
44     }
45 
46     assert(crypto_generichash_init(st, k, sizeof k, 0U) == -1);
47     assert(crypto_generichash_init(st, k, sizeof k,
48                                    crypto_generichash_BYTES_MAX + 1U) == -1);
49     assert(crypto_generichash_init(st, k, crypto_generichash_KEYBYTES_MAX + 1U,
50                                    sizeof out) == -1);
51     assert(crypto_generichash_init(st, k, 0U, sizeof out) == 0);
52     assert(crypto_generichash_init(st, k, 1U, sizeof out) == 0);
53     assert(crypto_generichash_init(st, NULL, 1U, 0U) == -1);
54     assert(crypto_generichash_init(st, NULL, crypto_generichash_KEYBYTES,
55                                    1U) == 0);
56     assert(crypto_generichash_init(st, NULL, crypto_generichash_KEYBYTES,
57                                    0U) == -1);
58 
59     sodium_free(st);
60 
61     return 0;
62 }
63