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