]> git.ipfire.org Git - thirdparty/openssl.git/blame - doc/man3/d2i_X509.pod
Fix errors found by new find-doc-nits
[thirdparty/openssl.git] / doc / man3 / d2i_X509.pod
CommitLineData
9946fceb
DSH
1=pod
2
3=head1 NAME
4
4692340e 5d2i_ACCESS_DESCRIPTION,
fa743582
RS
6d2i_ADMISSIONS,
7d2i_ADMISSION_SYNTAX,
4692340e
RS
8d2i_ASIdOrRange,
9d2i_ASIdentifierChoice,
10d2i_ASIdentifiers,
11d2i_ASN1_BIT_STRING,
12d2i_ASN1_BMPSTRING,
13d2i_ASN1_ENUMERATED,
14d2i_ASN1_GENERALIZEDTIME,
15d2i_ASN1_GENERALSTRING,
16d2i_ASN1_IA5STRING,
17d2i_ASN1_INTEGER,
18d2i_ASN1_NULL,
19d2i_ASN1_OBJECT,
20d2i_ASN1_OCTET_STRING,
21d2i_ASN1_PRINTABLE,
22d2i_ASN1_PRINTABLESTRING,
23d2i_ASN1_SEQUENCE_ANY,
24d2i_ASN1_SET_ANY,
25d2i_ASN1_T61STRING,
26d2i_ASN1_TIME,
27d2i_ASN1_TYPE,
28d2i_ASN1_UINTEGER,
29d2i_ASN1_UNIVERSALSTRING,
30d2i_ASN1_UTCTIME,
31d2i_ASN1_UTF8STRING,
32d2i_ASN1_VISIBLESTRING,
33d2i_ASRange,
34d2i_AUTHORITY_INFO_ACCESS,
35d2i_AUTHORITY_KEYID,
36d2i_BASIC_CONSTRAINTS,
37d2i_CERTIFICATEPOLICIES,
38d2i_CMS_ContentInfo,
39d2i_CMS_ReceiptRequest,
40d2i_CMS_bio,
41d2i_CRL_DIST_POINTS,
42d2i_DHxparams,
43d2i_DIRECTORYSTRING,
44d2i_DISPLAYTEXT,
45d2i_DIST_POINT,
46d2i_DIST_POINT_NAME,
47d2i_DSAPrivateKey,
48d2i_DSAPrivateKey_bio,
49d2i_DSAPrivateKey_fp,
50d2i_DSAPublicKey,
82d89ef7 51d2i_DSA_PUBKEY,
4692340e
RS
52d2i_DSA_PUBKEY_bio,
53d2i_DSA_PUBKEY_fp,
54d2i_DSA_SIG,
55d2i_DSAparams,
bbda7997 56d2i_ECDSA_SIG,
4692340e
RS
57d2i_ECPKParameters,
58d2i_ECParameters,
59d2i_ECPrivateKey,
60d2i_ECPrivateKey_bio,
61d2i_ECPrivateKey_fp,
62d2i_EC_PUBKEY,
63d2i_EC_PUBKEY_bio,
64d2i_EC_PUBKEY_fp,
65d2i_EDIPARTYNAME,
66d2i_ESS_CERT_ID,
8c00f267 67d2i_ESS_CERT_ID_V2,
4692340e
RS
68d2i_ESS_ISSUER_SERIAL,
69d2i_ESS_SIGNING_CERT,
8c00f267 70d2i_ESS_SIGNING_CERT_V2,
4692340e
RS
71d2i_EXTENDED_KEY_USAGE,
72d2i_GENERAL_NAME,
73d2i_GENERAL_NAMES,
74d2i_IPAddressChoice,
75d2i_IPAddressFamily,
76d2i_IPAddressOrRange,
77d2i_IPAddressRange,
78d2i_ISSUING_DIST_POINT,
fa743582 79d2i_NAMING_AUTHORITY,
4692340e
RS
80d2i_NETSCAPE_CERT_SEQUENCE,
81d2i_NETSCAPE_SPKAC,
82d2i_NETSCAPE_SPKI,
83d2i_NOTICEREF,
84d2i_OCSP_BASICRESP,
85d2i_OCSP_CERTID,
86d2i_OCSP_CERTSTATUS,
87d2i_OCSP_CRLID,
88d2i_OCSP_ONEREQ,
89d2i_OCSP_REQINFO,
90d2i_OCSP_REQUEST,
91d2i_OCSP_RESPBYTES,
92d2i_OCSP_RESPDATA,
93d2i_OCSP_RESPID,
94d2i_OCSP_RESPONSE,
95d2i_OCSP_REVOKEDINFO,
96d2i_OCSP_SERVICELOC,
97d2i_OCSP_SIGNATURE,
98d2i_OCSP_SINGLERESP,
8869ad4a
AK
99d2i_OSSL_CMP_MSG,
100d2i_OSSL_CMP_PKIHEADER,
101d2i_OSSL_CRMF_CERTID,
102d2i_OSSL_CRMF_CERTTEMPLATE,
103d2i_OSSL_CRMF_ENCRYPTEDVALUE,
104d2i_OSSL_CRMF_MSG,
105d2i_OSSL_CRMF_MSGS,
106d2i_OSSL_CRMF_PBMPARAMETER,
107d2i_OSSL_CRMF_PKIPUBLICATIONINFO,
108d2i_OSSL_CRMF_SINGLEPUBINFO,
4692340e
RS
109d2i_OTHERNAME,
110d2i_PBE2PARAM,
111d2i_PBEPARAM,
112d2i_PBKDF2PARAM,
113d2i_PKCS12,
114d2i_PKCS12_BAGS,
115d2i_PKCS12_MAC_DATA,
116d2i_PKCS12_SAFEBAG,
117d2i_PKCS12_bio,
118d2i_PKCS12_fp,
119d2i_PKCS7,
120d2i_PKCS7_DIGEST,
121d2i_PKCS7_ENCRYPT,
122d2i_PKCS7_ENC_CONTENT,
123d2i_PKCS7_ENVELOPE,
124d2i_PKCS7_ISSUER_AND_SERIAL,
125d2i_PKCS7_RECIP_INFO,
126d2i_PKCS7_SIGNED,
127d2i_PKCS7_SIGNER_INFO,
128d2i_PKCS7_SIGN_ENVELOPE,
129d2i_PKCS7_bio,
130d2i_PKCS7_fp,
131d2i_PKCS8_PRIV_KEY_INFO,
132d2i_PKCS8_PRIV_KEY_INFO_bio,
133d2i_PKCS8_PRIV_KEY_INFO_fp,
134d2i_PKCS8_bio,
135d2i_PKCS8_fp,
136d2i_PKEY_USAGE_PERIOD,
137d2i_POLICYINFO,
138d2i_POLICYQUALINFO,
fa743582 139d2i_PROFESSION_INFO,
4692340e
RS
140d2i_PROXY_CERT_INFO_EXTENSION,
141d2i_PROXY_POLICY,
4692340e
RS
142d2i_RSAPrivateKey,
143d2i_RSAPrivateKey_bio,
144d2i_RSAPrivateKey_fp,
145d2i_RSAPublicKey,
146d2i_RSAPublicKey_bio,
147d2i_RSAPublicKey_fp,
148d2i_RSA_OAEP_PARAMS,
149d2i_RSA_PSS_PARAMS,
150d2i_RSA_PUBKEY,
151d2i_RSA_PUBKEY_bio,
152d2i_RSA_PUBKEY_fp,
00606b06 153d2i_SCRYPT_PARAMS,
4692340e
RS
154d2i_SCT_LIST,
155d2i_SXNET,
156d2i_SXNETID,
157d2i_TS_ACCURACY,
158d2i_TS_MSG_IMPRINT,
159d2i_TS_MSG_IMPRINT_bio,
160d2i_TS_MSG_IMPRINT_fp,
161d2i_TS_REQ,
162d2i_TS_REQ_bio,
163d2i_TS_REQ_fp,
164d2i_TS_RESP,
165d2i_TS_RESP_bio,
166d2i_TS_RESP_fp,
167d2i_TS_STATUS_INFO,
168d2i_TS_TST_INFO,
169d2i_TS_TST_INFO_bio,
170d2i_TS_TST_INFO_fp,
171d2i_USERNOTICE,
172d2i_X509,
173d2i_X509_ALGOR,
174d2i_X509_ALGORS,
175d2i_X509_ATTRIBUTE,
176d2i_X509_CERT_AUX,
177d2i_X509_CINF,
178d2i_X509_CRL,
179d2i_X509_CRL_INFO,
180d2i_X509_CRL_bio,
181d2i_X509_CRL_fp,
182d2i_X509_EXTENSION,
183d2i_X509_EXTENSIONS,
184d2i_X509_NAME,
185d2i_X509_NAME_ENTRY,
186d2i_X509_PUBKEY,
187d2i_X509_REQ,
188d2i_X509_REQ_INFO,
189d2i_X509_REQ_bio,
190d2i_X509_REQ_fp,
191d2i_X509_REVOKED,
192d2i_X509_SIG,
193d2i_X509_VAL,
194i2d_ACCESS_DESCRIPTION,
fa743582
RS
195i2d_ADMISSIONS,
196i2d_ADMISSION_SYNTAX,
4692340e
RS
197i2d_ASIdOrRange,
198i2d_ASIdentifierChoice,
199i2d_ASIdentifiers,
200i2d_ASN1_BIT_STRING,
201i2d_ASN1_BMPSTRING,
202i2d_ASN1_ENUMERATED,
203i2d_ASN1_GENERALIZEDTIME,
204i2d_ASN1_GENERALSTRING,
205i2d_ASN1_IA5STRING,
206i2d_ASN1_INTEGER,
207i2d_ASN1_NULL,
208i2d_ASN1_OBJECT,
209i2d_ASN1_OCTET_STRING,
210i2d_ASN1_PRINTABLE,
211i2d_ASN1_PRINTABLESTRING,
212i2d_ASN1_SEQUENCE_ANY,
213i2d_ASN1_SET_ANY,
214i2d_ASN1_T61STRING,
215i2d_ASN1_TIME,
216i2d_ASN1_TYPE,
217i2d_ASN1_UNIVERSALSTRING,
218i2d_ASN1_UTCTIME,
219i2d_ASN1_UTF8STRING,
220i2d_ASN1_VISIBLESTRING,
221i2d_ASN1_bio_stream,
222i2d_ASRange,
223i2d_AUTHORITY_INFO_ACCESS,
224i2d_AUTHORITY_KEYID,
225i2d_BASIC_CONSTRAINTS,
226i2d_CERTIFICATEPOLICIES,
227i2d_CMS_ContentInfo,
228i2d_CMS_ReceiptRequest,
229i2d_CMS_bio,
230i2d_CRL_DIST_POINTS,
231i2d_DHxparams,
232i2d_DIRECTORYSTRING,
233i2d_DISPLAYTEXT,
234i2d_DIST_POINT,
235i2d_DIST_POINT_NAME,
236i2d_DSAPrivateKey,
237i2d_DSAPrivateKey_bio,
238i2d_DSAPrivateKey_fp,
239i2d_DSAPublicKey,
82d89ef7 240i2d_DSA_PUBKEY,
4692340e
RS
241i2d_DSA_PUBKEY_bio,
242i2d_DSA_PUBKEY_fp,
243i2d_DSA_SIG,
244i2d_DSAparams,
bbda7997 245i2d_ECDSA_SIG,
4692340e
RS
246i2d_ECPKParameters,
247i2d_ECParameters,
248i2d_ECPrivateKey,
249i2d_ECPrivateKey_bio,
250i2d_ECPrivateKey_fp,
251i2d_EC_PUBKEY,
252i2d_EC_PUBKEY_bio,
253i2d_EC_PUBKEY_fp,
254i2d_EDIPARTYNAME,
255i2d_ESS_CERT_ID,
8c00f267 256i2d_ESS_CERT_ID_V2,
4692340e
RS
257i2d_ESS_ISSUER_SERIAL,
258i2d_ESS_SIGNING_CERT,
8c00f267 259i2d_ESS_SIGNING_CERT_V2,
4692340e
RS
260i2d_EXTENDED_KEY_USAGE,
261i2d_GENERAL_NAME,
262i2d_GENERAL_NAMES,
263i2d_IPAddressChoice,
264i2d_IPAddressFamily,
265i2d_IPAddressOrRange,
266i2d_IPAddressRange,
267i2d_ISSUING_DIST_POINT,
fa743582 268i2d_NAMING_AUTHORITY,
4692340e
RS
269i2d_NETSCAPE_CERT_SEQUENCE,
270i2d_NETSCAPE_SPKAC,
271i2d_NETSCAPE_SPKI,
272i2d_NOTICEREF,
273i2d_OCSP_BASICRESP,
274i2d_OCSP_CERTID,
275i2d_OCSP_CERTSTATUS,
276i2d_OCSP_CRLID,
277i2d_OCSP_ONEREQ,
278i2d_OCSP_REQINFO,
279i2d_OCSP_REQUEST,
280i2d_OCSP_RESPBYTES,
281i2d_OCSP_RESPDATA,
282i2d_OCSP_RESPID,
283i2d_OCSP_RESPONSE,
284i2d_OCSP_REVOKEDINFO,
285i2d_OCSP_SERVICELOC,
286i2d_OCSP_SIGNATURE,
287i2d_OCSP_SINGLERESP,
8869ad4a
AK
288i2d_OSSL_CMP_MSG,
289i2d_OSSL_CMP_PKIHEADER,
290i2d_OSSL_CRMF_CERTID,
291i2d_OSSL_CRMF_CERTTEMPLATE,
292i2d_OSSL_CRMF_ENCRYPTEDVALUE,
293i2d_OSSL_CRMF_MSG,
294i2d_OSSL_CRMF_MSGS,
295i2d_OSSL_CRMF_PBMPARAMETER,
296i2d_OSSL_CRMF_PKIPUBLICATIONINFO,
297i2d_OSSL_CRMF_SINGLEPUBINFO,
4692340e
RS
298i2d_OTHERNAME,
299i2d_PBE2PARAM,
300i2d_PBEPARAM,
301i2d_PBKDF2PARAM,
302i2d_PKCS12,
303i2d_PKCS12_BAGS,
304i2d_PKCS12_MAC_DATA,
305i2d_PKCS12_SAFEBAG,
306i2d_PKCS12_bio,
307i2d_PKCS12_fp,
308i2d_PKCS7,
309i2d_PKCS7_DIGEST,
310i2d_PKCS7_ENCRYPT,
311i2d_PKCS7_ENC_CONTENT,
312i2d_PKCS7_ENVELOPE,
313i2d_PKCS7_ISSUER_AND_SERIAL,
314i2d_PKCS7_NDEF,
315i2d_PKCS7_RECIP_INFO,
316i2d_PKCS7_SIGNED,
317i2d_PKCS7_SIGNER_INFO,
318i2d_PKCS7_SIGN_ENVELOPE,
319i2d_PKCS7_bio,
320i2d_PKCS7_fp,
321i2d_PKCS8PrivateKeyInfo_bio,
322i2d_PKCS8PrivateKeyInfo_fp,
323i2d_PKCS8_PRIV_KEY_INFO,
324i2d_PKCS8_PRIV_KEY_INFO_bio,
325i2d_PKCS8_PRIV_KEY_INFO_fp,
326i2d_PKCS8_bio,
327i2d_PKCS8_fp,
328i2d_PKEY_USAGE_PERIOD,
329i2d_POLICYINFO,
330i2d_POLICYQUALINFO,
fa743582 331i2d_PROFESSION_INFO,
4692340e
RS
332i2d_PROXY_CERT_INFO_EXTENSION,
333i2d_PROXY_POLICY,
4692340e
RS
334i2d_RSAPrivateKey,
335i2d_RSAPrivateKey_bio,
336i2d_RSAPrivateKey_fp,
337i2d_RSAPublicKey,
338i2d_RSAPublicKey_bio,
339i2d_RSAPublicKey_fp,
340i2d_RSA_OAEP_PARAMS,
341i2d_RSA_PSS_PARAMS,
342i2d_RSA_PUBKEY,
343i2d_RSA_PUBKEY_bio,
344i2d_RSA_PUBKEY_fp,
00606b06 345i2d_SCRYPT_PARAMS,
4692340e
RS
346i2d_SCT_LIST,
347i2d_SXNET,
348i2d_SXNETID,
349i2d_TS_ACCURACY,
350i2d_TS_MSG_IMPRINT,
351i2d_TS_MSG_IMPRINT_bio,
352i2d_TS_MSG_IMPRINT_fp,
353i2d_TS_REQ,
354i2d_TS_REQ_bio,
355i2d_TS_REQ_fp,
356i2d_TS_RESP,
357i2d_TS_RESP_bio,
358i2d_TS_RESP_fp,
359i2d_TS_STATUS_INFO,
360i2d_TS_TST_INFO,
361i2d_TS_TST_INFO_bio,
362i2d_TS_TST_INFO_fp,
363i2d_USERNOTICE,
364i2d_X509,
365i2d_X509_ALGOR,
366i2d_X509_ALGORS,
367i2d_X509_ATTRIBUTE,
368i2d_X509_CERT_AUX,
369i2d_X509_CINF,
370i2d_X509_CRL,
371i2d_X509_CRL_INFO,
372i2d_X509_CRL_bio,
373i2d_X509_CRL_fp,
374i2d_X509_EXTENSION,
375i2d_X509_EXTENSIONS,
376i2d_X509_NAME,
377i2d_X509_NAME_ENTRY,
378i2d_X509_PUBKEY,
379i2d_X509_REQ,
380i2d_X509_REQ_INFO,
381i2d_X509_REQ_bio,
382i2d_X509_REQ_fp,
383i2d_X509_REVOKED,
384i2d_X509_SIG,
385i2d_X509_VAL,
386- convert objects from/to ASN.1/DER representation
387
9946fceb
DSH
388=head1 SYNOPSIS
389
b97fdb57
RL
390=for comment generic
391
7c60a968 392 TYPE *d2i_TYPE(TYPE **a, unsigned char **ppin, long length);
4692340e
RS
393 TYPE *d2i_TYPE_bio(BIO *bp, TYPE **a);
394 TYPE *d2i_TYPE_fp(FILE *fp, TYPE **a);
842d8e20 395
9fdcc21f 396 int i2d_TYPE(const TYPE *a, unsigned char **ppout);
7c60a968 397 int i2d_TYPE(TYPE *a, unsigned char **ppout);
9fdcc21f 398 int i2d_TYPE_fp(FILE *fp, const TYPE *a);
4692340e 399 int i2d_TYPE_fp(FILE *fp, TYPE *a);
9fdcc21f 400 int i2d_TYPE_bio(BIO *bp, const TYPE *a);
4692340e 401 int i2d_TYPE_bio(BIO *bp, TYPE *a);
9946fceb 402
4692340e 403=head1 DESCRIPTION
9946fceb 404
bbecf04e 405In the description here, B<I<TYPE>> is used a placeholder
4692340e 406for any of the OpenSSL datatypes, such as I<X509_CRL>.
7c60a968
DMSP
407The function parameters I<ppin> and I<ppout> are generally
408either both named I<pp> in the headers, or I<in> and I<out>.
95b1752c 409
4692340e
RS
410These functions convert OpenSSL objects to and from their ASN.1/DER
411encoding. Unlike the C structures which can have pointers to sub-objects
412within, the DER is a serialized encoding, suitable for sending over the
413network, writing to a file, and so on.
9946fceb 414
bbecf04e
RL
415B<d2i_I<TYPE>>() attempts to decode I<len> bytes at I<*ppin>. If successful a
416pointer to the B<I<TYPE>> structure is returned and I<*ppin> is incremented to
417the byte following the parsed data. If I<a> is not NULL then a pointer
418to the returned structure is also written to I<*a>. If an error occurred
419then NULL is returned.
9946fceb 420
bbecf04e
RL
421On a successful return, if I<*a> is not NULL then it is assumed that I<*a>
422contains a valid B<I<TYPE>> structure and an attempt is made to reuse it. This
4692340e
RS
423"reuse" capability is present for historical compatibility but its use is
424B<strongly discouraged> (see BUGS below, and the discussion in the RETURN
425VALUES section).
09f278f9 426
bbecf04e
RL
427B<d2i_I<TYPE>_bio>() is similar to B<d2i_I<TYPE>>() except it attempts
428to parse data from BIO I<bp>.
9946fceb 429
bbecf04e
RL
430B<d2i_I<TYPE>_fp>() is similar to B<d2i_I<TYPE>>() except it attempts
431to parse data from FILE pointer I<fp>.
fde2257f 432
bbecf04e
RL
433B<i2d_I<TYPE>>() encodes the structure pointed to by I<a> into DER format.
434If I<ppout> is not NULL, it writes the DER encoded data to the buffer
435at I<*ppout>, and increments it to point after the data just written.
9946fceb 436If the return value is negative an error occurred, otherwise it
1bc74519 437returns the length of the encoded data.
9946fceb 438
bbecf04e
RL
439If I<*ppout> is NULL memory will be allocated for a buffer and the encoded
440data written to it. In this case I<*ppout> is not incremented and it points
4692340e 441to the start of the data just written.
9946fceb 442
bbecf04e
RL
443B<i2d_I<TYPE>_bio>() is similar to B<i2d_I<TYPE>>() except it writes
444the encoding of the structure I<a> to BIO I<bp> and it
cfae3d94 445returns 1 for success and 0 for failure.
9946fceb 446
bbecf04e
RL
447B<i2d_I<TYPE>_fp>() is similar to B<i2d_I<TYPE>>() except it writes
448the encoding of the structure I<a> to BIO I<bp> and it
cfae3d94 449returns 1 for success and 0 for failure.
9946fceb 450
4692340e
RS
451These routines do not encrypt private keys and therefore offer no
452security; use L<PEM_write_PrivateKey(3)> or similar for writing to files.
95b1752c 453
9946fceb
DSH
454=head1 NOTES
455
bbecf04e 456The letters B<i> and B<d> in B<i2d_I<TYPE>>() stand for
4692340e 457"internal" (that is, an internal C structure) and "DER" respectively.
bbecf04e 458So B<i2d_I<TYPE>>() converts from internal to DER.
9946fceb
DSH
459
460The functions can also understand B<BER> forms.
461
bbecf04e
RL
462The actual TYPE structure passed to B<i2d_I<TYPE>>() must be a valid
463populated B<I<TYPE>> structure -- it B<cannot> simply be fed with an
4692340e 464empty structure such as that returned by TYPE_new().
9946fceb 465
9c0586d5 466The encoded data is in binary form and may contain embedded zeros.
9946fceb 467Therefore any FILE pointers or BIOs should be opened in binary mode.
35cb565a 468Functions such as strlen() will B<not> return the correct length
9946fceb
DSH
469of the encoded structure.
470
bbecf04e 471The ways that I<*ppin> and I<*ppout> are incremented after the operation
9946fceb
DSH
472can trap the unwary. See the B<WARNINGS> section for some common
473errors.
4692340e 474The reason for this-auto increment behaviour is to reflect a typical
12e0ea30 475usage of ASN1 functions: after one structure is encoded or decoded
4692340e
RS
476another will be processed after it.
477
478The following points about the data types might be useful:
479
e1271ac2 480=over 4
4692340e
RS
481
482=item B<ASN1_OBJECT>
483
484Represents an ASN1 OBJECT IDENTIFIER.
485
486=item B<DHparams>
487
488Represents a PKCS#3 DH parameters structure.
489
490=item B<DHparamx>
491
3266cf58 492Represents an ANSI X9.42 DH parameters structure.
4692340e
RS
493
494=item B<DSA_PUBKEY>
495
496Represents a DSA public key using a B<SubjectPublicKeyInfo> structure.
497
bbecf04e 498=item B<DSAPublicKey>, B<DSAPrivateKey>
4692340e
RS
499
500Use a non-standard OpenSSL format and should be avoided; use B<DSA_PUBKEY>,
bbecf04e 501L<PEM_write_PrivateKey(3)>, or similar instead.
4692340e 502
bbda7997
MC
503=item B<ECDSA_SIG>
504
505Represents an ECDSA signature.
506
4692340e
RS
507=item B<RSAPublicKey>
508
509Represents a PKCS#1 RSA public key structure.
510
511=item B<X509_ALGOR>
512
27b138e9 513Represents an B<AlgorithmIdentifier> structure as used in IETF RFC 6960 and
4692340e
RS
514elsewhere.
515
516=item B<X509_Name>
517
518Represents a B<Name> type as used for subject and issuer names in
519IETF RFC 6960 and elsewhere.
520
521=item B<X509_REQ>
522
523Represents a PKCS#10 certificate request.
524
525=item B<X509_SIG>
526
527Represents the B<DigestInfo> structure defined in PKCS#1 and PKCS#7.
528
529=back
9946fceb 530
4564e77a
PY
531=head1 RETURN VALUES
532
bbecf04e
RL
533B<d2i_I<TYPE>>(), B<d2i_I<TYPE>_bio>() and B<d2i_I<TYPE>_fp>() return a valid
534B<I<TYPE>> structure or NULL if an error occurs. If the "reuse" capability has
535been used with a valid structure being passed in via I<a>, then the object is
536freed in the event of error and I<*a> is set to NULL.
4564e77a 537
bbecf04e 538B<i2d_I<TYPE>>() returns the number of bytes successfully encoded or a negative
4564e77a
PY
539value if an error occurs.
540
bbecf04e
RL
541B<i2d_I<TYPE>_bio>() and B<i2d_I<TYPE>_fp>() return 1 for success and 0 if an
542error occurs.
4564e77a 543
9946fceb
DSH
544=head1 EXAMPLES
545
546Allocate and encode the DER encoding of an X509 structure:
547
9946fceb
DSH
548 int len;
549 unsigned char *buf;
550
551 buf = NULL;
9946fceb 552 len = i2d_X509(x, &buf);
9946fceb 553 if (len < 0)
4692340e 554 /* error */
9946fceb
DSH
555
556Attempt to decode a buffer:
557
558 X509 *x;
9946fceb 559 unsigned char *buf, *p;
9946fceb
DSH
560 int len;
561
4692340e 562 /* Set up buf and len to point to the input buffer. */
9946fceb 563 p = buf;
9946fceb 564 x = d2i_X509(NULL, &p, len);
9946fceb 565 if (x == NULL)
4692340e 566 /* error */
9946fceb
DSH
567
568Alternative technique:
569
570 X509 *x;
9946fceb 571 unsigned char *buf, *p;
9946fceb
DSH
572 int len;
573
4692340e 574 /* Set up buf and len to point to the input buffer. */
9946fceb 575 p = buf;
9946fceb
DSH
576 x = NULL;
577
4692340e
RS
578 if (d2i_X509(&x, &p, len) == NULL)
579 /* error */
9946fceb
DSH
580
581=head1 WARNINGS
582
4692340e 583Using a temporary variable is mandatory. A common
9946fceb
DSH
584mistake is to attempt to use a buffer directly as follows:
585
586 int len;
587 unsigned char *buf;
588
589 len = i2d_X509(x, NULL);
9946fceb 590 buf = OPENSSL_malloc(len);
4692340e 591 ...
9946fceb 592 i2d_X509(x, &buf);
4692340e 593 ...
9946fceb
DSH
594 OPENSSL_free(buf);
595
bbecf04e 596This code will result in I<buf> apparently containing garbage because
9946fceb 597it was incremented after the call to point after the data just written.
bbecf04e 598Also I<buf> will no longer contain the pointer allocated by OPENSSL_malloc()
4692340e 599and the subsequent call to OPENSSL_free() is likely to crash.
9946fceb 600
bbecf04e 601Another trap to avoid is misuse of the I<a> argument to B<d2i_I<TYPE>>():
9946fceb
DSH
602
603 X509 *x;
604
4692340e
RS
605 if (d2i_X509(&x, &p, len) == NULL)
606 /* error */
9946fceb 607
35cb565a 608This will probably crash somewhere in d2i_X509(). The reason for this
bbecf04e 609is that the variable I<x> is uninitialized and an attempt will be made to
9946fceb 610interpret its (invalid) value as an B<X509> structure, typically causing
bbecf04e 611a segmentation violation. If I<x> is set to NULL first then this will not
9946fceb
DSH
612happen.
613
614=head1 BUGS
615
bbecf04e
RL
616In some versions of OpenSSL the "reuse" behaviour of B<d2i_I<TYPE>>() when
617I<*a> is valid is broken and some parts of the reused structure may
b1d14c41
MC
618persist if they are not present in the new one. Additionally, in versions of
619OpenSSL prior to 1.1.0, when the "reuse" behaviour is used and an error occurs
620the behaviour is inconsistent. Some functions behaved as described here, while
bbecf04e 621some did not free I<*a> on error and did not set I<*a> to NULL.
b1d14c41
MC
622
623As a result of the above issues the "reuse" behaviour is strongly discouraged.
9946fceb 624
bbecf04e 625B<i2d_I<TYPE>>() will not return an error in many versions of OpenSSL,
9946fceb 626if mandatory fields are not initialized due to a programming error
12e0ea30 627then the encoded structure may contain invalid data or omit the
bbecf04e
RL
628fields entirely and will not be parsed by B<d2i_I<TYPE>>(). This may be
629fixed in future so code should not assume that B<i2d_I<TYPE>>() will
9946fceb
DSH
630always succeed.
631
bbecf04e
RL
632Any function which encodes a structure (B<i2d_I<TYPE>>(),
633B<i2d_I<TYPE>>() or B<i2d_I<TYPE>>()) may return a stale encoding if the
4692340e
RS
634structure has been modified after deserialization or previous
635serialization. This is because some objects cache the encoding for
636efficiency reasons.
95b1752c 637
e2f92610
RS
638=head1 COPYRIGHT
639
6738bf14 640Copyright 1998-2018 The OpenSSL Project Authors. All Rights Reserved.
e2f92610 641
4746f25a 642Licensed under the Apache License 2.0 (the "License"). You may not use
e2f92610
RS
643this file except in compliance with the License. You can obtain a copy
644in the file LICENSE in the source distribution or at
645L<https://www.openssl.org/source/license.html>.
646
647=cut