Exetended OAEP support.
[oweals/openssl.git] / crypto / rsa / rsa_pmeth.c
1 /* crypto/rsa/rsa_pmeth.c */
2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3  * project 2006.
4  */
5 /* ====================================================================
6  * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer. 
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in
17  *    the documentation and/or other materials provided with the
18  *    distribution.
19  *
20  * 3. All advertising materials mentioning features or use of this
21  *    software must display the following acknowledgment:
22  *    "This product includes software developed by the OpenSSL Project
23  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24  *
25  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26  *    endorse or promote products derived from this software without
27  *    prior written permission. For written permission, please contact
28  *    licensing@OpenSSL.org.
29  *
30  * 5. Products derived from this software may not be called "OpenSSL"
31  *    nor may "OpenSSL" appear in their names without prior written
32  *    permission of the OpenSSL Project.
33  *
34  * 6. Redistributions of any form whatsoever must retain the following
35  *    acknowledgment:
36  *    "This product includes software developed by the OpenSSL Project
37  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38  *
39  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50  * OF THE POSSIBILITY OF SUCH DAMAGE.
51  * ====================================================================
52  *
53  * This product includes cryptographic software written by Eric Young
54  * (eay@cryptsoft.com).  This product includes software written by Tim
55  * Hudson (tjh@cryptsoft.com).
56  *
57  */
58
59 #include <stdio.h>
60 #include "cryptlib.h"
61 #include <openssl/asn1t.h>
62 #include <openssl/x509.h>
63 #include <openssl/rsa.h>
64 #include <openssl/bn.h>
65 #include <openssl/evp.h>
66 #include <openssl/x509v3.h>
67 #ifndef OPENSSL_NO_CMS
68 #include <openssl/cms.h>
69 #endif
70 #include "evp_locl.h"
71 #include "rsa_locl.h"
72
73 /* RSA pkey context structure */
74
75 typedef struct
76         {
77         /* Key gen parameters */
78         int nbits;
79         BIGNUM *pub_exp;
80         /* Keygen callback info */
81         int gentmp[2];
82         /* RSA padding mode */
83         int pad_mode;
84         /* message digest */
85         const EVP_MD *md;
86         /* message digest for MGF1 */
87         const EVP_MD *mgf1md;
88         /* PSS salt length */
89         int saltlen;
90         /* Temp buffer */
91         unsigned char *tbuf;
92         /* OAEP label */
93         unsigned char *oaep_label;
94         size_t oaep_labellen;
95         } RSA_PKEY_CTX;
96
97 static int pkey_rsa_init(EVP_PKEY_CTX *ctx)
98         {
99         RSA_PKEY_CTX *rctx;
100         rctx = OPENSSL_malloc(sizeof(RSA_PKEY_CTX));
101         if (!rctx)
102                 return 0;
103         rctx->nbits = 1024;
104         rctx->pub_exp = NULL;
105         rctx->pad_mode = RSA_PKCS1_PADDING;
106         rctx->md = NULL;
107         rctx->mgf1md = NULL;
108         rctx->tbuf = NULL;
109
110         rctx->saltlen = -2;
111
112         rctx->oaep_label = NULL;
113         rctx->oaep_labellen = 0;
114
115         ctx->data = rctx;
116         ctx->keygen_info = rctx->gentmp;
117         ctx->keygen_info_count = 2;
118         
119         return 1;
120         }
121
122 static int pkey_rsa_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src)
123         {
124         RSA_PKEY_CTX *dctx, *sctx;
125         if (!pkey_rsa_init(dst))
126                 return 0;
127         sctx = src->data;
128         dctx = dst->data;
129         dctx->nbits = sctx->nbits;
130         if (sctx->pub_exp)
131                 {
132                 dctx->pub_exp = BN_dup(sctx->pub_exp);
133                 if (!dctx->pub_exp)
134                         return 0;
135                 }
136         dctx->pad_mode = sctx->pad_mode;
137         dctx->md = sctx->md;
138         dctx->mgf1md = sctx->mgf1md;
139         if (sctx->oaep_label)
140                 {
141                 if (dctx->oaep_label)
142                         OPENSSL_free(dctx->oaep_label);
143                 dctx->oaep_label = BUF_memdup(sctx->oaep_label,
144                                                 sctx->oaep_labellen);
145                 if (!dctx->oaep_label)
146                         return 0;
147                 dctx->oaep_labellen = sctx->oaep_labellen;
148                 }
149         return 1;
150         }
151
152 static int setup_tbuf(RSA_PKEY_CTX *ctx, EVP_PKEY_CTX *pk)
153         {
154         if (ctx->tbuf)
155                 return 1;
156         ctx->tbuf = OPENSSL_malloc(EVP_PKEY_size(pk->pkey));
157         if (!ctx->tbuf)
158                 return 0;
159         return 1;
160         }
161
162 static void pkey_rsa_cleanup(EVP_PKEY_CTX *ctx)
163         {
164         RSA_PKEY_CTX *rctx = ctx->data;
165         if (rctx)
166                 {
167                 if (rctx->pub_exp)
168                         BN_free(rctx->pub_exp);
169                 if (rctx->tbuf)
170                         OPENSSL_free(rctx->tbuf);
171                 if (rctx->oaep_label)
172                         OPENSSL_free(rctx->oaep_label);
173                 OPENSSL_free(rctx);
174                 }
175         }
176
177 static int pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
178                                         const unsigned char *tbs, size_t tbslen)
179         {
180         int ret;
181         RSA_PKEY_CTX *rctx = ctx->data;
182         RSA *rsa = ctx->pkey->pkey.rsa;
183
184         if (rctx->md)
185                 {
186                 if (tbslen != (size_t)EVP_MD_size(rctx->md))
187                         {
188                         RSAerr(RSA_F_PKEY_RSA_SIGN,
189                                         RSA_R_INVALID_DIGEST_LENGTH);
190                         return -1;
191                         }
192
193                 if (EVP_MD_type(rctx->md) == NID_mdc2)
194                         {
195                         unsigned int sltmp;
196                         if (rctx->pad_mode != RSA_PKCS1_PADDING)
197                                 return -1;
198                         ret = RSA_sign_ASN1_OCTET_STRING(NID_mdc2,
199                                                 tbs, tbslen, sig, &sltmp, rsa);
200
201                         if (ret <= 0)
202                                 return ret;
203                         ret = sltmp;
204                         }
205                 else if (rctx->pad_mode == RSA_X931_PADDING)
206                         {
207                         if (!setup_tbuf(rctx, ctx))
208                                 return -1;
209                         memcpy(rctx->tbuf, tbs, tbslen);
210                         rctx->tbuf[tbslen] =
211                                 RSA_X931_hash_id(EVP_MD_type(rctx->md));
212                         ret = RSA_private_encrypt(tbslen + 1, rctx->tbuf,
213                                                 sig, rsa, RSA_X931_PADDING);
214                         }
215                 else if (rctx->pad_mode == RSA_PKCS1_PADDING)
216                         {
217                         unsigned int sltmp;
218                         ret = RSA_sign(EVP_MD_type(rctx->md),
219                                                 tbs, tbslen, sig, &sltmp, rsa);
220                         if (ret <= 0)
221                                 return ret;
222                         ret = sltmp;
223                         }
224                 else if (rctx->pad_mode == RSA_PKCS1_PSS_PADDING)
225                         {
226                         if (!setup_tbuf(rctx, ctx))
227                                 return -1;
228                         if (!RSA_padding_add_PKCS1_PSS_mgf1(rsa,
229                                                 rctx->tbuf, tbs,
230                                                 rctx->md, rctx->mgf1md,
231                                                 rctx->saltlen))
232                                 return -1;
233                         ret = RSA_private_encrypt(RSA_size(rsa), rctx->tbuf,
234                                                 sig, rsa, RSA_NO_PADDING);
235                         }
236                 else
237                         return -1;
238                 }
239         else
240                 ret = RSA_private_encrypt(tbslen, tbs, sig, ctx->pkey->pkey.rsa,
241                                                         rctx->pad_mode);
242         if (ret < 0)
243                 return ret;
244         *siglen = ret;
245         return 1;
246         }
247
248
249 static int pkey_rsa_verifyrecover(EVP_PKEY_CTX *ctx,
250                                         unsigned char *rout, size_t *routlen,
251                                         const unsigned char *sig, size_t siglen)
252         {
253         int ret;
254         RSA_PKEY_CTX *rctx = ctx->data;
255
256         if (rctx->md)
257                 {
258                 if (rctx->pad_mode == RSA_X931_PADDING)
259                         {
260                         if (!setup_tbuf(rctx, ctx))
261                                 return -1;
262                         ret = RSA_public_decrypt(siglen, sig,
263                                                 rctx->tbuf, ctx->pkey->pkey.rsa,
264                                                 RSA_X931_PADDING);
265                         if (ret < 1)
266                                 return 0;
267                         ret--;
268                         if (rctx->tbuf[ret] !=
269                                 RSA_X931_hash_id(EVP_MD_type(rctx->md)))
270                                 {
271                                 RSAerr(RSA_F_PKEY_RSA_VERIFYRECOVER,
272                                                 RSA_R_ALGORITHM_MISMATCH);
273                                 return 0;
274                                 }
275                         if (ret != EVP_MD_size(rctx->md))
276                                 {
277                                 RSAerr(RSA_F_PKEY_RSA_VERIFYRECOVER,
278                                         RSA_R_INVALID_DIGEST_LENGTH);
279                                 return 0;
280                                 }
281                         if (rout)
282                                 memcpy(rout, rctx->tbuf, ret);
283                         }
284                 else if (rctx->pad_mode == RSA_PKCS1_PADDING)
285                         {
286                         size_t sltmp;
287                         ret = int_rsa_verify(EVP_MD_type(rctx->md),
288                                                 NULL, 0, rout, &sltmp,
289                                         sig, siglen, ctx->pkey->pkey.rsa);
290                         if (ret <= 0)
291                                 return 0;
292                         ret = sltmp;
293                         }
294                 else
295                         return -1;
296                 }
297         else
298                 ret = RSA_public_decrypt(siglen, sig, rout, ctx->pkey->pkey.rsa,
299                                                         rctx->pad_mode);
300         if (ret < 0)
301                 return ret;
302         *routlen = ret;
303         return 1;
304         }
305
306 static int pkey_rsa_verify(EVP_PKEY_CTX *ctx,
307                                         const unsigned char *sig, size_t siglen,
308                                         const unsigned char *tbs, size_t tbslen)
309         {
310         RSA_PKEY_CTX *rctx = ctx->data;
311         RSA *rsa = ctx->pkey->pkey.rsa;
312         size_t rslen;
313         if (rctx->md)
314                 {
315                 if (rctx->pad_mode == RSA_PKCS1_PADDING)
316                         return RSA_verify(EVP_MD_type(rctx->md), tbs, tbslen,
317                                         sig, siglen, rsa);
318                 if (rctx->pad_mode == RSA_X931_PADDING)
319                         {
320                         if (pkey_rsa_verifyrecover(ctx, NULL, &rslen,
321                                         sig, siglen) <= 0)
322                                 return 0;
323                         }
324                 else if (rctx->pad_mode == RSA_PKCS1_PSS_PADDING)
325                         {
326                         int ret;
327                         if (!setup_tbuf(rctx, ctx))
328                                 return -1;
329                         ret = RSA_public_decrypt(siglen, sig, rctx->tbuf,
330                                                         rsa, RSA_NO_PADDING);
331                         if (ret <= 0)
332                                 return 0;
333                         ret = RSA_verify_PKCS1_PSS_mgf1(rsa, tbs,
334                                                 rctx->md, rctx->mgf1md,
335                                                 rctx->tbuf, rctx->saltlen);
336                         if (ret <= 0)
337                                 return 0;
338                         return 1;
339                         }
340                 else
341                         return -1;
342                 }
343         else
344                 {
345                 if (!setup_tbuf(rctx, ctx))
346                         return -1;
347                 rslen = RSA_public_decrypt(siglen, sig, rctx->tbuf,
348                                                 rsa, rctx->pad_mode);
349                 if (rslen == 0)
350                         return 0;
351                 }
352
353         if ((rslen != tbslen) || memcmp(tbs, rctx->tbuf, rslen))
354                 return 0;
355
356         return 1;
357                         
358         }
359
360 static int pkey_rsa_encrypt(EVP_PKEY_CTX *ctx,
361                                         unsigned char *out, size_t *outlen,
362                                         const unsigned char *in, size_t inlen)
363         {
364         int ret;
365         RSA_PKEY_CTX *rctx = ctx->data;
366         if (rctx->pad_mode == RSA_PKCS1_OAEP_PADDING)
367                 {
368                 int klen = RSA_size(ctx->pkey->pkey.rsa);
369                 if (!setup_tbuf(rctx, ctx))
370                         return -1;
371                 if (!RSA_padding_add_PKCS1_OAEP_mgf1(rctx->tbuf, klen,
372                                                         in, inlen,
373                                                         rctx->oaep_label,
374                                                         rctx->oaep_labellen,
375                                                         rctx->md, rctx->mgf1md))
376                         return -1;
377                 ret = RSA_public_encrypt(klen, rctx->tbuf, out,
378                                                 ctx->pkey->pkey.rsa,
379                                                 RSA_NO_PADDING);
380                 }
381         else
382                 ret = RSA_public_encrypt(inlen, in, out, ctx->pkey->pkey.rsa,
383                                                         rctx->pad_mode);
384         if (ret < 0)
385                 return ret;
386         *outlen = ret;
387         return 1;
388         }
389
390 static int pkey_rsa_decrypt(EVP_PKEY_CTX *ctx,
391                                         unsigned char *out, size_t *outlen,
392                                         const unsigned char *in, size_t inlen)
393         {
394         int ret;
395         RSA_PKEY_CTX *rctx = ctx->data;
396         if (rctx->pad_mode == RSA_PKCS1_OAEP_PADDING)
397                 {
398                 int i;
399                 if (!setup_tbuf(rctx, ctx))
400                         return -1;
401                 ret = RSA_private_decrypt(inlen, in, rctx->tbuf,
402                                                         ctx->pkey->pkey.rsa,
403                                                         RSA_NO_PADDING);
404                 if (ret <= 0)
405                         return ret;
406                 for (i = 0; i < ret; i++)
407                         {
408                         if (rctx->tbuf[i])
409                                 break;
410                         }
411                 ret = RSA_padding_check_PKCS1_OAEP_mgf1(out,ret,rctx->tbuf + i,
412                                                         ret - i, ret,
413                                                         rctx->oaep_label,
414                                                         rctx->oaep_labellen,
415                                                         rctx->md, rctx->mgf1md);
416                 }
417         else 
418                 ret = RSA_private_decrypt(inlen, in, out, ctx->pkey->pkey.rsa,
419                                                         rctx->pad_mode);
420         if (ret < 0)
421                 return ret;
422         *outlen = ret;
423         return 1;
424         }
425
426 static int check_padding_md(const EVP_MD *md, int padding)
427         {
428         if (!md)
429                 return 1;
430
431         if (padding == RSA_NO_PADDING)
432                 {
433                 RSAerr(RSA_F_CHECK_PADDING_MD, RSA_R_INVALID_PADDING_MODE);
434                 return 0;
435                 }
436
437         if (padding == RSA_X931_PADDING)
438                 {
439                 if (RSA_X931_hash_id(EVP_MD_type(md)) == -1)
440                         {
441                         RSAerr(RSA_F_CHECK_PADDING_MD,
442                                                 RSA_R_INVALID_X931_DIGEST);
443                         return 0;
444                         }
445                 return 1;
446                 }
447
448         return 1;
449         }
450                         
451
452 static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
453         {
454         RSA_PKEY_CTX *rctx = ctx->data;
455         switch (type)
456                 {
457                 case EVP_PKEY_CTRL_RSA_PADDING:
458                 if ((p1 >= RSA_PKCS1_PADDING) && (p1 <= RSA_PKCS1_PSS_PADDING))
459                         {
460                         if (!check_padding_md(rctx->md, p1))
461                                 return 0;
462                         if (p1 == RSA_PKCS1_PSS_PADDING) 
463                                 {
464                                 if (!(ctx->operation &
465                                      (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY)))
466                                         goto bad_pad;
467                                 if (!rctx->md)
468                                         rctx->md = EVP_sha1();
469                                 }
470                         if (p1 == RSA_PKCS1_OAEP_PADDING) 
471                                 {
472                                 if (!(ctx->operation & EVP_PKEY_OP_TYPE_CRYPT))
473                                         goto bad_pad;
474                                 if (!rctx->md)
475                                         rctx->md = EVP_sha1();
476                                 }
477                         rctx->pad_mode = p1;
478                         return 1;
479                         }
480                 bad_pad:
481                 RSAerr(RSA_F_PKEY_RSA_CTRL,
482                                 RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE);
483                 return -2;
484
485                 case EVP_PKEY_CTRL_GET_RSA_PADDING:
486                 *(int *)p2 = rctx->pad_mode;
487                 return 1;
488
489                 case EVP_PKEY_CTRL_RSA_PSS_SALTLEN:
490                 case EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN:
491                 if (rctx->pad_mode != RSA_PKCS1_PSS_PADDING)
492                         {
493                         RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PSS_SALTLEN);
494                         return -2;
495                         }
496                 if (type == EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN)
497                         *(int *)p2 = rctx->saltlen;
498                 else
499                         {
500                         if (p1 < -2)
501                                 return -2;
502                         rctx->saltlen = p1;
503                         }
504                 return 1;
505
506                 case EVP_PKEY_CTRL_RSA_KEYGEN_BITS:
507                 if (p1 < 256)
508                         {
509                         RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_KEYBITS);
510                         return -2;
511                         }
512                 rctx->nbits = p1;
513                 return 1;
514
515                 case EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP:
516                 if (!p2)
517                         return -2;
518                 BN_free(rctx->pub_exp);
519                 rctx->pub_exp = p2;
520                 return 1;
521
522                 case EVP_PKEY_CTRL_RSA_OAEP_MD:
523                 if (rctx->pad_mode != RSA_PKCS1_OAEP_PADDING)
524                         {
525                         RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PADDING_MODE);
526                         return 0;
527                         }
528                 rctx->md = p2;
529                 return 1;
530
531                 case EVP_PKEY_CTRL_MD:
532                 if (!check_padding_md(p2, rctx->pad_mode))
533                         return 0;
534                 rctx->md = p2;
535                 return 1;
536
537                 case EVP_PKEY_CTRL_RSA_MGF1_MD:
538                 case EVP_PKEY_CTRL_GET_RSA_MGF1_MD:
539                 if (rctx->pad_mode != RSA_PKCS1_PSS_PADDING
540                         && rctx->pad_mode != RSA_PKCS1_OAEP_PADDING)
541                         {
542                         RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_MGF1_MD);
543                         return -2;
544                         }
545                 if (type == EVP_PKEY_CTRL_GET_RSA_MGF1_MD)
546                         {
547                         if (rctx->mgf1md)
548                                 *(const EVP_MD **)p2 = rctx->mgf1md;
549                         else
550                                 *(const EVP_MD **)p2 = rctx->md;
551                         }
552                 else
553                         rctx->mgf1md = p2;
554                 return 1;
555
556                 case EVP_PKEY_CTRL_RSA_OAEP_LABEL:
557                 OPENSSL_free(rctx->oaep_label);
558                 rctx->oaep_label = p2;
559                 rctx->oaep_labellen = p1;
560                 return 1;
561
562                 case EVP_PKEY_CTRL_DIGESTINIT:
563                 case EVP_PKEY_CTRL_PKCS7_ENCRYPT:
564                 case EVP_PKEY_CTRL_PKCS7_DECRYPT:
565                 case EVP_PKEY_CTRL_PKCS7_SIGN:
566                 return 1;
567 #ifndef OPENSSL_NO_CMS
568                 case EVP_PKEY_CTRL_CMS_DECRYPT:
569                 {
570                 X509_ALGOR *alg = NULL;
571                 ASN1_OBJECT *encalg = NULL;
572                 if (p2)
573                         CMS_RecipientInfo_ktri_get0_algs(p2, NULL, NULL, &alg);
574                 if (alg)
575                         X509_ALGOR_get0(&encalg, NULL, NULL, alg);
576                 if (encalg && OBJ_obj2nid(encalg) == NID_rsaesOaep)
577                         rctx->pad_mode = RSA_PKCS1_OAEP_PADDING;
578                 }
579                 case EVP_PKEY_CTRL_CMS_ENCRYPT:
580                 case EVP_PKEY_CTRL_CMS_SIGN:
581                 return 1;
582 #endif
583                 case EVP_PKEY_CTRL_PEER_KEY:
584                         RSAerr(RSA_F_PKEY_RSA_CTRL,
585                         RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
586                         return -2;      
587
588                 default:
589                 return -2;
590
591                 }
592         }
593                         
594 static int pkey_rsa_ctrl_str(EVP_PKEY_CTX *ctx,
595                         const char *type, const char *value)
596         {
597         if (!value)
598                 {
599                 RSAerr(RSA_F_PKEY_RSA_CTRL_STR, RSA_R_VALUE_MISSING);
600                 return 0;
601                 }
602         if (!strcmp(type, "rsa_padding_mode"))
603                 {
604                 int pm;
605                 if (!strcmp(value, "pkcs1"))
606                         pm = RSA_PKCS1_PADDING;
607                 else if (!strcmp(value, "sslv23"))
608                         pm = RSA_SSLV23_PADDING;
609                 else if (!strcmp(value, "none"))
610                         pm = RSA_NO_PADDING;
611                 else if (!strcmp(value, "oeap"))
612                         pm = RSA_PKCS1_OAEP_PADDING;
613                 else if (!strcmp(value, "oaep"))
614                         pm = RSA_PKCS1_OAEP_PADDING;
615                 else if (!strcmp(value, "x931"))
616                         pm = RSA_X931_PADDING;
617                 else if (!strcmp(value, "pss"))
618                         pm = RSA_PKCS1_PSS_PADDING;
619                 else
620                         {
621                         RSAerr(RSA_F_PKEY_RSA_CTRL_STR,
622                                                 RSA_R_UNKNOWN_PADDING_TYPE);
623                         return -2;
624                         }
625                 return EVP_PKEY_CTX_set_rsa_padding(ctx, pm);
626                 }
627
628         if (!strcmp(type, "rsa_pss_saltlen"))
629                 {
630                 int saltlen;
631                 saltlen = atoi(value);
632                 return EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, saltlen);
633                 }
634
635         if (!strcmp(type, "rsa_keygen_bits"))
636                 {
637                 int nbits;
638                 nbits = atoi(value);
639                 return EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, nbits);
640                 }
641
642         if (!strcmp(type, "rsa_keygen_pubexp"))
643                 {
644                 int ret;
645                 BIGNUM *pubexp = NULL;
646                 if (!BN_asc2bn(&pubexp, value))
647                         return 0;
648                 ret = EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp);
649                 if (ret <= 0)
650                         BN_free(pubexp);
651                 return ret;
652                 }
653
654         if (!strcmp(type, "rsa_mgf1_md"))
655                 {
656                 const EVP_MD *md;
657                 if (!(md = EVP_get_digestbyname(value)))
658                         {
659                         RSAerr(RSA_F_PKEY_RSA_CTRL_STR,
660                                                 RSA_R_INVALID_DIGEST);
661                         return 0;
662                         }
663                 return EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, md);
664                 }
665
666         if (!strcmp(type, "rsa_oaep_md"))
667                 {
668                 const EVP_MD *md;
669                 if (!(md = EVP_get_digestbyname(value)))
670                         {
671                         RSAerr(RSA_F_PKEY_RSA_CTRL_STR,
672                                                 RSA_R_INVALID_DIGEST);
673                         return 0;
674                         }
675                 return EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md);
676                 }
677         if (!strcmp(type, "rsa_oaep_label"))
678                 {
679                 unsigned char *lab;
680                 long lablen;
681                 int ret;
682                 lab = string_to_hex(value, &lablen);
683                 if (!lab)
684                         return 0;
685                 ret = EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, lab, lablen);
686                 if (ret <= 0)
687                         OPENSSL_free(lab);
688                 return ret;
689                 }
690
691         return -2;
692         }
693
694 static int pkey_rsa_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
695         {
696         RSA *rsa = NULL;
697         RSA_PKEY_CTX *rctx = ctx->data;
698         BN_GENCB *pcb, cb;
699         int ret;
700         if (!rctx->pub_exp)
701                 {
702                 rctx->pub_exp = BN_new();
703                 if (!rctx->pub_exp || !BN_set_word(rctx->pub_exp, RSA_F4))
704                         return 0;
705                 }
706         rsa = RSA_new();
707         if (!rsa)
708                 return 0;
709         if (ctx->pkey_gencb)
710                 {
711                 pcb = &cb;
712                 evp_pkey_set_cb_translate(pcb, ctx);
713                 }
714         else
715                 pcb = NULL;
716         ret = RSA_generate_key_ex(rsa, rctx->nbits, rctx->pub_exp, pcb);
717         if (ret > 0)
718                 EVP_PKEY_assign_RSA(pkey, rsa);
719         else
720                 RSA_free(rsa);
721         return ret;
722         }
723
724 const EVP_PKEY_METHOD rsa_pkey_meth = 
725         {
726         EVP_PKEY_RSA,
727         EVP_PKEY_FLAG_AUTOARGLEN,
728         pkey_rsa_init,
729         pkey_rsa_copy,
730         pkey_rsa_cleanup,
731
732         0,0,
733
734         0,
735         pkey_rsa_keygen,
736
737         0,
738         pkey_rsa_sign,
739
740         0,
741         pkey_rsa_verify,
742
743         0,
744         pkey_rsa_verifyrecover,
745
746
747         0,0,0,0,
748
749         0,
750         pkey_rsa_encrypt,
751
752         0,
753         pkey_rsa_decrypt,
754
755         0,0,
756
757         pkey_rsa_ctrl,
758         pkey_rsa_ctrl_str
759
760
761         };