summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authortb <>2023-10-26 07:57:54 +0000
committertb <>2023-10-26 07:57:54 +0000
commit2ed7c6c6a013624f8a2f68bc8ceb16f790650c17 (patch)
treee1725cf93b7b8f6cc50b27f4f729408b98577979 /src/lib
parentfb35c4b4f6b87177cd121d1f1811a2557cc872f8 (diff)
downloadopenbsd-2ed7c6c6a013624f8a2f68bc8ceb16f790650c17.tar.gz
openbsd-2ed7c6c6a013624f8a2f68bc8ceb16f790650c17.tar.bz2
openbsd-2ed7c6c6a013624f8a2f68bc8ceb16f790650c17.zip
Rework the MD setting in the RSA ASN.1 method
This streamlines the code to use safer idioms, do proper error checking and be slightly less convoluted. Sprinkle a few references to RFC 8017 and explain better what we are doing and why. Clarify ownership and use more consistent style. This removes the last internal use of X509_ALGOR_set_md(). ok jsing
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/rsa/rsa_ameth.c140
1 files changed, 95 insertions, 45 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_ameth.c b/src/lib/libcrypto/rsa/rsa_ameth.c
index ae38c205af..43f52f749a 100644
--- a/src/lib/libcrypto/rsa/rsa_ameth.c
+++ b/src/lib/libcrypto/rsa/rsa_ameth.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: rsa_ameth.c,v 1.33 2023/08/12 08:02:43 tb Exp $ */ 1/* $OpenBSD: rsa_ameth.c,v 1.34 2023/10/26 07:57:54 tb Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2006. 3 * project 2006.
4 */ 4 */
@@ -72,6 +72,7 @@
72#include "cryptlib.h" 72#include "cryptlib.h"
73#include "evp_local.h" 73#include "evp_local.h"
74#include "rsa_local.h" 74#include "rsa_local.h"
75#include "x509_local.h"
75 76
76#ifndef OPENSSL_NO_CMS 77#ifndef OPENSSL_NO_CMS
77static int rsa_cms_sign(CMS_SignerInfo *si); 78static int rsa_cms_sign(CMS_SignerInfo *si);
@@ -574,45 +575,82 @@ rsa_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2)
574 return 1; 575 return 1;
575} 576}
576 577
577/* Allocate and set algorithm ID from EVP_MD, defaults to SHA1. */
578static int 578static int
579rsa_md_to_algor(X509_ALGOR **palg, const EVP_MD *md) 579rsa_md_to_algor(const EVP_MD *md, X509_ALGOR **out_alg)
580{ 580{
581 X509_ALGOR *alg = NULL;
582 int ret = 0;
583
584 X509_ALGOR_free(*out_alg);
585 *out_alg = NULL;
586
587 /* RFC 8017 - default hash is SHA-1 and hence omitted. */
581 if (md == NULL || EVP_MD_type(md) == NID_sha1) 588 if (md == NULL || EVP_MD_type(md) == NID_sha1)
582 return 1; 589 goto done;
583 *palg = X509_ALGOR_new(); 590
584 if (*palg == NULL) 591 if ((alg = X509_ALGOR_new()) == NULL)
585 return 0; 592 goto err;
586 X509_ALGOR_set_md(*palg, md); 593 if (!X509_ALGOR_set_evp_md(alg, md))
587 return 1; 594 goto err;
595
596 done:
597 *out_alg = alg;
598 alg = NULL;
599
600 ret = 1;
601
602 err:
603 X509_ALGOR_free(alg);
604
605 return ret;
588} 606}
589 607
590/* Allocate and set MGF1 algorithm ID from EVP_MD. */ 608/*
609 * RFC 8017, A.2.1 and A.2.3 - encode maskGenAlgorithm for RSAES-OAEP
610 * and RSASSA-PSS. The default is mgfSHA1 and hence omitted.
611 */
591static int 612static int
592rsa_md_to_mgf1(X509_ALGOR **palg, const EVP_MD *mgf1md) 613rsa_mgf1md_to_maskGenAlgorithm(const EVP_MD *mgf1md, X509_ALGOR **out_alg)
593{ 614{
594 X509_ALGOR *algtmp = NULL; 615 X509_ALGOR *alg = NULL;
595 ASN1_STRING *stmp = NULL; 616 X509_ALGOR *inner_alg = NULL;
617 ASN1_STRING *astr = NULL;
618 ASN1_OBJECT *aobj;
619 int ret = 0;
620
621 X509_ALGOR_free(*out_alg);
622 *out_alg = NULL;
596 623
597 *palg = NULL;
598 if (mgf1md == NULL || EVP_MD_type(mgf1md) == NID_sha1) 624 if (mgf1md == NULL || EVP_MD_type(mgf1md) == NID_sha1)
599 return 1; 625 goto done;
600 /* need to embed algorithm ID inside another */ 626
601 if (!rsa_md_to_algor(&algtmp, mgf1md)) 627 if ((inner_alg = X509_ALGOR_new()) == NULL)
602 goto err; 628 goto err;
603 if (ASN1_item_pack(algtmp, &X509_ALGOR_it, &stmp) == NULL) 629 if (!X509_ALGOR_set_evp_md(inner_alg, mgf1md))
604 goto err; 630 goto err;
605 *palg = X509_ALGOR_new(); 631 if ((astr = ASN1_item_pack(inner_alg, &X509_ALGOR_it, NULL)) == NULL)
606 if (*palg == NULL) 632 goto err;
633
634 if ((alg = X509_ALGOR_new()) == NULL)
607 goto err; 635 goto err;
608 X509_ALGOR_set0(*palg, OBJ_nid2obj(NID_mgf1), V_ASN1_SEQUENCE, stmp); 636 if ((aobj = OBJ_nid2obj(NID_mgf1)) == NULL)
609 stmp = NULL; 637 goto err;
638 if (!X509_ALGOR_set0(alg, aobj, V_ASN1_SEQUENCE, astr))
639 goto err;
640 astr = NULL;
641
642 done:
643 *out_alg = alg;
644 alg = NULL;
645
646 ret = 1;
647
610 err: 648 err:
611 ASN1_STRING_free(stmp); 649 X509_ALGOR_free(alg);
612 X509_ALGOR_free(algtmp); 650 X509_ALGOR_free(inner_alg);
613 if (*palg) 651 ASN1_STRING_free(astr);
614 return 1; 652
615 return 0; 653 return ret;
616} 654}
617 655
618/* Convert algorithm ID to EVP_MD, defaults to SHA1. */ 656/* Convert algorithm ID to EVP_MD, defaults to SHA1. */
@@ -662,28 +700,36 @@ rsa_ctx_to_pss(EVP_PKEY_CTX *pkctx)
662RSA_PSS_PARAMS * 700RSA_PSS_PARAMS *
663rsa_pss_params_create(const EVP_MD *sigmd, const EVP_MD *mgf1md, int saltlen) 701rsa_pss_params_create(const EVP_MD *sigmd, const EVP_MD *mgf1md, int saltlen)
664{ 702{
665 RSA_PSS_PARAMS *pss = RSA_PSS_PARAMS_new(); 703 RSA_PSS_PARAMS *pss = NULL;
666 704
667 if (pss == NULL) 705 if (mgf1md == NULL)
706 mgf1md = sigmd;
707
708 if ((pss = RSA_PSS_PARAMS_new()) == NULL)
709 goto err;
710
711 if (!rsa_md_to_algor(sigmd, &pss->hashAlgorithm))
712 goto err;
713 if (!rsa_mgf1md_to_maskGenAlgorithm(mgf1md, &pss->maskGenAlgorithm))
714 goto err;
715
716 /* Translate mgf1md to X509_ALGOR in decoded form for internal use. */
717 if (!rsa_md_to_algor(mgf1md, &pss->maskHash))
668 goto err; 718 goto err;
669 if (saltlen != 20) { 719
670 pss->saltLength = ASN1_INTEGER_new(); 720 /* RFC 8017, A.2.3 - default saltLength is SHA_DIGEST_LENGTH. */
671 if (pss->saltLength == NULL) 721 if (saltlen != SHA_DIGEST_LENGTH) {
722 if ((pss->saltLength = ASN1_INTEGER_new()) == NULL)
672 goto err; 723 goto err;
673 if (!ASN1_INTEGER_set(pss->saltLength, saltlen)) 724 if (!ASN1_INTEGER_set(pss->saltLength, saltlen))
674 goto err; 725 goto err;
675 } 726 }
676 if (!rsa_md_to_algor(&pss->hashAlgorithm, sigmd)) 727
677 goto err;
678 if (mgf1md == NULL)
679 mgf1md = sigmd;
680 if (!rsa_md_to_mgf1(&pss->maskGenAlgorithm, mgf1md))
681 goto err;
682 if (!rsa_md_to_algor(&pss->maskHash, mgf1md))
683 goto err;
684 return pss; 728 return pss;
729
685 err: 730 err:
686 RSA_PSS_PARAMS_free(pss); 731 RSA_PSS_PARAMS_free(pss);
732
687 return NULL; 733 return NULL;
688} 734}
689 735
@@ -1035,13 +1081,17 @@ rsa_cms_encrypt(CMS_RecipientInfo *ri)
1035 labellen = EVP_PKEY_CTX_get0_rsa_oaep_label(pkctx, &label); 1081 labellen = EVP_PKEY_CTX_get0_rsa_oaep_label(pkctx, &label);
1036 if (labellen < 0) 1082 if (labellen < 0)
1037 goto err; 1083 goto err;
1038 oaep = RSA_OAEP_PARAMS_new(); 1084
1039 if (oaep == NULL) 1085 if ((oaep = RSA_OAEP_PARAMS_new()) == NULL)
1040 goto err; 1086 goto err;
1041 if (!rsa_md_to_algor(&oaep->hashFunc, md)) 1087
1088 if (!rsa_md_to_algor(md, &oaep->hashFunc))
1042 goto err; 1089 goto err;
1043 if (!rsa_md_to_mgf1(&oaep->maskGenFunc, mgf1md)) 1090 if (!rsa_mgf1md_to_maskGenAlgorithm(mgf1md, &oaep->maskGenFunc))
1044 goto err; 1091 goto err;
1092
1093 /* XXX - why do we not set oaep->maskHash here? */
1094
1045 if (labellen > 0) { 1095 if (labellen > 0) {
1046 ASN1_OCTET_STRING *los; 1096 ASN1_OCTET_STRING *los;
1047 oaep->pSourceFunc = X509_ALGOR_new(); 1097 oaep->pSourceFunc = X509_ALGOR_new();