provider-kem.7ossl 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. .\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42)
  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. .nr rF 0
  58. .if \n(.g .if rF .nr rF 1
  59. .if (\n(rF:(\n(.g==0)) \{\
  60. . if \nF \{\
  61. . de IX
  62. . tm Index:\\$1\t\\n%\t"\\$2"
  63. ..
  64. . if !\nF==2 \{\
  65. . nr % 0
  66. . nr F 2
  67. . \}
  68. . \}
  69. .\}
  70. .rr rF
  71. .\"
  72. .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
  73. .\" Fear. Run. Save yourself. No user-serviceable parts.
  74. . \" fudge factors for nroff and troff
  75. .if n \{\
  76. . ds #H 0
  77. . ds #V .8m
  78. . ds #F .3m
  79. . ds #[ \f1
  80. . ds #] \fP
  81. .\}
  82. .if t \{\
  83. . ds #H ((1u-(\\\\n(.fu%2u))*.13m)
  84. . ds #V .6m
  85. . ds #F 0
  86. . ds #[ \&
  87. . ds #] \&
  88. .\}
  89. . \" simple accents for nroff and troff
  90. .if n \{\
  91. . ds ' \&
  92. . ds ` \&
  93. . ds ^ \&
  94. . ds , \&
  95. . ds ~ ~
  96. . ds /
  97. .\}
  98. .if t \{\
  99. . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
  100. . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
  101. . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
  102. . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
  103. . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
  104. . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
  105. .\}
  106. . \" troff and (daisy-wheel) nroff accents
  107. .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
  108. .ds 8 \h'\*(#H'\(*b\h'-\*(#H'
  109. .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
  110. .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
  111. .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
  112. .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
  113. .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
  114. .ds ae a\h'-(\w'a'u*4/10)'e
  115. .ds Ae A\h'-(\w'A'u*4/10)'E
  116. . \" corrections for vroff
  117. .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
  118. .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
  119. . \" for low resolution devices (crt and lpr)
  120. .if \n(.H>23 .if \n(.V>19 \
  121. \{\
  122. . ds : e
  123. . ds 8 ss
  124. . ds o a
  125. . ds d- d\h'-1'\(ga
  126. . ds D- D\h'-1'\(hy
  127. . ds th \o'bp'
  128. . ds Th \o'LP'
  129. . ds ae ae
  130. . ds Ae AE
  131. .\}
  132. .rm #[ #] #H #V #F C
  133. .\" ========================================================================
  134. .\"
  135. .IX Title "PROVIDER-KEM 7ossl"
  136. .TH PROVIDER-KEM 7ossl "2024-09-03" "3.3.2" "OpenSSL"
  137. .\" For nroff, turn off justification. Always turn off hyphenation; it makes
  138. .\" way too many mistakes in technical documents.
  139. .if n .ad l
  140. .nh
  141. .SH "NAME"
  142. provider\-kem \- The kem library <\-> provider functions
  143. .SH "SYNOPSIS"
  144. .IX Header "SYNOPSIS"
  145. .Vb 2
  146. \& #include <openssl/core_dispatch.h>
  147. \& #include <openssl/core_names.h>
  148. \&
  149. \& /*
  150. \& * None of these are actual functions, but are displayed like this for
  151. \& * the function signatures for functions that are offered as function
  152. \& * pointers in OSSL_DISPATCH arrays.
  153. \& */
  154. \&
  155. \& /* Context management */
  156. \& void *OSSL_FUNC_kem_newctx(void *provctx);
  157. \& void OSSL_FUNC_kem_freectx(void *ctx);
  158. \& void *OSSL_FUNC_kem_dupctx(void *ctx);
  159. \&
  160. \& /* Encapsulation */
  161. \& int OSSL_FUNC_kem_encapsulate_init(void *ctx, void *provkey,
  162. \& const OSSL_PARAM params[]);
  163. \& int OSSL_FUNC_kem_auth_encapsulate_init(void *ctx, void *provkey,
  164. \& void *provauthkey,
  165. \& const OSSL_PARAM params[]);
  166. \& int OSSL_FUNC_kem_encapsulate(void *ctx, unsigned char *out, size_t *outlen,
  167. \& unsigned char *secret, size_t *secretlen);
  168. \&
  169. \& /* Decapsulation */
  170. \& int OSSL_FUNC_kem_decapsulate_init(void *ctx, void *provkey);
  171. \& int OSSL_FUNC_kem_auth_decapsulate_init(void *ctx, void *provkey,
  172. \& void *provauthkey,
  173. \& const OSSL_PARAM params[]);
  174. \& int OSSL_FUNC_kem_decapsulate(void *ctx, unsigned char *out, size_t *outlen,
  175. \& const unsigned char *in, size_t inlen);
  176. \&
  177. \& /* KEM parameters */
  178. \& int OSSL_FUNC_kem_get_ctx_params(void *ctx, OSSL_PARAM params[]);
  179. \& const OSSL_PARAM *OSSL_FUNC_kem_gettable_ctx_params(void *ctx, void *provctx);
  180. \& int OSSL_FUNC_kem_set_ctx_params(void *ctx, const OSSL_PARAM params[]);
  181. \& const OSSL_PARAM *OSSL_FUNC_kem_settable_ctx_params(void *ctx, void *provctx);
  182. .Ve
  183. .SH "DESCRIPTION"
  184. .IX Header "DESCRIPTION"
  185. This documentation is primarily aimed at provider authors. See \fBprovider\fR\|(7)
  186. for further information.
  187. .PP
  188. The asymmetric kem (\s-1OSSL_OP_KEM\s0) operation enables providers to
  189. implement asymmetric kem algorithms and make them available to applications
  190. via the \s-1API\s0 functions \fBEVP_PKEY_encapsulate\fR\|(3),
  191. \&\fBEVP_PKEY_decapsulate\fR\|(3) and other related functions.
  192. .PP
  193. All \*(L"functions\*(R" mentioned here are passed as function pointers between
  194. \&\fIlibcrypto\fR and the provider in \s-1\fBOSSL_DISPATCH\s0\fR\|(3) arrays via
  195. \&\s-1\fBOSSL_ALGORITHM\s0\fR\|(3) arrays that are returned by the provider's
  196. \&\fBprovider_query_operation()\fR function
  197. (see \*(L"Provider Functions\*(R" in \fBprovider\-base\fR\|(7)).
  198. .PP
  199. All these \*(L"functions\*(R" have a corresponding function type definition
  200. named \fBOSSL_FUNC_{name}_fn\fR, and a helper function to retrieve the
  201. function pointer from an \s-1\fBOSSL_DISPATCH\s0\fR\|(3) element named
  202. \&\fBOSSL_FUNC_{name}\fR.
  203. For example, the \*(L"function\*(R" \fBOSSL_FUNC_kem_newctx()\fR has these:
  204. .PP
  205. .Vb 3
  206. \& typedef void *(OSSL_FUNC_kem_newctx_fn)(void *provctx);
  207. \& static ossl_inline OSSL_FUNC_kem_newctx_fn
  208. \& OSSL_FUNC_kem_newctx(const OSSL_DISPATCH *opf);
  209. .Ve
  210. .PP
  211. \&\s-1\fBOSSL_DISPATCH\s0\fR\|(3) arrays are indexed by numbers that are provided as
  212. macros in \fBopenssl\-core_dispatch.h\fR\|(7), as follows:
  213. .PP
  214. .Vb 3
  215. \& OSSL_FUNC_kem_newctx OSSL_FUNC_KEM_NEWCTX
  216. \& OSSL_FUNC_kem_freectx OSSL_FUNC_KEM_FREECTX
  217. \& OSSL_FUNC_kem_dupctx OSSL_FUNC_KEM_DUPCTX
  218. \&
  219. \& OSSL_FUNC_kem_encapsulate_init OSSL_FUNC_KEM_ENCAPSULATE_INIT
  220. \& OSSL_FUNC_kem_auth_encapsulate_init OSSL_FUNC_KEM_AUTH_ENCAPSULATE_INIT
  221. \& OSSL_FUNC_kem_encapsulate OSSL_FUNC_KEM_ENCAPSULATE
  222. \&
  223. \& OSSL_FUNC_kem_decapsulate_init OSSL_FUNC_KEM_DECAPSULATE_INIT
  224. \& OSSL_FUNC_kem_auth_decapsulate_init OSSL_FUNC_KEM_AUTH_DECAPSULATE_INIT
  225. \& OSSL_FUNC_kem_decapsulate OSSL_FUNC_KEM_DECAPSULATE
  226. \&
  227. \& OSSL_FUNC_kem_get_ctx_params OSSL_FUNC_KEM_GET_CTX_PARAMS
  228. \& OSSL_FUNC_kem_gettable_ctx_params OSSL_FUNC_KEM_GETTABLE_CTX_PARAMS
  229. \& OSSL_FUNC_kem_set_ctx_params OSSL_FUNC_KEM_SET_CTX_PARAMS
  230. \& OSSL_FUNC_kem_settable_ctx_params OSSL_FUNC_KEM_SETTABLE_CTX_PARAMS
  231. .Ve
  232. .PP
  233. An asymmetric kem algorithm implementation may not implement all of these
  234. functions.
  235. In order to be a consistent set of functions a provider must implement
  236. OSSL_FUNC_kem_newctx and OSSL_FUNC_kem_freectx.
  237. It must also implement both of OSSL_FUNC_kem_encapsulate_init and
  238. OSSL_FUNC_kem_encapsulate, or both of OSSL_FUNC_kem_decapsulate_init and
  239. OSSL_FUNC_kem_decapsulate.
  240. OSSL_FUNC_kem_auth_encapsulate_init is optional but if it is present then so
  241. must OSSL_FUNC_kem_auth_decapsulate_init.
  242. OSSL_FUNC_kem_get_ctx_params is optional but if it is present then so must
  243. OSSL_FUNC_kem_gettable_ctx_params.
  244. Similarly, OSSL_FUNC_kem_set_ctx_params is optional but if it is present then
  245. OSSL_FUNC_kem_settable_ctx_params must also be present.
  246. .PP
  247. An asymmetric kem algorithm must also implement some mechanism for generating,
  248. loading or importing keys via the key management (\s-1OSSL_OP_KEYMGMT\s0) operation.
  249. See \fBprovider\-keymgmt\fR\|(7) for further details.
  250. .SS "Context Management Functions"
  251. .IX Subsection "Context Management Functions"
  252. \&\fBOSSL_FUNC_kem_newctx()\fR should create and return a pointer to a provider side
  253. structure for holding context information during an asymmetric kem operation.
  254. A pointer to this context will be passed back in a number of the other
  255. asymmetric kem operation function calls.
  256. The parameter \fIprovctx\fR is the provider context generated during provider
  257. initialisation (see \fBprovider\fR\|(7)).
  258. .PP
  259. \&\fBOSSL_FUNC_kem_freectx()\fR is passed a pointer to the provider side asymmetric
  260. kem context in the \fIctx\fR parameter.
  261. This function should free any resources associated with that context.
  262. .PP
  263. \&\fBOSSL_FUNC_kem_dupctx()\fR should duplicate the provider side asymmetric kem
  264. context in the \fIctx\fR parameter and return the duplicate copy.
  265. .SS "Asymmetric Key Encapsulation Functions"
  266. .IX Subsection "Asymmetric Key Encapsulation Functions"
  267. \&\fBOSSL_FUNC_kem_encapsulate_init()\fR initialises a context for an asymmetric
  268. encapsulation given a provider side asymmetric kem context in the \fIctx\fR
  269. parameter, a pointer to a provider key object in the \fIprovkey\fR parameter and
  270. the \fIname\fR of the algorithm.
  271. The \fIparams\fR, if not \s-1NULL,\s0 should be set on the context in a manner similar to
  272. using \fBOSSL_FUNC_kem_set_ctx_params()\fR.
  273. The key object should have been previously generated, loaded or imported into
  274. the provider using the key management (\s-1OSSL_OP_KEYMGMT\s0) operation (see
  275. \&\fBprovider\-keymgmt\fR\|(7)>.
  276. .PP
  277. \&\fBOSSL_FUNC_kem_auth_encapsulate_init()\fR is similar to
  278. \&\fBOSSL_FUNC_kem_encapsulate_init()\fR, but also passes an additional authentication
  279. key \fIprovauthkey\fR which cannot be \s-1NULL.\s0
  280. .PP
  281. \&\fBOSSL_FUNC_kem_encapsulate()\fR performs the actual encapsulation itself.
  282. A previously initialised asymmetric kem context is passed in the \fIctx\fR
  283. parameter.
  284. Unless \fIout\fR is \s-1NULL,\s0 the data to be encapsulated is internally generated,
  285. and returned into the buffer pointed to by the \fIsecret\fR parameter and the
  286. encapsulated data should also be written to the location pointed to by the
  287. \&\fIout\fR parameter. The length of the encapsulated data should be written to
  288. \&\fI*outlen\fR and the length of the generated secret should be written to
  289. \&\fI*secretlen\fR.
  290. .PP
  291. If \fIout\fR is \s-1NULL\s0 then the maximum length of the encapsulated data should be
  292. written to \fI*outlen\fR, and the maximum length of the generated secret should be
  293. written to \fI*secretlen\fR.
  294. .SS "Decapsulation Functions"
  295. .IX Subsection "Decapsulation Functions"
  296. \&\fBOSSL_FUNC_kem_decapsulate_init()\fR initialises a context for an asymmetric
  297. decapsulation given a provider side asymmetric kem context in the \fIctx\fR
  298. parameter, a pointer to a provider key object in the \fIprovkey\fR parameter, and
  299. a \fIname\fR of the algorithm.
  300. The key object should have been previously generated, loaded or imported into
  301. the provider using the key management (\s-1OSSL_OP_KEYMGMT\s0) operation (see
  302. \&\fBprovider\-keymgmt\fR\|(7)>.
  303. .PP
  304. \&\fBOSSL_FUNC_kem_auth_decapsulate_init()\fR is similar to
  305. \&\fBOSSL_FUNC_kem_decapsulate_init()\fR, but also passes an additional authentication
  306. key \fIprovauthkey\fR which cannot be \s-1NULL.\s0
  307. .PP
  308. \&\fBOSSL_FUNC_kem_decapsulate()\fR performs the actual decapsulation itself.
  309. A previously initialised asymmetric kem context is passed in the \fIctx\fR
  310. parameter.
  311. The data to be decapsulated is pointed to by the \fIin\fR parameter which is \fIinlen\fR
  312. bytes long.
  313. Unless \fIout\fR is \s-1NULL,\s0 the decapsulated data should be written to the location
  314. pointed to by the \fIout\fR parameter.
  315. The length of the decapsulated data should be written to \fI*outlen\fR.
  316. If \fIout\fR is \s-1NULL\s0 then the maximum length of the decapsulated data should be
  317. written to \fI*outlen\fR.
  318. .SS "Asymmetric Key Encapsulation Parameters"
  319. .IX Subsection "Asymmetric Key Encapsulation Parameters"
  320. See \s-1\fBOSSL_PARAM\s0\fR\|(3) for further details on the parameters structure used by
  321. the \fBOSSL_FUNC_kem_get_ctx_params()\fR and \fBOSSL_FUNC_kem_set_ctx_params()\fR
  322. functions.
  323. .PP
  324. \&\fBOSSL_FUNC_kem_get_ctx_params()\fR gets asymmetric kem parameters associated
  325. with the given provider side asymmetric kem context \fIctx\fR and stores them in
  326. \&\fIparams\fR.
  327. Passing \s-1NULL\s0 for \fIparams\fR should return true.
  328. .PP
  329. \&\fBOSSL_FUNC_kem_set_ctx_params()\fR sets the asymmetric kem parameters associated
  330. with the given provider side asymmetric kem context \fIctx\fR to \fIparams\fR.
  331. Any parameter settings are additional to any that were previously set.
  332. Passing \s-1NULL\s0 for \fIparams\fR should return true.
  333. .PP
  334. No parameters are currently recognised by built-in asymmetric kem algorithms.
  335. .PP
  336. \&\fBOSSL_FUNC_kem_gettable_ctx_params()\fR and \fBOSSL_FUNC_kem_settable_ctx_params()\fR
  337. get a constant \s-1\fBOSSL_PARAM\s0\fR\|(3) array that describes the gettable and settable
  338. parameters, i.e. parameters that can be used with \fBOSSL_FUNC_kem_get_ctx_params()\fR
  339. and \fBOSSL_FUNC_kem_set_ctx_params()\fR respectively.
  340. .SH "RETURN VALUES"
  341. .IX Header "RETURN VALUES"
  342. \&\fBOSSL_FUNC_kem_newctx()\fR and \fBOSSL_FUNC_kem_dupctx()\fR should return the newly
  343. created provider side asymmetric kem context, or \s-1NULL\s0 on failure.
  344. .PP
  345. All other functions should return 1 for success or 0 on error.
  346. .SH "SEE ALSO"
  347. .IX Header "SEE ALSO"
  348. \&\fBprovider\fR\|(7)
  349. .SH "HISTORY"
  350. .IX Header "HISTORY"
  351. The provider \s-1KEM\s0 interface was introduced in OpenSSL 3.0.
  352. .PP
  353. \&\fBOSSL_FUNC_kem_auth_encapsulate_init()\fR and \fBOSSL_FUNC_kem_auth_decapsulate_init()\fR
  354. were added in OpenSSL 3.2.
  355. .SH "COPYRIGHT"
  356. .IX Header "COPYRIGHT"
  357. Copyright 2020\-2023 The OpenSSL Project Authors. All Rights Reserved.
  358. .PP
  359. Licensed under the Apache License 2.0 (the \*(L"License\*(R"). You may not use
  360. this file except in compliance with the License. You can obtain a copy
  361. in the file \s-1LICENSE\s0 in the source distribution or at
  362. <https://www.openssl.org/source/license.html>.