]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - crypto/openssl/crypto/rsa/rsa_eay.c
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.git] / crypto / openssl / crypto / rsa / rsa_eay.c
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 /* $FreeBSD$ */
112
113 #include <stdio.h>
114 #include "cryptlib.h"
115 #include <openssl/bn.h>
116 #include <openssl/rsa.h>
117 #include <openssl/rand.h>
118
119 #ifndef RSA_NULL
120
121 static int RSA_eay_public_encrypt(int flen, const unsigned char *from,
122                 unsigned char *to, RSA *rsa,int padding);
123 static int RSA_eay_private_encrypt(int flen, const unsigned char *from,
124                 unsigned char *to, RSA *rsa,int padding);
125 static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
126                 unsigned char *to, RSA *rsa,int padding);
127 static int RSA_eay_private_decrypt(int flen, const unsigned char *from,
128                 unsigned char *to, RSA *rsa,int padding);
129 static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *i, RSA *rsa, BN_CTX *ctx);
130 static int RSA_eay_init(RSA *rsa);
131 static int RSA_eay_finish(RSA *rsa);
132 static RSA_METHOD rsa_pkcs1_eay_meth={
133         "Eric Young's PKCS#1 RSA",
134         RSA_eay_public_encrypt,
135         RSA_eay_public_decrypt, /* signature verification */
136         RSA_eay_private_encrypt, /* signing */
137         RSA_eay_private_decrypt,
138         RSA_eay_mod_exp,
139         BN_mod_exp_mont, /* XXX probably we should not use Montgomery if  e == 3 */
140         RSA_eay_init,
141         RSA_eay_finish,
142         0, /* flags */
143         NULL,
144         0, /* rsa_sign */
145         0, /* rsa_verify */
146         NULL /* rsa_keygen */
147         };
148
149 const RSA_METHOD *RSA_PKCS1_SSLeay(void)
150         {
151         return(&rsa_pkcs1_eay_meth);
152         }
153
154 /* Usage example;
155  *    MONT_HELPER(rsa, bn_ctx, p, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err);
156  */
157 #define MONT_HELPER(rsa, ctx, m, pre_cond, err_instr) \
158         if((pre_cond) && ((rsa)->_method_mod_##m == NULL) && \
159                         !BN_MONT_CTX_set_locked(&((rsa)->_method_mod_##m), \
160                                 CRYPTO_LOCK_RSA, \
161                                 (rsa)->m, (ctx))) \
162                 err_instr
163
164 static int RSA_eay_public_encrypt(int flen, const unsigned char *from,
165              unsigned char *to, RSA *rsa, int padding)
166         {
167         BIGNUM *f,*ret;
168         int i,j,k,num=0,r= -1;
169         unsigned char *buf=NULL;
170         BN_CTX *ctx=NULL;
171
172         if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS)
173                 {
174                 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_MODULUS_TOO_LARGE);
175                 return -1;
176                 }
177
178         if (BN_ucmp(rsa->n, rsa->e) <= 0)
179                 {
180                 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE);
181                 return -1;
182                 }
183
184         /* for large moduli, enforce exponent limit */
185         if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS)
186                 {
187                 if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS)
188                         {
189                         RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE);
190                         return -1;
191                         }
192                 }
193         
194         if ((ctx=BN_CTX_new()) == NULL) goto err;
195         BN_CTX_start(ctx);
196         f = BN_CTX_get(ctx);
197         ret = BN_CTX_get(ctx);
198         num=BN_num_bytes(rsa->n);
199         buf = OPENSSL_malloc(num);
200         if (!f || !ret || !buf)
201                 {
202                 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,ERR_R_MALLOC_FAILURE);
203                 goto err;
204                 }
205
206         switch (padding)
207                 {
208         case RSA_PKCS1_PADDING:
209                 i=RSA_padding_add_PKCS1_type_2(buf,num,from,flen);
210                 break;
211 #ifndef OPENSSL_NO_SHA
212         case RSA_PKCS1_OAEP_PADDING:
213                 i=RSA_padding_add_PKCS1_OAEP(buf,num,from,flen,NULL,0);
214                 break;
215 #endif
216         case RSA_SSLV23_PADDING:
217                 i=RSA_padding_add_SSLv23(buf,num,from,flen);
218                 break;
219         case RSA_NO_PADDING:
220                 i=RSA_padding_add_none(buf,num,from,flen);
221                 break;
222         default:
223                 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
224                 goto err;
225                 }
226         if (i <= 0) goto err;
227
228         if (BN_bin2bn(buf,num,f) == NULL) goto err;
229         
230         if (BN_ucmp(f, rsa->n) >= 0)
231                 {       
232                 /* usually the padding functions would catch this */
233                 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
234                 goto err;
235                 }
236
237         MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
238
239         if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx,
240                 rsa->_method_mod_n)) goto err;
241
242         /* put in leading 0 bytes if the number is less than the
243          * length of the modulus */
244         j=BN_num_bytes(ret);
245         i=BN_bn2bin(ret,&(to[num-j]));
246         for (k=0; k<(num-i); k++)
247                 to[k]=0;
248
249         r=num;
250 err:
251         if (ctx != NULL)
252                 {
253                 BN_CTX_end(ctx);
254                 BN_CTX_free(ctx);
255                 }
256         if (buf != NULL) 
257                 {
258                 OPENSSL_cleanse(buf,num);
259                 OPENSSL_free(buf);
260                 }
261         return(r);
262         }
263
264 static BN_BLINDING *rsa_get_blinding(RSA *rsa, int *local, BN_CTX *ctx)
265 {
266         BN_BLINDING *ret;
267         int got_write_lock = 0;
268
269         CRYPTO_r_lock(CRYPTO_LOCK_RSA);
270
271         if (rsa->blinding == NULL)
272                 {
273                 CRYPTO_r_unlock(CRYPTO_LOCK_RSA);
274                 CRYPTO_w_lock(CRYPTO_LOCK_RSA);
275                 got_write_lock = 1;
276
277                 if (rsa->blinding == NULL)
278                         rsa->blinding = RSA_setup_blinding(rsa, ctx);
279                 }
280
281         ret = rsa->blinding;
282         if (ret == NULL)
283                 goto err;
284
285         if (BN_BLINDING_get_thread_id(ret) == CRYPTO_thread_id())
286                 {
287                 /* rsa->blinding is ours! */
288
289                 *local = 1;
290                 }
291         else
292                 {
293                 /* resort to rsa->mt_blinding instead */
294
295                 *local = 0; /* instructs rsa_blinding_convert(), rsa_blinding_invert()
296                              * that the BN_BLINDING is shared, meaning that accesses
297                              * require locks, and that the blinding factor must be
298                              * stored outside the BN_BLINDING
299                              */
300
301                 if (rsa->mt_blinding == NULL)
302                         {
303                         if (!got_write_lock)
304                                 {
305                                 CRYPTO_r_unlock(CRYPTO_LOCK_RSA);
306                                 CRYPTO_w_lock(CRYPTO_LOCK_RSA);
307                                 got_write_lock = 1;
308                                 }
309                         
310                         if (rsa->mt_blinding == NULL)
311                                 rsa->mt_blinding = RSA_setup_blinding(rsa, ctx);
312                         }
313                 ret = rsa->mt_blinding;
314                 }
315
316  err:
317         if (got_write_lock)
318                 CRYPTO_w_unlock(CRYPTO_LOCK_RSA);
319         else
320                 CRYPTO_r_unlock(CRYPTO_LOCK_RSA);
321         return ret;
322 }
323
324 static int rsa_blinding_convert(BN_BLINDING *b, int local, BIGNUM *f,
325         BIGNUM *r, BN_CTX *ctx)
326 {
327         if (local)
328                 return BN_BLINDING_convert_ex(f, NULL, b, ctx);
329         else
330                 {
331                 int ret;
332                 CRYPTO_r_lock(CRYPTO_LOCK_RSA_BLINDING);
333                 ret = BN_BLINDING_convert_ex(f, r, b, ctx);
334                 CRYPTO_r_unlock(CRYPTO_LOCK_RSA_BLINDING);
335                 return ret;
336                 }
337 }
338
339 static int rsa_blinding_invert(BN_BLINDING *b, int local, BIGNUM *f,
340         BIGNUM *r, BN_CTX *ctx)
341 {
342         if (local)
343                 return BN_BLINDING_invert_ex(f, NULL, b, ctx);
344         else
345                 {
346                 int ret;
347                 CRYPTO_w_lock(CRYPTO_LOCK_RSA_BLINDING);
348                 ret = BN_BLINDING_invert_ex(f, r, b, ctx);
349                 CRYPTO_w_unlock(CRYPTO_LOCK_RSA_BLINDING);
350                 return ret;
351                 }
352 }
353
354 /* signing */
355 static int RSA_eay_private_encrypt(int flen, const unsigned char *from,
356              unsigned char *to, RSA *rsa, int padding)
357         {
358         BIGNUM *f, *ret, *br, *res;
359         int i,j,k,num=0,r= -1;
360         unsigned char *buf=NULL;
361         BN_CTX *ctx=NULL;
362         int local_blinding = 0;
363         BN_BLINDING *blinding = NULL;
364
365         if ((ctx=BN_CTX_new()) == NULL) goto err;
366         BN_CTX_start(ctx);
367         f   = BN_CTX_get(ctx);
368         br  = BN_CTX_get(ctx);
369         ret = BN_CTX_get(ctx);
370         num = BN_num_bytes(rsa->n);
371         buf = OPENSSL_malloc(num);
372         if(!f || !ret || !buf)
373                 {
374                 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,ERR_R_MALLOC_FAILURE);
375                 goto err;
376                 }
377
378         switch (padding)
379                 {
380         case RSA_PKCS1_PADDING:
381                 i=RSA_padding_add_PKCS1_type_1(buf,num,from,flen);
382                 break;
383         case RSA_X931_PADDING:
384                 i=RSA_padding_add_X931(buf,num,from,flen);
385                 break;
386         case RSA_NO_PADDING:
387                 i=RSA_padding_add_none(buf,num,from,flen);
388                 break;
389         case RSA_SSLV23_PADDING:
390         default:
391                 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
392                 goto err;
393                 }
394         if (i <= 0) goto err;
395
396         if (BN_bin2bn(buf,num,f) == NULL) goto err;
397         
398         if (BN_ucmp(f, rsa->n) >= 0)
399                 {       
400                 /* usually the padding functions would catch this */
401                 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
402                 goto err;
403                 }
404
405         if (!(rsa->flags & RSA_FLAG_NO_BLINDING))
406                 {
407                 blinding = rsa_get_blinding(rsa, &local_blinding, ctx);
408                 if (blinding == NULL)
409                         {
410                         RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, ERR_R_INTERNAL_ERROR);
411                         goto err;
412                         }
413                 }
414         
415         if (blinding != NULL)
416                 if (!rsa_blinding_convert(blinding, local_blinding, f, br, ctx))
417                         goto err;
418
419         if ( (rsa->flags & RSA_FLAG_EXT_PKEY) ||
420                 ((rsa->p != NULL) &&
421                 (rsa->q != NULL) &&
422                 (rsa->dmp1 != NULL) &&
423                 (rsa->dmq1 != NULL) &&
424                 (rsa->iqmp != NULL)) )
425                 { 
426                 if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx)) goto err;
427                 }
428         else
429                 {
430                 BIGNUM local_d;
431                 BIGNUM *d = NULL;
432                 
433                 if (!(rsa->flags & RSA_FLAG_NO_EXP_CONSTTIME))
434                         {
435                         BN_init(&local_d);
436                         d = &local_d;
437                         BN_with_flags(d, rsa->d, BN_FLG_EXP_CONSTTIME);
438                         }
439                 else
440                         d = rsa->d;
441
442                 MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
443
444                 if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx,
445                                 rsa->_method_mod_n)) goto err;
446                 }
447
448         if (blinding)
449                 if (!rsa_blinding_invert(blinding, local_blinding, ret, br, ctx))
450                         goto err;
451
452         if (padding == RSA_X931_PADDING)
453                 {
454                 BN_sub(f, rsa->n, ret);
455                 if (BN_cmp(ret, f))
456                         res = f;
457                 else
458                         res = ret;
459                 }
460         else
461                 res = ret;
462
463         /* put in leading 0 bytes if the number is less than the
464          * length of the modulus */
465         j=BN_num_bytes(res);
466         i=BN_bn2bin(res,&(to[num-j]));
467         for (k=0; k<(num-i); k++)
468                 to[k]=0;
469
470         r=num;
471 err:
472         if (ctx != NULL)
473                 {
474                 BN_CTX_end(ctx);
475                 BN_CTX_free(ctx);
476                 }
477         if (buf != NULL)
478                 {
479                 OPENSSL_cleanse(buf,num);
480                 OPENSSL_free(buf);
481                 }
482         return(r);
483         }
484
485 static int RSA_eay_private_decrypt(int flen, const unsigned char *from,
486              unsigned char *to, RSA *rsa, int padding)
487         {
488         BIGNUM *f, *ret, *br;
489         int j,num=0,r= -1;
490         unsigned char *p;
491         unsigned char *buf=NULL;
492         BN_CTX *ctx=NULL;
493         int local_blinding = 0;
494         BN_BLINDING *blinding = NULL;
495
496         if((ctx = BN_CTX_new()) == NULL) goto err;
497         BN_CTX_start(ctx);
498         f   = BN_CTX_get(ctx);
499         br  = BN_CTX_get(ctx);
500         ret = BN_CTX_get(ctx);
501         num = BN_num_bytes(rsa->n);
502         buf = OPENSSL_malloc(num);
503         if(!f || !ret || !buf)
504                 {
505                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,ERR_R_MALLOC_FAILURE);
506                 goto err;
507                 }
508
509         /* This check was for equality but PGP does evil things
510          * and chops off the top '0' bytes */
511         if (flen > num)
512                 {
513                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_DATA_GREATER_THAN_MOD_LEN);
514                 goto err;
515                 }
516
517         /* make data into a big number */
518         if (BN_bin2bn(from,(int)flen,f) == NULL) goto err;
519
520         if (BN_ucmp(f, rsa->n) >= 0)
521                 {
522                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
523                 goto err;
524                 }
525
526         if (!(rsa->flags & RSA_FLAG_NO_BLINDING))
527                 {
528                 blinding = rsa_get_blinding(rsa, &local_blinding, ctx);
529                 if (blinding == NULL)
530                         {
531                         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_INTERNAL_ERROR);
532                         goto err;
533                         }
534                 }
535         
536         if (blinding != NULL)
537                 if (!rsa_blinding_convert(blinding, local_blinding, f, br, ctx))
538                         goto err;
539
540         /* do the decrypt */
541         if ( (rsa->flags & RSA_FLAG_EXT_PKEY) ||
542                 ((rsa->p != NULL) &&
543                 (rsa->q != NULL) &&
544                 (rsa->dmp1 != NULL) &&
545                 (rsa->dmq1 != NULL) &&
546                 (rsa->iqmp != NULL)) )
547                 {
548                 if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx)) goto err;
549                 }
550         else
551                 {
552                 BIGNUM local_d;
553                 BIGNUM *d = NULL;
554                 
555                 if (!(rsa->flags & RSA_FLAG_NO_EXP_CONSTTIME))
556                         {
557                         d = &local_d;
558                         BN_with_flags(d, rsa->d, BN_FLG_EXP_CONSTTIME);
559                         }
560                 else
561                         d = rsa->d;
562
563                 MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
564                 if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx,
565                                 rsa->_method_mod_n))
566                   goto err;
567                 }
568
569         if (blinding)
570                 if (!rsa_blinding_invert(blinding, local_blinding, ret, br, ctx))
571                         goto err;
572
573         p=buf;
574         j=BN_bn2bin(ret,p); /* j is only used with no-padding mode */
575
576         switch (padding)
577                 {
578         case RSA_PKCS1_PADDING:
579                 r=RSA_padding_check_PKCS1_type_2(to,num,buf,j,num);
580                 break;
581 #ifndef OPENSSL_NO_SHA
582         case RSA_PKCS1_OAEP_PADDING:
583                 r=RSA_padding_check_PKCS1_OAEP(to,num,buf,j,num,NULL,0);
584                 break;
585 #endif
586         case RSA_SSLV23_PADDING:
587                 r=RSA_padding_check_SSLv23(to,num,buf,j,num);
588                 break;
589         case RSA_NO_PADDING:
590                 r=RSA_padding_check_none(to,num,buf,j,num);
591                 break;
592         default:
593                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
594                 goto err;
595                 }
596         if (r < 0)
597                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_PADDING_CHECK_FAILED);
598
599 err:
600         if (ctx != NULL)
601                 {
602                 BN_CTX_end(ctx);
603                 BN_CTX_free(ctx);
604                 }
605         if (buf != NULL)
606                 {
607                 OPENSSL_cleanse(buf,num);
608                 OPENSSL_free(buf);
609                 }
610         return(r);
611         }
612
613 /* signature verification */
614 static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
615              unsigned char *to, RSA *rsa, int padding)
616         {
617         BIGNUM *f,*ret;
618         int i,num=0,r= -1;
619         unsigned char *p;
620         unsigned char *buf=NULL;
621         BN_CTX *ctx=NULL;
622
623         if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS)
624                 {
625                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_MODULUS_TOO_LARGE);
626                 return -1;
627                 }
628
629         if (BN_ucmp(rsa->n, rsa->e) <= 0)
630                 {
631                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
632                 return -1;
633                 }
634
635         /* for large moduli, enforce exponent limit */
636         if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS)
637                 {
638                 if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS)
639                         {
640                         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
641                         return -1;
642                         }
643                 }
644         
645         if((ctx = BN_CTX_new()) == NULL) goto err;
646         BN_CTX_start(ctx);
647         f = BN_CTX_get(ctx);
648         ret = BN_CTX_get(ctx);
649         num=BN_num_bytes(rsa->n);
650         buf = OPENSSL_malloc(num);
651         if(!f || !ret || !buf)
652                 {
653                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,ERR_R_MALLOC_FAILURE);
654                 goto err;
655                 }
656
657         /* This check was for equality but PGP does evil things
658          * and chops off the top '0' bytes */
659         if (flen > num)
660                 {
661                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_DATA_GREATER_THAN_MOD_LEN);
662                 goto err;
663                 }
664
665         if (BN_bin2bn(from,flen,f) == NULL) goto err;
666
667         if (BN_ucmp(f, rsa->n) >= 0)
668                 {
669                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
670                 goto err;
671                 }
672
673         MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
674
675         if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx,
676                 rsa->_method_mod_n)) goto err;
677
678         if ((padding == RSA_X931_PADDING) && ((ret->d[0] & 0xf) != 12))
679                 BN_sub(ret, rsa->n, ret);
680
681         p=buf;
682         i=BN_bn2bin(ret,p);
683
684         switch (padding)
685                 {
686         case RSA_PKCS1_PADDING:
687                 r=RSA_padding_check_PKCS1_type_1(to,num,buf,i,num);
688                 break;
689         case RSA_X931_PADDING:
690                 r=RSA_padding_check_X931(to,num,buf,i,num);
691                 break;
692         case RSA_NO_PADDING:
693                 r=RSA_padding_check_none(to,num,buf,i,num);
694                 break;
695         default:
696                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
697                 goto err;
698                 }
699         if (r < 0)
700                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_PADDING_CHECK_FAILED);
701
702 err:
703         if (ctx != NULL)
704                 {
705                 BN_CTX_end(ctx);
706                 BN_CTX_free(ctx);
707                 }
708         if (buf != NULL)
709                 {
710                 OPENSSL_cleanse(buf,num);
711                 OPENSSL_free(buf);
712                 }
713         return(r);
714         }
715
716 static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx)
717         {
718         BIGNUM *r1,*m1,*vrfy;
719         BIGNUM local_dmp1, local_dmq1;
720         BIGNUM *dmp1, *dmq1;
721         int ret=0;
722
723         BN_CTX_start(ctx);
724         r1 = BN_CTX_get(ctx);
725         m1 = BN_CTX_get(ctx);
726         vrfy = BN_CTX_get(ctx);
727
728         MONT_HELPER(rsa, ctx, p, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err);
729         MONT_HELPER(rsa, ctx, q, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err);
730         MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
731
732         if (!BN_mod(r1,I,rsa->q,ctx)) goto err;
733         if (!(rsa->flags & RSA_FLAG_NO_EXP_CONSTTIME))
734                 {
735                 dmq1 = &local_dmq1;
736                 BN_with_flags(dmq1, rsa->dmq1, BN_FLG_EXP_CONSTTIME);
737                 }
738         else
739                 dmq1 = rsa->dmq1;
740         if (!rsa->meth->bn_mod_exp(m1,r1,dmq1,rsa->q,ctx,
741                 rsa->_method_mod_q)) goto err;
742
743         if (!BN_mod(r1,I,rsa->p,ctx)) goto err;
744         if (!(rsa->flags & RSA_FLAG_NO_EXP_CONSTTIME))
745                 {
746                 dmp1 = &local_dmp1;
747                 BN_with_flags(dmp1, rsa->dmp1, BN_FLG_EXP_CONSTTIME);
748                 }
749         else
750                 dmp1 = rsa->dmp1;
751         if (!rsa->meth->bn_mod_exp(r0,r1,dmp1,rsa->p,ctx,
752                 rsa->_method_mod_p)) goto err;
753
754         if (!BN_sub(r0,r0,m1)) goto err;
755         /* This will help stop the size of r0 increasing, which does
756          * affect the multiply if it optimised for a power of 2 size */
757         if (BN_is_negative(r0))
758                 if (!BN_add(r0,r0,rsa->p)) goto err;
759
760         if (!BN_mul(r1,r0,rsa->iqmp,ctx)) goto err;
761         if (!BN_mod(r0,r1,rsa->p,ctx)) goto err;
762         /* If p < q it is occasionally possible for the correction of
763          * adding 'p' if r0 is negative above to leave the result still
764          * negative. This can break the private key operations: the following
765          * second correction should *always* correct this rare occurrence.
766          * This will *never* happen with OpenSSL generated keys because
767          * they ensure p > q [steve]
768          */
769         if (BN_is_negative(r0))
770                 if (!BN_add(r0,r0,rsa->p)) goto err;
771         if (!BN_mul(r1,r0,rsa->q,ctx)) goto err;
772         if (!BN_add(r0,r1,m1)) goto err;
773
774         if (rsa->e && rsa->n)
775                 {
776                 if (!rsa->meth->bn_mod_exp(vrfy,r0,rsa->e,rsa->n,ctx,rsa->_method_mod_n)) goto err;
777                 /* If 'I' was greater than (or equal to) rsa->n, the operation
778                  * will be equivalent to using 'I mod n'. However, the result of
779                  * the verify will *always* be less than 'n' so we don't check
780                  * for absolute equality, just congruency. */
781                 if (!BN_sub(vrfy, vrfy, I)) goto err;
782                 if (!BN_mod(vrfy, vrfy, rsa->n, ctx)) goto err;
783                 if (BN_is_negative(vrfy))
784                         if (!BN_add(vrfy, vrfy, rsa->n)) goto err;
785                 if (!BN_is_zero(vrfy))
786                         {
787                         /* 'I' and 'vrfy' aren't congruent mod n. Don't leak
788                          * miscalculated CRT output, just do a raw (slower)
789                          * mod_exp and return that instead. */
790
791                         BIGNUM local_d;
792                         BIGNUM *d = NULL;
793                 
794                         if (!(rsa->flags & RSA_FLAG_NO_EXP_CONSTTIME))
795                                 {
796                                 d = &local_d;
797                                 BN_with_flags(d, rsa->d, BN_FLG_EXP_CONSTTIME);
798                                 }
799                         else
800                                 d = rsa->d;
801                         if (!rsa->meth->bn_mod_exp(r0,I,d,rsa->n,ctx,
802                                                    rsa->_method_mod_n)) goto err;
803                         }
804                 }
805         ret=1;
806 err:
807         BN_CTX_end(ctx);
808         return(ret);
809         }
810
811 static int RSA_eay_init(RSA *rsa)
812         {
813         rsa->flags|=RSA_FLAG_CACHE_PUBLIC|RSA_FLAG_CACHE_PRIVATE;
814         return(1);
815         }
816
817 static int RSA_eay_finish(RSA *rsa)
818         {
819         if (rsa->_method_mod_n != NULL)
820                 BN_MONT_CTX_free(rsa->_method_mod_n);
821         if (rsa->_method_mod_p != NULL)
822                 BN_MONT_CTX_free(rsa->_method_mod_p);
823         if (rsa->_method_mod_q != NULL)
824                 BN_MONT_CTX_free(rsa->_method_mod_q);
825         return(1);
826         }
827
828 #endif