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 }