summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2023-04-15 18:48:52 +0000
committertb <>2023-04-15 18:48:52 +0000
commit0d8d33f95bb60ebc48034e0510af8a3adb7c1afa (patch)
treec5e041fba224aef85a1fe53c56b348d8e8b0cf1d /src
parentdd4d11ff3980719420626572b001eadad7632ea5 (diff)
downloadopenbsd-0d8d33f95bb60ebc48034e0510af8a3adb7c1afa.tar.gz
openbsd-0d8d33f95bb60ebc48034e0510af8a3adb7c1afa.tar.bz2
openbsd-0d8d33f95bb60ebc48034e0510af8a3adb7c1afa.zip
Stop supporting the long-retired X9.31 standard
This isolates the three API functions from the library so they can be easily removed and any attempt to use RSA_X931_PADDING mode will now result in an error. ok jsing
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/rsa/rsa_eay.c30
-rw-r--r--src/lib/libcrypto/rsa/rsa_pmeth.c140
2 files changed, 57 insertions, 113 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_eay.c b/src/lib/libcrypto/rsa/rsa_eay.c
index b307a8bd88..e65319bda1 100644
--- a/src/lib/libcrypto/rsa/rsa_eay.c
+++ b/src/lib/libcrypto/rsa/rsa_eay.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: rsa_eay.c,v 1.58 2023/04/05 11:31:38 tb Exp $ */ 1/* $OpenBSD: rsa_eay.c,v 1.59 2023/04/15 18:48:52 tb Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -382,14 +382,11 @@ RSA_eay_private_encrypt(int flen, const unsigned char *from, unsigned char *to,
382 case RSA_PKCS1_PADDING: 382 case RSA_PKCS1_PADDING:
383 i = RSA_padding_add_PKCS1_type_1(buf, num, from, flen); 383 i = RSA_padding_add_PKCS1_type_1(buf, num, from, flen);
384 break; 384 break;
385 case RSA_X931_PADDING:
386 i = RSA_padding_add_X931(buf, num, from, flen);
387 break;
388 case RSA_NO_PADDING: 385 case RSA_NO_PADDING:
389 i = RSA_padding_add_none(buf, num, from, flen); 386 i = RSA_padding_add_none(buf, num, from, flen);
390 break; 387 break;
391 default: 388 default:
392 RSAerror(RSA_R_UNKNOWN_PADDING_TYPE); 389 RSAerror(RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE);
393 goto err; 390 goto err;
394 } 391 }
395 if (i <= 0) 392 if (i <= 0)
@@ -449,14 +446,11 @@ RSA_eay_private_encrypt(int flen, const unsigned char *from, unsigned char *to,
449 goto err; 446 goto err;
450 447
451 if (padding == RSA_X931_PADDING) { 448 if (padding == RSA_X931_PADDING) {
452 if (!BN_sub(f, rsa->n, ret)) 449 RSAerror(RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE);
453 goto err; 450 goto err;
454 if (BN_cmp(ret, f) > 0) 451 }
455 res = f; 452
456 else 453 res = ret;
457 res = ret;
458 } else
459 res = ret;
460 454
461 /* put in leading 0 bytes if the number is less than the 455 /* put in leading 0 bytes if the number is less than the
462 * length of the modulus */ 456 * length of the modulus */
@@ -667,9 +661,10 @@ RSA_eay_public_decrypt(int flen, const unsigned char *from, unsigned char *to,
667 rsa->_method_mod_n)) 661 rsa->_method_mod_n))
668 goto err; 662 goto err;
669 663
670 if (padding == RSA_X931_PADDING && (ret->d[0] & 0xf) != 12) 664 if (padding == RSA_X931_PADDING) {
671 if (!BN_sub(ret, rsa->n, ret)) 665 RSAerror(RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE);
672 goto err; 666 goto err;
667 }
673 668
674 p = buf; 669 p = buf;
675 i = BN_bn2bin(ret, p); 670 i = BN_bn2bin(ret, p);
@@ -678,9 +673,6 @@ RSA_eay_public_decrypt(int flen, const unsigned char *from, unsigned char *to,
678 case RSA_PKCS1_PADDING: 673 case RSA_PKCS1_PADDING:
679 r = RSA_padding_check_PKCS1_type_1(to, num, buf, i, num); 674 r = RSA_padding_check_PKCS1_type_1(to, num, buf, i, num);
680 break; 675 break;
681 case RSA_X931_PADDING:
682 r = RSA_padding_check_X931(to, num, buf, i, num);
683 break;
684 case RSA_NO_PADDING: 676 case RSA_NO_PADDING:
685 r = RSA_padding_check_none(to, num, buf, i, num); 677 r = RSA_padding_check_none(to, num, buf, i, num);
686 break; 678 break;
diff --git a/src/lib/libcrypto/rsa/rsa_pmeth.c b/src/lib/libcrypto/rsa/rsa_pmeth.c
index 3747f1dd28..688c0d64db 100644
--- a/src/lib/libcrypto/rsa/rsa_pmeth.c
+++ b/src/lib/libcrypto/rsa/rsa_pmeth.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: rsa_pmeth.c,v 1.35 2023/03/06 08:31:34 tb Exp $ */ 1/* $OpenBSD: rsa_pmeth.c,v 1.36 2023/04/15 18:48:52 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 */
@@ -187,7 +187,7 @@ static int
187pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, 187pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
188 const unsigned char *tbs, size_t tbslen) 188 const unsigned char *tbs, size_t tbslen)
189{ 189{
190 int ret; 190 int ret = -1;
191 RSA_PKEY_CTX *rctx = ctx->data; 191 RSA_PKEY_CTX *rctx = ctx->data;
192 RSA *rsa = ctx->pkey->pkey.rsa; 192 RSA *rsa = ctx->pkey->pkey.rsa;
193 193
@@ -197,21 +197,11 @@ pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
197 return -1; 197 return -1;
198 } 198 }
199 199
200 if (rctx->pad_mode == RSA_X931_PADDING) { 200 if (rctx->pad_mode != RSA_PKCS1_PADDING &&
201 if ((size_t)EVP_PKEY_size(ctx->pkey) < tbslen + 1) { 201 rctx->pad_mode != RSA_PKCS1_PSS_PADDING)
202 RSAerror(RSA_R_KEY_SIZE_TOO_SMALL); 202 return -1;
203 return -1; 203
204 } 204 if (rctx->pad_mode == RSA_PKCS1_PADDING) {
205 if (!setup_tbuf(rctx, ctx)) {
206 RSAerror(ERR_R_MALLOC_FAILURE);
207 return -1;
208 }
209 memcpy(rctx->tbuf, tbs, tbslen);
210 rctx->tbuf[tbslen] =
211 RSA_X931_hash_id(EVP_MD_type(rctx->md));
212 ret = RSA_private_encrypt(tbslen + 1, rctx->tbuf, sig,
213 rsa, RSA_X931_PADDING);
214 } else if (rctx->pad_mode == RSA_PKCS1_PADDING) {
215 unsigned int sltmp; 205 unsigned int sltmp;
216 206
217 ret = RSA_sign(EVP_MD_type(rctx->md), tbs, tbslen, sig, 207 ret = RSA_sign(EVP_MD_type(rctx->md), tbs, tbslen, sig,
@@ -227,8 +217,6 @@ pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
227 return -1; 217 return -1;
228 ret = RSA_private_encrypt(RSA_size(rsa), rctx->tbuf, 218 ret = RSA_private_encrypt(RSA_size(rsa), rctx->tbuf,
229 sig, rsa, RSA_NO_PADDING); 219 sig, rsa, RSA_NO_PADDING);
230 } else {
231 return -1;
232 } 220 }
233 } else { 221 } else {
234 ret = RSA_private_encrypt(tbslen, tbs, sig, ctx->pkey->pkey.rsa, 222 ret = RSA_private_encrypt(tbslen, tbs, sig, ctx->pkey->pkey.rsa,
@@ -248,36 +236,16 @@ pkey_rsa_verifyrecover(EVP_PKEY_CTX *ctx, unsigned char *rout, size_t *routlen,
248 RSA_PKEY_CTX *rctx = ctx->data; 236 RSA_PKEY_CTX *rctx = ctx->data;
249 237
250 if (rctx->md) { 238 if (rctx->md) {
251 if (rctx->pad_mode == RSA_X931_PADDING) { 239 size_t sltmp;
252 if (!setup_tbuf(rctx, ctx))
253 return -1;
254 ret = RSA_public_decrypt(siglen, sig, rctx->tbuf,
255 ctx->pkey->pkey.rsa, RSA_X931_PADDING);
256 if (ret < 1)
257 return 0;
258 ret--;
259 if (rctx->tbuf[ret] !=
260 RSA_X931_hash_id(EVP_MD_type(rctx->md))) {
261 RSAerror(RSA_R_ALGORITHM_MISMATCH);
262 return 0;
263 }
264 if (ret != EVP_MD_size(rctx->md)) {
265 RSAerror(RSA_R_INVALID_DIGEST_LENGTH);
266 return 0;
267 }
268 if (rout)
269 memcpy(rout, rctx->tbuf, ret);
270 } else if (rctx->pad_mode == RSA_PKCS1_PADDING) {
271 size_t sltmp;
272 240
273 ret = int_rsa_verify(EVP_MD_type(rctx->md), NULL, 0, 241 if (rctx->pad_mode != RSA_PKCS1_PADDING)
274 rout, &sltmp, sig, siglen, ctx->pkey->pkey.rsa);
275 if (ret <= 0)
276 return 0;
277 ret = sltmp;
278 } else {
279 return -1; 242 return -1;
280 } 243
244 ret = int_rsa_verify(EVP_MD_type(rctx->md), NULL, 0,
245 rout, &sltmp, sig, siglen, ctx->pkey->pkey.rsa);
246 if (ret <= 0)
247 return 0;
248 ret = sltmp;
281 } else { 249 } else {
282 ret = RSA_public_decrypt(siglen, sig, rout, ctx->pkey->pkey.rsa, 250 ret = RSA_public_decrypt(siglen, sig, rout, ctx->pkey->pkey.rsa,
283 rctx->pad_mode); 251 rctx->pad_mode);
@@ -295,6 +263,7 @@ pkey_rsa_verify(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen,
295 RSA_PKEY_CTX *rctx = ctx->data; 263 RSA_PKEY_CTX *rctx = ctx->data;
296 RSA *rsa = ctx->pkey->pkey.rsa; 264 RSA *rsa = ctx->pkey->pkey.rsa;
297 size_t rslen; 265 size_t rslen;
266 int ret;
298 267
299 if (rctx->md) { 268 if (rctx->md) {
300 if (rctx->pad_mode == RSA_PKCS1_PADDING) 269 if (rctx->pad_mode == RSA_PKCS1_PADDING)
@@ -304,32 +273,24 @@ pkey_rsa_verify(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen,
304 RSAerror(RSA_R_INVALID_DIGEST_LENGTH); 273 RSAerror(RSA_R_INVALID_DIGEST_LENGTH);
305 return -1; 274 return -1;
306 } 275 }
307 if (rctx->pad_mode == RSA_X931_PADDING) {
308 if (pkey_rsa_verifyrecover(ctx, NULL, &rslen, sig,
309 siglen) <= 0)
310 return 0;
311 } else if (rctx->pad_mode == RSA_PKCS1_PSS_PADDING) {
312 int ret;
313 276
314 if (!setup_tbuf(rctx, ctx)) 277 if (rctx->pad_mode != RSA_PKCS1_PSS_PADDING)
315 return -1;
316 ret = RSA_public_decrypt(siglen, sig, rctx->tbuf,
317 rsa, RSA_NO_PADDING);
318 if (ret <= 0)
319 return 0;
320 ret = RSA_verify_PKCS1_PSS_mgf1(rsa, tbs, rctx->md,
321 rctx->mgf1md, rctx->tbuf, rctx->saltlen);
322 if (ret <= 0)
323 return 0;
324 return 1;
325 } else {
326 return -1; 278 return -1;
327 }
328 } else {
329 int ret;
330 279
331 if (!setup_tbuf(rctx, ctx)) 280 if (!setup_tbuf(rctx, ctx))
332 return -1; 281 return -1;
282 ret = RSA_public_decrypt(siglen, sig, rctx->tbuf,
283 rsa, RSA_NO_PADDING);
284 if (ret <= 0)
285 return 0;
286 ret = RSA_verify_PKCS1_PSS_mgf1(rsa, tbs, rctx->md,
287 rctx->mgf1md, rctx->tbuf, rctx->saltlen);
288 if (ret <= 0)
289 return 0;
290 return 1;
291 } else {
292 if (!setup_tbuf(rctx, ctx))
293 return -1;
333 294
334 if ((ret = RSA_public_decrypt(siglen, sig, rctx->tbuf, rsa, 295 if ((ret = RSA_public_decrypt(siglen, sig, rctx->tbuf, rsa,
335 rctx->pad_mode)) <= 0) 296 rctx->pad_mode)) <= 0)
@@ -404,34 +365,27 @@ check_padding_md(const EVP_MD *md, int padding)
404 if (md == NULL) 365 if (md == NULL)
405 return 1; 366 return 1;
406 367
407 if (padding == RSA_NO_PADDING) { 368 if (padding == RSA_NO_PADDING || padding == RSA_X931_PADDING) {
408 RSAerror(RSA_R_INVALID_PADDING_MODE); 369 RSAerror(RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE);
409 return 0; 370 return 0;
410 } 371 }
411 372
412 if (padding == RSA_X931_PADDING) { 373 /* List of all supported RSA digests. */
413 if (RSA_X931_hash_id(EVP_MD_type(md)) == -1) { 374 switch(EVP_MD_type(md)) {
414 RSAerror(RSA_R_INVALID_X931_DIGEST); 375 case NID_sha1:
415 return 0; 376 case NID_sha224:
416 } 377 case NID_sha256:
417 } else { 378 case NID_sha384:
418 /* List of all supported RSA digests. */ 379 case NID_sha512:
419 switch(EVP_MD_type(md)) { 380 case NID_md5:
420 case NID_sha1: 381 case NID_md5_sha1:
421 case NID_sha224: 382 case NID_md4:
422 case NID_sha256: 383 case NID_ripemd160:
423 case NID_sha384: 384 return 1;
424 case NID_sha512:
425 case NID_md5:
426 case NID_md5_sha1:
427 case NID_md4:
428 case NID_ripemd160:
429 return 1;
430 385
431 default: 386 default:
432 RSAerror(RSA_R_INVALID_DIGEST); 387 RSAerror(RSA_R_INVALID_DIGEST);
433 return 0; 388 return 0;
434 }
435 } 389 }
436 390
437 return 1; 391 return 1;
@@ -637,8 +591,6 @@ pkey_rsa_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, const char *value)
637 pm = RSA_PKCS1_OAEP_PADDING; 591 pm = RSA_PKCS1_OAEP_PADDING;
638 else if (!strcmp(value, "oaep")) 592 else if (!strcmp(value, "oaep"))
639 pm = RSA_PKCS1_OAEP_PADDING; 593 pm = RSA_PKCS1_OAEP_PADDING;
640 else if (!strcmp(value, "x931"))
641 pm = RSA_X931_PADDING;
642 else if (!strcmp(value, "pss")) 594 else if (!strcmp(value, "pss"))
643 pm = RSA_PKCS1_PSS_PADDING; 595 pm = RSA_PKCS1_PSS_PADDING;
644 else { 596 else {