OSSL_DESERIALIZER_from_bio.pod 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. =pod
  2. =head1 NAME
  3. OSSL_DESERIALIZER_from_bio,
  4. OSSL_DESERIALIZER_from_fp,
  5. OSSL_DESERIALIZER_CTX_set_input_type,
  6. OSSL_DESERIALIZER_CTX_add_deserializer,
  7. OSSL_DESERIALIZER_CTX_add_extra,
  8. OSSL_DESERIALIZER_CTX_num_deserializers,
  9. OSSL_DESERIALIZER_INSTANCE,
  10. OSSL_DESERIALIZER_CONSTRUCT,
  11. OSSL_DESERIALIZER_CLEANUP,
  12. OSSL_DESERIALIZER_CTX_set_construct,
  13. OSSL_DESERIALIZER_CTX_set_construct_data,
  14. OSSL_DESERIALIZER_CTX_set_cleanup,
  15. OSSL_DESERIALIZER_CTX_get_construct,
  16. OSSL_DESERIALIZER_CTX_get_construct_data,
  17. OSSL_DESERIALIZER_CTX_get_cleanup,
  18. OSSL_DESERIALIZER_export,
  19. OSSL_DESERIALIZER_INSTANCE_deserializer,
  20. OSSL_DESERIALIZER_INSTANCE_deserializer_ctx
  21. - Routines to perform a deserialization
  22. =head1 SYNOPSIS
  23. #include <openssl/deserializer.h>
  24. int OSSL_DESERIALIZER_from_bio(OSSL_DESERIALIZER_CTX *ctx, BIO *in);
  25. int OSSL_DESERIALIZER_from_fp(OSSL_DESERIALIZER_CTX *ctx, FILE *fp);
  26. int OSSL_DESERIALIZER_CTX_set_input_type(OSSL_DESERIALIZER_CTX *ctx,
  27. const char *input_type);
  28. int OSSL_DESERIALIZER_CTX_add_deserializer(OSSL_DESERIALIZER_CTX *ctx,
  29. OSSL_DESERIALIZER *deser);
  30. int OSSL_DESERIALIZER_CTX_add_extra(OSSL_DESERIALIZER_CTX *ctx);
  31. int OSSL_DESERIALIZER_CTX_num_deserializers(OSSL_DESERIALIZER_CTX *ctx);
  32. typedef struct ossl_deserializer_instance_st OSSL_DESERIALIZER_INSTANCE;
  33. OSSL_DESERIALIZER *OSSL_DESERIALIZER_INSTANCE_deserializer
  34. (OSSL_DESERIALIZER_INSTANCE *deser_inst);
  35. void *OSSL_DESERIALIZER_INSTANCE_deserializer_ctx
  36. (OSSL_DESERIALIZER_INSTANCE *deser_inst);
  37. typedef int (OSSL_DESERIALIZER_CONSTRUCT)
  38. (OSSL_DESERIALIZER_INSTANCE *deser_inst,
  39. const OSSL_PARAM *params, void *construct_data);
  40. typedef void (OSSL_DESERIALIZER_CLEANUP)(void *construct_data);
  41. int OSSL_DESERIALIZER_CTX_set_construct
  42. (OSSL_DESERIALIZER_CTX *ctx, OSSL_DESERIALIZER_CONSTRUCT *construct);
  43. int OSSL_DESERIALIZER_CTX_set_construct_data
  44. (OSSL_DESERIALIZER_CTX *ctx, void *construct_data);
  45. int OSSL_DESERIALIZER_CTX_set_cleanup(OSSL_DESERIALIZER_CTX *ctx,
  46. OSSL_DESERIALIZER_CLEANUP *cleanup);
  47. OSSL_DESERIALIZER_CONSTRUCT *
  48. OSSL_DESERIALIZER_CTX_get_construct(OSSL_DESERIALIZER_CTX *ctx);
  49. void *OSSL_DESERIALIZER_CTX_get_construct_data(OSSL_DESERIALIZER_CTX *ctx);
  50. OSSL_DESERIALIZER_CLEANUP *
  51. OSSL_DESERIALIZER_CTX_get_cleanup(OSSL_DESERIALIZER_CTX *ctx);
  52. int OSSL_DESERIALIZER_export(OSSL_DESERIALIZER_INSTANCE *deser_inst,
  53. void *reference, size_t reference_sz,
  54. OSSL_CALLBACK *export_cb, void *export_cbarg);
  55. Feature availability macros:
  56. =over 4
  57. =item OSSL_DESERIALIZER_from_fp() is only available when B<OPENSSL_NO_STDIO>
  58. is undefined.
  59. =back
  60. =head1 DESCRIPTION
  61. The B<OSSL_DESERIALIZER_CTX> holds data about multiple deserializers, as
  62. needed to figure out what the input data is and to attempt to unpack it into
  63. one of several possible related results. This also includes chaining
  64. deserializers, so the output from one can become the input for another.
  65. This allows having generic format deserializers such as PEM to DER, as well
  66. as more specialized deserializers like DER to RSA.
  67. The chains may be limited by specifying an input type, which is considered a
  68. starting point.
  69. This is both considered by OSSL_DESERIALIZER_CTX_add_extra(), which will
  70. stop adding on more deserializer implementations when it has already added
  71. those that take the specified input type, and OSSL_DESERIALIZER_from_bio(),
  72. which will only start the deserializing process with the deserializer
  73. implementations that take that input type. For example, if the input type
  74. is set to C<DER>, a PEM to DER deserializer will be ignored.
  75. The input type can also be NULL, which means that the caller doesn't know
  76. what type of input they have. In this case, OSSL_DESERIALIZER_from_bio()
  77. will simply try with one deserializer implementation after the other, and
  78. thereby discover what kind of input the caller gave it.
  79. For every deserialization done, even an intermediary one, a constructor
  80. provided by the caller is called to attempt to construct an appropriate type
  81. / structure that the caller knows how to handle from the current
  82. deserialization result.
  83. The constructor is set with OSSL_DESERIALIZER_CTX_set_construct().
  84. B<OSSL_DESERIALIZER_INSTANCE> is an opaque structure that contains
  85. data about the deserializer that was just used, and that may be
  86. useful for the constructor. There are some functions to extract data
  87. from this type, described further down.
  88. =head2 Functions
  89. OSSL_DESERIALIZER_from_bio() runs the deserialization process for the
  90. context I<ctx>, with the input coming from the B<BIO> I<in>. Should
  91. it make a difference, it's recommended to have the BIO set in binary
  92. mode rather than text mode.
  93. OSSL_DESERIALIZER_from_fp() does the same thing as OSSL_DESERIALIZER_from_bio(),
  94. except that the input is coming from the B<FILE> I<fp>.
  95. OSSL_DESERIALIZER_CTX_add_deserializer() populates the B<OSSL_DESERIALIZER_CTX>
  96. I<ctx> with a deserializer, to be used to attempt to deserialize some
  97. serialized input.
  98. OSSL_DESERIALIZER_CTX_add_extra() finds deserializers that generate
  99. input for already added deserializers, and adds them as well. This is
  100. used to build deserializer chains.
  101. OSSL_DESERIALIZER_CTX_set_input_type() sets the starting input type. This
  102. limits the deserializer chains to be considered, as explained in the general
  103. description above.
  104. OSSL_DESERIALIZER_CTX_num_deserializers() gets the number of
  105. deserializers currently added to the context I<ctx>.
  106. OSSL_DESERIALIZER_CTX_set_construct() sets the constructor I<construct>.
  107. OSSL_DESERIALIZER_CTX_set_construct_data() sets the constructor data that is
  108. passed to the constructor every time it's called.
  109. OSSL_DESERIALIZER_CTX_set_cleanup() sets the constructor data I<cleanup>
  110. function. This is called by L<OSSL_DESERIALIZER_CTX_free(3)>.
  111. OSSL_DESERIALIZER_CTX_get_construct(),
  112. OSSL_DESERIALIZER_CTX_get_construct_data() and
  113. OSSL_DESERIALIZER_CTX_get_cleanup()
  114. return the values that have been set by
  115. OSSL_DESERIALIZER_CTX_set_construct(),
  116. OSSL_DESERIALIZER_CTX_set_construct_data() and
  117. OSSL_DESERIALIZER_CTX_set_cleanup() respectively.
  118. OSSL_DESERIALIZER_export() is a fallback function for constructors that
  119. cannot use the data they get directly for diverse reasons. It takes the same
  120. deserialize instance I<deser_inst> that the constructor got and an object
  121. I<reference>, unpacks the object which it refers to, and exports it by creating
  122. an L<OSSL_PARAM(3)> array that it then passes to I<export_cb>, along with
  123. I<export_arg>.
  124. OSSL_DESERIALIZER_INSTANCE_deserializer() can be used to get the
  125. deserializer method from a deserializer instance I<deser_inst>.
  126. OSSL_DESERIALIZER_INSTANCE_deserializer-ctx() can be used to get the
  127. deserializer method's provider context from a deserializer instance
  128. I<deser_inst>.
  129. =head2 Constructor
  130. A B<OSSL_DESERIALIZER_CONSTRUCT> gets the following arguments:
  131. =over 4
  132. =item I<deser_inst>
  133. The B<OSSL_DESERIALIZER_INSTANCE> for the deserializer from which
  134. the constructor gets its data.
  135. =item I<params>
  136. The data produced by the deserializer, further described below.
  137. =item I<construct_data>
  138. The pointer that was set with OSSL_DESERIALIZE_CTX_set_construct_data().
  139. =back
  140. The constructor is expected to return 1 when the data it receives can
  141. be constructed, otherwise 0.
  142. The globally known parameters that the constructor can get in I<params>
  143. are:
  144. =over 4
  145. =item "data-type" (B<OSSL_DESERIALIZER_PARAM_DATA_TYPE>) <UTF8 string>
  146. This is a detected content type that some deserializers may provide.
  147. For example, PEM input sometimes has a type specified in its header,
  148. and some deserializers may add that information as this parameter.
  149. This is an optional parameter, but may be useful for extra checks in
  150. the constructor.
  151. =item "data" (B<OSSL_DESERIALIZER_PARAM_DATA>) <octet string>
  152. The deserialized data itself, as an octet string. This is produced by
  153. deserializers when it's possible to pass an object in this form. Most
  154. often, this is simply meant to be passed to the next deserializer in a
  155. chain, but could be considered final data as well, at the discretion
  156. of the constructor.
  157. =item "reference" (B<OSSL_DESERIALIZER_PARAM_DATA>) <octet string>
  158. The deserialized data itself, as a reference to an object. The
  159. reference itself is an octet string, and can be passed to other
  160. operations and functions within the same provider as the one that
  161. provides I<deser>.
  162. =back
  163. At least one of "data" or "reference" must be present, and it's
  164. possible that both can be. A constructor should choose to use the
  165. "reference" parameter if possible, otherwise it should use the "data"
  166. parameter.
  167. If it's not possible to use the "reference" parameter, but that's
  168. still what a constructor wants to do, it is possible to use
  169. OSSL_DESERIALIZER_export() as a fallback.
  170. =head1 RETURN VALUES
  171. OSSL_DESERIALIZER_from_bio() and OSSL_DESERIALIZER_from_fp() return 1 on
  172. success, or 0 on failure.
  173. OSSL_DESERIALIZER_CTX_add_deserializer(),
  174. OSSL_DESERIALIZER_CTX_add_extra(),
  175. OSSL_DESERIALIZER_CTX_set_construct(),
  176. OSSL_DESERIALIZER_CTX_set_construct_data() and
  177. OSSL_DESERIALIZER_CTX_set_cleanup() return 1 on success, or 0 on
  178. failure.
  179. OSSL_DESERIALIZER_CTX_get_construct(),
  180. OSSL_DESERIALIZER_CTX_get_construct_data() and
  181. OSSL_DESERIALIZER_CTX_get_cleanup() return the current pointers to the
  182. cosntructor, the constructor data and the cleanup functions, respectively.
  183. OSSL_DESERIALIZER_CTX_num_deserializers() returns the current
  184. number of deserializers. It returns 0 if I<ctx> is NULL.
  185. OSSL_DESERIALIZER_export() returns 1 on success, or 0 on failure.
  186. OSSL_DESERIALIZER_INSTANCE_deserializer() returns an
  187. B<OSSL_DESERIALIZER> pointer on success, or NULL on failure.
  188. OSSL_DESERIALIZER_INSTANCE_deserializer_ctx() returns a provider
  189. context pointer on success, or NULL on failure.>
  190. =begin comment TODO(3.0) Add examples!
  191. =head1 EXAMPLES
  192. Text, because pod2xxx doesn't like empty sections
  193. =end comment
  194. =head1 SEE ALSO
  195. L<provider(7)>, L<OSSL_DESERIALIZER_CTX(3)>
  196. =head1 HISTORY
  197. The functions described here were added in OpenSSL 3.0.
  198. =head1 COPYRIGHT
  199. Copyright 2020 The OpenSSL Project Authors. All Rights Reserved.
  200. Licensed under the Apache License 2.0 (the "License"). You may not use
  201. this file except in compliance with the License. You can obtain a copy
  202. in the file LICENSE in the source distribution or at
  203. L<https://www.openssl.org/source/license.html>.
  204. =cut