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