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