1 /* 2 * Copyright 1995-2026 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 /* We need to use some engine deprecated APIs */ 11 #define OPENSSL_SUPPRESS_DEPRECATED 12 13 #include <stdio.h> 14 #include <limits.h> 15 #include <assert.h> 16 #include <openssl/evp.h> 17 #include <openssl/err.h> 18 #include <openssl/rand.h> 19 #ifndef FIPS_MODULE 20 #include <openssl/engine.h> 21 #endif 22 #include <openssl/params.h> 23 #include <openssl/core_names.h> 24 #include "internal/cryptlib.h" 25 #include "internal/provider.h" 26 #include "internal/core.h" 27 #include "internal/safe_math.h" 28 #include "crypto/evp.h" 29 #include "evp_local.h" 30 31 OSSL_SAFE_MATH_SIGNED(int, int) 32 33 int EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *ctx) 34 { 35 if (ctx == NULL) 36 return 1; 37 38 if (ctx->cipher == NULL || ctx->cipher->prov == NULL) 39 goto legacy; 40 41 if (ctx->algctx != NULL) { 42 if (ctx->cipher->freectx != NULL) 43 ctx->cipher->freectx(ctx->algctx); 44 ctx->algctx = NULL; 45 } 46 if (ctx->fetched_cipher != NULL) 47 EVP_CIPHER_free(ctx->fetched_cipher); 48 memset(ctx, 0, sizeof(*ctx)); 49 ctx->iv_len = -1; 50 51 return 1; 52 53 /* Remove legacy code below when legacy support is removed. */ 54 legacy: 55 56 if (ctx->cipher != NULL) { 57 if (ctx->cipher->cleanup && !ctx->cipher->cleanup(ctx)) 58 return 0; 59 /* Cleanse cipher context data */ 60 if (ctx->cipher_data && ctx->cipher->ctx_size) 61 OPENSSL_cleanse(ctx->cipher_data, ctx->cipher->ctx_size); 62 } 63 OPENSSL_free(ctx->cipher_data); 64 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODULE) 65 ENGINE_finish(ctx->engine); 66 #endif 67 memset(ctx, 0, sizeof(*ctx)); 68 ctx->iv_len = -1; 69 return 1; 70 } 71 72 EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void) 73 { 74 EVP_CIPHER_CTX *ctx; 75 76 ctx = OPENSSL_zalloc(sizeof(EVP_CIPHER_CTX)); 77 if (ctx == NULL) 78 return NULL; 79 80 ctx->iv_len = -1; 81 return ctx; 82 } 83 84 void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx) 85 { 86 if (ctx == NULL) 87 return; 88 EVP_CIPHER_CTX_reset(ctx); 89 OPENSSL_free(ctx); 90 } 91 92 static int evp_cipher_init_internal(EVP_CIPHER_CTX *ctx, 93 const EVP_CIPHER *cipher, 94 ENGINE *impl, const unsigned char *key, 95 const unsigned char *iv, int enc, 96 uint8_t is_pipeline, 97 const OSSL_PARAM params[]) 98 { 99 int n; 100 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODULE) 101 ENGINE *tmpimpl = NULL; 102 #endif 103 104 /* 105 * enc == 1 means we are encrypting. 106 * enc == 0 means we are decrypting. 107 * enc == -1 means, use the previously initialised value for encrypt/decrypt 108 */ 109 if (enc == -1) { 110 enc = ctx->encrypt; 111 } else { 112 if (enc) 113 enc = 1; 114 ctx->encrypt = enc; 115 } 116 117 if (cipher == NULL && ctx->cipher == NULL) { 118 ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET); 119 return 0; 120 } 121 122 /* Code below to be removed when legacy support is dropped. */ 123 if (is_pipeline) 124 goto nonlegacy; 125 126 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODULE) 127 /* 128 * Whether it's nice or not, "Inits" can be used on "Final"'d contexts so 129 * this context may already have an ENGINE! Try to avoid releasing the 130 * previous handle, re-querying for an ENGINE, and having a 131 * reinitialisation, when it may all be unnecessary. 132 */ 133 if (ctx->engine && ctx->cipher 134 && (cipher == NULL || cipher->nid == ctx->cipher->nid)) 135 goto skip_to_init; 136 137 if (cipher != NULL && impl == NULL) { 138 /* Ask if an ENGINE is reserved for this job */ 139 tmpimpl = ENGINE_get_cipher_engine(cipher->nid); 140 } 141 #endif 142 143 /* 144 * If there are engines involved then we should use legacy handling for now. 145 */ 146 if (ctx->engine != NULL 147 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODULE) 148 || tmpimpl != NULL 149 #endif 150 || impl != NULL 151 || (cipher != NULL && cipher->origin == EVP_ORIG_METH) 152 || (cipher == NULL && ctx->cipher != NULL 153 && ctx->cipher->origin == EVP_ORIG_METH)) { 154 if (ctx->cipher == ctx->fetched_cipher) 155 ctx->cipher = NULL; 156 EVP_CIPHER_free(ctx->fetched_cipher); 157 ctx->fetched_cipher = NULL; 158 goto legacy; 159 } 160 /* 161 * Ensure a context left lying around from last time is cleared 162 * (legacy code) 163 */ 164 if (cipher != NULL && ctx->cipher != NULL) { 165 if (ctx->cipher->cleanup != NULL && !ctx->cipher->cleanup(ctx)) 166 return 0; 167 OPENSSL_clear_free(ctx->cipher_data, ctx->cipher->ctx_size); 168 ctx->cipher_data = NULL; 169 } 170 171 /* Start of non-legacy code below */ 172 nonlegacy: 173 /* Ensure a context left lying around from last time is cleared */ 174 if (cipher != NULL && ctx->cipher != NULL) { 175 unsigned long flags = ctx->flags; 176 177 EVP_CIPHER_CTX_reset(ctx); 178 /* Restore encrypt and flags */ 179 ctx->encrypt = enc; 180 ctx->flags = flags; 181 } 182 183 if (cipher == NULL) 184 cipher = ctx->cipher; 185 186 if (cipher->prov == NULL) { 187 #ifdef FIPS_MODULE 188 /* We only do explicit fetches inside the FIPS module */ 189 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 190 return 0; 191 #else 192 EVP_CIPHER *provciph = EVP_CIPHER_fetch(NULL, 193 cipher->nid == NID_undef ? "NULL" 194 : OBJ_nid2sn(cipher->nid), 195 ""); 196 197 if (provciph == NULL) 198 return 0; 199 cipher = provciph; 200 EVP_CIPHER_free(ctx->fetched_cipher); 201 ctx->fetched_cipher = provciph; 202 #endif 203 } 204 205 if (!ossl_assert(cipher->prov != NULL)) { 206 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 207 return 0; 208 } 209 210 if (cipher != ctx->fetched_cipher) { 211 if (!EVP_CIPHER_up_ref((EVP_CIPHER *)cipher)) { 212 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 213 return 0; 214 } 215 EVP_CIPHER_free(ctx->fetched_cipher); 216 /* Coverity false positive, the reference counting is confusing it */ 217 /* coverity[use_after_free] */ 218 ctx->fetched_cipher = (EVP_CIPHER *)cipher; 219 } 220 ctx->cipher = cipher; 221 222 if (is_pipeline && !EVP_CIPHER_can_pipeline(cipher, enc)) { 223 ERR_raise(ERR_LIB_EVP, EVP_R_PIPELINE_NOT_SUPPORTED); 224 return 0; 225 } 226 227 if (ctx->algctx == NULL) { 228 ctx->algctx = ctx->cipher->newctx(ossl_provider_ctx(cipher->prov)); 229 if (ctx->algctx == NULL) { 230 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 231 return 0; 232 } 233 } 234 235 if ((ctx->flags & EVP_CIPH_NO_PADDING) != 0) { 236 /* 237 * If this ctx was already set up for no padding then we need to tell 238 * the new cipher about it. 239 */ 240 if (!EVP_CIPHER_CTX_set_padding(ctx, 0)) 241 return 0; 242 } 243 244 #ifndef FIPS_MODULE 245 /* 246 * Fix for CVE-2023-5363 247 * Passing in a size as part of the init call takes effect late 248 * so, force such to occur before the initialisation. 249 * 250 * The FIPS provider's internal library context is used in a manner 251 * such that this is not an issue. 252 */ 253 if (params != NULL) { 254 OSSL_PARAM param_lens[3] = { OSSL_PARAM_END, OSSL_PARAM_END, 255 OSSL_PARAM_END }; 256 OSSL_PARAM *q = param_lens; 257 const OSSL_PARAM *p; 258 259 p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_KEYLEN); 260 if (p != NULL) 261 memcpy(q++, p, sizeof(*q)); 262 263 /* 264 * Note that OSSL_CIPHER_PARAM_AEAD_IVLEN is a synonym for 265 * OSSL_CIPHER_PARAM_IVLEN so both are covered here. 266 */ 267 p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_IVLEN); 268 if (p != NULL) 269 memcpy(q++, p, sizeof(*q)); 270 271 if (q != param_lens) { 272 if (!EVP_CIPHER_CTX_set_params(ctx, param_lens)) { 273 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_LENGTH); 274 return 0; 275 } 276 } 277 } 278 #endif 279 280 if (is_pipeline) 281 return 1; 282 283 if (enc) { 284 if (ctx->cipher->einit == NULL) { 285 /* 286 * We still should be able to set the IV using the new API 287 * if the key is not specified and old API is not available 288 */ 289 if (key == NULL && ctx->cipher->einit_skey != NULL) { 290 return ctx->cipher->einit_skey(ctx->algctx, NULL, 291 iv, 292 iv == NULL ? 0 293 : EVP_CIPHER_CTX_get_iv_length(ctx), 294 params); 295 } 296 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 297 return 0; 298 } 299 300 return ctx->cipher->einit(ctx->algctx, 301 key, 302 key == NULL ? 0 303 : EVP_CIPHER_CTX_get_key_length(ctx), 304 iv, 305 iv == NULL ? 0 306 : EVP_CIPHER_CTX_get_iv_length(ctx), 307 params); 308 } 309 310 if (ctx->cipher->dinit == NULL) { 311 /* 312 * We still should be able to set the IV using the new API 313 * if the key is not specified and old API is not available 314 */ 315 if (key == NULL && ctx->cipher->dinit_skey != NULL) { 316 return ctx->cipher->dinit_skey(ctx->algctx, NULL, 317 iv, 318 iv == NULL ? 0 319 : EVP_CIPHER_CTX_get_iv_length(ctx), 320 params); 321 } 322 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 323 return 0; 324 } 325 326 return ctx->cipher->dinit(ctx->algctx, 327 key, 328 key == NULL ? 0 329 : EVP_CIPHER_CTX_get_key_length(ctx), 330 iv, 331 iv == NULL ? 0 332 : EVP_CIPHER_CTX_get_iv_length(ctx), 333 params); 334 335 /* Code below to be removed when legacy support is dropped. */ 336 legacy: 337 338 if (cipher != NULL) { 339 /* 340 * Ensure a context left lying around from last time is cleared (we 341 * previously attempted to avoid this if the same ENGINE and 342 * EVP_CIPHER could be used). 343 */ 344 if (ctx->cipher) { 345 unsigned long flags = ctx->flags; 346 EVP_CIPHER_CTX_reset(ctx); 347 /* Restore encrypt and flags */ 348 ctx->encrypt = enc; 349 ctx->flags = flags; 350 } 351 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODULE) 352 if (impl != NULL) { 353 if (!ENGINE_init(impl)) { 354 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 355 return 0; 356 } 357 } else { 358 impl = tmpimpl; 359 } 360 if (impl != NULL) { 361 /* There's an ENGINE for this job ... (apparently) */ 362 const EVP_CIPHER *c = ENGINE_get_cipher(impl, cipher->nid); 363 364 if (c == NULL) { 365 /* 366 * One positive side-effect of US's export control history, 367 * is that we should at least be able to avoid using US 368 * misspellings of "initialisation"? 369 */ 370 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 371 return 0; 372 } 373 /* We'll use the ENGINE's private cipher definition */ 374 cipher = c; 375 /* 376 * Store the ENGINE functional reference so we know 'cipher' came 377 * from an ENGINE and we need to release it when done. 378 */ 379 ctx->engine = impl; 380 } else { 381 ctx->engine = NULL; 382 } 383 #endif 384 385 ctx->cipher = cipher; 386 if (ctx->cipher->ctx_size) { 387 ctx->cipher_data = OPENSSL_zalloc(ctx->cipher->ctx_size); 388 if (ctx->cipher_data == NULL) { 389 ctx->cipher = NULL; 390 return 0; 391 } 392 } else { 393 ctx->cipher_data = NULL; 394 } 395 ctx->key_len = cipher->key_len; 396 /* Preserve wrap enable flag, zero everything else */ 397 ctx->flags &= EVP_CIPHER_CTX_FLAG_WRAP_ALLOW; 398 if (ctx->cipher->flags & EVP_CIPH_CTRL_INIT) { 399 if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_INIT, 0, NULL) <= 0) { 400 ctx->cipher = NULL; 401 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 402 return 0; 403 } 404 } 405 } 406 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODULE) 407 skip_to_init: 408 #endif 409 if (ctx->cipher == NULL) 410 return 0; 411 412 /* we assume block size is a power of 2 in *cryptUpdate */ 413 OPENSSL_assert(ctx->cipher->block_size == 1 414 || ctx->cipher->block_size == 8 415 || ctx->cipher->block_size == 16); 416 417 if (!(ctx->flags & EVP_CIPHER_CTX_FLAG_WRAP_ALLOW) 418 && EVP_CIPHER_CTX_get_mode(ctx) == EVP_CIPH_WRAP_MODE) { 419 ERR_raise(ERR_LIB_EVP, EVP_R_WRAP_MODE_NOT_ALLOWED); 420 return 0; 421 } 422 423 if ((EVP_CIPHER_get_flags(EVP_CIPHER_CTX_get0_cipher(ctx)) 424 & EVP_CIPH_CUSTOM_IV) 425 == 0) { 426 switch (EVP_CIPHER_CTX_get_mode(ctx)) { 427 428 case EVP_CIPH_STREAM_CIPHER: 429 case EVP_CIPH_ECB_MODE: 430 break; 431 432 case EVP_CIPH_CFB_MODE: 433 case EVP_CIPH_OFB_MODE: 434 435 ctx->num = 0; 436 /* fall-through */ 437 438 case EVP_CIPH_CBC_MODE: 439 n = EVP_CIPHER_CTX_get_iv_length(ctx); 440 if (n < 0 || n > (int)sizeof(ctx->iv)) { 441 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_IV_LENGTH); 442 return 0; 443 } 444 if (iv != NULL) 445 memcpy(ctx->oiv, iv, n); 446 memcpy(ctx->iv, ctx->oiv, n); 447 break; 448 449 case EVP_CIPH_CTR_MODE: 450 ctx->num = 0; 451 /* Don't reuse IV for CTR mode */ 452 if (iv != NULL) { 453 n = EVP_CIPHER_CTX_get_iv_length(ctx); 454 if (n <= 0 || n > (int)sizeof(ctx->iv)) { 455 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_IV_LENGTH); 456 return 0; 457 } 458 memcpy(ctx->iv, iv, n); 459 } 460 break; 461 462 default: 463 return 0; 464 } 465 } 466 467 if (key != NULL || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT)) { 468 if (!ctx->cipher->init(ctx, key, iv, enc)) 469 return 0; 470 } 471 ctx->buf_len = 0; 472 ctx->final_used = 0; 473 ctx->block_mask = ctx->cipher->block_size - 1; 474 return 1; 475 } 476 477 /* 478 * This function is basically evp_cipher_init_internal without ENGINE support. 479 * They should be combined when engines are not supported any longer. 480 */ 481 static int evp_cipher_init_skey_internal(EVP_CIPHER_CTX *ctx, 482 const EVP_CIPHER *cipher, 483 const EVP_SKEY *skey, 484 const unsigned char *iv, size_t iv_len, 485 int enc, const OSSL_PARAM params[]) 486 { 487 int ret; 488 489 /* 490 * enc == 1 means we are encrypting. 491 * enc == 0 means we are decrypting. 492 * enc == -1 means, use the previously initialised value for encrypt/decrypt 493 */ 494 if (enc == -1) 495 enc = ctx->encrypt; 496 else 497 ctx->encrypt = enc != 0; 498 499 if (cipher == NULL && ctx->cipher == NULL) { 500 ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET); 501 return 0; 502 } 503 504 /* 505 * If there are engines involved then we throw an error 506 */ 507 if (ctx->engine != NULL 508 || (cipher != NULL && cipher->origin == EVP_ORIG_METH) 509 || (cipher == NULL && ctx->cipher != NULL 510 && ctx->cipher->origin == EVP_ORIG_METH)) { 511 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 512 return 0; 513 } 514 /* 515 * Ensure a context left lying around from last time is cleared 516 * (legacy code) 517 */ 518 if (cipher != NULL && ctx->cipher != NULL) { 519 if (ctx->cipher->cleanup != NULL && !ctx->cipher->cleanup(ctx)) 520 return 0; 521 OPENSSL_clear_free(ctx->cipher_data, ctx->cipher->ctx_size); 522 ctx->cipher_data = NULL; 523 } 524 525 /* Ensure a context left lying around from last time is cleared */ 526 if (cipher != NULL && ctx->cipher != NULL) { 527 unsigned long flags = ctx->flags; 528 529 EVP_CIPHER_CTX_reset(ctx); 530 /* Restore encrypt and flags */ 531 ctx->encrypt = enc; 532 ctx->flags = flags; 533 } 534 535 if (cipher == NULL) 536 cipher = ctx->cipher; 537 538 if (cipher->prov == NULL) { 539 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 540 return 0; 541 } 542 543 if (cipher != ctx->fetched_cipher) { 544 if (!EVP_CIPHER_up_ref((EVP_CIPHER *)cipher)) { 545 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 546 return 0; 547 } 548 EVP_CIPHER_free(ctx->fetched_cipher); 549 /* Coverity false positive, the reference counting is confusing it */ 550 /* coverity[use_after_free] */ 551 ctx->fetched_cipher = (EVP_CIPHER *)cipher; 552 } 553 ctx->cipher = cipher; 554 if (ctx->algctx == NULL) { 555 ctx->algctx = ctx->cipher->newctx(ossl_provider_ctx(cipher->prov)); 556 if (ctx->algctx == NULL) { 557 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 558 return 0; 559 } 560 } 561 562 if (skey != NULL && ctx->cipher->prov != skey->skeymgmt->prov) { 563 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 564 return 0; 565 } 566 567 if ((ctx->flags & EVP_CIPH_NO_PADDING) != 0) { 568 /* 569 * If this ctx was already set up for no padding then we need to tell 570 * the new cipher about it. 571 */ 572 if (!EVP_CIPHER_CTX_set_padding(ctx, 0)) 573 return 0; 574 } 575 576 if (iv == NULL) 577 iv_len = 0; 578 579 /* We have a data managed via key management, using the new callbacks */ 580 if (enc) { 581 if (ctx->cipher->einit_skey == NULL) { 582 /* 583 * When skey is NULL, it's a multiple-step init as the current API does. 584 * Otherwise we try to fallback for providers that do not support SKEYs. 585 */ 586 const unsigned char *keydata = NULL; 587 size_t keylen = 0; 588 589 if (skey != NULL && !EVP_SKEY_get0_raw_key(skey, &keydata, &keylen)) { 590 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 591 return 0; 592 } 593 594 ret = ctx->cipher->einit(ctx->algctx, keydata, keylen, 595 iv, iv_len, params); 596 } else { 597 ret = ctx->cipher->einit_skey(ctx->algctx, 598 skey == NULL ? NULL : skey->keydata, 599 iv, iv_len, params); 600 } 601 } else { 602 if (ctx->cipher->dinit_skey == NULL) { 603 /* 604 * When skey is NULL, it's a multiple-step init as the current API does. 605 * Otherwise we try to fallback for providers that do not support SKEYs. 606 */ 607 const unsigned char *keydata = NULL; 608 size_t keylen = 0; 609 610 if (skey != NULL && !EVP_SKEY_get0_raw_key(skey, &keydata, &keylen)) { 611 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 612 return 0; 613 } 614 615 ret = ctx->cipher->dinit(ctx->algctx, keydata, keylen, 616 iv, iv_len, params); 617 } else { 618 ret = ctx->cipher->dinit_skey(ctx->algctx, 619 skey == NULL ? NULL : skey->keydata, 620 iv, iv_len, params); 621 } 622 } 623 624 return ret; 625 } 626 627 int EVP_CipherInit_SKEY(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, 628 EVP_SKEY *skey, const unsigned char *iv, size_t iv_len, 629 int enc, const OSSL_PARAM params[]) 630 { 631 return evp_cipher_init_skey_internal(ctx, cipher, skey, iv, iv_len, enc, params); 632 } 633 634 int EVP_CipherInit_ex2(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, 635 const unsigned char *key, const unsigned char *iv, 636 int enc, const OSSL_PARAM params[]) 637 { 638 return evp_cipher_init_internal(ctx, cipher, NULL, key, iv, enc, 0, params); 639 } 640 641 int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, 642 const unsigned char *key, const unsigned char *iv, int enc) 643 { 644 if (cipher != NULL) 645 EVP_CIPHER_CTX_reset(ctx); 646 return evp_cipher_init_internal(ctx, cipher, NULL, key, iv, enc, 0, NULL); 647 } 648 649 int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, 650 ENGINE *impl, const unsigned char *key, 651 const unsigned char *iv, int enc) 652 { 653 return evp_cipher_init_internal(ctx, cipher, impl, key, iv, enc, 0, NULL); 654 } 655 656 int EVP_CipherPipelineEncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, 657 const unsigned char *key, size_t keylen, 658 size_t numpipes, 659 const unsigned char **iv, size_t ivlen) 660 { 661 if (numpipes > EVP_MAX_PIPES) { 662 ERR_raise(ERR_LIB_EVP, EVP_R_TOO_MANY_PIPES); 663 return 0; 664 } 665 666 ctx->numpipes = numpipes; 667 668 if (!evp_cipher_init_internal(ctx, cipher, NULL, NULL, NULL, 1, 1, 669 NULL)) 670 return 0; 671 672 if (ctx->cipher->p_einit == NULL) { 673 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 674 return 0; 675 } 676 677 return ctx->cipher->p_einit(ctx->algctx, 678 key, 679 keylen, 680 numpipes, 681 iv, 682 ivlen, 683 NULL); 684 } 685 686 int EVP_CipherPipelineDecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, 687 const unsigned char *key, size_t keylen, 688 size_t numpipes, 689 const unsigned char **iv, size_t ivlen) 690 { 691 if (numpipes > EVP_MAX_PIPES) { 692 ERR_raise(ERR_LIB_EVP, EVP_R_TOO_MANY_PIPES); 693 return 0; 694 } 695 696 ctx->numpipes = numpipes; 697 698 if (!evp_cipher_init_internal(ctx, cipher, NULL, NULL, NULL, 0, 1, 699 NULL)) 700 return 0; 701 702 if (ctx->cipher->p_dinit == NULL) { 703 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 704 return 0; 705 } 706 707 return ctx->cipher->p_dinit(ctx->algctx, 708 key, 709 keylen, 710 numpipes, 711 iv, 712 ivlen, 713 NULL); 714 } 715 716 int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, 717 const unsigned char *in, int inl) 718 { 719 if (ctx->encrypt) 720 return EVP_EncryptUpdate(ctx, out, outl, in, inl); 721 else 722 return EVP_DecryptUpdate(ctx, out, outl, in, inl); 723 } 724 725 int EVP_CipherPipelineUpdate(EVP_CIPHER_CTX *ctx, 726 unsigned char **out, size_t *outl, 727 const size_t *outsize, 728 const unsigned char **in, const size_t *inl) 729 { 730 size_t i; 731 732 if (ossl_unlikely(outl == NULL || inl == NULL)) { 733 ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER); 734 return 0; 735 } 736 737 if (ossl_unlikely(ctx->cipher == NULL)) { 738 ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET); 739 return 0; 740 } 741 742 if (ossl_unlikely(ctx->cipher->prov == NULL)) { 743 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_OPERATION); 744 return 0; 745 } 746 747 if (ossl_unlikely(ctx->cipher->p_cupdate == NULL)) { 748 ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR); 749 return 0; 750 } 751 752 for (i = 0; i < ctx->numpipes; i++) 753 outl[i] = 0; 754 755 return ctx->cipher->p_cupdate(ctx->algctx, ctx->numpipes, 756 out, outl, outsize, 757 in, inl); 758 } 759 760 int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) 761 { 762 if (ctx->encrypt) 763 return EVP_EncryptFinal_ex(ctx, out, outl); 764 else 765 return EVP_DecryptFinal_ex(ctx, out, outl); 766 } 767 768 int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) 769 { 770 if (ctx->encrypt) 771 return EVP_EncryptFinal(ctx, out, outl); 772 else 773 return EVP_DecryptFinal(ctx, out, outl); 774 } 775 776 int EVP_CipherPipelineFinal(EVP_CIPHER_CTX *ctx, 777 unsigned char **out, size_t *outl, 778 const size_t *outsize) 779 { 780 size_t i; 781 782 if (ossl_unlikely(outl == NULL)) { 783 ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER); 784 return 0; 785 } 786 787 if (ossl_unlikely(ctx->cipher == NULL)) { 788 ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET); 789 return 0; 790 } 791 792 if (ossl_unlikely(ctx->cipher->prov == NULL)) { 793 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_OPERATION); 794 return 0; 795 } 796 797 if (ossl_unlikely(ctx->cipher->p_cfinal == NULL)) { 798 ERR_raise(ERR_LIB_EVP, EVP_R_FINAL_ERROR); 799 return 0; 800 } 801 802 for (i = 0; i < ctx->numpipes; i++) 803 outl[i] = 0; 804 805 return ctx->cipher->p_cfinal(ctx->algctx, ctx->numpipes, 806 out, outl, outsize); 807 } 808 809 int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, 810 const unsigned char *key, const unsigned char *iv) 811 { 812 return EVP_CipherInit(ctx, cipher, key, iv, 1); 813 } 814 815 int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, 816 ENGINE *impl, const unsigned char *key, 817 const unsigned char *iv) 818 { 819 return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 1); 820 } 821 822 int EVP_EncryptInit_ex2(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, 823 const unsigned char *key, const unsigned char *iv, 824 const OSSL_PARAM params[]) 825 { 826 return EVP_CipherInit_ex2(ctx, cipher, key, iv, 1, params); 827 } 828 829 int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, 830 const unsigned char *key, const unsigned char *iv) 831 { 832 return EVP_CipherInit(ctx, cipher, key, iv, 0); 833 } 834 835 int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, 836 ENGINE *impl, const unsigned char *key, 837 const unsigned char *iv) 838 { 839 return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 0); 840 } 841 842 int EVP_DecryptInit_ex2(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, 843 const unsigned char *key, const unsigned char *iv, 844 const OSSL_PARAM params[]) 845 { 846 return EVP_CipherInit_ex2(ctx, cipher, key, iv, 0, params); 847 } 848 849 /* 850 * According to the letter of standard difference between pointers 851 * is specified to be valid only within same object. This makes 852 * it formally challenging to determine if input and output buffers 853 * are not partially overlapping with standard pointer arithmetic. 854 */ 855 #ifdef PTRDIFF_T 856 #undef PTRDIFF_T 857 #endif 858 #if defined(OPENSSL_SYS_VMS) && __INITIAL_POINTER_SIZE == 64 859 /* 860 * Then we have VMS that distinguishes itself by adhering to 861 * sizeof(size_t)==4 even in 64-bit builds, which means that 862 * difference between two pointers might be truncated to 32 bits. 863 * In the context one can even wonder how comparison for 864 * equality is implemented. To be on the safe side we adhere to 865 * PTRDIFF_T even for comparison for equality. 866 */ 867 #define PTRDIFF_T uint64_t 868 #else 869 #define PTRDIFF_T size_t 870 #endif 871 872 int ossl_is_partially_overlapping(const void *ptr1, const void *ptr2, int len) 873 { 874 PTRDIFF_T diff = (PTRDIFF_T)ptr1 - (PTRDIFF_T)ptr2; 875 /* 876 * Check for partially overlapping buffers. [Binary logical 877 * operations are used instead of boolean to minimize number 878 * of conditional branches.] 879 */ 880 int overlapped = (len > 0) & (diff != 0) & ((diff < (PTRDIFF_T)len) | (diff > (0 - (PTRDIFF_T)len))); 881 882 return overlapped; 883 } 884 885 static int evp_EncryptDecryptUpdate(EVP_CIPHER_CTX *ctx, 886 unsigned char *out, int *outl, 887 const unsigned char *in, int inl) 888 { 889 int i, j, bl, cmpl = inl; 890 891 if (EVP_CIPHER_CTX_test_flags(ctx, EVP_CIPH_FLAG_LENGTH_BITS)) 892 cmpl = safe_div_round_up_int(cmpl, 8, NULL); 893 894 bl = ctx->cipher->block_size; 895 896 if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) { 897 /* If block size > 1 then the cipher will have to do this check */ 898 if (bl == 1 && ossl_is_partially_overlapping(out, in, cmpl)) { 899 ERR_raise(ERR_LIB_EVP, EVP_R_PARTIALLY_OVERLAPPING); 900 return 0; 901 } 902 903 i = ctx->cipher->do_cipher(ctx, out, in, inl); 904 if (i < 0) 905 return 0; 906 else 907 *outl = i; 908 return 1; 909 } 910 911 if (inl <= 0) { 912 *outl = 0; 913 return inl == 0; 914 } 915 if (ossl_is_partially_overlapping(out + ctx->buf_len, in, cmpl)) { 916 ERR_raise(ERR_LIB_EVP, EVP_R_PARTIALLY_OVERLAPPING); 917 return 0; 918 } 919 920 if (ctx->buf_len == 0 && (inl & (ctx->block_mask)) == 0) { 921 if (ctx->cipher->do_cipher(ctx, out, in, inl)) { 922 *outl = inl; 923 return 1; 924 } else { 925 *outl = 0; 926 return 0; 927 } 928 } 929 i = ctx->buf_len; 930 OPENSSL_assert(bl <= (int)sizeof(ctx->buf)); 931 if (i != 0) { 932 if (bl - i > inl) { 933 memcpy(&(ctx->buf[i]), in, inl); 934 ctx->buf_len += inl; 935 *outl = 0; 936 return 1; 937 } else { 938 j = bl - i; 939 940 /* 941 * Once we've processed the first j bytes from in, the amount of 942 * data left that is a multiple of the block length is: 943 * (inl - j) & ~(bl - 1) 944 * We must ensure that this amount of data, plus the one block that 945 * we process from ctx->buf does not exceed INT_MAX 946 */ 947 if (((inl - j) & ~(bl - 1)) > INT_MAX - bl) { 948 ERR_raise(ERR_LIB_EVP, EVP_R_OUTPUT_WOULD_OVERFLOW); 949 return 0; 950 } 951 memcpy(&(ctx->buf[i]), in, j); 952 inl -= j; 953 in += j; 954 if (!ctx->cipher->do_cipher(ctx, out, ctx->buf, bl)) 955 return 0; 956 out += bl; 957 *outl = bl; 958 } 959 } else 960 *outl = 0; 961 i = inl & (bl - 1); 962 inl -= i; 963 if (inl > 0) { 964 if (!ctx->cipher->do_cipher(ctx, out, in, inl)) 965 return 0; 966 *outl += inl; 967 } 968 969 if (i != 0) 970 memcpy(ctx->buf, &(in[inl]), i); 971 ctx->buf_len = i; 972 return 1; 973 } 974 975 int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, 976 const unsigned char *in, int inl) 977 { 978 int ret; 979 size_t soutl, inl_ = (size_t)inl; 980 int blocksize; 981 982 if (inl < 0) { 983 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_LENGTH); 984 return 0; 985 } 986 987 if (ossl_likely(outl != NULL)) { 988 *outl = 0; 989 } else { 990 ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER); 991 return 0; 992 } 993 994 /* Prevent accidental use of decryption context when encrypting */ 995 if (ossl_unlikely(!ctx->encrypt)) { 996 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_OPERATION); 997 return 0; 998 } 999 1000 if (ossl_unlikely(ctx->cipher == NULL)) { 1001 ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET); 1002 return 0; 1003 } 1004 1005 if (ossl_unlikely(ctx->cipher->prov == NULL)) 1006 goto legacy; 1007 1008 blocksize = ctx->cipher->block_size; 1009 1010 if (ossl_unlikely(ctx->cipher->cupdate == NULL || blocksize < 1)) { 1011 ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR); 1012 return 0; 1013 } 1014 1015 ret = ctx->cipher->cupdate(ctx->algctx, out, &soutl, 1016 inl_ + (size_t)(blocksize == 1 ? 0 : blocksize), 1017 in, inl_); 1018 1019 if (ossl_likely(ret)) { 1020 if (soutl > INT_MAX) { 1021 ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR); 1022 return 0; 1023 } 1024 *outl = soutl; 1025 } 1026 1027 return ret; 1028 1029 /* Code below to be removed when legacy support is dropped. */ 1030 legacy: 1031 1032 return evp_EncryptDecryptUpdate(ctx, out, outl, in, inl); 1033 } 1034 1035 int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) 1036 { 1037 int ret; 1038 ret = EVP_EncryptFinal_ex(ctx, out, outl); 1039 return ret; 1040 } 1041 1042 int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) 1043 { 1044 int n, ret; 1045 unsigned int i, b, bl; 1046 size_t soutl; 1047 int blocksize; 1048 1049 if (outl != NULL) { 1050 *outl = 0; 1051 } else { 1052 ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER); 1053 return 0; 1054 } 1055 1056 /* Prevent accidental use of decryption context when encrypting */ 1057 if (!ctx->encrypt) { 1058 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_OPERATION); 1059 return 0; 1060 } 1061 1062 if (ctx->cipher == NULL) { 1063 ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET); 1064 return 0; 1065 } 1066 if (ctx->cipher->prov == NULL) 1067 goto legacy; 1068 1069 blocksize = EVP_CIPHER_CTX_get_block_size(ctx); 1070 1071 if (blocksize < 1 || ctx->cipher->cfinal == NULL) { 1072 ERR_raise(ERR_LIB_EVP, EVP_R_FINAL_ERROR); 1073 return 0; 1074 } 1075 1076 ret = ctx->cipher->cfinal(ctx->algctx, out, &soutl, 1077 blocksize == 1 ? 0 : blocksize); 1078 1079 if (ret) { 1080 if (soutl > INT_MAX) { 1081 ERR_raise(ERR_LIB_EVP, EVP_R_FINAL_ERROR); 1082 return 0; 1083 } 1084 *outl = soutl; 1085 } 1086 1087 return ret; 1088 1089 /* Code below to be removed when legacy support is dropped. */ 1090 legacy: 1091 1092 if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) { 1093 ret = ctx->cipher->do_cipher(ctx, out, NULL, 0); 1094 if (ret < 0) 1095 return 0; 1096 else 1097 *outl = ret; 1098 return 1; 1099 } 1100 1101 b = ctx->cipher->block_size; 1102 OPENSSL_assert(b <= sizeof(ctx->buf)); 1103 if (b == 1) { 1104 *outl = 0; 1105 return 1; 1106 } 1107 bl = ctx->buf_len; 1108 if (ctx->flags & EVP_CIPH_NO_PADDING) { 1109 if (bl) { 1110 ERR_raise(ERR_LIB_EVP, EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH); 1111 return 0; 1112 } 1113 *outl = 0; 1114 return 1; 1115 } 1116 1117 n = b - bl; 1118 for (i = bl; i < b; i++) 1119 ctx->buf[i] = n; 1120 ret = ctx->cipher->do_cipher(ctx, out, ctx->buf, b); 1121 1122 if (ret) 1123 *outl = b; 1124 1125 return ret; 1126 } 1127 1128 int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, 1129 const unsigned char *in, int inl) 1130 { 1131 int fix_len, cmpl = inl, ret; 1132 unsigned int b; 1133 size_t soutl, inl_ = (size_t)inl; 1134 int blocksize; 1135 1136 if (inl < 0) { 1137 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_LENGTH); 1138 return 0; 1139 } 1140 1141 if (ossl_likely(outl != NULL)) { 1142 *outl = 0; 1143 } else { 1144 ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER); 1145 return 0; 1146 } 1147 1148 /* Prevent accidental use of encryption context when decrypting */ 1149 if (ossl_unlikely(ctx->encrypt)) { 1150 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_OPERATION); 1151 return 0; 1152 } 1153 1154 if (ossl_unlikely(ctx->cipher == NULL)) { 1155 ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET); 1156 return 0; 1157 } 1158 if (ossl_unlikely(ctx->cipher->prov == NULL)) 1159 goto legacy; 1160 1161 blocksize = EVP_CIPHER_CTX_get_block_size(ctx); 1162 1163 if (ossl_unlikely(ctx->cipher->cupdate == NULL || blocksize < 1)) { 1164 ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR); 1165 return 0; 1166 } 1167 ret = ctx->cipher->cupdate(ctx->algctx, out, &soutl, 1168 inl_ + (size_t)(blocksize == 1 ? 0 : blocksize), 1169 in, inl_); 1170 1171 if (ossl_likely(ret)) { 1172 if (soutl > INT_MAX) { 1173 ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR); 1174 return 0; 1175 } 1176 *outl = soutl; 1177 } 1178 1179 return ret; 1180 1181 /* Code below to be removed when legacy support is dropped. */ 1182 legacy: 1183 1184 b = ctx->cipher->block_size; 1185 1186 if (EVP_CIPHER_CTX_test_flags(ctx, EVP_CIPH_FLAG_LENGTH_BITS)) 1187 cmpl = safe_div_round_up_int(cmpl, 8, NULL); 1188 1189 if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) { 1190 if (b == 1 && ossl_is_partially_overlapping(out, in, cmpl)) { 1191 ERR_raise(ERR_LIB_EVP, EVP_R_PARTIALLY_OVERLAPPING); 1192 return 0; 1193 } 1194 1195 fix_len = ctx->cipher->do_cipher(ctx, out, in, inl); 1196 if (fix_len < 0) { 1197 *outl = 0; 1198 return 0; 1199 } else 1200 *outl = fix_len; 1201 return 1; 1202 } 1203 1204 if (inl <= 0) { 1205 *outl = 0; 1206 return inl == 0; 1207 } 1208 1209 if (ctx->flags & EVP_CIPH_NO_PADDING) 1210 return evp_EncryptDecryptUpdate(ctx, out, outl, in, inl); 1211 1212 OPENSSL_assert(b <= sizeof(ctx->final)); 1213 1214 if (ctx->final_used) { 1215 /* see comment about PTRDIFF_T comparison above */ 1216 if (((PTRDIFF_T)out == (PTRDIFF_T)in) 1217 || ossl_is_partially_overlapping(out, in, b)) { 1218 ERR_raise(ERR_LIB_EVP, EVP_R_PARTIALLY_OVERLAPPING); 1219 return 0; 1220 } 1221 /* 1222 * final_used is only ever set if buf_len is 0. Therefore the maximum 1223 * length output we will ever see from evp_EncryptDecryptUpdate is 1224 * the maximum multiple of the block length that is <= inl, or just: 1225 * inl & ~(b - 1) 1226 * Since final_used has been set then the final output length is: 1227 * (inl & ~(b - 1)) + b 1228 * This must never exceed INT_MAX 1229 */ 1230 if ((inl & ~(b - 1)) > INT_MAX - b) { 1231 ERR_raise(ERR_LIB_EVP, EVP_R_OUTPUT_WOULD_OVERFLOW); 1232 return 0; 1233 } 1234 memcpy(out, ctx->final, b); 1235 out += b; 1236 fix_len = 1; 1237 } else 1238 fix_len = 0; 1239 1240 if (!evp_EncryptDecryptUpdate(ctx, out, outl, in, inl)) 1241 return 0; 1242 1243 /* 1244 * if we have 'decrypted' a multiple of block size, make sure we have a 1245 * copy of this last block 1246 */ 1247 if (b > 1 && !ctx->buf_len) { 1248 *outl -= b; 1249 ctx->final_used = 1; 1250 memcpy(ctx->final, &out[*outl], b); 1251 } else 1252 ctx->final_used = 0; 1253 1254 if (fix_len) 1255 *outl += b; 1256 1257 return 1; 1258 } 1259 1260 int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) 1261 { 1262 int ret; 1263 ret = EVP_DecryptFinal_ex(ctx, out, outl); 1264 return ret; 1265 } 1266 1267 int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) 1268 { 1269 int i, n; 1270 unsigned int b; 1271 size_t soutl; 1272 int ret; 1273 int blocksize; 1274 1275 if (outl != NULL) { 1276 *outl = 0; 1277 } else { 1278 ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER); 1279 return 0; 1280 } 1281 1282 /* Prevent accidental use of encryption context when decrypting */ 1283 if (ctx->encrypt) { 1284 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_OPERATION); 1285 return 0; 1286 } 1287 1288 if (ctx->cipher == NULL) { 1289 ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET); 1290 return 0; 1291 } 1292 1293 if (ctx->cipher->prov == NULL) 1294 goto legacy; 1295 1296 blocksize = EVP_CIPHER_CTX_get_block_size(ctx); 1297 1298 if (blocksize < 1 || ctx->cipher->cfinal == NULL) { 1299 ERR_raise(ERR_LIB_EVP, EVP_R_FINAL_ERROR); 1300 return 0; 1301 } 1302 1303 ret = ctx->cipher->cfinal(ctx->algctx, out, &soutl, 1304 blocksize == 1 ? 0 : blocksize); 1305 1306 if (ret) { 1307 if (soutl > INT_MAX) { 1308 ERR_raise(ERR_LIB_EVP, EVP_R_FINAL_ERROR); 1309 return 0; 1310 } 1311 *outl = soutl; 1312 } 1313 1314 return ret; 1315 1316 /* Code below to be removed when legacy support is dropped. */ 1317 legacy: 1318 1319 *outl = 0; 1320 if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) { 1321 i = ctx->cipher->do_cipher(ctx, out, NULL, 0); 1322 if (i < 0) 1323 return 0; 1324 else 1325 *outl = i; 1326 return 1; 1327 } 1328 1329 b = ctx->cipher->block_size; 1330 if (ctx->flags & EVP_CIPH_NO_PADDING) { 1331 if (ctx->buf_len) { 1332 ERR_raise(ERR_LIB_EVP, EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH); 1333 return 0; 1334 } 1335 *outl = 0; 1336 return 1; 1337 } 1338 if (b > 1) { 1339 if (ctx->buf_len || !ctx->final_used) { 1340 ERR_raise(ERR_LIB_EVP, EVP_R_WRONG_FINAL_BLOCK_LENGTH); 1341 return 0; 1342 } 1343 OPENSSL_assert(b <= sizeof(ctx->final)); 1344 1345 /* 1346 * The following assumes that the ciphertext has been authenticated. 1347 * Otherwise it provides a padding oracle. 1348 */ 1349 n = ctx->final[b - 1]; 1350 if (n == 0 || n > (int)b) { 1351 ERR_raise(ERR_LIB_EVP, EVP_R_BAD_DECRYPT); 1352 return 0; 1353 } 1354 for (i = 0; i < n; i++) { 1355 if (ctx->final[--b] != n) { 1356 ERR_raise(ERR_LIB_EVP, EVP_R_BAD_DECRYPT); 1357 return 0; 1358 } 1359 } 1360 n = ctx->cipher->block_size - n; 1361 for (i = 0; i < n; i++) 1362 out[i] = ctx->final[i]; 1363 *outl = n; 1364 } 1365 return 1; 1366 } 1367 1368 int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int keylen) 1369 { 1370 if (c->cipher->prov != NULL) { 1371 int ok; 1372 OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END }; 1373 size_t len; 1374 1375 if (EVP_CIPHER_CTX_get_key_length(c) == keylen) 1376 return 1; 1377 1378 /* Check the cipher actually understands this parameter */ 1379 if (OSSL_PARAM_locate_const(EVP_CIPHER_settable_ctx_params(c->cipher), 1380 OSSL_CIPHER_PARAM_KEYLEN) 1381 == NULL) { 1382 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_KEY_LENGTH); 1383 return 0; 1384 } 1385 1386 params[0] = OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_KEYLEN, &len); 1387 if (!OSSL_PARAM_set_int(params, keylen)) 1388 return 0; 1389 ok = evp_do_ciph_ctx_setparams(c->cipher, c->algctx, params); 1390 if (ok <= 0) 1391 return 0; 1392 c->key_len = keylen; 1393 return 1; 1394 } 1395 1396 /* Code below to be removed when legacy support is dropped. */ 1397 1398 /* 1399 * Note there have never been any built-in ciphers that define this flag 1400 * since it was first introduced. 1401 */ 1402 if (c->cipher->flags & EVP_CIPH_CUSTOM_KEY_LENGTH) 1403 return EVP_CIPHER_CTX_ctrl(c, EVP_CTRL_SET_KEY_LENGTH, keylen, NULL); 1404 if (EVP_CIPHER_CTX_get_key_length(c) == keylen) 1405 return 1; 1406 if ((keylen > 0) && (c->cipher->flags & EVP_CIPH_VARIABLE_LENGTH)) { 1407 c->key_len = keylen; 1408 return 1; 1409 } 1410 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_KEY_LENGTH); 1411 return 0; 1412 } 1413 1414 int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad) 1415 { 1416 int ok; 1417 OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END }; 1418 unsigned int pd = pad; 1419 1420 if (pad) 1421 ctx->flags &= ~EVP_CIPH_NO_PADDING; 1422 else 1423 ctx->flags |= EVP_CIPH_NO_PADDING; 1424 1425 if (ctx->cipher != NULL && ctx->cipher->prov == NULL) 1426 return 1; 1427 params[0] = OSSL_PARAM_construct_uint(OSSL_CIPHER_PARAM_PADDING, &pd); 1428 ok = evp_do_ciph_ctx_setparams(ctx->cipher, ctx->algctx, params); 1429 1430 return ok != 0; 1431 } 1432 1433 int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr) 1434 { 1435 int ret = EVP_CTRL_RET_UNSUPPORTED; 1436 int set_params = 1; 1437 size_t sz = arg; 1438 unsigned int i; 1439 OSSL_PARAM params[4] = { 1440 OSSL_PARAM_END, OSSL_PARAM_END, OSSL_PARAM_END, OSSL_PARAM_END 1441 }; 1442 1443 if (ctx == NULL || ctx->cipher == NULL) { 1444 ERR_raise(ERR_LIB_EVP, EVP_R_NO_CIPHER_SET); 1445 return 0; 1446 } 1447 1448 if (ctx->cipher->prov == NULL) 1449 goto legacy; 1450 1451 switch (type) { 1452 case EVP_CTRL_SET_KEY_LENGTH: 1453 if (arg < 0) 1454 return 0; 1455 if (ctx->key_len == arg) 1456 /* Skip calling into provider if unchanged. */ 1457 return 1; 1458 params[0] = OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_KEYLEN, &sz); 1459 ctx->key_len = -1; 1460 break; 1461 case EVP_CTRL_RAND_KEY: /* Used by DES */ 1462 set_params = 0; 1463 params[0] = OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_RANDOM_KEY, 1464 ptr, sz); 1465 break; 1466 1467 case EVP_CTRL_INIT: 1468 /* 1469 * EVP_CTRL_INIT is purely legacy, no provider counterpart. 1470 * As a matter of fact, this should be dead code, but some caller 1471 * might still do a direct control call with this command, so... 1472 * Legacy methods return 1 except for exceptional circumstances, so 1473 * we do the same here to not be disruptive. 1474 */ 1475 return 1; 1476 case EVP_CTRL_SET_PIPELINE_OUTPUT_BUFS: /* Used by DASYNC */ 1477 default: 1478 goto end; 1479 case EVP_CTRL_AEAD_SET_IVLEN: 1480 if (arg < 0) 1481 return 0; 1482 if (ctx->iv_len == arg) 1483 /* Skip calling into provider if unchanged. */ 1484 return 1; 1485 params[0] = OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_IVLEN, &sz); 1486 ctx->iv_len = -1; 1487 break; 1488 case EVP_CTRL_CCM_SET_L: 1489 if (arg < 2 || arg > 8) 1490 return 0; 1491 sz = 15 - arg; 1492 params[0] = OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_IVLEN, &sz); 1493 ctx->iv_len = -1; 1494 break; 1495 case EVP_CTRL_AEAD_SET_IV_FIXED: 1496 params[0] = OSSL_PARAM_construct_octet_string( 1497 OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED, ptr, sz); 1498 break; 1499 case EVP_CTRL_GCM_IV_GEN: 1500 set_params = 0; 1501 if (arg < 0) 1502 sz = 0; /* special case that uses the iv length */ 1503 params[0] = OSSL_PARAM_construct_octet_string( 1504 OSSL_CIPHER_PARAM_AEAD_TLS1_GET_IV_GEN, ptr, sz); 1505 break; 1506 case EVP_CTRL_GCM_SET_IV_INV: 1507 if (arg < 0) 1508 return 0; 1509 params[0] = OSSL_PARAM_construct_octet_string( 1510 OSSL_CIPHER_PARAM_AEAD_TLS1_SET_IV_INV, ptr, sz); 1511 break; 1512 case EVP_CTRL_GET_RC5_ROUNDS: 1513 set_params = 0; /* Fall thru */ 1514 case EVP_CTRL_SET_RC5_ROUNDS: 1515 if (arg < 0) 1516 return 0; 1517 i = (unsigned int)arg; 1518 params[0] = OSSL_PARAM_construct_uint(OSSL_CIPHER_PARAM_ROUNDS, &i); 1519 break; 1520 case EVP_CTRL_SET_SPEED: 1521 if (arg < 0) 1522 return 0; 1523 i = (unsigned int)arg; 1524 params[0] = OSSL_PARAM_construct_uint(OSSL_CIPHER_PARAM_SPEED, &i); 1525 break; 1526 case EVP_CTRL_AEAD_GET_TAG: 1527 set_params = 0; /* Fall thru */ 1528 case EVP_CTRL_AEAD_SET_TAG: 1529 params[0] = OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG, 1530 ptr, sz); 1531 break; 1532 case EVP_CTRL_AEAD_TLS1_AAD: 1533 /* This one does a set and a get - since it returns a size */ 1534 params[0] = OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD, 1535 ptr, sz); 1536 ret = evp_do_ciph_ctx_setparams(ctx->cipher, ctx->algctx, params); 1537 if (ret <= 0) 1538 goto end; 1539 params[0] = OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD, &sz); 1540 ret = evp_do_ciph_ctx_getparams(ctx->cipher, ctx->algctx, params); 1541 if (ret <= 0) 1542 goto end; 1543 return sz; 1544 #ifndef OPENSSL_NO_RC2 1545 case EVP_CTRL_GET_RC2_KEY_BITS: 1546 set_params = 0; /* Fall thru */ 1547 case EVP_CTRL_SET_RC2_KEY_BITS: 1548 params[0] = OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_RC2_KEYBITS, &sz); 1549 break; 1550 #endif /* OPENSSL_NO_RC2 */ 1551 #if !defined(OPENSSL_NO_MULTIBLOCK) 1552 case EVP_CTRL_TLS1_1_MULTIBLOCK_MAX_BUFSIZE: 1553 params[0] = OSSL_PARAM_construct_size_t( 1554 OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_SEND_FRAGMENT, &sz); 1555 ret = evp_do_ciph_ctx_setparams(ctx->cipher, ctx->algctx, params); 1556 if (ret <= 0) 1557 return 0; 1558 1559 params[0] = OSSL_PARAM_construct_size_t( 1560 OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_BUFSIZE, &sz); 1561 params[1] = OSSL_PARAM_construct_end(); 1562 ret = evp_do_ciph_ctx_getparams(ctx->cipher, ctx->algctx, params); 1563 if (ret <= 0) 1564 return 0; 1565 return sz; 1566 case EVP_CTRL_TLS1_1_MULTIBLOCK_AAD: { 1567 EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM *p = (EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM *)ptr; 1568 1569 if (arg < (int)sizeof(EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM)) 1570 return 0; 1571 1572 params[0] = OSSL_PARAM_construct_octet_string( 1573 OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD, (void *)p->inp, p->len); 1574 params[1] = OSSL_PARAM_construct_uint( 1575 OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE, &p->interleave); 1576 ret = evp_do_ciph_ctx_setparams(ctx->cipher, ctx->algctx, params); 1577 if (ret <= 0) 1578 return ret; 1579 /* Retrieve the return values changed by the set */ 1580 params[0] = OSSL_PARAM_construct_size_t( 1581 OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD_PACKLEN, &sz); 1582 params[1] = OSSL_PARAM_construct_uint( 1583 OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE, &p->interleave); 1584 params[2] = OSSL_PARAM_construct_end(); 1585 ret = evp_do_ciph_ctx_getparams(ctx->cipher, ctx->algctx, params); 1586 if (ret <= 0) 1587 return 0; 1588 return sz; 1589 } 1590 case EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT: { 1591 EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM *p = (EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM *)ptr; 1592 1593 params[0] = OSSL_PARAM_construct_octet_string( 1594 OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC, p->out, p->len); 1595 1596 params[1] = OSSL_PARAM_construct_octet_string( 1597 OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_IN, (void *)p->inp, 1598 p->len); 1599 params[2] = OSSL_PARAM_construct_uint( 1600 OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE, &p->interleave); 1601 ret = evp_do_ciph_ctx_setparams(ctx->cipher, ctx->algctx, params); 1602 if (ret <= 0) 1603 return ret; 1604 params[0] = OSSL_PARAM_construct_size_t( 1605 OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_LEN, &sz); 1606 params[1] = OSSL_PARAM_construct_end(); 1607 ret = evp_do_ciph_ctx_getparams(ctx->cipher, ctx->algctx, params); 1608 if (ret <= 0) 1609 return 0; 1610 return sz; 1611 } 1612 #endif /* OPENSSL_NO_MULTIBLOCK */ 1613 case EVP_CTRL_AEAD_SET_MAC_KEY: 1614 if (arg < 0) 1615 return -1; 1616 params[0] = OSSL_PARAM_construct_octet_string( 1617 OSSL_CIPHER_PARAM_AEAD_MAC_KEY, ptr, sz); 1618 break; 1619 } 1620 1621 if (set_params) 1622 ret = evp_do_ciph_ctx_setparams(ctx->cipher, ctx->algctx, params); 1623 else 1624 ret = evp_do_ciph_ctx_getparams(ctx->cipher, ctx->algctx, params); 1625 goto end; 1626 1627 /* Code below to be removed when legacy support is dropped. */ 1628 legacy: 1629 if (ctx->cipher->ctrl == NULL) { 1630 ERR_raise(ERR_LIB_EVP, EVP_R_CTRL_NOT_IMPLEMENTED); 1631 return 0; 1632 } 1633 1634 ret = ctx->cipher->ctrl(ctx, type, arg, ptr); 1635 1636 end: 1637 if (ret == EVP_CTRL_RET_UNSUPPORTED) { 1638 ERR_raise(ERR_LIB_EVP, EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED); 1639 return 0; 1640 } 1641 return ret; 1642 } 1643 1644 int EVP_CIPHER_get_params(EVP_CIPHER *cipher, OSSL_PARAM params[]) 1645 { 1646 if (cipher != NULL && cipher->get_params != NULL) 1647 return cipher->get_params(params); 1648 return 0; 1649 } 1650 1651 int EVP_CIPHER_CTX_set_params(EVP_CIPHER_CTX *ctx, const OSSL_PARAM params[]) 1652 { 1653 int r = 0; 1654 const OSSL_PARAM *p; 1655 1656 if (ctx->cipher != NULL && ctx->cipher->set_ctx_params != NULL) { 1657 r = ctx->cipher->set_ctx_params(ctx->algctx, params); 1658 if (r > 0) { 1659 p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_KEYLEN); 1660 if (p != NULL && !OSSL_PARAM_get_int(p, &ctx->key_len)) { 1661 r = 0; 1662 ctx->key_len = -1; 1663 } 1664 } 1665 if (r > 0) { 1666 p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_IVLEN); 1667 if (p != NULL && !OSSL_PARAM_get_int(p, &ctx->iv_len)) { 1668 r = 0; 1669 ctx->iv_len = -1; 1670 } 1671 } 1672 } 1673 return r; 1674 } 1675 1676 int EVP_CIPHER_CTX_get_params(EVP_CIPHER_CTX *ctx, OSSL_PARAM params[]) 1677 { 1678 if (ctx->cipher != NULL && ctx->cipher->get_ctx_params != NULL) 1679 return ctx->cipher->get_ctx_params(ctx->algctx, params); 1680 return 0; 1681 } 1682 1683 const OSSL_PARAM *EVP_CIPHER_gettable_params(const EVP_CIPHER *cipher) 1684 { 1685 if (cipher != NULL && cipher->gettable_params != NULL) 1686 return cipher->gettable_params( 1687 ossl_provider_ctx(EVP_CIPHER_get0_provider(cipher))); 1688 return NULL; 1689 } 1690 1691 const OSSL_PARAM *EVP_CIPHER_settable_ctx_params(const EVP_CIPHER *cipher) 1692 { 1693 void *provctx; 1694 1695 if (cipher != NULL && cipher->settable_ctx_params != NULL) { 1696 provctx = ossl_provider_ctx(EVP_CIPHER_get0_provider(cipher)); 1697 return cipher->settable_ctx_params(NULL, provctx); 1698 } 1699 return NULL; 1700 } 1701 1702 const OSSL_PARAM *EVP_CIPHER_gettable_ctx_params(const EVP_CIPHER *cipher) 1703 { 1704 void *provctx; 1705 1706 if (cipher != NULL && cipher->gettable_ctx_params != NULL) { 1707 provctx = ossl_provider_ctx(EVP_CIPHER_get0_provider(cipher)); 1708 return cipher->gettable_ctx_params(NULL, provctx); 1709 } 1710 return NULL; 1711 } 1712 1713 const OSSL_PARAM *EVP_CIPHER_CTX_settable_params(EVP_CIPHER_CTX *cctx) 1714 { 1715 void *alg; 1716 1717 if (cctx != NULL && cctx->cipher->settable_ctx_params != NULL) { 1718 alg = ossl_provider_ctx(EVP_CIPHER_get0_provider(cctx->cipher)); 1719 return cctx->cipher->settable_ctx_params(cctx->algctx, alg); 1720 } 1721 return NULL; 1722 } 1723 1724 const OSSL_PARAM *EVP_CIPHER_CTX_gettable_params(EVP_CIPHER_CTX *cctx) 1725 { 1726 void *provctx; 1727 1728 if (cctx != NULL && cctx->cipher->gettable_ctx_params != NULL) { 1729 provctx = ossl_provider_ctx(EVP_CIPHER_get0_provider(cctx->cipher)); 1730 return cctx->cipher->gettable_ctx_params(cctx->algctx, provctx); 1731 } 1732 return NULL; 1733 } 1734 1735 #ifndef FIPS_MODULE 1736 static OSSL_LIB_CTX *EVP_CIPHER_CTX_get_libctx(EVP_CIPHER_CTX *ctx) 1737 { 1738 const EVP_CIPHER *cipher = ctx->cipher; 1739 const OSSL_PROVIDER *prov; 1740 1741 if (cipher == NULL) 1742 return NULL; 1743 1744 prov = EVP_CIPHER_get0_provider(cipher); 1745 return ossl_provider_libctx(prov); 1746 } 1747 #endif 1748 1749 int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key) 1750 { 1751 if (ctx->cipher->flags & EVP_CIPH_RAND_KEY) 1752 return EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_RAND_KEY, 0, key); 1753 1754 #ifdef FIPS_MODULE 1755 return 0; 1756 #else 1757 { 1758 int kl; 1759 OSSL_LIB_CTX *libctx = EVP_CIPHER_CTX_get_libctx(ctx); 1760 1761 kl = EVP_CIPHER_CTX_get_key_length(ctx); 1762 if (kl <= 0 || RAND_priv_bytes_ex(libctx, key, kl, 0) <= 0) 1763 return 0; 1764 return 1; 1765 } 1766 #endif /* FIPS_MODULE */ 1767 } 1768 1769 EVP_CIPHER_CTX *EVP_CIPHER_CTX_dup(const EVP_CIPHER_CTX *in) 1770 { 1771 EVP_CIPHER_CTX *out = EVP_CIPHER_CTX_new(); 1772 1773 if (out != NULL && !EVP_CIPHER_CTX_copy(out, in)) { 1774 EVP_CIPHER_CTX_free(out); 1775 out = NULL; 1776 } 1777 return out; 1778 } 1779 1780 int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in) 1781 { 1782 if ((in == NULL) || (in->cipher == NULL)) { 1783 ERR_raise(ERR_LIB_EVP, EVP_R_INPUT_NOT_INITIALIZED); 1784 return 0; 1785 } 1786 1787 if (in->cipher->prov == NULL) 1788 goto legacy; 1789 1790 if (in->cipher->dupctx == NULL) { 1791 ERR_raise(ERR_LIB_EVP, EVP_R_NOT_ABLE_TO_COPY_CTX); 1792 return 0; 1793 } 1794 1795 EVP_CIPHER_CTX_reset(out); 1796 1797 *out = *in; 1798 out->algctx = NULL; 1799 1800 if (in->fetched_cipher != NULL && !EVP_CIPHER_up_ref(in->fetched_cipher)) { 1801 out->fetched_cipher = NULL; 1802 return 0; 1803 } 1804 1805 out->algctx = in->cipher->dupctx(in->algctx); 1806 if (out->algctx == NULL) { 1807 ERR_raise(ERR_LIB_EVP, EVP_R_NOT_ABLE_TO_COPY_CTX); 1808 return 0; 1809 } 1810 1811 return 1; 1812 1813 /* Code below to be removed when legacy support is dropped. */ 1814 legacy: 1815 1816 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODULE) 1817 /* Make sure it's safe to copy a cipher context using an ENGINE */ 1818 if (in->engine && !ENGINE_init(in->engine)) { 1819 ERR_raise(ERR_LIB_EVP, ERR_R_ENGINE_LIB); 1820 return 0; 1821 } 1822 #endif 1823 1824 EVP_CIPHER_CTX_reset(out); 1825 memcpy(out, in, sizeof(*out)); 1826 1827 if (in->cipher_data && in->cipher->ctx_size) { 1828 out->cipher_data = OPENSSL_malloc(in->cipher->ctx_size); 1829 if (out->cipher_data == NULL) { 1830 out->cipher = NULL; 1831 return 0; 1832 } 1833 memcpy(out->cipher_data, in->cipher_data, in->cipher->ctx_size); 1834 } 1835 1836 if (in->cipher->flags & EVP_CIPH_CUSTOM_COPY) 1837 if (!in->cipher->ctrl((EVP_CIPHER_CTX *)in, EVP_CTRL_COPY, 0, out)) { 1838 out->cipher = NULL; 1839 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR); 1840 return 0; 1841 } 1842 return 1; 1843 } 1844 1845 EVP_CIPHER *evp_cipher_new(void) 1846 { 1847 EVP_CIPHER *cipher = OPENSSL_zalloc(sizeof(EVP_CIPHER)); 1848 1849 if (cipher != NULL && !CRYPTO_NEW_REF(&cipher->refcnt, 1)) { 1850 OPENSSL_free(cipher); 1851 return NULL; 1852 } 1853 return cipher; 1854 } 1855 1856 /* 1857 * FIPS module note: since internal fetches will be entirely 1858 * provider based, we know that none of its code depends on legacy 1859 * NIDs or any functionality that use them. 1860 */ 1861 #ifndef FIPS_MODULE 1862 /* After removal of legacy support get rid of the need for legacy NIDs */ 1863 static void set_legacy_nid(const char *name, void *vlegacy_nid) 1864 { 1865 int nid; 1866 int *legacy_nid = vlegacy_nid; 1867 /* 1868 * We use lowest level function to get the associated method, because 1869 * higher level functions such as EVP_get_cipherbyname() have changed 1870 * to look at providers too. 1871 */ 1872 const void *legacy_method = OBJ_NAME_get(name, OBJ_NAME_TYPE_CIPHER_METH); 1873 1874 if (*legacy_nid == -1) /* We found a clash already */ 1875 return; 1876 if (legacy_method == NULL) 1877 return; 1878 nid = EVP_CIPHER_get_nid(legacy_method); 1879 if (*legacy_nid != NID_undef && *legacy_nid != nid) { 1880 *legacy_nid = -1; 1881 return; 1882 } 1883 *legacy_nid = nid; 1884 } 1885 #endif 1886 1887 static void *evp_cipher_from_algorithm(const int name_id, 1888 const OSSL_ALGORITHM *algodef, 1889 OSSL_PROVIDER *prov) 1890 { 1891 const OSSL_DISPATCH *fns = algodef->implementation; 1892 EVP_CIPHER *cipher = NULL; 1893 int fnciphcnt = 0, encinit = 0, decinit = 0, fnpipecnt = 0, fnctxcnt = 0; 1894 1895 if ((cipher = evp_cipher_new()) == NULL) { 1896 ERR_raise(ERR_LIB_EVP, ERR_R_EVP_LIB); 1897 return NULL; 1898 } 1899 1900 #ifndef FIPS_MODULE 1901 cipher->nid = NID_undef; 1902 if (!evp_names_do_all(prov, name_id, set_legacy_nid, &cipher->nid) 1903 || cipher->nid == -1) { 1904 ERR_raise(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR); 1905 goto err; 1906 } 1907 #endif 1908 1909 cipher->name_id = name_id; 1910 if ((cipher->type_name = ossl_algorithm_get1_first_name(algodef)) == NULL) 1911 goto err; 1912 1913 cipher->description = algodef->algorithm_description; 1914 1915 for (; fns->function_id != 0; fns++) { 1916 switch (fns->function_id) { 1917 case OSSL_FUNC_CIPHER_NEWCTX: 1918 if (cipher->newctx != NULL) 1919 break; 1920 cipher->newctx = OSSL_FUNC_cipher_newctx(fns); 1921 fnctxcnt++; 1922 break; 1923 case OSSL_FUNC_CIPHER_ENCRYPT_INIT: 1924 if (cipher->einit != NULL) 1925 break; 1926 cipher->einit = OSSL_FUNC_cipher_encrypt_init(fns); 1927 encinit = 1; 1928 break; 1929 case OSSL_FUNC_CIPHER_DECRYPT_INIT: 1930 if (cipher->dinit != NULL) 1931 break; 1932 cipher->dinit = OSSL_FUNC_cipher_decrypt_init(fns); 1933 decinit = 1; 1934 break; 1935 case OSSL_FUNC_CIPHER_ENCRYPT_SKEY_INIT: 1936 if (cipher->einit_skey != NULL) 1937 break; 1938 cipher->einit_skey = OSSL_FUNC_cipher_encrypt_skey_init(fns); 1939 encinit = 1; 1940 break; 1941 case OSSL_FUNC_CIPHER_DECRYPT_SKEY_INIT: 1942 if (cipher->dinit_skey != NULL) 1943 break; 1944 cipher->dinit_skey = OSSL_FUNC_cipher_decrypt_skey_init(fns); 1945 decinit = 1; 1946 break; 1947 case OSSL_FUNC_CIPHER_UPDATE: 1948 if (cipher->cupdate != NULL) 1949 break; 1950 cipher->cupdate = OSSL_FUNC_cipher_update(fns); 1951 fnciphcnt++; 1952 break; 1953 case OSSL_FUNC_CIPHER_FINAL: 1954 if (cipher->cfinal != NULL) 1955 break; 1956 cipher->cfinal = OSSL_FUNC_cipher_final(fns); 1957 fnciphcnt++; 1958 break; 1959 case OSSL_FUNC_CIPHER_CIPHER: 1960 if (cipher->ccipher != NULL) 1961 break; 1962 cipher->ccipher = OSSL_FUNC_cipher_cipher(fns); 1963 break; 1964 case OSSL_FUNC_CIPHER_PIPELINE_ENCRYPT_INIT: 1965 if (cipher->p_einit != NULL) 1966 break; 1967 cipher->p_einit = OSSL_FUNC_cipher_pipeline_encrypt_init(fns); 1968 fnpipecnt++; 1969 break; 1970 case OSSL_FUNC_CIPHER_PIPELINE_DECRYPT_INIT: 1971 if (cipher->p_dinit != NULL) 1972 break; 1973 cipher->p_dinit = OSSL_FUNC_cipher_pipeline_decrypt_init(fns); 1974 fnpipecnt++; 1975 break; 1976 case OSSL_FUNC_CIPHER_PIPELINE_UPDATE: 1977 if (cipher->p_cupdate != NULL) 1978 break; 1979 cipher->p_cupdate = OSSL_FUNC_cipher_pipeline_update(fns); 1980 fnpipecnt++; 1981 break; 1982 case OSSL_FUNC_CIPHER_PIPELINE_FINAL: 1983 if (cipher->p_cfinal != NULL) 1984 break; 1985 cipher->p_cfinal = OSSL_FUNC_cipher_pipeline_final(fns); 1986 fnpipecnt++; 1987 break; 1988 case OSSL_FUNC_CIPHER_FREECTX: 1989 if (cipher->freectx != NULL) 1990 break; 1991 cipher->freectx = OSSL_FUNC_cipher_freectx(fns); 1992 fnctxcnt++; 1993 break; 1994 case OSSL_FUNC_CIPHER_DUPCTX: 1995 if (cipher->dupctx != NULL) 1996 break; 1997 cipher->dupctx = OSSL_FUNC_cipher_dupctx(fns); 1998 break; 1999 case OSSL_FUNC_CIPHER_GET_PARAMS: 2000 if (cipher->get_params != NULL) 2001 break; 2002 cipher->get_params = OSSL_FUNC_cipher_get_params(fns); 2003 break; 2004 case OSSL_FUNC_CIPHER_GET_CTX_PARAMS: 2005 if (cipher->get_ctx_params != NULL) 2006 break; 2007 cipher->get_ctx_params = OSSL_FUNC_cipher_get_ctx_params(fns); 2008 break; 2009 case OSSL_FUNC_CIPHER_SET_CTX_PARAMS: 2010 if (cipher->set_ctx_params != NULL) 2011 break; 2012 cipher->set_ctx_params = OSSL_FUNC_cipher_set_ctx_params(fns); 2013 break; 2014 case OSSL_FUNC_CIPHER_GETTABLE_PARAMS: 2015 if (cipher->gettable_params != NULL) 2016 break; 2017 cipher->gettable_params = OSSL_FUNC_cipher_gettable_params(fns); 2018 break; 2019 case OSSL_FUNC_CIPHER_GETTABLE_CTX_PARAMS: 2020 if (cipher->gettable_ctx_params != NULL) 2021 break; 2022 cipher->gettable_ctx_params = OSSL_FUNC_cipher_gettable_ctx_params(fns); 2023 break; 2024 case OSSL_FUNC_CIPHER_SETTABLE_CTX_PARAMS: 2025 if (cipher->settable_ctx_params != NULL) 2026 break; 2027 cipher->settable_ctx_params = OSSL_FUNC_cipher_settable_ctx_params(fns); 2028 break; 2029 } 2030 } 2031 fnciphcnt += encinit + decinit; 2032 if ((fnciphcnt != 0 && fnciphcnt != 3 && fnciphcnt != 4) 2033 || (fnciphcnt == 0 && cipher->ccipher == NULL && fnpipecnt == 0) 2034 || (fnpipecnt != 0 && (fnpipecnt < 3 || cipher->p_cupdate == NULL || cipher->p_cfinal == NULL)) 2035 || fnctxcnt != 2) { 2036 /* 2037 * In order to be a consistent set of functions we must have at least 2038 * a complete set of "encrypt" functions, or a complete set of "decrypt" 2039 * functions, or a single "cipher" function. In all cases we need both 2040 * the "newctx" and "freectx" functions. 2041 */ 2042 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS); 2043 goto err; 2044 } 2045 if (prov != NULL && !ossl_provider_up_ref(prov)) 2046 goto err; 2047 2048 cipher->prov = prov; 2049 2050 if (!evp_cipher_cache_constants(cipher)) { 2051 ERR_raise(ERR_LIB_EVP, EVP_R_CACHE_CONSTANTS_FAILED); 2052 goto err; 2053 } 2054 2055 return cipher; 2056 2057 err: 2058 EVP_CIPHER_free(cipher); 2059 return NULL; 2060 } 2061 2062 static int evp_cipher_up_ref(void *cipher) 2063 { 2064 return EVP_CIPHER_up_ref(cipher); 2065 } 2066 2067 static void evp_cipher_free(void *cipher) 2068 { 2069 EVP_CIPHER_free(cipher); 2070 } 2071 2072 EVP_CIPHER *EVP_CIPHER_fetch(OSSL_LIB_CTX *ctx, const char *algorithm, 2073 const char *properties) 2074 { 2075 EVP_CIPHER *cipher = evp_generic_fetch(ctx, OSSL_OP_CIPHER, algorithm, properties, 2076 evp_cipher_from_algorithm, evp_cipher_up_ref, 2077 evp_cipher_free); 2078 2079 return cipher; 2080 } 2081 2082 EVP_CIPHER *evp_cipher_fetch_from_prov(OSSL_PROVIDER *prov, 2083 const char *algorithm, 2084 const char *properties) 2085 { 2086 return evp_generic_fetch_from_prov(prov, OSSL_OP_CIPHER, 2087 algorithm, properties, 2088 evp_cipher_from_algorithm, 2089 evp_cipher_up_ref, 2090 evp_cipher_free); 2091 } 2092 2093 int EVP_CIPHER_can_pipeline(const EVP_CIPHER *cipher, int enc) 2094 { 2095 if (((enc && cipher->p_einit != NULL) || (!enc && cipher->p_dinit != NULL)) 2096 && cipher->p_cupdate != NULL && cipher->p_cfinal != NULL) 2097 return 1; 2098 2099 return 0; 2100 } 2101 2102 int EVP_CIPHER_up_ref(EVP_CIPHER *cipher) 2103 { 2104 int ref = 0; 2105 2106 if (cipher->origin == EVP_ORIG_DYNAMIC) 2107 CRYPTO_UP_REF(&cipher->refcnt, &ref); 2108 return 1; 2109 } 2110 2111 void evp_cipher_free_int(EVP_CIPHER *cipher) 2112 { 2113 OPENSSL_free(cipher->type_name); 2114 ossl_provider_free(cipher->prov); 2115 CRYPTO_FREE_REF(&cipher->refcnt); 2116 OPENSSL_free(cipher); 2117 } 2118 2119 void EVP_CIPHER_free(EVP_CIPHER *cipher) 2120 { 2121 int i; 2122 2123 if (cipher == NULL || cipher->origin != EVP_ORIG_DYNAMIC) 2124 return; 2125 2126 CRYPTO_DOWN_REF(&cipher->refcnt, &i); 2127 if (i > 0) 2128 return; 2129 evp_cipher_free_int(cipher); 2130 } 2131 2132 void EVP_CIPHER_do_all_provided(OSSL_LIB_CTX *libctx, 2133 void (*fn)(EVP_CIPHER *mac, void *arg), 2134 void *arg) 2135 { 2136 evp_generic_do_all(libctx, OSSL_OP_CIPHER, 2137 (void (*)(void *, void *))fn, arg, 2138 evp_cipher_from_algorithm, evp_cipher_up_ref, 2139 evp_cipher_free); 2140 } 2141