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