1*0ac341f1SConrad Meyer 2*0ac341f1SConrad Meyer #define TEST_NAME "keygen" 3*0ac341f1SConrad Meyer #include "cmptest.h" 4*0ac341f1SConrad Meyer 5*0ac341f1SConrad Meyer typedef struct KeygenTV_ { 6*0ac341f1SConrad Meyer void (*fn)(unsigned char *k); 7*0ac341f1SConrad Meyer size_t key_len; 8*0ac341f1SConrad Meyer } KeygenTV; 9*0ac341f1SConrad Meyer 10*0ac341f1SConrad Meyer static void 11*0ac341f1SConrad Meyer tv_keygen(void) 12*0ac341f1SConrad Meyer { 13*0ac341f1SConrad Meyer static const KeygenTV tvs[] = { 14*0ac341f1SConrad Meyer { crypto_auth_keygen, crypto_auth_KEYBYTES }, 15*0ac341f1SConrad Meyer { crypto_auth_hmacsha256_keygen, crypto_auth_hmacsha256_KEYBYTES }, 16*0ac341f1SConrad Meyer { crypto_aead_aes256gcm_keygen, crypto_aead_aes256gcm_KEYBYTES }, 17*0ac341f1SConrad Meyer { crypto_auth_hmacsha512_keygen, crypto_auth_hmacsha512_KEYBYTES }, 18*0ac341f1SConrad Meyer { crypto_auth_hmacsha512256_keygen, crypto_auth_hmacsha512256_KEYBYTES }, 19*0ac341f1SConrad Meyer { crypto_generichash_keygen, crypto_generichash_KEYBYTES }, 20*0ac341f1SConrad Meyer { crypto_generichash_blake2b_keygen, crypto_generichash_blake2b_KEYBYTES }, 21*0ac341f1SConrad Meyer { crypto_kdf_keygen, crypto_kdf_KEYBYTES }, 22*0ac341f1SConrad Meyer { crypto_onetimeauth_keygen, crypto_onetimeauth_KEYBYTES }, 23*0ac341f1SConrad Meyer { crypto_onetimeauth_poly1305_keygen, crypto_onetimeauth_poly1305_KEYBYTES }, 24*0ac341f1SConrad Meyer { crypto_aead_chacha20poly1305_ietf_keygen, crypto_aead_chacha20poly1305_ietf_KEYBYTES }, 25*0ac341f1SConrad Meyer { crypto_aead_chacha20poly1305_keygen, crypto_aead_chacha20poly1305_KEYBYTES }, 26*0ac341f1SConrad Meyer { crypto_aead_chacha20poly1305_ietf_keygen, crypto_aead_chacha20poly1305_ietf_KEYBYTES }, 27*0ac341f1SConrad Meyer { crypto_aead_xchacha20poly1305_ietf_keygen, crypto_aead_xchacha20poly1305_ietf_KEYBYTES }, 28*0ac341f1SConrad Meyer { crypto_secretbox_xsalsa20poly1305_keygen, crypto_secretbox_xsalsa20poly1305_KEYBYTES }, 29*0ac341f1SConrad Meyer { crypto_secretbox_keygen, crypto_secretbox_KEYBYTES }, 30*0ac341f1SConrad Meyer { crypto_secretstream_xchacha20poly1305_keygen, crypto_secretstream_xchacha20poly1305_KEYBYTES }, 31*0ac341f1SConrad Meyer { crypto_shorthash_keygen, crypto_shorthash_KEYBYTES }, 32*0ac341f1SConrad Meyer { crypto_stream_keygen, crypto_stream_KEYBYTES }, 33*0ac341f1SConrad Meyer { crypto_stream_chacha20_keygen, crypto_stream_chacha20_KEYBYTES }, 34*0ac341f1SConrad Meyer { crypto_stream_chacha20_ietf_keygen, crypto_stream_chacha20_ietf_KEYBYTES }, 35*0ac341f1SConrad Meyer { crypto_stream_salsa20_keygen, crypto_stream_salsa20_KEYBYTES }, 36*0ac341f1SConrad Meyer { crypto_stream_xsalsa20_keygen, crypto_stream_xsalsa20_KEYBYTES } 37*0ac341f1SConrad Meyer }; 38*0ac341f1SConrad Meyer const KeygenTV *tv; 39*0ac341f1SConrad Meyer unsigned char *key; 40*0ac341f1SConrad Meyer size_t i; 41*0ac341f1SConrad Meyer int j; 42*0ac341f1SConrad Meyer 43*0ac341f1SConrad Meyer for (i = 0; i < (sizeof tvs) / (sizeof tvs[0]); i++) { 44*0ac341f1SConrad Meyer tv = &tvs[i]; 45*0ac341f1SConrad Meyer key = (unsigned char *) sodium_malloc(tv->key_len); 46*0ac341f1SConrad Meyer key[tv->key_len - 1U] = 0; 47*0ac341f1SConrad Meyer for (j = 0; j < 10000; j++) { 48*0ac341f1SConrad Meyer tv->fn(key); 49*0ac341f1SConrad Meyer if (key[tv->key_len - 1U] != 0) { 50*0ac341f1SConrad Meyer break; 51*0ac341f1SConrad Meyer } 52*0ac341f1SConrad Meyer } 53*0ac341f1SConrad Meyer sodium_free(key); 54*0ac341f1SConrad Meyer if (j >= 10000) { 55*0ac341f1SConrad Meyer printf("Buffer underflow with test vector %u\n", (unsigned int) i); 56*0ac341f1SConrad Meyer } 57*0ac341f1SConrad Meyer } 58*0ac341f1SConrad Meyer printf("tv_keygen: ok\n"); 59*0ac341f1SConrad Meyer } 60*0ac341f1SConrad Meyer 61*0ac341f1SConrad Meyer int 62*0ac341f1SConrad Meyer main(void) 63*0ac341f1SConrad Meyer { 64*0ac341f1SConrad Meyer tv_keygen(); 65*0ac341f1SConrad Meyer 66*0ac341f1SConrad Meyer return 0; 67*0ac341f1SConrad Meyer } 68