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