quickjs-tart

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

kdf_hkdf.c (3544B)


      1 
      2 #define TEST_NAME "kdf_hkdf"
      3 #include "cmptest.h"
      4 
      5 static void
      6 tv_kdf_hkdf(void)
      7 {
      8     unsigned char *master_key;
      9     size_t         master_key_len = 66;
     10     unsigned char *prk256;
     11     size_t         prk256_len = crypto_kdf_hkdf_sha256_KEYBYTES;
     12     unsigned char *prk512;
     13     size_t         prk512_len = crypto_kdf_hkdf_sha512_KEYBYTES;
     14     unsigned char *salt;
     15     size_t         salt_len = 77;
     16     char          *context;
     17     size_t         context_len = 88;
     18     unsigned char *out;
     19     size_t         out_len = 99;
     20     char           hex[99 * 2 + 1];
     21     size_t         i;
     22     int            ret;
     23 
     24     master_key = (unsigned char *) sodium_malloc(master_key_len);
     25     prk256 = (unsigned char *) sodium_malloc(prk256_len);
     26     prk512 = (unsigned char *) sodium_malloc(prk512_len);
     27     salt = (unsigned char *) sodium_malloc(salt_len);
     28     context = (char *) sodium_malloc(context_len);
     29     out = (unsigned char *) sodium_malloc(out_len);
     30     for (i = 0; i < master_key_len; i++) {
     31         master_key[i] = i;
     32     }
     33     for (i = 0; i < salt_len; i++) {
     34         salt[i] = (unsigned char) ~i;
     35     }
     36     for (i = 0; i < context_len; i++) {
     37         context[i] = (unsigned char) (i + 111);
     38     }
     39 
     40     printf("\nHKDF/SHA-256:\n");
     41     crypto_kdf_hkdf_sha256_keygen(prk256);
     42     if (crypto_kdf_hkdf_sha256_extract(prk256, salt, salt_len,
     43                                        master_key, master_key_len) != 0) {
     44         printf("hkdf_sha256_extract() failed\n");
     45     }
     46     printf("PRK: %s\n", sodium_bin2hex(hex, sizeof hex, prk256, prk256_len));
     47 
     48     for (i = 0; i < out_len; i++) {
     49         context[0] = i;
     50         if (crypto_kdf_hkdf_sha256_expand(out, i,
     51                                           context, context_len, prk256) != 0) {
     52             printf("hkdf_sha256_expand() failed\n");
     53         }
     54         printf("%s\n", sodium_bin2hex(hex, sizeof hex, out, i));
     55     }
     56 
     57     printf("\nHKDF/SHA-512:\n");
     58     crypto_kdf_hkdf_sha256_keygen(prk512);
     59     if (crypto_kdf_hkdf_sha512_extract(prk512, salt, salt_len,
     60                                        master_key, master_key_len) != 0) {
     61         printf("hkdf_sha512_extract() failed\n");
     62     }
     63     printf("PRK: %s\n", sodium_bin2hex(hex, sizeof hex, prk512, prk512_len));
     64 
     65     for (i = 0; i < out_len; i++) {
     66         context[0] = i;
     67         if (crypto_kdf_hkdf_sha512_expand(out, i,
     68                                           context, context_len, prk512) != 0) {
     69             printf("hkdf_sha512_expand() failed\n");
     70         }
     71         printf("%s\n", sodium_bin2hex(hex, sizeof hex, out, i));
     72     }
     73 
     74     sodium_free(out);
     75     sodium_free(context);
     76     sodium_free(salt);
     77     sodium_free(master_key);
     78     sodium_free(prk512);
     79     sodium_free(prk256);
     80 
     81     assert(crypto_kdf_hkdf_sha512_bytes_min() == crypto_kdf_hkdf_sha512_BYTES_MIN);
     82     assert(crypto_kdf_hkdf_sha512_bytes_max() == crypto_kdf_hkdf_sha512_BYTES_MAX);
     83     assert(crypto_kdf_hkdf_sha512_keybytes() == crypto_kdf_hkdf_sha512_KEYBYTES);
     84     assert(crypto_kdf_hkdf_sha512_statebytes() >= sizeof (crypto_kdf_hkdf_sha512_state));
     85 
     86     assert(crypto_kdf_hkdf_sha256_bytes_min() == crypto_kdf_hkdf_sha256_BYTES_MIN);
     87     assert(crypto_kdf_hkdf_sha256_bytes_max() == crypto_kdf_hkdf_sha256_BYTES_MAX);
     88     assert(crypto_kdf_hkdf_sha256_keybytes() == crypto_kdf_hkdf_sha256_KEYBYTES);
     89     assert(crypto_kdf_hkdf_sha256_statebytes() >= sizeof (crypto_kdf_hkdf_sha256_state));
     90 
     91     assert(crypto_kdf_hkdf_sha256_KEYBYTES < crypto_kdf_hkdf_sha512_KEYBYTES);
     92 
     93     printf("tv_kdf_hkdf: ok\n");
     94 }
     95 
     96 int
     97 main(void)
     98 {
     99     tv_kdf_hkdf();
    100 
    101     return 0;
    102 }