summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libcrypto/rsa/rsa_pss.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_pss.c b/src/lib/libcrypto/rsa/rsa_pss.c
index 6670866ff6..610ae7c928 100644
--- a/src/lib/libcrypto/rsa/rsa_pss.c
+++ b/src/lib/libcrypto/rsa/rsa_pss.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: rsa_pss.c,v 1.18 2024/02/18 15:45:42 tb Exp $ */ 1/* $OpenBSD: rsa_pss.c,v 1.19 2024/03/26 05:26:27 joshua 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 2005. 3 * project 2005.
4 */ 4 */
@@ -89,10 +89,11 @@ RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash,
89 int hLen, maskedDBLen, MSBits, emLen; 89 int hLen, maskedDBLen, MSBits, emLen;
90 const unsigned char *H; 90 const unsigned char *H;
91 unsigned char *DB = NULL; 91 unsigned char *DB = NULL;
92 EVP_MD_CTX ctx; 92 EVP_MD_CTX *md_ctx;
93 unsigned char H_[EVP_MAX_MD_SIZE]; 93 unsigned char H_[EVP_MAX_MD_SIZE];
94 94
95 EVP_MD_CTX_legacy_clear(&ctx); 95 if ((md_ctx = EVP_MD_CTX_new()) == NULL)
96 goto err;
96 97
97 if (mgf1Hash == NULL) 98 if (mgf1Hash == NULL)
98 mgf1Hash = Hash; 99 mgf1Hash = Hash;
@@ -157,25 +158,26 @@ RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash,
157 RSAerror(RSA_R_SLEN_CHECK_FAILED); 158 RSAerror(RSA_R_SLEN_CHECK_FAILED);
158 goto err; 159 goto err;
159 } 160 }
160 if (!EVP_DigestInit_ex(&ctx, Hash, NULL) || 161 if (!EVP_DigestInit_ex(md_ctx, Hash, NULL) ||
161 !EVP_DigestUpdate(&ctx, zeroes, sizeof zeroes) || 162 !EVP_DigestUpdate(md_ctx, zeroes, sizeof zeroes) ||
162 !EVP_DigestUpdate(&ctx, mHash, hLen)) 163 !EVP_DigestUpdate(md_ctx, mHash, hLen))
163 goto err; 164 goto err;
164 if (maskedDBLen - i) { 165 if (maskedDBLen - i) {
165 if (!EVP_DigestUpdate(&ctx, DB + i, maskedDBLen - i)) 166 if (!EVP_DigestUpdate(md_ctx, DB + i, maskedDBLen - i))
166 goto err; 167 goto err;
167 } 168 }
168 if (!EVP_DigestFinal_ex(&ctx, H_, NULL)) 169 if (!EVP_DigestFinal_ex(md_ctx, H_, NULL))
169 goto err; 170 goto err;
170 if (timingsafe_bcmp(H_, H, hLen)) { 171 if (timingsafe_bcmp(H_, H, hLen)) {
171 RSAerror(RSA_R_BAD_SIGNATURE); 172 RSAerror(RSA_R_BAD_SIGNATURE);
172 ret = 0; 173 ret = 0;
173 } else 174 } else {
174 ret = 1; 175 ret = 1;
176 }
175 177
176err: 178 err:
177 free(DB); 179 free(DB);
178 EVP_MD_CTX_cleanup(&ctx); 180 EVP_MD_CTX_free(md_ctx);
179 181
180 return ret; 182 return ret;
181} 183}
@@ -198,9 +200,10 @@ RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM,
198 int ret = 0; 200 int ret = 0;
199 int hLen, maskedDBLen, MSBits, emLen; 201 int hLen, maskedDBLen, MSBits, emLen;
200 unsigned char *H, *salt = NULL, *p; 202 unsigned char *H, *salt = NULL, *p;
201 EVP_MD_CTX ctx; 203 EVP_MD_CTX *md_ctx;
202 204
203 EVP_MD_CTX_legacy_clear(&ctx); 205 if ((md_ctx = EVP_MD_CTX_new()) == NULL)
206 goto err;
204 207
205 if (mgf1Hash == NULL) 208 if (mgf1Hash == NULL)
206 mgf1Hash = Hash; 209 mgf1Hash = Hash;
@@ -245,13 +248,13 @@ RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM,
245 } 248 }
246 maskedDBLen = emLen - hLen - 1; 249 maskedDBLen = emLen - hLen - 1;
247 H = EM + maskedDBLen; 250 H = EM + maskedDBLen;
248 if (!EVP_DigestInit_ex(&ctx, Hash, NULL) || 251 if (!EVP_DigestInit_ex(md_ctx, Hash, NULL) ||
249 !EVP_DigestUpdate(&ctx, zeroes, sizeof zeroes) || 252 !EVP_DigestUpdate(md_ctx, zeroes, sizeof zeroes) ||
250 !EVP_DigestUpdate(&ctx, mHash, hLen)) 253 !EVP_DigestUpdate(md_ctx, mHash, hLen))
251 goto err; 254 goto err;
252 if (sLen && !EVP_DigestUpdate(&ctx, salt, sLen)) 255 if (sLen && !EVP_DigestUpdate(md_ctx, salt, sLen))
253 goto err; 256 goto err;
254 if (!EVP_DigestFinal_ex(&ctx, H, NULL)) 257 if (!EVP_DigestFinal_ex(md_ctx, H, NULL))
255 goto err; 258 goto err;
256 259
257 /* Generate dbMask in place then perform XOR on it */ 260 /* Generate dbMask in place then perform XOR on it */
@@ -281,7 +284,7 @@ RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM,
281 284
282err: 285err:
283 free(salt); 286 free(salt);
284 EVP_MD_CTX_cleanup(&ctx); 287 EVP_MD_CTX_free(md_ctx);
285 288
286 return ret; 289 return ret;
287} 290}