Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/openssl/engines/e_ossltest.c
105684 views
1
/*
2
* Copyright 2015-2021 The OpenSSL Project Authors. All Rights Reserved.
3
*
4
* Licensed under the Apache License 2.0 (the "License"). You may not use
5
* this file except in compliance with the License. You can obtain a copy
6
* in the file LICENSE in the source distribution or at
7
* https://www.openssl.org/source/license.html
8
*/
9
10
/*
11
* This is the OSSLTEST engine. It provides deliberately crippled digest
12
* implementations for test purposes. It is highly insecure and must NOT be
13
* used for any purpose except testing
14
*/
15
16
/* We need to use some engine deprecated APIs */
17
#define OPENSSL_SUPPRESS_DEPRECATED
18
19
/*
20
* SHA low level APIs are deprecated for public use, but still ok for
21
* internal use. Note, that due to symbols not being exported, only the
22
* #defines and type definitions can be accessed, function calls are not
23
* available. The digest lengths, block sizes and sizeof(CTX) are used herein
24
* for several different digests.
25
*/
26
#include "internal/deprecated.h"
27
28
#include <stdio.h>
29
#include <string.h>
30
#include "internal/common.h" /* for CHECK_AND_SKIP_CASE_PREFIX */
31
32
#include <openssl/engine.h>
33
#include <openssl/sha.h>
34
#include <openssl/md5.h>
35
#include <openssl/rsa.h>
36
#include <openssl/evp.h>
37
#include <openssl/modes.h>
38
#include <openssl/aes.h>
39
#include <openssl/rand.h>
40
#include <openssl/crypto.h>
41
#include <openssl/pem.h>
42
#include <crypto/evp.h>
43
44
/* clang-format off */
45
#include "e_ossltest_err.c"
46
/* clang-format on */
47
48
/* Engine Id and Name */
49
static const char *engine_ossltest_id = "ossltest";
50
static const char *engine_ossltest_name = "OpenSSL Test engine support";
51
52
/* Engine Lifetime functions */
53
static int ossltest_destroy(ENGINE *e);
54
static int ossltest_init(ENGINE *e);
55
static int ossltest_finish(ENGINE *e);
56
void ENGINE_load_ossltest(void);
57
58
/* Set up digests */
59
static int ossltest_digests(ENGINE *e, const EVP_MD **digest,
60
const int **nids, int nid);
61
static const RAND_METHOD *ossltest_rand_method(void);
62
63
/* MD5 */
64
static int digest_md5_init(EVP_MD_CTX *ctx);
65
static int digest_md5_update(EVP_MD_CTX *ctx, const void *data,
66
size_t count);
67
static int digest_md5_final(EVP_MD_CTX *ctx, unsigned char *md);
68
69
static EVP_MD *_hidden_md5_md = NULL;
70
static const EVP_MD *digest_md5(void)
71
{
72
if (_hidden_md5_md == NULL) {
73
EVP_MD *md;
74
75
if ((md = EVP_MD_meth_new(NID_md5, NID_md5WithRSAEncryption)) == NULL
76
|| !EVP_MD_meth_set_result_size(md, MD5_DIGEST_LENGTH)
77
|| !EVP_MD_meth_set_input_blocksize(md, MD5_CBLOCK)
78
|| !EVP_MD_meth_set_app_datasize(md,
79
sizeof(EVP_MD *) + sizeof(MD5_CTX))
80
|| !EVP_MD_meth_set_flags(md, 0)
81
|| !EVP_MD_meth_set_init(md, digest_md5_init)
82
|| !EVP_MD_meth_set_update(md, digest_md5_update)
83
|| !EVP_MD_meth_set_final(md, digest_md5_final)) {
84
EVP_MD_meth_free(md);
85
md = NULL;
86
}
87
_hidden_md5_md = md;
88
}
89
return _hidden_md5_md;
90
}
91
92
/* SHA1 */
93
static int digest_sha1_init(EVP_MD_CTX *ctx);
94
static int digest_sha1_update(EVP_MD_CTX *ctx, const void *data,
95
size_t count);
96
static int digest_sha1_final(EVP_MD_CTX *ctx, unsigned char *md);
97
98
static EVP_MD *_hidden_sha1_md = NULL;
99
static const EVP_MD *digest_sha1(void)
100
{
101
if (_hidden_sha1_md == NULL) {
102
EVP_MD *md;
103
104
if ((md = EVP_MD_meth_new(NID_sha1, NID_sha1WithRSAEncryption)) == NULL
105
|| !EVP_MD_meth_set_result_size(md, SHA_DIGEST_LENGTH)
106
|| !EVP_MD_meth_set_input_blocksize(md, SHA_CBLOCK)
107
|| !EVP_MD_meth_set_app_datasize(md,
108
sizeof(EVP_MD *) + sizeof(SHA_CTX))
109
|| !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_DIGALGID_ABSENT)
110
|| !EVP_MD_meth_set_init(md, digest_sha1_init)
111
|| !EVP_MD_meth_set_update(md, digest_sha1_update)
112
|| !EVP_MD_meth_set_final(md, digest_sha1_final)) {
113
EVP_MD_meth_free(md);
114
md = NULL;
115
}
116
_hidden_sha1_md = md;
117
}
118
return _hidden_sha1_md;
119
}
120
121
/* SHA256 */
122
static int digest_sha256_init(EVP_MD_CTX *ctx);
123
static int digest_sha256_update(EVP_MD_CTX *ctx, const void *data,
124
size_t count);
125
static int digest_sha256_final(EVP_MD_CTX *ctx, unsigned char *md);
126
127
static EVP_MD *_hidden_sha256_md = NULL;
128
static const EVP_MD *digest_sha256(void)
129
{
130
if (_hidden_sha256_md == NULL) {
131
EVP_MD *md;
132
133
if ((md = EVP_MD_meth_new(NID_sha256, NID_sha256WithRSAEncryption)) == NULL
134
|| !EVP_MD_meth_set_result_size(md, SHA256_DIGEST_LENGTH)
135
|| !EVP_MD_meth_set_input_blocksize(md, SHA256_CBLOCK)
136
|| !EVP_MD_meth_set_app_datasize(md,
137
sizeof(EVP_MD *) + sizeof(SHA256_CTX))
138
|| !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_DIGALGID_ABSENT)
139
|| !EVP_MD_meth_set_init(md, digest_sha256_init)
140
|| !EVP_MD_meth_set_update(md, digest_sha256_update)
141
|| !EVP_MD_meth_set_final(md, digest_sha256_final)) {
142
EVP_MD_meth_free(md);
143
md = NULL;
144
}
145
_hidden_sha256_md = md;
146
}
147
return _hidden_sha256_md;
148
}
149
150
/* SHA384/SHA512 */
151
static int digest_sha384_init(EVP_MD_CTX *ctx);
152
static int digest_sha384_update(EVP_MD_CTX *ctx, const void *data,
153
size_t count);
154
static int digest_sha384_final(EVP_MD_CTX *ctx, unsigned char *md);
155
156
static int digest_sha512_init(EVP_MD_CTX *ctx);
157
static int digest_sha512_update(EVP_MD_CTX *ctx, const void *data,
158
size_t count);
159
static int digest_sha512_final(EVP_MD_CTX *ctx, unsigned char *md);
160
161
static EVP_MD *_hidden_sha384_md = NULL;
162
static const EVP_MD *digest_sha384(void)
163
{
164
if (_hidden_sha384_md == NULL) {
165
EVP_MD *md;
166
167
if ((md = EVP_MD_meth_new(NID_sha384, NID_sha384WithRSAEncryption)) == NULL
168
|| !EVP_MD_meth_set_result_size(md, SHA384_DIGEST_LENGTH)
169
|| !EVP_MD_meth_set_input_blocksize(md, SHA512_CBLOCK)
170
|| !EVP_MD_meth_set_app_datasize(md,
171
sizeof(EVP_MD *) + sizeof(SHA512_CTX))
172
|| !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_DIGALGID_ABSENT)
173
|| !EVP_MD_meth_set_init(md, digest_sha384_init)
174
|| !EVP_MD_meth_set_update(md, digest_sha384_update)
175
|| !EVP_MD_meth_set_final(md, digest_sha384_final)) {
176
EVP_MD_meth_free(md);
177
md = NULL;
178
}
179
_hidden_sha384_md = md;
180
}
181
return _hidden_sha384_md;
182
}
183
static EVP_MD *_hidden_sha512_md = NULL;
184
static const EVP_MD *digest_sha512(void)
185
{
186
if (_hidden_sha512_md == NULL) {
187
EVP_MD *md;
188
189
if ((md = EVP_MD_meth_new(NID_sha512, NID_sha512WithRSAEncryption)) == NULL
190
|| !EVP_MD_meth_set_result_size(md, SHA512_DIGEST_LENGTH)
191
|| !EVP_MD_meth_set_input_blocksize(md, SHA512_CBLOCK)
192
|| !EVP_MD_meth_set_app_datasize(md,
193
sizeof(EVP_MD *) + sizeof(SHA512_CTX))
194
|| !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_DIGALGID_ABSENT)
195
|| !EVP_MD_meth_set_init(md, digest_sha512_init)
196
|| !EVP_MD_meth_set_update(md, digest_sha512_update)
197
|| !EVP_MD_meth_set_final(md, digest_sha512_final)) {
198
EVP_MD_meth_free(md);
199
md = NULL;
200
}
201
_hidden_sha512_md = md;
202
}
203
return _hidden_sha512_md;
204
}
205
static void destroy_digests(void)
206
{
207
EVP_MD_meth_free(_hidden_md5_md);
208
_hidden_md5_md = NULL;
209
EVP_MD_meth_free(_hidden_sha1_md);
210
_hidden_sha1_md = NULL;
211
EVP_MD_meth_free(_hidden_sha256_md);
212
_hidden_sha256_md = NULL;
213
EVP_MD_meth_free(_hidden_sha384_md);
214
_hidden_sha384_md = NULL;
215
EVP_MD_meth_free(_hidden_sha512_md);
216
_hidden_sha512_md = NULL;
217
}
218
static int ossltest_digest_nids(const int **nids)
219
{
220
static int digest_nids[6] = { 0, 0, 0, 0, 0, 0 };
221
static int pos = 0;
222
static int init = 0;
223
224
if (!init) {
225
const EVP_MD *md;
226
if ((md = digest_md5()) != NULL)
227
digest_nids[pos++] = EVP_MD_get_type(md);
228
if ((md = digest_sha1()) != NULL)
229
digest_nids[pos++] = EVP_MD_get_type(md);
230
if ((md = digest_sha256()) != NULL)
231
digest_nids[pos++] = EVP_MD_get_type(md);
232
if ((md = digest_sha384()) != NULL)
233
digest_nids[pos++] = EVP_MD_get_type(md);
234
if ((md = digest_sha512()) != NULL)
235
digest_nids[pos++] = EVP_MD_get_type(md);
236
digest_nids[pos] = 0;
237
init = 1;
238
}
239
*nids = digest_nids;
240
return pos;
241
}
242
243
/* Setup ciphers */
244
static int ossltest_ciphers(ENGINE *, const EVP_CIPHER **,
245
const int **, int);
246
247
static int ossltest_cipher_nids[] = {
248
NID_aes_128_cbc, NID_aes_128_gcm,
249
NID_aes_128_cbc_hmac_sha1, 0
250
};
251
252
/* AES128 */
253
254
static int ossltest_aes128_init_key(EVP_CIPHER_CTX *ctx,
255
const unsigned char *key,
256
const unsigned char *iv, int enc);
257
static int ossltest_aes128_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
258
const unsigned char *in, size_t inl);
259
static int ossltest_aes128_gcm_init_key(EVP_CIPHER_CTX *ctx,
260
const unsigned char *key,
261
const unsigned char *iv, int enc);
262
static int ossltest_aes128_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
263
const unsigned char *in, size_t inl);
264
static int ossltest_aes128_gcm_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg,
265
void *ptr);
266
static int ossltest_aes128_cbc_hmac_sha1_init_key(EVP_CIPHER_CTX *ctx,
267
const unsigned char *key,
268
const unsigned char *iv,
269
int enc);
270
static int ossltest_aes128_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx,
271
unsigned char *out,
272
const unsigned char *in,
273
size_t inl);
274
static int ossltest_aes128_cbc_hmac_sha1_ctrl(EVP_CIPHER_CTX *ctx, int type,
275
int arg, void *ptr);
276
277
typedef struct {
278
size_t payload_length; /* AAD length in decrypt case */
279
unsigned int tls_ver;
280
} EVP_AES_HMAC_SHA1;
281
282
static EVP_CIPHER *_hidden_aes_128_cbc = NULL;
283
static const EVP_CIPHER *ossltest_aes_128_cbc(void)
284
{
285
if (_hidden_aes_128_cbc == NULL
286
&& ((_hidden_aes_128_cbc = EVP_CIPHER_meth_new(NID_aes_128_cbc,
287
16 /* block size */,
288
16 /* key len */))
289
== NULL
290
|| !EVP_CIPHER_meth_set_iv_length(_hidden_aes_128_cbc, 16)
291
|| !EVP_CIPHER_meth_set_flags(_hidden_aes_128_cbc,
292
EVP_CIPH_FLAG_DEFAULT_ASN1
293
| EVP_CIPH_CBC_MODE)
294
|| !EVP_CIPHER_meth_set_init(_hidden_aes_128_cbc,
295
ossltest_aes128_init_key)
296
|| !EVP_CIPHER_meth_set_do_cipher(_hidden_aes_128_cbc,
297
ossltest_aes128_cbc_cipher)
298
|| !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_aes_128_cbc,
299
EVP_CIPHER_impl_ctx_size(EVP_aes_128_cbc())))) {
300
EVP_CIPHER_meth_free(_hidden_aes_128_cbc);
301
_hidden_aes_128_cbc = NULL;
302
}
303
return _hidden_aes_128_cbc;
304
}
305
306
static EVP_CIPHER *_hidden_aes_128_gcm = NULL;
307
308
#define AES_GCM_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 \
309
| EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
310
| EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT \
311
| EVP_CIPH_CUSTOM_COPY | EVP_CIPH_FLAG_AEAD_CIPHER \
312
| EVP_CIPH_GCM_MODE)
313
314
static const EVP_CIPHER *ossltest_aes_128_gcm(void)
315
{
316
if (_hidden_aes_128_gcm == NULL
317
&& ((_hidden_aes_128_gcm = EVP_CIPHER_meth_new(NID_aes_128_gcm,
318
1 /* block size */,
319
16 /* key len */))
320
== NULL
321
|| !EVP_CIPHER_meth_set_iv_length(_hidden_aes_128_gcm, 12)
322
|| !EVP_CIPHER_meth_set_flags(_hidden_aes_128_gcm, AES_GCM_FLAGS)
323
|| !EVP_CIPHER_meth_set_init(_hidden_aes_128_gcm,
324
ossltest_aes128_gcm_init_key)
325
|| !EVP_CIPHER_meth_set_do_cipher(_hidden_aes_128_gcm,
326
ossltest_aes128_gcm_cipher)
327
|| !EVP_CIPHER_meth_set_ctrl(_hidden_aes_128_gcm,
328
ossltest_aes128_gcm_ctrl)
329
|| !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_aes_128_gcm,
330
EVP_CIPHER_impl_ctx_size(EVP_aes_128_gcm())))) {
331
EVP_CIPHER_meth_free(_hidden_aes_128_gcm);
332
_hidden_aes_128_gcm = NULL;
333
}
334
return _hidden_aes_128_gcm;
335
}
336
337
static EVP_CIPHER *_hidden_aes_128_cbc_hmac_sha1 = NULL;
338
339
static const EVP_CIPHER *ossltest_aes_128_cbc_hmac_sha1(void)
340
{
341
if (_hidden_aes_128_cbc_hmac_sha1 == NULL
342
&& ((_hidden_aes_128_cbc_hmac_sha1
343
= EVP_CIPHER_meth_new(NID_aes_128_cbc_hmac_sha1,
344
16 /* block size */,
345
16 /* key len */))
346
== NULL
347
|| !EVP_CIPHER_meth_set_iv_length(_hidden_aes_128_cbc_hmac_sha1, 16)
348
|| !EVP_CIPHER_meth_set_flags(_hidden_aes_128_cbc_hmac_sha1,
349
EVP_CIPH_CBC_MODE | EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_FLAG_AEAD_CIPHER)
350
|| !EVP_CIPHER_meth_set_init(_hidden_aes_128_cbc_hmac_sha1,
351
ossltest_aes128_cbc_hmac_sha1_init_key)
352
|| !EVP_CIPHER_meth_set_do_cipher(_hidden_aes_128_cbc_hmac_sha1,
353
ossltest_aes128_cbc_hmac_sha1_cipher)
354
|| !EVP_CIPHER_meth_set_ctrl(_hidden_aes_128_cbc_hmac_sha1,
355
ossltest_aes128_cbc_hmac_sha1_ctrl)
356
|| !EVP_CIPHER_meth_set_set_asn1_params(_hidden_aes_128_cbc_hmac_sha1,
357
EVP_CIPH_FLAG_DEFAULT_ASN1 ? NULL : EVP_CIPHER_set_asn1_iv)
358
|| !EVP_CIPHER_meth_set_get_asn1_params(_hidden_aes_128_cbc_hmac_sha1,
359
EVP_CIPH_FLAG_DEFAULT_ASN1 ? NULL : EVP_CIPHER_get_asn1_iv)
360
|| !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_aes_128_cbc_hmac_sha1,
361
sizeof(EVP_AES_HMAC_SHA1)))) {
362
EVP_CIPHER_meth_free(_hidden_aes_128_cbc_hmac_sha1);
363
_hidden_aes_128_cbc_hmac_sha1 = NULL;
364
}
365
return _hidden_aes_128_cbc_hmac_sha1;
366
}
367
368
static void destroy_ciphers(void)
369
{
370
EVP_CIPHER_meth_free(_hidden_aes_128_cbc);
371
EVP_CIPHER_meth_free(_hidden_aes_128_gcm);
372
EVP_CIPHER_meth_free(_hidden_aes_128_cbc_hmac_sha1);
373
_hidden_aes_128_cbc = NULL;
374
_hidden_aes_128_gcm = NULL;
375
_hidden_aes_128_cbc_hmac_sha1 = NULL;
376
}
377
378
/* Key loading */
379
static EVP_PKEY *load_key(ENGINE *eng, const char *key_id, int pub,
380
UI_METHOD *ui_method, void *ui_data)
381
{
382
BIO *in;
383
EVP_PKEY *key;
384
385
if (!CHECK_AND_SKIP_CASE_PREFIX(key_id, "ot:"))
386
return NULL;
387
388
fprintf(stderr, "[ossltest]Loading %s key %s\n",
389
pub ? "Public" : "Private", key_id);
390
in = BIO_new_file(key_id, "r");
391
if (!in)
392
return NULL;
393
if (pub)
394
key = PEM_read_bio_PUBKEY(in, NULL, 0, NULL);
395
else
396
key = PEM_read_bio_PrivateKey(in, NULL, 0, NULL);
397
BIO_free(in);
398
return key;
399
}
400
401
static EVP_PKEY *ossltest_load_privkey(ENGINE *eng, const char *key_id,
402
UI_METHOD *ui_method, void *ui_data)
403
{
404
return load_key(eng, key_id, 0, ui_method, ui_data);
405
}
406
407
static EVP_PKEY *ossltest_load_pubkey(ENGINE *eng, const char *key_id,
408
UI_METHOD *ui_method, void *ui_data)
409
{
410
return load_key(eng, key_id, 1, ui_method, ui_data);
411
}
412
413
static int bind_ossltest(ENGINE *e)
414
{
415
/* Ensure the ossltest error handling is set up */
416
ERR_load_OSSLTEST_strings();
417
418
if (!ENGINE_set_id(e, engine_ossltest_id)
419
|| !ENGINE_set_name(e, engine_ossltest_name)
420
|| !ENGINE_set_digests(e, ossltest_digests)
421
|| !ENGINE_set_ciphers(e, ossltest_ciphers)
422
|| !ENGINE_set_RAND(e, ossltest_rand_method())
423
|| !ENGINE_set_destroy_function(e, ossltest_destroy)
424
|| !ENGINE_set_load_privkey_function(e, ossltest_load_privkey)
425
|| !ENGINE_set_load_pubkey_function(e, ossltest_load_pubkey)
426
|| !ENGINE_set_init_function(e, ossltest_init)
427
|| !ENGINE_set_finish_function(e, ossltest_finish)) {
428
OSSLTESTerr(OSSLTEST_F_BIND_OSSLTEST, OSSLTEST_R_INIT_FAILED);
429
return 0;
430
}
431
432
return 1;
433
}
434
435
#ifndef OPENSSL_NO_DYNAMIC_ENGINE
436
static int bind_helper(ENGINE *e, const char *id)
437
{
438
if (id && (strcmp(id, engine_ossltest_id) != 0))
439
return 0;
440
if (!bind_ossltest(e))
441
return 0;
442
return 1;
443
}
444
445
IMPLEMENT_DYNAMIC_CHECK_FN()
446
IMPLEMENT_DYNAMIC_BIND_FN(bind_helper)
447
#endif
448
449
static ENGINE *engine_ossltest(void)
450
{
451
ENGINE *ret = ENGINE_new();
452
if (ret == NULL)
453
return NULL;
454
if (!bind_ossltest(ret)) {
455
ENGINE_free(ret);
456
return NULL;
457
}
458
return ret;
459
}
460
461
void ENGINE_load_ossltest(void)
462
{
463
/* Copied from eng_[openssl|dyn].c */
464
ENGINE *toadd = engine_ossltest();
465
if (!toadd)
466
return;
467
ENGINE_add(toadd);
468
ENGINE_free(toadd);
469
ERR_clear_error();
470
}
471
472
static int ossltest_init(ENGINE *e)
473
{
474
return 1;
475
}
476
477
static int ossltest_finish(ENGINE *e)
478
{
479
return 1;
480
}
481
482
static int ossltest_destroy(ENGINE *e)
483
{
484
destroy_digests();
485
destroy_ciphers();
486
ERR_unload_OSSLTEST_strings();
487
return 1;
488
}
489
490
static int ossltest_digests(ENGINE *e, const EVP_MD **digest,
491
const int **nids, int nid)
492
{
493
int ok = 1;
494
if (!digest) {
495
/* We are returning a list of supported nids */
496
return ossltest_digest_nids(nids);
497
}
498
/* We are being asked for a specific digest */
499
switch (nid) {
500
case NID_md5:
501
*digest = digest_md5();
502
break;
503
case NID_sha1:
504
*digest = digest_sha1();
505
break;
506
case NID_sha256:
507
*digest = digest_sha256();
508
break;
509
case NID_sha384:
510
*digest = digest_sha384();
511
break;
512
case NID_sha512:
513
*digest = digest_sha512();
514
break;
515
default:
516
ok = 0;
517
*digest = NULL;
518
break;
519
}
520
return ok;
521
}
522
523
static int ossltest_ciphers(ENGINE *e, const EVP_CIPHER **cipher,
524
const int **nids, int nid)
525
{
526
int ok = 1;
527
if (!cipher) {
528
/* We are returning a list of supported nids */
529
*nids = ossltest_cipher_nids;
530
return (sizeof(ossltest_cipher_nids) - 1)
531
/ sizeof(ossltest_cipher_nids[0]);
532
}
533
/* We are being asked for a specific cipher */
534
switch (nid) {
535
case NID_aes_128_cbc:
536
*cipher = ossltest_aes_128_cbc();
537
break;
538
case NID_aes_128_gcm:
539
*cipher = ossltest_aes_128_gcm();
540
break;
541
case NID_aes_128_cbc_hmac_sha1:
542
*cipher = ossltest_aes_128_cbc_hmac_sha1();
543
break;
544
default:
545
ok = 0;
546
*cipher = NULL;
547
break;
548
}
549
return ok;
550
}
551
552
static void fill_known_data(unsigned char *md, unsigned int len)
553
{
554
unsigned int i;
555
556
for (i = 0; i < len; i++) {
557
md[i] = (unsigned char)(i & 0xff);
558
}
559
}
560
561
/*
562
* MD5 implementation. We go through the motions of doing MD5 by deferring to
563
* the standard implementation. Then we overwrite the result with a will defined
564
* value, so that all "MD5" digests using the test engine always end up with
565
* the same value.
566
*/
567
static int digest_md5_init(EVP_MD_CTX *ctx)
568
{
569
return EVP_MD_meth_get_init(EVP_md5())(ctx);
570
}
571
572
static int digest_md5_update(EVP_MD_CTX *ctx, const void *data,
573
size_t count)
574
{
575
return EVP_MD_meth_get_update(EVP_md5())(ctx, data, count);
576
}
577
578
static int digest_md5_final(EVP_MD_CTX *ctx, unsigned char *md)
579
{
580
int ret = EVP_MD_meth_get_final(EVP_md5())(ctx, md);
581
582
if (ret > 0) {
583
fill_known_data(md, MD5_DIGEST_LENGTH);
584
}
585
return ret;
586
}
587
588
/*
589
* SHA1 implementation.
590
*/
591
static int digest_sha1_init(EVP_MD_CTX *ctx)
592
{
593
return EVP_MD_meth_get_init(EVP_sha1())(ctx);
594
}
595
596
static int digest_sha1_update(EVP_MD_CTX *ctx, const void *data,
597
size_t count)
598
{
599
return EVP_MD_meth_get_update(EVP_sha1())(ctx, data, count);
600
}
601
602
static int digest_sha1_final(EVP_MD_CTX *ctx, unsigned char *md)
603
{
604
int ret = EVP_MD_meth_get_final(EVP_sha1())(ctx, md);
605
606
if (ret > 0) {
607
fill_known_data(md, SHA_DIGEST_LENGTH);
608
}
609
return ret;
610
}
611
612
/*
613
* SHA256 implementation.
614
*/
615
static int digest_sha256_init(EVP_MD_CTX *ctx)
616
{
617
return EVP_MD_meth_get_init(EVP_sha256())(ctx);
618
}
619
620
static int digest_sha256_update(EVP_MD_CTX *ctx, const void *data,
621
size_t count)
622
{
623
return EVP_MD_meth_get_update(EVP_sha256())(ctx, data, count);
624
}
625
626
static int digest_sha256_final(EVP_MD_CTX *ctx, unsigned char *md)
627
{
628
int ret = EVP_MD_meth_get_final(EVP_sha256())(ctx, md);
629
630
if (ret > 0) {
631
fill_known_data(md, SHA256_DIGEST_LENGTH);
632
}
633
return ret;
634
}
635
636
/*
637
* SHA384 implementation.
638
*/
639
static int digest_sha384_init(EVP_MD_CTX *ctx)
640
{
641
return EVP_MD_meth_get_init(EVP_sha384())(ctx);
642
}
643
644
static int digest_sha384_update(EVP_MD_CTX *ctx, const void *data,
645
size_t count)
646
{
647
return EVP_MD_meth_get_update(EVP_sha384())(ctx, data, count);
648
}
649
650
static int digest_sha384_final(EVP_MD_CTX *ctx, unsigned char *md)
651
{
652
int ret = EVP_MD_meth_get_final(EVP_sha384())(ctx, md);
653
654
if (ret > 0) {
655
fill_known_data(md, SHA384_DIGEST_LENGTH);
656
}
657
return ret;
658
}
659
660
/*
661
* SHA512 implementation.
662
*/
663
static int digest_sha512_init(EVP_MD_CTX *ctx)
664
{
665
return EVP_MD_meth_get_init(EVP_sha512())(ctx);
666
}
667
668
static int digest_sha512_update(EVP_MD_CTX *ctx, const void *data,
669
size_t count)
670
{
671
return EVP_MD_meth_get_update(EVP_sha512())(ctx, data, count);
672
}
673
674
static int digest_sha512_final(EVP_MD_CTX *ctx, unsigned char *md)
675
{
676
int ret = EVP_MD_meth_get_final(EVP_sha512())(ctx, md);
677
678
if (ret > 0) {
679
fill_known_data(md, SHA512_DIGEST_LENGTH);
680
}
681
return ret;
682
}
683
684
/*
685
* AES128 Implementation
686
*/
687
688
static int ossltest_aes128_init_key(EVP_CIPHER_CTX *ctx,
689
const unsigned char *key,
690
const unsigned char *iv, int enc)
691
{
692
return EVP_CIPHER_meth_get_init(EVP_aes_128_cbc())(ctx, key, iv, enc);
693
}
694
695
static int ossltest_aes128_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
696
const unsigned char *in, size_t inl)
697
{
698
unsigned char *tmpbuf;
699
int ret;
700
701
tmpbuf = OPENSSL_malloc(inl);
702
703
/* OPENSSL_malloc will return NULL if inl == 0 */
704
if (tmpbuf == NULL && inl > 0)
705
return -1;
706
707
/* Remember what we were asked to encrypt */
708
if (tmpbuf != NULL)
709
memcpy(tmpbuf, in, inl);
710
711
/* Go through the motions of encrypting it */
712
ret = EVP_CIPHER_meth_get_do_cipher(EVP_aes_128_cbc())(ctx, out, in, inl);
713
714
/* Throw it all away and just use the plaintext as the output */
715
if (tmpbuf != NULL)
716
memcpy(out, tmpbuf, inl);
717
OPENSSL_free(tmpbuf);
718
719
return ret;
720
}
721
722
static int ossltest_aes128_gcm_init_key(EVP_CIPHER_CTX *ctx,
723
const unsigned char *key,
724
const unsigned char *iv, int enc)
725
{
726
return EVP_CIPHER_meth_get_init(EVP_aes_128_gcm())(ctx, key, iv, enc);
727
}
728
729
static int ossltest_aes128_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
730
const unsigned char *in, size_t inl)
731
{
732
unsigned char *tmpbuf = OPENSSL_malloc(inl);
733
734
/* OPENSSL_malloc will return NULL if inl == 0 */
735
if (tmpbuf == NULL && inl > 0)
736
return -1;
737
738
/* Remember what we were asked to encrypt */
739
if (tmpbuf != NULL)
740
memcpy(tmpbuf, in, inl);
741
742
/* Go through the motions of encrypting it */
743
EVP_CIPHER_meth_get_do_cipher(EVP_aes_128_gcm())(ctx, out, in, inl);
744
745
/* Throw it all away and just use the plaintext as the output */
746
if (tmpbuf != NULL && out != NULL)
747
memcpy(out, tmpbuf, inl);
748
OPENSSL_free(tmpbuf);
749
750
return inl;
751
}
752
753
static int ossltest_aes128_gcm_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg,
754
void *ptr)
755
{
756
/* Pass the ctrl down */
757
int ret = EVP_CIPHER_meth_get_ctrl(EVP_aes_128_gcm())(ctx, type, arg, ptr);
758
759
if (ret <= 0)
760
return ret;
761
762
switch (type) {
763
case EVP_CTRL_AEAD_GET_TAG:
764
/* Always give the same tag */
765
memset(ptr, 0, EVP_GCM_TLS_TAG_LEN);
766
break;
767
768
default:
769
break;
770
}
771
772
return 1;
773
}
774
775
#define NO_PAYLOAD_LENGTH ((size_t)-1)
776
#define data(ctx) ((EVP_AES_HMAC_SHA1 *)EVP_CIPHER_CTX_get_cipher_data(ctx))
777
778
static int ossltest_aes128_cbc_hmac_sha1_init_key(EVP_CIPHER_CTX *ctx,
779
const unsigned char *inkey,
780
const unsigned char *iv,
781
int enc)
782
{
783
EVP_AES_HMAC_SHA1 *key = data(ctx);
784
key->payload_length = NO_PAYLOAD_LENGTH;
785
return 1;
786
}
787
788
static int ossltest_aes128_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx,
789
unsigned char *out,
790
const unsigned char *in,
791
size_t len)
792
{
793
EVP_AES_HMAC_SHA1 *key = data(ctx);
794
unsigned int l;
795
size_t plen = key->payload_length;
796
797
key->payload_length = NO_PAYLOAD_LENGTH;
798
799
if (len % AES_BLOCK_SIZE)
800
return 0;
801
802
if (EVP_CIPHER_CTX_is_encrypting(ctx)) {
803
if (plen == NO_PAYLOAD_LENGTH)
804
plen = len;
805
else if (len != ((plen + SHA_DIGEST_LENGTH + AES_BLOCK_SIZE) & -AES_BLOCK_SIZE))
806
return 0;
807
808
memmove(out, in, plen);
809
810
if (plen != len) { /* "TLS" mode of operation */
811
/* calculate HMAC and append it to payload */
812
fill_known_data(out + plen, SHA_DIGEST_LENGTH);
813
814
/* pad the payload|hmac */
815
plen += SHA_DIGEST_LENGTH;
816
for (l = len - plen - 1; plen < len; plen++)
817
out[plen] = l;
818
}
819
} else {
820
/* decrypt HMAC|padding at once */
821
memmove(out, in, len);
822
823
if (plen != NO_PAYLOAD_LENGTH) { /* "TLS" mode of operation */
824
unsigned int maxpad, pad;
825
826
if (key->tls_ver >= TLS1_1_VERSION) {
827
if (len < (AES_BLOCK_SIZE + SHA_DIGEST_LENGTH + 1))
828
return 0;
829
830
/* omit explicit iv */
831
in += AES_BLOCK_SIZE;
832
out += AES_BLOCK_SIZE;
833
len -= AES_BLOCK_SIZE;
834
} else if (len < (SHA_DIGEST_LENGTH + 1))
835
return 0;
836
837
/* figure out payload length */
838
pad = out[len - 1];
839
maxpad = len - (SHA_DIGEST_LENGTH + 1);
840
if (pad > maxpad)
841
return 0;
842
for (plen = len - pad - 1; plen < len; plen++)
843
if (out[plen] != pad)
844
return 0;
845
}
846
}
847
848
return 1;
849
}
850
851
static int ossltest_aes128_cbc_hmac_sha1_ctrl(EVP_CIPHER_CTX *ctx, int type,
852
int arg, void *ptr)
853
{
854
EVP_AES_HMAC_SHA1 *key = data(ctx);
855
856
switch (type) {
857
case EVP_CTRL_AEAD_SET_MAC_KEY:
858
return 1;
859
860
case EVP_CTRL_AEAD_TLS1_AAD: {
861
unsigned char *p = ptr;
862
unsigned int len;
863
864
if (arg != EVP_AEAD_TLS1_AAD_LEN)
865
return -1;
866
867
len = p[arg - 2] << 8 | p[arg - 1];
868
key->tls_ver = p[arg - 4] << 8 | p[arg - 3];
869
870
if (EVP_CIPHER_CTX_is_encrypting(ctx)) {
871
key->payload_length = len;
872
if (key->tls_ver >= TLS1_1_VERSION) {
873
if (len < AES_BLOCK_SIZE)
874
return 0;
875
len -= AES_BLOCK_SIZE;
876
p[arg - 2] = len >> 8;
877
p[arg - 1] = len;
878
}
879
880
return (int)(((len + SHA_DIGEST_LENGTH + AES_BLOCK_SIZE) & -AES_BLOCK_SIZE)
881
- len);
882
} else {
883
key->payload_length = arg;
884
885
return SHA_DIGEST_LENGTH;
886
}
887
}
888
default:
889
return -1;
890
}
891
}
892
893
static int ossltest_rand_bytes(unsigned char *buf, int num)
894
{
895
unsigned char val = 1;
896
897
while (--num >= 0)
898
*buf++ = val++;
899
return 1;
900
}
901
902
static int ossltest_rand_status(void)
903
{
904
return 1;
905
}
906
907
static const RAND_METHOD *ossltest_rand_method(void)
908
{
909
910
static RAND_METHOD osslt_rand_meth = {
911
NULL,
912
ossltest_rand_bytes,
913
NULL,
914
NULL,
915
ossltest_rand_bytes,
916
ossltest_rand_status
917
};
918
919
return &osslt_rand_meth;
920
}
921
922