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