1*62c56f98SSadaf Ebrahimi/* BEGIN_HEADER */ 2*62c56f98SSadaf Ebrahimi 3*62c56f98SSadaf Ebrahimi/* Test random generation as a whole. */ 4*62c56f98SSadaf Ebrahimi 5*62c56f98SSadaf Ebrahimi#include "mbedtls/bignum.h" 6*62c56f98SSadaf Ebrahimi#include "mbedtls/ctr_drbg.h" 7*62c56f98SSadaf Ebrahimi#include "mbedtls/ecdsa.h" 8*62c56f98SSadaf Ebrahimi#include "mbedtls/entropy.h" 9*62c56f98SSadaf Ebrahimi#include "mbedtls/hmac_drbg.h" 10*62c56f98SSadaf Ebrahimi#include "mbedtls/psa_util.h" 11*62c56f98SSadaf Ebrahimi#include "psa/crypto.h" 12*62c56f98SSadaf Ebrahimi 13*62c56f98SSadaf Ebrahimi/* How many bytes to generate in each test case for repeated generation. 14*62c56f98SSadaf Ebrahimi * This must be high enough that the probability of generating the same 15*62c56f98SSadaf Ebrahimi * output twice is infinitesimal, but low enough that random generators 16*62c56f98SSadaf Ebrahimi * are willing to deliver that much. */ 17*62c56f98SSadaf Ebrahimi#define OUTPUT_SIZE 32 18*62c56f98SSadaf Ebrahimi 19*62c56f98SSadaf Ebrahimi/* END_HEADER */ 20*62c56f98SSadaf Ebrahimi 21*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_ENTROPY_C:!MBEDTLS_PSA_INJECT_ENTROPY:MBEDTLS_CTR_DRBG_C */ 22*62c56f98SSadaf Ebrahimivoid random_twice_with_ctr_drbg() 23*62c56f98SSadaf Ebrahimi{ 24*62c56f98SSadaf Ebrahimi mbedtls_entropy_context entropy; 25*62c56f98SSadaf Ebrahimi mbedtls_ctr_drbg_context drbg; 26*62c56f98SSadaf Ebrahimi unsigned char output1[OUTPUT_SIZE]; 27*62c56f98SSadaf Ebrahimi unsigned char output2[OUTPUT_SIZE]; 28*62c56f98SSadaf Ebrahimi 29*62c56f98SSadaf Ebrahimi MD_PSA_INIT(); 30*62c56f98SSadaf Ebrahimi 31*62c56f98SSadaf Ebrahimi /* First round */ 32*62c56f98SSadaf Ebrahimi mbedtls_entropy_init(&entropy); 33*62c56f98SSadaf Ebrahimi mbedtls_ctr_drbg_init(&drbg); 34*62c56f98SSadaf Ebrahimi TEST_EQUAL(0, mbedtls_ctr_drbg_seed(&drbg, 35*62c56f98SSadaf Ebrahimi mbedtls_entropy_func, &entropy, 36*62c56f98SSadaf Ebrahimi NULL, 0)); 37*62c56f98SSadaf Ebrahimi TEST_EQUAL(0, mbedtls_ctr_drbg_random(&drbg, 38*62c56f98SSadaf Ebrahimi output1, sizeof(output1))); 39*62c56f98SSadaf Ebrahimi mbedtls_ctr_drbg_free(&drbg); 40*62c56f98SSadaf Ebrahimi mbedtls_entropy_free(&entropy); 41*62c56f98SSadaf Ebrahimi 42*62c56f98SSadaf Ebrahimi /* Second round */ 43*62c56f98SSadaf Ebrahimi mbedtls_entropy_init(&entropy); 44*62c56f98SSadaf Ebrahimi mbedtls_ctr_drbg_init(&drbg); 45*62c56f98SSadaf Ebrahimi TEST_EQUAL(0, mbedtls_ctr_drbg_seed(&drbg, 46*62c56f98SSadaf Ebrahimi mbedtls_entropy_func, &entropy, 47*62c56f98SSadaf Ebrahimi NULL, 0)); 48*62c56f98SSadaf Ebrahimi TEST_EQUAL(0, mbedtls_ctr_drbg_random(&drbg, 49*62c56f98SSadaf Ebrahimi output2, sizeof(output2))); 50*62c56f98SSadaf Ebrahimi mbedtls_ctr_drbg_free(&drbg); 51*62c56f98SSadaf Ebrahimi mbedtls_entropy_free(&entropy); 52*62c56f98SSadaf Ebrahimi 53*62c56f98SSadaf Ebrahimi /* The two rounds must generate different random data. */ 54*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(output1, output2, OUTPUT_SIZE) != 0); 55*62c56f98SSadaf Ebrahimi 56*62c56f98SSadaf Ebrahimiexit: 57*62c56f98SSadaf Ebrahimi mbedtls_ctr_drbg_free(&drbg); 58*62c56f98SSadaf Ebrahimi mbedtls_entropy_free(&entropy); 59*62c56f98SSadaf Ebrahimi MD_PSA_DONE(); 60*62c56f98SSadaf Ebrahimi} 61*62c56f98SSadaf Ebrahimi/* END_CASE */ 62*62c56f98SSadaf Ebrahimi 63*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_ENTROPY_C:!MBEDTLS_PSA_INJECT_ENTROPY:MBEDTLS_HMAC_DRBG_C */ 64*62c56f98SSadaf Ebrahimivoid random_twice_with_hmac_drbg(int md_type) 65*62c56f98SSadaf Ebrahimi{ 66*62c56f98SSadaf Ebrahimi mbedtls_entropy_context entropy; 67*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_context drbg; 68*62c56f98SSadaf Ebrahimi unsigned char output1[OUTPUT_SIZE]; 69*62c56f98SSadaf Ebrahimi unsigned char output2[OUTPUT_SIZE]; 70*62c56f98SSadaf Ebrahimi const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type); 71*62c56f98SSadaf Ebrahimi 72*62c56f98SSadaf Ebrahimi MD_PSA_INIT(); 73*62c56f98SSadaf Ebrahimi 74*62c56f98SSadaf Ebrahimi /* First round */ 75*62c56f98SSadaf Ebrahimi mbedtls_entropy_init(&entropy); 76*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_init(&drbg); 77*62c56f98SSadaf Ebrahimi TEST_EQUAL(0, mbedtls_hmac_drbg_seed(&drbg, md_info, 78*62c56f98SSadaf Ebrahimi mbedtls_entropy_func, &entropy, 79*62c56f98SSadaf Ebrahimi NULL, 0)); 80*62c56f98SSadaf Ebrahimi TEST_EQUAL(0, mbedtls_hmac_drbg_random(&drbg, 81*62c56f98SSadaf Ebrahimi output1, sizeof(output1))); 82*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_free(&drbg); 83*62c56f98SSadaf Ebrahimi mbedtls_entropy_free(&entropy); 84*62c56f98SSadaf Ebrahimi 85*62c56f98SSadaf Ebrahimi /* Second round */ 86*62c56f98SSadaf Ebrahimi mbedtls_entropy_init(&entropy); 87*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_init(&drbg); 88*62c56f98SSadaf Ebrahimi TEST_EQUAL(0, mbedtls_hmac_drbg_seed(&drbg, md_info, 89*62c56f98SSadaf Ebrahimi mbedtls_entropy_func, &entropy, 90*62c56f98SSadaf Ebrahimi NULL, 0)); 91*62c56f98SSadaf Ebrahimi TEST_EQUAL(0, mbedtls_hmac_drbg_random(&drbg, 92*62c56f98SSadaf Ebrahimi output2, sizeof(output2))); 93*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_free(&drbg); 94*62c56f98SSadaf Ebrahimi mbedtls_entropy_free(&entropy); 95*62c56f98SSadaf Ebrahimi 96*62c56f98SSadaf Ebrahimi /* The two rounds must generate different random data. */ 97*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(output1, output2, OUTPUT_SIZE) != 0); 98*62c56f98SSadaf Ebrahimi 99*62c56f98SSadaf Ebrahimiexit: 100*62c56f98SSadaf Ebrahimi mbedtls_hmac_drbg_free(&drbg); 101*62c56f98SSadaf Ebrahimi mbedtls_entropy_free(&entropy); 102*62c56f98SSadaf Ebrahimi MD_PSA_DONE(); 103*62c56f98SSadaf Ebrahimi} 104*62c56f98SSadaf Ebrahimi/* END_CASE */ 105*62c56f98SSadaf Ebrahimi 106*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C:!MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ 107*62c56f98SSadaf Ebrahimivoid random_twice_with_psa_from_classic() 108*62c56f98SSadaf Ebrahimi{ 109*62c56f98SSadaf Ebrahimi unsigned char output1[OUTPUT_SIZE]; 110*62c56f98SSadaf Ebrahimi unsigned char output2[OUTPUT_SIZE]; 111*62c56f98SSadaf Ebrahimi 112*62c56f98SSadaf Ebrahimi /* First round */ 113*62c56f98SSadaf Ebrahimi PSA_ASSERT(psa_crypto_init()); 114*62c56f98SSadaf Ebrahimi TEST_EQUAL(0, mbedtls_psa_get_random(MBEDTLS_PSA_RANDOM_STATE, 115*62c56f98SSadaf Ebrahimi output1, sizeof(output1))); 116*62c56f98SSadaf Ebrahimi PSA_DONE(); 117*62c56f98SSadaf Ebrahimi 118*62c56f98SSadaf Ebrahimi /* Second round */ 119*62c56f98SSadaf Ebrahimi PSA_ASSERT(psa_crypto_init()); 120*62c56f98SSadaf Ebrahimi TEST_EQUAL(0, mbedtls_psa_get_random(MBEDTLS_PSA_RANDOM_STATE, 121*62c56f98SSadaf Ebrahimi output2, sizeof(output2))); 122*62c56f98SSadaf Ebrahimi PSA_DONE(); 123*62c56f98SSadaf Ebrahimi 124*62c56f98SSadaf Ebrahimi /* The two rounds must generate different random data. */ 125*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(output1, output2, OUTPUT_SIZE) != 0); 126*62c56f98SSadaf Ebrahimi 127*62c56f98SSadaf Ebrahimiexit: 128*62c56f98SSadaf Ebrahimi PSA_DONE(); 129*62c56f98SSadaf Ebrahimi} 130*62c56f98SSadaf Ebrahimi/* END_CASE */ 131*62c56f98SSadaf Ebrahimi 132*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C:!MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */ 133*62c56f98SSadaf Ebrahimivoid random_twice_with_psa_from_psa() 134*62c56f98SSadaf Ebrahimi{ 135*62c56f98SSadaf Ebrahimi unsigned char output1[OUTPUT_SIZE]; 136*62c56f98SSadaf Ebrahimi unsigned char output2[OUTPUT_SIZE]; 137*62c56f98SSadaf Ebrahimi 138*62c56f98SSadaf Ebrahimi /* First round */ 139*62c56f98SSadaf Ebrahimi PSA_ASSERT(psa_crypto_init()); 140*62c56f98SSadaf Ebrahimi PSA_ASSERT(psa_generate_random(output1, sizeof(output1))); 141*62c56f98SSadaf Ebrahimi PSA_DONE(); 142*62c56f98SSadaf Ebrahimi 143*62c56f98SSadaf Ebrahimi /* Second round */ 144*62c56f98SSadaf Ebrahimi PSA_ASSERT(psa_crypto_init()); 145*62c56f98SSadaf Ebrahimi PSA_ASSERT(psa_generate_random(output2, sizeof(output2))); 146*62c56f98SSadaf Ebrahimi PSA_DONE(); 147*62c56f98SSadaf Ebrahimi 148*62c56f98SSadaf Ebrahimi /* The two rounds must generate different random data. */ 149*62c56f98SSadaf Ebrahimi TEST_ASSERT(memcmp(output1, output2, OUTPUT_SIZE) != 0); 150*62c56f98SSadaf Ebrahimi 151*62c56f98SSadaf Ebrahimiexit: 152*62c56f98SSadaf Ebrahimi PSA_DONE(); 153*62c56f98SSadaf Ebrahimi} 154*62c56f98SSadaf Ebrahimi/* END_CASE */ 155*62c56f98SSadaf Ebrahimi 156*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */ 157*62c56f98SSadaf Ebrahimivoid mbedtls_psa_get_random_no_init() 158*62c56f98SSadaf Ebrahimi{ 159*62c56f98SSadaf Ebrahimi unsigned char output[1]; 160*62c56f98SSadaf Ebrahimi 161*62c56f98SSadaf Ebrahimi TEST_ASSERT(mbedtls_psa_get_random(MBEDTLS_PSA_RANDOM_STATE, 162*62c56f98SSadaf Ebrahimi output, sizeof(output)) != 0); 163*62c56f98SSadaf Ebrahimi} 164*62c56f98SSadaf Ebrahimi/* END_CASE */ 165*62c56f98SSadaf Ebrahimi 166*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */ 167*62c56f98SSadaf Ebrahimivoid mbedtls_psa_get_random_length(int n) 168*62c56f98SSadaf Ebrahimi{ 169*62c56f98SSadaf Ebrahimi unsigned char *output = NULL; 170*62c56f98SSadaf Ebrahimi 171*62c56f98SSadaf Ebrahimi PSA_ASSERT(psa_crypto_init()); 172*62c56f98SSadaf Ebrahimi TEST_CALLOC(output, n); 173*62c56f98SSadaf Ebrahimi 174*62c56f98SSadaf Ebrahimi TEST_EQUAL(0, mbedtls_psa_get_random(MBEDTLS_PSA_RANDOM_STATE, 175*62c56f98SSadaf Ebrahimi output, n)); 176*62c56f98SSadaf Ebrahimiexit: 177*62c56f98SSadaf Ebrahimi mbedtls_free(output); 178*62c56f98SSadaf Ebrahimi PSA_DONE(); 179*62c56f98SSadaf Ebrahimi} 180*62c56f98SSadaf Ebrahimi/* END_CASE */ 181*62c56f98SSadaf Ebrahimi 182*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C:MBEDTLS_ECDSA_C */ 183*62c56f98SSadaf Ebrahimivoid mbedtls_psa_get_random_ecdsa_sign(int curve) 184*62c56f98SSadaf Ebrahimi{ 185*62c56f98SSadaf Ebrahimi mbedtls_ecp_group grp; 186*62c56f98SSadaf Ebrahimi mbedtls_mpi d, r, s; 187*62c56f98SSadaf Ebrahimi unsigned char buf[] = "This is not a hash."; 188*62c56f98SSadaf Ebrahimi 189*62c56f98SSadaf Ebrahimi mbedtls_ecp_group_init(&grp); 190*62c56f98SSadaf Ebrahimi mbedtls_mpi_init(&d); 191*62c56f98SSadaf Ebrahimi mbedtls_mpi_init(&r); 192*62c56f98SSadaf Ebrahimi mbedtls_mpi_init(&s); 193*62c56f98SSadaf Ebrahimi 194*62c56f98SSadaf Ebrahimi TEST_EQUAL(0, mbedtls_mpi_lset(&d, 123456789)); 195*62c56f98SSadaf Ebrahimi TEST_EQUAL(0, mbedtls_ecp_group_load(&grp, curve)); 196*62c56f98SSadaf Ebrahimi PSA_ASSERT(psa_crypto_init()); 197*62c56f98SSadaf Ebrahimi TEST_EQUAL(0, mbedtls_ecdsa_sign(&grp, &r, &s, &d, 198*62c56f98SSadaf Ebrahimi buf, sizeof(buf), 199*62c56f98SSadaf Ebrahimi mbedtls_psa_get_random, 200*62c56f98SSadaf Ebrahimi MBEDTLS_PSA_RANDOM_STATE)); 201*62c56f98SSadaf Ebrahimiexit: 202*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&d); 203*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&r); 204*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&s); 205*62c56f98SSadaf Ebrahimi mbedtls_ecp_group_free(&grp); 206*62c56f98SSadaf Ebrahimi PSA_DONE(); 207*62c56f98SSadaf Ebrahimi} 208*62c56f98SSadaf Ebrahimi/* END_CASE */ 209