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