OpenSSL  1.0.1c
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros
rsa_pmeth.c
Go to the documentation of this file.
1 /* crypto/rsa/rsa_pmeth.c */
2 /* Written by Dr Stephen N Henson ([email protected]) 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
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  * ([email protected]). This product includes software written by Tim
55  * Hudson ([email protected]).
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 #ifndef OPENSSL_NO_CMS
67 #include <openssl/cms.h>
68 #endif
69 #ifdef OPENSSL_FIPS
70 #include <openssl/fips.h>
71 #endif
72 #include "evp_locl.h"
73 #include "rsa_locl.h"
74 
75 /* RSA pkey context structure */
76 
77 typedef struct
78  {
79  /* Key gen parameters */
80  int nbits;
82  /* Keygen callback info */
83  int gentmp[2];
84  /* RSA padding mode */
85  int pad_mode;
86  /* message digest */
87  const EVP_MD *md;
88  /* message digest for MGF1 */
89  const EVP_MD *mgf1md;
90  /* PSS/OAEP salt length */
91  int saltlen;
92  /* Temp buffer */
93  unsigned char *tbuf;
94  } RSA_PKEY_CTX;
95 
96 static int pkey_rsa_init(EVP_PKEY_CTX *ctx)
97  {
98  RSA_PKEY_CTX *rctx;
99  rctx = OPENSSL_malloc(sizeof(RSA_PKEY_CTX));
100  if (!rctx)
101  return 0;
102  rctx->nbits = 1024;
103  rctx->pub_exp = NULL;
104  rctx->pad_mode = RSA_PKCS1_PADDING;
105  rctx->md = NULL;
106  rctx->mgf1md = NULL;
107  rctx->tbuf = NULL;
108 
109  rctx->saltlen = -2;
110 
111  ctx->data = rctx;
112  ctx->keygen_info = rctx->gentmp;
113  ctx->keygen_info_count = 2;
114 
115  return 1;
116  }
117 
118 static int pkey_rsa_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src)
119  {
120  RSA_PKEY_CTX *dctx, *sctx;
121  if (!pkey_rsa_init(dst))
122  return 0;
123  sctx = src->data;
124  dctx = dst->data;
125  dctx->nbits = sctx->nbits;
126  if (sctx->pub_exp)
127  {
128  dctx->pub_exp = BN_dup(sctx->pub_exp);
129  if (!dctx->pub_exp)
130  return 0;
131  }
132  dctx->pad_mode = sctx->pad_mode;
133  dctx->md = sctx->md;
134  return 1;
135  }
136 
137 static int setup_tbuf(RSA_PKEY_CTX *ctx, EVP_PKEY_CTX *pk)
138  {
139  if (ctx->tbuf)
140  return 1;
141  ctx->tbuf = OPENSSL_malloc(EVP_PKEY_size(pk->pkey));
142  if (!ctx->tbuf)
143  return 0;
144  return 1;
145  }
146 
147 static void pkey_rsa_cleanup(EVP_PKEY_CTX *ctx)
148  {
149  RSA_PKEY_CTX *rctx = ctx->data;
150  if (rctx)
151  {
152  if (rctx->pub_exp)
153  BN_free(rctx->pub_exp);
154  if (rctx->tbuf)
155  OPENSSL_free(rctx->tbuf);
156  OPENSSL_free(rctx);
157  }
158  }
159 #ifdef OPENSSL_FIPS
160 /* FIP checker. Return value indicates status of context parameters:
161  * 1 : redirect to FIPS.
162  * 0 : don't redirect to FIPS.
163  * -1 : illegal operation in FIPS mode.
164  */
165 
166 static int pkey_fips_check_ctx(EVP_PKEY_CTX *ctx)
167  {
168  RSA_PKEY_CTX *rctx = ctx->data;
169  RSA *rsa = ctx->pkey->pkey.rsa;
170  int rv = -1;
171  if (!FIPS_mode())
172  return 0;
173  if (rsa->flags & RSA_FLAG_NON_FIPS_ALLOW)
174  rv = 0;
175  if (!(rsa->meth->flags & RSA_FLAG_FIPS_METHOD) && rv)
176  return -1;
177  if (rctx->md && !(rctx->md->flags & EVP_MD_FLAG_FIPS))
178  return rv;
179  if (rctx->mgf1md && !(rctx->mgf1md->flags & EVP_MD_FLAG_FIPS))
180  return rv;
181  return 1;
182  }
183 #endif
184 
185 static int pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
186  const unsigned char *tbs, size_t tbslen)
187  {
188  int ret;
189  RSA_PKEY_CTX *rctx = ctx->data;
190  RSA *rsa = ctx->pkey->pkey.rsa;
191 
192 #ifdef OPENSSL_FIPS
193  ret = pkey_fips_check_ctx(ctx);
194  if (ret < 0)
195  {
197  return -1;
198  }
199 #endif
200 
201  if (rctx->md)
202  {
203  if (tbslen != (size_t)EVP_MD_size(rctx->md))
204  {
207  return -1;
208  }
209 #ifdef OPENSSL_FIPS
210  if (ret > 0)
211  {
212  unsigned int slen;
213  ret = FIPS_rsa_sign_digest(rsa, tbs, tbslen, rctx->md,
214  rctx->pad_mode,
215  rctx->saltlen,
216  rctx->mgf1md,
217  sig, &slen);
218  if (ret > 0)
219  *siglen = slen;
220  else
221  *siglen = 0;
222  return ret;
223  }
224 #endif
225 
226  if (EVP_MD_type(rctx->md) == NID_mdc2)
227  {
228  unsigned int sltmp;
229  if (rctx->pad_mode != RSA_PKCS1_PADDING)
230  return -1;
232  tbs, tbslen, sig, &sltmp, rsa);
233 
234  if (ret <= 0)
235  return ret;
236  ret = sltmp;
237  }
238  else if (rctx->pad_mode == RSA_X931_PADDING)
239  {
240  if (!setup_tbuf(rctx, ctx))
241  return -1;
242  memcpy(rctx->tbuf, tbs, tbslen);
243  rctx->tbuf[tbslen] =
245  ret = RSA_private_encrypt(tbslen + 1, rctx->tbuf,
246  sig, rsa, RSA_X931_PADDING);
247  }
248  else if (rctx->pad_mode == RSA_PKCS1_PADDING)
249  {
250  unsigned int sltmp;
251  ret = RSA_sign(EVP_MD_type(rctx->md),
252  tbs, tbslen, sig, &sltmp, rsa);
253  if (ret <= 0)
254  return ret;
255  ret = sltmp;
256  }
257  else if (rctx->pad_mode == RSA_PKCS1_PSS_PADDING)
258  {
259  if (!setup_tbuf(rctx, ctx))
260  return -1;
262  rctx->tbuf, tbs,
263  rctx->md, rctx->mgf1md,
264  rctx->saltlen))
265  return -1;
266  ret = RSA_private_encrypt(RSA_size(rsa), rctx->tbuf,
267  sig, rsa, RSA_NO_PADDING);
268  }
269  else
270  return -1;
271  }
272  else
273  ret = RSA_private_encrypt(tbslen, tbs, sig, ctx->pkey->pkey.rsa,
274  rctx->pad_mode);
275  if (ret < 0)
276  return ret;
277  *siglen = ret;
278  return 1;
279  }
280 
281 
282 static int pkey_rsa_verifyrecover(EVP_PKEY_CTX *ctx,
283  unsigned char *rout, size_t *routlen,
284  const unsigned char *sig, size_t siglen)
285  {
286  int ret;
287  RSA_PKEY_CTX *rctx = ctx->data;
288 
289  if (rctx->md)
290  {
291  if (rctx->pad_mode == RSA_X931_PADDING)
292  {
293  if (!setup_tbuf(rctx, ctx))
294  return -1;
295  ret = RSA_public_decrypt(siglen, sig,
296  rctx->tbuf, ctx->pkey->pkey.rsa,
298  if (ret < 1)
299  return 0;
300  ret--;
301  if (rctx->tbuf[ret] !=
303  {
306  return 0;
307  }
308  if (ret != EVP_MD_size(rctx->md))
309  {
312  return 0;
313  }
314  if (rout)
315  memcpy(rout, rctx->tbuf, ret);
316  }
317  else if (rctx->pad_mode == RSA_PKCS1_PADDING)
318  {
319  size_t sltmp;
320  ret = int_rsa_verify(EVP_MD_type(rctx->md),
321  NULL, 0, rout, &sltmp,
322  sig, siglen, ctx->pkey->pkey.rsa);
323  if (ret <= 0)
324  return 0;
325  ret = sltmp;
326  }
327  else
328  return -1;
329  }
330  else
331  ret = RSA_public_decrypt(siglen, sig, rout, ctx->pkey->pkey.rsa,
332  rctx->pad_mode);
333  if (ret < 0)
334  return ret;
335  *routlen = ret;
336  return 1;
337  }
338 
339 static int pkey_rsa_verify(EVP_PKEY_CTX *ctx,
340  const unsigned char *sig, size_t siglen,
341  const unsigned char *tbs, size_t tbslen)
342  {
343  RSA_PKEY_CTX *rctx = ctx->data;
344  RSA *rsa = ctx->pkey->pkey.rsa;
345  size_t rslen;
346 #ifdef OPENSSL_FIPS
347  int rv;
348  rv = pkey_fips_check_ctx(ctx);
349  if (rv < 0)
350  {
352  return -1;
353  }
354 #endif
355  if (rctx->md)
356  {
357 #ifdef OPENSSL_FIPS
358  if (rv > 0)
359  {
360  return FIPS_rsa_verify_digest(rsa,
361  tbs, tbslen,
362  rctx->md,
363  rctx->pad_mode,
364  rctx->saltlen,
365  rctx->mgf1md,
366  sig, siglen);
367 
368  }
369 #endif
370  if (rctx->pad_mode == RSA_PKCS1_PADDING)
371  return RSA_verify(EVP_MD_type(rctx->md), tbs, tbslen,
372  sig, siglen, rsa);
373  if (rctx->pad_mode == RSA_X931_PADDING)
374  {
375  if (pkey_rsa_verifyrecover(ctx, NULL, &rslen,
376  sig, siglen) <= 0)
377  return 0;
378  }
379  else if (rctx->pad_mode == RSA_PKCS1_PSS_PADDING)
380  {
381  int ret;
382  if (!setup_tbuf(rctx, ctx))
383  return -1;
384  ret = RSA_public_decrypt(siglen, sig, rctx->tbuf,
385  rsa, RSA_NO_PADDING);
386  if (ret <= 0)
387  return 0;
388  ret = RSA_verify_PKCS1_PSS_mgf1(rsa, tbs,
389  rctx->md, rctx->mgf1md,
390  rctx->tbuf, rctx->saltlen);
391  if (ret <= 0)
392  return 0;
393  return 1;
394  }
395  else
396  return -1;
397  }
398  else
399  {
400  if (!setup_tbuf(rctx, ctx))
401  return -1;
402  rslen = RSA_public_decrypt(siglen, sig, rctx->tbuf,
403  rsa, rctx->pad_mode);
404  if (rslen == 0)
405  return 0;
406  }
407 
408  if ((rslen != tbslen) || memcmp(tbs, rctx->tbuf, rslen))
409  return 0;
410 
411  return 1;
412 
413  }
414 
415 
416 static int pkey_rsa_encrypt(EVP_PKEY_CTX *ctx,
417  unsigned char *out, size_t *outlen,
418  const unsigned char *in, size_t inlen)
419  {
420  int ret;
421  RSA_PKEY_CTX *rctx = ctx->data;
422  ret = RSA_public_encrypt(inlen, in, out, ctx->pkey->pkey.rsa,
423  rctx->pad_mode);
424  if (ret < 0)
425  return ret;
426  *outlen = ret;
427  return 1;
428  }
429 
430 static int pkey_rsa_decrypt(EVP_PKEY_CTX *ctx,
431  unsigned char *out, size_t *outlen,
432  const unsigned char *in, size_t inlen)
433  {
434  int ret;
435  RSA_PKEY_CTX *rctx = ctx->data;
436  ret = RSA_private_decrypt(inlen, in, out, ctx->pkey->pkey.rsa,
437  rctx->pad_mode);
438  if (ret < 0)
439  return ret;
440  *outlen = ret;
441  return 1;
442  }
443 
444 static int check_padding_md(const EVP_MD *md, int padding)
445  {
446  if (!md)
447  return 1;
448 
449  if (padding == RSA_NO_PADDING)
450  {
452  return 0;
453  }
454 
455  if (padding == RSA_X931_PADDING)
456  {
457  if (RSA_X931_hash_id(EVP_MD_type(md)) == -1)
458  {
461  return 0;
462  }
463  return 1;
464  }
465 
466  return 1;
467  }
468 
469 
470 static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
471  {
472  RSA_PKEY_CTX *rctx = ctx->data;
473  switch (type)
474  {
476  if ((p1 >= RSA_PKCS1_PADDING) && (p1 <= RSA_PKCS1_PSS_PADDING))
477  {
478  if (!check_padding_md(rctx->md, p1))
479  return 0;
480  if (p1 == RSA_PKCS1_PSS_PADDING)
481  {
482  if (!(ctx->operation &
484  goto bad_pad;
485  if (!rctx->md)
486  rctx->md = EVP_sha1();
487  }
488  if (p1 == RSA_PKCS1_OAEP_PADDING)
489  {
490  if (!(ctx->operation & EVP_PKEY_OP_TYPE_CRYPT))
491  goto bad_pad;
492  if (!rctx->md)
493  rctx->md = EVP_sha1();
494  }
495  rctx->pad_mode = p1;
496  return 1;
497  }
498  bad_pad:
501  return -2;
502 
504  *(int *)p2 = rctx->pad_mode;
505  return 1;
506 
510  {
512  return -2;
513  }
515  *(int *)p2 = rctx->saltlen;
516  else
517  {
518  if (p1 < -2)
519  return -2;
520  rctx->saltlen = p1;
521  }
522  return 1;
523 
525  if (p1 < 256)
526  {
528  return -2;
529  }
530  rctx->nbits = p1;
531  return 1;
532 
534  if (!p2)
535  return -2;
536  rctx->pub_exp = p2;
537  return 1;
538 
539  case EVP_PKEY_CTRL_MD:
540  if (!check_padding_md(p2, rctx->pad_mode))
541  return 0;
542  rctx->md = p2;
543  return 1;
544 
547  if (rctx->pad_mode != RSA_PKCS1_PSS_PADDING)
548  {
550  return -2;
551  }
552  if (type == EVP_PKEY_CTRL_GET_RSA_MGF1_MD)
553  {
554  if (rctx->mgf1md)
555  *(const EVP_MD **)p2 = rctx->mgf1md;
556  else
557  *(const EVP_MD **)p2 = rctx->md;
558  }
559  else
560  rctx->mgf1md = p2;
561  return 1;
562 
567  return 1;
568 #ifndef OPENSSL_NO_CMS
570  {
571  X509_ALGOR *alg = NULL;
572  ASN1_OBJECT *encalg = NULL;
573  if (p2)
574  CMS_RecipientInfo_ktri_get0_algs(p2, NULL, NULL, &alg);
575  if (alg)
576  X509_ALGOR_get0(&encalg, NULL, NULL, alg);
577  if (encalg && OBJ_obj2nid(encalg) == NID_rsaesOaep)
579  }
582  return 1;
583 #endif
587  return -2;
588 
589  default:
590  return -2;
591 
592  }
593  }
594 
595 static int pkey_rsa_ctrl_str(EVP_PKEY_CTX *ctx,
596  const char *type, const char *value)
597  {
598  if (!value)
599  {
601  return 0;
602  }
603  if (!strcmp(type, "rsa_padding_mode"))
604  {
605  int pm;
606  if (!strcmp(value, "pkcs1"))
607  pm = RSA_PKCS1_PADDING;
608  else if (!strcmp(value, "sslv23"))
609  pm = RSA_SSLV23_PADDING;
610  else if (!strcmp(value, "none"))
611  pm = RSA_NO_PADDING;
612  else if (!strcmp(value, "oeap"))
614  else if (!strcmp(value, "x931"))
615  pm = RSA_X931_PADDING;
616  else if (!strcmp(value, "pss"))
618  else
619  {
622  return -2;
623  }
624  return EVP_PKEY_CTX_set_rsa_padding(ctx, pm);
625  }
626 
627  if (!strcmp(type, "rsa_pss_saltlen"))
628  {
629  int saltlen;
630  saltlen = atoi(value);
631  return EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, saltlen);
632  }
633 
634  if (!strcmp(type, "rsa_keygen_bits"))
635  {
636  int nbits;
637  nbits = atoi(value);
638  return EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, nbits);
639  }
640 
641  if (!strcmp(type, "rsa_keygen_pubexp"))
642  {
643  int ret;
644  BIGNUM *pubexp = NULL;
645  if (!BN_asc2bn(&pubexp, value))
646  return 0;
647  ret = EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp);
648  if (ret <= 0)
649  BN_free(pubexp);
650  return ret;
651  }
652 
653  return -2;
654  }
655 
656 static int pkey_rsa_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
657  {
658  RSA *rsa = NULL;
659  RSA_PKEY_CTX *rctx = ctx->data;
660  BN_GENCB *pcb, cb;
661  int ret;
662  if (!rctx->pub_exp)
663  {
664  rctx->pub_exp = BN_new();
665  if (!rctx->pub_exp || !BN_set_word(rctx->pub_exp, RSA_F4))
666  return 0;
667  }
668  rsa = RSA_new();
669  if (!rsa)
670  return 0;
671  if (ctx->pkey_gencb)
672  {
673  pcb = &cb;
674  evp_pkey_set_cb_translate(pcb, ctx);
675  }
676  else
677  pcb = NULL;
678  ret = RSA_generate_key_ex(rsa, rctx->nbits, rctx->pub_exp, pcb);
679  if (ret > 0)
680  EVP_PKEY_assign_RSA(pkey, rsa);
681  else
682  RSA_free(rsa);
683  return ret;
684  }
685 
687  {
688  EVP_PKEY_RSA,
690  pkey_rsa_init,
691  pkey_rsa_copy,
692  pkey_rsa_cleanup,
693 
694  0,0,
695 
696  0,
697  pkey_rsa_keygen,
698 
699  0,
700  pkey_rsa_sign,
701 
702  0,
703  pkey_rsa_verify,
704 
705  0,
706  pkey_rsa_verifyrecover,
707 
708 
709  0,0,0,0,
710 
711  0,
712  pkey_rsa_encrypt,
713 
714  0,
715  pkey_rsa_decrypt,
716 
717  0,0,
718 
719  pkey_rsa_ctrl,
720  pkey_rsa_ctrl_str
721 
722 
723  };