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