This part fixes braces around if-else.
[oweals/openssl.git] / crypto / rsa / rsa_pmeth.c
1 /*
2  * Copyright 2006-2017 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         }
176     } else {
177         ret = RSA_private_encrypt(tbslen, tbs, sig, ctx->pkey->pkey.rsa,
178                                   rctx->pad_mode);
179     }
180     if (ret < 0)
181         return ret;
182     *siglen = ret;
183     return 1;
184 }
185
186 static int pkey_rsa_verifyrecover(EVP_PKEY_CTX *ctx,
187                                   unsigned char *rout, size_t *routlen,
188                                   const unsigned char *sig, size_t siglen)
189 {
190     int ret;
191     RSA_PKEY_CTX *rctx = ctx->data;
192
193     if (rctx->md) {
194         if (rctx->pad_mode == RSA_X931_PADDING) {
195             if (!setup_tbuf(rctx, ctx))
196                 return -1;
197             ret = RSA_public_decrypt(siglen, sig,
198                                      rctx->tbuf, ctx->pkey->pkey.rsa,
199                                      RSA_X931_PADDING);
200             if (ret < 1)
201                 return 0;
202             ret--;
203             if (rctx->tbuf[ret] != RSA_X931_hash_id(EVP_MD_type(rctx->md))) {
204                 RSAerr(RSA_F_PKEY_RSA_VERIFYRECOVER,
205                        RSA_R_ALGORITHM_MISMATCH);
206                 return 0;
207             }
208             if (ret != EVP_MD_size(rctx->md)) {
209                 RSAerr(RSA_F_PKEY_RSA_VERIFYRECOVER,
210                        RSA_R_INVALID_DIGEST_LENGTH);
211                 return 0;
212             }
213             if (rout)
214                 memcpy(rout, rctx->tbuf, ret);
215         } else if (rctx->pad_mode == RSA_PKCS1_PADDING) {
216             size_t sltmp;
217             ret = int_rsa_verify(EVP_MD_type(rctx->md),
218                                  NULL, 0, rout, &sltmp,
219                                  sig, siglen, ctx->pkey->pkey.rsa);
220             if (ret <= 0)
221                 return 0;
222             ret = sltmp;
223         } else {
224             return -1;
225         }
226     } else {
227         ret = RSA_public_decrypt(siglen, sig, rout, ctx->pkey->pkey.rsa,
228                                  rctx->pad_mode);
229     }
230     if (ret < 0)
231         return ret;
232     *routlen = ret;
233     return 1;
234 }
235
236 static int pkey_rsa_verify(EVP_PKEY_CTX *ctx,
237                            const unsigned char *sig, size_t siglen,
238                            const unsigned char *tbs, size_t tbslen)
239 {
240     RSA_PKEY_CTX *rctx = ctx->data;
241     RSA *rsa = ctx->pkey->pkey.rsa;
242     size_t rslen;
243
244     if (rctx->md) {
245         if (rctx->pad_mode == RSA_PKCS1_PADDING)
246             return RSA_verify(EVP_MD_type(rctx->md), tbs, tbslen,
247                               sig, siglen, rsa);
248         if (tbslen != (size_t)EVP_MD_size(rctx->md)) {
249             RSAerr(RSA_F_PKEY_RSA_VERIFY, RSA_R_INVALID_DIGEST_LENGTH);
250             return -1;
251         }
252         if (rctx->pad_mode == RSA_X931_PADDING) {
253             if (pkey_rsa_verifyrecover(ctx, NULL, &rslen, sig, siglen) <= 0)
254                 return 0;
255         } else if (rctx->pad_mode == RSA_PKCS1_PSS_PADDING) {
256             int ret;
257             if (!setup_tbuf(rctx, ctx))
258                 return -1;
259             ret = RSA_public_decrypt(siglen, sig, rctx->tbuf,
260                                      rsa, RSA_NO_PADDING);
261             if (ret <= 0)
262                 return 0;
263             ret = RSA_verify_PKCS1_PSS_mgf1(rsa, tbs,
264                                             rctx->md, rctx->mgf1md,
265                                             rctx->tbuf, rctx->saltlen);
266             if (ret <= 0)
267                 return 0;
268             return 1;
269         } else {
270             return -1;
271         }
272     } else {
273         if (!setup_tbuf(rctx, ctx))
274             return -1;
275         rslen = RSA_public_decrypt(siglen, sig, rctx->tbuf,
276                                    rsa, rctx->pad_mode);
277         if (rslen == 0)
278             return 0;
279     }
280
281     if ((rslen != tbslen) || memcmp(tbs, rctx->tbuf, rslen))
282         return 0;
283
284     return 1;
285
286 }
287
288 static int pkey_rsa_encrypt(EVP_PKEY_CTX *ctx,
289                             unsigned char *out, size_t *outlen,
290                             const unsigned char *in, size_t inlen)
291 {
292     int ret;
293     RSA_PKEY_CTX *rctx = ctx->data;
294
295     if (rctx->pad_mode == RSA_PKCS1_OAEP_PADDING) {
296         int klen = RSA_size(ctx->pkey->pkey.rsa);
297         if (!setup_tbuf(rctx, ctx))
298             return -1;
299         if (!RSA_padding_add_PKCS1_OAEP_mgf1(rctx->tbuf, klen,
300                                              in, inlen,
301                                              rctx->oaep_label,
302                                              rctx->oaep_labellen,
303                                              rctx->md, rctx->mgf1md))
304             return -1;
305         ret = RSA_public_encrypt(klen, rctx->tbuf, out,
306                                  ctx->pkey->pkey.rsa, RSA_NO_PADDING);
307     } else {
308         ret = RSA_public_encrypt(inlen, in, out, ctx->pkey->pkey.rsa,
309                                  rctx->pad_mode);
310     }
311     if (ret < 0)
312         return ret;
313     *outlen = ret;
314     return 1;
315 }
316
317 static int pkey_rsa_decrypt(EVP_PKEY_CTX *ctx,
318                             unsigned char *out, size_t *outlen,
319                             const unsigned char *in, size_t inlen)
320 {
321     int ret;
322     RSA_PKEY_CTX *rctx = ctx->data;
323
324     if (rctx->pad_mode == RSA_PKCS1_OAEP_PADDING) {
325         if (!setup_tbuf(rctx, ctx))
326             return -1;
327         ret = RSA_private_decrypt(inlen, in, rctx->tbuf,
328                                   ctx->pkey->pkey.rsa, RSA_NO_PADDING);
329         if (ret <= 0)
330             return ret;
331         ret = RSA_padding_check_PKCS1_OAEP_mgf1(out, ret, rctx->tbuf,
332                                                 ret, ret,
333                                                 rctx->oaep_label,
334                                                 rctx->oaep_labellen,
335                                                 rctx->md, rctx->mgf1md);
336     } else {
337         ret = RSA_private_decrypt(inlen, in, out, ctx->pkey->pkey.rsa,
338                                   rctx->pad_mode);
339     }
340     if (ret < 0)
341         return ret;
342     *outlen = ret;
343     return 1;
344 }
345
346 static int check_padding_md(const EVP_MD *md, int padding)
347 {
348     int mdnid;
349
350     if (!md)
351         return 1;
352
353     mdnid = EVP_MD_type(md);
354
355     if (padding == RSA_NO_PADDING) {
356         RSAerr(RSA_F_CHECK_PADDING_MD, RSA_R_INVALID_PADDING_MODE);
357         return 0;
358     }
359
360     if (padding == RSA_X931_PADDING) {
361         if (RSA_X931_hash_id(mdnid) == -1) {
362             RSAerr(RSA_F_CHECK_PADDING_MD, RSA_R_INVALID_X931_DIGEST);
363             return 0;
364         }
365     } else {
366         switch(mdnid) {
367         /* List of all supported RSA digests */
368         case NID_sha1:
369         case NID_sha224:
370         case NID_sha256:
371         case NID_sha384:
372         case NID_sha512:
373         case NID_md5:
374         case NID_md5_sha1:
375         case NID_md2:
376         case NID_md4:
377         case NID_mdc2:
378         case NID_ripemd160:
379             return 1;
380
381         default:
382             RSAerr(RSA_F_CHECK_PADDING_MD, RSA_R_INVALID_DIGEST);
383             return 0;
384
385         }
386     }
387
388     return 1;
389 }
390
391 static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
392 {
393     RSA_PKEY_CTX *rctx = ctx->data;
394
395     switch (type) {
396     case EVP_PKEY_CTRL_RSA_PADDING:
397         if ((p1 >= RSA_PKCS1_PADDING) && (p1 <= RSA_PKCS1_PSS_PADDING)) {
398             if (!check_padding_md(rctx->md, p1))
399                 return 0;
400             if (p1 == RSA_PKCS1_PSS_PADDING) {
401                 if (!(ctx->operation &
402                       (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY)))
403                     goto bad_pad;
404                 if (!rctx->md)
405                     rctx->md = EVP_sha1();
406             } else if (pkey_ctx_is_pss(ctx)) {
407                 goto bad_pad;
408             }
409             if (p1 == RSA_PKCS1_OAEP_PADDING) {
410                 if (!(ctx->operation & EVP_PKEY_OP_TYPE_CRYPT))
411                     goto bad_pad;
412                 if (!rctx->md)
413                     rctx->md = EVP_sha1();
414             }
415             rctx->pad_mode = p1;
416             return 1;
417         }
418  bad_pad:
419         RSAerr(RSA_F_PKEY_RSA_CTRL,
420                RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE);
421         return -2;
422
423     case EVP_PKEY_CTRL_GET_RSA_PADDING:
424         *(int *)p2 = rctx->pad_mode;
425         return 1;
426
427     case EVP_PKEY_CTRL_RSA_PSS_SALTLEN:
428     case EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN:
429         if (rctx->pad_mode != RSA_PKCS1_PSS_PADDING) {
430             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PSS_SALTLEN);
431             return -2;
432         }
433         if (type == EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN) {
434             *(int *)p2 = rctx->saltlen;
435         } else {
436             if (p1 < RSA_PSS_SALTLEN_MAX)
437                 return -2;
438             if (rsa_pss_restricted(rctx)) {
439                 if (p1 == RSA_PSS_SALTLEN_AUTO
440                     && ctx->operation == EVP_PKEY_OP_VERIFY) {
441                     RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PSS_SALTLEN);
442                     return -2;
443                 }
444                 if ((p1 == RSA_PSS_SALTLEN_DIGEST
445                      && rctx->min_saltlen > EVP_MD_size(rctx->md))
446                     || (p1 >= 0 && p1 < rctx->min_saltlen)) {
447                     RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_PSS_SALTLEN_TOO_SMALL);
448                     return 0;
449                 }
450             }
451             rctx->saltlen = p1;
452         }
453         return 1;
454
455     case EVP_PKEY_CTRL_RSA_KEYGEN_BITS:
456         if (p1 < 512) {
457             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_KEY_SIZE_TOO_SMALL);
458             return -2;
459         }
460         rctx->nbits = p1;
461         return 1;
462
463     case EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP:
464         if (p2 == NULL || !BN_is_odd((BIGNUM *)p2) || BN_is_one((BIGNUM *)p2)) {
465             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_BAD_E_VALUE);
466             return -2;
467         }
468         BN_free(rctx->pub_exp);
469         rctx->pub_exp = p2;
470         return 1;
471
472     case EVP_PKEY_CTRL_RSA_OAEP_MD:
473     case EVP_PKEY_CTRL_GET_RSA_OAEP_MD:
474         if (rctx->pad_mode != RSA_PKCS1_OAEP_PADDING) {
475             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PADDING_MODE);
476             return -2;
477         }
478         if (type == EVP_PKEY_CTRL_GET_RSA_OAEP_MD)
479             *(const EVP_MD **)p2 = rctx->md;
480         else
481             rctx->md = p2;
482         return 1;
483
484     case EVP_PKEY_CTRL_MD:
485         if (!check_padding_md(p2, rctx->pad_mode))
486             return 0;
487         if (rsa_pss_restricted(rctx)) {
488             if (EVP_MD_type(rctx->md) == EVP_MD_type(p2))
489                 return 1;
490             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_DIGEST_NOT_ALLOWED);
491             return 0;
492         }
493         rctx->md = p2;
494         return 1;
495
496     case EVP_PKEY_CTRL_GET_MD:
497         *(const EVP_MD **)p2 = rctx->md;
498         return 1;
499
500     case EVP_PKEY_CTRL_RSA_MGF1_MD:
501     case EVP_PKEY_CTRL_GET_RSA_MGF1_MD:
502         if (rctx->pad_mode != RSA_PKCS1_PSS_PADDING
503             && rctx->pad_mode != RSA_PKCS1_OAEP_PADDING) {
504             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_MGF1_MD);
505             return -2;
506         }
507         if (type == EVP_PKEY_CTRL_GET_RSA_MGF1_MD) {
508             if (rctx->mgf1md)
509                 *(const EVP_MD **)p2 = rctx->mgf1md;
510             else
511                 *(const EVP_MD **)p2 = rctx->md;
512         } else {
513             if (rsa_pss_restricted(rctx)) {
514                 if (EVP_MD_type(rctx->mgf1md) == EVP_MD_type(p2))
515                     return 1;
516                 RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_MGF1_DIGEST_NOT_ALLOWED);
517                 return 0;
518             }
519             rctx->mgf1md = p2;
520         }
521         return 1;
522
523     case EVP_PKEY_CTRL_RSA_OAEP_LABEL:
524         if (rctx->pad_mode != RSA_PKCS1_OAEP_PADDING) {
525             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PADDING_MODE);
526             return -2;
527         }
528         OPENSSL_free(rctx->oaep_label);
529         if (p2 && p1 > 0) {
530             rctx->oaep_label = p2;
531             rctx->oaep_labellen = p1;
532         } else {
533             rctx->oaep_label = NULL;
534             rctx->oaep_labellen = 0;
535         }
536         return 1;
537
538     case EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL:
539         if (rctx->pad_mode != RSA_PKCS1_OAEP_PADDING) {
540             RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PADDING_MODE);
541             return -2;
542         }
543         *(unsigned char **)p2 = rctx->oaep_label;
544         return rctx->oaep_labellen;
545
546     case EVP_PKEY_CTRL_DIGESTINIT:
547     case EVP_PKEY_CTRL_PKCS7_SIGN:
548 #ifndef OPENSSL_NO_CMS
549     case EVP_PKEY_CTRL_CMS_SIGN:
550 #endif
551     return 1;
552
553     case EVP_PKEY_CTRL_PKCS7_ENCRYPT:
554     case EVP_PKEY_CTRL_PKCS7_DECRYPT:
555 #ifndef OPENSSL_NO_CMS
556     case EVP_PKEY_CTRL_CMS_DECRYPT:
557     case EVP_PKEY_CTRL_CMS_ENCRYPT:
558 #endif
559     if (!pkey_ctx_is_pss(ctx))
560         return 1;
561     /* fall through */
562     case EVP_PKEY_CTRL_PEER_KEY:
563         RSAerr(RSA_F_PKEY_RSA_CTRL,
564                RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
565         return -2;
566
567     default:
568         return -2;
569
570     }
571 }
572
573 static int pkey_rsa_ctrl_str(EVP_PKEY_CTX *ctx,
574                              const char *type, const char *value)
575 {
576     if (value == NULL) {
577         RSAerr(RSA_F_PKEY_RSA_CTRL_STR, RSA_R_VALUE_MISSING);
578         return 0;
579     }
580     if (strcmp(type, "rsa_padding_mode") == 0) {
581         int pm;
582         if (strcmp(value, "pkcs1") == 0) {
583             pm = RSA_PKCS1_PADDING;
584         } else if (strcmp(value, "sslv23") == 0) {
585             pm = RSA_SSLV23_PADDING;
586         } else if (strcmp(value, "none") == 0) {
587             pm = RSA_NO_PADDING;
588         } else if (strcmp(value, "oeap") == 0) {
589             pm = RSA_PKCS1_OAEP_PADDING;
590         } else if (strcmp(value, "oaep") == 0) {
591             pm = RSA_PKCS1_OAEP_PADDING;
592         } else if (strcmp(value, "x931") == 0) {
593             pm = RSA_X931_PADDING;
594         } else if (strcmp(value, "pss") == 0) {
595             pm = RSA_PKCS1_PSS_PADDING;
596         } else {
597             RSAerr(RSA_F_PKEY_RSA_CTRL_STR, RSA_R_UNKNOWN_PADDING_TYPE);
598             return -2;
599         }
600         return EVP_PKEY_CTX_set_rsa_padding(ctx, pm);
601     }
602
603     if (strcmp(type, "rsa_pss_saltlen") == 0) {
604         int saltlen;
605         if (!strcmp(value, "digest"))
606             saltlen = RSA_PSS_SALTLEN_DIGEST;
607         else if (!strcmp(value, "max"))
608             saltlen = RSA_PSS_SALTLEN_MAX;
609         else if (!strcmp(value, "auto"))
610             saltlen = RSA_PSS_SALTLEN_AUTO;
611         else
612             saltlen = atoi(value);
613         return EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, saltlen);
614     }
615
616     if (strcmp(type, "rsa_keygen_bits") == 0) {
617         int nbits;
618         nbits = atoi(value);
619         return EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, nbits);
620     }
621
622     if (strcmp(type, "rsa_keygen_pubexp") == 0) {
623         int ret;
624         BIGNUM *pubexp = NULL;
625         if (!BN_asc2bn(&pubexp, value))
626             return 0;
627         ret = EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp);
628         if (ret <= 0)
629             BN_free(pubexp);
630         return ret;
631     }
632
633     if (strcmp(type, "rsa_mgf1_md") == 0)
634         return EVP_PKEY_CTX_md(ctx,
635                                EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT,
636                                EVP_PKEY_CTRL_RSA_MGF1_MD, value);
637
638     if (pkey_ctx_is_pss(ctx)) {
639
640         if (strcmp(type, "rsa_pss_keygen_mgf1_md") == 0)
641             return EVP_PKEY_CTX_md(ctx, EVP_PKEY_OP_KEYGEN,
642                                    EVP_PKEY_CTRL_RSA_MGF1_MD, value);
643
644         if (strcmp(type, "rsa_pss_keygen_md") == 0)
645             return EVP_PKEY_CTX_md(ctx, EVP_PKEY_OP_KEYGEN,
646                                    EVP_PKEY_CTRL_MD, value);
647
648         if (strcmp(type, "rsa_pss_keygen_saltlen") == 0) {
649             int saltlen = atoi(value);
650
651             return EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen(ctx, saltlen);
652         }
653     }
654
655     if (strcmp(type, "rsa_oaep_md") == 0)
656         return EVP_PKEY_CTX_md(ctx, EVP_PKEY_OP_TYPE_CRYPT,
657                                EVP_PKEY_CTRL_RSA_OAEP_MD, value);
658
659     if (strcmp(type, "rsa_oaep_label") == 0) {
660         unsigned char *lab;
661         long lablen;
662         int ret;
663         lab = OPENSSL_hexstr2buf(value, &lablen);
664         if (!lab)
665             return 0;
666         ret = EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, lab, lablen);
667         if (ret <= 0)
668             OPENSSL_free(lab);
669         return ret;
670     }
671
672     return -2;
673 }
674
675 /* Set PSS parameters when generating a key, if necessary */
676 static int rsa_set_pss_param(RSA *rsa, EVP_PKEY_CTX *ctx)
677 {
678     RSA_PKEY_CTX *rctx = ctx->data;
679
680     if (!pkey_ctx_is_pss(ctx))
681         return 1;
682     /* If all parameters are default values don't set pss */
683     if (rctx->md == NULL && rctx->mgf1md == NULL && rctx->saltlen == -2)
684         return 1;
685     rsa->pss = rsa_pss_params_create(rctx->md, rctx->mgf1md,
686                                      rctx->saltlen == -2 ? 0 : rctx->saltlen);
687     if (rsa->pss == NULL)
688         return 0;
689     return 1;
690 }
691
692 static int pkey_rsa_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
693 {
694     RSA *rsa = NULL;
695     RSA_PKEY_CTX *rctx = ctx->data;
696     BN_GENCB *pcb;
697     int ret;
698
699     if (rctx->pub_exp == NULL) {
700         rctx->pub_exp = BN_new();
701         if (rctx->pub_exp == NULL || !BN_set_word(rctx->pub_exp, RSA_F4))
702             return 0;
703     }
704     rsa = RSA_new();
705     if (rsa == NULL)
706         return 0;
707     if (ctx->pkey_gencb) {
708         pcb = BN_GENCB_new();
709         if (pcb == NULL) {
710             RSA_free(rsa);
711             return 0;
712         }
713         evp_pkey_set_cb_translate(pcb, ctx);
714     } else {
715         pcb = NULL;
716     }
717     ret = RSA_generate_key_ex(rsa, rctx->nbits, rctx->pub_exp, pcb);
718     BN_GENCB_free(pcb);
719     if (ret > 0 && !rsa_set_pss_param(rsa, ctx)) {
720         RSA_free(rsa);
721         return 0;
722     }
723     if (ret > 0)
724         EVP_PKEY_assign(pkey, ctx->pmeth->pkey_id, rsa);
725     else
726         RSA_free(rsa);
727     return ret;
728 }
729
730 const EVP_PKEY_METHOD rsa_pkey_meth = {
731     EVP_PKEY_RSA,
732     EVP_PKEY_FLAG_AUTOARGLEN,
733     pkey_rsa_init,
734     pkey_rsa_copy,
735     pkey_rsa_cleanup,
736
737     0, 0,
738
739     0,
740     pkey_rsa_keygen,
741
742     0,
743     pkey_rsa_sign,
744
745     0,
746     pkey_rsa_verify,
747
748     0,
749     pkey_rsa_verifyrecover,
750
751     0, 0, 0, 0,
752
753     0,
754     pkey_rsa_encrypt,
755
756     0,
757     pkey_rsa_decrypt,
758
759     0, 0,
760
761     pkey_rsa_ctrl,
762     pkey_rsa_ctrl_str
763 };
764
765 /*
766  * Called for PSS sign or verify initialisation: checks PSS parameter
767  * sanity and sets any restrictions on key usage.
768  */
769
770 static int pkey_pss_init(EVP_PKEY_CTX *ctx)
771 {
772     RSA *rsa;
773     RSA_PKEY_CTX *rctx = ctx->data;
774     const EVP_MD *md;
775     const EVP_MD *mgf1md;
776     int min_saltlen, max_saltlen;
777
778     /* Should never happen */
779     if (!pkey_ctx_is_pss(ctx))
780         return 0;
781     rsa = ctx->pkey->pkey.rsa;
782     /* If no restrictions just return */
783     if (rsa->pss == NULL)
784         return 1;
785     /* Get and check parameters */
786     if (!rsa_pss_get_param(rsa->pss, &md, &mgf1md, &min_saltlen))
787         return 0;
788
789     /* See if minumum salt length exceeds maximum possible */
790     max_saltlen = RSA_size(rsa) - EVP_MD_size(md);
791     if ((RSA_bits(rsa) & 0x7) == 1)
792         max_saltlen--;
793     if (min_saltlen > max_saltlen) {
794         RSAerr(RSA_F_PKEY_PSS_INIT, RSA_R_INVALID_SALT_LENGTH);
795         return 0;
796     }
797
798     rctx->min_saltlen = min_saltlen;
799
800     /*
801      * Set PSS restrictions as defaults: we can then block any attempt to
802      * use invalid values in pkey_rsa_ctrl
803      */
804
805     rctx->md = md;
806     rctx->mgf1md = mgf1md;
807     rctx->saltlen = min_saltlen;
808
809     return 1;
810 }
811
812 const EVP_PKEY_METHOD rsa_pss_pkey_meth = {
813     EVP_PKEY_RSA_PSS,
814     EVP_PKEY_FLAG_AUTOARGLEN,
815     pkey_rsa_init,
816     pkey_rsa_copy,
817     pkey_rsa_cleanup,
818
819     0, 0,
820
821     0,
822     pkey_rsa_keygen,
823
824     pkey_pss_init,
825     pkey_rsa_sign,
826
827     pkey_pss_init,
828     pkey_rsa_verify,
829
830     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
831
832     pkey_rsa_ctrl,
833     pkey_rsa_ctrl_str
834 };