1
2#define TEST_NAME "generichash3"
3#include "cmptest.h"
4
5int
6main(void)
7{
8#define MAXLEN 64
9    crypto_generichash_blake2b_state st;
10    unsigned char salt[crypto_generichash_blake2b_SALTBYTES]
11        = { '5', 'b', '6', 'b', '4', '1', 'e', 'd',
12            '9', 'b', '3', '4', '3', 'f', 'e', '0' };
13    unsigned char personal[crypto_generichash_blake2b_PERSONALBYTES]
14        = { '5', '1', '2', '6', 'f', 'b', '2', 'a',
15            '3', '7', '4', '0', '0', 'd', '2', 'a' };
16    unsigned char in[MAXLEN];
17    unsigned char out[crypto_generichash_blake2b_BYTES_MAX];
18    unsigned char k[crypto_generichash_blake2b_KEYBYTES_MAX];
19    size_t        h;
20    size_t        i;
21    size_t        j;
22
23    assert(crypto_generichash_blake2b_statebytes() >= sizeof st);
24    for (h = 0; h < crypto_generichash_blake2b_KEYBYTES_MAX; ++h) {
25        k[h] = (unsigned char) h;
26    }
27
28    for (i = 0; i < MAXLEN; ++i) {
29        in[i] = (unsigned char) i;
30        crypto_generichash_blake2b_init_salt_personal(
31            &st, k, 1 + i % crypto_generichash_blake2b_KEYBYTES_MAX,
32            1 + i % crypto_generichash_blake2b_BYTES_MAX, salt, personal);
33        crypto_generichash_blake2b_update(&st, in, (unsigned long long) i);
34        crypto_generichash_blake2b_final(
35            &st, out, 1 + i % crypto_generichash_blake2b_BYTES_MAX);
36        for (j = 0; j < 1 + i % crypto_generichash_blake2b_BYTES_MAX; ++j) {
37            printf("%02x", (unsigned int) out[j]);
38        }
39        printf("\n");
40    }
41
42    memset(out, 0, sizeof out);
43    crypto_generichash_blake2b_init_salt_personal(
44        &st, k, 0U, crypto_generichash_blake2b_BYTES_MAX, salt, personal);
45    crypto_generichash_blake2b_update(&st, in, MAXLEN);
46    crypto_generichash_blake2b_final(&st, out,
47                                     crypto_generichash_blake2b_BYTES_MAX);
48    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {
49        printf("%02x", (unsigned int) out[j]);
50    }
51    printf("\n");
52
53    memset(out, 0, sizeof out);
54    crypto_generichash_blake2b_init_salt_personal(
55        &st, NULL, 1U, crypto_generichash_blake2b_BYTES_MAX, salt, personal);
56    crypto_generichash_blake2b_update(&st, in, MAXLEN);
57    crypto_generichash_blake2b_final(&st, out,
58                                     crypto_generichash_blake2b_BYTES_MAX);
59    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {
60        printf("%02x", (unsigned int) out[j]);
61    }
62    printf("\n");
63
64    memset(out, 0, sizeof out);
65    crypto_generichash_blake2b_init_salt_personal(
66        &st, k, crypto_generichash_blake2b_KEYBYTES_MAX,
67    crypto_generichash_blake2b_BYTES_MAX, NULL, personal);
68    crypto_generichash_blake2b_update(&st, in, MAXLEN);
69    crypto_generichash_blake2b_final(&st, out,
70                                     crypto_generichash_blake2b_BYTES_MAX);
71    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {
72        printf("%02x", (unsigned int) out[j]);
73    }
74    printf("\n");
75
76    memset(out, 0, sizeof out);
77    crypto_generichash_blake2b_init_salt_personal(
78        &st, k, crypto_generichash_blake2b_KEYBYTES_MAX,
79        crypto_generichash_blake2b_BYTES_MAX, salt, NULL);
80    crypto_generichash_blake2b_update(&st, in, MAXLEN);
81    crypto_generichash_blake2b_final(
82        &st, out, crypto_generichash_blake2b_BYTES_MAX);
83    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {
84        printf("%02x", (unsigned int) out[j]);
85    }
86    printf("\n");
87
88    memset(out, 0, sizeof out);
89    crypto_generichash_blake2b_salt_personal(
90        out, crypto_generichash_blake2b_BYTES_MAX, in, MAXLEN,
91        k, 0U, salt, personal);
92    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {
93        printf("%02x", (unsigned int) out[j]);
94    }
95    printf("\n");
96
97    memset(out, 0, sizeof out);
98    crypto_generichash_blake2b_salt_personal(
99        out, crypto_generichash_blake2b_BYTES_MAX, in, MAXLEN,
100        NULL, 0U, salt, personal);
101    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {
102        printf("%02x", (unsigned int) out[j]);
103    }
104    printf("\n");
105
106    memset(out, 0, sizeof out);
107    crypto_generichash_blake2b_salt_personal(
108        out, crypto_generichash_blake2b_BYTES_MAX, in, MAXLEN,
109        k, crypto_generichash_blake2b_KEYBYTES_MAX, salt, personal);
110    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {
111        printf("%02x", (unsigned int) out[j]);
112    }
113    printf("\n");
114
115    memset(out, 0, sizeof out);
116    crypto_generichash_blake2b_salt_personal(
117        out, crypto_generichash_blake2b_BYTES_MAX, in, MAXLEN,
118        k, crypto_generichash_blake2b_KEYBYTES_MAX, NULL, personal);
119    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {
120        printf("%02x", (unsigned int) out[j]);
121    }
122    printf("\n");
123
124    memset(out, 0, sizeof out);
125    crypto_generichash_blake2b_salt_personal(
126        out, crypto_generichash_blake2b_BYTES_MAX, in, MAXLEN,
127        k, crypto_generichash_blake2b_KEYBYTES_MAX, salt, NULL);
128    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {
129        printf("%02x", (unsigned int) out[j]);
130    }
131    printf("\n");
132
133    assert(crypto_generichash_blake2b_salt_personal
134           (NULL, 0,
135            in, (unsigned long long) sizeof in,
136            k, sizeof k, NULL, NULL) == -1);
137    assert(crypto_generichash_blake2b_salt_personal
138           (NULL, crypto_generichash_BYTES_MAX + 1,
139            in, (unsigned long long) sizeof in,
140            k, sizeof k, NULL, NULL) == -1);
141    assert(crypto_generichash_blake2b_salt_personal
142           (NULL, (unsigned long long) sizeof in,
143            in, (unsigned long long) sizeof in,
144            k, crypto_generichash_KEYBYTES_MAX + 1, NULL, NULL) == -1);
145
146    crypto_generichash_blake2b_init_salt_personal(&st, NULL, 0U, crypto_generichash_BYTES,
147                                                  NULL, personal);
148    crypto_generichash_blake2b_update(&st, in, MAXLEN);
149    crypto_generichash_blake2b_final(&st, out, crypto_generichash_blake2b_BYTES_MAX);
150    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {
151        printf("%02x", (unsigned int) out[j]);
152    }
153    printf("\n");
154
155    crypto_generichash_blake2b_init_salt_personal(&st, NULL, 0U, crypto_generichash_BYTES,
156                                                  salt, NULL);
157    crypto_generichash_blake2b_update(&st, in, MAXLEN);
158    crypto_generichash_blake2b_final(&st, out, crypto_generichash_blake2b_BYTES_MAX);
159    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {
160        printf("%02x", (unsigned int) out[j]);
161    }
162    printf("\n");
163
164    assert(crypto_generichash_blake2b_init_salt_personal
165           (&st, k, sizeof k, 0, NULL, NULL) == -1);
166    assert(crypto_generichash_blake2b_init_salt_personal
167           (&st, k, sizeof k, crypto_generichash_blake2b_BYTES_MAX + 1, NULL, NULL) == -1);
168    assert(crypto_generichash_blake2b_init_salt_personal
169           (&st, k, crypto_generichash_blake2b_KEYBYTES_MAX + 1, sizeof out, NULL, NULL) == -1);
170
171    assert(crypto_generichash_blake2b_init_salt_personal(&st, k, sizeof k, crypto_generichash_BYTES,
172                                                         NULL, personal) == 0);
173    assert(crypto_generichash_blake2b_init_salt_personal(&st, k, sizeof k, crypto_generichash_BYTES,
174                                                         salt, NULL) == 0);
175    return 0;
176}
177