ad6ccf634d01f28cb5eb3b569a3ea94c612434fa
[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 #include <stdio.h>
60 #include "cryptlib.h"
61 #include <openssl/bn.h>
62 #include <openssl/rsa.h>
63 #include <openssl/rand.h>
64 #ifndef OPENSSL_NO_ENGINE
65 #include <openssl/engine.h>
66 #endif
67
68 #ifndef RSA_NULL
69
70 static int RSA_eay_public_encrypt(int flen, const unsigned char *from,
71                 unsigned char *to, RSA *rsa,int padding);
72 static int RSA_eay_private_encrypt(int flen, const unsigned char *from,
73                 unsigned char *to, RSA *rsa,int padding);
74 static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
75                 unsigned char *to, RSA *rsa,int padding);
76 static int RSA_eay_private_decrypt(int flen, const unsigned char *from,
77                 unsigned char *to, RSA *rsa,int padding);
78 static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *i, RSA *rsa);
79 static int RSA_eay_init(RSA *rsa);
80 static int RSA_eay_finish(RSA *rsa);
81 static RSA_METHOD rsa_pkcs1_eay_meth={
82         "Eric Young's PKCS#1 RSA",
83         RSA_eay_public_encrypt,
84         RSA_eay_public_decrypt, /* signature verification */
85         RSA_eay_private_encrypt, /* signing */
86         RSA_eay_private_decrypt,
87         RSA_eay_mod_exp,
88         BN_mod_exp_mont, /* XXX probably we should not use Montgomery if  e == 3 */
89         RSA_eay_init,
90         RSA_eay_finish,
91         0, /* flags */
92         NULL,
93         0, /* rsa_sign */
94         0, /* rsa_verify */
95         NULL /* rsa_keygen */
96         };
97
98 const RSA_METHOD *RSA_PKCS1_SSLeay(void)
99         {
100         return(&rsa_pkcs1_eay_meth);
101         }
102
103 /* Static helper to reduce oodles of code duplication. As a slight
104  * optimisation, the "MONT_HELPER() macro must be used as front-end to this
105  * function, to prevent unnecessary function calls - there is an initial test
106  * that is performed by the macro-generated code. */
107 static int rsa_eay_mont_helper(BN_MONT_CTX **ptr, const BIGNUM *modulus, BN_CTX *ctx)
108         {
109         BN_MONT_CTX *bn_mont_ctx;
110         if((bn_mont_ctx = BN_MONT_CTX_new()) == NULL)
111                 return 0;
112         if(!BN_MONT_CTX_set(bn_mont_ctx, modulus, ctx))
113                 {
114                 BN_MONT_CTX_free(bn_mont_ctx);
115                 return 0;
116                 }
117         if (*ptr == NULL) /* other thread may have finished first */
118                 {
119                 CRYPTO_w_lock(CRYPTO_LOCK_RSA);
120                 if (*ptr == NULL) /* check again in the lock to stop races */
121                         {
122                         *ptr = bn_mont_ctx;
123                         bn_mont_ctx = NULL;
124                         }
125                 CRYPTO_w_unlock(CRYPTO_LOCK_RSA);
126                 }
127         if (bn_mont_ctx)
128                 BN_MONT_CTX_free(bn_mont_ctx);
129         return 1;
130         }
131 /* Usage example;
132  *    MONT_HELPER(rsa, bn_ctx, p, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err);
133  */
134 #define MONT_HELPER(rsa, ctx, m, pre_cond, err_instr) \
135         if((pre_cond) && ((rsa)->_method_mod_##m == NULL) && \
136                         !rsa_eay_mont_helper(&((rsa)->_method_mod_##m), \
137                                 (rsa)->m, (ctx))) \
138                 err_instr
139
140 static int RSA_eay_public_encrypt(int flen, const unsigned char *from,
141              unsigned char *to, RSA *rsa, int padding)
142         {
143         BIGNUM f,ret;
144         int i,j,k,num=0,r= -1;
145         unsigned char *buf=NULL;
146         BN_CTX *ctx=NULL;
147
148         BN_init(&f);
149         BN_init(&ret);
150         if ((ctx=BN_CTX_new()) == NULL) goto err;
151         num=BN_num_bytes(rsa->n);
152         if ((buf=(unsigned char *)OPENSSL_malloc(num)) == NULL)
153                 {
154                 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,ERR_R_MALLOC_FAILURE);
155                 goto err;
156                 }
157
158         switch (padding)
159                 {
160         case RSA_PKCS1_PADDING:
161                 i=RSA_padding_add_PKCS1_type_2(buf,num,from,flen);
162                 break;
163 #ifndef OPENSSL_NO_SHA
164         case RSA_PKCS1_OAEP_PADDING:
165                 i=RSA_padding_add_PKCS1_OAEP(buf,num,from,flen,NULL,0);
166                 break;
167 #endif
168         case RSA_SSLV23_PADDING:
169                 i=RSA_padding_add_SSLv23(buf,num,from,flen);
170                 break;
171         case RSA_NO_PADDING:
172                 i=RSA_padding_add_none(buf,num,from,flen);
173                 break;
174         default:
175                 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
176                 goto err;
177                 }
178         if (i <= 0) goto err;
179
180         if (BN_bin2bn(buf,num,&f) == NULL) goto err;
181         
182         if (BN_ucmp(&f, rsa->n) >= 0)
183                 {       
184                 /* usually the padding functions would catch this */
185                 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
186                 goto err;
187                 }
188
189         MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
190
191         if (!rsa->meth->bn_mod_exp(&ret,&f,rsa->e,rsa->n,ctx,
192                 rsa->_method_mod_n)) goto err;
193
194         /* put in leading 0 bytes if the number is less than the
195          * length of the modulus */
196         j=BN_num_bytes(&ret);
197         i=BN_bn2bin(&ret,&(to[num-j]));
198         for (k=0; k<(num-i); k++)
199                 to[k]=0;
200
201         r=num;
202 err:
203         if (ctx != NULL) BN_CTX_free(ctx);
204         BN_clear_free(&f);
205         BN_clear_free(&ret);
206         if (buf != NULL) 
207                 {
208                 OPENSSL_cleanse(buf,num);
209                 OPENSSL_free(buf);
210                 }
211         return(r);
212         }
213
214 static int rsa_eay_blinding(RSA *rsa, BN_CTX *ctx)
215         {
216         int ret = 1;
217         CRYPTO_w_lock(CRYPTO_LOCK_RSA);
218         /* Check again inside the lock - the macro's check is racey */
219         if(rsa->blinding == NULL)
220                 ret = RSA_blinding_on(rsa, ctx);
221         CRYPTO_w_unlock(CRYPTO_LOCK_RSA);
222         return ret;
223         }
224
225 #define BLINDING_HELPER(rsa, ctx, err_instr) \
226         do { \
227                 if((!((rsa)->flags & RSA_FLAG_NO_BLINDING)) && \
228                     ((rsa)->blinding == NULL) && \
229                     !rsa_eay_blinding(rsa, ctx)) \
230                         err_instr \
231         } while(0)
232
233 static BN_BLINDING *setup_blinding(RSA *rsa, BN_CTX *ctx)
234         {
235         BIGNUM *A, *Ai;
236         BN_BLINDING *ret = NULL;
237
238         /* added in OpenSSL 0.9.6j and 0.9.7b */
239
240         /* NB: similar code appears in RSA_blinding_on (rsa_lib.c);
241          * this should be placed in a new function of its own, but for reasons
242          * of binary compatibility can't */
243
244         BN_CTX_start(ctx);
245         A = BN_CTX_get(ctx);
246         if ((RAND_status() == 0) && rsa->d != NULL && rsa->d->d != NULL)
247                 {
248                 /* if PRNG is not properly seeded, resort to secret exponent as unpredictable seed */
249                 RAND_add(rsa->d->d, rsa->d->dmax * sizeof rsa->d->d[0], 0);
250                 if (!BN_pseudo_rand_range(A,rsa->n)) goto err;
251                 }
252         else
253                 {
254                 if (!BN_rand_range(A,rsa->n)) goto err;
255                 }
256         if ((Ai=BN_mod_inverse(NULL,A,rsa->n,ctx)) == NULL) goto err;
257
258         if (!rsa->meth->bn_mod_exp(A,A,rsa->e,rsa->n,ctx,rsa->_method_mod_n))
259                 goto err;
260         ret = BN_BLINDING_new(A,Ai,rsa->n);
261         BN_free(Ai);
262 err:
263         BN_CTX_end(ctx);
264         return ret;
265         }
266
267 /* signing */
268 static int RSA_eay_private_encrypt(int flen, const unsigned char *from,
269              unsigned char *to, RSA *rsa, int padding)
270         {
271         BIGNUM f,ret;
272         int i,j,k,num=0,r= -1;
273         unsigned char *buf=NULL;
274         BN_CTX *ctx=NULL;
275         int local_blinding = 0;
276         BN_BLINDING *blinding = NULL;
277
278         BN_init(&f);
279         BN_init(&ret);
280
281         if ((ctx=BN_CTX_new()) == NULL) goto err;
282         num=BN_num_bytes(rsa->n);
283         if ((buf=(unsigned char *)OPENSSL_malloc(num)) == NULL)
284                 {
285                 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,ERR_R_MALLOC_FAILURE);
286                 goto err;
287                 }
288
289         switch (padding)
290                 {
291         case RSA_PKCS1_PADDING:
292                 i=RSA_padding_add_PKCS1_type_1(buf,num,from,flen);
293                 break;
294         case RSA_NO_PADDING:
295                 i=RSA_padding_add_none(buf,num,from,flen);
296                 break;
297         case RSA_SSLV23_PADDING:
298         default:
299                 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
300                 goto err;
301                 }
302         if (i <= 0) goto err;
303
304         if (BN_bin2bn(buf,num,&f) == NULL) goto err;
305         
306         if (BN_ucmp(&f, rsa->n) >= 0)
307                 {       
308                 /* usually the padding functions would catch this */
309                 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
310                 goto err;
311                 }
312
313         BLINDING_HELPER(rsa, ctx, goto err;);
314         blinding = rsa->blinding;
315         
316         /* Now unless blinding is disabled, 'blinding' is non-NULL.
317          * But the BN_BLINDING object may be owned by some other thread
318          * (we don't want to keep it constant and we don't want to use
319          * lots of locking to avoid race conditions, so only a single
320          * thread can use it; other threads have to use local blinding
321          * factors) */
322         if (!(rsa->flags & RSA_FLAG_NO_BLINDING))
323                 {
324                 if (blinding == NULL)
325                         {
326                         RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, ERR_R_INTERNAL_ERROR);
327                         goto err;
328                         }
329                 }
330         
331         if (blinding != NULL)
332                 {
333                 if (blinding->thread_id != CRYPTO_thread_id())
334                         {
335                         /* we need a local one-time blinding factor */
336
337                         blinding = setup_blinding(rsa, ctx);
338                         if (blinding == NULL)
339                                 goto err;
340                         local_blinding = 1;
341                         }
342                 }
343
344         if (blinding)
345                 if (!BN_BLINDING_convert(&f, blinding, ctx)) goto err;
346
347         if ( (rsa->flags & RSA_FLAG_EXT_PKEY) ||
348                 ((rsa->p != NULL) &&
349                 (rsa->q != NULL) &&
350                 (rsa->dmp1 != NULL) &&
351                 (rsa->dmq1 != NULL) &&
352                 (rsa->iqmp != NULL)) )
353                 { if (!rsa->meth->rsa_mod_exp(&ret,&f,rsa)) goto err; }
354         else
355                 {
356                 MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
357                 if (!rsa->meth->bn_mod_exp(&ret,&f,rsa->d,rsa->n,ctx,
358                                 rsa->_method_mod_n)) goto err;
359                 }
360
361         if (blinding)
362                 if (!BN_BLINDING_invert(&ret, blinding, ctx)) goto err;
363
364         /* put in leading 0 bytes if the number is less than the
365          * length of the modulus */
366         j=BN_num_bytes(&ret);
367         i=BN_bn2bin(&ret,&(to[num-j]));
368         for (k=0; k<(num-i); k++)
369                 to[k]=0;
370
371         r=num;
372 err:
373         if (ctx != NULL) BN_CTX_free(ctx);
374         BN_clear_free(&ret);
375         BN_clear_free(&f);
376         if (local_blinding)
377                 BN_BLINDING_free(blinding);
378         if (buf != NULL)
379                 {
380                 OPENSSL_cleanse(buf,num);
381                 OPENSSL_free(buf);
382                 }
383         return(r);
384         }
385
386 static int RSA_eay_private_decrypt(int flen, const unsigned char *from,
387              unsigned char *to, RSA *rsa, int padding)
388         {
389         BIGNUM f,ret;
390         int j,num=0,r= -1;
391         unsigned char *p;
392         unsigned char *buf=NULL;
393         BN_CTX *ctx=NULL;
394         int local_blinding = 0;
395         BN_BLINDING *blinding = NULL;
396
397         BN_init(&f);
398         BN_init(&ret);
399         ctx=BN_CTX_new();
400         if (ctx == NULL) goto err;
401
402         num=BN_num_bytes(rsa->n);
403
404         if ((buf=(unsigned char *)OPENSSL_malloc(num)) == NULL)
405                 {
406                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,ERR_R_MALLOC_FAILURE);
407                 goto err;
408                 }
409
410         /* This check was for equality but PGP does evil things
411          * and chops off the top '0' bytes */
412         if (flen > num)
413                 {
414                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_DATA_GREATER_THAN_MOD_LEN);
415                 goto err;
416                 }
417
418         /* make data into a big number */
419         if (BN_bin2bn(from,(int)flen,&f) == NULL) goto err;
420
421         if (BN_ucmp(&f, rsa->n) >= 0)
422                 {
423                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
424                 goto err;
425                 }
426
427         BLINDING_HELPER(rsa, ctx, goto err;);
428         blinding = rsa->blinding;
429         
430         /* Now unless blinding is disabled, 'blinding' is non-NULL.
431          * But the BN_BLINDING object may be owned by some other thread
432          * (we don't want to keep it constant and we don't want to use
433          * lots of locking to avoid race conditions, so only a single
434          * thread can use it; other threads have to use local blinding
435          * factors) */
436         if (!(rsa->flags & RSA_FLAG_NO_BLINDING))
437                 {
438                 if (blinding == NULL)
439                         {
440                         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_INTERNAL_ERROR);
441                         goto err;
442                         }
443                 }
444         
445         if (blinding != NULL)
446                 {
447                 if (blinding->thread_id != CRYPTO_thread_id())
448                         {
449                         /* we need a local one-time blinding factor */
450
451                         blinding = setup_blinding(rsa, ctx);
452                         if (blinding == NULL)
453                                 goto err;
454                         local_blinding = 1;
455                         }
456                 }
457
458         if (blinding)
459                 if (!BN_BLINDING_convert(&f, blinding, ctx)) goto err;
460
461         /* do the decrypt */
462         if ( (rsa->flags & RSA_FLAG_EXT_PKEY) ||
463                 ((rsa->p != NULL) &&
464                 (rsa->q != NULL) &&
465                 (rsa->dmp1 != NULL) &&
466                 (rsa->dmq1 != NULL) &&
467                 (rsa->iqmp != NULL)) )
468                 { if (!rsa->meth->rsa_mod_exp(&ret,&f,rsa)) goto err; }
469         else
470                 {
471                 MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
472                 if (!rsa->meth->bn_mod_exp(&ret,&f,rsa->d,rsa->n,ctx,
473                                 rsa->_method_mod_n))
474                         goto err;
475                 }
476
477         if (blinding)
478                 if (!BN_BLINDING_invert(&ret, blinding, ctx)) goto err;
479
480         p=buf;
481         j=BN_bn2bin(&ret,p); /* j is only used with no-padding mode */
482
483         switch (padding)
484                 {
485         case RSA_PKCS1_PADDING:
486                 r=RSA_padding_check_PKCS1_type_2(to,num,buf,j,num);
487                 break;
488 #ifndef OPENSSL_NO_SHA
489         case RSA_PKCS1_OAEP_PADDING:
490                 r=RSA_padding_check_PKCS1_OAEP(to,num,buf,j,num,NULL,0);
491                 break;
492 #endif
493         case RSA_SSLV23_PADDING:
494                 r=RSA_padding_check_SSLv23(to,num,buf,j,num);
495                 break;
496         case RSA_NO_PADDING:
497                 r=RSA_padding_check_none(to,num,buf,j,num);
498                 break;
499         default:
500                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
501                 goto err;
502                 }
503         if (r < 0)
504                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_PADDING_CHECK_FAILED);
505
506 err:
507         if (ctx != NULL) BN_CTX_free(ctx);
508         BN_clear_free(&f);
509         BN_clear_free(&ret);
510         if (buf != NULL)
511                 {
512                 OPENSSL_cleanse(buf,num);
513                 OPENSSL_free(buf);
514                 }
515         return(r);
516         }
517
518 /* signature verification */
519 static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
520              unsigned char *to, RSA *rsa, int padding)
521         {
522         BIGNUM f,ret;
523         int i,num=0,r= -1;
524         unsigned char *p;
525         unsigned char *buf=NULL;
526         BN_CTX *ctx=NULL;
527
528         BN_init(&f);
529         BN_init(&ret);
530         ctx=BN_CTX_new();
531         if (ctx == NULL) goto err;
532
533         num=BN_num_bytes(rsa->n);
534         buf=(unsigned char *)OPENSSL_malloc(num);
535         if (buf == NULL)
536                 {
537                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,ERR_R_MALLOC_FAILURE);
538                 goto err;
539                 }
540
541         /* This check was for equality but PGP does evil things
542          * and chops off the top '0' bytes */
543         if (flen > num)
544                 {
545                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_DATA_GREATER_THAN_MOD_LEN);
546                 goto err;
547                 }
548
549         if (BN_bin2bn(from,flen,&f) == NULL) goto err;
550
551         if (BN_ucmp(&f, rsa->n) >= 0)
552                 {
553                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
554                 goto err;
555                 }
556
557         MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
558
559         if (!rsa->meth->bn_mod_exp(&ret,&f,rsa->e,rsa->n,ctx,
560                 rsa->_method_mod_n)) goto err;
561
562         p=buf;
563         i=BN_bn2bin(&ret,p);
564
565         switch (padding)
566                 {
567         case RSA_PKCS1_PADDING:
568                 r=RSA_padding_check_PKCS1_type_1(to,num,buf,i,num);
569                 break;
570         case RSA_NO_PADDING:
571                 r=RSA_padding_check_none(to,num,buf,i,num);
572                 break;
573         default:
574                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
575                 goto err;
576                 }
577         if (r < 0)
578                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_PADDING_CHECK_FAILED);
579
580 err:
581         if (ctx != NULL) BN_CTX_free(ctx);
582         BN_clear_free(&f);
583         BN_clear_free(&ret);
584         if (buf != NULL)
585                 {
586                 OPENSSL_cleanse(buf,num);
587                 OPENSSL_free(buf);
588                 }
589         return(r);
590         }
591
592 static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa)
593         {
594         BIGNUM r1,m1,vrfy;
595         int ret=0;
596         BN_CTX *ctx;
597
598         BN_init(&m1);
599         BN_init(&r1);
600         BN_init(&vrfy);
601         if ((ctx=BN_CTX_new()) == NULL) goto err;
602
603         MONT_HELPER(rsa, ctx, p, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err);
604         MONT_HELPER(rsa, ctx, q, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err);
605         MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
606
607         if (!BN_mod(&r1,I,rsa->q,ctx)) goto err;
608         if (!rsa->meth->bn_mod_exp(&m1,&r1,rsa->dmq1,rsa->q,ctx,
609                 rsa->_method_mod_q)) goto err;
610
611         if (!BN_mod(&r1,I,rsa->p,ctx)) goto err;
612         if (!rsa->meth->bn_mod_exp(r0,&r1,rsa->dmp1,rsa->p,ctx,
613                 rsa->_method_mod_p)) goto err;
614
615         if (!BN_sub(r0,r0,&m1)) goto err;
616         /* This will help stop the size of r0 increasing, which does
617          * affect the multiply if it optimised for a power of 2 size */
618         if (BN_get_sign(r0))
619                 if (!BN_add(r0,r0,rsa->p)) goto err;
620
621         if (!BN_mul(&r1,r0,rsa->iqmp,ctx)) goto err;
622         if (!BN_mod(r0,&r1,rsa->p,ctx)) goto err;
623         /* If p < q it is occasionally possible for the correction of
624          * adding 'p' if r0 is negative above to leave the result still
625          * negative. This can break the private key operations: the following
626          * second correction should *always* correct this rare occurrence.
627          * This will *never* happen with OpenSSL generated keys because
628          * they ensure p > q [steve]
629          */
630         if (BN_get_sign(r0))
631                 if (!BN_add(r0,r0,rsa->p)) goto err;
632         if (!BN_mul(&r1,r0,rsa->q,ctx)) goto err;
633         if (!BN_add(r0,&r1,&m1)) goto err;
634
635         if (rsa->e && rsa->n)
636                 {
637                 if (!rsa->meth->bn_mod_exp(&vrfy,r0,rsa->e,rsa->n,ctx,rsa->_method_mod_n)) goto err;
638                 /* If 'I' was greater than (or equal to) rsa->n, the operation
639                  * will be equivalent to using 'I mod n'. However, the result of
640                  * the verify will *always* be less than 'n' so we don't check
641                  * for absolute equality, just congruency. */
642                 if (!BN_sub(&vrfy, &vrfy, I)) goto err;
643                 if (!BN_mod(&vrfy, &vrfy, rsa->n, ctx)) goto err;
644                 if (BN_get_sign(&vrfy))
645                         if (!BN_add(&vrfy, &vrfy, rsa->n)) goto err;
646                 if (!BN_is_zero(&vrfy))
647                         /* 'I' and 'vrfy' aren't congruent mod n. Don't leak
648                          * miscalculated CRT output, just do a raw (slower)
649                          * mod_exp and return that instead. */
650                         if (!rsa->meth->bn_mod_exp(r0,I,rsa->d,rsa->n,ctx,
651                                         rsa->_method_mod_n)) goto err;
652                 }
653         ret=1;
654 err:
655         BN_clear_free(&m1);
656         BN_clear_free(&r1);
657         BN_clear_free(&vrfy);
658         BN_CTX_free(ctx);
659         return(ret);
660         }
661
662 static int RSA_eay_init(RSA *rsa)
663         {
664         rsa->flags|=RSA_FLAG_CACHE_PUBLIC|RSA_FLAG_CACHE_PRIVATE;
665         return(1);
666         }
667
668 static int RSA_eay_finish(RSA *rsa)
669         {
670         if (rsa->_method_mod_n != NULL)
671                 BN_MONT_CTX_free(rsa->_method_mod_n);
672         if (rsa->_method_mod_p != NULL)
673                 BN_MONT_CTX_free(rsa->_method_mod_p);
674         if (rsa->_method_mod_q != NULL)
675                 BN_MONT_CTX_free(rsa->_method_mod_q);
676         return(1);
677         }
678
679 #endif