xref: /freebsd-src/sys/contrib/libsodium/test/default/kdf.c (revision 3611ec604864a7d4dcc9a3ea898c80eb35eef8a0)
1*0ac341f1SConrad Meyer 
2*0ac341f1SConrad Meyer #define TEST_NAME "kdf"
3*0ac341f1SConrad Meyer #include "cmptest.h"
4*0ac341f1SConrad Meyer 
5*0ac341f1SConrad Meyer static void
tv_kdf(void)6*0ac341f1SConrad Meyer tv_kdf(void)
7*0ac341f1SConrad Meyer {
8*0ac341f1SConrad Meyer     unsigned char *master_key;
9*0ac341f1SConrad Meyer     unsigned char *subkey;
10*0ac341f1SConrad Meyer     char          *context;
11*0ac341f1SConrad Meyer     char           hex[crypto_kdf_BYTES_MAX * 2 + 1];
12*0ac341f1SConrad Meyer     uint64_t       i;
13*0ac341f1SConrad Meyer     int            ret;
14*0ac341f1SConrad Meyer 
15*0ac341f1SConrad Meyer     context = (char *) sodium_malloc(crypto_kdf_CONTEXTBYTES);
16*0ac341f1SConrad Meyer     master_key = (unsigned char *) sodium_malloc(crypto_kdf_KEYBYTES);
17*0ac341f1SConrad Meyer 
18*0ac341f1SConrad Meyer     memcpy(context, "KDF test", strlen("KDF test"));
19*0ac341f1SConrad Meyer     for (i = 0; i < crypto_kdf_KEYBYTES; i++) {
20*0ac341f1SConrad Meyer         master_key[i] = i;
21*0ac341f1SConrad Meyer     }
22*0ac341f1SConrad Meyer     subkey = (unsigned char *) sodium_malloc(crypto_kdf_BYTES_MAX);
23*0ac341f1SConrad Meyer     for (i = 0; i < 10; i++) {
24*0ac341f1SConrad Meyer         ret = crypto_kdf_derive_from_key(subkey, crypto_kdf_BYTES_MAX,
25*0ac341f1SConrad Meyer                                          i, context, master_key);
26*0ac341f1SConrad Meyer         assert(ret == 0);
27*0ac341f1SConrad Meyer         sodium_bin2hex(hex, sizeof hex, subkey, crypto_kdf_BYTES_MAX);
28*0ac341f1SConrad Meyer         printf("%s\n", hex);
29*0ac341f1SConrad Meyer     }
30*0ac341f1SConrad Meyer     sodium_free(subkey);
31*0ac341f1SConrad Meyer 
32*0ac341f1SConrad Meyer     for (i = 0; i < crypto_kdf_BYTES_MAX + 2; i++) {
33*0ac341f1SConrad Meyer         subkey = (unsigned char *) sodium_malloc(crypto_kdf_BYTES_MAX);
34*0ac341f1SConrad Meyer         if (crypto_kdf_derive_from_key(subkey, (size_t) i,
35*0ac341f1SConrad Meyer                                        i, context, master_key) == 0) {
36*0ac341f1SConrad Meyer             sodium_bin2hex(hex, sizeof hex, subkey, (size_t) i);
37*0ac341f1SConrad Meyer             printf("%s\n", hex);
38*0ac341f1SConrad Meyer         } else {
39*0ac341f1SConrad Meyer             printf("Failure -- probably expected for output length=%u\n",
40*0ac341f1SConrad Meyer                    (unsigned int) i);
41*0ac341f1SConrad Meyer         }
42*0ac341f1SConrad Meyer         sodium_free(subkey);
43*0ac341f1SConrad Meyer     }
44*0ac341f1SConrad Meyer 
45*0ac341f1SConrad Meyer     sodium_free(master_key);
46*0ac341f1SConrad Meyer     sodium_free(context);
47*0ac341f1SConrad Meyer 
48*0ac341f1SConrad Meyer     assert(strcmp(crypto_kdf_primitive(), crypto_kdf_PRIMITIVE) == 0);
49*0ac341f1SConrad Meyer     assert(crypto_kdf_BYTES_MAX > 0);
50*0ac341f1SConrad Meyer     assert(crypto_kdf_BYTES_MIN <= crypto_kdf_BYTES_MAX);
51*0ac341f1SConrad Meyer     assert(crypto_kdf_bytes_min() == crypto_kdf_BYTES_MIN);
52*0ac341f1SConrad Meyer     assert(crypto_kdf_bytes_max() == crypto_kdf_BYTES_MAX);
53*0ac341f1SConrad Meyer     assert(crypto_kdf_CONTEXTBYTES > 0);
54*0ac341f1SConrad Meyer     assert(crypto_kdf_contextbytes() == crypto_kdf_CONTEXTBYTES);
55*0ac341f1SConrad Meyer     assert(crypto_kdf_KEYBYTES >= 16);
56*0ac341f1SConrad Meyer     assert(crypto_kdf_keybytes() == crypto_kdf_KEYBYTES);
57*0ac341f1SConrad Meyer     assert(crypto_kdf_bytes_min() == crypto_kdf_blake2b_bytes_min());
58*0ac341f1SConrad Meyer     assert(crypto_kdf_bytes_max() == crypto_kdf_blake2b_bytes_max());
59*0ac341f1SConrad Meyer     assert(crypto_kdf_contextbytes() == crypto_kdf_blake2b_contextbytes());
60*0ac341f1SConrad Meyer     assert(crypto_kdf_keybytes() == crypto_kdf_blake2b_keybytes());
61*0ac341f1SConrad Meyer 
62*0ac341f1SConrad Meyer     printf("tv_kdf: ok\n");
63*0ac341f1SConrad Meyer }
64*0ac341f1SConrad Meyer 
65*0ac341f1SConrad Meyer int
main(void)66*0ac341f1SConrad Meyer main(void)
67*0ac341f1SConrad Meyer {
68*0ac341f1SConrad Meyer     tv_kdf();
69*0ac341f1SConrad Meyer 
70*0ac341f1SConrad Meyer     return 0;
71*0ac341f1SConrad Meyer }
72