]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/evp/evp_lib.c
remove end of line whitespace
[thirdparty/openssl.git] / crypto / evp / evp_lib.c
CommitLineData
62867571 1/*
fd38836b 2 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
58964a49 3 *
4a8b0c55 4 * Licensed under the Apache License 2.0 (the "License"). You may not use
62867571
RS
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
58964a49
RE
8 */
9
10#include <stdio.h>
b39fc560 11#include "internal/cryptlib.h"
ec577822
BM
12#include <openssl/evp.h>
13#include <openssl/objects.h>
718b133a
MC
14#include <openssl/params.h>
15#include <openssl/core_names.h>
2db6bf6f 16#include "internal/evp_int.h"
3653d0c2 17#include "internal/provider.h"
7638370c 18#include "evp_locl.h"
58964a49 19
319e518a 20#if !defined(FIPS_MODE)
6b691a5c 21int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
0f113f3e
MC
22{
23 int ret;
718b133a 24 const EVP_CIPHER *cipher = c->cipher;
0f113f3e 25
718b133a
MC
26 if (cipher->prov != NULL) {
27 /*
28 * The cipher has come from a provider and won't have the default flags.
29 * Find the implicit form so we can check the flags.
30 * TODO(3.0): This won't work for 3rd party ciphers we know nothing about
31 * We'll need to think of something else for those.
32 */
33 cipher = EVP_get_cipherbynid(cipher->nid);
34 if (cipher == NULL) {
35 EVPerr(EVP_F_EVP_CIPHER_PARAM_TO_ASN1, ASN1_R_UNSUPPORTED_CIPHER);
36 return -1;
37 }
38 }
39
40 if (cipher->set_asn1_parameters != NULL)
41 ret = cipher->set_asn1_parameters(c, type);
42 else if (cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1) {
43 switch (EVP_CIPHER_mode(cipher)) {
2acdef5e 44 case EVP_CIPH_WRAP_MODE:
718b133a 45 if (EVP_CIPHER_nid(cipher) == NID_id_smime_alg_CMS3DESwrap)
4ec36aff 46 ASN1_TYPE_set(type, V_ASN1_NULL, NULL);
0f113f3e 47 ret = 1;
2acdef5e
DSH
48 break;
49
50 case EVP_CIPH_GCM_MODE:
51 case EVP_CIPH_CCM_MODE:
52 case EVP_CIPH_XTS_MODE:
53 case EVP_CIPH_OCB_MODE:
49c9c1b3 54 ret = -2;
2acdef5e
DSH
55 break;
56
57 default:
0f113f3e 58 ret = EVP_CIPHER_set_asn1_iv(c, type);
2acdef5e 59 }
0f113f3e
MC
60 } else
61 ret = -1;
49c9c1b3
DO
62 if (ret <= 0)
63 EVPerr(EVP_F_EVP_CIPHER_PARAM_TO_ASN1, ret == -2 ?
64 ASN1_R_UNSUPPORTED_CIPHER :
65 EVP_R_CIPHER_PARAMETER_ERROR);
66 if (ret < -1)
67 ret = -1;
26a7d938 68 return ret;
0f113f3e 69}
58964a49 70
6b691a5c 71int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
0f113f3e
MC
72{
73 int ret;
718b133a
MC
74 const EVP_CIPHER *cipher = c->cipher;
75
76 if (cipher->prov != NULL) {
77 /*
78 * The cipher has come from a provider and won't have the default flags.
79 * Find the implicit form so we can check the flags.
80 */
81 cipher = EVP_get_cipherbynid(cipher->nid);
82 if (cipher == NULL)
83 return -1;
84 }
0f113f3e 85
718b133a
MC
86 if (cipher->get_asn1_parameters != NULL)
87 ret = cipher->get_asn1_parameters(c, type);
88 else if (cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1) {
89 switch (EVP_CIPHER_mode(cipher)) {
2acdef5e
DSH
90
91 case EVP_CIPH_WRAP_MODE:
92 ret = 1;
93 break;
94
95 case EVP_CIPH_GCM_MODE:
96 case EVP_CIPH_CCM_MODE:
97 case EVP_CIPH_XTS_MODE:
98 case EVP_CIPH_OCB_MODE:
49c9c1b3 99 ret = -2;
2acdef5e
DSH
100 break;
101
102 default:
103 ret = EVP_CIPHER_get_asn1_iv(c, type);
104 break;
105 }
0f113f3e
MC
106 } else
107 ret = -1;
49c9c1b3
DO
108 if (ret <= 0)
109 EVPerr(EVP_F_EVP_CIPHER_ASN1_TO_PARAM, ret == -2 ?
110 EVP_R_UNSUPPORTED_CIPHER :
111 EVP_R_CIPHER_PARAMETER_ERROR);
112 if (ret < -1)
113 ret = -1;
26a7d938 114 return ret;
0f113f3e 115}
58964a49 116
718b133a 117int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *ctx, ASN1_TYPE *type)
0f113f3e
MC
118{
119 int i = 0;
120 unsigned int l;
121
122 if (type != NULL) {
718b133a
MC
123 unsigned char iv[EVP_MAX_IV_LENGTH];
124
125 l = EVP_CIPHER_CTX_iv_length(ctx);
126 if (!ossl_assert(l <= sizeof(iv)))
127 return -1;
128 i = ASN1_TYPE_get_octetstring(type, iv, l);
0f113f3e 129 if (i != (int)l)
26a7d938 130 return -1;
718b133a
MC
131
132 if (!EVP_CipherInit_ex(ctx, NULL, NULL, NULL, iv, -1))
133 return -1;
0f113f3e 134 }
26a7d938 135 return i;
0f113f3e 136}
58964a49 137
6b691a5c 138int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
0f113f3e
MC
139{
140 int i = 0;
141 unsigned int j;
142
143 if (type != NULL) {
144 j = EVP_CIPHER_CTX_iv_length(c);
145 OPENSSL_assert(j <= sizeof(c->iv));
146 i = ASN1_TYPE_set_octetstring(type, c->oiv, j);
147 }
26a7d938 148 return i;
0f113f3e 149}
319e518a 150#endif /* !defined(FIPS_MODE) */
884e8ec6
DSH
151
152/* Convert the various cipher NIDs and dummies to a proper OID NID */
84fa704c 153int EVP_CIPHER_type(const EVP_CIPHER *ctx)
884e8ec6 154{
0f113f3e 155 int nid;
0f113f3e 156 nid = EVP_CIPHER_nid(ctx);
884e8ec6 157
0f113f3e 158 switch (nid) {
884e8ec6 159
0f113f3e
MC
160 case NID_rc2_cbc:
161 case NID_rc2_64_cbc:
162 case NID_rc2_40_cbc:
884e8ec6 163
0f113f3e 164 return NID_rc2_cbc;
884e8ec6 165
0f113f3e
MC
166 case NID_rc4:
167 case NID_rc4_40:
884e8ec6 168
0f113f3e 169 return NID_rc4;
884e8ec6 170
0f113f3e
MC
171 case NID_aes_128_cfb128:
172 case NID_aes_128_cfb8:
173 case NID_aes_128_cfb1:
8d1ebe0b 174
0f113f3e 175 return NID_aes_128_cfb128;
8d1ebe0b 176
0f113f3e
MC
177 case NID_aes_192_cfb128:
178 case NID_aes_192_cfb8:
179 case NID_aes_192_cfb1:
8d1ebe0b 180
0f113f3e 181 return NID_aes_192_cfb128;
8d1ebe0b 182
0f113f3e
MC
183 case NID_aes_256_cfb128:
184 case NID_aes_256_cfb8:
185 case NID_aes_256_cfb1:
8d1ebe0b 186
0f113f3e 187 return NID_aes_256_cfb128;
8d1ebe0b 188
0f113f3e
MC
189 case NID_des_cfb64:
190 case NID_des_cfb8:
191 case NID_des_cfb1:
8d1ebe0b 192
0f113f3e 193 return NID_des_cfb64;
8d1ebe0b 194
0f113f3e
MC
195 case NID_des_ede3_cfb64:
196 case NID_des_ede3_cfb8:
197 case NID_des_ede3_cfb1:
7e765bf2 198
0f113f3e 199 return NID_des_cfb64;
7e765bf2 200
0f113f3e 201 default:
319e518a
MC
202#ifdef FIPS_MODE
203 return NID_undef;
204#else
205 {
206 /* Check it has an OID and it is valid */
207 ASN1_OBJECT *otmp = OBJ_nid2obj(nid);
208
209 if (OBJ_get0_data(otmp) == NULL)
210 nid = NID_undef;
211 ASN1_OBJECT_free(otmp);
212 return nid;
213 }
214#endif
0f113f3e 215 }
884e8ec6
DSH
216}
217
718b133a 218int EVP_CIPHER_block_size(const EVP_CIPHER *cipher)
0f113f3e 219{
13273237
RL
220 int v = cipher->block_size;
221 int ok = evp_do_param(cipher, &v, sizeof(v),
222 OSSL_CIPHER_PARAM_BLOCK_SIZE, OSSL_PARAM_INTEGER,
223 evp_do_ciph_getparams, NULL);
224
225 return ok != 0 ? v : -1;
0f113f3e 226}
7806f3dd 227
6343829a 228int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx)
0f113f3e 229{
718b133a 230 return EVP_CIPHER_block_size(ctx->cipher);
0f113f3e 231}
7806f3dd 232
e79f8773
RL
233int EVP_CIPHER_impl_ctx_size(const EVP_CIPHER *e)
234{
235 return e->ctx_size;
236}
237
0f113f3e
MC
238int EVP_Cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
239 const unsigned char *in, unsigned int inl)
240{
718b133a 241 if (ctx->cipher->prov != NULL) {
f79858ac
RL
242 size_t outl = 0; /* ignored */
243 int blocksize = EVP_CIPHER_CTX_block_size(ctx);
244
718b133a 245 if (ctx->cipher->ccipher != NULL)
f79858ac
RL
246 return
247 ctx->cipher->ccipher(ctx->provctx, out, &outl,
248 inl + (blocksize == 1 ? 0 : blocksize),
249 in, (size_t)inl);
718b133a
MC
250 return 0;
251 }
252
0f113f3e
MC
253 return ctx->cipher->do_cipher(ctx, out, in, inl);
254}
7806f3dd
NL
255
256const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx)
0f113f3e
MC
257{
258 return ctx->cipher;
259}
7806f3dd 260
83b06347
RL
261int EVP_CIPHER_CTX_encrypting(const EVP_CIPHER_CTX *ctx)
262{
263 return ctx->encrypt;
264}
265
7806f3dd 266unsigned long EVP_CIPHER_flags(const EVP_CIPHER *cipher)
0f113f3e 267{
13273237
RL
268 unsigned long v = cipher->flags;
269 int ok = evp_do_param(cipher, &v, sizeof(v),
270 OSSL_CIPHER_PARAM_FLAGS, OSSL_PARAM_UNSIGNED_INTEGER,
271 evp_do_ciph_getparams, NULL);
272
273 return ok != 0 ? v : 0;
0f113f3e 274}
7806f3dd 275
7806f3dd 276void *EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx)
0f113f3e
MC
277{
278 return ctx->app_data;
279}
7806f3dd
NL
280
281void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data)
0f113f3e
MC
282{
283 ctx->app_data = data;
284}
7806f3dd 285
44ab2dfd 286void *EVP_CIPHER_CTX_get_cipher_data(const EVP_CIPHER_CTX *ctx)
83b06347
RL
287{
288 return ctx->cipher_data;
289}
290
98ee7543
MC
291void *EVP_CIPHER_CTX_set_cipher_data(EVP_CIPHER_CTX *ctx, void *cipher_data)
292{
293 void *old_cipher_data;
294
295 old_cipher_data = ctx->cipher_data;
296 ctx->cipher_data = cipher_data;
297
298 return old_cipher_data;
299}
300
6343829a 301int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher)
0f113f3e 302{
13273237
RL
303 int v = cipher->iv_len;
304 int ok = evp_do_param(cipher, &v, sizeof(v),
305 OSSL_CIPHER_PARAM_IVLEN, OSSL_PARAM_UNSIGNED_INTEGER,
306 evp_do_ciph_getparams, NULL);
718b133a 307
13273237 308 return ok != 0 ? v: -1;
0f113f3e 309}
7806f3dd 310
6343829a 311int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx)
0f113f3e 312{
718b133a 313 return EVP_CIPHER_iv_length(ctx->cipher);
0f113f3e 314}
7806f3dd 315
83b06347
RL
316const unsigned char *EVP_CIPHER_CTX_original_iv(const EVP_CIPHER_CTX *ctx)
317{
318 return ctx->oiv;
319}
320
13273237
RL
321/*
322 * OSSL_PARAM_OCTET_PTR gets us the pointer to the running IV in the provider
323 */
83b06347
RL
324const unsigned char *EVP_CIPHER_CTX_iv(const EVP_CIPHER_CTX *ctx)
325{
13273237
RL
326 const unsigned char *v = ctx->iv;
327 int ok = evp_do_param(ctx->cipher, &v, sizeof(ctx->iv),
328 OSSL_CIPHER_PARAM_IV, OSSL_PARAM_OCTET_PTR,
329 evp_do_ciph_ctx_getparams, ctx->provctx);
330
331 return ok != 0 ? v: NULL;
83b06347
RL
332}
333
334unsigned char *EVP_CIPHER_CTX_iv_noconst(EVP_CIPHER_CTX *ctx)
335{
13273237
RL
336 unsigned char *v = ctx->iv;
337 int ok = evp_do_param(ctx->cipher, &v, sizeof(ctx->iv),
338 OSSL_CIPHER_PARAM_IV, OSSL_PARAM_OCTET_PTR,
339 evp_do_ciph_ctx_getparams, ctx->provctx);
340
341 return ok != 0 ? v: NULL;
83b06347
RL
342}
343
344unsigned char *EVP_CIPHER_CTX_buf_noconst(EVP_CIPHER_CTX *ctx)
345{
346 return ctx->buf;
347}
348
349int EVP_CIPHER_CTX_num(const EVP_CIPHER_CTX *ctx)
350{
13273237
RL
351 int v = ctx->num;
352 int ok = evp_do_param(ctx->cipher, &v, sizeof(v),
353 OSSL_CIPHER_PARAM_NUM, OSSL_PARAM_INTEGER,
354 evp_do_ciph_ctx_getparams, ctx->provctx);
355
356 return ok != 0 ? v: -1;
83b06347
RL
357}
358
13273237 359int EVP_CIPHER_CTX_set_num(EVP_CIPHER_CTX *ctx, int num)
83b06347 360{
13273237
RL
361 int ok = evp_do_param(ctx->cipher, &num, sizeof(num),
362 OSSL_CIPHER_PARAM_NUM, OSSL_PARAM_INTEGER,
363 evp_do_ciph_ctx_setparams, ctx->provctx);
364
83b06347 365 ctx->num = num;
13273237 366 return ok != 0;
83b06347
RL
367}
368
6343829a 369int EVP_CIPHER_key_length(const EVP_CIPHER *cipher)
0f113f3e 370{
13273237
RL
371 int v = cipher->key_len;
372 int ok = evp_do_param(cipher, &v, sizeof(v),
373 OSSL_CIPHER_PARAM_KEYLEN, OSSL_PARAM_INTEGER,
374 evp_do_ciph_getparams, NULL);
df05f2ce 375
13273237 376 return ok != 0 ? v: -1;
0f113f3e 377}
7806f3dd 378
6343829a 379int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx)
0f113f3e 380{
13273237
RL
381 int v = ctx->key_len;
382 int ok = evp_do_param(ctx->cipher, &v, sizeof(v),
383 OSSL_CIPHER_PARAM_KEYLEN, OSSL_PARAM_INTEGER,
384 evp_do_ciph_ctx_getparams, ctx->provctx);
385
386 return ok != 0 ? v: -1;
0f113f3e 387}
7806f3dd
NL
388
389int EVP_CIPHER_nid(const EVP_CIPHER *cipher)
0f113f3e
MC
390{
391 return cipher->nid;
392}
7806f3dd
NL
393
394int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx)
0f113f3e
MC
395{
396 return ctx->cipher->nid;
397}
7806f3dd 398
718b133a
MC
399int EVP_CIPHER_mode(const EVP_CIPHER *cipher)
400{
13273237
RL
401 int v = EVP_CIPHER_flags(cipher) & EVP_CIPH_MODE;
402 int ok = evp_do_param(cipher, &v, sizeof(v),
403 OSSL_CIPHER_PARAM_MODE, OSSL_PARAM_INTEGER,
404 evp_do_ciph_getparams, NULL);
718b133a 405
13273237 406 return ok != 0 ? v: 0;
718b133a
MC
407}
408
409
0f113f3e
MC
410int EVP_MD_block_size(const EVP_MD *md)
411{
7556b9df
MC
412 if (md == NULL) {
413 EVPerr(EVP_F_EVP_MD_BLOCK_SIZE, EVP_R_MESSAGE_DIGEST_IS_NULL);
414 return -1;
415 }
416
417 if (md->prov != NULL && md->dblock_size != NULL)
418 return (int)md->dblock_size();
419
0f113f3e
MC
420 return md->block_size;
421}
7806f3dd
NL
422
423int EVP_MD_type(const EVP_MD *md)
0f113f3e
MC
424{
425 return md->type;
426}
7806f3dd
NL
427
428int EVP_MD_pkey_type(const EVP_MD *md)
0f113f3e
MC
429{
430 return md->pkey_type;
431}
7806f3dd 432
6343829a 433int EVP_MD_size(const EVP_MD *md)
0f113f3e
MC
434{
435 if (!md) {
436 EVPerr(EVP_F_EVP_MD_SIZE, EVP_R_MESSAGE_DIGEST_IS_NULL);
437 return -1;
438 }
8c8cf0d9
MC
439
440 if (md->prov != NULL && md->size != NULL)
441 return (int)md->size();
442
0f113f3e
MC
443 return md->md_size;
444}
7806f3dd 445
e5fa864f 446unsigned long EVP_MD_flags(const EVP_MD *md)
0f113f3e
MC
447{
448 return md->flags;
449}
e5fa864f 450
2db6bf6f
RL
451EVP_MD *EVP_MD_meth_new(int md_type, int pkey_type)
452{
43ecb9c3
RS
453 EVP_MD *md = OPENSSL_zalloc(sizeof(*md));
454
2db6bf6f
RL
455 if (md != NULL) {
456 md->type = md_type;
457 md->pkey_type = pkey_type;
3653d0c2
MC
458 md->lock = CRYPTO_THREAD_lock_new();
459 if (md->lock == NULL) {
460 OPENSSL_free(md);
461 return NULL;
462 }
463 md->refcnt = 1;
2db6bf6f
RL
464 }
465 return md;
466}
df05f2ce 467
2db6bf6f
RL
468EVP_MD *EVP_MD_meth_dup(const EVP_MD *md)
469{
470 EVP_MD *to = EVP_MD_meth_new(md->type, md->pkey_type);
43ecb9c3 471
df05f2ce
MC
472 if (to != NULL) {
473 CRYPTO_RWLOCK *lock = to->lock;
2db6bf6f 474 memcpy(to, md, sizeof(*to));
df05f2ce
MC
475 to->lock = lock;
476 }
2db6bf6f
RL
477 return to;
478}
3653d0c2 479
70c35fd1 480int EVP_MD_up_ref(EVP_MD *md)
3653d0c2
MC
481{
482 int ref = 0;
483
484 CRYPTO_UP_REF(&md->refcnt, &ref, md->lock);
485 return 1;
486}
487
2db6bf6f
RL
488void EVP_MD_meth_free(EVP_MD *md)
489{
3653d0c2
MC
490 if (md != NULL) {
491 int i;
492
493 CRYPTO_DOWN_REF(&md->refcnt, &i, md->lock);
494 if (i > 0)
495 return;
496 ossl_provider_free(md->prov);
497 CRYPTO_THREAD_lock_free(md->lock);
498 OPENSSL_free(md);
499 }
2db6bf6f
RL
500}
501int EVP_MD_meth_set_input_blocksize(EVP_MD *md, int blocksize)
502{
503 md->block_size = blocksize;
504 return 1;
505}
506int EVP_MD_meth_set_result_size(EVP_MD *md, int resultsize)
507{
508 md->md_size = resultsize;
509 return 1;
510}
511int EVP_MD_meth_set_app_datasize(EVP_MD *md, int datasize)
512{
513 md->ctx_size = datasize;
514 return 1;
515}
516int EVP_MD_meth_set_flags(EVP_MD *md, unsigned long flags)
517{
518 md->flags = flags;
519 return 1;
520}
521int EVP_MD_meth_set_init(EVP_MD *md, int (*init)(EVP_MD_CTX *ctx))
522{
523 md->init = init;
524 return 1;
525}
526int EVP_MD_meth_set_update(EVP_MD *md, int (*update)(EVP_MD_CTX *ctx,
527 const void *data,
528 size_t count))
529{
530 md->update = update;
531 return 1;
532}
533int EVP_MD_meth_set_final(EVP_MD *md, int (*final)(EVP_MD_CTX *ctx,
534 unsigned char *md))
535{
536 md->final = final;
537 return 1;
538}
539int EVP_MD_meth_set_copy(EVP_MD *md, int (*copy)(EVP_MD_CTX *to,
540 const EVP_MD_CTX *from))
541{
542 md->copy = copy;
543 return 1;
544}
545int EVP_MD_meth_set_cleanup(EVP_MD *md, int (*cleanup)(EVP_MD_CTX *ctx))
546{
547 md->cleanup = cleanup;
548 return 1;
549}
550int EVP_MD_meth_set_ctrl(EVP_MD *md, int (*ctrl)(EVP_MD_CTX *ctx, int cmd,
551 int p1, void *p2))
552{
553 md->md_ctrl = ctrl;
554 return 1;
555}
556
557int EVP_MD_meth_get_input_blocksize(const EVP_MD *md)
558{
559 return md->block_size;
560}
561int EVP_MD_meth_get_result_size(const EVP_MD *md)
562{
563 return md->md_size;
564}
565int EVP_MD_meth_get_app_datasize(const EVP_MD *md)
566{
567 return md->ctx_size;
568}
569unsigned long EVP_MD_meth_get_flags(const EVP_MD *md)
570{
8bfa99f0 571 return md->flags;
2db6bf6f
RL
572}
573int (*EVP_MD_meth_get_init(const EVP_MD *md))(EVP_MD_CTX *ctx)
574{
575 return md->init;
576}
577int (*EVP_MD_meth_get_update(const EVP_MD *md))(EVP_MD_CTX *ctx,
578 const void *data,
579 size_t count)
580{
581 return md->update;
582}
583int (*EVP_MD_meth_get_final(const EVP_MD *md))(EVP_MD_CTX *ctx,
584 unsigned char *md)
585{
586 return md->final;
587}
588int (*EVP_MD_meth_get_copy(const EVP_MD *md))(EVP_MD_CTX *to,
589 const EVP_MD_CTX *from)
590{
591 return md->copy;
592}
593int (*EVP_MD_meth_get_cleanup(const EVP_MD *md))(EVP_MD_CTX *ctx)
594{
595 return md->cleanup;
596}
597int (*EVP_MD_meth_get_ctrl(const EVP_MD *md))(EVP_MD_CTX *ctx, int cmd,
598 int p1, void *p2)
599{
600 return md->md_ctrl;
601}
602
7806f3dd 603const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx)
0f113f3e 604{
b7c913c8 605 if (ctx == NULL)
0f113f3e 606 return NULL;
b7c913c8 607 return ctx->reqdigest;
0f113f3e 608}
7806f3dd 609
7638370c
RL
610EVP_PKEY_CTX *EVP_MD_CTX_pkey_ctx(const EVP_MD_CTX *ctx)
611{
612 return ctx->pctx;
613}
614
319e518a
MC
615#if !defined(FIPS_MODE)
616/* TODO(3.0): EVP_DigestSign* not yet supported in FIPS module */
00902d94
PY
617void EVP_MD_CTX_set_pkey_ctx(EVP_MD_CTX *ctx, EVP_PKEY_CTX *pctx)
618{
81c79453
PY
619 /*
620 * it's reasonable to set NULL pctx (a.k.a clear the ctx->pctx), so
621 * we have to deal with the cleanup job here.
622 */
623 if (!EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX))
624 EVP_PKEY_CTX_free(ctx->pctx);
625
00902d94 626 ctx->pctx = pctx;
81c79453
PY
627
628 if (pctx != NULL) {
629 /* make sure pctx is not freed when destroying EVP_MD_CTX */
630 EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX);
631 } else {
632 EVP_MD_CTX_clear_flags(ctx, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX);
633 }
00902d94 634}
319e518a 635#endif /* !defined(FIPS_MODE) */
00902d94 636
7638370c
RL
637void *EVP_MD_CTX_md_data(const EVP_MD_CTX *ctx)
638{
639 return ctx->md_data;
640}
641
642int (*EVP_MD_CTX_update_fn(EVP_MD_CTX *ctx))(EVP_MD_CTX *ctx,
643 const void *data, size_t count)
644{
645 return ctx->update;
646}
647
648void EVP_MD_CTX_set_update_fn(EVP_MD_CTX *ctx,
649 int (*update) (EVP_MD_CTX *ctx,
650 const void *data, size_t count))
651{
652 ctx->update = update;
653}
654
7806f3dd 655void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags)
0f113f3e
MC
656{
657 ctx->flags |= flags;
658}
7806f3dd
NL
659
660void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags)
0f113f3e
MC
661{
662 ctx->flags &= ~flags;
663}
7806f3dd
NL
664
665int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags)
0f113f3e
MC
666{
667 return (ctx->flags & flags);
668}
e92f9f45
DSH
669
670void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags)
0f113f3e
MC
671{
672 ctx->flags |= flags;
673}
e92f9f45
DSH
674
675void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags)
0f113f3e
MC
676{
677 ctx->flags &= ~flags;
678}
e92f9f45
DSH
679
680int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags)
0f113f3e
MC
681{
682 return (ctx->flags & flags);
683}
f842b6b2
RL
684
685int EVP_str2ctrl(int (*cb)(void *ctx, int cmd, void *buf, size_t buflen),
686 void *ctx, int cmd, const char *value)
687{
688 size_t len;
689
690 len = strlen(value);
691 if (len > INT_MAX)
692 return -1;
693 return cb(ctx, cmd, (void *)value, len);
694}
695
696int EVP_hex2ctrl(int (*cb)(void *ctx, int cmd, void *buf, size_t buflen),
697 void *ctx, int cmd, const char *hex)
698{
699 unsigned char *bin;
700 long binlen;
701 int rv = -1;
702
703 bin = OPENSSL_hexstr2buf(hex, &binlen);
704 if (bin == NULL)
705 return 0;
706 if (binlen <= INT_MAX)
707 rv = cb(ctx, cmd, bin, binlen);
708 OPENSSL_free(bin);
709 return rv;
710}