1 /* crypto/rsa/rsa_eay.c */ 2 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com) 3 * All rights reserved. 4 * 5 * This package is an SSL implementation written 6 * by Eric Young (eay (at) cryptsoft.com). 7 * The implementation was written so as to conform with Netscapes SSL. 8 * 9 * This library is free for commercial and non-commercial use as long as 10 * the following conditions are aheared to. The following conditions 11 * apply to all code found in this distribution, be it the RC4, RSA, 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13 * included with this distribution is covered by the same copyright terms 14 * except that the holder is Tim Hudson (tjh (at) cryptsoft.com). 15 * 16 * Copyright remains Eric Young's, and as such any Copyright notices in 17 * the code are not to be removed. 18 * If this package is used in a product, Eric Young should be given attribution 19 * as the author of the parts of the library used. 20 * This can be in the form of a textual message at program startup or 21 * in documentation (online or textual) provided with the package. 22 * 23 * Redistribution and use in source and binary forms, with or without 24 * modification, are permitted provided that the following conditions 25 * are met: 26 * 1. Redistributions of source code must retain the copyright 27 * notice, this list of conditions and the following disclaimer. 28 * 2. Redistributions in binary form must reproduce the above copyright 29 * notice, this list of conditions and the following disclaimer in the 30 * documentation and/or other materials provided with the distribution. 31 * 3. All advertising materials mentioning features or use of this software 32 * must display the following acknowledgement: 33 * "This product includes cryptographic software written by 34 * Eric Young (eay (at) cryptsoft.com)" 35 * The word 'cryptographic' can be left out if the rouines from the library 36 * being used are not cryptographic related :-). 37 * 4. If you include any Windows specific code (or a derivative thereof) from 38 * the apps directory (application code) you must include an acknowledgement: 39 * "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)" 40 * 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51 * SUCH DAMAGE. 52 * 53 * The licence and distribution terms for any publically available version or 54 * derivative of this code cannot be changed. i.e. this code cannot simply be 55 * copied and put under another distribution licence 56 * [including the GNU Public Licence.] 57 */ 58 /* ==================================================================== 59 * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. 60 * 61 * Redistribution and use in source and binary forms, with or without 62 * modification, are permitted provided that the following conditions 63 * are met: 64 * 65 * 1. Redistributions of source code must retain the above copyright 66 * notice, this list of conditions and the following disclaimer. 67 * 68 * 2. Redistributions in binary form must reproduce the above copyright 69 * notice, this list of conditions and the following disclaimer in 70 * the documentation and/or other materials provided with the 71 * distribution. 72 * 73 * 3. All advertising materials mentioning features or use of this 74 * software must display the following acknowledgment: 75 * "This product includes software developed by the OpenSSL Project 76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 77 * 78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 79 * endorse or promote products derived from this software without 80 * prior written permission. For written permission, please contact 81 * openssl-core (at) openssl.org. 82 * 83 * 5. Products derived from this software may not be called "OpenSSL" 84 * nor may "OpenSSL" appear in their names without prior written 85 * permission of the OpenSSL Project. 86 * 87 * 6. Redistributions of any form whatsoever must retain the following 88 * acknowledgment: 89 * "This product includes software developed by the OpenSSL Project 90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 91 * 92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 103 * OF THE POSSIBILITY OF SUCH DAMAGE. 104 * ==================================================================== 105 * 106 * This product includes cryptographic software written by Eric Young 107 * (eay (at) cryptsoft.com). This product includes software written by Tim 108 * Hudson (tjh (at) cryptsoft.com). 109 * 110 */ 111 112 #include <stdio.h> 113 #include "cryptlib.h" 114 #include <openssl/bn.h> 115 #include <openssl/rsa.h> 116 #include <openssl/rand.h> 117 118 #ifndef RSA_NULL 119 120 static int RSA_eay_public_encrypt(int flen, const unsigned char *from, 121 unsigned char *to, RSA *rsa,int padding); 122 static int RSA_eay_private_encrypt(int flen, const unsigned char *from, 123 unsigned char *to, RSA *rsa,int padding); 124 static int RSA_eay_public_decrypt(int flen, const unsigned char *from, 125 unsigned char *to, RSA *rsa,int padding); 126 static int RSA_eay_private_decrypt(int flen, const unsigned char *from, 127 unsigned char *to, RSA *rsa,int padding); 128 static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *i, RSA *rsa, BN_CTX *ctx); 129 static int RSA_eay_init(RSA *rsa); 130 static int RSA_eay_finish(RSA *rsa); 131 static RSA_METHOD rsa_pkcs1_eay_meth={ 132 "Eric Young's PKCS#1 RSA", 133 RSA_eay_public_encrypt, 134 RSA_eay_public_decrypt, /* signature verification */ 135 RSA_eay_private_encrypt, /* signing */ 136 RSA_eay_private_decrypt, 137 RSA_eay_mod_exp, 138 BN_mod_exp_mont, /* XXX probably we should not use Montgomery if e == 3 */ 139 RSA_eay_init, 140 RSA_eay_finish, 141 0, /* flags */ 142 NULL, 143 0, /* rsa_sign */ 144 0, /* rsa_verify */ 145 NULL /* rsa_keygen */ 146 }; 147 148 const RSA_METHOD *RSA_PKCS1_SSLeay(void) 149 { 150 return(&rsa_pkcs1_eay_meth); 151 } 152 153 static int RSA_eay_public_encrypt(int flen, const unsigned char *from, 154 unsigned char *to, RSA *rsa, int padding) 155 { 156 BIGNUM *f,*ret; 157 int i,j,k,num=0,r= -1; 158 unsigned char *buf=NULL; 159 BN_CTX *ctx=NULL; 160 161 if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) 162 { 163 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_MODULUS_TOO_LARGE); 164 return -1; 165 } 166 167 if (BN_ucmp(rsa->n, rsa->e) <= 0) 168 { 169 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE); 170 return -1; 171 } 172 173 /* for large moduli, enforce exponent limit */ 174 if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) 175 { 176 if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) 177 { 178 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE); 179 return -1; 180 } 181 } 182 183 if ((ctx=BN_CTX_new()) == NULL) goto err; 184 BN_CTX_start(ctx); 185 f = BN_CTX_get(ctx); 186 ret = BN_CTX_get(ctx); 187 num=BN_num_bytes(rsa->n); 188 buf = OPENSSL_malloc(num); 189 if (!f || !ret || !buf) 190 { 191 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,ERR_R_MALLOC_FAILURE); 192 goto err; 193 } 194 195 switch (padding) 196 { 197 case RSA_PKCS1_PADDING: 198 i=RSA_padding_add_PKCS1_type_2(buf,num,from,flen); 199 break; 200 #ifndef OPENSSL_NO_SHA 201 case RSA_PKCS1_OAEP_PADDING: 202 i=RSA_padding_add_PKCS1_OAEP(buf,num,from,flen,NULL,0); 203 break; 204 #endif 205 case RSA_SSLV23_PADDING: 206 i=RSA_padding_add_SSLv23(buf,num,from,flen); 207 break; 208 case RSA_NO_PADDING: 209 i=RSA_padding_add_none(buf,num,from,flen); 210 break; 211 default: 212 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,RSA_R_UNKNOWN_PADDING_TYPE); 213 goto err; 214 } 215 if (i <= 0) goto err; 216 217 if (BN_bin2bn(buf,num,f) == NULL) goto err; 218 219 if (BN_ucmp(f, rsa->n) >= 0) 220 { 221 /* usually the padding functions would catch this */ 222 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS); 223 goto err; 224 } 225 226 if (rsa->flags & RSA_FLAG_CACHE_PUBLIC) 227 if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx)) 228 goto err; 229 230 if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx, 231 rsa->_method_mod_n)) goto err; 232 233 /* put in leading 0 bytes if the number is less than the 234 * length of the modulus */ 235 j=BN_num_bytes(ret); 236 i=BN_bn2bin(ret,&(to[num-j])); 237 for (k=0; k<(num-i); k++) 238 to[k]=0; 239 240 r=num; 241 err: 242 if (ctx != NULL) 243 { 244 BN_CTX_end(ctx); 245 BN_CTX_free(ctx); 246 } 247 if (buf != NULL) 248 { 249 OPENSSL_cleanse(buf,num); 250 OPENSSL_free(buf); 251 } 252 return(r); 253 } 254 255 static BN_BLINDING *rsa_get_blinding(RSA *rsa, int *local, BN_CTX *ctx) 256 { 257 BN_BLINDING *ret; 258 int got_write_lock = 0; 259 CRYPTO_THREADID cur; 260 261 CRYPTO_r_lock(CRYPTO_LOCK_RSA); 262 263 if (rsa->blinding == NULL) 264 { 265 CRYPTO_r_unlock(CRYPTO_LOCK_RSA); 266 CRYPTO_w_lock(CRYPTO_LOCK_RSA); 267 got_write_lock = 1; 268 269 if (rsa->blinding == NULL) 270 rsa->blinding = RSA_setup_blinding(rsa, ctx); 271 } 272 273 ret = rsa->blinding; 274 if (ret == NULL) 275 goto err; 276 277 CRYPTO_THREADID_current(&cur); 278 if (!CRYPTO_THREADID_cmp(&cur, BN_BLINDING_thread_id(ret))) 279 { 280 /* rsa->blinding is ours! */ 281 282 *local = 1; 283 } 284 else 285 { 286 /* resort to rsa->mt_blinding instead */ 287 288 *local = 0; /* instructs rsa_blinding_convert(), rsa_blinding_invert() 289 * that the BN_BLINDING is shared, meaning that accesses 290 * require locks, and that the blinding factor must be 291 * stored outside the BN_BLINDING 292 */ 293 294 if (rsa->mt_blinding == NULL) 295 { 296 if (!got_write_lock) 297 { 298 CRYPTO_r_unlock(CRYPTO_LOCK_RSA); 299 CRYPTO_w_lock(CRYPTO_LOCK_RSA); 300 got_write_lock = 1; 301 } 302 303 if (rsa->mt_blinding == NULL) 304 rsa->mt_blinding = RSA_setup_blinding(rsa, ctx); 305 } 306 ret = rsa->mt_blinding; 307 } 308 309 err: 310 if (got_write_lock) 311 CRYPTO_w_unlock(CRYPTO_LOCK_RSA); 312 else 313 CRYPTO_r_unlock(CRYPTO_LOCK_RSA); 314 return ret; 315 } 316 317 static int rsa_blinding_convert(BN_BLINDING *b, BIGNUM *f, BIGNUM *unblind, 318 BN_CTX *ctx) 319 { 320 if (unblind == NULL) 321 /* Local blinding: store the unblinding factor 322 * in BN_BLINDING. */ 323 return BN_BLINDING_convert_ex(f, NULL, b, ctx); 324 else 325 { 326 /* Shared blinding: store the unblinding factor 327 * outside BN_BLINDING. */ 328 int ret; 329 CRYPTO_w_lock(CRYPTO_LOCK_RSA_BLINDING); 330 ret = BN_BLINDING_convert_ex(f, unblind, b, ctx); 331 CRYPTO_w_unlock(CRYPTO_LOCK_RSA_BLINDING); 332 return ret; 333 } 334 } 335 336 static int rsa_blinding_invert(BN_BLINDING *b, BIGNUM *f, BIGNUM *unblind, 337 BN_CTX *ctx) 338 { 339 /* For local blinding, unblind is set to NULL, and BN_BLINDING_invert_ex 340 * will use the unblinding factor stored in BN_BLINDING. 341 * If BN_BLINDING is shared between threads, unblind must be non-null: 342 * BN_BLINDING_invert_ex will then use the local unblinding factor, 343 * and will only read the modulus from BN_BLINDING. 344 * In both cases it's safe to access the blinding without a lock. 345 */ 346 return BN_BLINDING_invert_ex(f, unblind, b, ctx); 347 } 348 349 /* signing */ 350 static int RSA_eay_private_encrypt(int flen, const unsigned char *from, 351 unsigned char *to, RSA *rsa, int padding) 352 { 353 BIGNUM *f, *ret, *res; 354 int i,j,k,num=0,r= -1; 355 unsigned char *buf=NULL; 356 BN_CTX *ctx=NULL; 357 int local_blinding = 0; 358 /* Used only if the blinding structure is shared. A non-NULL unblind 359 * instructs rsa_blinding_convert() and rsa_blinding_invert() to store 360 * the unblinding factor outside the blinding structure. */ 361 BIGNUM *unblind = NULL; 362 BN_BLINDING *blinding = NULL; 363 364 if ((ctx=BN_CTX_new()) == NULL) goto err; 365 BN_CTX_start(ctx); 366 f = BN_CTX_get(ctx); 367 ret = BN_CTX_get(ctx); 368 num = BN_num_bytes(rsa->n); 369 buf = OPENSSL_malloc(num); 370 if(!f || !ret || !buf) 371 { 372 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,ERR_R_MALLOC_FAILURE); 373 goto err; 374 } 375 376 switch (padding) 377 { 378 case RSA_PKCS1_PADDING: 379 i=RSA_padding_add_PKCS1_type_1(buf,num,from,flen); 380 break; 381 case RSA_X931_PADDING: 382 i=RSA_padding_add_X931(buf,num,from,flen); 383 break; 384 case RSA_NO_PADDING: 385 i=RSA_padding_add_none(buf,num,from,flen); 386 break; 387 case RSA_SSLV23_PADDING: 388 default: 389 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,RSA_R_UNKNOWN_PADDING_TYPE); 390 goto err; 391 } 392 if (i <= 0) goto err; 393 394 if (BN_bin2bn(buf,num,f) == NULL) goto err; 395 396 if (BN_ucmp(f, rsa->n) >= 0) 397 { 398 /* usually the padding functions would catch this */ 399 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS); 400 goto err; 401 } 402 403 if (!(rsa->flags & RSA_FLAG_NO_BLINDING)) 404 { 405 blinding = rsa_get_blinding(rsa, &local_blinding, ctx); 406 if (blinding == NULL) 407 { 408 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, ERR_R_INTERNAL_ERROR); 409 goto err; 410 } 411 } 412 413 if (blinding != NULL) 414 { 415 if (!local_blinding && ((unblind = BN_CTX_get(ctx)) == NULL)) 416 { 417 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,ERR_R_MALLOC_FAILURE); 418 goto err; 419 } 420 if (!rsa_blinding_convert(blinding, f, unblind, ctx)) 421 goto err; 422 } 423 424 if ( (rsa->flags & RSA_FLAG_EXT_PKEY) || 425 ((rsa->p != NULL) && 426 (rsa->q != NULL) && 427 (rsa->dmp1 != NULL) && 428 (rsa->dmq1 != NULL) && 429 (rsa->iqmp != NULL)) ) 430 { 431 if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx)) goto err; 432 } 433 else 434 { 435 BIGNUM local_d; 436 BIGNUM *d = NULL; 437 438 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 439 { 440 BN_init(&local_d); 441 d = &local_d; 442 BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME); 443 } 444 else 445 d= rsa->d; 446 447 if (rsa->flags & RSA_FLAG_CACHE_PUBLIC) 448 if(!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx)) 449 goto err; 450 451 if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx, 452 rsa->_method_mod_n)) goto err; 453 } 454 455 if (blinding) 456 if (!rsa_blinding_invert(blinding, ret, unblind, ctx)) 457 goto err; 458 459 if (padding == RSA_X931_PADDING) 460 { 461 BN_sub(f, rsa->n, ret); 462 if (BN_cmp(ret, f)) 463 res = f; 464 else 465 res = ret; 466 } 467 else 468 res = ret; 469 470 /* put in leading 0 bytes if the number is less than the 471 * length of the modulus */ 472 j=BN_num_bytes(res); 473 i=BN_bn2bin(res,&(to[num-j])); 474 for (k=0; k<(num-i); k++) 475 to[k]=0; 476 477 r=num; 478 err: 479 if (ctx != NULL) 480 { 481 BN_CTX_end(ctx); 482 BN_CTX_free(ctx); 483 } 484 if (buf != NULL) 485 { 486 OPENSSL_cleanse(buf,num); 487 OPENSSL_free(buf); 488 } 489 return(r); 490 } 491 492 static int RSA_eay_private_decrypt(int flen, const unsigned char *from, 493 unsigned char *to, RSA *rsa, int padding) 494 { 495 BIGNUM *f, *ret; 496 int j,num=0,r= -1; 497 unsigned char *p; 498 unsigned char *buf=NULL; 499 BN_CTX *ctx=NULL; 500 int local_blinding = 0; 501 /* Used only if the blinding structure is shared. A non-NULL unblind 502 * instructs rsa_blinding_convert() and rsa_blinding_invert() to store 503 * the unblinding factor outside the blinding structure. */ 504 BIGNUM *unblind = NULL; 505 BN_BLINDING *blinding = NULL; 506 507 if((ctx = BN_CTX_new()) == NULL) goto err; 508 BN_CTX_start(ctx); 509 f = BN_CTX_get(ctx); 510 ret = BN_CTX_get(ctx); 511 num = BN_num_bytes(rsa->n); 512 buf = OPENSSL_malloc(num); 513 if(!f || !ret || !buf) 514 { 515 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,ERR_R_MALLOC_FAILURE); 516 goto err; 517 } 518 519 /* This check was for equality but PGP does evil things 520 * and chops off the top '0' bytes */ 521 if (flen > num) 522 { 523 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_DATA_GREATER_THAN_MOD_LEN); 524 goto err; 525 } 526 527 /* make data into a big number */ 528 if (BN_bin2bn(from,(int)flen,f) == NULL) goto err; 529 530 if (BN_ucmp(f, rsa->n) >= 0) 531 { 532 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS); 533 goto err; 534 } 535 536 if (!(rsa->flags & RSA_FLAG_NO_BLINDING)) 537 { 538 blinding = rsa_get_blinding(rsa, &local_blinding, ctx); 539 if (blinding == NULL) 540 { 541 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_INTERNAL_ERROR); 542 goto err; 543 } 544 } 545 546 if (blinding != NULL) 547 { 548 if (!local_blinding && ((unblind = BN_CTX_get(ctx)) == NULL)) 549 { 550 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,ERR_R_MALLOC_FAILURE); 551 goto err; 552 } 553 if (!rsa_blinding_convert(blinding, f, unblind, ctx)) 554 goto err; 555 } 556 557 /* do the decrypt */ 558 if ( (rsa->flags & RSA_FLAG_EXT_PKEY) || 559 ((rsa->p != NULL) && 560 (rsa->q != NULL) && 561 (rsa->dmp1 != NULL) && 562 (rsa->dmq1 != NULL) && 563 (rsa->iqmp != NULL)) ) 564 { 565 if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx)) goto err; 566 } 567 else 568 { 569 BIGNUM local_d; 570 BIGNUM *d = NULL; 571 572 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 573 { 574 d = &local_d; 575 BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME); 576 } 577 else 578 d = rsa->d; 579 580 if (rsa->flags & RSA_FLAG_CACHE_PUBLIC) 581 if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx)) 582 goto err; 583 if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx, 584 rsa->_method_mod_n)) 585 goto err; 586 } 587 588 if (blinding) 589 if (!rsa_blinding_invert(blinding, ret, unblind, ctx)) 590 goto err; 591 592 p=buf; 593 j=BN_bn2bin(ret,p); /* j is only used with no-padding mode */ 594 595 switch (padding) 596 { 597 case RSA_PKCS1_PADDING: 598 r=RSA_padding_check_PKCS1_type_2(to,num,buf,j,num); 599 break; 600 #ifndef OPENSSL_NO_SHA 601 case RSA_PKCS1_OAEP_PADDING: 602 r=RSA_padding_check_PKCS1_OAEP(to,num,buf,j,num,NULL,0); 603 break; 604 #endif 605 case RSA_SSLV23_PADDING: 606 r=RSA_padding_check_SSLv23(to,num,buf,j,num); 607 break; 608 case RSA_NO_PADDING: 609 r=RSA_padding_check_none(to,num,buf,j,num); 610 break; 611 default: 612 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_UNKNOWN_PADDING_TYPE); 613 goto err; 614 } 615 if (r < 0) 616 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_PADDING_CHECK_FAILED); 617 618 err: 619 if (ctx != NULL) 620 { 621 BN_CTX_end(ctx); 622 BN_CTX_free(ctx); 623 } 624 if (buf != NULL) 625 { 626 OPENSSL_cleanse(buf,num); 627 OPENSSL_free(buf); 628 } 629 return(r); 630 } 631 632 /* signature verification */ 633 static int RSA_eay_public_decrypt(int flen, const unsigned char *from, 634 unsigned char *to, RSA *rsa, int padding) 635 { 636 BIGNUM *f,*ret; 637 int i,num=0,r= -1; 638 unsigned char *p; 639 unsigned char *buf=NULL; 640 BN_CTX *ctx=NULL; 641 642 if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) 643 { 644 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_MODULUS_TOO_LARGE); 645 return -1; 646 } 647 648 if (BN_ucmp(rsa->n, rsa->e) <= 0) 649 { 650 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE); 651 return -1; 652 } 653 654 /* for large moduli, enforce exponent limit */ 655 if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) 656 { 657 if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) 658 { 659 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE); 660 return -1; 661 } 662 } 663 664 if((ctx = BN_CTX_new()) == NULL) goto err; 665 BN_CTX_start(ctx); 666 f = BN_CTX_get(ctx); 667 ret = BN_CTX_get(ctx); 668 num=BN_num_bytes(rsa->n); 669 buf = OPENSSL_malloc(num); 670 if(!f || !ret || !buf) 671 { 672 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,ERR_R_MALLOC_FAILURE); 673 goto err; 674 } 675 676 /* This check was for equality but PGP does evil things 677 * and chops off the top '0' bytes */ 678 if (flen > num) 679 { 680 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_DATA_GREATER_THAN_MOD_LEN); 681 goto err; 682 } 683 684 if (BN_bin2bn(from,flen,f) == NULL) goto err; 685 686 if (BN_ucmp(f, rsa->n) >= 0) 687 { 688 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS); 689 goto err; 690 } 691 692 if (rsa->flags & RSA_FLAG_CACHE_PUBLIC) 693 if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx)) 694 goto err; 695 696 if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx, 697 rsa->_method_mod_n)) goto err; 698 699 if ((padding == RSA_X931_PADDING) && ((ret->d[0] & 0xf) != 12)) 700 if (!BN_sub(ret, rsa->n, ret)) goto err; 701 702 p=buf; 703 i=BN_bn2bin(ret,p); 704 705 switch (padding) 706 { 707 case RSA_PKCS1_PADDING: 708 r=RSA_padding_check_PKCS1_type_1(to,num,buf,i,num); 709 break; 710 case RSA_X931_PADDING: 711 r=RSA_padding_check_X931(to,num,buf,i,num); 712 break; 713 case RSA_NO_PADDING: 714 r=RSA_padding_check_none(to,num,buf,i,num); 715 break; 716 default: 717 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_UNKNOWN_PADDING_TYPE); 718 goto err; 719 } 720 if (r < 0) 721 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_PADDING_CHECK_FAILED); 722 723 err: 724 if (ctx != NULL) 725 { 726 BN_CTX_end(ctx); 727 BN_CTX_free(ctx); 728 } 729 if (buf != NULL) 730 { 731 OPENSSL_cleanse(buf,num); 732 OPENSSL_free(buf); 733 } 734 return(r); 735 } 736 737 static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) 738 { 739 BIGNUM *r1,*m1,*vrfy; 740 BIGNUM local_dmp1,local_dmq1,local_c,local_r1; 741 BIGNUM *dmp1,*dmq1,*c,*pr1; 742 int ret=0; 743 744 BN_CTX_start(ctx); 745 r1 = BN_CTX_get(ctx); 746 m1 = BN_CTX_get(ctx); 747 vrfy = BN_CTX_get(ctx); 748 749 { 750 BIGNUM local_p, local_q; 751 BIGNUM *p = NULL, *q = NULL; 752 753 /* Make sure BN_mod_inverse in Montgomery intialization uses the 754 * BN_FLG_CONSTTIME flag (unless RSA_FLAG_NO_CONSTTIME is set) 755 */ 756 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 757 { 758 BN_init(&local_p); 759 p = &local_p; 760 BN_with_flags(p, rsa->p, BN_FLG_CONSTTIME); 761 762 BN_init(&local_q); 763 q = &local_q; 764 BN_with_flags(q, rsa->q, BN_FLG_CONSTTIME); 765 } 766 else 767 { 768 p = rsa->p; 769 q = rsa->q; 770 } 771 772 if (rsa->flags & RSA_FLAG_CACHE_PRIVATE) 773 { 774 if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_p, CRYPTO_LOCK_RSA, p, ctx)) 775 goto err; 776 if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_q, CRYPTO_LOCK_RSA, q, ctx)) 777 goto err; 778 } 779 } 780 781 if (rsa->flags & RSA_FLAG_CACHE_PUBLIC) 782 if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx)) 783 goto err; 784 785 /* compute I mod q */ 786 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 787 { 788 c = &local_c; 789 BN_with_flags(c, I, BN_FLG_CONSTTIME); 790 if (!BN_mod(r1,c,rsa->q,ctx)) goto err; 791 } 792 else 793 { 794 if (!BN_mod(r1,I,rsa->q,ctx)) goto err; 795 } 796 797 /* compute r1^dmq1 mod q */ 798 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 799 { 800 dmq1 = &local_dmq1; 801 BN_with_flags(dmq1, rsa->dmq1, BN_FLG_CONSTTIME); 802 } 803 else 804 dmq1 = rsa->dmq1; 805 if (!rsa->meth->bn_mod_exp(m1,r1,dmq1,rsa->q,ctx, 806 rsa->_method_mod_q)) goto err; 807 808 /* compute I mod p */ 809 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 810 { 811 c = &local_c; 812 BN_with_flags(c, I, BN_FLG_CONSTTIME); 813 if (!BN_mod(r1,c,rsa->p,ctx)) goto err; 814 } 815 else 816 { 817 if (!BN_mod(r1,I,rsa->p,ctx)) goto err; 818 } 819 820 /* compute r1^dmp1 mod p */ 821 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 822 { 823 dmp1 = &local_dmp1; 824 BN_with_flags(dmp1, rsa->dmp1, BN_FLG_CONSTTIME); 825 } 826 else 827 dmp1 = rsa->dmp1; 828 if (!rsa->meth->bn_mod_exp(r0,r1,dmp1,rsa->p,ctx, 829 rsa->_method_mod_p)) goto err; 830 831 if (!BN_sub(r0,r0,m1)) goto err; 832 /* This will help stop the size of r0 increasing, which does 833 * affect the multiply if it optimised for a power of 2 size */ 834 if (BN_is_negative(r0)) 835 if (!BN_add(r0,r0,rsa->p)) goto err; 836 837 if (!BN_mul(r1,r0,rsa->iqmp,ctx)) goto err; 838 839 /* Turn BN_FLG_CONSTTIME flag on before division operation */ 840 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 841 { 842 pr1 = &local_r1; 843 BN_with_flags(pr1, r1, BN_FLG_CONSTTIME); 844 } 845 else 846 pr1 = r1; 847 if (!BN_mod(r0,pr1,rsa->p,ctx)) goto err; 848 849 /* If p < q it is occasionally possible for the correction of 850 * adding 'p' if r0 is negative above to leave the result still 851 * negative. This can break the private key operations: the following 852 * second correction should *always* correct this rare occurrence. 853 * This will *never* happen with OpenSSL generated keys because 854 * they ensure p > q [steve] 855 */ 856 if (BN_is_negative(r0)) 857 if (!BN_add(r0,r0,rsa->p)) goto err; 858 if (!BN_mul(r1,r0,rsa->q,ctx)) goto err; 859 if (!BN_add(r0,r1,m1)) goto err; 860 861 if (rsa->e && rsa->n) 862 { 863 if (!rsa->meth->bn_mod_exp(vrfy,r0,rsa->e,rsa->n,ctx,rsa->_method_mod_n)) goto err; 864 /* If 'I' was greater than (or equal to) rsa->n, the operation 865 * will be equivalent to using 'I mod n'. However, the result of 866 * the verify will *always* be less than 'n' so we don't check 867 * for absolute equality, just congruency. */ 868 if (!BN_sub(vrfy, vrfy, I)) goto err; 869 if (!BN_mod(vrfy, vrfy, rsa->n, ctx)) goto err; 870 if (BN_is_negative(vrfy)) 871 if (!BN_add(vrfy, vrfy, rsa->n)) goto err; 872 if (!BN_is_zero(vrfy)) 873 { 874 /* 'I' and 'vrfy' aren't congruent mod n. Don't leak 875 * miscalculated CRT output, just do a raw (slower) 876 * mod_exp and return that instead. */ 877 878 BIGNUM local_d; 879 BIGNUM *d = NULL; 880 881 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 882 { 883 d = &local_d; 884 BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME); 885 } 886 else 887 d = rsa->d; 888 if (!rsa->meth->bn_mod_exp(r0,I,d,rsa->n,ctx, 889 rsa->_method_mod_n)) goto err; 890 } 891 } 892 ret=1; 893 err: 894 BN_CTX_end(ctx); 895 return(ret); 896 } 897 898 static int RSA_eay_init(RSA *rsa) 899 { 900 rsa->flags|=RSA_FLAG_CACHE_PUBLIC|RSA_FLAG_CACHE_PRIVATE; 901 return(1); 902 } 903 904 static int RSA_eay_finish(RSA *rsa) 905 { 906 if (rsa->_method_mod_n != NULL) 907 BN_MONT_CTX_free(rsa->_method_mod_n); 908 if (rsa->_method_mod_p != NULL) 909 BN_MONT_CTX_free(rsa->_method_mod_p); 910 if (rsa->_method_mod_q != NULL) 911 BN_MONT_CTX_free(rsa->_method_mod_q); 912 return(1); 913 } 914 915 #endif 916