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