1 /* crypto/engine/eng_rsax.c */ 2 /* Copyright (c) 2010-2010 Intel Corp. 3 * Author: Vinodh.Gopal@intel.com 4 * Jim Guilford 5 * Erdinc.Ozturk@intel.com 6 * Maxim.Perminov@intel.com 7 * Ying.Huang@intel.com 8 * 9 * More information about algorithm used can be found at: 10 * http://www.cse.buffalo.edu/srds2009/escs2009_submission_Gopal.pdf 11 */ 12 /* ==================================================================== 13 * Copyright (c) 1999-2001 The OpenSSL Project. All rights reserved. 14 * 15 * Redistribution and use in source and binary forms, with or without 16 * modification, are permitted provided that the following conditions 17 * are met: 18 * 19 * 1. Redistributions of source code must retain the above copyright 20 * notice, this list of conditions and the following disclaimer. 21 * 22 * 2. Redistributions in binary form must reproduce the above copyright 23 * notice, this list of conditions and the following disclaimer in 24 * the documentation and/or other materials provided with the 25 * distribution. 26 * 27 * 3. All advertising materials mentioning features or use of this 28 * software must display the following acknowledgment: 29 * "This product includes software developed by the OpenSSL Project 30 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 31 * 32 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 33 * endorse or promote products derived from this software without 34 * prior written permission. For written permission, please contact 35 * licensing@OpenSSL.org. 36 * 37 * 5. Products derived from this software may not be called "OpenSSL" 38 * nor may "OpenSSL" appear in their names without prior written 39 * permission of the OpenSSL Project. 40 * 41 * 6. Redistributions of any form whatsoever must retain the following 42 * acknowledgment: 43 * "This product includes software developed by the OpenSSL Project 44 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 45 * 46 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 47 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 48 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 49 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 50 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 51 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 52 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 53 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 54 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 55 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 56 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 57 * OF THE POSSIBILITY OF SUCH DAMAGE. 58 * ==================================================================== 59 * 60 * This product includes cryptographic software written by Eric Young 61 * (eay@cryptsoft.com). This product includes software written by Tim 62 * Hudson (tjh@cryptsoft.com). 63 */ 64 65 #include <openssl/opensslconf.h> 66 67 #include <stdio.h> 68 #include <string.h> 69 #include <openssl/crypto.h> 70 #include <openssl/buffer.h> 71 #include <openssl/engine.h> 72 #ifndef OPENSSL_NO_RSA 73 #include <openssl/rsa.h> 74 #endif 75 #include <openssl/bn.h> 76 #include <openssl/err.h> 77 78 /* RSAX is available **ONLY* on x86_64 CPUs */ 79 #undef COMPILE_RSAX 80 81 #if (defined(__x86_64) || defined(__x86_64__) || \ 82 defined(_M_AMD64) || defined (_M_X64)) && !defined(OPENSSL_NO_ASM) 83 #define COMPILE_RSAX 84 static ENGINE *ENGINE_rsax (void); 85 #endif 86 87 void ENGINE_load_rsax (void) 88 { 89 /* On non-x86 CPUs it just returns. */ 90 #ifdef COMPILE_RSAX 91 ENGINE *toadd = ENGINE_rsax(); 92 if(!toadd) return; 93 ENGINE_add(toadd); 94 ENGINE_free(toadd); 95 ERR_clear_error(); 96 #endif 97 } 98 99 #ifdef COMPILE_RSAX 100 #define E_RSAX_LIB_NAME "rsax engine" 101 102 static int e_rsax_destroy(ENGINE *e); 103 static int e_rsax_init(ENGINE *e); 104 static int e_rsax_finish(ENGINE *e); 105 static int e_rsax_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void)); 106 107 #ifndef OPENSSL_NO_RSA 108 /* RSA stuff */ 109 static int e_rsax_rsa_mod_exp(BIGNUM *r, const BIGNUM *I, RSA *rsa, BN_CTX *ctx); 110 static int e_rsax_rsa_finish(RSA *r); 111 #endif 112 113 static const ENGINE_CMD_DEFN e_rsax_cmd_defns[] = { 114 {0, NULL, NULL, 0} 115 }; 116 117 #ifndef OPENSSL_NO_RSA 118 /* Our internal RSA_METHOD that we provide pointers to */ 119 static RSA_METHOD e_rsax_rsa = 120 { 121 "Intel RSA-X method", 122 NULL, 123 NULL, 124 NULL, 125 NULL, 126 e_rsax_rsa_mod_exp, 127 NULL, 128 NULL, 129 e_rsax_rsa_finish, 130 RSA_FLAG_CACHE_PUBLIC|RSA_FLAG_CACHE_PRIVATE, 131 NULL, 132 NULL, 133 NULL 134 }; 135 #endif 136 137 /* Constants used when creating the ENGINE */ 138 static const char *engine_e_rsax_id = "rsax"; 139 static const char *engine_e_rsax_name = "RSAX engine support"; 140 141 /* This internal function is used by ENGINE_rsax() */ 142 static int bind_helper(ENGINE *e) 143 { 144 #ifndef OPENSSL_NO_RSA 145 const RSA_METHOD *meth1; 146 #endif 147 if(!ENGINE_set_id(e, engine_e_rsax_id) || 148 !ENGINE_set_name(e, engine_e_rsax_name) || 149 #ifndef OPENSSL_NO_RSA 150 !ENGINE_set_RSA(e, &e_rsax_rsa) || 151 #endif 152 !ENGINE_set_destroy_function(e, e_rsax_destroy) || 153 !ENGINE_set_init_function(e, e_rsax_init) || 154 !ENGINE_set_finish_function(e, e_rsax_finish) || 155 !ENGINE_set_ctrl_function(e, e_rsax_ctrl) || 156 !ENGINE_set_cmd_defns(e, e_rsax_cmd_defns)) 157 return 0; 158 159 #ifndef OPENSSL_NO_RSA 160 meth1 = RSA_PKCS1_SSLeay(); 161 e_rsax_rsa.rsa_pub_enc = meth1->rsa_pub_enc; 162 e_rsax_rsa.rsa_pub_dec = meth1->rsa_pub_dec; 163 e_rsax_rsa.rsa_priv_enc = meth1->rsa_priv_enc; 164 e_rsax_rsa.rsa_priv_dec = meth1->rsa_priv_dec; 165 e_rsax_rsa.bn_mod_exp = meth1->bn_mod_exp; 166 #endif 167 return 1; 168 } 169 170 static ENGINE *ENGINE_rsax(void) 171 { 172 ENGINE *ret = ENGINE_new(); 173 if(!ret) 174 return NULL; 175 if(!bind_helper(ret)) 176 { 177 ENGINE_free(ret); 178 return NULL; 179 } 180 return ret; 181 } 182 183 #ifndef OPENSSL_NO_RSA 184 /* Used to attach our own key-data to an RSA structure */ 185 static int rsax_ex_data_idx = -1; 186 #endif 187 188 static int e_rsax_destroy(ENGINE *e) 189 { 190 return 1; 191 } 192 193 /* (de)initialisation functions. */ 194 static int e_rsax_init(ENGINE *e) 195 { 196 #ifndef OPENSSL_NO_RSA 197 if (rsax_ex_data_idx == -1) 198 rsax_ex_data_idx = RSA_get_ex_new_index(0, 199 NULL, 200 NULL, NULL, NULL); 201 #endif 202 if (rsax_ex_data_idx == -1) 203 return 0; 204 return 1; 205 } 206 207 static int e_rsax_finish(ENGINE *e) 208 { 209 return 1; 210 } 211 212 static int e_rsax_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void)) 213 { 214 int to_return = 1; 215 216 switch(cmd) 217 { 218 /* The command isn't understood by this engine */ 219 default: 220 to_return = 0; 221 break; 222 } 223 224 return to_return; 225 } 226 227 228 #ifndef OPENSSL_NO_RSA 229 230 #ifdef _WIN32 231 typedef unsigned __int64 UINT64; 232 #else 233 typedef unsigned long long UINT64; 234 #endif 235 typedef unsigned short UINT16; 236 237 /* Table t is interleaved in the following manner: 238 * The order in memory is t[0][0], t[0][1], ..., t[0][7], t[1][0], ... 239 * A particular 512-bit value is stored in t[][index] rather than the more 240 * normal t[index][]; i.e. the qwords of a particular entry in t are not 241 * adjacent in memory 242 */ 243 244 /* Init BIGNUM b from the interleaved UINT64 array */ 245 static int interleaved_array_to_bn_512(BIGNUM* b, UINT64 *array); 246 247 /* Extract array elements from BIGNUM b 248 * To set the whole array from b, call with n=8 249 */ 250 static int bn_extract_to_array_512(const BIGNUM* b, unsigned int n, UINT64 *array); 251 252 struct mod_ctx_512 { 253 UINT64 t[8][8]; 254 UINT64 m[8]; 255 UINT64 m1[8]; /* 2^278 % m */ 256 UINT64 m2[8]; /* 2^640 % m */ 257 UINT64 k1[2]; /* (- 1/m) % 2^128 */ 258 }; 259 260 static int mod_exp_pre_compute_data_512(UINT64 *m, struct mod_ctx_512 *data); 261 262 void mod_exp_512(UINT64 *result, /* 512 bits, 8 qwords */ 263 UINT64 *g, /* 512 bits, 8 qwords */ 264 UINT64 *exp, /* 512 bits, 8 qwords */ 265 struct mod_ctx_512 *data); 266 267 typedef struct st_e_rsax_mod_ctx 268 { 269 UINT64 type; 270 union { 271 struct mod_ctx_512 b512; 272 } ctx; 273 274 } E_RSAX_MOD_CTX; 275 276 static E_RSAX_MOD_CTX *e_rsax_get_ctx(RSA *rsa, int idx, BIGNUM* m) 277 { 278 E_RSAX_MOD_CTX *hptr; 279 280 if (idx < 0 || idx > 2) 281 return NULL; 282 283 hptr = RSA_get_ex_data(rsa, rsax_ex_data_idx); 284 if (!hptr) { 285 hptr = OPENSSL_malloc(3*sizeof(E_RSAX_MOD_CTX)); 286 if (!hptr) return NULL; 287 hptr[2].type = hptr[1].type= hptr[0].type = 0; 288 RSA_set_ex_data(rsa, rsax_ex_data_idx, hptr); 289 } 290 291 if (hptr[idx].type == (UINT64)BN_num_bits(m)) 292 return hptr+idx; 293 294 if (BN_num_bits(m) == 512) { 295 UINT64 _m[8]; 296 bn_extract_to_array_512(m, 8, _m); 297 memset( &hptr[idx].ctx.b512, 0, sizeof(struct mod_ctx_512)); 298 mod_exp_pre_compute_data_512(_m, &hptr[idx].ctx.b512); 299 } 300 301 hptr[idx].type = BN_num_bits(m); 302 return hptr+idx; 303 } 304 305 static int e_rsax_rsa_finish(RSA *rsa) 306 { 307 E_RSAX_MOD_CTX *hptr = RSA_get_ex_data(rsa, rsax_ex_data_idx); 308 if(hptr) 309 { 310 OPENSSL_free(hptr); 311 RSA_set_ex_data(rsa, rsax_ex_data_idx, NULL); 312 } 313 if (rsa->_method_mod_n) 314 BN_MONT_CTX_free(rsa->_method_mod_n); 315 if (rsa->_method_mod_p) 316 BN_MONT_CTX_free(rsa->_method_mod_p); 317 if (rsa->_method_mod_q) 318 BN_MONT_CTX_free(rsa->_method_mod_q); 319 return 1; 320 } 321 322 323 static int e_rsax_bn_mod_exp(BIGNUM *r, const BIGNUM *g, const BIGNUM *e, 324 const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont, E_RSAX_MOD_CTX* rsax_mod_ctx ) 325 { 326 if (rsax_mod_ctx && BN_get_flags(e, BN_FLG_CONSTTIME) != 0) { 327 if (BN_num_bits(m) == 512) { 328 UINT64 _r[8]; 329 UINT64 _g[8]; 330 UINT64 _e[8]; 331 332 /* Init the arrays from the BIGNUMs */ 333 bn_extract_to_array_512(g, 8, _g); 334 bn_extract_to_array_512(e, 8, _e); 335 336 mod_exp_512(_r, _g, _e, &rsax_mod_ctx->ctx.b512); 337 /* Return the result in the BIGNUM */ 338 interleaved_array_to_bn_512(r, _r); 339 return 1; 340 } 341 } 342 343 return BN_mod_exp_mont(r, g, e, m, ctx, in_mont); 344 } 345 346 /* Declares for the Intel CIAP 512-bit / CRT / 1024 bit RSA modular 347 * exponentiation routine precalculations and a structure to hold the 348 * necessary values. These files are meant to live in crypto/rsa/ in 349 * the target openssl. 350 */ 351 352 /* 353 * Local method: extracts a piece from a BIGNUM, to fit it into 354 * an array. Call with n=8 to extract an entire 512-bit BIGNUM 355 */ 356 static int bn_extract_to_array_512(const BIGNUM* b, unsigned int n, UINT64 *array) 357 { 358 int i; 359 UINT64 tmp; 360 unsigned char bn_buff[64]; 361 memset(bn_buff, 0, 64); 362 if (BN_num_bytes(b) > 64) { 363 printf ("Can't support this byte size\n"); 364 return 0; } 365 if (BN_num_bytes(b)!=0) { 366 if (!BN_bn2bin(b, bn_buff+(64-BN_num_bytes(b)))) { 367 printf ("Error's in bn2bin\n"); 368 /* We have to error, here */ 369 return 0; } } 370 while (n-- > 0) { 371 array[n] = 0; 372 for (i=7; i>=0; i--) { 373 tmp = bn_buff[63-(n*8+i)]; 374 array[n] |= tmp << (8*i); } } 375 return 1; 376 } 377 378 /* Init a 512-bit BIGNUM from the UINT64*_ (8 * 64) interleaved array */ 379 static int interleaved_array_to_bn_512(BIGNUM* b, UINT64 *array) 380 { 381 unsigned char tmp[64]; 382 int n=8; 383 int i; 384 while (n-- > 0) { 385 for (i = 7; i>=0; i--) { 386 tmp[63-(n*8+i)] = (unsigned char)(array[n]>>(8*i)); } } 387 BN_bin2bn(tmp, 64, b); 388 return 0; 389 } 390 391 392 /* The main 512bit precompute call */ 393 static int mod_exp_pre_compute_data_512(UINT64 *m, struct mod_ctx_512 *data) 394 { 395 BIGNUM two_768, two_640, two_128, two_512, tmp, _m, tmp2; 396 397 /* We need a BN_CTX for the modulo functions */ 398 BN_CTX* ctx; 399 /* Some tmps */ 400 UINT64 _t[8]; 401 int i, j, ret = 0; 402 403 /* Init _m with m */ 404 BN_init(&_m); 405 interleaved_array_to_bn_512(&_m, m); 406 memset(_t, 0, 64); 407 408 /* Inits */ 409 BN_init(&two_768); 410 BN_init(&two_640); 411 BN_init(&two_128); 412 BN_init(&two_512); 413 BN_init(&tmp); 414 BN_init(&tmp2); 415 416 /* Create our context */ 417 if ((ctx=BN_CTX_new()) == NULL) { goto err; } 418 BN_CTX_start(ctx); 419 420 /* 421 * For production, if you care, these only need to be set once, 422 * and may be made constants. 423 */ 424 BN_lshift(&two_768, BN_value_one(), 768); 425 BN_lshift(&two_640, BN_value_one(), 640); 426 BN_lshift(&two_128, BN_value_one(), 128); 427 BN_lshift(&two_512, BN_value_one(), 512); 428 429 if (0 == (m[7] & 0x8000000000000000)) { 430 exit(1); 431 } 432 if (0 == (m[0] & 0x1)) { /* Odd modulus required for Mont */ 433 exit(1); 434 } 435 436 /* Precompute m1 */ 437 BN_mod(&tmp, &two_768, &_m, ctx); 438 if (!bn_extract_to_array_512(&tmp, 8, &data->m1[0])) { 439 goto err; } 440 441 /* Precompute m2 */ 442 BN_mod(&tmp, &two_640, &_m, ctx); 443 if (!bn_extract_to_array_512(&tmp, 8, &data->m2[0])) { 444 goto err; 445 } 446 447 /* 448 * Precompute k1, a 128b number = ((-1)* m-1 ) mod 2128; k1 should 449 * be non-negative. 450 */ 451 BN_mod_inverse(&tmp, &_m, &two_128, ctx); 452 if (!BN_is_zero(&tmp)) { BN_sub(&tmp, &two_128, &tmp); } 453 if (!bn_extract_to_array_512(&tmp, 2, &data->k1[0])) { 454 goto err; } 455 456 /* Precompute t */ 457 for (i=0; i<8; i++) { 458 BN_zero(&tmp); 459 if (i & 1) { BN_add(&tmp, &two_512, &tmp); } 460 if (i & 2) { BN_add(&tmp, &two_512, &tmp); } 461 if (i & 4) { BN_add(&tmp, &two_640, &tmp); } 462 463 BN_nnmod(&tmp2, &tmp, &_m, ctx); 464 if (!bn_extract_to_array_512(&tmp2, 8, _t)) { 465 goto err; } 466 for (j=0; j<8; j++) data->t[j][i] = _t[j]; } 467 468 /* Precompute m */ 469 for (i=0; i<8; i++) { 470 data->m[i] = m[i]; } 471 472 ret = 1; 473 474 err: 475 /* Cleanup */ 476 if (ctx != NULL) { 477 BN_CTX_end(ctx); BN_CTX_free(ctx); } 478 BN_free(&two_768); 479 BN_free(&two_640); 480 BN_free(&two_128); 481 BN_free(&two_512); 482 BN_free(&tmp); 483 BN_free(&tmp2); 484 BN_free(&_m); 485 486 return ret; 487 } 488 489 490 static int e_rsax_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) 491 { 492 BIGNUM *r1,*m1,*vrfy; 493 BIGNUM local_dmp1,local_dmq1,local_c,local_r1; 494 BIGNUM *dmp1,*dmq1,*c,*pr1; 495 int ret=0; 496 497 BN_CTX_start(ctx); 498 r1 = BN_CTX_get(ctx); 499 m1 = BN_CTX_get(ctx); 500 vrfy = BN_CTX_get(ctx); 501 502 { 503 BIGNUM local_p, local_q; 504 BIGNUM *p = NULL, *q = NULL; 505 int error = 0; 506 507 /* Make sure BN_mod_inverse in Montgomery 508 * intialization uses the BN_FLG_CONSTTIME flag 509 * (unless RSA_FLAG_NO_CONSTTIME is set) 510 */ 511 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 512 { 513 BN_init(&local_p); 514 p = &local_p; 515 BN_with_flags(p, rsa->p, BN_FLG_CONSTTIME); 516 517 BN_init(&local_q); 518 q = &local_q; 519 BN_with_flags(q, rsa->q, BN_FLG_CONSTTIME); 520 } 521 else 522 { 523 p = rsa->p; 524 q = rsa->q; 525 } 526 527 if (rsa->flags & RSA_FLAG_CACHE_PRIVATE) 528 { 529 if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_p, CRYPTO_LOCK_RSA, p, ctx)) 530 error = 1; 531 if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_q, CRYPTO_LOCK_RSA, q, ctx)) 532 error = 1; 533 } 534 535 /* clean up */ 536 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 537 { 538 BN_free(&local_p); 539 BN_free(&local_q); 540 } 541 if ( error ) 542 goto err; 543 } 544 545 if (rsa->flags & RSA_FLAG_CACHE_PUBLIC) 546 if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx)) 547 goto err; 548 549 /* compute I mod q */ 550 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 551 { 552 c = &local_c; 553 BN_with_flags(c, I, BN_FLG_CONSTTIME); 554 if (!BN_mod(r1,c,rsa->q,ctx)) goto err; 555 } 556 else 557 { 558 if (!BN_mod(r1,I,rsa->q,ctx)) goto err; 559 } 560 561 /* compute r1^dmq1 mod q */ 562 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 563 { 564 dmq1 = &local_dmq1; 565 BN_with_flags(dmq1, rsa->dmq1, BN_FLG_CONSTTIME); 566 } 567 else 568 dmq1 = rsa->dmq1; 569 570 if (!e_rsax_bn_mod_exp(m1,r1,dmq1,rsa->q,ctx, 571 rsa->_method_mod_q, e_rsax_get_ctx(rsa, 0, rsa->q) )) goto err; 572 573 /* compute I mod p */ 574 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 575 { 576 c = &local_c; 577 BN_with_flags(c, I, BN_FLG_CONSTTIME); 578 if (!BN_mod(r1,c,rsa->p,ctx)) goto err; 579 } 580 else 581 { 582 if (!BN_mod(r1,I,rsa->p,ctx)) goto err; 583 } 584 585 /* compute r1^dmp1 mod p */ 586 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 587 { 588 dmp1 = &local_dmp1; 589 BN_with_flags(dmp1, rsa->dmp1, BN_FLG_CONSTTIME); 590 } 591 else 592 dmp1 = rsa->dmp1; 593 594 if (!e_rsax_bn_mod_exp(r0,r1,dmp1,rsa->p,ctx, 595 rsa->_method_mod_p, e_rsax_get_ctx(rsa, 1, rsa->p) )) goto err; 596 597 if (!BN_sub(r0,r0,m1)) goto err; 598 /* This will help stop the size of r0 increasing, which does 599 * affect the multiply if it optimised for a power of 2 size */ 600 if (BN_is_negative(r0)) 601 if (!BN_add(r0,r0,rsa->p)) goto err; 602 603 if (!BN_mul(r1,r0,rsa->iqmp,ctx)) goto err; 604 605 /* Turn BN_FLG_CONSTTIME flag on before division operation */ 606 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 607 { 608 pr1 = &local_r1; 609 BN_with_flags(pr1, r1, BN_FLG_CONSTTIME); 610 } 611 else 612 pr1 = r1; 613 if (!BN_mod(r0,pr1,rsa->p,ctx)) goto err; 614 615 /* If p < q it is occasionally possible for the correction of 616 * adding 'p' if r0 is negative above to leave the result still 617 * negative. This can break the private key operations: the following 618 * second correction should *always* correct this rare occurrence. 619 * This will *never* happen with OpenSSL generated keys because 620 * they ensure p > q [steve] 621 */ 622 if (BN_is_negative(r0)) 623 if (!BN_add(r0,r0,rsa->p)) goto err; 624 if (!BN_mul(r1,r0,rsa->q,ctx)) goto err; 625 if (!BN_add(r0,r1,m1)) goto err; 626 627 if (rsa->e && rsa->n) 628 { 629 if (!e_rsax_bn_mod_exp(vrfy,r0,rsa->e,rsa->n,ctx,rsa->_method_mod_n, e_rsax_get_ctx(rsa, 2, rsa->n) )) 630 goto err; 631 632 /* If 'I' was greater than (or equal to) rsa->n, the operation 633 * will be equivalent to using 'I mod n'. However, the result of 634 * the verify will *always* be less than 'n' so we don't check 635 * for absolute equality, just congruency. */ 636 if (!BN_sub(vrfy, vrfy, I)) goto err; 637 if (!BN_mod(vrfy, vrfy, rsa->n, ctx)) goto err; 638 if (BN_is_negative(vrfy)) 639 if (!BN_add(vrfy, vrfy, rsa->n)) goto err; 640 if (!BN_is_zero(vrfy)) 641 { 642 /* 'I' and 'vrfy' aren't congruent mod n. Don't leak 643 * miscalculated CRT output, just do a raw (slower) 644 * mod_exp and return that instead. */ 645 646 BIGNUM local_d; 647 BIGNUM *d = NULL; 648 649 if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) 650 { 651 d = &local_d; 652 BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME); 653 } 654 else 655 d = rsa->d; 656 if (!e_rsax_bn_mod_exp(r0,I,d,rsa->n,ctx, 657 rsa->_method_mod_n, e_rsax_get_ctx(rsa, 2, rsa->n) )) goto err; 658 } 659 } 660 ret=1; 661 662 err: 663 BN_CTX_end(ctx); 664 665 return ret; 666 } 667 #endif /* !OPENSSL_NO_RSA */ 668 #endif /* !COMPILE_RSAX */