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