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