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