quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

kdf.c (2367B)


      1 
      2 #define TEST_NAME "kdf"
      3 #include "cmptest.h"
      4 
      5 static 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", sizeof "KDF test" - 1U);
     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
     66 main(void)
     67 {
     68     tv_kdf();
     69 
     70     return 0;
     71 }