Fix handling of EVP_PKEY_CTRL_PKCS7_ENCRYPT/DECRYPT with OPENSSL_NO_CMS.
[oweals/openssl.git] / crypto / rsa / rsa_pmeth.c
1 /*
2  * Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the OpenSSL license (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9
10 #include <stdio.h>
11 #include "internal/cryptlib.h"
12 #include <openssl/asn1t.h>
13 #include <openssl/x509.h>
14 #include <openssl/rsa.h>
15 #include <openssl/bn.h>
16 #include <openssl/evp.h>
17 #include <openssl/x509v3.h>
18 #include <openssl/cms.h>
19 #include "internal/evp_int.h"
20 #include "rsa_locl.h"
21
22 /* RSA pkey context structure */
23
24 typedef struct {
25     /* Key gen parameters */
26     int nbits;
27     BIGNUM *pub_exp;
28     /* Keygen callback info */
29     int gentmp[2];
30     /* RSA padding mode */
31     int pad_mode;
32     /* message digest */
33     const EVP_MD *md;
34     /* message digest for MGF1 */
35     const EVP_MD *mgf1md;
36     /* PSS salt length */
37     int saltlen;
38     /* Minimum salt length or -1 if no PSS parameter restriction */
39     int min_saltlen;
40     /* Temp buffer */
41     unsigned char *tbuf;
42     /* OAEP label */
43     unsigned char *oaep_label;
44     size_t oaep_labellen;
45 } RSA_PKEY_CTX;
46
47 /* True if PSS parameters are restricted */
48 #define rsa_pss_restricted(rctx) (rctx->min_saltlen != -1)
49
50 static int pkey_rsa_init(EVP_PKEY_CTX *ctx)
51 {
52     RSA_PKEY_CTX *rctx = OPENSSL_zalloc(sizeof(*rctx));
53
54     if (rctx == NULL)
55         return 0;
56     rctx->nbits = 1024;
57     if (pkey_ctx_is_pss(ctx))
58         rctx->pad_mode = RSA_PKCS1_PSS_PADDING;
59     else
60         rctx->pad_mode = RSA_PKCS1_PADDING;
61     /* Maximum for sign, auto for verify */
62     rctx->saltlen = RSA_PSS_SALTLEN_AUTO;
63     rctx->min_saltlen = -1;
64     ctx->data = rctx;
65     ctx->keygen_info = rctx->gentmp;
66     ctx->keygen_info_count = 2;
67
68     return 1;
69 }
70
71 static int pkey_rsa_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src)
72 {
73     RSA_PKEY_CTX *dctx, *sctx;
74
75     if (!pkey_rsa_init(dst))
76         return 0;
77     sctx = src->data;
78     dctx = dst->data;
79     dctx->nbits = sctx->nbits;
80     if (sctx->pub_exp) {
81         dctx->pub_exp = BN_dup(sctx->pub_exp);
82         if (!dctx->pub_exp)
83             return 0;
84     }
85     dctx->pad_mode = sctx->pad_mode;
86     dctx->md = sctx->md;
87     dctx->mgf1md = sctx->mgf1md;
88     if (sctx->oaep_label) {
89         OPENSSL_free(dctx->oaep_label);
90         dctx->oaep_label = OPENSSL_memdup(sctx->oaep_label, sctx->oaep_labellen);
91         if (!dctx->oaep_label)
92             return 0;
93         dctx->oaep_labellen = sctx->oaep_labellen;
94     }
95     return 1;
96 }
97
98 static int setup_tbuf(RSA_PKEY_CTX *ctx, EVP_PKEY_CTX *pk)
99 {
100     if (ctx->tbuf != NULL)
101         return 1;
102     ctx->tbuf = OPENSSL_malloc(EVP_PKEY_size(pk->pkey));
103     if (ctx->tbuf == NULL)
104         return 0;
105     return 1;
106 }
107
108 static void pkey_rsa_cleanup(EVP_PKEY_CTX *ctx)
109 {
110     RSA_PKEY_CTX *rctx = ctx->data;
111     if (rctx) {
112         BN_free(rctx->pub_exp);
113         OPENSSL_free(rctx->tbuf);
114         OPENSSL_free(rctx->oaep_label);
115         OPENSSL_free(rctx);
116     }
117 }
118
119 static int pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig,
120                          size_t *siglen, const unsigned char *tbs,
121                          size_t tbslen)
122 {
123     int ret;
124     RSA_PKEY_CTX *rctx = ctx->data;
125     RSA *rsa = ctx->pkey->pkey.rsa;
126
127     if (rctx->md) {
128         if (tbslen != (size_t)EVP_MD_size(rctx->md)) {
129             RSAerr(RSA_F_PKEY_RSA_SIGN, RSA_R_INVALID_DIGEST_LENGTH);
130             return -1;
131         }
132
133         if (EVP_MD_type(rctx->md) == NID_mdc2) {
134             unsigned int sltmp;
135             if (rctx->pad_mode != RSA_PKCS1_PADDING)
136                 return -1;
137             ret = RSA_sign_ASN1_OCTET_STRING(0,
138                                              tbs, tbslen, sig, &sltmp, rsa);
139
140             if (ret <= 0)
141                 return ret;
142             ret = sltmp;
143         } else if (rctx->pad_mode == RSA_X931_PADDING) {
144             if ((size_t)EVP_PKEY_size(ctx->pkey) < tbslen + 1) {
145                 RSAerr(RSA_F_PKEY_RSA_SIGN, RSA_R_KEY_SIZE_TOO_SMALL);
146                 return -1;
147             }
148             if (!setup_tbuf(rctx, ctx)) {
149                 RSAerr(RSA_F_PKEY_RSA_SIGN, ERR_R_MALLOC_FAILURE);
150                 return -1;
151             }
152             memcpy(rctx->tbuf, tbs, tbslen);
153             rctx->tbuf[tbslen] = RSA_X931_hash_id(EVP_MD_type(rctx->md));
154             ret = RSA_private_encrypt(tbslen + 1, rctx->tbuf,
155                                       sig, rsa, RSA_X931_PADDING);
156         } else if (rctx->pad_mode == RSA_PKCS1_PADDING) {
157             unsigned int sltmp;
158             ret = RSA_sign(EVP_MD_type(rctx->md),
159                            tbs, tbslen, sig, &sltmp, rsa);
160             if (ret <= 0)
161                 return ret;
162             ret = sltmp;
163         } else if (rctx->pad_mode == RSA_PKCS1_PSS_PADDING) {
164             if (!setup_tbuf(rctx, ctx))
165                 return -1;
166             if (!RSA_padding_add_PKCS1_PSS_mgf1(rsa,
167                                                 rctx->tbuf, tbs,
168                                                 rctx->md, rctx->mgf1md,
169                                                 rctx->saltlen))
170                 return -1;
171             ret = RSA_private_encrypt(RSA_size(rsa), rctx->tbuf,
172                                       sig, rsa, RSA_NO_PADDING);
173         } else
174             return -1;
175     } else
176         ret = RSA_private_encrypt(tbslen, tbs, sig, ctx->pkey->pkey.rsa,
177                                   rctx->pad_mode);
178     if (ret < 0)
179         return ret;
180     *siglen = ret;
181     return 1;
182 }
183
184 static int pkey_rsa_verifyrecover(EVP_PKEY_CTX *ctx,
185                                   unsigned char *rout, size_t *routlen,
186                                   const unsigned char *sig, size_t siglen)
187 {
188     int ret;
189     RSA_PKEY_CTX *rctx = ctx->data;
190
191     if (rctx->md) {
192         if (rctx->pad_mode == RSA_X931_PADDING) {
193             if (!setup_tbuf(rctx, ctx))
194                 return -1;
195             ret = RSA_public_decrypt(siglen, sig,
196                                      rctx->tbuf, ctx->pkey->pkey.rsa,
197                                      RSA_X931_PADDING);
198             if (ret < 1)
199                 return 0;
200             ret--;
201             if (rctx->tbuf[ret] != RSA_X931_hash_id(EVP_MD_type(rctx->md))) {
202                 RSAerr(RSA_F_PKEY_RSA_VERIFYRECOVER,
203                        RSA_R_ALGORITHM_MISMATCH);
204                 return 0;
205             }
206             if (ret != EVP_MD_size(rctx->md)) {
207                 RSAerr(RSA_F_PKEY_RSA_VERIFYRECOVER,
208                        RSA_R_INVALID_DIGEST_LENGTH);
209                 return 0;
210             }
211             if (rout)
212                 memcpy(rout, rctx->tbuf, ret);
213         } else if (rctx->pad_mode == RSA_PKCS1_PADDING) {
214             size_t sltmp;
215             ret = int_rsa_verify(EVP_MD_type(rctx->md),
216                                  NULL, 0, rout, &sltmp,
217                                  sig, siglen, ctx->pkey->pkey.rsa);
218             if (ret <= 0)
219                 return 0;
220             ret = sltmp;
221         } else
222             return -1;
223     } else
224         ret = RSA_public_decrypt(siglen, sig, rout, ctx->pkey->pkey.rsa,
225                                  rctx->pad_mode);
226     if (ret < 0)
227         return ret;
228     *routlen = ret;
229     return 1;
230 }
231
232 static int pkey_rsa_verify(EVP_PKEY_CTX *ctx,
233                            const unsigned char *sig, size_t siglen,
234                            const unsigned char *tbs, size_t tbslen)
235 {
236     RSA_PKEY_CTX *rctx = ctx->data;
237     RSA *rsa = ctx->pkey->pkey.rsa;
238     size_t rslen;
239
240     if (rctx->md) {
241         if (rctx->pad_mode == RSA_PKCS1_PADDING)
242             return RSA_verify(EVP_MD_type(rctx->md), tbs, tbslen,
243                               sig, siglen, rsa);
244         if (tbslen != (size_t)EVP_MD_size(rctx->md)) {
245             RSAerr(RSA_F_PKEY_RSA_VERIFY, RSA_R_INVALID_DIGEST_LENGTH);
246             return -1;
247         }
248         if (rctx->pad_mode == RSA_X931_PADDING) {
249             if (pkey_rsa_verifyrecover(ctx, NULL, &rslen, sig, siglen) <= 0)
250                 return 0;
251         } else if (rctx->pad_mode == RSA_PKCS1_PSS_PADDING) {
252             int ret;
253             if (!setup_tbuf(rctx, ctx))
254                 return -1;
255             ret = RSA_public_decrypt(siglen, sig, rctx->tbuf,
256                                      rsa, RSA_NO_PADDING);
257             if (ret <= 0)
258                 return 0;
259             ret = RSA_verify_PKCS1_PSS_mgf1(rsa, tbs,
260                                             rctx->md, rctx->mgf1md,
261                                             rctx->tbuf, rctx->saltlen);
262             if (ret <= 0)
263                 return 0;
264             return 1;
265         } else
266             return -1;
267     } else {
268         if (!setup_tbuf(rctx, ctx))
269             return -1;
270         rslen = RSA_public_decrypt(siglen, sig, rctx->tbuf,
271                                    rsa, rctx->pad_mode);
272         if (rslen == 0)
273             return 0;
274     }
275
276     if ((rslen != tbslen) || memcmp(tbs, rctx->tbuf, rslen))
277         return 0;
278
279     return 1;
280
281 }
282
283 static int pkey_rsa_encrypt(EVP_PKEY_CTX *ctx,
284                             unsigned char *out, size_t *outlen,
285                             const unsigned char *in, size_t inlen)
286 {
287     int ret;
288     RSA_PKEY_CTX *rctx = ctx->data;
289
290     if (rctx->pad_mode == RSA_PKCS1_OAEP_PADDING) {
291         int klen = RSA_size(ctx->pkey->pkey.rsa);
292         if (!setup_tbuf(rctx, ctx))
293             return -1;
294         if (!RSA_padding_add_PKCS1_OAEP_mgf1(rctx->tbuf, klen,
295                                              in, inlen,
296                                              rctx->oaep_label,
297                                              rctx->oaep_labellen,
298                                              rctx->md, rctx->mgf1md))
299             return -1;
300         ret = RSA_public_encrypt(klen, rctx->tbuf, out,
301                                  ctx->pkey->pkey.rsa, RSA_NO_PADDING);
302     } else
303         ret = RSA_public_encrypt(inlen, in, out, ctx->pkey->pkey.rsa,
304                                  rctx->pad_mode);
305     if (ret < 0)
306         return ret;
307     *outlen = ret;
308     return 1;
309 }
310
311 static int pkey_rsa_decrypt(EVP_PKEY_CTX *ctx,
312                             unsigned char *out, size_t *outlen,
313                             const unsigned char *in, size_t inlen)
314 {
315     int ret;
316     RSA_PKEY_CTX *rctx = ctx->data;
317
318     if (rctx->pad_mode == RSA_PKCS1_OAEP_PADDING) {
319         int i;
320         if (!setup_tbuf(rctx, ctx))
321             return -1;
322         ret = RSA_private_decrypt(inlen, in, rctx->tbuf,
323                                   ctx->pkey->pkey.rsa, RSA_NO_PADDING);
324         if (ret <= 0)
325             return ret;
326         for (i = 0; i < ret; i++) {
327             if (rctx->tbuf[i])
328                 break;
329         }
330         ret = RSA_padding_check_PKCS1_OAEP_mgf1(out, ret, rctx->tbuf + i,
331                                                 ret - i, ret,
332                                                 rctx->oaep_label,
333                                                 rctx->oaep_labellen,
334                                                 rctx->md, rctx->mgf1md);
335     } else
336         ret = RSA_private_decrypt(inlen, in, out, ctx->pkey->pkey.rsa,
337                                   rctx->pad_mode);
338     if (ret < 0)
339         return ret;
340     *outlen = ret;
341     return 1;
342 }
343
344 static int check_padding_md(const EVP_MD *md, int padding)
345 {
346     int mdnid;
347
348     if (!md)
349         return 1;
350
351     mdnid = EVP_MD_type(md);
352
353     if (padding == RSA_NO_PADDING) {
354         RSAerr(RSA_F_CHECK_PADDING_MD, RSA_R_INVALID_PADDING_MODE);
355         return 0;
356     }
357
358     if (padding == RSA_X931_PADDING) {
359         if (RSA_X931_hash_id(mdnid) == -1) {
360             RSAerr(RSA_F_CHECK_PADDING_MD, RSA_R_INVALID_X931_DIGEST);
361             return 0;
362         }
363     } else {
364         switch(mdnid) {
365         /* List of all supported RSA digests */
366         case NID_sha1:
367         case NID_sha224:
368         case NID_sha256:
369         case NID_sha384:
370         case NID_sha512:
371         case NID_md5:
372         case NID_md5_sha1:
373         case NID_md2:
374         case NID_md4:
375         case NID_mdc2:
376         case NID_ripemd160:
377             return 1;
378
379         default:
380             RSAerr(RSA_F_CHECK_PADDING_MD, RSA_R_INVALID_DIGEST);
381             return 0;
382
383         }
384     }
385
386     return 1;
387 }
388
389 static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
390 {
391     RSA_PKEY_CTX *rctx = ctx->data;
392
393     switch (type) {
394     case EVP_PKEY_CTRL_RSA_PADDING:
395         if ((p1 >= RSA_PKCS1_PADDING) && (p1 <= RSA_PKCS1_PSS_PADDING)) {
396             if (!check_padding_md(rctx->md, p1))
397                 return 0;
398             if (p1 == RSA_PKCS1_PSS_PADDING) {
399                 if (!(ctx->operation &
400                       (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY)))
401                     goto bad_pad;
402                 if (!rctx->md)
403                     rctx->md = EVP_sha1();
404             } else if (pkey_ctx_is_pss(ctx)) {
405                 goto bad_pad;
406             }
407             if (p1 == RSA_PKCS1_OAEP_PADDING) {
408                 if (!(ctx->operation & EVP_PKEY_OP_TYPE_CRYPT))
409                     goto bad_pad;
410                 if (!rctx->md)
411                     rctx->md = EVP_sha1();
412             }
413             rctx->pad_mode = p1;
414             return 1;
415         }
416  bad_pad:
417         RSAerr(RSA_F_PKEY_RSA_CTRL,
418                RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE);
419         return -2;
420
421     case EVP_PKEY_CTRL_GET_RSA_PADDING:
422         *(int *)p2 = rctx->pad_mode;
423         return 1;
424
425     case EVP_PKEY_CTRL_RSA_PSS_SALTLEN:
426     case EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN:
427         if (rctx->pad_mode != RSA_PKCS1_PSS_PADDING) {
428             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PSS_SALTLEN);
429             return -2;
430         }
431         if (type == EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN) {
432             *(int *)p2 = rctx->saltlen;
433         } else {
434             if (p1 < RSA_PSS_SALTLEN_MAX)
435                 return -2;
436             if (rsa_pss_restricted(rctx)) {
437                 if (p1 == RSA_PSS_SALTLEN_AUTO
438                     && ctx->operation == EVP_PKEY_OP_VERIFY) {
439                     RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PSS_SALTLEN);
440                     return -2;
441                 }
442                 if ((p1 == RSA_PSS_SALTLEN_DIGEST
443                      && rctx->min_saltlen > EVP_MD_size(rctx->md))
444                     || (p1 >= 0 && p1 < rctx->min_saltlen)) {
445                     RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_PSS_SALTLEN_TOO_SMALL);
446                     return 0;
447                 }
448             }
449             rctx->saltlen = p1;
450         }
451         return 1;
452
453     case EVP_PKEY_CTRL_RSA_KEYGEN_BITS:
454         if (p1 < 512) {
455             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_KEY_SIZE_TOO_SMALL);
456             return -2;
457         }
458         rctx->nbits = p1;
459         return 1;
460
461     case EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP:
462         if (p2 == NULL || !BN_is_odd((BIGNUM *)p2) || BN_is_one((BIGNUM *)p2)) {
463             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_BAD_E_VALUE);
464             return -2;
465         }
466         BN_free(rctx->pub_exp);
467         rctx->pub_exp = p2;
468         return 1;
469
470     case EVP_PKEY_CTRL_RSA_OAEP_MD:
471     case EVP_PKEY_CTRL_GET_RSA_OAEP_MD:
472         if (rctx->pad_mode != RSA_PKCS1_OAEP_PADDING) {
473             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PADDING_MODE);
474             return -2;
475         }
476         if (type == EVP_PKEY_CTRL_GET_RSA_OAEP_MD)
477             *(const EVP_MD **)p2 = rctx->md;
478         else
479             rctx->md = p2;
480         return 1;
481
482     case EVP_PKEY_CTRL_MD:
483         if (!check_padding_md(p2, rctx->pad_mode))
484             return 0;
485         if (rsa_pss_restricted(rctx)) {
486             if (EVP_MD_type(rctx->md) == EVP_MD_type(p2))
487                 return 1;
488             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_DIGEST_NOT_ALLOWED);
489             return 0;
490         }
491         rctx->md = p2;
492         return 1;
493
494     case EVP_PKEY_CTRL_GET_MD:
495         *(const EVP_MD **)p2 = rctx->md;
496         return 1;
497
498     case EVP_PKEY_CTRL_RSA_MGF1_MD:
499     case EVP_PKEY_CTRL_GET_RSA_MGF1_MD:
500         if (rctx->pad_mode != RSA_PKCS1_PSS_PADDING
501             && rctx->pad_mode != RSA_PKCS1_OAEP_PADDING) {
502             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_MGF1_MD);
503             return -2;
504         }
505         if (type == EVP_PKEY_CTRL_GET_RSA_MGF1_MD) {
506             if (rctx->mgf1md)
507                 *(const EVP_MD **)p2 = rctx->mgf1md;
508             else
509                 *(const EVP_MD **)p2 = rctx->md;
510         } else {
511             if (rsa_pss_restricted(rctx)) {
512                 if (EVP_MD_type(rctx->md) == EVP_MD_type(p2))
513                     return 1;
514                 RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_MGF1_DIGEST_NOT_ALLOWED);
515                 return 0;
516             }
517             rctx->mgf1md = p2;
518         }
519         return 1;
520
521     case EVP_PKEY_CTRL_RSA_OAEP_LABEL:
522         if (rctx->pad_mode != RSA_PKCS1_OAEP_PADDING) {
523             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PADDING_MODE);
524             return -2;
525         }
526         OPENSSL_free(rctx->oaep_label);
527         if (p2 && p1 > 0) {
528             rctx->oaep_label = p2;
529             rctx->oaep_labellen = p1;
530         } else {
531             rctx->oaep_label = NULL;
532             rctx->oaep_labellen = 0;
533         }
534         return 1;
535
536     case EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL:
537         if (rctx->pad_mode != RSA_PKCS1_OAEP_PADDING) {
538             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PADDING_MODE);
539             return -2;
540         }
541         *(unsigned char **)p2 = rctx->oaep_label;
542         return rctx->oaep_labellen;
543
544     case EVP_PKEY_CTRL_DIGESTINIT:
545     case EVP_PKEY_CTRL_PKCS7_SIGN:
546 #ifndef OPENSSL_NO_CMS
547     case EVP_PKEY_CTRL_CMS_SIGN:
548 #endif
549     return 1;
550
551     case EVP_PKEY_CTRL_PKCS7_ENCRYPT:
552     case EVP_PKEY_CTRL_PKCS7_DECRYPT:
553 #ifndef OPENSSL_NO_CMS
554     case EVP_PKEY_CTRL_CMS_DECRYPT:
555     case EVP_PKEY_CTRL_CMS_ENCRYPT:
556 #endif
557     if (!pkey_ctx_is_pss(ctx))
558         return 1;
559     /* fall through */
560     case EVP_PKEY_CTRL_PEER_KEY:
561         RSAerr(RSA_F_PKEY_RSA_CTRL,
562                RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
563         return -2;
564
565     default:
566         return -2;
567
568     }
569 }
570
571 static int pkey_rsa_ctrl_str(EVP_PKEY_CTX *ctx,
572                              const char *type, const char *value)
573 {
574     if (value == NULL) {
575         RSAerr(RSA_F_PKEY_RSA_CTRL_STR, RSA_R_VALUE_MISSING);
576         return 0;
577     }
578     if (strcmp(type, "rsa_padding_mode") == 0) {
579         int pm;
580         if (strcmp(value, "pkcs1") == 0)
581             pm = RSA_PKCS1_PADDING;
582         else if (strcmp(value, "sslv23") == 0)
583             pm = RSA_SSLV23_PADDING;
584         else if (strcmp(value, "none") == 0)
585             pm = RSA_NO_PADDING;
586         else if (strcmp(value, "oeap") == 0)
587             pm = RSA_PKCS1_OAEP_PADDING;
588         else if (strcmp(value, "oaep") == 0)
589             pm = RSA_PKCS1_OAEP_PADDING;
590         else if (strcmp(value, "x931") == 0)
591             pm = RSA_X931_PADDING;
592         else if (strcmp(value, "pss") == 0)
593             pm = RSA_PKCS1_PSS_PADDING;
594         else {
595             RSAerr(RSA_F_PKEY_RSA_CTRL_STR, RSA_R_UNKNOWN_PADDING_TYPE);
596             return -2;
597         }
598         return EVP_PKEY_CTX_set_rsa_padding(ctx, pm);
599     }
600
601     if (strcmp(type, "rsa_pss_saltlen") == 0) {
602         int saltlen;
603         if (!strcmp(value, "digest"))
604             saltlen = RSA_PSS_SALTLEN_DIGEST;
605         else if (!strcmp(value, "max"))
606             saltlen = RSA_PSS_SALTLEN_MAX;
607         else if (!strcmp(value, "auto"))
608             saltlen = RSA_PSS_SALTLEN_AUTO;
609         else
610             saltlen = atoi(value);
611         return EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, saltlen);
612     }
613
614     if (strcmp(type, "rsa_keygen_bits") == 0) {
615         int nbits;
616         nbits = atoi(value);
617         return EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, nbits);
618     }
619
620     if (strcmp(type, "rsa_keygen_pubexp") == 0) {
621         int ret;
622         BIGNUM *pubexp = NULL;
623         if (!BN_asc2bn(&pubexp, value))
624             return 0;
625         ret = EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp);
626         if (ret <= 0)
627             BN_free(pubexp);
628         return ret;
629     }
630
631     if (strcmp(type, "rsa_mgf1_md") == 0)
632         return EVP_PKEY_CTX_md(ctx,
633                                EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT,
634                                EVP_PKEY_CTRL_RSA_MGF1_MD, value);
635
636     if (pkey_ctx_is_pss(ctx)) {
637
638         if (strcmp(type, "rsa_pss_keygen_mgf1_md") == 0)
639             return EVP_PKEY_CTX_md(ctx, EVP_PKEY_OP_KEYGEN,
640                                    EVP_PKEY_CTRL_RSA_MGF1_MD, value);
641
642         if (strcmp(type, "rsa_pss_keygen_md") == 0)
643             return EVP_PKEY_CTX_md(ctx, EVP_PKEY_OP_KEYGEN,
644                                    EVP_PKEY_CTRL_MD, value);
645
646         if (strcmp(type, "rsa_pss_keygen_saltlen") == 0) {
647             int saltlen = atoi(value);
648
649             return EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen(ctx, saltlen);
650         }
651     }
652
653     if (strcmp(type, "rsa_oaep_md") == 0)
654         return EVP_PKEY_CTX_md(ctx, EVP_PKEY_OP_TYPE_CRYPT,
655                                EVP_PKEY_CTRL_RSA_OAEP_MD, value);
656
657     if (strcmp(type, "rsa_oaep_label") == 0) {
658         unsigned char *lab;
659         long lablen;
660         int ret;
661         lab = OPENSSL_hexstr2buf(value, &lablen);
662         if (!lab)
663             return 0;
664         ret = EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, lab, lablen);
665         if (ret <= 0)
666             OPENSSL_free(lab);
667         return ret;
668     }
669
670     return -2;
671 }
672
673 /* Set PSS parameters when generating a key, if necessary */
674 static int rsa_set_pss_param(RSA *rsa, EVP_PKEY_CTX *ctx)
675 {
676     RSA_PKEY_CTX *rctx = ctx->data;
677
678     if (!pkey_ctx_is_pss(ctx))
679         return 1;
680     /* If all parameters are default values don't set pss */
681     if (rctx->md == NULL && rctx->mgf1md == NULL && rctx->saltlen == -2)
682         return 1;
683     rsa->pss = rsa_pss_params_create(rctx->md, rctx->mgf1md,
684                                      rctx->saltlen == -2 ? 0 : rctx->saltlen);
685     if (rsa->pss == NULL)
686         return 0;
687     return 1;
688 }
689
690 static int pkey_rsa_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
691 {
692     RSA *rsa = NULL;
693     RSA_PKEY_CTX *rctx = ctx->data;
694     BN_GENCB *pcb;
695     int ret;
696
697     if (rctx->pub_exp == NULL) {
698         rctx->pub_exp = BN_new();
699         if (rctx->pub_exp == NULL || !BN_set_word(rctx->pub_exp, RSA_F4))
700             return 0;
701     }
702     rsa = RSA_new();
703     if (rsa == NULL)
704         return 0;
705     if (ctx->pkey_gencb) {
706         pcb = BN_GENCB_new();
707         if (pcb == NULL) {
708             RSA_free(rsa);
709             return 0;
710         }
711         evp_pkey_set_cb_translate(pcb, ctx);
712     } else
713         pcb = NULL;
714     ret = RSA_generate_key_ex(rsa, rctx->nbits, rctx->pub_exp, pcb);
715     BN_GENCB_free(pcb);
716     if (ret > 0 && !rsa_set_pss_param(rsa, ctx)) {
717         RSA_free(rsa);
718         return 0;
719     }
720     if (ret > 0)
721         EVP_PKEY_assign(pkey, ctx->pmeth->pkey_id, rsa);
722     else
723         RSA_free(rsa);
724     return ret;
725 }
726
727 const EVP_PKEY_METHOD rsa_pkey_meth = {
728     EVP_PKEY_RSA,
729     EVP_PKEY_FLAG_AUTOARGLEN,
730     pkey_rsa_init,
731     pkey_rsa_copy,
732     pkey_rsa_cleanup,
733
734     0, 0,
735
736     0,
737     pkey_rsa_keygen,
738
739     0,
740     pkey_rsa_sign,
741
742     0,
743     pkey_rsa_verify,
744
745     0,
746     pkey_rsa_verifyrecover,
747
748     0, 0, 0, 0,
749
750     0,
751     pkey_rsa_encrypt,
752
753     0,
754     pkey_rsa_decrypt,
755
756     0, 0,
757
758     pkey_rsa_ctrl,
759     pkey_rsa_ctrl_str
760 };
761
762 /*
763  * Called for PSS sign or verify initialisation: checks PSS parameter
764  * sanity and sets any restrictions on key usage.
765  */
766
767 static int pkey_pss_init(EVP_PKEY_CTX *ctx)
768 {
769     RSA *rsa;
770     RSA_PKEY_CTX *rctx = ctx->data;
771     const EVP_MD *md;
772     const EVP_MD *mgf1md;
773     int min_saltlen, max_saltlen;
774
775     /* Should never happen */
776     if (!pkey_ctx_is_pss(ctx))
777         return 0;
778     rsa = ctx->pkey->pkey.rsa;
779     /* If no restrictions just return */
780     if (rsa->pss == NULL)
781         return 1;
782     /* Get and check parameters */
783     if (!rsa_pss_get_param(rsa->pss, &md, &mgf1md, &min_saltlen))
784         return 0;
785
786     /* See if minumum salt length exceeds maximum possible */
787     max_saltlen = RSA_size(rsa) - EVP_MD_size(md);
788     if ((RSA_bits(rsa) & 0x7) == 1)
789         max_saltlen--;
790     if (min_saltlen > max_saltlen) {
791         RSAerr(RSA_F_PKEY_PSS_INIT, RSA_R_INVALID_SALT_LENGTH);
792         return 0;
793     }
794
795     rctx->min_saltlen = min_saltlen;
796
797     /*
798      * Set PSS restrictions as defaults: we can then block any attempt to
799      * use invalid values in pkey_rsa_ctrl
800      */
801
802     rctx->md = md;
803     rctx->mgf1md = mgf1md;
804     rctx->saltlen = min_saltlen;
805
806     return 1;
807 }
808
809 const EVP_PKEY_METHOD rsa_pss_pkey_meth = {
810     EVP_PKEY_RSA_PSS,
811     EVP_PKEY_FLAG_AUTOARGLEN,
812     pkey_rsa_init,
813     pkey_rsa_copy,
814     pkey_rsa_cleanup,
815
816     0, 0,
817
818     0,
819     pkey_rsa_keygen,
820
821     pkey_pss_init,
822     pkey_rsa_sign,
823
824     pkey_pss_init,
825     pkey_rsa_verify,
826
827     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
828
829     pkey_rsa_ctrl,
830     pkey_rsa_ctrl_str
831 };