d2i_X509.3 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. .\" Automatically generated by Pod::Man 4.09 (Pod::Simple 3.35)
  2. .\"
  3. .\" Standard preamble:
  4. .\" ========================================================================
  5. .de Sp \" Vertical space (when we can't use .PP)
  6. .if t .sp .5v
  7. .if n .sp
  8. ..
  9. .de Vb \" Begin verbatim text
  10. .ft CW
  11. .nf
  12. .ne \\$1
  13. ..
  14. .de Ve \" End verbatim text
  15. .ft R
  16. .fi
  17. ..
  18. .\" Set up some character translations and predefined strings. \*(-- will
  19. .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
  20. .\" double quote, and \*(R" will give a right double quote. \*(C+ will
  21. .\" give a nicer C++. Capital omega is used to do unbreakable dashes and
  22. .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
  23. .\" nothing in troff, for use with C<>.
  24. .tr \(*W-
  25. .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
  26. .ie n \{\
  27. . ds -- \(*W-
  28. . ds PI pi
  29. . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
  30. . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
  31. . ds L" ""
  32. . ds R" ""
  33. . ds C` ""
  34. . ds C' ""
  35. 'br\}
  36. .el\{\
  37. . ds -- \|\(em\|
  38. . ds PI \(*p
  39. . ds L" ``
  40. . ds R" ''
  41. . ds C`
  42. . ds C'
  43. 'br\}
  44. .\"
  45. .\" Escape single quotes in literal strings from groff's Unicode transform.
  46. .ie \n(.g .ds Aq \(aq
  47. .el .ds Aq '
  48. .\"
  49. .\" If the F register is >0, we'll generate index entries on stderr for
  50. .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
  51. .\" entries marked with X<> in POD. Of course, you'll have to process the
  52. .\" output yourself in some meaningful fashion.
  53. .\"
  54. .\" Avoid warning from groff about undefined register 'F'.
  55. .de IX
  56. ..
  57. .if !\nF .nr F 0
  58. .if \nF>0 \{\
  59. . de IX
  60. . tm Index:\\$1\t\\n%\t"\\$2"
  61. ..
  62. . if !\nF==2 \{\
  63. . nr % 0
  64. . nr F 2
  65. . \}
  66. .\}
  67. .\"
  68. .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
  69. .\" Fear. Run. Save yourself. No user-serviceable parts.
  70. . \" fudge factors for nroff and troff
  71. .if n \{\
  72. . ds #H 0
  73. . ds #V .8m
  74. . ds #F .3m
  75. . ds #[ \f1
  76. . ds #] \fP
  77. .\}
  78. .if t \{\
  79. . ds #H ((1u-(\\\\n(.fu%2u))*.13m)
  80. . ds #V .6m
  81. . ds #F 0
  82. . ds #[ \&
  83. . ds #] \&
  84. .\}
  85. . \" simple accents for nroff and troff
  86. .if n \{\
  87. . ds ' \&
  88. . ds ` \&
  89. . ds ^ \&
  90. . ds , \&
  91. . ds ~ ~
  92. . ds /
  93. .\}
  94. .if t \{\
  95. . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
  96. . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
  97. . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
  98. . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
  99. . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
  100. . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
  101. .\}
  102. . \" troff and (daisy-wheel) nroff accents
  103. .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
  104. .ds 8 \h'\*(#H'\(*b\h'-\*(#H'
  105. .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
  106. .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
  107. .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
  108. .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
  109. .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
  110. .ds ae a\h'-(\w'a'u*4/10)'e
  111. .ds Ae A\h'-(\w'A'u*4/10)'E
  112. . \" corrections for vroff
  113. .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
  114. .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
  115. . \" for low resolution devices (crt and lpr)
  116. .if \n(.H>23 .if \n(.V>19 \
  117. \{\
  118. . ds : e
  119. . ds 8 ss
  120. . ds o a
  121. . ds d- d\h'-1'\(ga
  122. . ds D- D\h'-1'\(hy
  123. . ds th \o'bp'
  124. . ds Th \o'LP'
  125. . ds ae ae
  126. . ds Ae AE
  127. .\}
  128. .rm #[ #] #H #V #F C
  129. .\" ========================================================================
  130. .\"
  131. .IX Title "d2i_X509 3"
  132. .TH d2i_X509 3 "2019-09-12" "1.0.2g" "OpenSSL"
  133. .\" For nroff, turn off justification. Always turn off hyphenation; it makes
  134. .\" way too many mistakes in technical documents.
  135. .if n .ad l
  136. .nh
  137. .SH "NAME"
  138. d2i_X509, i2d_X509, d2i_X509_bio, d2i_X509_fp, i2d_X509_bio,
  139. i2d_X509_fp \- X509 encode and decode functions
  140. .SH "SYNOPSIS"
  141. .IX Header "SYNOPSIS"
  142. .Vb 1
  143. \& #include <openssl/x509.h>
  144. \&
  145. \& X509 *d2i_X509(X509 **px, const unsigned char **in, int len);
  146. \& int i2d_X509(X509 *x, unsigned char **out);
  147. \&
  148. \& X509 *d2i_X509_bio(BIO *bp, X509 **x);
  149. \& X509 *d2i_X509_fp(FILE *fp, X509 **x);
  150. \&
  151. \& int i2d_X509_bio(BIO *bp, X509 *x);
  152. \& int i2d_X509_fp(FILE *fp, X509 *x);
  153. \&
  154. \& int i2d_re_X509_tbs(X509 *x, unsigned char **out);
  155. .Ve
  156. .SH "DESCRIPTION"
  157. .IX Header "DESCRIPTION"
  158. The X509 encode and decode routines encode and parse an
  159. \&\fBX509\fR structure, which represents an X509 certificate.
  160. .PP
  161. \&\fId2i_X509()\fR attempts to decode \fBlen\fR bytes at \fB*in\fR. If
  162. successful a pointer to the \fBX509\fR structure is returned. If an error
  163. occurred then \fB\s-1NULL\s0\fR is returned. If \fBpx\fR is not \fB\s-1NULL\s0\fR then the
  164. returned structure is written to \fB*px\fR. If \fB*px\fR is not \fB\s-1NULL\s0\fR
  165. then it is assumed that \fB*px\fR contains a valid \fBX509\fR
  166. structure and an attempt is made to reuse it. This \*(L"reuse\*(R" capability is present
  167. for historical compatibility but its use is \fBstrongly discouraged\fR (see \s-1BUGS\s0
  168. below, and the discussion in the \s-1RETURN VALUES\s0 section).
  169. .PP
  170. If the call is successful \fB*in\fR is incremented to the byte following the
  171. parsed data.
  172. .PP
  173. \&\fIi2d_X509()\fR encodes the structure pointed to by \fBx\fR into \s-1DER\s0 format.
  174. If \fBout\fR is not \fB\s-1NULL\s0\fR is writes the \s-1DER\s0 encoded data to the buffer
  175. at \fB*out\fR, and increments it to point after the data just written.
  176. If the return value is negative an error occurred, otherwise it
  177. returns the length of the encoded data.
  178. .PP
  179. For OpenSSL 0.9.7 and later if \fB*out\fR is \fB\s-1NULL\s0\fR memory will be
  180. allocated for a buffer and the encoded data written to it. In this
  181. case \fB*out\fR is not incremented and it points to the start of the
  182. data just written.
  183. .PP
  184. \&\fId2i_X509_bio()\fR is similar to \fId2i_X509()\fR except it attempts
  185. to parse data from \s-1BIO\s0 \fBbp\fR.
  186. .PP
  187. \&\fId2i_X509_fp()\fR is similar to \fId2i_X509()\fR except it attempts
  188. to parse data from \s-1FILE\s0 pointer \fBfp\fR.
  189. .PP
  190. \&\fIi2d_X509_bio()\fR is similar to \fIi2d_X509()\fR except it writes
  191. the encoding of the structure \fBx\fR to \s-1BIO\s0 \fBbp\fR and it
  192. returns 1 for success and 0 for failure.
  193. .PP
  194. \&\fIi2d_X509_fp()\fR is similar to \fIi2d_X509()\fR except it writes
  195. the encoding of the structure \fBx\fR to \s-1BIO\s0 \fBbp\fR and it
  196. returns 1 for success and 0 for failure.
  197. .PP
  198. \&\fIi2d_re_X509_tbs()\fR is similar to \fIi2d_X509()\fR except it encodes
  199. only the TBSCertificate portion of the certificate.
  200. .SH "NOTES"
  201. .IX Header "NOTES"
  202. The letters \fBi\fR and \fBd\fR in for example \fBi2d_X509\fR stand for
  203. \&\*(L"internal\*(R" (that is an internal C structure) and \*(L"\s-1DER\*(R".\s0 So
  204. \&\fBi2d_X509\fR converts from internal to \s-1DER.\s0 The \*(L"re\*(R" in
  205. \&\fBi2d_re_X509_tbs\fR stands for \*(L"re-encode\*(R", and ensures that a fresh
  206. encoding is generated in case the object has been modified after
  207. creation (see the \s-1BUGS\s0 section).
  208. .PP
  209. The functions can also understand \fB\s-1BER\s0\fR forms.
  210. .PP
  211. The actual X509 structure passed to \fIi2d_X509()\fR must be a valid
  212. populated \fBX509\fR structure it can \fBnot\fR simply be fed with an
  213. empty structure such as that returned by \fIX509_new()\fR.
  214. .PP
  215. The encoded data is in binary form and may contain embedded zeroes.
  216. Therefore any \s-1FILE\s0 pointers or BIOs should be opened in binary mode.
  217. Functions such as \fB\f(BIstrlen()\fB\fR will \fBnot\fR return the correct length
  218. of the encoded structure.
  219. .PP
  220. The ways that \fB*in\fR and \fB*out\fR are incremented after the operation
  221. can trap the unwary. See the \fB\s-1WARNINGS\s0\fR section for some common
  222. errors.
  223. .PP
  224. The reason for the auto increment behaviour is to reflect a typical
  225. usage of \s-1ASN1\s0 functions: after one structure is encoded or decoded
  226. another will processed after it.
  227. .SH "EXAMPLES"
  228. .IX Header "EXAMPLES"
  229. Allocate and encode the \s-1DER\s0 encoding of an X509 structure:
  230. .PP
  231. .Vb 2
  232. \& int len;
  233. \& unsigned char *buf, *p;
  234. \&
  235. \& len = i2d_X509(x, NULL);
  236. \&
  237. \& buf = OPENSSL_malloc(len);
  238. \&
  239. \& if (buf == NULL)
  240. \& /* error */
  241. \&
  242. \& p = buf;
  243. \&
  244. \& i2d_X509(x, &p);
  245. .Ve
  246. .PP
  247. If you are using OpenSSL 0.9.7 or later then this can be
  248. simplified to:
  249. .PP
  250. .Vb 2
  251. \& int len;
  252. \& unsigned char *buf;
  253. \&
  254. \& buf = NULL;
  255. \&
  256. \& len = i2d_X509(x, &buf);
  257. \&
  258. \& if (len < 0)
  259. \& /* error */
  260. .Ve
  261. .PP
  262. Attempt to decode a buffer:
  263. .PP
  264. .Vb 1
  265. \& X509 *x;
  266. \&
  267. \& unsigned char *buf, *p;
  268. \&
  269. \& int len;
  270. \&
  271. \& /* Something to setup buf and len */
  272. \&
  273. \& p = buf;
  274. \&
  275. \& x = d2i_X509(NULL, &p, len);
  276. \&
  277. \& if (x == NULL)
  278. \& /* Some error */
  279. .Ve
  280. .PP
  281. Alternative technique:
  282. .PP
  283. .Vb 1
  284. \& X509 *x;
  285. \&
  286. \& unsigned char *buf, *p;
  287. \&
  288. \& int len;
  289. \&
  290. \& /* Something to setup buf and len */
  291. \&
  292. \& p = buf;
  293. \&
  294. \& x = NULL;
  295. \&
  296. \& if(!d2i_X509(&x, &p, len))
  297. \& /* Some error */
  298. .Ve
  299. .SH "WARNINGS"
  300. .IX Header "WARNINGS"
  301. The use of temporary variable is mandatory. A common
  302. mistake is to attempt to use a buffer directly as follows:
  303. .PP
  304. .Vb 2
  305. \& int len;
  306. \& unsigned char *buf;
  307. \&
  308. \& len = i2d_X509(x, NULL);
  309. \&
  310. \& buf = OPENSSL_malloc(len);
  311. \&
  312. \& if (buf == NULL)
  313. \& /* error */
  314. \&
  315. \& i2d_X509(x, &buf);
  316. \&
  317. \& /* Other stuff ... */
  318. \&
  319. \& OPENSSL_free(buf);
  320. .Ve
  321. .PP
  322. This code will result in \fBbuf\fR apparently containing garbage because
  323. it was incremented after the call to point after the data just written.
  324. Also \fBbuf\fR will no longer contain the pointer allocated by \fB\f(BIOPENSSL_malloc()\fB\fR
  325. and the subsequent call to \fB\f(BIOPENSSL_free()\fB\fR may well crash.
  326. .PP
  327. The auto allocation feature (setting buf to \s-1NULL\s0) only works on OpenSSL
  328. 0.9.7 and later. Attempts to use it on earlier versions will typically
  329. cause a segmentation violation.
  330. .PP
  331. Another trap to avoid is misuse of the \fBxp\fR argument to \fB\f(BId2i_X509()\fB\fR:
  332. .PP
  333. .Vb 1
  334. \& X509 *x;
  335. \&
  336. \& if (!d2i_X509(&x, &p, len))
  337. \& /* Some error */
  338. .Ve
  339. .PP
  340. This will probably crash somewhere in \fB\f(BId2i_X509()\fB\fR. The reason for this
  341. is that the variable \fBx\fR is uninitialized and an attempt will be made to
  342. interpret its (invalid) value as an \fBX509\fR structure, typically causing
  343. a segmentation violation. If \fBx\fR is set to \s-1NULL\s0 first then this will not
  344. happen.
  345. .SH "BUGS"
  346. .IX Header "BUGS"
  347. In some versions of OpenSSL the \*(L"reuse\*(R" behaviour of \fId2i_X509()\fR when
  348. \&\fB*px\fR is valid is broken and some parts of the reused structure may
  349. persist if they are not present in the new one. As a result the use
  350. of this \*(L"reuse\*(R" behaviour is strongly discouraged.
  351. .PP
  352. \&\fIi2d_X509()\fR will not return an error in many versions of OpenSSL,
  353. if mandatory fields are not initialized due to a programming error
  354. then the encoded structure may contain invalid data or omit the
  355. fields entirely and will not be parsed by \fId2i_X509()\fR. This may be
  356. fixed in future so code should not assume that \fIi2d_X509()\fR will
  357. always succeed.
  358. .PP
  359. The encoding of the TBSCertificate portion of a certificate is cached
  360. in the \fBX509\fR structure internally to improve encoding performance
  361. and to ensure certificate signatures are verified correctly in some
  362. certificates with broken (non-DER) encodings.
  363. .PP
  364. Any function which encodes an X509 structure such as \fIi2d_X509()\fR,
  365. \&\fIi2d_X509_fp()\fR or \fIi2d_X509_bio()\fR may return a stale encoding if the
  366. \&\fBX509\fR structure has been modified after deserialization or previous
  367. serialization.
  368. .PP
  369. If, after modification, the \fBX509\fR object is re-signed with \fIX509_sign()\fR,
  370. the encoding is automatically renewed. Otherwise, the encoding of the
  371. TBSCertificate portion of the \fBX509\fR can be manually renewed by calling
  372. \&\fIi2d_re_X509_tbs()\fR.
  373. .SH "RETURN VALUES"
  374. .IX Header "RETURN VALUES"
  375. \&\fId2i_X509()\fR, \fId2i_X509_bio()\fR and \fId2i_X509_fp()\fR return a valid \fBX509\fR structure
  376. or \fB\s-1NULL\s0\fR if an error occurs. The error code that can be obtained by
  377. \&\fIERR_get_error\fR\|(3). If the \*(L"reuse\*(R" capability has been used
  378. with a valid X509 structure being passed in via \fBpx\fR then the object is not
  379. freed in the event of error but may be in a potentially invalid or inconsistent
  380. state.
  381. .PP
  382. \&\fIi2d_X509()\fR returns the number of bytes successfully encoded or a negative
  383. value if an error occurs. The error code can be obtained by
  384. \&\fIERR_get_error\fR\|(3).
  385. .PP
  386. \&\fIi2d_X509_bio()\fR and \fIi2d_X509_fp()\fR return 1 for success and 0 if an error
  387. occurs The error code can be obtained by \fIERR_get_error\fR\|(3).
  388. .SH "SEE ALSO"
  389. .IX Header "SEE ALSO"
  390. \&\fIERR_get_error\fR\|(3)
  391. .SH "HISTORY"
  392. .IX Header "HISTORY"
  393. d2i_X509, i2d_X509, d2i_X509_bio, d2i_X509_fp, i2d_X509_bio and i2d_X509_fp
  394. are available in all versions of SSLeay and OpenSSL.