diff options
-rw-r--r-- | src/lib/libcrypto/rsa/rsa_ameth.c | 112 |
1 files changed, 59 insertions, 53 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_ameth.c b/src/lib/libcrypto/rsa/rsa_ameth.c index 6fb4403231..43e66ce02a 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.42 2023/11/07 22:35:03 tb Exp $ */ | 1 | /* $OpenBSD: rsa_ameth.c,v 1.43 2023/11/08 16:02:41 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 | */ |
@@ -909,6 +909,60 @@ rsa_alg_set_pss_padding(X509_ALGOR *alg, EVP_PKEY_CTX *pkey_ctx) | |||
909 | 909 | ||
910 | #ifndef OPENSSL_NO_CMS | 910 | #ifndef OPENSSL_NO_CMS |
911 | static int | 911 | static int |
912 | rsa_alg_set_oaep_padding(X509_ALGOR *alg, EVP_PKEY_CTX *pkctx) | ||
913 | { | ||
914 | const EVP_MD *md, *mgf1md; | ||
915 | RSA_OAEP_PARAMS *oaep = NULL; | ||
916 | ASN1_STRING *os = NULL; | ||
917 | int rv = 0, labellen; | ||
918 | unsigned char *label; | ||
919 | |||
920 | if (EVP_PKEY_CTX_get_rsa_oaep_md(pkctx, &md) <= 0) | ||
921 | goto err; | ||
922 | if (EVP_PKEY_CTX_get_rsa_mgf1_md(pkctx, &mgf1md) <= 0) | ||
923 | goto err; | ||
924 | labellen = EVP_PKEY_CTX_get0_rsa_oaep_label(pkctx, &label); | ||
925 | if (labellen < 0) | ||
926 | goto err; | ||
927 | |||
928 | if ((oaep = RSA_OAEP_PARAMS_new()) == NULL) | ||
929 | goto err; | ||
930 | |||
931 | if (!rsa_md_to_algor(md, &oaep->hashFunc)) | ||
932 | goto err; | ||
933 | if (!rsa_mgf1md_to_maskGenAlgorithm(mgf1md, &oaep->maskGenFunc)) | ||
934 | goto err; | ||
935 | |||
936 | /* XXX - why do we not set oaep->maskHash here? */ | ||
937 | |||
938 | if (labellen > 0) { | ||
939 | ASN1_OCTET_STRING *los; | ||
940 | oaep->pSourceFunc = X509_ALGOR_new(); | ||
941 | if (oaep->pSourceFunc == NULL) | ||
942 | goto err; | ||
943 | los = ASN1_OCTET_STRING_new(); | ||
944 | if (los == NULL) | ||
945 | goto err; | ||
946 | if (!ASN1_OCTET_STRING_set(los, label, labellen)) { | ||
947 | ASN1_OCTET_STRING_free(los); | ||
948 | goto err; | ||
949 | } | ||
950 | X509_ALGOR_set0(oaep->pSourceFunc, OBJ_nid2obj(NID_pSpecified), | ||
951 | V_ASN1_OCTET_STRING, los); | ||
952 | } | ||
953 | /* create string with pss parameter encoding. */ | ||
954 | if (!ASN1_item_pack(oaep, &RSA_OAEP_PARAMS_it, &os)) | ||
955 | goto err; | ||
956 | X509_ALGOR_set0(alg, OBJ_nid2obj(NID_rsaesOaep), V_ASN1_SEQUENCE, os); | ||
957 | os = NULL; | ||
958 | rv = 1; | ||
959 | err: | ||
960 | RSA_OAEP_PARAMS_free(oaep); | ||
961 | ASN1_STRING_free(os); | ||
962 | return rv; | ||
963 | } | ||
964 | |||
965 | static int | ||
912 | rsa_cms_sign(CMS_SignerInfo *si) | 966 | rsa_cms_sign(CMS_SignerInfo *si) |
913 | { | 967 | { |
914 | EVP_PKEY_CTX *pkey_ctx; | 968 | EVP_PKEY_CTX *pkey_ctx; |
@@ -1057,13 +1111,9 @@ rsa_cms_decrypt(CMS_RecipientInfo *ri) | |||
1057 | static int | 1111 | static int |
1058 | rsa_cms_encrypt(CMS_RecipientInfo *ri) | 1112 | rsa_cms_encrypt(CMS_RecipientInfo *ri) |
1059 | { | 1113 | { |
1060 | const EVP_MD *md, *mgf1md; | ||
1061 | RSA_OAEP_PARAMS *oaep = NULL; | ||
1062 | ASN1_STRING *os = NULL; | ||
1063 | X509_ALGOR *alg; | 1114 | X509_ALGOR *alg; |
1064 | EVP_PKEY_CTX *pkctx; | 1115 | EVP_PKEY_CTX *pkctx; |
1065 | int pad_mode = RSA_PKCS1_PADDING, rv = 0, labellen; | 1116 | int pad_mode = RSA_PKCS1_PADDING; |
1066 | unsigned char *label; | ||
1067 | 1117 | ||
1068 | if ((pkctx = CMS_RecipientInfo_get0_pkey_ctx(ri)) != NULL) { | 1118 | if ((pkctx = CMS_RecipientInfo_get0_pkey_ctx(ri)) != NULL) { |
1069 | if (EVP_PKEY_CTX_get_rsa_padding(pkctx, &pad_mode) <= 0) | 1119 | if (EVP_PKEY_CTX_get_rsa_padding(pkctx, &pad_mode) <= 0) |
@@ -1074,54 +1124,10 @@ rsa_cms_encrypt(CMS_RecipientInfo *ri) | |||
1074 | return 0; | 1124 | return 0; |
1075 | if (pad_mode == RSA_PKCS1_PADDING) | 1125 | if (pad_mode == RSA_PKCS1_PADDING) |
1076 | return rsa_alg_set_pkcs1_padding(alg); | 1126 | return rsa_alg_set_pkcs1_padding(alg); |
1127 | if (pad_mode == RSA_PKCS1_OAEP_PADDING) | ||
1128 | return rsa_alg_set_oaep_padding(alg, pkctx); | ||
1077 | 1129 | ||
1078 | /* Not supported */ | 1130 | return 0; |
1079 | if (pad_mode != RSA_PKCS1_OAEP_PADDING) | ||
1080 | return 0; | ||
1081 | |||
1082 | if (EVP_PKEY_CTX_get_rsa_oaep_md(pkctx, &md) <= 0) | ||
1083 | goto err; | ||
1084 | if (EVP_PKEY_CTX_get_rsa_mgf1_md(pkctx, &mgf1md) <= 0) | ||
1085 | goto err; | ||
1086 | labellen = EVP_PKEY_CTX_get0_rsa_oaep_label(pkctx, &label); | ||
1087 | if (labellen < 0) | ||
1088 | goto err; | ||
1089 | |||
1090 | if ((oaep = RSA_OAEP_PARAMS_new()) == NULL) | ||
1091 | goto err; | ||
1092 | |||
1093 | if (!rsa_md_to_algor(md, &oaep->hashFunc)) | ||
1094 | goto err; | ||
1095 | if (!rsa_mgf1md_to_maskGenAlgorithm(mgf1md, &oaep->maskGenFunc)) | ||
1096 | goto err; | ||
1097 | |||
1098 | /* XXX - why do we not set oaep->maskHash here? */ | ||
1099 | |||
1100 | if (labellen > 0) { | ||
1101 | ASN1_OCTET_STRING *los; | ||
1102 | oaep->pSourceFunc = X509_ALGOR_new(); | ||
1103 | if (oaep->pSourceFunc == NULL) | ||
1104 | goto err; | ||
1105 | los = ASN1_OCTET_STRING_new(); | ||
1106 | if (los == NULL) | ||
1107 | goto err; | ||
1108 | if (!ASN1_OCTET_STRING_set(los, label, labellen)) { | ||
1109 | ASN1_OCTET_STRING_free(los); | ||
1110 | goto err; | ||
1111 | } | ||
1112 | X509_ALGOR_set0(oaep->pSourceFunc, OBJ_nid2obj(NID_pSpecified), | ||
1113 | V_ASN1_OCTET_STRING, los); | ||
1114 | } | ||
1115 | /* create string with pss parameter encoding. */ | ||
1116 | if (!ASN1_item_pack(oaep, &RSA_OAEP_PARAMS_it, &os)) | ||
1117 | goto err; | ||
1118 | X509_ALGOR_set0(alg, OBJ_nid2obj(NID_rsaesOaep), V_ASN1_SEQUENCE, os); | ||
1119 | os = NULL; | ||
1120 | rv = 1; | ||
1121 | err: | ||
1122 | RSA_OAEP_PARAMS_free(oaep); | ||
1123 | ASN1_STRING_free(os); | ||
1124 | return rv; | ||
1125 | } | 1131 | } |
1126 | #endif | 1132 | #endif |
1127 | 1133 | ||