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