1*e71b7053SJung-uk Kim /* 2*e71b7053SJung-uk Kim * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. 3*e71b7053SJung-uk Kim * 4*e71b7053SJung-uk Kim * Licensed under the OpenSSL license (the "License"). You may not use 5*e71b7053SJung-uk Kim * this file except in compliance with the License. You can obtain a copy 6*e71b7053SJung-uk Kim * in the file LICENSE in the source distribution or at 7*e71b7053SJung-uk Kim * https://www.openssl.org/source/license.html 8*e71b7053SJung-uk Kim */ 9*e71b7053SJung-uk Kim 10*e71b7053SJung-uk Kim /* 11*e71b7053SJung-uk Kim * This is the OSSLTEST engine. It provides deliberately crippled digest 12*e71b7053SJung-uk Kim * implementations for test purposes. It is highly insecure and must NOT be 13*e71b7053SJung-uk Kim * used for any purpose except testing 14*e71b7053SJung-uk Kim */ 15*e71b7053SJung-uk Kim 16*e71b7053SJung-uk Kim #include <stdio.h> 17*e71b7053SJung-uk Kim #include <string.h> 18*e71b7053SJung-uk Kim 19*e71b7053SJung-uk Kim #include <openssl/engine.h> 20*e71b7053SJung-uk Kim #include <openssl/sha.h> 21*e71b7053SJung-uk Kim #include <openssl/md5.h> 22*e71b7053SJung-uk Kim #include <openssl/rsa.h> 23*e71b7053SJung-uk Kim #include <openssl/evp.h> 24*e71b7053SJung-uk Kim #include <openssl/modes.h> 25*e71b7053SJung-uk Kim #include <openssl/aes.h> 26*e71b7053SJung-uk Kim #include <openssl/rand.h> 27*e71b7053SJung-uk Kim #include <openssl/crypto.h> 28*e71b7053SJung-uk Kim 29*e71b7053SJung-uk Kim #include "e_ossltest_err.c" 30*e71b7053SJung-uk Kim 31*e71b7053SJung-uk Kim /* Engine Id and Name */ 32*e71b7053SJung-uk Kim static const char *engine_ossltest_id = "ossltest"; 33*e71b7053SJung-uk Kim static const char *engine_ossltest_name = "OpenSSL Test engine support"; 34*e71b7053SJung-uk Kim 35*e71b7053SJung-uk Kim 36*e71b7053SJung-uk Kim /* Engine Lifetime functions */ 37*e71b7053SJung-uk Kim static int ossltest_destroy(ENGINE *e); 38*e71b7053SJung-uk Kim static int ossltest_init(ENGINE *e); 39*e71b7053SJung-uk Kim static int ossltest_finish(ENGINE *e); 40*e71b7053SJung-uk Kim void ENGINE_load_ossltest(void); 41*e71b7053SJung-uk Kim 42*e71b7053SJung-uk Kim 43*e71b7053SJung-uk Kim /* Set up digests */ 44*e71b7053SJung-uk Kim static int ossltest_digests(ENGINE *e, const EVP_MD **digest, 45*e71b7053SJung-uk Kim const int **nids, int nid); 46*e71b7053SJung-uk Kim static const RAND_METHOD *ossltest_rand_method(void); 47*e71b7053SJung-uk Kim 48*e71b7053SJung-uk Kim /* MD5 */ 49*e71b7053SJung-uk Kim static int digest_md5_init(EVP_MD_CTX *ctx); 50*e71b7053SJung-uk Kim static int digest_md5_update(EVP_MD_CTX *ctx, const void *data, 51*e71b7053SJung-uk Kim size_t count); 52*e71b7053SJung-uk Kim static int digest_md5_final(EVP_MD_CTX *ctx, unsigned char *md); 53*e71b7053SJung-uk Kim 54*e71b7053SJung-uk Kim static EVP_MD *_hidden_md5_md = NULL; 55*e71b7053SJung-uk Kim static const EVP_MD *digest_md5(void) 56*e71b7053SJung-uk Kim { 57*e71b7053SJung-uk Kim if (_hidden_md5_md == NULL) { 58*e71b7053SJung-uk Kim EVP_MD *md; 59*e71b7053SJung-uk Kim 60*e71b7053SJung-uk Kim if ((md = EVP_MD_meth_new(NID_md5, NID_md5WithRSAEncryption)) == NULL 61*e71b7053SJung-uk Kim || !EVP_MD_meth_set_result_size(md, MD5_DIGEST_LENGTH) 62*e71b7053SJung-uk Kim || !EVP_MD_meth_set_input_blocksize(md, MD5_CBLOCK) 63*e71b7053SJung-uk Kim || !EVP_MD_meth_set_app_datasize(md, 64*e71b7053SJung-uk Kim sizeof(EVP_MD *) + sizeof(MD5_CTX)) 65*e71b7053SJung-uk Kim || !EVP_MD_meth_set_flags(md, 0) 66*e71b7053SJung-uk Kim || !EVP_MD_meth_set_init(md, digest_md5_init) 67*e71b7053SJung-uk Kim || !EVP_MD_meth_set_update(md, digest_md5_update) 68*e71b7053SJung-uk Kim || !EVP_MD_meth_set_final(md, digest_md5_final)) { 69*e71b7053SJung-uk Kim EVP_MD_meth_free(md); 70*e71b7053SJung-uk Kim md = NULL; 71*e71b7053SJung-uk Kim } 72*e71b7053SJung-uk Kim _hidden_md5_md = md; 73*e71b7053SJung-uk Kim } 74*e71b7053SJung-uk Kim return _hidden_md5_md; 75*e71b7053SJung-uk Kim } 76*e71b7053SJung-uk Kim 77*e71b7053SJung-uk Kim /* SHA1 */ 78*e71b7053SJung-uk Kim static int digest_sha1_init(EVP_MD_CTX *ctx); 79*e71b7053SJung-uk Kim static int digest_sha1_update(EVP_MD_CTX *ctx, const void *data, 80*e71b7053SJung-uk Kim size_t count); 81*e71b7053SJung-uk Kim static int digest_sha1_final(EVP_MD_CTX *ctx, unsigned char *md); 82*e71b7053SJung-uk Kim 83*e71b7053SJung-uk Kim static EVP_MD *_hidden_sha1_md = NULL; 84*e71b7053SJung-uk Kim static const EVP_MD *digest_sha1(void) 85*e71b7053SJung-uk Kim { 86*e71b7053SJung-uk Kim if (_hidden_sha1_md == NULL) { 87*e71b7053SJung-uk Kim EVP_MD *md; 88*e71b7053SJung-uk Kim 89*e71b7053SJung-uk Kim if ((md = EVP_MD_meth_new(NID_sha1, NID_sha1WithRSAEncryption)) == NULL 90*e71b7053SJung-uk Kim || !EVP_MD_meth_set_result_size(md, SHA_DIGEST_LENGTH) 91*e71b7053SJung-uk Kim || !EVP_MD_meth_set_input_blocksize(md, SHA_CBLOCK) 92*e71b7053SJung-uk Kim || !EVP_MD_meth_set_app_datasize(md, 93*e71b7053SJung-uk Kim sizeof(EVP_MD *) + sizeof(SHA_CTX)) 94*e71b7053SJung-uk Kim || !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_DIGALGID_ABSENT) 95*e71b7053SJung-uk Kim || !EVP_MD_meth_set_init(md, digest_sha1_init) 96*e71b7053SJung-uk Kim || !EVP_MD_meth_set_update(md, digest_sha1_update) 97*e71b7053SJung-uk Kim || !EVP_MD_meth_set_final(md, digest_sha1_final)) { 98*e71b7053SJung-uk Kim EVP_MD_meth_free(md); 99*e71b7053SJung-uk Kim md = NULL; 100*e71b7053SJung-uk Kim } 101*e71b7053SJung-uk Kim _hidden_sha1_md = md; 102*e71b7053SJung-uk Kim } 103*e71b7053SJung-uk Kim return _hidden_sha1_md; 104*e71b7053SJung-uk Kim } 105*e71b7053SJung-uk Kim 106*e71b7053SJung-uk Kim /* SHA256 */ 107*e71b7053SJung-uk Kim static int digest_sha256_init(EVP_MD_CTX *ctx); 108*e71b7053SJung-uk Kim static int digest_sha256_update(EVP_MD_CTX *ctx, const void *data, 109*e71b7053SJung-uk Kim size_t count); 110*e71b7053SJung-uk Kim static int digest_sha256_final(EVP_MD_CTX *ctx, unsigned char *md); 111*e71b7053SJung-uk Kim 112*e71b7053SJung-uk Kim static EVP_MD *_hidden_sha256_md = NULL; 113*e71b7053SJung-uk Kim static const EVP_MD *digest_sha256(void) 114*e71b7053SJung-uk Kim { 115*e71b7053SJung-uk Kim if (_hidden_sha256_md == NULL) { 116*e71b7053SJung-uk Kim EVP_MD *md; 117*e71b7053SJung-uk Kim 118*e71b7053SJung-uk Kim if ((md = EVP_MD_meth_new(NID_sha256, NID_sha256WithRSAEncryption)) == NULL 119*e71b7053SJung-uk Kim || !EVP_MD_meth_set_result_size(md, SHA256_DIGEST_LENGTH) 120*e71b7053SJung-uk Kim || !EVP_MD_meth_set_input_blocksize(md, SHA256_CBLOCK) 121*e71b7053SJung-uk Kim || !EVP_MD_meth_set_app_datasize(md, 122*e71b7053SJung-uk Kim sizeof(EVP_MD *) + sizeof(SHA256_CTX)) 123*e71b7053SJung-uk Kim || !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_DIGALGID_ABSENT) 124*e71b7053SJung-uk Kim || !EVP_MD_meth_set_init(md, digest_sha256_init) 125*e71b7053SJung-uk Kim || !EVP_MD_meth_set_update(md, digest_sha256_update) 126*e71b7053SJung-uk Kim || !EVP_MD_meth_set_final(md, digest_sha256_final)) { 127*e71b7053SJung-uk Kim EVP_MD_meth_free(md); 128*e71b7053SJung-uk Kim md = NULL; 129*e71b7053SJung-uk Kim } 130*e71b7053SJung-uk Kim _hidden_sha256_md = md; 131*e71b7053SJung-uk Kim } 132*e71b7053SJung-uk Kim return _hidden_sha256_md; 133*e71b7053SJung-uk Kim } 134*e71b7053SJung-uk Kim 135*e71b7053SJung-uk Kim /* SHA384/SHA512 */ 136*e71b7053SJung-uk Kim static int digest_sha384_init(EVP_MD_CTX *ctx); 137*e71b7053SJung-uk Kim static int digest_sha512_init(EVP_MD_CTX *ctx); 138*e71b7053SJung-uk Kim static int digest_sha512_update(EVP_MD_CTX *ctx, const void *data, 139*e71b7053SJung-uk Kim size_t count); 140*e71b7053SJung-uk Kim static int digest_sha384_final(EVP_MD_CTX *ctx, unsigned char *md); 141*e71b7053SJung-uk Kim static int digest_sha512_final(EVP_MD_CTX *ctx, unsigned char *md); 142*e71b7053SJung-uk Kim 143*e71b7053SJung-uk Kim static EVP_MD *_hidden_sha384_md = NULL; 144*e71b7053SJung-uk Kim static const EVP_MD *digest_sha384(void) 145*e71b7053SJung-uk Kim { 146*e71b7053SJung-uk Kim if (_hidden_sha384_md == NULL) { 147*e71b7053SJung-uk Kim EVP_MD *md; 148*e71b7053SJung-uk Kim 149*e71b7053SJung-uk Kim if ((md = EVP_MD_meth_new(NID_sha384, NID_sha384WithRSAEncryption)) == NULL 150*e71b7053SJung-uk Kim || !EVP_MD_meth_set_result_size(md, SHA384_DIGEST_LENGTH) 151*e71b7053SJung-uk Kim || !EVP_MD_meth_set_input_blocksize(md, SHA512_CBLOCK) 152*e71b7053SJung-uk Kim || !EVP_MD_meth_set_app_datasize(md, 153*e71b7053SJung-uk Kim sizeof(EVP_MD *) + sizeof(SHA512_CTX)) 154*e71b7053SJung-uk Kim || !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_DIGALGID_ABSENT) 155*e71b7053SJung-uk Kim || !EVP_MD_meth_set_init(md, digest_sha384_init) 156*e71b7053SJung-uk Kim || !EVP_MD_meth_set_update(md, digest_sha512_update) 157*e71b7053SJung-uk Kim || !EVP_MD_meth_set_final(md, digest_sha384_final)) { 158*e71b7053SJung-uk Kim EVP_MD_meth_free(md); 159*e71b7053SJung-uk Kim md = NULL; 160*e71b7053SJung-uk Kim } 161*e71b7053SJung-uk Kim _hidden_sha384_md = md; 162*e71b7053SJung-uk Kim } 163*e71b7053SJung-uk Kim return _hidden_sha384_md; 164*e71b7053SJung-uk Kim } 165*e71b7053SJung-uk Kim static EVP_MD *_hidden_sha512_md = NULL; 166*e71b7053SJung-uk Kim static const EVP_MD *digest_sha512(void) 167*e71b7053SJung-uk Kim { 168*e71b7053SJung-uk Kim if (_hidden_sha512_md == NULL) { 169*e71b7053SJung-uk Kim EVP_MD *md; 170*e71b7053SJung-uk Kim 171*e71b7053SJung-uk Kim if ((md = EVP_MD_meth_new(NID_sha512, NID_sha512WithRSAEncryption)) == NULL 172*e71b7053SJung-uk Kim || !EVP_MD_meth_set_result_size(md, SHA512_DIGEST_LENGTH) 173*e71b7053SJung-uk Kim || !EVP_MD_meth_set_input_blocksize(md, SHA512_CBLOCK) 174*e71b7053SJung-uk Kim || !EVP_MD_meth_set_app_datasize(md, 175*e71b7053SJung-uk Kim sizeof(EVP_MD *) + sizeof(SHA512_CTX)) 176*e71b7053SJung-uk Kim || !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_DIGALGID_ABSENT) 177*e71b7053SJung-uk Kim || !EVP_MD_meth_set_init(md, digest_sha512_init) 178*e71b7053SJung-uk Kim || !EVP_MD_meth_set_update(md, digest_sha512_update) 179*e71b7053SJung-uk Kim || !EVP_MD_meth_set_final(md, digest_sha512_final)) { 180*e71b7053SJung-uk Kim EVP_MD_meth_free(md); 181*e71b7053SJung-uk Kim md = NULL; 182*e71b7053SJung-uk Kim } 183*e71b7053SJung-uk Kim _hidden_sha512_md = md; 184*e71b7053SJung-uk Kim } 185*e71b7053SJung-uk Kim return _hidden_sha512_md; 186*e71b7053SJung-uk Kim } 187*e71b7053SJung-uk Kim static void destroy_digests(void) 188*e71b7053SJung-uk Kim { 189*e71b7053SJung-uk Kim EVP_MD_meth_free(_hidden_md5_md); 190*e71b7053SJung-uk Kim _hidden_md5_md = NULL; 191*e71b7053SJung-uk Kim EVP_MD_meth_free(_hidden_sha1_md); 192*e71b7053SJung-uk Kim _hidden_sha1_md = NULL; 193*e71b7053SJung-uk Kim EVP_MD_meth_free(_hidden_sha256_md); 194*e71b7053SJung-uk Kim _hidden_sha256_md = NULL; 195*e71b7053SJung-uk Kim EVP_MD_meth_free(_hidden_sha384_md); 196*e71b7053SJung-uk Kim _hidden_sha384_md = NULL; 197*e71b7053SJung-uk Kim EVP_MD_meth_free(_hidden_sha512_md); 198*e71b7053SJung-uk Kim _hidden_sha512_md = NULL; 199*e71b7053SJung-uk Kim } 200*e71b7053SJung-uk Kim static int ossltest_digest_nids(const int **nids) 201*e71b7053SJung-uk Kim { 202*e71b7053SJung-uk Kim static int digest_nids[6] = { 0, 0, 0, 0, 0, 0 }; 203*e71b7053SJung-uk Kim static int pos = 0; 204*e71b7053SJung-uk Kim static int init = 0; 205*e71b7053SJung-uk Kim 206*e71b7053SJung-uk Kim if (!init) { 207*e71b7053SJung-uk Kim const EVP_MD *md; 208*e71b7053SJung-uk Kim if ((md = digest_md5()) != NULL) 209*e71b7053SJung-uk Kim digest_nids[pos++] = EVP_MD_type(md); 210*e71b7053SJung-uk Kim if ((md = digest_sha1()) != NULL) 211*e71b7053SJung-uk Kim digest_nids[pos++] = EVP_MD_type(md); 212*e71b7053SJung-uk Kim if ((md = digest_sha256()) != NULL) 213*e71b7053SJung-uk Kim digest_nids[pos++] = EVP_MD_type(md); 214*e71b7053SJung-uk Kim if ((md = digest_sha384()) != NULL) 215*e71b7053SJung-uk Kim digest_nids[pos++] = EVP_MD_type(md); 216*e71b7053SJung-uk Kim if ((md = digest_sha512()) != NULL) 217*e71b7053SJung-uk Kim digest_nids[pos++] = EVP_MD_type(md); 218*e71b7053SJung-uk Kim digest_nids[pos] = 0; 219*e71b7053SJung-uk Kim init = 1; 220*e71b7053SJung-uk Kim } 221*e71b7053SJung-uk Kim *nids = digest_nids; 222*e71b7053SJung-uk Kim return pos; 223*e71b7053SJung-uk Kim } 224*e71b7053SJung-uk Kim 225*e71b7053SJung-uk Kim /* Setup ciphers */ 226*e71b7053SJung-uk Kim static int ossltest_ciphers(ENGINE *, const EVP_CIPHER **, 227*e71b7053SJung-uk Kim const int **, int); 228*e71b7053SJung-uk Kim 229*e71b7053SJung-uk Kim static int ossltest_cipher_nids[] = { 230*e71b7053SJung-uk Kim NID_aes_128_cbc, NID_aes_128_gcm, 0 231*e71b7053SJung-uk Kim }; 232*e71b7053SJung-uk Kim 233*e71b7053SJung-uk Kim /* AES128 */ 234*e71b7053SJung-uk Kim 235*e71b7053SJung-uk Kim int ossltest_aes128_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 236*e71b7053SJung-uk Kim const unsigned char *iv, int enc); 237*e71b7053SJung-uk Kim int ossltest_aes128_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 238*e71b7053SJung-uk Kim const unsigned char *in, size_t inl); 239*e71b7053SJung-uk Kim int ossltest_aes128_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 240*e71b7053SJung-uk Kim const unsigned char *iv, int enc); 241*e71b7053SJung-uk Kim int ossltest_aes128_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 242*e71b7053SJung-uk Kim const unsigned char *in, size_t inl); 243*e71b7053SJung-uk Kim static int ossltest_aes128_gcm_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, 244*e71b7053SJung-uk Kim void *ptr); 245*e71b7053SJung-uk Kim 246*e71b7053SJung-uk Kim static EVP_CIPHER *_hidden_aes_128_cbc = NULL; 247*e71b7053SJung-uk Kim static const EVP_CIPHER *ossltest_aes_128_cbc(void) 248*e71b7053SJung-uk Kim { 249*e71b7053SJung-uk Kim if (_hidden_aes_128_cbc == NULL 250*e71b7053SJung-uk Kim && ((_hidden_aes_128_cbc = EVP_CIPHER_meth_new(NID_aes_128_cbc, 251*e71b7053SJung-uk Kim 16 /* block size */, 252*e71b7053SJung-uk Kim 16 /* key len */)) == NULL 253*e71b7053SJung-uk Kim || !EVP_CIPHER_meth_set_iv_length(_hidden_aes_128_cbc,16) 254*e71b7053SJung-uk Kim || !EVP_CIPHER_meth_set_flags(_hidden_aes_128_cbc, 255*e71b7053SJung-uk Kim EVP_CIPH_FLAG_DEFAULT_ASN1 256*e71b7053SJung-uk Kim | EVP_CIPH_CBC_MODE) 257*e71b7053SJung-uk Kim || !EVP_CIPHER_meth_set_init(_hidden_aes_128_cbc, 258*e71b7053SJung-uk Kim ossltest_aes128_init_key) 259*e71b7053SJung-uk Kim || !EVP_CIPHER_meth_set_do_cipher(_hidden_aes_128_cbc, 260*e71b7053SJung-uk Kim ossltest_aes128_cbc_cipher) 261*e71b7053SJung-uk Kim || !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_aes_128_cbc, 262*e71b7053SJung-uk Kim EVP_CIPHER_impl_ctx_size(EVP_aes_128_cbc())))) { 263*e71b7053SJung-uk Kim EVP_CIPHER_meth_free(_hidden_aes_128_cbc); 264*e71b7053SJung-uk Kim _hidden_aes_128_cbc = NULL; 265*e71b7053SJung-uk Kim } 266*e71b7053SJung-uk Kim return _hidden_aes_128_cbc; 267*e71b7053SJung-uk Kim } 268*e71b7053SJung-uk Kim static EVP_CIPHER *_hidden_aes_128_gcm = NULL; 269*e71b7053SJung-uk Kim 270*e71b7053SJung-uk Kim #define AES_GCM_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 \ 271*e71b7053SJung-uk Kim | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \ 272*e71b7053SJung-uk Kim | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT \ 273*e71b7053SJung-uk Kim | EVP_CIPH_CUSTOM_COPY |EVP_CIPH_FLAG_AEAD_CIPHER \ 274*e71b7053SJung-uk Kim | EVP_CIPH_GCM_MODE) 275*e71b7053SJung-uk Kim 276*e71b7053SJung-uk Kim static const EVP_CIPHER *ossltest_aes_128_gcm(void) 277*e71b7053SJung-uk Kim { 278*e71b7053SJung-uk Kim if (_hidden_aes_128_gcm == NULL 279*e71b7053SJung-uk Kim && ((_hidden_aes_128_gcm = EVP_CIPHER_meth_new(NID_aes_128_gcm, 280*e71b7053SJung-uk Kim 1 /* block size */, 281*e71b7053SJung-uk Kim 16 /* key len */)) == NULL 282*e71b7053SJung-uk Kim || !EVP_CIPHER_meth_set_iv_length(_hidden_aes_128_gcm,12) 283*e71b7053SJung-uk Kim || !EVP_CIPHER_meth_set_flags(_hidden_aes_128_gcm, AES_GCM_FLAGS) 284*e71b7053SJung-uk Kim || !EVP_CIPHER_meth_set_init(_hidden_aes_128_gcm, 285*e71b7053SJung-uk Kim ossltest_aes128_gcm_init_key) 286*e71b7053SJung-uk Kim || !EVP_CIPHER_meth_set_do_cipher(_hidden_aes_128_gcm, 287*e71b7053SJung-uk Kim ossltest_aes128_gcm_cipher) 288*e71b7053SJung-uk Kim || !EVP_CIPHER_meth_set_ctrl(_hidden_aes_128_gcm, 289*e71b7053SJung-uk Kim ossltest_aes128_gcm_ctrl) 290*e71b7053SJung-uk Kim || !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_aes_128_gcm, 291*e71b7053SJung-uk Kim EVP_CIPHER_impl_ctx_size(EVP_aes_128_gcm())))) { 292*e71b7053SJung-uk Kim EVP_CIPHER_meth_free(_hidden_aes_128_gcm); 293*e71b7053SJung-uk Kim _hidden_aes_128_gcm = NULL; 294*e71b7053SJung-uk Kim } 295*e71b7053SJung-uk Kim return _hidden_aes_128_gcm; 296*e71b7053SJung-uk Kim } 297*e71b7053SJung-uk Kim 298*e71b7053SJung-uk Kim static void destroy_ciphers(void) 299*e71b7053SJung-uk Kim { 300*e71b7053SJung-uk Kim EVP_CIPHER_meth_free(_hidden_aes_128_cbc); 301*e71b7053SJung-uk Kim EVP_CIPHER_meth_free(_hidden_aes_128_gcm); 302*e71b7053SJung-uk Kim _hidden_aes_128_cbc = NULL; 303*e71b7053SJung-uk Kim } 304*e71b7053SJung-uk Kim 305*e71b7053SJung-uk Kim static int bind_ossltest(ENGINE *e) 306*e71b7053SJung-uk Kim { 307*e71b7053SJung-uk Kim /* Ensure the ossltest error handling is set up */ 308*e71b7053SJung-uk Kim ERR_load_OSSLTEST_strings(); 309*e71b7053SJung-uk Kim 310*e71b7053SJung-uk Kim if (!ENGINE_set_id(e, engine_ossltest_id) 311*e71b7053SJung-uk Kim || !ENGINE_set_name(e, engine_ossltest_name) 312*e71b7053SJung-uk Kim || !ENGINE_set_digests(e, ossltest_digests) 313*e71b7053SJung-uk Kim || !ENGINE_set_ciphers(e, ossltest_ciphers) 314*e71b7053SJung-uk Kim || !ENGINE_set_RAND(e, ossltest_rand_method()) 315*e71b7053SJung-uk Kim || !ENGINE_set_destroy_function(e, ossltest_destroy) 316*e71b7053SJung-uk Kim || !ENGINE_set_init_function(e, ossltest_init) 317*e71b7053SJung-uk Kim || !ENGINE_set_finish_function(e, ossltest_finish)) { 318*e71b7053SJung-uk Kim OSSLTESTerr(OSSLTEST_F_BIND_OSSLTEST, OSSLTEST_R_INIT_FAILED); 319*e71b7053SJung-uk Kim return 0; 320*e71b7053SJung-uk Kim } 321*e71b7053SJung-uk Kim 322*e71b7053SJung-uk Kim return 1; 323*e71b7053SJung-uk Kim } 324*e71b7053SJung-uk Kim 325*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_DYNAMIC_ENGINE 326*e71b7053SJung-uk Kim static int bind_helper(ENGINE *e, const char *id) 327*e71b7053SJung-uk Kim { 328*e71b7053SJung-uk Kim if (id && (strcmp(id, engine_ossltest_id) != 0)) 329*e71b7053SJung-uk Kim return 0; 330*e71b7053SJung-uk Kim if (!bind_ossltest(e)) 331*e71b7053SJung-uk Kim return 0; 332*e71b7053SJung-uk Kim return 1; 333*e71b7053SJung-uk Kim } 334*e71b7053SJung-uk Kim 335*e71b7053SJung-uk Kim IMPLEMENT_DYNAMIC_CHECK_FN() 336*e71b7053SJung-uk Kim IMPLEMENT_DYNAMIC_BIND_FN(bind_helper) 337*e71b7053SJung-uk Kim #endif 338*e71b7053SJung-uk Kim 339*e71b7053SJung-uk Kim static ENGINE *engine_ossltest(void) 340*e71b7053SJung-uk Kim { 341*e71b7053SJung-uk Kim ENGINE *ret = ENGINE_new(); 342*e71b7053SJung-uk Kim if (ret == NULL) 343*e71b7053SJung-uk Kim return NULL; 344*e71b7053SJung-uk Kim if (!bind_ossltest(ret)) { 345*e71b7053SJung-uk Kim ENGINE_free(ret); 346*e71b7053SJung-uk Kim return NULL; 347*e71b7053SJung-uk Kim } 348*e71b7053SJung-uk Kim return ret; 349*e71b7053SJung-uk Kim } 350*e71b7053SJung-uk Kim 351*e71b7053SJung-uk Kim void ENGINE_load_ossltest(void) 352*e71b7053SJung-uk Kim { 353*e71b7053SJung-uk Kim /* Copied from eng_[openssl|dyn].c */ 354*e71b7053SJung-uk Kim ENGINE *toadd = engine_ossltest(); 355*e71b7053SJung-uk Kim if (!toadd) 356*e71b7053SJung-uk Kim return; 357*e71b7053SJung-uk Kim ENGINE_add(toadd); 358*e71b7053SJung-uk Kim ENGINE_free(toadd); 359*e71b7053SJung-uk Kim ERR_clear_error(); 360*e71b7053SJung-uk Kim } 361*e71b7053SJung-uk Kim 362*e71b7053SJung-uk Kim 363*e71b7053SJung-uk Kim static int ossltest_init(ENGINE *e) 364*e71b7053SJung-uk Kim { 365*e71b7053SJung-uk Kim return 1; 366*e71b7053SJung-uk Kim } 367*e71b7053SJung-uk Kim 368*e71b7053SJung-uk Kim 369*e71b7053SJung-uk Kim static int ossltest_finish(ENGINE *e) 370*e71b7053SJung-uk Kim { 371*e71b7053SJung-uk Kim return 1; 372*e71b7053SJung-uk Kim } 373*e71b7053SJung-uk Kim 374*e71b7053SJung-uk Kim 375*e71b7053SJung-uk Kim static int ossltest_destroy(ENGINE *e) 376*e71b7053SJung-uk Kim { 377*e71b7053SJung-uk Kim destroy_digests(); 378*e71b7053SJung-uk Kim destroy_ciphers(); 379*e71b7053SJung-uk Kim ERR_unload_OSSLTEST_strings(); 380*e71b7053SJung-uk Kim return 1; 381*e71b7053SJung-uk Kim } 382*e71b7053SJung-uk Kim 383*e71b7053SJung-uk Kim static int ossltest_digests(ENGINE *e, const EVP_MD **digest, 384*e71b7053SJung-uk Kim const int **nids, int nid) 385*e71b7053SJung-uk Kim { 386*e71b7053SJung-uk Kim int ok = 1; 387*e71b7053SJung-uk Kim if (!digest) { 388*e71b7053SJung-uk Kim /* We are returning a list of supported nids */ 389*e71b7053SJung-uk Kim return ossltest_digest_nids(nids); 390*e71b7053SJung-uk Kim } 391*e71b7053SJung-uk Kim /* We are being asked for a specific digest */ 392*e71b7053SJung-uk Kim switch (nid) { 393*e71b7053SJung-uk Kim case NID_md5: 394*e71b7053SJung-uk Kim *digest = digest_md5(); 395*e71b7053SJung-uk Kim break; 396*e71b7053SJung-uk Kim case NID_sha1: 397*e71b7053SJung-uk Kim *digest = digest_sha1(); 398*e71b7053SJung-uk Kim break; 399*e71b7053SJung-uk Kim case NID_sha256: 400*e71b7053SJung-uk Kim *digest = digest_sha256(); 401*e71b7053SJung-uk Kim break; 402*e71b7053SJung-uk Kim case NID_sha384: 403*e71b7053SJung-uk Kim *digest = digest_sha384(); 404*e71b7053SJung-uk Kim break; 405*e71b7053SJung-uk Kim case NID_sha512: 406*e71b7053SJung-uk Kim *digest = digest_sha512(); 407*e71b7053SJung-uk Kim break; 408*e71b7053SJung-uk Kim default: 409*e71b7053SJung-uk Kim ok = 0; 410*e71b7053SJung-uk Kim *digest = NULL; 411*e71b7053SJung-uk Kim break; 412*e71b7053SJung-uk Kim } 413*e71b7053SJung-uk Kim return ok; 414*e71b7053SJung-uk Kim } 415*e71b7053SJung-uk Kim 416*e71b7053SJung-uk Kim static int ossltest_ciphers(ENGINE *e, const EVP_CIPHER **cipher, 417*e71b7053SJung-uk Kim const int **nids, int nid) 418*e71b7053SJung-uk Kim { 419*e71b7053SJung-uk Kim int ok = 1; 420*e71b7053SJung-uk Kim if (!cipher) { 421*e71b7053SJung-uk Kim /* We are returning a list of supported nids */ 422*e71b7053SJung-uk Kim *nids = ossltest_cipher_nids; 423*e71b7053SJung-uk Kim return (sizeof(ossltest_cipher_nids) - 1) 424*e71b7053SJung-uk Kim / sizeof(ossltest_cipher_nids[0]); 425*e71b7053SJung-uk Kim } 426*e71b7053SJung-uk Kim /* We are being asked for a specific cipher */ 427*e71b7053SJung-uk Kim switch (nid) { 428*e71b7053SJung-uk Kim case NID_aes_128_cbc: 429*e71b7053SJung-uk Kim *cipher = ossltest_aes_128_cbc(); 430*e71b7053SJung-uk Kim break; 431*e71b7053SJung-uk Kim case NID_aes_128_gcm: 432*e71b7053SJung-uk Kim *cipher = ossltest_aes_128_gcm(); 433*e71b7053SJung-uk Kim break; 434*e71b7053SJung-uk Kim default: 435*e71b7053SJung-uk Kim ok = 0; 436*e71b7053SJung-uk Kim *cipher = NULL; 437*e71b7053SJung-uk Kim break; 438*e71b7053SJung-uk Kim } 439*e71b7053SJung-uk Kim return ok; 440*e71b7053SJung-uk Kim } 441*e71b7053SJung-uk Kim 442*e71b7053SJung-uk Kim static void fill_known_data(unsigned char *md, unsigned int len) 443*e71b7053SJung-uk Kim { 444*e71b7053SJung-uk Kim unsigned int i; 445*e71b7053SJung-uk Kim 446*e71b7053SJung-uk Kim for (i=0; i<len; i++) { 447*e71b7053SJung-uk Kim md[i] = (unsigned char)(i & 0xff); 448*e71b7053SJung-uk Kim } 449*e71b7053SJung-uk Kim } 450*e71b7053SJung-uk Kim 451*e71b7053SJung-uk Kim /* 452*e71b7053SJung-uk Kim * MD5 implementation. We go through the motions of doing MD5 by deferring to 453*e71b7053SJung-uk Kim * the standard implementation. Then we overwrite the result with a will defined 454*e71b7053SJung-uk Kim * value, so that all "MD5" digests using the test engine always end up with 455*e71b7053SJung-uk Kim * the same value. 456*e71b7053SJung-uk Kim */ 457*e71b7053SJung-uk Kim #undef data 458*e71b7053SJung-uk Kim #define data(ctx) ((MD5_CTX *)EVP_MD_CTX_md_data(ctx)) 459*e71b7053SJung-uk Kim static int digest_md5_init(EVP_MD_CTX *ctx) 460*e71b7053SJung-uk Kim { 461*e71b7053SJung-uk Kim return MD5_Init(data(ctx)); 462*e71b7053SJung-uk Kim } 463*e71b7053SJung-uk Kim 464*e71b7053SJung-uk Kim static int digest_md5_update(EVP_MD_CTX *ctx, const void *data, 465*e71b7053SJung-uk Kim size_t count) 466*e71b7053SJung-uk Kim { 467*e71b7053SJung-uk Kim return MD5_Update(data(ctx), data, (size_t)count); 468*e71b7053SJung-uk Kim } 469*e71b7053SJung-uk Kim 470*e71b7053SJung-uk Kim static int digest_md5_final(EVP_MD_CTX *ctx, unsigned char *md) 471*e71b7053SJung-uk Kim { 472*e71b7053SJung-uk Kim int ret; 473*e71b7053SJung-uk Kim ret = MD5_Final(md, data(ctx)); 474*e71b7053SJung-uk Kim 475*e71b7053SJung-uk Kim if (ret > 0) { 476*e71b7053SJung-uk Kim fill_known_data(md, MD5_DIGEST_LENGTH); 477*e71b7053SJung-uk Kim } 478*e71b7053SJung-uk Kim return ret; 479*e71b7053SJung-uk Kim } 480*e71b7053SJung-uk Kim 481*e71b7053SJung-uk Kim /* 482*e71b7053SJung-uk Kim * SHA1 implementation. 483*e71b7053SJung-uk Kim */ 484*e71b7053SJung-uk Kim #undef data 485*e71b7053SJung-uk Kim #define data(ctx) ((SHA_CTX *)EVP_MD_CTX_md_data(ctx)) 486*e71b7053SJung-uk Kim static int digest_sha1_init(EVP_MD_CTX *ctx) 487*e71b7053SJung-uk Kim { 488*e71b7053SJung-uk Kim return SHA1_Init(data(ctx)); 489*e71b7053SJung-uk Kim } 490*e71b7053SJung-uk Kim 491*e71b7053SJung-uk Kim static int digest_sha1_update(EVP_MD_CTX *ctx, const void *data, 492*e71b7053SJung-uk Kim size_t count) 493*e71b7053SJung-uk Kim { 494*e71b7053SJung-uk Kim return SHA1_Update(data(ctx), data, (size_t)count); 495*e71b7053SJung-uk Kim } 496*e71b7053SJung-uk Kim 497*e71b7053SJung-uk Kim static int digest_sha1_final(EVP_MD_CTX *ctx, unsigned char *md) 498*e71b7053SJung-uk Kim { 499*e71b7053SJung-uk Kim int ret; 500*e71b7053SJung-uk Kim ret = SHA1_Final(md, data(ctx)); 501*e71b7053SJung-uk Kim 502*e71b7053SJung-uk Kim if (ret > 0) { 503*e71b7053SJung-uk Kim fill_known_data(md, SHA_DIGEST_LENGTH); 504*e71b7053SJung-uk Kim } 505*e71b7053SJung-uk Kim return ret; 506*e71b7053SJung-uk Kim } 507*e71b7053SJung-uk Kim 508*e71b7053SJung-uk Kim /* 509*e71b7053SJung-uk Kim * SHA256 implementation. 510*e71b7053SJung-uk Kim */ 511*e71b7053SJung-uk Kim #undef data 512*e71b7053SJung-uk Kim #define data(ctx) ((SHA256_CTX *)EVP_MD_CTX_md_data(ctx)) 513*e71b7053SJung-uk Kim static int digest_sha256_init(EVP_MD_CTX *ctx) 514*e71b7053SJung-uk Kim { 515*e71b7053SJung-uk Kim return SHA256_Init(data(ctx)); 516*e71b7053SJung-uk Kim } 517*e71b7053SJung-uk Kim 518*e71b7053SJung-uk Kim static int digest_sha256_update(EVP_MD_CTX *ctx, const void *data, 519*e71b7053SJung-uk Kim size_t count) 520*e71b7053SJung-uk Kim { 521*e71b7053SJung-uk Kim return SHA256_Update(data(ctx), data, (size_t)count); 522*e71b7053SJung-uk Kim } 523*e71b7053SJung-uk Kim 524*e71b7053SJung-uk Kim static int digest_sha256_final(EVP_MD_CTX *ctx, unsigned char *md) 525*e71b7053SJung-uk Kim { 526*e71b7053SJung-uk Kim int ret; 527*e71b7053SJung-uk Kim ret = SHA256_Final(md, data(ctx)); 528*e71b7053SJung-uk Kim 529*e71b7053SJung-uk Kim if (ret > 0) { 530*e71b7053SJung-uk Kim fill_known_data(md, SHA256_DIGEST_LENGTH); 531*e71b7053SJung-uk Kim } 532*e71b7053SJung-uk Kim return ret; 533*e71b7053SJung-uk Kim } 534*e71b7053SJung-uk Kim 535*e71b7053SJung-uk Kim /* 536*e71b7053SJung-uk Kim * SHA384/512 implementation. 537*e71b7053SJung-uk Kim */ 538*e71b7053SJung-uk Kim #undef data 539*e71b7053SJung-uk Kim #define data(ctx) ((SHA512_CTX *)EVP_MD_CTX_md_data(ctx)) 540*e71b7053SJung-uk Kim static int digest_sha384_init(EVP_MD_CTX *ctx) 541*e71b7053SJung-uk Kim { 542*e71b7053SJung-uk Kim return SHA384_Init(data(ctx)); 543*e71b7053SJung-uk Kim } 544*e71b7053SJung-uk Kim 545*e71b7053SJung-uk Kim static int digest_sha512_init(EVP_MD_CTX *ctx) 546*e71b7053SJung-uk Kim { 547*e71b7053SJung-uk Kim return SHA512_Init(data(ctx)); 548*e71b7053SJung-uk Kim } 549*e71b7053SJung-uk Kim 550*e71b7053SJung-uk Kim static int digest_sha512_update(EVP_MD_CTX *ctx, const void *data, 551*e71b7053SJung-uk Kim size_t count) 552*e71b7053SJung-uk Kim { 553*e71b7053SJung-uk Kim return SHA512_Update(data(ctx), data, (size_t)count); 554*e71b7053SJung-uk Kim } 555*e71b7053SJung-uk Kim 556*e71b7053SJung-uk Kim static int digest_sha384_final(EVP_MD_CTX *ctx, unsigned char *md) 557*e71b7053SJung-uk Kim { 558*e71b7053SJung-uk Kim int ret; 559*e71b7053SJung-uk Kim /* Actually uses SHA512_Final! */ 560*e71b7053SJung-uk Kim ret = SHA512_Final(md, data(ctx)); 561*e71b7053SJung-uk Kim 562*e71b7053SJung-uk Kim if (ret > 0) { 563*e71b7053SJung-uk Kim fill_known_data(md, SHA384_DIGEST_LENGTH); 564*e71b7053SJung-uk Kim } 565*e71b7053SJung-uk Kim return ret; 566*e71b7053SJung-uk Kim } 567*e71b7053SJung-uk Kim 568*e71b7053SJung-uk Kim static int digest_sha512_final(EVP_MD_CTX *ctx, unsigned char *md) 569*e71b7053SJung-uk Kim { 570*e71b7053SJung-uk Kim int ret; 571*e71b7053SJung-uk Kim ret = SHA512_Final(md, data(ctx)); 572*e71b7053SJung-uk Kim 573*e71b7053SJung-uk Kim if (ret > 0) { 574*e71b7053SJung-uk Kim fill_known_data(md, SHA512_DIGEST_LENGTH); 575*e71b7053SJung-uk Kim } 576*e71b7053SJung-uk Kim return ret; 577*e71b7053SJung-uk Kim } 578*e71b7053SJung-uk Kim 579*e71b7053SJung-uk Kim /* 580*e71b7053SJung-uk Kim * AES128 Implementation 581*e71b7053SJung-uk Kim */ 582*e71b7053SJung-uk Kim 583*e71b7053SJung-uk Kim int ossltest_aes128_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 584*e71b7053SJung-uk Kim const unsigned char *iv, int enc) 585*e71b7053SJung-uk Kim { 586*e71b7053SJung-uk Kim return EVP_CIPHER_meth_get_init(EVP_aes_128_cbc()) (ctx, key, iv, enc); 587*e71b7053SJung-uk Kim } 588*e71b7053SJung-uk Kim 589*e71b7053SJung-uk Kim int ossltest_aes128_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 590*e71b7053SJung-uk Kim const unsigned char *in, size_t inl) 591*e71b7053SJung-uk Kim { 592*e71b7053SJung-uk Kim unsigned char *tmpbuf; 593*e71b7053SJung-uk Kim int ret; 594*e71b7053SJung-uk Kim 595*e71b7053SJung-uk Kim tmpbuf = OPENSSL_malloc(inl); 596*e71b7053SJung-uk Kim 597*e71b7053SJung-uk Kim /* OPENSSL_malloc will return NULL if inl == 0 */ 598*e71b7053SJung-uk Kim if (tmpbuf == NULL && inl > 0) 599*e71b7053SJung-uk Kim return -1; 600*e71b7053SJung-uk Kim 601*e71b7053SJung-uk Kim /* Remember what we were asked to encrypt */ 602*e71b7053SJung-uk Kim if (tmpbuf != NULL) 603*e71b7053SJung-uk Kim memcpy(tmpbuf, in, inl); 604*e71b7053SJung-uk Kim 605*e71b7053SJung-uk Kim /* Go through the motions of encrypting it */ 606*e71b7053SJung-uk Kim ret = EVP_CIPHER_meth_get_do_cipher(EVP_aes_128_cbc())(ctx, out, in, inl); 607*e71b7053SJung-uk Kim 608*e71b7053SJung-uk Kim /* Throw it all away and just use the plaintext as the output */ 609*e71b7053SJung-uk Kim if (tmpbuf != NULL) 610*e71b7053SJung-uk Kim memcpy(out, tmpbuf, inl); 611*e71b7053SJung-uk Kim OPENSSL_free(tmpbuf); 612*e71b7053SJung-uk Kim 613*e71b7053SJung-uk Kim return ret; 614*e71b7053SJung-uk Kim } 615*e71b7053SJung-uk Kim 616*e71b7053SJung-uk Kim int ossltest_aes128_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 617*e71b7053SJung-uk Kim const unsigned char *iv, int enc) 618*e71b7053SJung-uk Kim { 619*e71b7053SJung-uk Kim return EVP_CIPHER_meth_get_init(EVP_aes_128_gcm()) (ctx, key, iv, enc); 620*e71b7053SJung-uk Kim } 621*e71b7053SJung-uk Kim 622*e71b7053SJung-uk Kim 623*e71b7053SJung-uk Kim int ossltest_aes128_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 624*e71b7053SJung-uk Kim const unsigned char *in, size_t inl) 625*e71b7053SJung-uk Kim { 626*e71b7053SJung-uk Kim unsigned char *tmpbuf = OPENSSL_malloc(inl); 627*e71b7053SJung-uk Kim 628*e71b7053SJung-uk Kim /* OPENSSL_malloc will return NULL if inl == 0 */ 629*e71b7053SJung-uk Kim if (tmpbuf == NULL && inl > 0) 630*e71b7053SJung-uk Kim return -1; 631*e71b7053SJung-uk Kim 632*e71b7053SJung-uk Kim /* Remember what we were asked to encrypt */ 633*e71b7053SJung-uk Kim if (tmpbuf != NULL) 634*e71b7053SJung-uk Kim memcpy(tmpbuf, in, inl); 635*e71b7053SJung-uk Kim 636*e71b7053SJung-uk Kim /* Go through the motions of encrypting it */ 637*e71b7053SJung-uk Kim EVP_CIPHER_meth_get_do_cipher(EVP_aes_128_gcm())(ctx, out, in, inl); 638*e71b7053SJung-uk Kim 639*e71b7053SJung-uk Kim /* Throw it all away and just use the plaintext as the output */ 640*e71b7053SJung-uk Kim if (tmpbuf != NULL && out != NULL) 641*e71b7053SJung-uk Kim memcpy(out, tmpbuf, inl); 642*e71b7053SJung-uk Kim OPENSSL_free(tmpbuf); 643*e71b7053SJung-uk Kim 644*e71b7053SJung-uk Kim return inl; 645*e71b7053SJung-uk Kim } 646*e71b7053SJung-uk Kim 647*e71b7053SJung-uk Kim static int ossltest_aes128_gcm_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, 648*e71b7053SJung-uk Kim void *ptr) 649*e71b7053SJung-uk Kim { 650*e71b7053SJung-uk Kim /* Pass the ctrl down */ 651*e71b7053SJung-uk Kim int ret = EVP_CIPHER_meth_get_ctrl(EVP_aes_128_gcm())(ctx, type, arg, ptr); 652*e71b7053SJung-uk Kim 653*e71b7053SJung-uk Kim if (ret <= 0) 654*e71b7053SJung-uk Kim return ret; 655*e71b7053SJung-uk Kim 656*e71b7053SJung-uk Kim switch(type) { 657*e71b7053SJung-uk Kim case EVP_CTRL_AEAD_GET_TAG: 658*e71b7053SJung-uk Kim /* Always give the same tag */ 659*e71b7053SJung-uk Kim memset(ptr, 0, EVP_GCM_TLS_TAG_LEN); 660*e71b7053SJung-uk Kim break; 661*e71b7053SJung-uk Kim 662*e71b7053SJung-uk Kim default: 663*e71b7053SJung-uk Kim break; 664*e71b7053SJung-uk Kim } 665*e71b7053SJung-uk Kim 666*e71b7053SJung-uk Kim return 1; 667*e71b7053SJung-uk Kim } 668*e71b7053SJung-uk Kim 669*e71b7053SJung-uk Kim static int ossltest_rand_bytes(unsigned char *buf, int num) 670*e71b7053SJung-uk Kim { 671*e71b7053SJung-uk Kim unsigned char val = 1; 672*e71b7053SJung-uk Kim 673*e71b7053SJung-uk Kim while (--num >= 0) 674*e71b7053SJung-uk Kim *buf++ = val++; 675*e71b7053SJung-uk Kim return 1; 676*e71b7053SJung-uk Kim } 677*e71b7053SJung-uk Kim 678*e71b7053SJung-uk Kim static int ossltest_rand_status(void) 679*e71b7053SJung-uk Kim { 680*e71b7053SJung-uk Kim return 1; 681*e71b7053SJung-uk Kim } 682*e71b7053SJung-uk Kim 683*e71b7053SJung-uk Kim static const RAND_METHOD *ossltest_rand_method(void) 684*e71b7053SJung-uk Kim { 685*e71b7053SJung-uk Kim 686*e71b7053SJung-uk Kim static RAND_METHOD osslt_rand_meth = { 687*e71b7053SJung-uk Kim NULL, 688*e71b7053SJung-uk Kim ossltest_rand_bytes, 689*e71b7053SJung-uk Kim NULL, 690*e71b7053SJung-uk Kim NULL, 691*e71b7053SJung-uk Kim ossltest_rand_bytes, 692*e71b7053SJung-uk Kim ossltest_rand_status 693*e71b7053SJung-uk Kim }; 694*e71b7053SJung-uk Kim 695*e71b7053SJung-uk Kim return &osslt_rand_meth; 696*e71b7053SJung-uk Kim } 697