xref: /openbsd-src/lib/libcrypto/rsa/rsa_asn1.c (revision 3c3cde99435540618e76a54866d3d61c0a62c8f7)
1*3c3cde99Sbeck /* $OpenBSD: rsa_asn1.c,v 1.18 2024/07/08 17:10:18 beck Exp $ */
2e6841c1dSdjm /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3da347917Sbeck  * project 2000.
4da347917Sbeck  */
5da347917Sbeck /* ====================================================================
60a5d6edeSdjm  * Copyright (c) 2000-2005 The OpenSSL Project.  All rights reserved.
7da347917Sbeck  *
8da347917Sbeck  * Redistribution and use in source and binary forms, with or without
9da347917Sbeck  * modification, are permitted provided that the following conditions
10da347917Sbeck  * are met:
11da347917Sbeck  *
12da347917Sbeck  * 1. Redistributions of source code must retain the above copyright
13da347917Sbeck  *    notice, this list of conditions and the following disclaimer.
14da347917Sbeck  *
15da347917Sbeck  * 2. Redistributions in binary form must reproduce the above copyright
16da347917Sbeck  *    notice, this list of conditions and the following disclaimer in
17da347917Sbeck  *    the documentation and/or other materials provided with the
18da347917Sbeck  *    distribution.
19da347917Sbeck  *
20da347917Sbeck  * 3. All advertising materials mentioning features or use of this
21da347917Sbeck  *    software must display the following acknowledgment:
22da347917Sbeck  *    "This product includes software developed by the OpenSSL Project
23da347917Sbeck  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24da347917Sbeck  *
25da347917Sbeck  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26da347917Sbeck  *    endorse or promote products derived from this software without
27da347917Sbeck  *    prior written permission. For written permission, please contact
28da347917Sbeck  *    licensing@OpenSSL.org.
29da347917Sbeck  *
30da347917Sbeck  * 5. Products derived from this software may not be called "OpenSSL"
31da347917Sbeck  *    nor may "OpenSSL" appear in their names without prior written
32da347917Sbeck  *    permission of the OpenSSL Project.
33da347917Sbeck  *
34da347917Sbeck  * 6. Redistributions of any form whatsoever must retain the following
35da347917Sbeck  *    acknowledgment:
36da347917Sbeck  *    "This product includes software developed by the OpenSSL Project
37da347917Sbeck  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38da347917Sbeck  *
39da347917Sbeck  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40da347917Sbeck  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41da347917Sbeck  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42da347917Sbeck  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43da347917Sbeck  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44da347917Sbeck  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45da347917Sbeck  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46da347917Sbeck  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47da347917Sbeck  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48da347917Sbeck  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49da347917Sbeck  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50da347917Sbeck  * OF THE POSSIBILITY OF SUCH DAMAGE.
51da347917Sbeck  * ====================================================================
52da347917Sbeck  *
53da347917Sbeck  * This product includes cryptographic software written by Eric Young
54da347917Sbeck  * (eay@cryptsoft.com).  This product includes software written by Tim
55da347917Sbeck  * Hudson (tjh@cryptsoft.com).
56da347917Sbeck  *
57da347917Sbeck  */
58da347917Sbeck 
59da347917Sbeck #include <stdio.h>
60b6ab114eSjsing 
61b6ab114eSjsing #include <openssl/asn1t.h>
62da347917Sbeck #include <openssl/bn.h>
63da347917Sbeck #include <openssl/rsa.h>
645cdd308eSdjm #include <openssl/x509.h>
65da347917Sbeck 
66c9675a23Stb #include "rsa_local.h"
671af9adfeSjsing 
68da347917Sbeck /* Override the default free and new methods */
6987203b09Smiod static int
rsa_cb(int operation,ASN1_VALUE ** pval,const ASN1_ITEM * it,void * exarg)7087203b09Smiod rsa_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg)
71da347917Sbeck {
72da347917Sbeck 	if (operation == ASN1_OP_NEW_PRE) {
73da347917Sbeck 		*pval = (ASN1_VALUE *)RSA_new();
7487203b09Smiod 		if (*pval)
7587203b09Smiod 			return 2;
76da347917Sbeck 		return 0;
77da347917Sbeck 	} else if (operation == ASN1_OP_FREE_PRE) {
78da347917Sbeck 		RSA_free((RSA *)*pval);
79da347917Sbeck 		*pval = NULL;
80da347917Sbeck 		return 2;
81da347917Sbeck 	}
82da347917Sbeck 	return 1;
83da347917Sbeck }
84da347917Sbeck 
85b8da34fdSjsing static const ASN1_AUX RSAPrivateKey_aux = {
86b8da34fdSjsing 	.app_data = NULL,
87b8da34fdSjsing 	.flags = 0,
88b8da34fdSjsing 	.ref_offset = 0,
89b8da34fdSjsing 	.ref_lock = 0,
90b8da34fdSjsing 	.asn1_cb = rsa_cb,
91b8da34fdSjsing 	.enc_offset = 0,
92b8da34fdSjsing };
93b8da34fdSjsing static const ASN1_TEMPLATE RSAPrivateKey_seq_tt[] = {
94b8da34fdSjsing 	{
95b8da34fdSjsing 		.flags = 0,
96b8da34fdSjsing 		.tag = 0,
97b8da34fdSjsing 		.offset = offsetof(RSA, version),
98b8da34fdSjsing 		.field_name = "version",
99b8da34fdSjsing 		.item = &LONG_it,
100b8da34fdSjsing 	},
101b8da34fdSjsing 	{
102b8da34fdSjsing 		.flags = 0,
103b8da34fdSjsing 		.tag = 0,
104b8da34fdSjsing 		.offset = offsetof(RSA, n),
105b8da34fdSjsing 		.field_name = "n",
106b8da34fdSjsing 		.item = &BIGNUM_it,
107b8da34fdSjsing 	},
108b8da34fdSjsing 	{
109b8da34fdSjsing 		.flags = 0,
110b8da34fdSjsing 		.tag = 0,
111b8da34fdSjsing 		.offset = offsetof(RSA, e),
112b8da34fdSjsing 		.field_name = "e",
113b8da34fdSjsing 		.item = &BIGNUM_it,
114b8da34fdSjsing 	},
115b8da34fdSjsing 	{
116b8da34fdSjsing 		.flags = 0,
117b8da34fdSjsing 		.tag = 0,
118b8da34fdSjsing 		.offset = offsetof(RSA, d),
119b8da34fdSjsing 		.field_name = "d",
120b8da34fdSjsing 		.item = &BIGNUM_it,
121b8da34fdSjsing 	},
122b8da34fdSjsing 	{
123b8da34fdSjsing 		.flags = 0,
124b8da34fdSjsing 		.tag = 0,
125b8da34fdSjsing 		.offset = offsetof(RSA, p),
126b8da34fdSjsing 		.field_name = "p",
127b8da34fdSjsing 		.item = &BIGNUM_it,
128b8da34fdSjsing 	},
129b8da34fdSjsing 	{
130b8da34fdSjsing 		.flags = 0,
131b8da34fdSjsing 		.tag = 0,
132b8da34fdSjsing 		.offset = offsetof(RSA, q),
133b8da34fdSjsing 		.field_name = "q",
134b8da34fdSjsing 		.item = &BIGNUM_it,
135b8da34fdSjsing 	},
136b8da34fdSjsing 	{
137b8da34fdSjsing 		.flags = 0,
138b8da34fdSjsing 		.tag = 0,
139b8da34fdSjsing 		.offset = offsetof(RSA, dmp1),
140b8da34fdSjsing 		.field_name = "dmp1",
141b8da34fdSjsing 		.item = &BIGNUM_it,
142b8da34fdSjsing 	},
143b8da34fdSjsing 	{
144b8da34fdSjsing 		.flags = 0,
145b8da34fdSjsing 		.tag = 0,
146b8da34fdSjsing 		.offset = offsetof(RSA, dmq1),
147b8da34fdSjsing 		.field_name = "dmq1",
148b8da34fdSjsing 		.item = &BIGNUM_it,
149b8da34fdSjsing 	},
150b8da34fdSjsing 	{
151b8da34fdSjsing 		.flags = 0,
152b8da34fdSjsing 		.tag = 0,
153b8da34fdSjsing 		.offset = offsetof(RSA, iqmp),
154b8da34fdSjsing 		.field_name = "iqmp",
155b8da34fdSjsing 		.item = &BIGNUM_it,
156b8da34fdSjsing 	},
157b8da34fdSjsing };
158b8da34fdSjsing 
159b8da34fdSjsing const ASN1_ITEM RSAPrivateKey_it = {
160b8da34fdSjsing 	.itype = ASN1_ITYPE_SEQUENCE,
161b8da34fdSjsing 	.utype = V_ASN1_SEQUENCE,
162b8da34fdSjsing 	.templates = RSAPrivateKey_seq_tt,
163b8da34fdSjsing 	.tcount = sizeof(RSAPrivateKey_seq_tt) / sizeof(ASN1_TEMPLATE),
164b8da34fdSjsing 	.funcs = &RSAPrivateKey_aux,
165b8da34fdSjsing 	.size = sizeof(RSA),
166b8da34fdSjsing 	.sname = "RSA",
167b8da34fdSjsing };
168*3c3cde99Sbeck LCRYPTO_ALIAS(RSAPrivateKey_it);
169da347917Sbeck 
170da347917Sbeck 
171b8da34fdSjsing static const ASN1_AUX RSAPublicKey_aux = {
172b8da34fdSjsing 	.app_data = NULL,
173b8da34fdSjsing 	.flags = 0,
174b8da34fdSjsing 	.ref_offset = 0,
175b8da34fdSjsing 	.ref_lock = 0,
176b8da34fdSjsing 	.asn1_cb = rsa_cb,
177b8da34fdSjsing 	.enc_offset = 0,
178b8da34fdSjsing };
179b8da34fdSjsing static const ASN1_TEMPLATE RSAPublicKey_seq_tt[] = {
180b8da34fdSjsing 	{
181b8da34fdSjsing 		.flags = 0,
182b8da34fdSjsing 		.tag = 0,
183b8da34fdSjsing 		.offset = offsetof(RSA, n),
184b8da34fdSjsing 		.field_name = "n",
185b8da34fdSjsing 		.item = &BIGNUM_it,
186b8da34fdSjsing 	},
187b8da34fdSjsing 	{
188b8da34fdSjsing 		.flags = 0,
189b8da34fdSjsing 		.tag = 0,
190b8da34fdSjsing 		.offset = offsetof(RSA, e),
191b8da34fdSjsing 		.field_name = "e",
192b8da34fdSjsing 		.item = &BIGNUM_it,
193b8da34fdSjsing 	},
194b8da34fdSjsing };
195da347917Sbeck 
196b8da34fdSjsing const ASN1_ITEM RSAPublicKey_it = {
197b8da34fdSjsing 	.itype = ASN1_ITYPE_SEQUENCE,
198b8da34fdSjsing 	.utype = V_ASN1_SEQUENCE,
199b8da34fdSjsing 	.templates = RSAPublicKey_seq_tt,
200b8da34fdSjsing 	.tcount = sizeof(RSAPublicKey_seq_tt) / sizeof(ASN1_TEMPLATE),
201b8da34fdSjsing 	.funcs = &RSAPublicKey_aux,
202b8da34fdSjsing 	.size = sizeof(RSA),
203b8da34fdSjsing 	.sname = "RSA",
204b8da34fdSjsing };
205*3c3cde99Sbeck LCRYPTO_ALIAS(RSAPublicKey_it);
206b8da34fdSjsing 
207d6dbaa65Sjsing static int
rsa_pss_cb(int operation,ASN1_VALUE ** pval,const ASN1_ITEM * it,void * exarg)208d6dbaa65Sjsing rsa_pss_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg)
209d6dbaa65Sjsing {
210d6dbaa65Sjsing 	/* Free up maskHash */
211d6dbaa65Sjsing 	if (operation == ASN1_OP_FREE_PRE) {
212d6dbaa65Sjsing 		RSA_PSS_PARAMS *pss = (RSA_PSS_PARAMS *)*pval;
213d6dbaa65Sjsing 		X509_ALGOR_free(pss->maskHash);
214d6dbaa65Sjsing 	}
215d6dbaa65Sjsing 	return 1;
216d6dbaa65Sjsing }
217d6dbaa65Sjsing 
218d6dbaa65Sjsing static const ASN1_AUX RSA_PSS_PARAMS_aux = {
219d6dbaa65Sjsing 	.app_data = NULL,
220d6dbaa65Sjsing 	.flags = 0,
221d6dbaa65Sjsing 	.ref_offset = 0,
222d6dbaa65Sjsing 	.ref_lock = 0,
223d6dbaa65Sjsing 	.asn1_cb = rsa_pss_cb,
224d6dbaa65Sjsing 	.enc_offset = 0,
225d6dbaa65Sjsing };
226d6dbaa65Sjsing 
227b8da34fdSjsing static const ASN1_TEMPLATE RSA_PSS_PARAMS_seq_tt[] = {
228b8da34fdSjsing 	{
229b8da34fdSjsing 		.flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
230b8da34fdSjsing 		.tag = 0,
231b8da34fdSjsing 		.offset = offsetof(RSA_PSS_PARAMS, hashAlgorithm),
232b8da34fdSjsing 		.field_name = "hashAlgorithm",
233b8da34fdSjsing 		.item = &X509_ALGOR_it,
234b8da34fdSjsing 	},
235b8da34fdSjsing 	{
236b8da34fdSjsing 		.flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
237b8da34fdSjsing 		.tag = 1,
238b8da34fdSjsing 		.offset = offsetof(RSA_PSS_PARAMS, maskGenAlgorithm),
239b8da34fdSjsing 		.field_name = "maskGenAlgorithm",
240b8da34fdSjsing 		.item = &X509_ALGOR_it,
241b8da34fdSjsing 	},
242b8da34fdSjsing 	{
243b8da34fdSjsing 		.flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
244b8da34fdSjsing 		.tag = 2,
245b8da34fdSjsing 		.offset = offsetof(RSA_PSS_PARAMS, saltLength),
246b8da34fdSjsing 		.field_name = "saltLength",
247b8da34fdSjsing 		.item = &ASN1_INTEGER_it,
248b8da34fdSjsing 	},
249b8da34fdSjsing 	{
250b8da34fdSjsing 		.flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
251b8da34fdSjsing 		.tag = 3,
252b8da34fdSjsing 		.offset = offsetof(RSA_PSS_PARAMS, trailerField),
253b8da34fdSjsing 		.field_name = "trailerField",
254b8da34fdSjsing 		.item = &ASN1_INTEGER_it,
255b8da34fdSjsing 	},
256b8da34fdSjsing };
257b8da34fdSjsing 
258b8da34fdSjsing const ASN1_ITEM RSA_PSS_PARAMS_it = {
259b8da34fdSjsing 	.itype = ASN1_ITYPE_SEQUENCE,
260b8da34fdSjsing 	.utype = V_ASN1_SEQUENCE,
261b8da34fdSjsing 	.templates = RSA_PSS_PARAMS_seq_tt,
262b8da34fdSjsing 	.tcount = sizeof(RSA_PSS_PARAMS_seq_tt) / sizeof(ASN1_TEMPLATE),
263d6dbaa65Sjsing 	.funcs = &RSA_PSS_PARAMS_aux,
264b8da34fdSjsing 	.size = sizeof(RSA_PSS_PARAMS),
265b8da34fdSjsing 	.sname = "RSA_PSS_PARAMS",
266b8da34fdSjsing };
267*3c3cde99Sbeck LCRYPTO_ALIAS(RSA_PSS_PARAMS_it);
2685cdd308eSdjm 
269dc83dab0Sjsing RSA_PSS_PARAMS *
d2i_RSA_PSS_PARAMS(RSA_PSS_PARAMS ** a,const unsigned char ** in,long len)270dc83dab0Sjsing d2i_RSA_PSS_PARAMS(RSA_PSS_PARAMS **a, const unsigned char **in, long len)
271dc83dab0Sjsing {
272dc83dab0Sjsing 	return (RSA_PSS_PARAMS *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
273dc83dab0Sjsing 	    &RSA_PSS_PARAMS_it);
274dc83dab0Sjsing }
2751da36015Sbeck LCRYPTO_ALIAS(d2i_RSA_PSS_PARAMS);
276dc83dab0Sjsing 
277dc83dab0Sjsing int
i2d_RSA_PSS_PARAMS(RSA_PSS_PARAMS * a,unsigned char ** out)278dc83dab0Sjsing i2d_RSA_PSS_PARAMS(RSA_PSS_PARAMS *a, unsigned char **out)
279dc83dab0Sjsing {
280dc83dab0Sjsing 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &RSA_PSS_PARAMS_it);
281dc83dab0Sjsing }
2821da36015Sbeck LCRYPTO_ALIAS(i2d_RSA_PSS_PARAMS);
283dc83dab0Sjsing 
284dc83dab0Sjsing RSA_PSS_PARAMS *
RSA_PSS_PARAMS_new(void)285dc83dab0Sjsing RSA_PSS_PARAMS_new(void)
286dc83dab0Sjsing {
287dc83dab0Sjsing 	return (RSA_PSS_PARAMS *)ASN1_item_new(&RSA_PSS_PARAMS_it);
288dc83dab0Sjsing }
2891da36015Sbeck LCRYPTO_ALIAS(RSA_PSS_PARAMS_new);
290dc83dab0Sjsing 
291dc83dab0Sjsing void
RSA_PSS_PARAMS_free(RSA_PSS_PARAMS * a)292dc83dab0Sjsing RSA_PSS_PARAMS_free(RSA_PSS_PARAMS *a)
293dc83dab0Sjsing {
294dc83dab0Sjsing 	ASN1_item_free((ASN1_VALUE *)a, &RSA_PSS_PARAMS_it);
295dc83dab0Sjsing }
2961da36015Sbeck LCRYPTO_ALIAS(RSA_PSS_PARAMS_free);
2975cdd308eSdjm 
2981af9adfeSjsing static int
rsa_oaep_cb(int operation,ASN1_VALUE ** pval,const ASN1_ITEM * it,void * exarg)2991af9adfeSjsing rsa_oaep_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg)
3001af9adfeSjsing {
3011af9adfeSjsing 	/* Free up maskHash */
3021af9adfeSjsing 	if (operation == ASN1_OP_FREE_PRE) {
3031af9adfeSjsing 		RSA_OAEP_PARAMS *oaep = (RSA_OAEP_PARAMS *)*pval;
3041af9adfeSjsing 		X509_ALGOR_free(oaep->maskHash);
3051af9adfeSjsing 	}
3061af9adfeSjsing 	return 1;
3071af9adfeSjsing }
3081af9adfeSjsing 
3091af9adfeSjsing static const ASN1_AUX RSA_OAEP_PARAMS_aux = {
3101af9adfeSjsing 	.app_data = NULL,
3111af9adfeSjsing 	.flags = 0,
3121af9adfeSjsing 	.ref_offset = 0,
3131af9adfeSjsing 	.ref_lock = 0,
3141af9adfeSjsing 	.asn1_cb = rsa_oaep_cb,
3151af9adfeSjsing 	.enc_offset = 0,
3161af9adfeSjsing };
317d6dbaa65Sjsing 
3181af9adfeSjsing static const ASN1_TEMPLATE RSA_OAEP_PARAMS_seq_tt[] = {
3191af9adfeSjsing 	{
3201af9adfeSjsing 		.flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
3211af9adfeSjsing 		.tag = 0,
3221af9adfeSjsing 		.offset = offsetof(RSA_OAEP_PARAMS, hashFunc),
3231af9adfeSjsing 		.field_name = "hashFunc",
3241af9adfeSjsing 		.item = &X509_ALGOR_it,
3251af9adfeSjsing 	},
3261af9adfeSjsing 	{
3271af9adfeSjsing 		.flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
3281af9adfeSjsing 		.tag = 1,
3291af9adfeSjsing 		.offset = offsetof(RSA_OAEP_PARAMS, maskGenFunc),
3301af9adfeSjsing 		.field_name = "maskGenFunc",
3311af9adfeSjsing 		.item = &X509_ALGOR_it,
3321af9adfeSjsing 	},
3331af9adfeSjsing 	{
3341af9adfeSjsing 		.flags = ASN1_TFLG_EXPLICIT | ASN1_TFLG_OPTIONAL,
3351af9adfeSjsing 		.tag = 2,
3361af9adfeSjsing 		.offset = offsetof(RSA_OAEP_PARAMS, pSourceFunc),
3371af9adfeSjsing 		.field_name = "pSourceFunc",
3381af9adfeSjsing 		.item = &X509_ALGOR_it,
3391af9adfeSjsing 	},
3401af9adfeSjsing };
3411af9adfeSjsing 
3421af9adfeSjsing const ASN1_ITEM RSA_OAEP_PARAMS_it = {
3431af9adfeSjsing 	.itype = ASN1_ITYPE_SEQUENCE,
3441af9adfeSjsing 	.utype = V_ASN1_SEQUENCE,
3451af9adfeSjsing 	.templates = RSA_OAEP_PARAMS_seq_tt,
3461af9adfeSjsing 	.tcount = sizeof(RSA_OAEP_PARAMS_seq_tt) / sizeof(ASN1_TEMPLATE),
3471af9adfeSjsing 	.funcs = &RSA_OAEP_PARAMS_aux,
3481af9adfeSjsing 	.size = sizeof(RSA_OAEP_PARAMS),
3491af9adfeSjsing 	.sname = "RSA_OAEP_PARAMS",
3501af9adfeSjsing };
351*3c3cde99Sbeck LCRYPTO_ALIAS(RSA_OAEP_PARAMS_it);
3521af9adfeSjsing 
3531af9adfeSjsing 
3541af9adfeSjsing RSA_OAEP_PARAMS *
d2i_RSA_OAEP_PARAMS(RSA_OAEP_PARAMS ** a,const unsigned char ** in,long len)3551af9adfeSjsing d2i_RSA_OAEP_PARAMS(RSA_OAEP_PARAMS **a, const unsigned char **in, long len)
3561af9adfeSjsing {
3571af9adfeSjsing 	return (RSA_OAEP_PARAMS *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
3581af9adfeSjsing 	    &RSA_OAEP_PARAMS_it);
3591af9adfeSjsing }
3601da36015Sbeck LCRYPTO_ALIAS(d2i_RSA_OAEP_PARAMS);
3611af9adfeSjsing 
3621af9adfeSjsing int
i2d_RSA_OAEP_PARAMS(RSA_OAEP_PARAMS * a,unsigned char ** out)3631af9adfeSjsing i2d_RSA_OAEP_PARAMS(RSA_OAEP_PARAMS *a, unsigned char **out)
3641af9adfeSjsing {
3651af9adfeSjsing 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &RSA_OAEP_PARAMS_it);
3661af9adfeSjsing }
3671da36015Sbeck LCRYPTO_ALIAS(i2d_RSA_OAEP_PARAMS);
3681af9adfeSjsing 
3691af9adfeSjsing RSA_OAEP_PARAMS *
RSA_OAEP_PARAMS_new(void)3701af9adfeSjsing RSA_OAEP_PARAMS_new(void)
3711af9adfeSjsing {
3721af9adfeSjsing 	return (RSA_OAEP_PARAMS *)ASN1_item_new(&RSA_OAEP_PARAMS_it);
3731af9adfeSjsing }
3741da36015Sbeck LCRYPTO_ALIAS(RSA_OAEP_PARAMS_new);
3751af9adfeSjsing 
3761af9adfeSjsing void
RSA_OAEP_PARAMS_free(RSA_OAEP_PARAMS * a)3771af9adfeSjsing RSA_OAEP_PARAMS_free(RSA_OAEP_PARAMS *a)
3781af9adfeSjsing {
3791af9adfeSjsing 	ASN1_item_free((ASN1_VALUE *)a, &RSA_OAEP_PARAMS_it);
3801af9adfeSjsing }
3811da36015Sbeck LCRYPTO_ALIAS(RSA_OAEP_PARAMS_free);
382da347917Sbeck 
383aded6b34Sjsing RSA *
d2i_RSAPrivateKey(RSA ** a,const unsigned char ** in,long len)384aded6b34Sjsing d2i_RSAPrivateKey(RSA **a, const unsigned char **in, long len)
385aded6b34Sjsing {
386aded6b34Sjsing 	return (RSA *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
387aded6b34Sjsing 	    &RSAPrivateKey_it);
388aded6b34Sjsing }
3891da36015Sbeck LCRYPTO_ALIAS(d2i_RSAPrivateKey);
390aded6b34Sjsing 
391aded6b34Sjsing int
i2d_RSAPrivateKey(const RSA * a,unsigned char ** out)392aded6b34Sjsing i2d_RSAPrivateKey(const RSA *a, unsigned char **out)
393aded6b34Sjsing {
394aded6b34Sjsing 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &RSAPrivateKey_it);
395aded6b34Sjsing }
3961da36015Sbeck LCRYPTO_ALIAS(i2d_RSAPrivateKey);
397aded6b34Sjsing 
398aded6b34Sjsing 
399aded6b34Sjsing RSA *
d2i_RSAPublicKey(RSA ** a,const unsigned char ** in,long len)400aded6b34Sjsing d2i_RSAPublicKey(RSA **a, const unsigned char **in, long len)
401aded6b34Sjsing {
402aded6b34Sjsing 	return (RSA *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
403aded6b34Sjsing 	    &RSAPublicKey_it);
404aded6b34Sjsing }
4051da36015Sbeck LCRYPTO_ALIAS(d2i_RSAPublicKey);
406aded6b34Sjsing 
407aded6b34Sjsing int
i2d_RSAPublicKey(const RSA * a,unsigned char ** out)408aded6b34Sjsing i2d_RSAPublicKey(const RSA *a, unsigned char **out)
409aded6b34Sjsing {
410aded6b34Sjsing 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &RSAPublicKey_it);
411aded6b34Sjsing }
4121da36015Sbeck LCRYPTO_ALIAS(i2d_RSAPublicKey);
413da347917Sbeck 
41487203b09Smiod RSA *
RSAPublicKey_dup(RSA * rsa)41587203b09Smiod RSAPublicKey_dup(RSA *rsa)
416da347917Sbeck {
417949fc865Sjsing 	return ASN1_item_dup(&RSAPublicKey_it, rsa);
418da347917Sbeck }
4191da36015Sbeck LCRYPTO_ALIAS(RSAPublicKey_dup);
420da347917Sbeck 
42187203b09Smiod RSA *
RSAPrivateKey_dup(RSA * rsa)42287203b09Smiod RSAPrivateKey_dup(RSA *rsa)
423da347917Sbeck {
424949fc865Sjsing 	return ASN1_item_dup(&RSAPrivateKey_it, rsa);
425da347917Sbeck }
4261da36015Sbeck LCRYPTO_ALIAS(RSAPrivateKey_dup);
427