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 <openssl/local/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, 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
332static 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 */
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, *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;
466err:
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
480static 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
596err:
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 */
611static 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
701err:
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
715static 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;
871err:
872	BN_CTX_end(ctx);
873	return(ret);
874	}
875
876static int RSA_eay_init(RSA *rsa)
877	{
878	rsa->flags|=RSA_FLAG_CACHE_PUBLIC|RSA_FLAG_CACHE_PRIVATE;
879	return(1);
880	}
881
882static 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