1 /* $OpenBSD: rsa_ameth.c,v 1.19 2018/08/24 20:22:15 tb 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 		RSAerror(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 		RSAerror(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 		RSAerror(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 		RSAerror(ERR_R_MALLOC_FAILURE);
150 		return 0;
151 	}
152 
153 	return 1;
154 }
155 
156 static int
157 rsa_priv_decode(EVP_PKEY *pkey, const 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 		RSAerror(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 		RSAerror(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 		RSAerror(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 			RSAerror(RSA_R_UNSUPPORTED_MASK_ALGORITHM);
468 			goto err;
469 		}
470 		if (!maskHash) {
471 			RSAerror(RSA_R_UNSUPPORTED_MASK_PARAMETER);
472 			goto err;
473 		}
474 		mgf1md = EVP_get_digestbyobj(maskHash->algorithm);
475 		if (mgf1md == NULL) {
476 			RSAerror(RSA_R_UNKNOWN_MASK_DIGEST);
477 			goto err;
478 		}
479 	} else
480 		mgf1md = EVP_sha1();
481 
482 	if (pss->hashAlgorithm) {
483 		md = EVP_get_digestbyobj(pss->hashAlgorithm->algorithm);
484 		if (md == NULL) {
485 			RSAerror(RSA_R_UNKNOWN_PSS_DIGEST);
486 			goto err;
487 		}
488 	} else
489 		md = EVP_sha1();
490 
491 	if (pss->saltLength) {
492 		saltlen = ASN1_INTEGER_get(pss->saltLength);
493 
494 		/* Could perform more salt length sanity checks but the main
495 		 * RSA routines will trap other invalid values anyway.
496 		 */
497 		if (saltlen < 0) {
498 			RSAerror(RSA_R_INVALID_SALT_LENGTH);
499 			goto err;
500 		}
501 	} else
502 		saltlen = 20;
503 
504 	/* low-level routines support only trailer field 0xbc (value 1)
505 	 * and PKCS#1 says we should reject any other value anyway.
506 	 */
507 	if (pss->trailerField && ASN1_INTEGER_get(pss->trailerField) != 1) {
508 		RSAerror(RSA_R_INVALID_TRAILER);
509 		goto err;
510 	}
511 
512 	/* We have all parameters now set up context */
513 
514 	if (!EVP_DigestVerifyInit(ctx, &pkctx, md, NULL, pkey))
515 		goto err;
516 
517 	if (EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_PKCS1_PSS_PADDING) <= 0)
518 		goto err;
519 
520 	if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkctx, saltlen) <= 0)
521 		goto err;
522 
523 	if (EVP_PKEY_CTX_set_rsa_mgf1_md(pkctx, mgf1md) <= 0)
524 		goto err;
525 	/* Carry on */
526 	rv = 2;
527 
528 err:
529 	RSA_PSS_PARAMS_free(pss);
530 	if (maskHash)
531 		X509_ALGOR_free(maskHash);
532 	return rv;
533 }
534 
535 static int
536 rsa_item_sign(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,
537     X509_ALGOR *alg1, X509_ALGOR *alg2, ASN1_BIT_STRING *sig)
538 {
539 	int pad_mode;
540 	EVP_PKEY_CTX *pkctx = ctx->pctx;
541 
542 	if (EVP_PKEY_CTX_get_rsa_padding(pkctx, &pad_mode) <= 0)
543 		return 0;
544 	if (pad_mode == RSA_PKCS1_PADDING)
545 		return 2;
546 	if (pad_mode == RSA_PKCS1_PSS_PADDING) {
547 		const EVP_MD *sigmd, *mgf1md;
548 		RSA_PSS_PARAMS *pss = NULL;
549 		X509_ALGOR *mgf1alg = NULL;
550 		ASN1_STRING *os1 = NULL, *os2 = NULL;
551 		EVP_PKEY *pk = EVP_PKEY_CTX_get0_pkey(pkctx);
552 		int saltlen, rv = 0;
553 
554 		sigmd = EVP_MD_CTX_md(ctx);
555 		if (EVP_PKEY_CTX_get_rsa_mgf1_md(pkctx, &mgf1md) <= 0)
556 			goto err;
557 		if (!EVP_PKEY_CTX_get_rsa_pss_saltlen(pkctx, &saltlen))
558 			goto err;
559 		if (saltlen == -1)
560 			saltlen = EVP_MD_size(sigmd);
561 		else if (saltlen == -2) {
562 			saltlen = EVP_PKEY_size(pk) - EVP_MD_size(sigmd) - 2;
563 			if (((EVP_PKEY_bits(pk) - 1) & 0x7) == 0)
564 				saltlen--;
565 		}
566 		pss = RSA_PSS_PARAMS_new();
567 		if (!pss)
568 			goto err;
569 		if (saltlen != 20) {
570 			pss->saltLength = ASN1_INTEGER_new();
571 			if (!pss->saltLength)
572 				goto err;
573 			if (!ASN1_INTEGER_set(pss->saltLength, saltlen))
574 				goto err;
575 		}
576 		if (EVP_MD_type(sigmd) != NID_sha1) {
577 			pss->hashAlgorithm = X509_ALGOR_new();
578 			if (!pss->hashAlgorithm)
579 				goto err;
580 			X509_ALGOR_set_md(pss->hashAlgorithm, sigmd);
581 		}
582 		if (EVP_MD_type(mgf1md) != NID_sha1) {
583 			ASN1_STRING *stmp = NULL;
584 			/* need to embed algorithm ID inside another */
585 			mgf1alg = X509_ALGOR_new();
586 			X509_ALGOR_set_md(mgf1alg, mgf1md);
587 			if (!ASN1_item_pack(mgf1alg, &X509_ALGOR_it,
588 			    &stmp))
589 				goto err;
590 			pss->maskGenAlgorithm = X509_ALGOR_new();
591 			if (!pss->maskGenAlgorithm)
592 				goto err;
593 			X509_ALGOR_set0(pss->maskGenAlgorithm,
594 			    OBJ_nid2obj(NID_mgf1), V_ASN1_SEQUENCE, stmp);
595 		}
596 		/* Finally create string with pss parameter encoding. */
597 		if (!ASN1_item_pack(pss, &RSA_PSS_PARAMS_it, &os1))
598 			goto err;
599 		if (alg2) {
600 			os2 = ASN1_STRING_dup(os1);
601 			if (!os2)
602 				goto err;
603 			X509_ALGOR_set0(alg2, OBJ_nid2obj(NID_rsassaPss),
604 			    V_ASN1_SEQUENCE, os2);
605 		}
606 		X509_ALGOR_set0(alg1, OBJ_nid2obj(NID_rsassaPss),
607 		    V_ASN1_SEQUENCE, os1);
608 		os1 = os2 = NULL;
609 		rv = 3;
610 err:
611 		if (mgf1alg)
612 			X509_ALGOR_free(mgf1alg);
613 		if (pss)
614 			RSA_PSS_PARAMS_free(pss);
615 		ASN1_STRING_free(os1);
616 		return rv;
617 	}
618 	return 2;
619 }
620 
621 const EVP_PKEY_ASN1_METHOD rsa_asn1_meths[] = {
622 	{
623 		.pkey_id = EVP_PKEY_RSA,
624 		.pkey_base_id = EVP_PKEY_RSA,
625 		.pkey_flags = ASN1_PKEY_SIGPARAM_NULL,
626 
627 		.pem_str = "RSA",
628 		.info = "OpenSSL RSA method",
629 
630 		.pub_decode = rsa_pub_decode,
631 		.pub_encode = rsa_pub_encode,
632 		.pub_cmp = rsa_pub_cmp,
633 		.pub_print = rsa_pub_print,
634 
635 		.priv_decode = rsa_priv_decode,
636 		.priv_encode = rsa_priv_encode,
637 		.priv_print = rsa_priv_print,
638 
639 		.pkey_size = int_rsa_size,
640 		.pkey_bits = rsa_bits,
641 
642 		.sig_print = rsa_sig_print,
643 
644 		.pkey_free = int_rsa_free,
645 		.pkey_ctrl = rsa_pkey_ctrl,
646 		.old_priv_decode = old_rsa_priv_decode,
647 		.old_priv_encode = old_rsa_priv_encode,
648 		.item_verify = rsa_item_verify,
649 		.item_sign = rsa_item_sign
650 	},
651 
652 	{
653 		.pkey_id = EVP_PKEY_RSA2,
654 		.pkey_base_id = EVP_PKEY_RSA,
655 		.pkey_flags = ASN1_PKEY_ALIAS
656 	}
657 };
658