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