xref: /freebsd/crypto/openssl/engines/e_ossltest.c (revision e71b70530d95c4f34d8bdbd78d1242df1ba4a945)
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