xref: /freebsd/crypto/openssl/doc/man3/d2i_RSAPrivateKey.pod (revision 6f1af0d7d2af54b339b5212434cd6d4fda628d80)
1b077aed3SPierre Pronchery=pod
2b077aed3SPierre Pronchery
3b077aed3SPierre Pronchery=begin comment
4b077aed3SPierre Pronchery
5b077aed3SPierre ProncheryAny deprecated keypair/params d2i or i2d functions are collected on this page.
6b077aed3SPierre Pronchery
7b077aed3SPierre Pronchery=end comment
8b077aed3SPierre Pronchery
9b077aed3SPierre Pronchery=head1 NAME
10b077aed3SPierre Pronchery
11b077aed3SPierre Proncheryd2i_DSAPrivateKey,
12b077aed3SPierre Proncheryd2i_DSAPrivateKey_bio,
13b077aed3SPierre Proncheryd2i_DSAPrivateKey_fp,
14b077aed3SPierre Proncheryd2i_DSAPublicKey,
15b077aed3SPierre Proncheryd2i_DSA_PUBKEY,
16b077aed3SPierre Proncheryd2i_DSA_PUBKEY_bio,
17b077aed3SPierre Proncheryd2i_DSA_PUBKEY_fp,
18b077aed3SPierre Proncheryd2i_DSAparams,
19b077aed3SPierre Proncheryd2i_RSAPrivateKey,
20b077aed3SPierre Proncheryd2i_RSAPrivateKey_bio,
21b077aed3SPierre Proncheryd2i_RSAPrivateKey_fp,
22b077aed3SPierre Proncheryd2i_RSAPublicKey,
23b077aed3SPierre Proncheryd2i_RSAPublicKey_bio,
24b077aed3SPierre Proncheryd2i_RSAPublicKey_fp,
25b077aed3SPierre Proncheryd2i_RSA_PUBKEY,
26b077aed3SPierre Proncheryd2i_RSA_PUBKEY_bio,
27b077aed3SPierre Proncheryd2i_RSA_PUBKEY_fp,
28b077aed3SPierre Proncheryd2i_DHparams,
29b077aed3SPierre Proncheryd2i_DHparams_bio,
30b077aed3SPierre Proncheryd2i_DHparams_fp,
31b077aed3SPierre Proncheryd2i_ECParameters,
32b077aed3SPierre Proncheryd2i_ECPrivateKey,
33b077aed3SPierre Proncheryd2i_ECPrivateKey_bio,
34b077aed3SPierre Proncheryd2i_ECPrivateKey_fp,
35b077aed3SPierre Proncheryd2i_EC_PUBKEY,
36b077aed3SPierre Proncheryd2i_EC_PUBKEY_bio,
37b077aed3SPierre Proncheryd2i_EC_PUBKEY_fp,
38b077aed3SPierre Proncheryi2d_RSAPrivateKey,
39b077aed3SPierre Proncheryi2d_RSAPrivateKey_bio,
40b077aed3SPierre Proncheryi2d_RSAPrivateKey_fp,
41b077aed3SPierre Proncheryi2d_RSAPublicKey,
42b077aed3SPierre Proncheryi2d_RSAPublicKey_bio,
43b077aed3SPierre Proncheryi2d_RSAPublicKey_fp,
44b077aed3SPierre Proncheryi2d_RSA_PUBKEY,
45b077aed3SPierre Proncheryi2d_RSA_PUBKEY_bio,
46b077aed3SPierre Proncheryi2d_RSA_PUBKEY_fp,
47b077aed3SPierre Proncheryi2d_DHparams,
48b077aed3SPierre Proncheryi2d_DHparams_bio,
49b077aed3SPierre Proncheryi2d_DHparams_fp,
50b077aed3SPierre Proncheryi2d_DSAPrivateKey,
51b077aed3SPierre Proncheryi2d_DSAPrivateKey_bio,
52b077aed3SPierre Proncheryi2d_DSAPrivateKey_fp,
53b077aed3SPierre Proncheryi2d_DSAPublicKey,
54b077aed3SPierre Proncheryi2d_DSA_PUBKEY,
55b077aed3SPierre Proncheryi2d_DSA_PUBKEY_bio,
56b077aed3SPierre Proncheryi2d_DSA_PUBKEY_fp,
57b077aed3SPierre Proncheryi2d_DSAparams,
58b077aed3SPierre Proncheryi2d_ECParameters,
59b077aed3SPierre Proncheryi2d_ECPrivateKey,
60b077aed3SPierre Proncheryi2d_ECPrivateKey_bio,
61b077aed3SPierre Proncheryi2d_ECPrivateKey_fp,
62b077aed3SPierre Proncheryi2d_EC_PUBKEY,
63b077aed3SPierre Proncheryi2d_EC_PUBKEY_bio,
64b077aed3SPierre Proncheryi2d_EC_PUBKEY_fp
65b077aed3SPierre Pronchery- DEPRECATED
66b077aed3SPierre Pronchery
67b077aed3SPierre Pronchery=head1 SYNOPSIS
68b077aed3SPierre Pronchery
69b077aed3SPierre Pronchery=for openssl generic
70b077aed3SPierre Pronchery
71b077aed3SPierre ProncheryThe following functions have been deprecated since OpenSSL 3.0, and can be
72b077aed3SPierre Proncheryhidden entirely by defining B<OPENSSL_API_COMPAT> with a suitable version value,
73b077aed3SPierre Proncherysee L<openssl_user_macros(7)>:
74b077aed3SPierre Pronchery
75b077aed3SPierre Pronchery TYPE *d2i_TYPEPrivateKey(TYPE **a, const unsigned char **ppin, long length);
76b077aed3SPierre Pronchery TYPE *d2i_TYPEPrivateKey_bio(BIO *bp, TYPE **a);
77b077aed3SPierre Pronchery TYPE *d2i_TYPEPrivateKey_fp(FILE *fp, TYPE **a);
78b077aed3SPierre Pronchery TYPE *d2i_TYPEPublicKey(TYPE **a, const unsigned char **ppin, long length);
79b077aed3SPierre Pronchery TYPE *d2i_TYPEPublicKey_bio(BIO *bp, TYPE **a);
80b077aed3SPierre Pronchery TYPE *d2i_TYPEPublicKey_fp(FILE *fp, TYPE **a);
81b077aed3SPierre Pronchery TYPE *d2i_TYPEparams(TYPE **a, const unsigned char **ppin, long length);
82b077aed3SPierre Pronchery TYPE *d2i_TYPEparams_bio(BIO *bp, TYPE **a);
83b077aed3SPierre Pronchery TYPE *d2i_TYPEparams_fp(FILE *fp, TYPE **a);
84b077aed3SPierre Pronchery TYPE *d2i_TYPE_PUBKEY(TYPE **a, const unsigned char **ppin, long length);
85b077aed3SPierre Pronchery TYPE *d2i_TYPE_PUBKEY_bio(BIO *bp, TYPE **a);
86b077aed3SPierre Pronchery TYPE *d2i_TYPE_PUBKEY_fp(FILE *fp, TYPE **a);
87b077aed3SPierre Pronchery
88b077aed3SPierre Pronchery int i2d_TYPEPrivateKey(const TYPE *a, unsigned char **ppout);
89b077aed3SPierre Pronchery int i2d_TYPEPrivateKey(TYPE *a, unsigned char **ppout);
90b077aed3SPierre Pronchery int i2d_TYPEPrivateKey_fp(FILE *fp, const TYPE *a);
91b077aed3SPierre Pronchery int i2d_TYPEPrivateKey_fp(FILE *fp, TYPE *a);
92b077aed3SPierre Pronchery int i2d_TYPEPrivateKey_bio(BIO *bp, const TYPE *a);
93b077aed3SPierre Pronchery int i2d_TYPEPrivateKey_bio(BIO *bp, TYPE *a);
94b077aed3SPierre Pronchery int i2d_TYPEPublicKey(const TYPE *a, unsigned char **ppout);
95b077aed3SPierre Pronchery int i2d_TYPEPublicKey(TYPE *a, unsigned char **ppout);
96b077aed3SPierre Pronchery int i2d_TYPEPublicKey_fp(FILE *fp, const TYPE *a);
97b077aed3SPierre Pronchery int i2d_TYPEPublicKey_fp(FILE *fp, TYPE *a);
98b077aed3SPierre Pronchery int i2d_TYPEPublicKey_bio(BIO *bp, const TYPE *a);
99b077aed3SPierre Pronchery int i2d_TYPEPublicKey_bio(BIO *bp, TYPE *a);
100b077aed3SPierre Pronchery int i2d_TYPEparams(const TYPE *a, unsigned char **ppout);
101b077aed3SPierre Pronchery int i2d_TYPEparams(TYPE *a, unsigned char **ppout);
102b077aed3SPierre Pronchery int i2d_TYPEparams_fp(FILE *fp, const TYPE *a);
103b077aed3SPierre Pronchery int i2d_TYPEparams_fp(FILE *fp, TYPE *a);
104b077aed3SPierre Pronchery int i2d_TYPEparams_bio(BIO *bp, const TYPE *a);
105b077aed3SPierre Pronchery int i2d_TYPEparams_bio(BIO *bp, TYPE *a);
106b077aed3SPierre Pronchery int i2d_TYPE_PUBKEY(const TYPE *a, unsigned char **ppout);
107b077aed3SPierre Pronchery int i2d_TYPE_PUBKEY(TYPE *a, unsigned char **ppout);
108b077aed3SPierre Pronchery int i2d_TYPE_PUBKEY_fp(FILE *fp, const TYPE *a);
109b077aed3SPierre Pronchery int i2d_TYPE_PUBKEY_fp(FILE *fp, TYPE *a);
110b077aed3SPierre Pronchery int i2d_TYPE_PUBKEY_bio(BIO *bp, const TYPE *a);
111b077aed3SPierre Pronchery int i2d_TYPE_PUBKEY_bio(BIO *bp, TYPE *a);
112b077aed3SPierre Pronchery
113b077aed3SPierre Pronchery=head1 DESCRIPTION
114b077aed3SPierre Pronchery
115b077aed3SPierre ProncheryAll functions described here are deprecated.  Please use L<OSSL_DECODER(3)>
116b077aed3SPierre Proncheryinstead of the B<d2i> functions and L<OSSL_ENCODER(3)> instead of the B<i2d>
117b077aed3SPierre Proncheryfunctions.  See L</Migration> below.
118b077aed3SPierre Pronchery
119b077aed3SPierre ProncheryIn the description here, B<I<TYPE>> is used a placeholder for any of the
120b077aed3SPierre ProncheryOpenSSL datatypes, such as B<RSA>.
121b077aed3SPierre ProncheryThe function parameters I<ppin> and I<ppout> are generally either both named
122b077aed3SPierre ProncheryI<pp> in the headers, or I<in> and I<out>.
123b077aed3SPierre Pronchery
124b077aed3SPierre ProncheryAll the functions here behave the way that's described in L<d2i_X509(3)>.
125b077aed3SPierre Pronchery
126b077aed3SPierre ProncheryPlease note that not all functions in the synopsis are available for all key
127b077aed3SPierre Proncherytypes.  For example, there are no d2i_RSAparams() or i2d_RSAparams(),
128b077aed3SPierre Proncherybecause the PKCS#1 B<RSA> structure doesn't include any key parameters.
129b077aed3SPierre Pronchery
130b077aed3SPierre ProncheryB<d2i_I<TYPE>PrivateKey>() and derivates thereof decode DER encoded
131b077aed3SPierre ProncheryB<I<TYPE>> private key data organized in a type specific structure.
132b077aed3SPierre Pronchery
133b077aed3SPierre ProncheryB<d2i_I<TYPE>PublicKey>() and derivates thereof decode DER encoded
134b077aed3SPierre ProncheryB<I<TYPE>> public key data organized in a type specific structure.
135b077aed3SPierre Pronchery
136b077aed3SPierre ProncheryB<d2i_I<TYPE>params>() and derivates thereof decode DER encoded B<I<TYPE>>
137b077aed3SPierre Proncherykey parameters organized in a type specific structure.
138b077aed3SPierre Pronchery
139b077aed3SPierre ProncheryB<d2i_I<TYPE>_PUBKEY>() and derivates thereof decode DER encoded B<I<TYPE>>
140b077aed3SPierre Proncherypublic key data organized in a B<SubjectPublicKeyInfo> structure.
141b077aed3SPierre Pronchery
142b077aed3SPierre ProncheryB<i2d_I<TYPE>PrivateKey>() and derivates thereof encode the private key
143b077aed3SPierre ProncheryB<I<TYPE>> data into a type specific DER encoded structure.
144b077aed3SPierre Pronchery
145b077aed3SPierre ProncheryB<i2d_I<TYPE>PublicKey>() and derivates thereof encode the public key
146b077aed3SPierre ProncheryB<I<TYPE>> data into a type specific DER encoded structure.
147b077aed3SPierre Pronchery
148b077aed3SPierre ProncheryB<i2d_I<TYPE>params>() and derivates thereof encode the B<I<TYPE>> key
149b077aed3SPierre Proncheryparameters data into a type specific DER encoded structure.
150b077aed3SPierre Pronchery
151b077aed3SPierre ProncheryB<i2d_I<TYPE>_PUBKEY>() and derivates thereof encode the public key
152b077aed3SPierre ProncheryB<I<TYPE>> data into a DER encoded B<SubjectPublicKeyInfo> structure.
153b077aed3SPierre Pronchery
154b077aed3SPierre ProncheryFor example, d2i_RSAPrivateKey() and d2i_RSAPublicKey() expects the
155b077aed3SPierre Proncherystructure defined by PKCS#1.
156b077aed3SPierre ProncherySimilarly, i2d_RSAPrivateKey() and  i2d_RSAPublicKey() produce DER encoded
157b077aed3SPierre Proncherystring organized according to PKCS#1.
158b077aed3SPierre Pronchery
159b077aed3SPierre Pronchery=head2 Migration
160b077aed3SPierre Pronchery
161b077aed3SPierre ProncheryMigration from the diverse B<I<TYPE>>s requires using corresponding new
162b077aed3SPierre ProncheryOpenSSL types.  For all B<I<TYPE>>s described here, the corresponding new
163b077aed3SPierre Proncherytype is B<EVP_PKEY>.  The rest of this section assumes that this has been
164b077aed3SPierre Proncherydone, exactly how to do that is described elsewhere.
165b077aed3SPierre Pronchery
166b077aed3SPierre ProncheryThere are two migration paths:
167b077aed3SPierre Pronchery
168b077aed3SPierre Pronchery=over 4
169b077aed3SPierre Pronchery
170b077aed3SPierre Pronchery=item *
171b077aed3SPierre Pronchery
172b077aed3SPierre ProncheryReplace
173b077aed3SPierre Proncheryb<d2i_I<TYPE>PrivateKey()> with L<d2i_PrivateKey(3)>,
174b077aed3SPierre Proncheryb<d2i_I<TYPE>PublicKey()> with L<d2i_PublicKey(3)>,
175b077aed3SPierre Proncheryb<d2i_I<TYPE>params()> with L<d2i_KeyParams(3)>,
176b077aed3SPierre Proncheryb<d2i_I<TYPE>_PUBKEY()> with L<d2i_PUBKEY(3)>,
177b077aed3SPierre Proncheryb<i2d_I<TYPE>PrivateKey()> with L<i2d_PrivateKey(3)>,
178b077aed3SPierre Proncheryb<i2d_I<TYPE>PublicKey()> with L<i2d_PublicKey(3)>,
179b077aed3SPierre Proncheryb<i2d_I<TYPE>params()> with L<i2d_KeyParams(3)>,
180b077aed3SPierre Proncheryb<i2d_I<TYPE>_PUBKEY()> with L<i2d_PUBKEY(3)>.
181b077aed3SPierre ProncheryA caveat is that L<i2d_PrivateKey(3)> may output a DER encoded PKCS#8
182b077aed3SPierre Proncheryoutermost structure instead of the type specific structure, and that
183b077aed3SPierre ProncheryL<d2i_PrivateKey(3)> recognises and unpacks a PKCS#8 structures.
184b077aed3SPierre Pronchery
185b077aed3SPierre Pronchery=item *
186b077aed3SPierre Pronchery
187b077aed3SPierre ProncheryUse L<OSSL_DECODER(3)> and L<OSSL_ENCODER(3)>.  How to migrate is described
188b077aed3SPierre Proncherybelow.  All those descriptions assume that the key to be encoded is in the
189b077aed3SPierre Proncheryvariable I<pkey>.
190b077aed3SPierre Pronchery
191b077aed3SPierre Pronchery=back
192b077aed3SPierre Pronchery
193b077aed3SPierre Pronchery=head3 Migrating B<i2d> functions to B<OSSL_ENCODER>
194b077aed3SPierre Pronchery
195b077aed3SPierre ProncheryThe exact L<OSSL_ENCODER(3)> output is driven by arguments rather than by
196b077aed3SPierre Proncheryfunction names.  The sample code to get DER encoded output in a type
197b077aed3SPierre Proncheryspecific structure is uniform, the only things that vary are the selection
198b077aed3SPierre Proncheryof what part of the B<EVP_PKEY> should be output, and the structure.  The
199b077aed3SPierre ProncheryB<i2d> functions names can therefore be translated into two variables,
200b077aed3SPierre ProncheryI<selection> and I<structure> as follows:
201b077aed3SPierre Pronchery
202b077aed3SPierre Pronchery=over 4
203b077aed3SPierre Pronchery
204b077aed3SPierre Pronchery=item B<i2d_I<TYPE>PrivateKey>() translates into:
205b077aed3SPierre Pronchery
206*6f1af0d7SPierre Pronchery int selection = EVP_PKEY_KEYPAIR;
207b077aed3SPierre Pronchery const char *structure = "type-specific";
208b077aed3SPierre Pronchery
209b077aed3SPierre Pronchery=item B<i2d_I<TYPE>PublicKey>() translates into:
210b077aed3SPierre Pronchery
211b077aed3SPierre Pronchery int selection = EVP_PKEY_PUBLIC_KEY;
212b077aed3SPierre Pronchery const char *structure = "type-specific";
213b077aed3SPierre Pronchery
214b077aed3SPierre Pronchery=item B<i2d_I<TYPE>params>() translates into:
215b077aed3SPierre Pronchery
216b077aed3SPierre Pronchery int selection = EVP_PKEY_PARAMETERS;
217b077aed3SPierre Pronchery const char *structure = "type-specific";
218b077aed3SPierre Pronchery
219b077aed3SPierre Pronchery=item B<i2d_I<TYPE>_PUBKEY>() translates into:
220b077aed3SPierre Pronchery
221b077aed3SPierre Pronchery int selection = EVP_PKEY_PUBLIC_KEY;
222b077aed3SPierre Pronchery const char *structure = "SubjectPublicKeyInfo";
223b077aed3SPierre Pronchery
224b077aed3SPierre Pronchery=back
225b077aed3SPierre Pronchery
226b077aed3SPierre ProncheryThe following sample code does the rest of the work:
227b077aed3SPierre Pronchery
228b077aed3SPierre Pronchery unsigned char *p = buffer;     /* |buffer| is supplied by the caller */
229b077aed3SPierre Pronchery size_t len = buffer_size;      /* assumed be the size of |buffer| */
230b077aed3SPierre Pronchery OSSL_ENCODER_CTX *ctx =
231b077aed3SPierre Pronchery     OSSL_ENCODER_CTX_new_for_pkey(pkey, selection, "DER", structure,
232b077aed3SPierre Pronchery                                   NULL, NULL);
233b077aed3SPierre Pronchery if (ctx == NULL) {
234b077aed3SPierre Pronchery     /* fatal error handling */
235b077aed3SPierre Pronchery }
236b077aed3SPierre Pronchery if (OSSL_ENCODER_CTX_get_num_encoders(ctx) == 0) {
237b077aed3SPierre Pronchery     OSSL_ENCODER_CTX_free(ctx);
238b077aed3SPierre Pronchery     /* non-fatal error handling */
239b077aed3SPierre Pronchery }
240b077aed3SPierre Pronchery if (!OSSL_ENCODER_to_data(ctx, &p, &len)) {
241b077aed3SPierre Pronchery     OSSL_ENCODER_CTX_free(ctx);
242b077aed3SPierre Pronchery     /* error handling */
243b077aed3SPierre Pronchery }
244b077aed3SPierre Pronchery OSSL_ENCODER_CTX_free(ctx);
245b077aed3SPierre Pronchery
246b077aed3SPierre Pronchery=for comment TODO: a similar section on OSSL_DECODER is to be added
247b077aed3SPierre Pronchery
248b077aed3SPierre Pronchery=head1 NOTES
249b077aed3SPierre Pronchery
250b077aed3SPierre ProncheryThe letters B<i> and B<d> in B<i2d_I<TYPE>>() stand for
251b077aed3SPierre Pronchery"internal" (that is, an internal C structure) and "DER" respectively.
252b077aed3SPierre ProncherySo B<i2d_I<TYPE>>() converts from internal to DER.
253b077aed3SPierre Pronchery
254b077aed3SPierre ProncheryThe functions can also understand B<BER> forms.
255b077aed3SPierre Pronchery
256b077aed3SPierre ProncheryThe actual TYPE structure passed to B<i2d_I<TYPE>>() must be a valid
257b077aed3SPierre Proncherypopulated B<I<TYPE>> structure -- it B<cannot> simply be fed with an
258b077aed3SPierre Proncheryempty structure such as that returned by TYPE_new().
259b077aed3SPierre Pronchery
260b077aed3SPierre ProncheryThe encoded data is in binary form and may contain embedded zeros.
261b077aed3SPierre ProncheryTherefore, any FILE pointers or BIOs should be opened in binary mode.
262b077aed3SPierre ProncheryFunctions such as strlen() will B<not> return the correct length
263b077aed3SPierre Proncheryof the encoded structure.
264b077aed3SPierre Pronchery
265b077aed3SPierre ProncheryThe ways that I<*ppin> and I<*ppout> are incremented after the operation
266b077aed3SPierre Proncherycan trap the unwary. See the B<WARNINGS> section in L<d2i_X509(3)> for some
267b077aed3SPierre Proncherycommon errors.
268b077aed3SPierre ProncheryThe reason for this-auto increment behaviour is to reflect a typical
269b077aed3SPierre Proncheryusage of ASN1 functions: after one structure is encoded or decoded
270b077aed3SPierre Proncheryanother will be processed after it.
271b077aed3SPierre Pronchery
272b077aed3SPierre ProncheryThe following points about the data types might be useful:
273b077aed3SPierre Pronchery
274b077aed3SPierre Pronchery=over 4
275b077aed3SPierre Pronchery
276b077aed3SPierre Pronchery=item B<DSA_PUBKEY>
277b077aed3SPierre Pronchery
278b077aed3SPierre ProncheryRepresents a DSA public key using a B<SubjectPublicKeyInfo> structure.
279b077aed3SPierre Pronchery
280b077aed3SPierre Pronchery=item B<DSAPublicKey>, B<DSAPrivateKey>
281b077aed3SPierre Pronchery
282b077aed3SPierre ProncheryUse a non-standard OpenSSL format and should be avoided; use B<DSA_PUBKEY>,
283b077aed3SPierre ProncheryL<PEM_write_PrivateKey(3)>, or similar instead.
284b077aed3SPierre Pronchery
285b077aed3SPierre Pronchery=back
286b077aed3SPierre Pronchery
287b077aed3SPierre Pronchery=head1 RETURN VALUES
288b077aed3SPierre Pronchery
289b077aed3SPierre ProncheryB<d2i_I<TYPE>>(), B<d2i_I<TYPE>_bio>() and B<d2i_I<TYPE>_fp>() return a valid
290b077aed3SPierre ProncheryB<I<TYPE>> structure or NULL if an error occurs.  If the "reuse" capability has
291b077aed3SPierre Proncherybeen used with a valid structure being passed in via I<a>, then the object is
292b077aed3SPierre Proncheryfreed in the event of error and I<*a> is set to NULL.
293b077aed3SPierre Pronchery
294b077aed3SPierre ProncheryB<i2d_I<TYPE>>() returns the number of bytes successfully encoded or a negative
295b077aed3SPierre Proncheryvalue if an error occurs.
296b077aed3SPierre Pronchery
297b077aed3SPierre ProncheryB<i2d_I<TYPE>_bio>() and B<i2d_I<TYPE>_fp>() return 1 for success and 0 if an
298b077aed3SPierre Proncheryerror occurs.
299b077aed3SPierre Pronchery
300b077aed3SPierre Pronchery=head1 SEE ALSO
301b077aed3SPierre Pronchery
302b077aed3SPierre ProncheryL<OSSL_ENCODER(3)>, L<OSSL_DECODER(3)>,
303b077aed3SPierre ProncheryL<d2i_PrivateKey(3)>, L<d2i_PublicKey(3)>, L<d2i_KeyParams(3)>,
304b077aed3SPierre ProncheryL<d2i_PUBKEY(3)>,
305b077aed3SPierre ProncheryL<i2d_PrivateKey(3)>, L<i2d_PublicKey(3)>, L<i2d_KeyParams(3)>,
306b077aed3SPierre ProncheryL<i2d_PUBKEY(3)>
307b077aed3SPierre Pronchery
308b077aed3SPierre Pronchery=head1 COPYRIGHT
309b077aed3SPierre Pronchery
310*6f1af0d7SPierre ProncheryCopyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
311b077aed3SPierre Pronchery
312b077aed3SPierre ProncheryLicensed under the Apache License 2.0 (the "License").  You may not use
313b077aed3SPierre Proncherythis file except in compliance with the License.  You can obtain a copy
314b077aed3SPierre Proncheryin the file LICENSE in the source distribution or at
315b077aed3SPierre ProncheryL<https://www.openssl.org/source/license.html>.
316b077aed3SPierre Pronchery
317b077aed3SPierre Pronchery=cut
318