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