summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2023-05-05 12:21:44 +0000
committertb <>2023-05-05 12:21:44 +0000
commitcbb774df47617a348f8854e2c7c75251e41333d4 (patch)
treed84042cf4e6f5fa6f82db77796665a46d6e71f58 /src
parent6e09131c76b8f3355a84f4dfe27686f421bbbe2c (diff)
downloadopenbsd-cbb774df47617a348f8854e2c7c75251e41333d4.tar.gz
openbsd-cbb774df47617a348f8854e2c7c75251e41333d4.tar.bz2
openbsd-cbb774df47617a348f8854e2c7c75251e41333d4.zip
Add back support for RSA_X931_PADDING
This makes the custom stalt stack work again. Tested by robert as part of a larger diff ok jsing
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/rsa/rsa_eay.c30
-rw-r--r--src/lib/libcrypto/rsa/rsa_local.h8
-rw-r--r--src/lib/libcrypto/rsa/rsa_pmeth.c154
3 files changed, 127 insertions, 65 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_eay.c b/src/lib/libcrypto/rsa/rsa_eay.c
index e65319bda1..6db563f2a4 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.59 2023/04/15 18:48:52 tb Exp $ */ 1/* $OpenBSD: rsa_eay.c,v 1.60 2023/05/05 12:21:44 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,11 +382,14 @@ 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;
385 case RSA_NO_PADDING: 388 case RSA_NO_PADDING:
386 i = RSA_padding_add_none(buf, num, from, flen); 389 i = RSA_padding_add_none(buf, num, from, flen);
387 break; 390 break;
388 default: 391 default:
389 RSAerror(RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE); 392 RSAerror(RSA_R_UNKNOWN_PADDING_TYPE);
390 goto err; 393 goto err;
391 } 394 }
392 if (i <= 0) 395 if (i <= 0)
@@ -446,11 +449,14 @@ RSA_eay_private_encrypt(int flen, const unsigned char *from, unsigned char *to,
446 goto err; 449 goto err;
447 450
448 if (padding == RSA_X931_PADDING) { 451 if (padding == RSA_X931_PADDING) {
449 RSAerror(RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE); 452 if (!BN_sub(f, rsa->n, ret))
450 goto err; 453 goto err;
451 } 454 if (BN_cmp(ret, f) > 0)
452 455 res = f;
453 res = ret; 456 else
457 res = ret;
458 } else
459 res = ret;
454 460
455 /* put in leading 0 bytes if the number is less than the 461 /* put in leading 0 bytes if the number is less than the
456 * length of the modulus */ 462 * length of the modulus */
@@ -661,10 +667,9 @@ RSA_eay_public_decrypt(int flen, const unsigned char *from, unsigned char *to,
661 rsa->_method_mod_n)) 667 rsa->_method_mod_n))
662 goto err; 668 goto err;
663 669
664 if (padding == RSA_X931_PADDING) { 670 if (padding == RSA_X931_PADDING && (ret->d[0] & 0xf) != 12)
665 RSAerror(RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE); 671 if (!BN_sub(ret, rsa->n, ret))
666 goto err; 672 goto err;
667 }
668 673
669 p = buf; 674 p = buf;
670 i = BN_bn2bin(ret, p); 675 i = BN_bn2bin(ret, p);
@@ -673,6 +678,9 @@ RSA_eay_public_decrypt(int flen, const unsigned char *from, unsigned char *to,
673 case RSA_PKCS1_PADDING: 678 case RSA_PKCS1_PADDING:
674 r = RSA_padding_check_PKCS1_type_1(to, num, buf, i, num); 679 r = RSA_padding_check_PKCS1_type_1(to, num, buf, i, num);
675 break; 680 break;
681 case RSA_X931_PADDING:
682 r = RSA_padding_check_X931(to, num, buf, i, num);
683 break;
676 case RSA_NO_PADDING: 684 case RSA_NO_PADDING:
677 r = RSA_padding_check_none(to, num, buf, i, num); 685 r = RSA_padding_check_none(to, num, buf, i, num);
678 break; 686 break;
diff --git a/src/lib/libcrypto/rsa/rsa_local.h b/src/lib/libcrypto/rsa/rsa_local.h
index b438ab4eec..4bc2cee8cd 100644
--- a/src/lib/libcrypto/rsa/rsa_local.h
+++ b/src/lib/libcrypto/rsa/rsa_local.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: rsa_local.h,v 1.1 2022/11/26 16:08:54 tb Exp $ */ 1/* $OpenBSD: rsa_local.h,v 1.2 2023/05/05 12:21:44 tb Exp $ */
2 2
3__BEGIN_HIDDEN_DECLS 3__BEGIN_HIDDEN_DECLS
4 4
@@ -91,4 +91,10 @@ extern int int_rsa_verify(int dtype, const unsigned char *m,
91 unsigned int m_len, unsigned char *rm, size_t *prm_len, 91 unsigned int m_len, unsigned char *rm, size_t *prm_len,
92 const unsigned char *sigbuf, size_t siglen, RSA *rsa); 92 const unsigned char *sigbuf, size_t siglen, RSA *rsa);
93 93
94int RSA_padding_add_X931(unsigned char *to, int tlen,
95 const unsigned char *f, int fl);
96int RSA_padding_check_X931(unsigned char *to, int tlen,
97 const unsigned char *f, int fl, int rsa_len);
98int RSA_X931_hash_id(int nid);
99
94__END_HIDDEN_DECLS 100__END_HIDDEN_DECLS
diff --git a/src/lib/libcrypto/rsa/rsa_pmeth.c b/src/lib/libcrypto/rsa/rsa_pmeth.c
index 8e06365566..429524d73d 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.37 2023/04/25 15:48:48 tb Exp $ */ 1/* $OpenBSD: rsa_pmeth.c,v 1.38 2023/05/05 12:21:44 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 = -1; 190 int ret;
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,11 +197,21 @@ 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_PKCS1_PADDING && 200 if (rctx->pad_mode == RSA_X931_PADDING) {
201 rctx->pad_mode != RSA_PKCS1_PSS_PADDING) 201 if ((size_t)EVP_PKEY_size(ctx->pkey) < tbslen + 1) {
202 return -1; 202 RSAerror(RSA_R_KEY_SIZE_TOO_SMALL);
203 203 return -1;
204 if (rctx->pad_mode == RSA_PKCS1_PADDING) { 204 }
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) {
205 unsigned int sltmp; 215 unsigned int sltmp;
206 216
207 ret = RSA_sign(EVP_MD_type(rctx->md), tbs, tbslen, sig, 217 ret = RSA_sign(EVP_MD_type(rctx->md), tbs, tbslen, sig,
@@ -217,6 +227,8 @@ pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
217 return -1; 227 return -1;
218 ret = RSA_private_encrypt(RSA_size(rsa), rctx->tbuf, 228 ret = RSA_private_encrypt(RSA_size(rsa), rctx->tbuf,
219 sig, rsa, RSA_NO_PADDING); 229 sig, rsa, RSA_NO_PADDING);
230 } else {
231 return -1;
220 } 232 }
221 } else { 233 } else {
222 ret = RSA_private_encrypt(tbslen, tbs, sig, ctx->pkey->pkey.rsa, 234 ret = RSA_private_encrypt(tbslen, tbs, sig, ctx->pkey->pkey.rsa,
@@ -236,16 +248,36 @@ pkey_rsa_verifyrecover(EVP_PKEY_CTX *ctx, unsigned char *rout, size_t *routlen,
236 RSA_PKEY_CTX *rctx = ctx->data; 248 RSA_PKEY_CTX *rctx = ctx->data;
237 249
238 if (rctx->md) { 250 if (rctx->md) {
239 size_t sltmp; 251 if (rctx->pad_mode == RSA_X931_PADDING) {
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;
240 272
241 if (rctx->pad_mode != RSA_PKCS1_PADDING) 273 ret = int_rsa_verify(EVP_MD_type(rctx->md), NULL, 0,
274 rout, &sltmp, sig, siglen, ctx->pkey->pkey.rsa);
275 if (ret <= 0)
276 return 0;
277 ret = sltmp;
278 } else {
242 return -1; 279 return -1;
243 280 }
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;
249 } else { 281 } else {
250 ret = RSA_public_decrypt(siglen, sig, rout, ctx->pkey->pkey.rsa, 282 ret = RSA_public_decrypt(siglen, sig, rout, ctx->pkey->pkey.rsa,
251 rctx->pad_mode); 283 rctx->pad_mode);
@@ -263,7 +295,6 @@ pkey_rsa_verify(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen,
263 RSA_PKEY_CTX *rctx = ctx->data; 295 RSA_PKEY_CTX *rctx = ctx->data;
264 RSA *rsa = ctx->pkey->pkey.rsa; 296 RSA *rsa = ctx->pkey->pkey.rsa;
265 size_t rslen; 297 size_t rslen;
266 int ret;
267 298
268 if (rctx->md) { 299 if (rctx->md) {
269 if (rctx->pad_mode == RSA_PKCS1_PADDING) 300 if (rctx->pad_mode == RSA_PKCS1_PADDING)
@@ -273,22 +304,30 @@ pkey_rsa_verify(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen,
273 RSAerror(RSA_R_INVALID_DIGEST_LENGTH); 304 RSAerror(RSA_R_INVALID_DIGEST_LENGTH);
274 return -1; 305 return -1;
275 } 306 }
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;
276 313
277 if (rctx->pad_mode != RSA_PKCS1_PSS_PADDING) 314 if (!setup_tbuf(rctx, ctx))
278 return -1; 315 return -1;
279 316 ret = RSA_public_decrypt(siglen, sig, rctx->tbuf,
280 if (!setup_tbuf(rctx, ctx)) 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 {
281 return -1; 326 return -1;
282 ret = RSA_public_decrypt(siglen, sig, rctx->tbuf, 327 }
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 { 328 } else {
329 int ret;
330
292 if (!setup_tbuf(rctx, ctx)) 331 if (!setup_tbuf(rctx, ctx))
293 return -1; 332 return -1;
294 333
@@ -365,34 +404,41 @@ check_padding_md(const EVP_MD *md, int padding)
365 if (md == NULL) 404 if (md == NULL)
366 return 1; 405 return 1;
367 406
368 if (padding == RSA_NO_PADDING || padding == RSA_X931_PADDING) { 407 if (padding == RSA_NO_PADDING) {
369 RSAerror(RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE); 408 RSAerror(RSA_R_INVALID_PADDING_MODE);
370 return 0; 409 return 0;
371 } 410 }
372 411
373 /* List of all supported RSA digests. */ 412 if (padding == RSA_X931_PADDING) {
374 /* RFC 8017 and NIST CSOR. */ 413 if (RSA_X931_hash_id(EVP_MD_type(md)) == -1) {
375 switch(EVP_MD_type(md)) { 414 RSAerror(RSA_R_INVALID_X931_DIGEST);
376 case NID_sha1: 415 return 0;
377 case NID_sha224: 416 }
378 case NID_sha256: 417 } else {
379 case NID_sha384: 418 /* List of all supported RSA digests. */
380 case NID_sha512: 419 /* RFC 8017 and NIST CSOR. */
381 case NID_sha512_224: 420 switch(EVP_MD_type(md)) {
382 case NID_sha512_256: 421 case NID_sha1:
383 case NID_sha3_224: 422 case NID_sha224:
384 case NID_sha3_256: 423 case NID_sha256:
385 case NID_sha3_384: 424 case NID_sha384:
386 case NID_sha3_512: 425 case NID_sha512:
387 case NID_md5: 426 case NID_sha512_224:
388 case NID_md5_sha1: 427 case NID_sha512_256:
389 case NID_md4: 428 case NID_sha3_224:
390 case NID_ripemd160: 429 case NID_sha3_256:
391 return 1; 430 case NID_sha3_384:
431 case NID_sha3_512:
432 case NID_md5:
433 case NID_md5_sha1:
434 case NID_md4:
435 case NID_ripemd160:
436 return 1;
392 437
393 default: 438 default:
394 RSAerror(RSA_R_INVALID_DIGEST); 439 RSAerror(RSA_R_INVALID_DIGEST);
395 return 0; 440 return 0;
441 }
396 } 442 }
397 443
398 return 1; 444 return 1;
@@ -598,6 +644,8 @@ pkey_rsa_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, const char *value)
598 pm = RSA_PKCS1_OAEP_PADDING; 644 pm = RSA_PKCS1_OAEP_PADDING;
599 else if (!strcmp(value, "oaep")) 645 else if (!strcmp(value, "oaep"))
600 pm = RSA_PKCS1_OAEP_PADDING; 646 pm = RSA_PKCS1_OAEP_PADDING;
647 else if (!strcmp(value, "x931"))
648 pm = RSA_X931_PADDING;
601 else if (!strcmp(value, "pss")) 649 else if (!strcmp(value, "pss"))
602 pm = RSA_PKCS1_PSS_PADDING; 650 pm = RSA_PKCS1_PSS_PADDING;
603 else { 651 else {