Home | History | Annotate | Download | only in rsa
      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, int local, BIGNUM *f,
    318 	BIGNUM *r, BN_CTX *ctx)
    319 {
    320 	if (local)
    321 		return BN_BLINDING_convert_ex(f, NULL, b, ctx);
    322 	else
    323 		{
    324 		int ret;
    325 		CRYPTO_r_lock(CRYPTO_LOCK_RSA_BLINDING);
    326 		ret = BN_BLINDING_convert_ex(f, r, b, ctx);
    327 		CRYPTO_r_unlock(CRYPTO_LOCK_RSA_BLINDING);
    328 		return ret;
    329 		}
    330 }
    331 
    332 static int rsa_blinding_invert(BN_BLINDING *b, int local, BIGNUM *f,
    333 	BIGNUM *r, BN_CTX *ctx)
    334 {
    335 	if (local)
    336 		return BN_BLINDING_invert_ex(f, NULL, b, ctx);
    337 	else
    338 		{
    339 		int ret;
    340 		CRYPTO_w_lock(CRYPTO_LOCK_RSA_BLINDING);
    341 		ret = BN_BLINDING_invert_ex(f, r, b, ctx);
    342 		CRYPTO_w_unlock(CRYPTO_LOCK_RSA_BLINDING);
    343 		return ret;
    344 		}
    345 }
    346 
    347 /* signing */
    348 static int RSA_eay_private_encrypt(int flen, const unsigned char *from,
    349 	     unsigned char *to, RSA *rsa, int padding)
    350 	{
    351 	BIGNUM *f, *ret, *br, *res;
    352 	int i,j,k,num=0,r= -1;
    353 	unsigned char *buf=NULL;
    354 	BN_CTX *ctx=NULL;
    355 	int local_blinding = 0;
    356 	BN_BLINDING *blinding = NULL;
    357 
    358 	if ((ctx=BN_CTX_new()) == NULL) goto err;
    359 	BN_CTX_start(ctx);
    360 	f   = BN_CTX_get(ctx);
    361 	br  = BN_CTX_get(ctx);
    362 	ret = BN_CTX_get(ctx);
    363 	num = BN_num_bytes(rsa->n);
    364 	buf = OPENSSL_malloc(num);
    365 	if(!f || !ret || !buf)
    366 		{
    367 		RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,ERR_R_MALLOC_FAILURE);
    368 		goto err;
    369 		}
    370 
    371 	switch (padding)
    372 		{
    373 	case RSA_PKCS1_PADDING:
    374 		i=RSA_padding_add_PKCS1_type_1(buf,num,from,flen);
    375 		break;
    376 	case RSA_X931_PADDING:
    377 		i=RSA_padding_add_X931(buf,num,from,flen);
    378 		break;
    379 	case RSA_NO_PADDING:
    380 		i=RSA_padding_add_none(buf,num,from,flen);
    381 		break;
    382 	case RSA_SSLV23_PADDING:
    383 	default:
    384 		RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
    385 		goto err;
    386 		}
    387 	if (i <= 0) goto err;
    388 
    389 	if (BN_bin2bn(buf,num,f) == NULL) goto err;
    390 
    391 	if (BN_ucmp(f, rsa->n) >= 0)
    392 		{
    393 		/* usually the padding functions would catch this */
    394 		RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
    395 		goto err;
    396 		}
    397 
    398 	if (!(rsa->flags & RSA_FLAG_NO_BLINDING))
    399 		{
    400 		blinding = rsa_get_blinding(rsa, &local_blinding, ctx);
    401 		if (blinding == NULL)
    402 			{
    403 			RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, ERR_R_INTERNAL_ERROR);
    404 			goto err;
    405 			}
    406 		}
    407 
    408 	if (blinding != NULL)
    409 		if (!rsa_blinding_convert(blinding, local_blinding, f, br, ctx))
    410 			goto err;
    411 
    412 	if ( (rsa->flags & RSA_FLAG_EXT_PKEY) ||
    413 		((rsa->p != NULL) &&
    414 		(rsa->q != NULL) &&
    415 		(rsa->dmp1 != NULL) &&
    416 		(rsa->dmq1 != NULL) &&
    417 		(rsa->iqmp != NULL)) )
    418 		{
    419 		if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx)) goto err;
    420 		}
    421 	else
    422 		{
    423 		BIGNUM local_d;
    424 		BIGNUM *d = NULL;
    425 
    426 		if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME))
    427 			{
    428 			BN_init(&local_d);
    429 			d = &local_d;
    430 			BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
    431 			}
    432 		else
    433 			d= rsa->d;
    434 
    435 		if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
    436 			if(!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
    437 				goto err;
    438 
    439 		if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx,
    440 				rsa->_method_mod_n)) goto err;
    441 		}
    442 
    443 	if (blinding)
    444 		if (!rsa_blinding_invert(blinding, local_blinding, ret, br, ctx))
    445 			goto err;
    446 
    447 	if (padding == RSA_X931_PADDING)
    448 		{
    449 		BN_sub(f, rsa->n, ret);
    450 		if (BN_cmp(ret, f))
    451 			res = f;
    452 		else
    453 			res = ret;
    454 		}
    455 	else
    456 		res = ret;
    457 
    458 	/* put in leading 0 bytes if the number is less than the
    459 	 * length of the modulus */
    460 	j=BN_num_bytes(res);
    461 	i=BN_bn2bin(res,&(to[num-j]));
    462 	for (k=0; k<(num-i); k++)
    463 		to[k]=0;
    464 
    465 	r=num;
    466 err:
    467 	if (ctx != NULL)
    468 		{
    469 		BN_CTX_end(ctx);
    470 		BN_CTX_free(ctx);
    471 		}
    472 	if (buf != NULL)
    473 		{
    474 		OPENSSL_cleanse(buf,num);
    475 		OPENSSL_free(buf);
    476 		}
    477 	return(r);
    478 	}
    479 
    480 static int RSA_eay_private_decrypt(int flen, const unsigned char *from,
    481 	     unsigned char *to, RSA *rsa, int padding)
    482 	{
    483 	BIGNUM *f, *ret, *br;
    484 	int j,num=0,r= -1;
    485 	unsigned char *p;
    486 	unsigned char *buf=NULL;
    487 	BN_CTX *ctx=NULL;
    488 	int local_blinding = 0;
    489 	BN_BLINDING *blinding = NULL;
    490 
    491 	if((ctx = BN_CTX_new()) == NULL) goto err;
    492 	BN_CTX_start(ctx);
    493 	f   = BN_CTX_get(ctx);
    494 	br  = BN_CTX_get(ctx);
    495 	ret = BN_CTX_get(ctx);
    496 	num = BN_num_bytes(rsa->n);
    497 	buf = OPENSSL_malloc(num);
    498 	if(!f || !ret || !buf)
    499 		{
    500 		RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,ERR_R_MALLOC_FAILURE);
    501 		goto err;
    502 		}
    503 
    504 	/* This check was for equality but PGP does evil things
    505 	 * and chops off the top '0' bytes */
    506 	if (flen > num)
    507 		{
    508 		RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_DATA_GREATER_THAN_MOD_LEN);
    509 		goto err;
    510 		}
    511 
    512 	/* make data into a big number */
    513 	if (BN_bin2bn(from,(int)flen,f) == NULL) goto err;
    514 
    515 	if (BN_ucmp(f, rsa->n) >= 0)
    516 		{
    517 		RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
    518 		goto err;
    519 		}
    520 
    521 	if (!(rsa->flags & RSA_FLAG_NO_BLINDING))
    522 		{
    523 		blinding = rsa_get_blinding(rsa, &local_blinding, ctx);
    524 		if (blinding == NULL)
    525 			{
    526 			RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_INTERNAL_ERROR);
    527 			goto err;
    528 			}
    529 		}
    530 
    531 	if (blinding != NULL)
    532 		if (!rsa_blinding_convert(blinding, local_blinding, f, br, ctx))
    533 			goto err;
    534 
    535 	/* do the decrypt */
    536 	if ( (rsa->flags & RSA_FLAG_EXT_PKEY) ||
    537 		((rsa->p != NULL) &&
    538 		(rsa->q != NULL) &&
    539 		(rsa->dmp1 != NULL) &&
    540 		(rsa->dmq1 != NULL) &&
    541 		(rsa->iqmp != NULL)) )
    542 		{
    543 		if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx)) goto err;
    544 		}
    545 	else
    546 		{
    547 		BIGNUM local_d;
    548 		BIGNUM *d = NULL;
    549 
    550 		if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME))
    551 			{
    552 			d = &local_d;
    553 			BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
    554 			}
    555 		else
    556 			d = rsa->d;
    557 
    558 		if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
    559 			if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
    560 				goto err;
    561 		if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx,
    562 				rsa->_method_mod_n))
    563 		  goto err;
    564 		}
    565 
    566 	if (blinding)
    567 		if (!rsa_blinding_invert(blinding, local_blinding, ret, br, ctx))
    568 			goto err;
    569 
    570 	p=buf;
    571 	j=BN_bn2bin(ret,p); /* j is only used with no-padding mode */
    572 
    573 	switch (padding)
    574 		{
    575 	case RSA_PKCS1_PADDING:
    576 		r=RSA_padding_check_PKCS1_type_2(to,num,buf,j,num);
    577 		break;
    578 #ifndef OPENSSL_NO_SHA
    579         case RSA_PKCS1_OAEP_PADDING:
    580 	        r=RSA_padding_check_PKCS1_OAEP(to,num,buf,j,num,NULL,0);
    581                 break;
    582 #endif
    583  	case RSA_SSLV23_PADDING:
    584 		r=RSA_padding_check_SSLv23(to,num,buf,j,num);
    585 		break;
    586 	case RSA_NO_PADDING:
    587 		r=RSA_padding_check_none(to,num,buf,j,num);
    588 		break;
    589 	default:
    590 		RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
    591 		goto err;
    592 		}
    593 	if (r < 0)
    594 		RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_PADDING_CHECK_FAILED);
    595 
    596 err:
    597 	if (ctx != NULL)
    598 		{
    599 		BN_CTX_end(ctx);
    600 		BN_CTX_free(ctx);
    601 		}
    602 	if (buf != NULL)
    603 		{
    604 		OPENSSL_cleanse(buf,num);
    605 		OPENSSL_free(buf);
    606 		}
    607 	return(r);
    608 	}
    609 
    610 /* signature verification */
    611 static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
    612 	     unsigned char *to, RSA *rsa, int padding)
    613 	{
    614 	BIGNUM *f,*ret;
    615 	int i,num=0,r= -1;
    616 	unsigned char *p;
    617 	unsigned char *buf=NULL;
    618 	BN_CTX *ctx=NULL;
    619 
    620 	if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS)
    621 		{
    622 		RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_MODULUS_TOO_LARGE);
    623 		return -1;
    624 		}
    625 
    626 	if (BN_ucmp(rsa->n, rsa->e) <= 0)
    627 		{
    628 		RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
    629 		return -1;
    630 		}
    631 
    632 	/* for large moduli, enforce exponent limit */
    633 	if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS)
    634 		{
    635 		if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS)
    636 			{
    637 			RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
    638 			return -1;
    639 			}
    640 		}
    641 
    642 	if((ctx = BN_CTX_new()) == NULL) goto err;
    643 	BN_CTX_start(ctx);
    644 	f = BN_CTX_get(ctx);
    645 	ret = BN_CTX_get(ctx);
    646 	num=BN_num_bytes(rsa->n);
    647 	buf = OPENSSL_malloc(num);
    648 	if(!f || !ret || !buf)
    649 		{
    650 		RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,ERR_R_MALLOC_FAILURE);
    651 		goto err;
    652 		}
    653 
    654 	/* This check was for equality but PGP does evil things
    655 	 * and chops off the top '0' bytes */
    656 	if (flen > num)
    657 		{
    658 		RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_DATA_GREATER_THAN_MOD_LEN);
    659 		goto err;
    660 		}
    661 
    662 	if (BN_bin2bn(from,flen,f) == NULL) goto err;
    663 
    664 	if (BN_ucmp(f, rsa->n) >= 0)
    665 		{
    666 		RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
    667 		goto err;
    668 		}
    669 
    670 	if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
    671 		if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
    672 			goto err;
    673 
    674 	if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx,
    675 		rsa->_method_mod_n)) goto err;
    676 
    677 	if ((padding == RSA_X931_PADDING) && ((ret->d[0] & 0xf) != 12))
    678 		if (!BN_sub(ret, rsa->n, ret)) goto err;
    679 
    680 	p=buf;
    681 	i=BN_bn2bin(ret,p);
    682 
    683 	switch (padding)
    684 		{
    685 	case RSA_PKCS1_PADDING:
    686 		r=RSA_padding_check_PKCS1_type_1(to,num,buf,i,num);
    687 		break;
    688 	case RSA_X931_PADDING:
    689 		r=RSA_padding_check_X931(to,num,buf,i,num);
    690 		break;
    691 	case RSA_NO_PADDING:
    692 		r=RSA_padding_check_none(to,num,buf,i,num);
    693 		break;
    694 	default:
    695 		RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
    696 		goto err;
    697 		}
    698 	if (r < 0)
    699 		RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_PADDING_CHECK_FAILED);
    700 
    701 err:
    702 	if (ctx != NULL)
    703 		{
    704 		BN_CTX_end(ctx);
    705 		BN_CTX_free(ctx);
    706 		}
    707 	if (buf != NULL)
    708 		{
    709 		OPENSSL_cleanse(buf,num);
    710 		OPENSSL_free(buf);
    711 		}
    712 	return(r);
    713 	}
    714 
    715 static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx)
    716 	{
    717 	BIGNUM *r1,*m1,*vrfy;
    718 	BIGNUM local_dmp1,local_dmq1,local_c,local_r1;
    719 	BIGNUM *dmp1,*dmq1,*c,*pr1;
    720 	int ret=0;
    721 
    722 	BN_CTX_start(ctx);
    723 	r1 = BN_CTX_get(ctx);
    724 	m1 = BN_CTX_get(ctx);
    725 	vrfy = BN_CTX_get(ctx);
    726 
    727 	{
    728 		BIGNUM local_p, local_q;
    729 		BIGNUM *p = NULL, *q = NULL;
    730 
    731 		/* Make sure BN_mod_inverse in Montgomery intialization uses the
    732 		 * BN_FLG_CONSTTIME flag (unless RSA_FLAG_NO_CONSTTIME is set)
    733 		 */
    734 		if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME))
    735 			{
    736 			BN_init(&local_p);
    737 			p = &local_p;
    738 			BN_with_flags(p, rsa->p, BN_FLG_CONSTTIME);
    739 
    740 			BN_init(&local_q);
    741 			q = &local_q;
    742 			BN_with_flags(q, rsa->q, BN_FLG_CONSTTIME);
    743 			}
    744 		else
    745 			{
    746 			p = rsa->p;
    747 			q = rsa->q;
    748 			}
    749 
    750 		if (rsa->flags & RSA_FLAG_CACHE_PRIVATE)
    751 			{
    752 			if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_p, CRYPTO_LOCK_RSA, p, ctx))
    753 				goto err;
    754 			if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_q, CRYPTO_LOCK_RSA, q, ctx))
    755 				goto err;
    756 			}
    757 	}
    758 
    759 	if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
    760 		if (!BN_MONT_CTX_set_locked(&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
    761 			goto err;
    762 
    763 	/* compute I mod q */
    764 	if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME))
    765 		{
    766 		c = &local_c;
    767 		BN_with_flags(c, I, BN_FLG_CONSTTIME);
    768 		if (!BN_mod(r1,c,rsa->q,ctx)) goto err;
    769 		}
    770 	else
    771 		{
    772 		if (!BN_mod(r1,I,rsa->q,ctx)) goto err;
    773 		}
    774 
    775 	/* compute r1^dmq1 mod q */
    776 	if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME))
    777 		{
    778 		dmq1 = &local_dmq1;
    779 		BN_with_flags(dmq1, rsa->dmq1, BN_FLG_CONSTTIME);
    780 		}
    781 	else
    782 		dmq1 = rsa->dmq1;
    783 	if (!rsa->meth->bn_mod_exp(m1,r1,dmq1,rsa->q,ctx,
    784 		rsa->_method_mod_q)) goto err;
    785 
    786 	/* compute I mod p */
    787 	if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME))
    788 		{
    789 		c = &local_c;
    790 		BN_with_flags(c, I, BN_FLG_CONSTTIME);
    791 		if (!BN_mod(r1,c,rsa->p,ctx)) goto err;
    792 		}
    793 	else
    794 		{
    795 		if (!BN_mod(r1,I,rsa->p,ctx)) goto err;
    796 		}
    797 
    798 	/* compute r1^dmp1 mod p */
    799 	if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME))
    800 		{
    801 		dmp1 = &local_dmp1;
    802 		BN_with_flags(dmp1, rsa->dmp1, BN_FLG_CONSTTIME);
    803 		}
    804 	else
    805 		dmp1 = rsa->dmp1;
    806 	if (!rsa->meth->bn_mod_exp(r0,r1,dmp1,rsa->p,ctx,
    807 		rsa->_method_mod_p)) goto err;
    808 
    809 	if (!BN_sub(r0,r0,m1)) goto err;
    810 	/* This will help stop the size of r0 increasing, which does
    811 	 * affect the multiply if it optimised for a power of 2 size */
    812 	if (BN_is_negative(r0))
    813 		if (!BN_add(r0,r0,rsa->p)) goto err;
    814 
    815 	if (!BN_mul(r1,r0,rsa->iqmp,ctx)) goto err;
    816 
    817 	/* Turn BN_FLG_CONSTTIME flag on before division operation */
    818 	if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME))
    819 		{
    820 		pr1 = &local_r1;
    821 		BN_with_flags(pr1, r1, BN_FLG_CONSTTIME);
    822 		}
    823 	else
    824 		pr1 = r1;
    825 	if (!BN_mod(r0,pr1,rsa->p,ctx)) goto err;
    826 
    827 	/* If p < q it is occasionally possible for the correction of
    828          * adding 'p' if r0 is negative above to leave the result still
    829 	 * negative. This can break the private key operations: the following
    830 	 * second correction should *always* correct this rare occurrence.
    831 	 * This will *never* happen with OpenSSL generated keys because
    832          * they ensure p > q [steve]
    833          */
    834 	if (BN_is_negative(r0))
    835 		if (!BN_add(r0,r0,rsa->p)) goto err;
    836 	if (!BN_mul(r1,r0,rsa->q,ctx)) goto err;
    837 	if (!BN_add(r0,r1,m1)) goto err;
    838 
    839 	if (rsa->e && rsa->n)
    840 		{
    841 		if (!rsa->meth->bn_mod_exp(vrfy,r0,rsa->e,rsa->n,ctx,rsa->_method_mod_n)) goto err;
    842 		/* If 'I' was greater than (or equal to) rsa->n, the operation
    843 		 * will be equivalent to using 'I mod n'. However, the result of
    844 		 * the verify will *always* be less than 'n' so we don't check
    845 		 * for absolute equality, just congruency. */
    846 		if (!BN_sub(vrfy, vrfy, I)) goto err;
    847 		if (!BN_mod(vrfy, vrfy, rsa->n, ctx)) goto err;
    848 		if (BN_is_negative(vrfy))
    849 			if (!BN_add(vrfy, vrfy, rsa->n)) goto err;
    850 		if (!BN_is_zero(vrfy))
    851 			{
    852 			/* 'I' and 'vrfy' aren't congruent mod n. Don't leak
    853 			 * miscalculated CRT output, just do a raw (slower)
    854 			 * mod_exp and return that instead. */
    855 
    856 			BIGNUM local_d;
    857 			BIGNUM *d = NULL;
    858 
    859 			if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME))
    860 				{
    861 				d = &local_d;
    862 				BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
    863 				}
    864 			else
    865 				d = rsa->d;
    866 			if (!rsa->meth->bn_mod_exp(r0,I,d,rsa->n,ctx,
    867 						   rsa->_method_mod_n)) goto err;
    868 			}
    869 		}
    870 	ret=1;
    871 err:
    872 	BN_CTX_end(ctx);
    873 	return(ret);
    874 	}
    875 
    876 static int RSA_eay_init(RSA *rsa)
    877 	{
    878 	rsa->flags|=RSA_FLAG_CACHE_PUBLIC|RSA_FLAG_CACHE_PRIVATE;
    879 	return(1);
    880 	}
    881 
    882 static int RSA_eay_finish(RSA *rsa)
    883 	{
    884 	if (rsa->_method_mod_n != NULL)
    885 		BN_MONT_CTX_free(rsa->_method_mod_n);
    886 	if (rsa->_method_mod_p != NULL)
    887 		BN_MONT_CTX_free(rsa->_method_mod_p);
    888 	if (rsa->_method_mod_q != NULL)
    889 		BN_MONT_CTX_free(rsa->_method_mod_q);
    890 	return(1);
    891 	}
    892 
    893 #endif
    894