xref: /openbsd/lib/libcrypto/rsa/rsa_ameth.c (revision fc61954a)
1 /* $OpenBSD: rsa_ameth.c,v 1.16 2016/10/19 16:49:11 jsing Exp $ */
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 
61 #include <openssl/opensslconf.h>
62 
63 #include <openssl/asn1t.h>
64 #include <openssl/bn.h>
65 #include <openssl/err.h>
66 #include <openssl/rsa.h>
67 #include <openssl/x509.h>
68 
69 
70 #include "asn1_locl.h"
71 
72 static int
73 rsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
74 {
75 	unsigned char *penc = NULL;
76 	int penclen;
77 
78 	penclen = i2d_RSAPublicKey(pkey->pkey.rsa, &penc);
79 	if (penclen <= 0)
80 		return 0;
81 	if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(EVP_PKEY_RSA),
82 	    V_ASN1_NULL, NULL, penc, penclen))
83 		return 1;
84 
85 	free(penc);
86 	return 0;
87 }
88 
89 static int
90 rsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)
91 {
92 	const unsigned char *p;
93 	int pklen;
94 	RSA *rsa = NULL;
95 
96 	if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, NULL, pubkey))
97 		return 0;
98 	if (!(rsa = d2i_RSAPublicKey(NULL, &p, pklen))) {
99 		RSAerr(RSA_F_RSA_PUB_DECODE, ERR_R_RSA_LIB);
100 		return 0;
101 	}
102 	EVP_PKEY_assign_RSA (pkey, rsa);
103 	return 1;
104 }
105 
106 static int
107 rsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
108 {
109 	if (BN_cmp(b->pkey.rsa->n, a->pkey.rsa->n) != 0 ||
110 	    BN_cmp(b->pkey.rsa->e, a->pkey.rsa->e) != 0)
111 		return 0;
112 	return 1;
113 }
114 
115 static int
116 old_rsa_priv_decode(EVP_PKEY *pkey, const unsigned char **pder, int derlen)
117 {
118 	RSA *rsa;
119 
120 	if (!(rsa = d2i_RSAPrivateKey (NULL, pder, derlen))) {
121 		RSAerr(RSA_F_OLD_RSA_PRIV_DECODE, ERR_R_RSA_LIB);
122 		return 0;
123 	}
124 	EVP_PKEY_assign_RSA(pkey, rsa);
125 	return 1;
126 }
127 
128 static int
129 old_rsa_priv_encode(const EVP_PKEY *pkey, unsigned char **pder)
130 {
131 	return i2d_RSAPrivateKey(pkey->pkey.rsa, pder);
132 }
133 
134 static int
135 rsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey)
136 {
137 	unsigned char *rk = NULL;
138 	int rklen;
139 
140 	rklen = i2d_RSAPrivateKey(pkey->pkey.rsa, &rk);
141 
142 	if (rklen <= 0) {
143 		RSAerr(RSA_F_RSA_PRIV_ENCODE, ERR_R_MALLOC_FAILURE);
144 		return 0;
145 	}
146 
147 	if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(NID_rsaEncryption), 0,
148 	    V_ASN1_NULL, NULL, rk, rklen)) {
149 		RSAerr(RSA_F_RSA_PRIV_ENCODE, ERR_R_MALLOC_FAILURE);
150 		return 0;
151 	}
152 
153 	return 1;
154 }
155 
156 static int
157 rsa_priv_decode(EVP_PKEY *pkey, PKCS8_PRIV_KEY_INFO *p8)
158 {
159 	const unsigned char *p;
160 	int pklen;
161 
162 	if (!PKCS8_pkey_get0(NULL, &p, &pklen, NULL, p8))
163 		return 0;
164 	return old_rsa_priv_decode(pkey, &p, pklen);
165 }
166 
167 static int
168 int_rsa_size(const EVP_PKEY *pkey)
169 {
170 	return RSA_size(pkey->pkey.rsa);
171 }
172 
173 static int
174 rsa_bits(const EVP_PKEY *pkey)
175 {
176 	return BN_num_bits(pkey->pkey.rsa->n);
177 }
178 
179 static void
180 int_rsa_free(EVP_PKEY *pkey)
181 {
182 	RSA_free(pkey->pkey.rsa);
183 }
184 
185 static void
186 update_buflen(const BIGNUM *b, size_t *pbuflen)
187 {
188 	size_t i;
189 
190 	if (!b)
191 		return;
192 	if (*pbuflen < (i = (size_t)BN_num_bytes(b)))
193 		*pbuflen = i;
194 }
195 
196 static int
197 do_rsa_print(BIO *bp, const RSA *x, int off, int priv)
198 {
199 	char *str;
200 	const char *s;
201 	unsigned char *m = NULL;
202 	int ret = 0, mod_len = 0;
203 	size_t buf_len = 0;
204 
205 	update_buflen(x->n, &buf_len);
206 	update_buflen(x->e, &buf_len);
207 
208 	if (priv) {
209 		update_buflen(x->d, &buf_len);
210 		update_buflen(x->p, &buf_len);
211 		update_buflen(x->q, &buf_len);
212 		update_buflen(x->dmp1, &buf_len);
213 		update_buflen(x->dmq1, &buf_len);
214 		update_buflen(x->iqmp, &buf_len);
215 	}
216 
217 	m = malloc(buf_len + 10);
218 	if (m == NULL) {
219 		RSAerr(RSA_F_DO_RSA_PRINT, ERR_R_MALLOC_FAILURE);
220 		goto err;
221 	}
222 
223 	if (x->n != NULL)
224 		mod_len = BN_num_bits(x->n);
225 
226 	if (!BIO_indent(bp, off, 128))
227 		goto err;
228 
229 	if (priv && x->d) {
230 		if (BIO_printf(bp, "Private-Key: (%d bit)\n", mod_len) <= 0)
231 			goto err;
232 		str = "modulus:";
233 		s = "publicExponent:";
234 	} else {
235 		if (BIO_printf(bp, "Public-Key: (%d bit)\n", mod_len) <= 0)
236 			goto err;
237 		str = "Modulus:";
238 		s= "Exponent:";
239 	}
240 	if (!ASN1_bn_print(bp, str, x->n, m, off))
241 		goto err;
242 	if (!ASN1_bn_print(bp, s, x->e, m, off))
243 		goto err;
244 	if (priv) {
245 		if (!ASN1_bn_print(bp, "privateExponent:", x->d,m, off))
246 			goto err;
247 		if (!ASN1_bn_print(bp, "prime1:", x->p, m, off))
248 			goto err;
249 		if (!ASN1_bn_print(bp, "prime2:", x->q, m, off))
250 			goto err;
251 		if (!ASN1_bn_print(bp, "exponent1:", x->dmp1, m, off))
252 			goto err;
253 		if (!ASN1_bn_print(bp, "exponent2:", x->dmq1, m, off))
254 			goto err;
255 		if (!ASN1_bn_print(bp, "coefficient:", x->iqmp, m, off))
256 			goto err;
257 	}
258 	ret = 1;
259 err:
260 	free(m);
261 	return (ret);
262 }
263 
264 static int
265 rsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent, ASN1_PCTX *ctx)
266 {
267 	return do_rsa_print(bp, pkey->pkey.rsa, indent, 0);
268 }
269 
270 static int
271 rsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent, ASN1_PCTX *ctx)
272 {
273 	return do_rsa_print(bp, pkey->pkey.rsa, indent, 1);
274 }
275 
276 static RSA_PSS_PARAMS *
277 rsa_pss_decode(const X509_ALGOR *alg, X509_ALGOR **pmaskHash)
278 {
279 	const unsigned char *p;
280 	int plen;
281 	RSA_PSS_PARAMS *pss;
282 
283 	*pmaskHash = NULL;
284 
285 	if (!alg->parameter || alg->parameter->type != V_ASN1_SEQUENCE)
286 		return NULL;
287 
288 	p = alg->parameter->value.sequence->data;
289 	plen = alg->parameter->value.sequence->length;
290 	pss = d2i_RSA_PSS_PARAMS(NULL, &p, plen);
291 
292 	if (!pss)
293 		return NULL;
294 
295 	if (pss->maskGenAlgorithm) {
296 		ASN1_TYPE *param = pss->maskGenAlgorithm->parameter;
297 		if (OBJ_obj2nid(pss->maskGenAlgorithm->algorithm) == NID_mgf1 &&
298 		    param && param->type == V_ASN1_SEQUENCE) {
299 			p = param->value.sequence->data;
300 			plen = param->value.sequence->length;
301 			*pmaskHash = d2i_X509_ALGOR(NULL, &p, plen);
302 		}
303 	}
304 
305 	return pss;
306 }
307 
308 static int
309 rsa_pss_param_print(BIO *bp, RSA_PSS_PARAMS *pss, X509_ALGOR *maskHash,
310     int indent)
311 {
312 	int rv = 0;
313 
314 	if (!pss) {
315 		if (BIO_puts(bp, " (INVALID PSS PARAMETERS)\n") <= 0)
316 			return 0;
317 		return 1;
318 	}
319 	if (BIO_puts(bp, "\n") <= 0)
320 		goto err;
321 	if (!BIO_indent(bp, indent, 128))
322 		goto err;
323 	if (BIO_puts(bp, "Hash Algorithm: ") <= 0)
324 		goto err;
325 
326 	if (pss->hashAlgorithm) {
327 		if (i2a_ASN1_OBJECT(bp, pss->hashAlgorithm->algorithm) <= 0)
328 			goto err;
329 	} else if (BIO_puts(bp, "sha1 (default)") <= 0)
330 		goto err;
331 
332 	if (BIO_puts(bp, "\n") <= 0)
333 		goto err;
334 
335 	if (!BIO_indent(bp, indent, 128))
336 		goto err;
337 
338 	if (BIO_puts(bp, "Mask Algorithm: ") <= 0)
339 		goto err;
340 	if (pss->maskGenAlgorithm) {
341 		if (i2a_ASN1_OBJECT(bp, pss->maskGenAlgorithm->algorithm) <= 0)
342 			goto err;
343 		if (BIO_puts(bp, " with ") <= 0)
344 			goto err;
345 		if (maskHash) {
346 			if (i2a_ASN1_OBJECT(bp, maskHash->algorithm) <= 0)
347 				goto err;
348 		} else if (BIO_puts(bp, "INVALID") <= 0)
349 			goto err;
350 	} else if (BIO_puts(bp, "mgf1 with sha1 (default)") <= 0)
351 		goto err;
352 	BIO_puts(bp, "\n");
353 
354 	if (!BIO_indent(bp, indent, 128))
355 		goto err;
356 	if (BIO_puts(bp, "Salt Length: 0x") <= 0)
357 		goto err;
358 	if (pss->saltLength) {
359 		if (i2a_ASN1_INTEGER(bp, pss->saltLength) <= 0)
360 			goto err;
361 	} else if (BIO_puts(bp, "14 (default)") <= 0)
362 		goto err;
363 	BIO_puts(bp, "\n");
364 
365 	if (!BIO_indent(bp, indent, 128))
366 		goto err;
367 	if (BIO_puts(bp, "Trailer Field: 0x") <= 0)
368 		goto err;
369 	if (pss->trailerField) {
370 		if (i2a_ASN1_INTEGER(bp, pss->trailerField) <= 0)
371 			goto err;
372 	} else if (BIO_puts(bp, "BC (default)") <= 0)
373 		goto err;
374 	BIO_puts(bp, "\n");
375 
376 	rv = 1;
377 
378 err:
379 	return rv;
380 }
381 
382 static int
383 rsa_sig_print(BIO *bp, const X509_ALGOR *sigalg, const ASN1_STRING *sig,
384     int indent, ASN1_PCTX *pctx)
385 {
386 	if (OBJ_obj2nid(sigalg->algorithm) == NID_rsassaPss) {
387 		int rv;
388 		RSA_PSS_PARAMS *pss;
389 		X509_ALGOR *maskHash;
390 		pss = rsa_pss_decode(sigalg, &maskHash);
391 		rv = rsa_pss_param_print(bp, pss, maskHash, indent);
392 		if (pss)
393 			RSA_PSS_PARAMS_free(pss);
394 		if (maskHash)
395 			X509_ALGOR_free(maskHash);
396 		if (!rv)
397 			return 0;
398 	} else if (!sig && BIO_puts(bp, "\n") <= 0)
399 		return 0;
400 	if (sig)
401 		return X509_signature_dump(bp, sig, indent);
402 	return 1;
403 }
404 
405 static int
406 rsa_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2)
407 {
408 	X509_ALGOR *alg = NULL;
409 
410 	switch (op) {
411 	case ASN1_PKEY_CTRL_PKCS7_SIGN:
412 		if (arg1 == 0)
413 			PKCS7_SIGNER_INFO_get0_algs(arg2, NULL, NULL, &alg);
414 		break;
415 
416 	case ASN1_PKEY_CTRL_PKCS7_ENCRYPT:
417 		if (arg1 == 0)
418 			PKCS7_RECIP_INFO_get0_alg(arg2, &alg);
419 		break;
420 
421 	case ASN1_PKEY_CTRL_DEFAULT_MD_NID:
422 		*(int *)arg2 = NID_sha1;
423 		return 1;
424 
425 	default:
426 		return -2;
427 	}
428 
429 	if (alg)
430 		X509_ALGOR_set0(alg, OBJ_nid2obj(NID_rsaEncryption),
431 		    V_ASN1_NULL, 0);
432 
433 	return 1;
434 }
435 
436 /* Customised RSA item verification routine. This is called
437  * when a signature is encountered requiring special handling. We
438  * currently only handle PSS.
439  */
440 static int
441 rsa_item_verify(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,
442     X509_ALGOR *sigalg, ASN1_BIT_STRING *sig, EVP_PKEY *pkey)
443 {
444 	int rv = -1;
445 	int saltlen;
446 	const EVP_MD *mgf1md = NULL, *md = NULL;
447 	RSA_PSS_PARAMS *pss;
448 	X509_ALGOR *maskHash;
449 	EVP_PKEY_CTX *pkctx;
450 
451 	/* Sanity check: make sure it is PSS */
452 	if (OBJ_obj2nid(sigalg->algorithm) != NID_rsassaPss) {
453 		RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_UNSUPPORTED_SIGNATURE_TYPE);
454 		return -1;
455 	}
456 
457 	/* Decode PSS parameters */
458 	pss = rsa_pss_decode(sigalg, &maskHash);
459 
460 	if (pss == NULL) {
461 		RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_INVALID_PSS_PARAMETERS);
462 		goto err;
463 	}
464 	/* Check mask and lookup mask hash algorithm */
465 	if (pss->maskGenAlgorithm) {
466 		if (OBJ_obj2nid(pss->maskGenAlgorithm->algorithm) != NID_mgf1) {
467 			RSAerr(RSA_F_RSA_ITEM_VERIFY,
468 			    RSA_R_UNSUPPORTED_MASK_ALGORITHM);
469 			goto err;
470 		}
471 		if (!maskHash) {
472 			RSAerr(RSA_F_RSA_ITEM_VERIFY,
473 			    RSA_R_UNSUPPORTED_MASK_PARAMETER);
474 			goto err;
475 		}
476 		mgf1md = EVP_get_digestbyobj(maskHash->algorithm);
477 		if (mgf1md == NULL) {
478 			RSAerr(RSA_F_RSA_ITEM_VERIFY,
479 			    RSA_R_UNKNOWN_MASK_DIGEST);
480 			goto err;
481 		}
482 	} else
483 		mgf1md = EVP_sha1();
484 
485 	if (pss->hashAlgorithm) {
486 		md = EVP_get_digestbyobj(pss->hashAlgorithm->algorithm);
487 		if (md == NULL) {
488 			RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_UNKNOWN_PSS_DIGEST);
489 			goto err;
490 		}
491 	} else
492 		md = EVP_sha1();
493 
494 	if (pss->saltLength) {
495 		saltlen = ASN1_INTEGER_get(pss->saltLength);
496 
497 		/* Could perform more salt length sanity checks but the main
498 		 * RSA routines will trap other invalid values anyway.
499 		 */
500 		if (saltlen < 0) {
501 			RSAerr(RSA_F_RSA_ITEM_VERIFY,
502 			    RSA_R_INVALID_SALT_LENGTH);
503 			goto err;
504 		}
505 	} else
506 		saltlen = 20;
507 
508 	/* low-level routines support only trailer field 0xbc (value 1)
509 	 * and PKCS#1 says we should reject any other value anyway.
510 	 */
511 	if (pss->trailerField && ASN1_INTEGER_get(pss->trailerField) != 1) {
512 		RSAerr(RSA_F_RSA_ITEM_VERIFY, RSA_R_INVALID_TRAILER);
513 		goto err;
514 	}
515 
516 	/* We have all parameters now set up context */
517 
518 	if (!EVP_DigestVerifyInit(ctx, &pkctx, md, NULL, pkey))
519 		goto err;
520 
521 	if (EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_PKCS1_PSS_PADDING) <= 0)
522 		goto err;
523 
524 	if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkctx, saltlen) <= 0)
525 		goto err;
526 
527 	if (EVP_PKEY_CTX_set_rsa_mgf1_md(pkctx, mgf1md) <= 0)
528 		goto err;
529 	/* Carry on */
530 	rv = 2;
531 
532 err:
533 	RSA_PSS_PARAMS_free(pss);
534 	if (maskHash)
535 		X509_ALGOR_free(maskHash);
536 	return rv;
537 }
538 
539 static int
540 rsa_item_sign(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,
541     X509_ALGOR *alg1, X509_ALGOR *alg2, ASN1_BIT_STRING *sig)
542 {
543 	int pad_mode;
544 	EVP_PKEY_CTX *pkctx = ctx->pctx;
545 
546 	if (EVP_PKEY_CTX_get_rsa_padding(pkctx, &pad_mode) <= 0)
547 		return 0;
548 	if (pad_mode == RSA_PKCS1_PADDING)
549 		return 2;
550 	if (pad_mode == RSA_PKCS1_PSS_PADDING) {
551 		const EVP_MD *sigmd, *mgf1md;
552 		RSA_PSS_PARAMS *pss = NULL;
553 		X509_ALGOR *mgf1alg = NULL;
554 		ASN1_STRING *os1 = NULL, *os2 = NULL;
555 		EVP_PKEY *pk = EVP_PKEY_CTX_get0_pkey(pkctx);
556 		int saltlen, rv = 0;
557 
558 		sigmd = EVP_MD_CTX_md(ctx);
559 		if (EVP_PKEY_CTX_get_rsa_mgf1_md(pkctx, &mgf1md) <= 0)
560 			goto err;
561 		if (!EVP_PKEY_CTX_get_rsa_pss_saltlen(pkctx, &saltlen))
562 			goto err;
563 		if (saltlen == -1)
564 			saltlen = EVP_MD_size(sigmd);
565 		else if (saltlen == -2) {
566 			saltlen = EVP_PKEY_size(pk) - EVP_MD_size(sigmd) - 2;
567 			if (((EVP_PKEY_bits(pk) - 1) & 0x7) == 0)
568 				saltlen--;
569 		}
570 		pss = RSA_PSS_PARAMS_new();
571 		if (!pss)
572 			goto err;
573 		if (saltlen != 20) {
574 			pss->saltLength = ASN1_INTEGER_new();
575 			if (!pss->saltLength)
576 				goto err;
577 			if (!ASN1_INTEGER_set(pss->saltLength, saltlen))
578 				goto err;
579 		}
580 		if (EVP_MD_type(sigmd) != NID_sha1) {
581 			pss->hashAlgorithm = X509_ALGOR_new();
582 			if (!pss->hashAlgorithm)
583 				goto err;
584 			X509_ALGOR_set_md(pss->hashAlgorithm, sigmd);
585 		}
586 		if (EVP_MD_type(mgf1md) != NID_sha1) {
587 			ASN1_STRING *stmp = NULL;
588 			/* need to embed algorithm ID inside another */
589 			mgf1alg = X509_ALGOR_new();
590 			X509_ALGOR_set_md(mgf1alg, mgf1md);
591 			if (!ASN1_item_pack(mgf1alg, ASN1_ITEM_rptr(X509_ALGOR),
592 			    &stmp))
593 				goto err;
594 			pss->maskGenAlgorithm = X509_ALGOR_new();
595 			if (!pss->maskGenAlgorithm)
596 				goto err;
597 			X509_ALGOR_set0(pss->maskGenAlgorithm,
598 			    OBJ_nid2obj(NID_mgf1), V_ASN1_SEQUENCE, stmp);
599 		}
600 		/* Finally create string with pss parameter encoding. */
601 		if (!ASN1_item_pack(pss, ASN1_ITEM_rptr(RSA_PSS_PARAMS), &os1))
602 			goto err;
603 		if (alg2) {
604 			os2 = ASN1_STRING_dup(os1);
605 			if (!os2)
606 				goto err;
607 			X509_ALGOR_set0(alg2, OBJ_nid2obj(NID_rsassaPss),
608 			    V_ASN1_SEQUENCE, os2);
609 		}
610 		X509_ALGOR_set0(alg1, OBJ_nid2obj(NID_rsassaPss),
611 		    V_ASN1_SEQUENCE, os1);
612 		os1 = os2 = NULL;
613 		rv = 3;
614 err:
615 		if (mgf1alg)
616 			X509_ALGOR_free(mgf1alg);
617 		if (pss)
618 			RSA_PSS_PARAMS_free(pss);
619 		ASN1_STRING_free(os1);
620 		return rv;
621 	}
622 	return 2;
623 }
624 
625 const EVP_PKEY_ASN1_METHOD rsa_asn1_meths[] = {
626 	{
627 		.pkey_id = EVP_PKEY_RSA,
628 		.pkey_base_id = EVP_PKEY_RSA,
629 		.pkey_flags = ASN1_PKEY_SIGPARAM_NULL,
630 
631 		.pem_str = "RSA",
632 		.info = "OpenSSL RSA method",
633 
634 		.pub_decode = rsa_pub_decode,
635 		.pub_encode = rsa_pub_encode,
636 		.pub_cmp = rsa_pub_cmp,
637 		.pub_print = rsa_pub_print,
638 
639 		.priv_decode = rsa_priv_decode,
640 		.priv_encode = rsa_priv_encode,
641 		.priv_print = rsa_priv_print,
642 
643 		.pkey_size = int_rsa_size,
644 		.pkey_bits = rsa_bits,
645 
646 		.sig_print = rsa_sig_print,
647 
648 		.pkey_free = int_rsa_free,
649 		.pkey_ctrl = rsa_pkey_ctrl,
650 		.old_priv_decode = old_rsa_priv_decode,
651 		.old_priv_encode = old_rsa_priv_encode,
652 		.item_verify = rsa_item_verify,
653 		.item_sign = rsa_item_sign
654 	},
655 
656 	{
657 		.pkey_id = EVP_PKEY_RSA2,
658 		.pkey_base_id = EVP_PKEY_RSA,
659 		.pkey_flags = ASN1_PKEY_ALIAS
660 	}
661 };
662