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