encode_key2any.c 65 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764
  1. /*
  2. * Copyright 2020-2025 The OpenSSL Project Authors. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License 2.0 (the "License"). You may not use
  5. * this file except in compliance with the License. You can obtain a copy
  6. * in the file LICENSE in the source distribution or at
  7. * https://www.openssl.org/source/license.html
  8. */
  9. /*
  10. * Low level APIs are deprecated for public use, but still ok for internal use.
  11. */
  12. #include "internal/deprecated.h"
  13. #include <openssl/byteorder.h>
  14. #include <openssl/core.h>
  15. #include <openssl/core_dispatch.h>
  16. #include <openssl/core_names.h>
  17. #include <openssl/crypto.h>
  18. #include <openssl/params.h>
  19. #include <openssl/asn1.h>
  20. #include <openssl/err.h>
  21. #include <openssl/pem.h>
  22. #include <openssl/x509.h>
  23. #include <openssl/pkcs12.h> /* PKCS8_encrypt() */
  24. #include <openssl/dh.h>
  25. #include <openssl/dsa.h>
  26. #include <openssl/ec.h>
  27. #include <openssl/proverr.h>
  28. #include "internal/passphrase.h"
  29. #include "internal/cryptlib.h"
  30. #include "crypto/ecx.h"
  31. #include "crypto/ml_kem.h"
  32. #include "crypto/rsa.h"
  33. #include "crypto/ml_dsa.h"
  34. #include "crypto/slh_dsa.h"
  35. #include "prov/implementations.h"
  36. #include "prov/bio.h"
  37. #include "prov/provider_ctx.h"
  38. #include "prov/der_rsa.h"
  39. #include "endecoder_local.h"
  40. #include "ml_dsa_codecs.h"
  41. #include "ml_kem_codecs.h"
  42. #if defined(OPENSSL_NO_DH) && defined(OPENSSL_NO_DSA) && defined(OPENSSL_NO_EC)
  43. # define OPENSSL_NO_KEYPARAMS
  44. #endif
  45. typedef struct key2any_ctx_st {
  46. PROV_CTX *provctx;
  47. /* Set to 0 if parameters should not be saved (dsa only) */
  48. int save_parameters;
  49. /* Set to 1 if intending to encrypt/decrypt, otherwise 0 */
  50. int cipher_intent;
  51. EVP_CIPHER *cipher;
  52. struct ossl_passphrase_data_st pwdata;
  53. } KEY2ANY_CTX;
  54. typedef int check_key_type_fn(const void *key, int nid);
  55. typedef int key_to_paramstring_fn(const void *key, int nid, int save,
  56. void **str, int *strtype);
  57. typedef int key_to_der_fn(BIO *out, const void *key,
  58. int key_nid, const char *pemname,
  59. key_to_paramstring_fn *p2s,
  60. OSSL_i2d_of_void_ctx *k2d, KEY2ANY_CTX *ctx);
  61. typedef int write_bio_of_void_fn(BIO *bp, const void *x);
  62. /* Free the blob allocated during key_to_paramstring_fn */
  63. static void free_asn1_data(int type, void *data)
  64. {
  65. switch (type) {
  66. case V_ASN1_OBJECT:
  67. ASN1_OBJECT_free(data);
  68. break;
  69. case V_ASN1_SEQUENCE:
  70. ASN1_STRING_free(data);
  71. break;
  72. }
  73. }
  74. static PKCS8_PRIV_KEY_INFO *key_to_p8info(const void *key, int key_nid,
  75. void *params, int params_type,
  76. OSSL_i2d_of_void_ctx *k2d,
  77. KEY2ANY_CTX *ctx)
  78. {
  79. /* der, derlen store the key DER output and its length */
  80. unsigned char *der = NULL;
  81. int derlen;
  82. /* The final PKCS#8 info */
  83. PKCS8_PRIV_KEY_INFO *p8info = NULL;
  84. if ((p8info = PKCS8_PRIV_KEY_INFO_new()) == NULL
  85. || (derlen = k2d(key, &der, (void *)ctx)) <= 0
  86. || !PKCS8_pkey_set0(p8info, OBJ_nid2obj(key_nid), 0,
  87. params_type, params, der, derlen)) {
  88. ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);
  89. PKCS8_PRIV_KEY_INFO_free(p8info);
  90. OPENSSL_free(der);
  91. p8info = NULL;
  92. }
  93. return p8info;
  94. }
  95. static X509_SIG *p8info_to_encp8(PKCS8_PRIV_KEY_INFO *p8info,
  96. KEY2ANY_CTX *ctx)
  97. {
  98. X509_SIG *p8 = NULL;
  99. char kstr[PEM_BUFSIZE];
  100. size_t klen = 0;
  101. OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);
  102. if (ctx->cipher == NULL)
  103. return NULL;
  104. if (!ossl_pw_get_passphrase(kstr, sizeof(kstr), &klen, NULL, 1,
  105. &ctx->pwdata)) {
  106. ERR_raise(ERR_LIB_PROV, PROV_R_UNABLE_TO_GET_PASSPHRASE);
  107. return NULL;
  108. }
  109. /* First argument == -1 means "standard" */
  110. p8 = PKCS8_encrypt_ex(-1, ctx->cipher, kstr, klen, NULL, 0, 0, p8info, libctx, NULL);
  111. OPENSSL_cleanse(kstr, klen);
  112. return p8;
  113. }
  114. static X509_SIG *key_to_encp8(const void *key, int key_nid,
  115. void *params, int params_type,
  116. OSSL_i2d_of_void_ctx *k2d,
  117. KEY2ANY_CTX *ctx)
  118. {
  119. PKCS8_PRIV_KEY_INFO *p8info =
  120. key_to_p8info(key, key_nid, params, params_type, k2d, ctx);
  121. X509_SIG *p8 = NULL;
  122. if (p8info == NULL) {
  123. free_asn1_data(params_type, params);
  124. } else {
  125. p8 = p8info_to_encp8(p8info, ctx);
  126. PKCS8_PRIV_KEY_INFO_free(p8info);
  127. }
  128. return p8;
  129. }
  130. static X509_PUBKEY *key_to_pubkey(const void *key, int key_nid,
  131. void *params, int params_type,
  132. OSSL_i2d_of_void_ctx *k2d,
  133. KEY2ANY_CTX *ctx)
  134. {
  135. /* der, derlen store the key DER output and its length */
  136. unsigned char *der = NULL;
  137. int derlen;
  138. /* The final X509_PUBKEY */
  139. X509_PUBKEY *xpk = NULL;
  140. if ((xpk = X509_PUBKEY_new()) == NULL
  141. || (derlen = k2d(key, &der, (void *)ctx)) <= 0
  142. || !X509_PUBKEY_set0_param(xpk, OBJ_nid2obj(key_nid),
  143. params_type, params, der, derlen)) {
  144. ERR_raise(ERR_LIB_PROV, ERR_R_X509_LIB);
  145. X509_PUBKEY_free(xpk);
  146. OPENSSL_free(der);
  147. xpk = NULL;
  148. }
  149. return xpk;
  150. }
  151. /*
  152. * key_to_epki_* produce encoded output with the private key data in a
  153. * EncryptedPrivateKeyInfo structure (defined by PKCS#8). They require
  154. * that there's an intent to encrypt, anything else is an error.
  155. *
  156. * key_to_pki_* primarily produce encoded output with the private key data
  157. * in a PrivateKeyInfo structure (also defined by PKCS#8). However, if
  158. * there is an intent to encrypt the data, the corresponding key_to_epki_*
  159. * function is used instead.
  160. *
  161. * key_to_spki_* produce encoded output with the public key data in an
  162. * X.509 SubjectPublicKeyInfo.
  163. *
  164. * Key parameters don't have any defined envelopment of this kind, but are
  165. * included in some manner in the output from the functions described above,
  166. * either in the AlgorithmIdentifier's parameter field, or as part of the
  167. * key data itself.
  168. */
  169. static int key_to_epki_der_priv_bio(BIO *out, const void *key,
  170. int key_nid,
  171. ossl_unused const char *pemname,
  172. key_to_paramstring_fn *p2s,
  173. OSSL_i2d_of_void_ctx *k2d,
  174. KEY2ANY_CTX *ctx)
  175. {
  176. int ret = 0;
  177. void *str = NULL;
  178. int strtype = V_ASN1_UNDEF;
  179. X509_SIG *p8;
  180. if (!ctx->cipher_intent)
  181. return 0;
  182. if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters,
  183. &str, &strtype))
  184. return 0;
  185. p8 = key_to_encp8(key, key_nid, str, strtype, k2d, ctx);
  186. if (p8 != NULL)
  187. ret = i2d_PKCS8_bio(out, p8);
  188. X509_SIG_free(p8);
  189. return ret;
  190. }
  191. static int key_to_epki_pem_priv_bio(BIO *out, const void *key,
  192. int key_nid,
  193. ossl_unused const char *pemname,
  194. key_to_paramstring_fn *p2s,
  195. OSSL_i2d_of_void_ctx *k2d,
  196. KEY2ANY_CTX *ctx)
  197. {
  198. int ret = 0;
  199. void *str = NULL;
  200. int strtype = V_ASN1_UNDEF;
  201. X509_SIG *p8;
  202. if (!ctx->cipher_intent)
  203. return 0;
  204. if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters,
  205. &str, &strtype))
  206. return 0;
  207. p8 = key_to_encp8(key, key_nid, str, strtype, k2d, ctx);
  208. if (p8 != NULL)
  209. ret = PEM_write_bio_PKCS8(out, p8);
  210. X509_SIG_free(p8);
  211. return ret;
  212. }
  213. static int key_to_pki_der_priv_bio(BIO *out, const void *key,
  214. int key_nid,
  215. ossl_unused const char *pemname,
  216. key_to_paramstring_fn *p2s,
  217. OSSL_i2d_of_void_ctx *k2d,
  218. KEY2ANY_CTX *ctx)
  219. {
  220. int ret = 0;
  221. void *str = NULL;
  222. int strtype = V_ASN1_UNDEF;
  223. PKCS8_PRIV_KEY_INFO *p8info;
  224. if (ctx->cipher_intent)
  225. return key_to_epki_der_priv_bio(out, key, key_nid, pemname,
  226. p2s, k2d, ctx);
  227. if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters,
  228. &str, &strtype))
  229. return 0;
  230. p8info = key_to_p8info(key, key_nid, str, strtype, k2d, ctx);
  231. if (p8info != NULL)
  232. ret = i2d_PKCS8_PRIV_KEY_INFO_bio(out, p8info);
  233. else
  234. free_asn1_data(strtype, str);
  235. PKCS8_PRIV_KEY_INFO_free(p8info);
  236. return ret;
  237. }
  238. static int key_to_pki_pem_priv_bio(BIO *out, const void *key,
  239. int key_nid,
  240. ossl_unused const char *pemname,
  241. key_to_paramstring_fn *p2s,
  242. OSSL_i2d_of_void_ctx *k2d,
  243. KEY2ANY_CTX *ctx)
  244. {
  245. int ret = 0;
  246. void *str = NULL;
  247. int strtype = V_ASN1_UNDEF;
  248. PKCS8_PRIV_KEY_INFO *p8info;
  249. if (ctx->cipher_intent)
  250. return key_to_epki_pem_priv_bio(out, key, key_nid, pemname,
  251. p2s, k2d, ctx);
  252. if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters,
  253. &str, &strtype))
  254. return 0;
  255. p8info = key_to_p8info(key, key_nid, str, strtype, k2d, ctx);
  256. if (p8info != NULL)
  257. ret = PEM_write_bio_PKCS8_PRIV_KEY_INFO(out, p8info);
  258. else
  259. free_asn1_data(strtype, str);
  260. PKCS8_PRIV_KEY_INFO_free(p8info);
  261. return ret;
  262. }
  263. static int key_to_spki_der_pub_bio(BIO *out, const void *key,
  264. int key_nid,
  265. ossl_unused const char *pemname,
  266. key_to_paramstring_fn *p2s,
  267. OSSL_i2d_of_void_ctx *k2d,
  268. KEY2ANY_CTX *ctx)
  269. {
  270. int ret = 0;
  271. void *str = NULL;
  272. int strtype = V_ASN1_UNDEF;
  273. X509_PUBKEY *xpk = NULL;
  274. if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters,
  275. &str, &strtype))
  276. return 0;
  277. xpk = key_to_pubkey(key, key_nid, str, strtype, k2d, ctx);
  278. if (xpk != NULL)
  279. ret = i2d_X509_PUBKEY_bio(out, xpk);
  280. /* Also frees |str| */
  281. X509_PUBKEY_free(xpk);
  282. return ret;
  283. }
  284. static int key_to_spki_pem_pub_bio(BIO *out, const void *key,
  285. int key_nid,
  286. ossl_unused const char *pemname,
  287. key_to_paramstring_fn *p2s,
  288. OSSL_i2d_of_void_ctx *k2d,
  289. KEY2ANY_CTX *ctx)
  290. {
  291. int ret = 0;
  292. void *str = NULL;
  293. int strtype = V_ASN1_UNDEF;
  294. X509_PUBKEY *xpk = NULL;
  295. if (p2s != NULL && !p2s(key, key_nid, ctx->save_parameters,
  296. &str, &strtype))
  297. return 0;
  298. xpk = key_to_pubkey(key, key_nid, str, strtype, k2d, ctx);
  299. if (xpk != NULL)
  300. ret = PEM_write_bio_X509_PUBKEY(out, xpk);
  301. else
  302. free_asn1_data(strtype, str);
  303. /* Also frees |str| */
  304. X509_PUBKEY_free(xpk);
  305. return ret;
  306. }
  307. /*
  308. * key_to_type_specific_* produce encoded output with type specific key data,
  309. * no envelopment; the same kind of output as the type specific i2d_ and
  310. * PEM_write_ functions, which is often a simple SEQUENCE of INTEGER.
  311. *
  312. * OpenSSL tries to discourage production of new keys in this form, because
  313. * of the ambiguity when trying to recognise them, but can't deny that PKCS#1
  314. * et al still are live standards.
  315. *
  316. * Note that these functions completely ignore p2s, and rather rely entirely
  317. * on k2d to do the complete work.
  318. */
  319. static int key_to_type_specific_der_bio(BIO *out, const void *key,
  320. int key_nid,
  321. ossl_unused const char *pemname,
  322. key_to_paramstring_fn *p2s,
  323. OSSL_i2d_of_void_ctx *k2d,
  324. KEY2ANY_CTX *ctx)
  325. {
  326. unsigned char *der = NULL;
  327. int derlen;
  328. int ret;
  329. if ((derlen = k2d(key, &der, (void *)ctx)) <= 0) {
  330. ERR_raise(ERR_LIB_PROV, ERR_R_PROV_LIB);
  331. return 0;
  332. }
  333. ret = BIO_write(out, der, derlen);
  334. OPENSSL_free(der);
  335. return ret > 0;
  336. }
  337. #define key_to_type_specific_der_priv_bio key_to_type_specific_der_bio
  338. #define key_to_type_specific_der_pub_bio key_to_type_specific_der_bio
  339. #define key_to_type_specific_der_param_bio key_to_type_specific_der_bio
  340. static int key_to_type_specific_pem_bio_cb(BIO *out, const void *key,
  341. int key_nid, const char *pemname,
  342. key_to_paramstring_fn *p2s,
  343. OSSL_i2d_of_void_ctx *k2d,
  344. KEY2ANY_CTX *ctx,
  345. pem_password_cb *cb, void *cbarg)
  346. {
  347. return PEM_ASN1_write_bio_ctx(k2d, (void *)ctx, pemname, out, key,
  348. ctx->cipher, NULL, 0, cb, cbarg) > 0;
  349. }
  350. static int key_to_type_specific_pem_priv_bio(BIO *out, const void *key,
  351. int key_nid, const char *pemname,
  352. key_to_paramstring_fn *p2s,
  353. OSSL_i2d_of_void_ctx *k2d,
  354. KEY2ANY_CTX *ctx)
  355. {
  356. return key_to_type_specific_pem_bio_cb(out, key, key_nid, pemname,
  357. p2s, k2d, ctx,
  358. ossl_pw_pem_password, &ctx->pwdata);
  359. }
  360. static int key_to_type_specific_pem_pub_bio(BIO *out, const void *key,
  361. int key_nid, const char *pemname,
  362. key_to_paramstring_fn *p2s,
  363. OSSL_i2d_of_void_ctx *k2d,
  364. KEY2ANY_CTX *ctx)
  365. {
  366. return key_to_type_specific_pem_bio_cb(out, key, key_nid, pemname,
  367. p2s, k2d, ctx, NULL, NULL);
  368. }
  369. #ifndef OPENSSL_NO_KEYPARAMS
  370. static int key_to_type_specific_pem_param_bio(BIO *out, const void *key,
  371. int key_nid, const char *pemname,
  372. key_to_paramstring_fn *p2s,
  373. OSSL_i2d_of_void_ctx *k2d,
  374. KEY2ANY_CTX *ctx)
  375. {
  376. return key_to_type_specific_pem_bio_cb(out, key, key_nid, pemname,
  377. p2s, k2d, ctx, NULL, NULL);
  378. }
  379. #endif
  380. /* ---------------------------------------------------------------------- */
  381. #define k2d_NOCTX(n, f) \
  382. static int \
  383. n##_k2d(const void *key, unsigned char **pder, \
  384. ossl_unused void *ctx) \
  385. { \
  386. return f(key, pder); \
  387. }
  388. /* ---------------------------------------------------------------------- */
  389. #ifndef OPENSSL_NO_DH
  390. static int prepare_dh_params(const void *dh, int nid, int save,
  391. void **pstr, int *pstrtype)
  392. {
  393. ASN1_STRING *params = ASN1_STRING_new();
  394. if (params == NULL) {
  395. ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);
  396. return 0;
  397. }
  398. if (nid == EVP_PKEY_DHX)
  399. params->length = i2d_DHxparams(dh, &params->data);
  400. else
  401. params->length = i2d_DHparams(dh, &params->data);
  402. if (params->length <= 0) {
  403. ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);
  404. ASN1_STRING_free(params);
  405. return 0;
  406. }
  407. params->type = V_ASN1_SEQUENCE;
  408. *pstr = params;
  409. *pstrtype = V_ASN1_SEQUENCE;
  410. return 1;
  411. }
  412. static int dh_spki_pub_to_der(const void *dh, unsigned char **pder,
  413. ossl_unused void *ctx)
  414. {
  415. const BIGNUM *bn = NULL;
  416. ASN1_INTEGER *pub_key = NULL;
  417. int ret;
  418. if ((bn = DH_get0_pub_key(dh)) == NULL) {
  419. ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PUBLIC_KEY);
  420. return 0;
  421. }
  422. if ((pub_key = BN_to_ASN1_INTEGER(bn, NULL)) == NULL) {
  423. ERR_raise(ERR_LIB_PROV, PROV_R_BN_ERROR);
  424. return 0;
  425. }
  426. ret = i2d_ASN1_INTEGER(pub_key, pder);
  427. ASN1_STRING_clear_free(pub_key);
  428. return ret;
  429. }
  430. static int dh_pki_priv_to_der(const void *dh, unsigned char **pder,
  431. ossl_unused void *ctx)
  432. {
  433. const BIGNUM *bn = NULL;
  434. ASN1_INTEGER *priv_key = NULL;
  435. int ret;
  436. if ((bn = DH_get0_priv_key(dh)) == NULL) {
  437. ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PRIVATE_KEY);
  438. return 0;
  439. }
  440. if ((priv_key = BN_to_ASN1_INTEGER(bn, NULL)) == NULL) {
  441. ERR_raise(ERR_LIB_PROV, PROV_R_BN_ERROR);
  442. return 0;
  443. }
  444. ret = i2d_ASN1_INTEGER(priv_key, pder);
  445. ASN1_STRING_clear_free(priv_key);
  446. return ret;
  447. }
  448. # define dh_epki_priv_to_der dh_pki_priv_to_der
  449. static int
  450. dh_type_specific_params_to_der(const void *dh, unsigned char **pder,
  451. ossl_unused void *ctx)
  452. {
  453. if (DH_test_flags(dh, DH_FLAG_TYPE_DHX))
  454. return i2d_DHxparams(dh, pder);
  455. return i2d_DHparams(dh, pder);
  456. }
  457. /*
  458. * DH doesn't have i2d_DHPrivateKey or i2d_DHPublicKey, so we can't make
  459. * corresponding functions here.
  460. */
  461. # define dh_type_specific_priv_to_der NULL
  462. # define dh_type_specific_pub_to_der NULL
  463. static int dh_check_key_type(const void *dh, int expected_type)
  464. {
  465. int type =
  466. DH_test_flags(dh, DH_FLAG_TYPE_DHX) ? EVP_PKEY_DHX : EVP_PKEY_DH;
  467. return type == expected_type;
  468. }
  469. # define dh_evp_type EVP_PKEY_DH
  470. # define dhx_evp_type EVP_PKEY_DHX
  471. # define dh_pem_type "DH"
  472. # define dhx_pem_type "X9.42 DH"
  473. #endif
  474. /* ---------------------------------------------------------------------- */
  475. #ifndef OPENSSL_NO_DSA
  476. static int encode_dsa_params(const void *dsa, int nid,
  477. void **pstr, int *pstrtype)
  478. {
  479. ASN1_STRING *params = ASN1_STRING_new();
  480. if (params == NULL) {
  481. ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);
  482. return 0;
  483. }
  484. params->length = i2d_DSAparams(dsa, &params->data);
  485. if (params->length <= 0) {
  486. ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);
  487. ASN1_STRING_free(params);
  488. return 0;
  489. }
  490. *pstrtype = V_ASN1_SEQUENCE;
  491. *pstr = params;
  492. return 1;
  493. }
  494. static int prepare_dsa_params(const void *dsa, int nid, int save,
  495. void **pstr, int *pstrtype)
  496. {
  497. const BIGNUM *p = DSA_get0_p(dsa);
  498. const BIGNUM *q = DSA_get0_q(dsa);
  499. const BIGNUM *g = DSA_get0_g(dsa);
  500. if (save && p != NULL && q != NULL && g != NULL)
  501. return encode_dsa_params(dsa, nid, pstr, pstrtype);
  502. *pstr = NULL;
  503. *pstrtype = V_ASN1_UNDEF;
  504. return 1;
  505. }
  506. static int dsa_spki_pub_to_der(const void *dsa, unsigned char **pder,
  507. ossl_unused void *ctx)
  508. {
  509. const BIGNUM *bn = NULL;
  510. ASN1_INTEGER *pub_key = NULL;
  511. int ret;
  512. if ((bn = DSA_get0_pub_key(dsa)) == NULL) {
  513. ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PUBLIC_KEY);
  514. return 0;
  515. }
  516. if ((pub_key = BN_to_ASN1_INTEGER(bn, NULL)) == NULL) {
  517. ERR_raise(ERR_LIB_PROV, PROV_R_BN_ERROR);
  518. return 0;
  519. }
  520. ret = i2d_ASN1_INTEGER(pub_key, pder);
  521. ASN1_STRING_clear_free(pub_key);
  522. return ret;
  523. }
  524. static int dsa_pki_priv_to_der(const void *dsa, unsigned char **pder,
  525. ossl_unused void *ctx)
  526. {
  527. const BIGNUM *bn = NULL;
  528. ASN1_INTEGER *priv_key = NULL;
  529. int ret;
  530. if ((bn = DSA_get0_priv_key(dsa)) == NULL) {
  531. ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PRIVATE_KEY);
  532. return 0;
  533. }
  534. if ((priv_key = BN_to_ASN1_INTEGER(bn, NULL)) == NULL) {
  535. ERR_raise(ERR_LIB_PROV, PROV_R_BN_ERROR);
  536. return 0;
  537. }
  538. ret = i2d_ASN1_INTEGER(priv_key, pder);
  539. ASN1_STRING_clear_free(priv_key);
  540. return ret;
  541. }
  542. k2d_NOCTX(dsa_prv, i2d_DSAPrivateKey)
  543. k2d_NOCTX(dsa_pub, i2d_DSAPublicKey)
  544. k2d_NOCTX(dsa_param, i2d_DSAparams)
  545. # define dsa_epki_priv_to_der dsa_pki_priv_to_der
  546. # define dsa_type_specific_priv_to_der dsa_prv_k2d
  547. # define dsa_type_specific_pub_to_der dsa_pub_k2d
  548. # define dsa_type_specific_params_to_der dsa_param_k2d
  549. # define dsa_check_key_type NULL
  550. # define dsa_evp_type EVP_PKEY_DSA
  551. # define dsa_pem_type "DSA"
  552. #endif
  553. /* ---------------------------------------------------------------------- */
  554. #ifndef OPENSSL_NO_EC
  555. static int prepare_ec_explicit_params(const void *eckey,
  556. void **pstr, int *pstrtype)
  557. {
  558. ASN1_STRING *params = ASN1_STRING_new();
  559. if (params == NULL) {
  560. ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);
  561. return 0;
  562. }
  563. params->length = i2d_ECParameters(eckey, &params->data);
  564. if (params->length <= 0) {
  565. ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);
  566. ASN1_STRING_free(params);
  567. return 0;
  568. }
  569. *pstrtype = V_ASN1_SEQUENCE;
  570. *pstr = params;
  571. return 1;
  572. }
  573. /*
  574. * This implements EcpkParameters, where the CHOICE is based on whether there
  575. * is a curve name (curve nid) to be found or not. See RFC 3279 for details.
  576. */
  577. static int prepare_ec_params(const void *eckey, int nid, int save,
  578. void **pstr, int *pstrtype)
  579. {
  580. int curve_nid;
  581. const EC_GROUP *group = EC_KEY_get0_group(eckey);
  582. ASN1_OBJECT *params = NULL;
  583. if (group == NULL)
  584. return 0;
  585. curve_nid = EC_GROUP_get_curve_name(group);
  586. if (curve_nid != NID_undef) {
  587. params = OBJ_nid2obj(curve_nid);
  588. if (params == NULL)
  589. return 0;
  590. }
  591. if (curve_nid != NID_undef
  592. && (EC_GROUP_get_asn1_flag(group) & OPENSSL_EC_NAMED_CURVE)) {
  593. /* The CHOICE came to namedCurve */
  594. if (OBJ_length(params) == 0) {
  595. /* Some curves might not have an associated OID */
  596. ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_OID);
  597. ASN1_OBJECT_free(params);
  598. return 0;
  599. }
  600. *pstr = params;
  601. *pstrtype = V_ASN1_OBJECT;
  602. return 1;
  603. } else {
  604. /* The CHOICE came to ecParameters */
  605. return prepare_ec_explicit_params(eckey, pstr, pstrtype);
  606. }
  607. }
  608. static int ec_spki_pub_to_der(const void *eckey, unsigned char **pder,
  609. ossl_unused void *ctx)
  610. {
  611. if (EC_KEY_get0_public_key(eckey) == NULL) {
  612. ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PUBLIC_KEY);
  613. return 0;
  614. }
  615. return i2o_ECPublicKey(eckey, pder);
  616. }
  617. static int ec_pki_priv_to_der(const void *veckey, unsigned char **pder,
  618. ossl_unused void *ctx)
  619. {
  620. EC_KEY *eckey = (EC_KEY *)veckey;
  621. unsigned int old_flags;
  622. int ret = 0;
  623. /*
  624. * For PKCS8 the curve name appears in the PKCS8_PRIV_KEY_INFO object
  625. * as the pkeyalg->parameter field. (For a named curve this is an OID)
  626. * The pkey field is an octet string that holds the encoded
  627. * ECPrivateKey SEQUENCE with the optional parameters field omitted.
  628. * We omit this by setting the EC_PKEY_NO_PARAMETERS flag.
  629. */
  630. old_flags = EC_KEY_get_enc_flags(eckey); /* save old flags */
  631. EC_KEY_set_enc_flags(eckey, old_flags | EC_PKEY_NO_PARAMETERS);
  632. ret = i2d_ECPrivateKey(eckey, pder);
  633. EC_KEY_set_enc_flags(eckey, old_flags); /* restore old flags */
  634. return ret; /* return the length of the der encoded data */
  635. }
  636. k2d_NOCTX(ec_param, i2d_ECParameters)
  637. k2d_NOCTX(ec_prv, i2d_ECPrivateKey)
  638. # define ec_epki_priv_to_der ec_pki_priv_to_der
  639. # define ec_type_specific_params_to_der ec_param_k2d
  640. /* No ec_type_specific_pub_to_der, there simply is no such thing */
  641. # define ec_type_specific_priv_to_der ec_prv_k2d
  642. # define ec_check_key_type NULL
  643. # define ec_evp_type EVP_PKEY_EC
  644. # define ec_pem_type "EC"
  645. # ifndef OPENSSL_NO_SM2
  646. /*
  647. * Albeit SM2 is a slightly different algorithm than ECDSA, the key type
  648. * encoding (in all places where an AlgorithmIdentifier is produced, such
  649. * as PrivateKeyInfo and SubjectPublicKeyInfo) is the same as for ECC keys
  650. * according to the example in GM/T 0015-2012, appendix D.2.
  651. * This leaves the distinction of SM2 keys to the EC group (which is found
  652. * in AlgorithmIdentified.params).
  653. */
  654. # define sm2_evp_type ec_evp_type
  655. # define sm2_pem_type "SM2"
  656. # endif
  657. #endif
  658. /* ---------------------------------------------------------------------- */
  659. #ifndef OPENSSL_NO_ECX
  660. # define prepare_ecx_params NULL
  661. static int ecx_spki_pub_to_der(const void *vecxkey, unsigned char **pder,
  662. ossl_unused void *ctx)
  663. {
  664. const ECX_KEY *ecxkey = vecxkey;
  665. unsigned char *keyblob;
  666. if (ecxkey == NULL) {
  667. ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);
  668. return 0;
  669. }
  670. keyblob = OPENSSL_memdup(ecxkey->pubkey, ecxkey->keylen);
  671. if (keyblob == NULL)
  672. return 0;
  673. *pder = keyblob;
  674. return ecxkey->keylen;
  675. }
  676. static int ecx_pki_priv_to_der(const void *vecxkey, unsigned char **pder,
  677. ossl_unused void *ctx)
  678. {
  679. const ECX_KEY *ecxkey = vecxkey;
  680. ASN1_OCTET_STRING oct;
  681. int keybloblen;
  682. if (ecxkey == NULL || ecxkey->privkey == NULL) {
  683. ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);
  684. return 0;
  685. }
  686. oct.data = ecxkey->privkey;
  687. oct.length = ecxkey->keylen;
  688. oct.flags = 0;
  689. keybloblen = i2d_ASN1_OCTET_STRING(&oct, pder);
  690. if (keybloblen < 0) {
  691. ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);
  692. return 0;
  693. }
  694. return keybloblen;
  695. }
  696. # define ecx_epki_priv_to_der ecx_pki_priv_to_der
  697. /*
  698. * ED25519, ED448, X25519 and X448 only has PKCS#8 / SubjectPublicKeyInfo
  699. * representation, so we don't define ecx_type_specific_[priv,pub,params]_to_der.
  700. */
  701. # define ecx_check_key_type NULL
  702. # define ed25519_evp_type EVP_PKEY_ED25519
  703. # define ed448_evp_type EVP_PKEY_ED448
  704. # define x25519_evp_type EVP_PKEY_X25519
  705. # define x448_evp_type EVP_PKEY_X448
  706. # define ed25519_pem_type "ED25519"
  707. # define ed448_pem_type "ED448"
  708. # define x25519_pem_type "X25519"
  709. # define x448_pem_type "X448"
  710. #endif
  711. /* ---------------------------------------------------------------------- */
  712. #ifndef OPENSSL_NO_ML_DSA
  713. static int ml_dsa_spki_pub_to_der(const void *vkey, unsigned char **pder,
  714. ossl_unused void *ctx)
  715. {
  716. return ossl_ml_dsa_i2d_pubkey(vkey, pder);
  717. }
  718. static int ml_dsa_pki_priv_to_der(const void *vkey, unsigned char **pder,
  719. void *vctx)
  720. {
  721. KEY2ANY_CTX *ctx = vctx;
  722. return ossl_ml_dsa_i2d_prvkey(vkey, pder, ctx->provctx);
  723. }
  724. # define ml_dsa_epki_priv_to_der ml_dsa_pki_priv_to_der
  725. # define prepare_ml_dsa_params NULL
  726. # define ml_dsa_check_key_type NULL
  727. # define ml_dsa_44_evp_type EVP_PKEY_ML_DSA_44
  728. # define ml_dsa_44_pem_type "ML-DSA-44"
  729. # define ml_dsa_65_evp_type EVP_PKEY_ML_DSA_65
  730. # define ml_dsa_65_pem_type "ML-DSA-65"
  731. # define ml_dsa_87_evp_type EVP_PKEY_ML_DSA_87
  732. # define ml_dsa_87_pem_type "ML-DSA-87"
  733. #endif /* OPENSSL_NO_ML_DSA */
  734. /* ---------------------------------------------------------------------- */
  735. #ifndef OPENSSL_NO_ML_KEM
  736. static int ml_kem_spki_pub_to_der(const void *vkey, unsigned char **pder,
  737. ossl_unused void *ctx)
  738. {
  739. return ossl_ml_kem_i2d_pubkey(vkey, pder);
  740. }
  741. static int ml_kem_pki_priv_to_der(const void *vkey, unsigned char **pder,
  742. void *vctx)
  743. {
  744. KEY2ANY_CTX *ctx = vctx;
  745. return ossl_ml_kem_i2d_prvkey(vkey, pder, ctx->provctx);
  746. }
  747. # define ml_kem_epki_priv_to_der ml_kem_pki_priv_to_der
  748. # define prepare_ml_kem_params NULL
  749. # define ml_kem_check_key_type NULL
  750. # define ml_kem_512_evp_type EVP_PKEY_ML_KEM_512
  751. # define ml_kem_512_pem_type "ML-KEM-512"
  752. # define ml_kem_768_evp_type EVP_PKEY_ML_KEM_768
  753. # define ml_kem_768_pem_type "ML-KEM-768"
  754. # define ml_kem_1024_evp_type EVP_PKEY_ML_KEM_1024
  755. # define ml_kem_1024_pem_type "ML-KEM-1024"
  756. #endif
  757. /* ---------------------------------------------------------------------- */
  758. /*
  759. * Helper functions to prepare RSA-PSS params for encoding. We would
  760. * have simply written the whole AlgorithmIdentifier, but existing libcrypto
  761. * functionality doesn't allow that.
  762. */
  763. static int prepare_rsa_params(const void *rsa, int nid, int save,
  764. void **pstr, int *pstrtype)
  765. {
  766. const RSA_PSS_PARAMS_30 *pss = ossl_rsa_get0_pss_params_30((RSA *)rsa);
  767. *pstr = NULL;
  768. switch (RSA_test_flags(rsa, RSA_FLAG_TYPE_MASK)) {
  769. case RSA_FLAG_TYPE_RSA:
  770. /* If plain RSA, the parameters shall be NULL */
  771. *pstrtype = V_ASN1_NULL;
  772. return 1;
  773. case RSA_FLAG_TYPE_RSASSAPSS:
  774. if (ossl_rsa_pss_params_30_is_unrestricted(pss)) {
  775. *pstrtype = V_ASN1_UNDEF;
  776. return 1;
  777. } else {
  778. ASN1_STRING *astr = NULL;
  779. WPACKET pkt;
  780. unsigned char *str = NULL;
  781. size_t str_sz = 0;
  782. int i;
  783. for (i = 0; i < 2; i++) {
  784. switch (i) {
  785. case 0:
  786. if (!WPACKET_init_null_der(&pkt))
  787. goto err;
  788. break;
  789. case 1:
  790. if ((str = OPENSSL_malloc(str_sz)) == NULL
  791. || !WPACKET_init_der(&pkt, str, str_sz)) {
  792. WPACKET_cleanup(&pkt);
  793. goto err;
  794. }
  795. break;
  796. }
  797. if (!ossl_DER_w_RSASSA_PSS_params(&pkt, -1, pss)
  798. || !WPACKET_finish(&pkt)
  799. || !WPACKET_get_total_written(&pkt, &str_sz)) {
  800. WPACKET_cleanup(&pkt);
  801. goto err;
  802. }
  803. WPACKET_cleanup(&pkt);
  804. /*
  805. * If no PSS parameters are going to be written, there's no
  806. * point going for another iteration.
  807. * This saves us from getting |str| allocated just to have it
  808. * immediately de-allocated.
  809. */
  810. if (str_sz == 0)
  811. break;
  812. }
  813. if ((astr = ASN1_STRING_new()) == NULL)
  814. goto err;
  815. *pstrtype = V_ASN1_SEQUENCE;
  816. ASN1_STRING_set0(astr, str, (int)str_sz);
  817. *pstr = astr;
  818. return 1;
  819. err:
  820. OPENSSL_free(str);
  821. return 0;
  822. }
  823. }
  824. /* Currently unsupported RSA key type */
  825. return 0;
  826. }
  827. k2d_NOCTX(rsa_prv, i2d_RSAPrivateKey)
  828. k2d_NOCTX(rsa_pub, i2d_RSAPublicKey)
  829. /*
  830. * RSA is extremely simple, as PKCS#1 is used for the PKCS#8 |privateKey|
  831. * field as well as the SubjectPublicKeyInfo |subjectPublicKey| field.
  832. */
  833. #define rsa_pki_priv_to_der rsa_type_specific_priv_to_der
  834. #define rsa_epki_priv_to_der rsa_type_specific_priv_to_der
  835. #define rsa_spki_pub_to_der rsa_type_specific_pub_to_der
  836. #define rsa_type_specific_priv_to_der rsa_prv_k2d
  837. #define rsa_type_specific_pub_to_der rsa_pub_k2d
  838. #define rsa_type_specific_params_to_der NULL
  839. static int rsa_check_key_type(const void *rsa, int expected_type)
  840. {
  841. switch (RSA_test_flags(rsa, RSA_FLAG_TYPE_MASK)) {
  842. case RSA_FLAG_TYPE_RSA:
  843. return expected_type == EVP_PKEY_RSA;
  844. case RSA_FLAG_TYPE_RSASSAPSS:
  845. return expected_type == EVP_PKEY_RSA_PSS;
  846. }
  847. /* Currently unsupported RSA key type */
  848. return EVP_PKEY_NONE;
  849. }
  850. #define rsa_evp_type EVP_PKEY_RSA
  851. #define rsapss_evp_type EVP_PKEY_RSA_PSS
  852. #define rsa_pem_type "RSA"
  853. #define rsapss_pem_type "RSA-PSS"
  854. /* ---------------------------------------------------------------------- */
  855. #ifndef OPENSSL_NO_SLH_DSA
  856. # define prepare_slh_dsa_params NULL
  857. static int slh_dsa_spki_pub_to_der(const void *vkey, unsigned char **pder,
  858. ossl_unused void *ctx)
  859. {
  860. const SLH_DSA_KEY *key = vkey;
  861. uint8_t *key_blob;
  862. size_t key_len;
  863. if (key == NULL) {
  864. ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);
  865. return 0;
  866. }
  867. key_len = ossl_slh_dsa_key_get_pub_len(key);
  868. key_blob = OPENSSL_memdup(ossl_slh_dsa_key_get_pub(key), key_len);
  869. if (key_blob == NULL)
  870. return 0;
  871. *pder = key_blob;
  872. return key_len;
  873. }
  874. static int slh_dsa_pki_priv_to_der(const void *vkey, unsigned char **pder,
  875. ossl_unused void *ctx)
  876. {
  877. const SLH_DSA_KEY *key = vkey;
  878. size_t len;
  879. if (ossl_slh_dsa_key_get_priv(key) == NULL) {
  880. ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);
  881. return 0;
  882. }
  883. len = ossl_slh_dsa_key_get_priv_len(key);
  884. if (pder != NULL
  885. && ((*pder = OPENSSL_memdup(ossl_slh_dsa_key_get_priv(key), len)) == NULL))
  886. return 0;
  887. return len;
  888. }
  889. # define slh_dsa_epki_priv_to_der slh_dsa_pki_priv_to_der
  890. /* SLH_DSA only has PKCS#8 / SubjectPublicKeyInfo representations. */
  891. # define slh_dsa_check_key_type NULL
  892. # define slh_dsa_sha2_128s_evp_type EVP_PKEY_SLH_DSA_SHA2_128S
  893. # define slh_dsa_sha2_128f_evp_type EVP_PKEY_SLH_DSA_SHA2_128F
  894. # define slh_dsa_sha2_192s_evp_type EVP_PKEY_SLH_DSA_SHA2_192S
  895. # define slh_dsa_sha2_192f_evp_type EVP_PKEY_SLH_DSA_SHA2_192F
  896. # define slh_dsa_sha2_256s_evp_type EVP_PKEY_SLH_DSA_SHA2_256S
  897. # define slh_dsa_sha2_256f_evp_type EVP_PKEY_SLH_DSA_SHA2_256F
  898. # define slh_dsa_shake_128s_evp_type EVP_PKEY_SLH_DSA_SHAKE_128S
  899. # define slh_dsa_shake_128f_evp_type EVP_PKEY_SLH_DSA_SHAKE_128F
  900. # define slh_dsa_shake_192s_evp_type EVP_PKEY_SLH_DSA_SHAKE_192S
  901. # define slh_dsa_shake_192f_evp_type EVP_PKEY_SLH_DSA_SHAKE_192F
  902. # define slh_dsa_shake_256s_evp_type EVP_PKEY_SLH_DSA_SHAKE_256S
  903. # define slh_dsa_shake_256f_evp_type EVP_PKEY_SLH_DSA_SHAKE_256F
  904. # define slh_dsa_sha2_128s_input_type "SLH-DSA-SHA2-128s"
  905. # define slh_dsa_sha2_128f_input_type "SLH-DSA-SHA2-128f"
  906. # define slh_dsa_sha2_192s_input_type "SLH-DSA-SHA2-192s"
  907. # define slh_dsa_sha2_192f_input_type "SLH-DSA-SHA2-192f"
  908. # define slh_dsa_sha2_256s_input_type "SLH-DSA-SHA2-256s"
  909. # define slh_dsa_sha2_256f_input_type "SLH-DSA-SHA2-256f"
  910. # define slh_dsa_shake_128s_input_type "SLH-DSA-SHAKE-128s"
  911. # define slh_dsa_shake_128f_input_type "SLH-DSA-SHAKE-128f"
  912. # define slh_dsa_shake_192s_input_type "SLH-DSA-SHAKE-192s"
  913. # define slh_dsa_shake_192f_input_type "SLH-DSA-SHAKE-192f"
  914. # define slh_dsa_shake_256s_input_type "SLH-DSA-SHAKE-256s"
  915. # define slh_dsa_shake_256f_input_type "SLH-DSA-SHAKE-256f"
  916. # define slh_dsa_sha2_128s_pem_type "SLH-DSA-SHA2-128s"
  917. # define slh_dsa_sha2_128f_pem_type "SLH-DSA-SHA2-128f"
  918. # define slh_dsa_sha2_192s_pem_type "SLH-DSA-SHA2-192s"
  919. # define slh_dsa_sha2_192f_pem_type "SLH-DSA-SHA2-192f"
  920. # define slh_dsa_sha2_256s_pem_type "SLH-DSA-SHA2-256s"
  921. # define slh_dsa_sha2_256f_pem_type "SLH-DSA-SHA2-256f"
  922. # define slh_dsa_shake_128s_pem_type "SLH-DSA-SHAKE-128s"
  923. # define slh_dsa_shake_128f_pem_type "SLH-DSA-SHAKE-128f"
  924. # define slh_dsa_shake_192s_pem_type "SLH-DSA-SHAKE-192s"
  925. # define slh_dsa_shake_192f_pem_type "SLH-DSA-SHAKE-192f"
  926. # define slh_dsa_shake_256s_pem_type "SLH-DSA-SHAKE-256s"
  927. # define slh_dsa_shake_256f_pem_type "SLH-DSA-SHAKE-256f"
  928. #endif /* OPENSSL_NO_SLH_DSA */
  929. /* ---------------------------------------------------------------------- */
  930. static OSSL_FUNC_decoder_newctx_fn key2any_newctx;
  931. static OSSL_FUNC_decoder_freectx_fn key2any_freectx;
  932. static void *key2any_newctx(void *provctx)
  933. {
  934. KEY2ANY_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx));
  935. if (ctx != NULL) {
  936. ctx->provctx = provctx;
  937. ctx->save_parameters = 1;
  938. }
  939. return ctx;
  940. }
  941. static void key2any_freectx(void *vctx)
  942. {
  943. KEY2ANY_CTX *ctx = vctx;
  944. ossl_pw_clear_passphrase_data(&ctx->pwdata);
  945. EVP_CIPHER_free(ctx->cipher);
  946. OPENSSL_free(ctx);
  947. }
  948. static const OSSL_PARAM *key2any_settable_ctx_params(ossl_unused void *provctx)
  949. {
  950. static const OSSL_PARAM settables[] = {
  951. OSSL_PARAM_utf8_string(OSSL_ENCODER_PARAM_CIPHER, NULL, 0),
  952. OSSL_PARAM_utf8_string(OSSL_ENCODER_PARAM_PROPERTIES, NULL, 0),
  953. OSSL_PARAM_END,
  954. };
  955. return settables;
  956. }
  957. static int key2any_set_ctx_params(void *vctx, const OSSL_PARAM params[])
  958. {
  959. KEY2ANY_CTX *ctx = vctx;
  960. OSSL_LIB_CTX *libctx = ossl_prov_ctx_get0_libctx(ctx->provctx);
  961. const OSSL_PARAM *cipherp =
  962. OSSL_PARAM_locate_const(params, OSSL_ENCODER_PARAM_CIPHER);
  963. const OSSL_PARAM *propsp =
  964. OSSL_PARAM_locate_const(params, OSSL_ENCODER_PARAM_PROPERTIES);
  965. const OSSL_PARAM *save_paramsp =
  966. OSSL_PARAM_locate_const(params, OSSL_ENCODER_PARAM_SAVE_PARAMETERS);
  967. if (cipherp != NULL) {
  968. const char *ciphername = NULL;
  969. const char *props = NULL;
  970. if (!OSSL_PARAM_get_utf8_string_ptr(cipherp, &ciphername))
  971. return 0;
  972. if (propsp != NULL && !OSSL_PARAM_get_utf8_string_ptr(propsp, &props))
  973. return 0;
  974. EVP_CIPHER_free(ctx->cipher);
  975. ctx->cipher = NULL;
  976. ctx->cipher_intent = ciphername != NULL;
  977. if (ciphername != NULL
  978. && ((ctx->cipher =
  979. EVP_CIPHER_fetch(libctx, ciphername, props)) == NULL))
  980. return 0;
  981. }
  982. if (save_paramsp != NULL) {
  983. if (!OSSL_PARAM_get_int(save_paramsp, &ctx->save_parameters))
  984. return 0;
  985. }
  986. return 1;
  987. }
  988. static int key2any_check_selection(int selection, int selection_mask)
  989. {
  990. /*
  991. * The selections are kinda sorta "levels", i.e. each selection given
  992. * here is assumed to include those following.
  993. */
  994. int checks[] = {
  995. OSSL_KEYMGMT_SELECT_PRIVATE_KEY,
  996. OSSL_KEYMGMT_SELECT_PUBLIC_KEY,
  997. OSSL_KEYMGMT_SELECT_ALL_PARAMETERS
  998. };
  999. size_t i;
  1000. /* The decoder implementations made here support guessing */
  1001. if (selection == 0)
  1002. return 1;
  1003. for (i = 0; i < OSSL_NELEM(checks); i++) {
  1004. int check1 = (selection & checks[i]) != 0;
  1005. int check2 = (selection_mask & checks[i]) != 0;
  1006. /*
  1007. * If the caller asked for the currently checked bit(s), return
  1008. * whether the decoder description says it's supported.
  1009. */
  1010. if (check1)
  1011. return check2;
  1012. }
  1013. /* This should be dead code, but just to be safe... */
  1014. return 0;
  1015. }
  1016. static int key2any_encode(KEY2ANY_CTX *ctx, OSSL_CORE_BIO *cout,
  1017. const void *key, int type, const char *pemname,
  1018. check_key_type_fn *checker,
  1019. key_to_der_fn *writer,
  1020. OSSL_PASSPHRASE_CALLBACK *pwcb, void *pwcbarg,
  1021. key_to_paramstring_fn *key2paramstring,
  1022. OSSL_i2d_of_void_ctx *key2der)
  1023. {
  1024. int ret = 0;
  1025. if (key == NULL) {
  1026. ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_NULL_PARAMETER);
  1027. } else if (writer != NULL
  1028. && (checker == NULL || checker(key, type))) {
  1029. BIO *out = ossl_bio_new_from_core_bio(ctx->provctx, cout);
  1030. if (out != NULL
  1031. && (pwcb == NULL
  1032. || ossl_pw_set_ossl_passphrase_cb(&ctx->pwdata, pwcb, pwcbarg)))
  1033. ret =
  1034. writer(out, key, type, pemname, key2paramstring, key2der, ctx);
  1035. BIO_free(out);
  1036. } else {
  1037. ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_INVALID_ARGUMENT);
  1038. }
  1039. return ret;
  1040. }
  1041. #define DO_PRIVATE_KEY_selection_mask OSSL_KEYMGMT_SELECT_PRIVATE_KEY
  1042. #define DO_PRIVATE_KEY(impl, type, kind, output) \
  1043. if ((selection & DO_PRIVATE_KEY_selection_mask) != 0) \
  1044. return key2any_encode(ctx, cout, key, impl##_evp_type, \
  1045. impl##_pem_type " PRIVATE KEY", \
  1046. type##_check_key_type, \
  1047. key_to_##kind##_##output##_priv_bio, \
  1048. cb, cbarg, prepare_##type##_params, \
  1049. type##_##kind##_priv_to_der);
  1050. #define DO_PUBLIC_KEY_selection_mask OSSL_KEYMGMT_SELECT_PUBLIC_KEY
  1051. #define DO_PUBLIC_KEY(impl, type, kind, output) \
  1052. if ((selection & DO_PUBLIC_KEY_selection_mask) != 0) \
  1053. return key2any_encode(ctx, cout, key, impl##_evp_type, \
  1054. impl##_pem_type " PUBLIC KEY", \
  1055. type##_check_key_type, \
  1056. key_to_##kind##_##output##_pub_bio, \
  1057. cb, cbarg, prepare_##type##_params, \
  1058. type##_##kind##_pub_to_der);
  1059. #define DO_PARAMETERS_selection_mask OSSL_KEYMGMT_SELECT_ALL_PARAMETERS
  1060. #define DO_PARAMETERS(impl, type, kind, output) \
  1061. if ((selection & DO_PARAMETERS_selection_mask) != 0) \
  1062. return key2any_encode(ctx, cout, key, impl##_evp_type, \
  1063. impl##_pem_type " PARAMETERS", \
  1064. type##_check_key_type, \
  1065. key_to_##kind##_##output##_param_bio, \
  1066. NULL, NULL, NULL, \
  1067. type##_##kind##_params_to_der);
  1068. /*-
  1069. * Implement the kinds of output structure that can be produced. They are
  1070. * referred to by name, and for each name, the following macros are defined
  1071. * (braces not included):
  1072. *
  1073. * DO_{kind}_selection_mask
  1074. *
  1075. * A mask of selection bits that must not be zero. This is used as a
  1076. * selection criterion for each implementation.
  1077. * This mask must never be zero.
  1078. *
  1079. * DO_{kind}
  1080. *
  1081. * The performing macro. It must use the DO_ macros defined above,
  1082. * always in this order:
  1083. *
  1084. * - DO_PRIVATE_KEY
  1085. * - DO_PUBLIC_KEY
  1086. * - DO_PARAMETERS
  1087. *
  1088. * Any of those may be omitted, but the relative order must still be
  1089. * the same.
  1090. */
  1091. /*
  1092. * PKCS#8 defines two structures for private keys only:
  1093. * - PrivateKeyInfo (raw unencrypted form)
  1094. * - EncryptedPrivateKeyInfo (encrypted wrapping)
  1095. *
  1096. * To allow a certain amount of flexibility, we allow the routines
  1097. * for PrivateKeyInfo to also produce EncryptedPrivateKeyInfo if a
  1098. * passphrase callback has been passed to them.
  1099. */
  1100. #define DO_PrivateKeyInfo_selection_mask DO_PRIVATE_KEY_selection_mask
  1101. #define DO_PrivateKeyInfo(impl, type, output) \
  1102. DO_PRIVATE_KEY(impl, type, pki, output)
  1103. #define DO_EncryptedPrivateKeyInfo_selection_mask DO_PRIVATE_KEY_selection_mask
  1104. #define DO_EncryptedPrivateKeyInfo(impl, type, output) \
  1105. DO_PRIVATE_KEY(impl, type, epki, output)
  1106. /* SubjectPublicKeyInfo is a structure for public keys only */
  1107. #define DO_SubjectPublicKeyInfo_selection_mask DO_PUBLIC_KEY_selection_mask
  1108. #define DO_SubjectPublicKeyInfo(impl, type, output) \
  1109. DO_PUBLIC_KEY(impl, type, spki, output)
  1110. /*
  1111. * "type-specific" is a uniform name for key type specific output for private
  1112. * and public keys as well as key parameters. This is used internally in
  1113. * libcrypto so it doesn't have to have special knowledge about select key
  1114. * types, but also when no better name has been found. If there are more
  1115. * expressive DO_ names above, those are preferred.
  1116. *
  1117. * Three forms exist:
  1118. *
  1119. * - type_specific_keypair Only supports private and public key
  1120. * - type_specific_params Only supports parameters
  1121. * - type_specific Supports all parts of an EVP_PKEY
  1122. * - type_specific_no_pub Supports all parts of an EVP_PKEY
  1123. * except public key
  1124. */
  1125. #define DO_type_specific_params_selection_mask DO_PARAMETERS_selection_mask
  1126. #define DO_type_specific_params(impl, type, output) \
  1127. DO_PARAMETERS(impl, type, type_specific, output)
  1128. #define DO_type_specific_keypair_selection_mask \
  1129. ( DO_PRIVATE_KEY_selection_mask | DO_PUBLIC_KEY_selection_mask )
  1130. #define DO_type_specific_keypair(impl, type, output) \
  1131. DO_PRIVATE_KEY(impl, type, type_specific, output) \
  1132. DO_PUBLIC_KEY(impl, type, type_specific, output)
  1133. #define DO_type_specific_selection_mask \
  1134. ( DO_type_specific_keypair_selection_mask \
  1135. | DO_type_specific_params_selection_mask )
  1136. #define DO_type_specific(impl, type, output) \
  1137. DO_type_specific_keypair(impl, type, output) \
  1138. DO_type_specific_params(impl, type, output)
  1139. #define DO_type_specific_no_pub_selection_mask \
  1140. ( DO_PRIVATE_KEY_selection_mask | DO_PARAMETERS_selection_mask)
  1141. #define DO_type_specific_no_pub(impl, type, output) \
  1142. DO_PRIVATE_KEY(impl, type, type_specific, output) \
  1143. DO_type_specific_params(impl, type, output)
  1144. /*
  1145. * Type specific aliases for the cases where we need to refer to them by
  1146. * type name.
  1147. * This only covers key types that are represented with i2d_{TYPE}PrivateKey,
  1148. * i2d_{TYPE}PublicKey and i2d_{TYPE}params / i2d_{TYPE}Parameters.
  1149. */
  1150. #define DO_RSA_selection_mask DO_type_specific_keypair_selection_mask
  1151. #define DO_RSA(impl, type, output) DO_type_specific_keypair(impl, type, output)
  1152. #define DO_DH_selection_mask DO_type_specific_params_selection_mask
  1153. #define DO_DH(impl, type, output) DO_type_specific_params(impl, type, output)
  1154. #define DO_DHX_selection_mask DO_type_specific_params_selection_mask
  1155. #define DO_DHX(impl, type, output) DO_type_specific_params(impl, type, output)
  1156. #define DO_DSA_selection_mask DO_type_specific_selection_mask
  1157. #define DO_DSA(impl, type, output) DO_type_specific(impl, type, output)
  1158. #define DO_EC_selection_mask DO_type_specific_no_pub_selection_mask
  1159. #define DO_EC(impl, type, output) DO_type_specific_no_pub(impl, type, output)
  1160. #define DO_SM2_selection_mask DO_type_specific_no_pub_selection_mask
  1161. #define DO_SM2(impl, type, output) DO_type_specific_no_pub(impl, type, output)
  1162. /* PKCS#1 defines a structure for RSA private and public keys */
  1163. #define DO_PKCS1_selection_mask DO_RSA_selection_mask
  1164. #define DO_PKCS1(impl, type, output) DO_RSA(impl, type, output)
  1165. /* PKCS#3 defines a structure for DH parameters */
  1166. #define DO_PKCS3_selection_mask DO_DH_selection_mask
  1167. #define DO_PKCS3(impl, type, output) DO_DH(impl, type, output)
  1168. /* X9.42 defines a structure for DHx parameters */
  1169. #define DO_X9_42_selection_mask DO_DHX_selection_mask
  1170. #define DO_X9_42(impl, type, output) DO_DHX(impl, type, output)
  1171. /* X9.62 defines a structure for EC keys and parameters */
  1172. #define DO_X9_62_selection_mask DO_EC_selection_mask
  1173. #define DO_X9_62(impl, type, output) DO_EC(impl, type, output)
  1174. /*
  1175. * MAKE_ENCODER is the single driver for creating OSSL_DISPATCH tables.
  1176. * It takes the following arguments:
  1177. *
  1178. * impl This is the key type name that's being implemented.
  1179. * type This is the type name for the set of functions that implement
  1180. * the key type. For example, ed25519, ed448, x25519 and x448
  1181. * are all implemented with the exact same set of functions.
  1182. * kind What kind of support to implement. These translate into
  1183. * the DO_##kind macros above.
  1184. * output The output type to implement. may be der or pem.
  1185. *
  1186. * The resulting OSSL_DISPATCH array gets the following name (expressed in
  1187. * C preprocessor terms) from those arguments:
  1188. *
  1189. * ossl_##impl##_to_##kind##_##output##_encoder_functions
  1190. */
  1191. #define MAKE_ENCODER(impl, type, kind, output) \
  1192. static OSSL_FUNC_encoder_import_object_fn \
  1193. impl##_to_##kind##_##output##_import_object; \
  1194. static OSSL_FUNC_encoder_free_object_fn \
  1195. impl##_to_##kind##_##output##_free_object; \
  1196. static OSSL_FUNC_encoder_encode_fn \
  1197. impl##_to_##kind##_##output##_encode; \
  1198. \
  1199. static void * \
  1200. impl##_to_##kind##_##output##_import_object(void *vctx, int selection, \
  1201. const OSSL_PARAM params[]) \
  1202. { \
  1203. KEY2ANY_CTX *ctx = vctx; \
  1204. \
  1205. return ossl_prov_import_key(ossl_##impl##_keymgmt_functions, \
  1206. ctx->provctx, selection, params); \
  1207. } \
  1208. static void impl##_to_##kind##_##output##_free_object(void *key) \
  1209. { \
  1210. ossl_prov_free_key(ossl_##impl##_keymgmt_functions, key); \
  1211. } \
  1212. static int impl##_to_##kind##_##output##_does_selection(void *ctx, \
  1213. int selection) \
  1214. { \
  1215. return key2any_check_selection(selection, \
  1216. DO_##kind##_selection_mask); \
  1217. } \
  1218. static int \
  1219. impl##_to_##kind##_##output##_encode(void *ctx, OSSL_CORE_BIO *cout, \
  1220. const void *key, \
  1221. const OSSL_PARAM key_abstract[], \
  1222. int selection, \
  1223. OSSL_PASSPHRASE_CALLBACK *cb, \
  1224. void *cbarg) \
  1225. { \
  1226. /* We don't deal with abstract objects */ \
  1227. if (key_abstract != NULL) { \
  1228. ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_INVALID_ARGUMENT); \
  1229. return 0; \
  1230. } \
  1231. DO_##kind(impl, type, output) \
  1232. \
  1233. ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_INVALID_ARGUMENT); \
  1234. return 0; \
  1235. } \
  1236. const OSSL_DISPATCH \
  1237. ossl_##impl##_to_##kind##_##output##_encoder_functions[] = { \
  1238. { OSSL_FUNC_ENCODER_NEWCTX, \
  1239. (void (*)(void))key2any_newctx }, \
  1240. { OSSL_FUNC_ENCODER_FREECTX, \
  1241. (void (*)(void))key2any_freectx }, \
  1242. { OSSL_FUNC_ENCODER_SETTABLE_CTX_PARAMS, \
  1243. (void (*)(void))key2any_settable_ctx_params }, \
  1244. { OSSL_FUNC_ENCODER_SET_CTX_PARAMS, \
  1245. (void (*)(void))key2any_set_ctx_params }, \
  1246. { OSSL_FUNC_ENCODER_DOES_SELECTION, \
  1247. (void (*)(void))impl##_to_##kind##_##output##_does_selection }, \
  1248. { OSSL_FUNC_ENCODER_IMPORT_OBJECT, \
  1249. (void (*)(void))impl##_to_##kind##_##output##_import_object }, \
  1250. { OSSL_FUNC_ENCODER_FREE_OBJECT, \
  1251. (void (*)(void))impl##_to_##kind##_##output##_free_object }, \
  1252. { OSSL_FUNC_ENCODER_ENCODE, \
  1253. (void (*)(void))impl##_to_##kind##_##output##_encode }, \
  1254. OSSL_DISPATCH_END \
  1255. }
  1256. /*
  1257. * Replacements for i2d_{TYPE}PrivateKey, i2d_{TYPE}PublicKey,
  1258. * i2d_{TYPE}params, as they exist.
  1259. */
  1260. MAKE_ENCODER(rsa, rsa, type_specific_keypair, der);
  1261. #ifndef OPENSSL_NO_DH
  1262. MAKE_ENCODER(dh, dh, type_specific_params, der);
  1263. MAKE_ENCODER(dhx, dh, type_specific_params, der);
  1264. #endif
  1265. #ifndef OPENSSL_NO_DSA
  1266. MAKE_ENCODER(dsa, dsa, type_specific, der);
  1267. #endif
  1268. #ifndef OPENSSL_NO_EC
  1269. MAKE_ENCODER(ec, ec, type_specific_no_pub, der);
  1270. # ifndef OPENSSL_NO_SM2
  1271. MAKE_ENCODER(sm2, ec, type_specific_no_pub, der);
  1272. # endif
  1273. #endif
  1274. /*
  1275. * Replacements for PEM_write_bio_{TYPE}PrivateKey,
  1276. * PEM_write_bio_{TYPE}PublicKey, PEM_write_bio_{TYPE}params, as they exist.
  1277. */
  1278. MAKE_ENCODER(rsa, rsa, type_specific_keypair, pem);
  1279. #ifndef OPENSSL_NO_DH
  1280. MAKE_ENCODER(dh, dh, type_specific_params, pem);
  1281. MAKE_ENCODER(dhx, dh, type_specific_params, pem);
  1282. #endif
  1283. #ifndef OPENSSL_NO_DSA
  1284. MAKE_ENCODER(dsa, dsa, type_specific, pem);
  1285. #endif
  1286. #ifndef OPENSSL_NO_EC
  1287. MAKE_ENCODER(ec, ec, type_specific_no_pub, pem);
  1288. # ifndef OPENSSL_NO_SM2
  1289. MAKE_ENCODER(sm2, ec, type_specific_no_pub, pem);
  1290. # endif
  1291. #endif
  1292. /*
  1293. * PKCS#8 and SubjectPublicKeyInfo support. This may duplicate some of the
  1294. * implementations specified above, but are more specific.
  1295. * The SubjectPublicKeyInfo implementations also replace the
  1296. * PEM_write_bio_{TYPE}_PUBKEY functions.
  1297. * For PEM, these are expected to be used by PEM_write_bio_PrivateKey(),
  1298. * PEM_write_bio_PUBKEY() and PEM_write_bio_Parameters().
  1299. */
  1300. MAKE_ENCODER(rsa, rsa, EncryptedPrivateKeyInfo, der);
  1301. MAKE_ENCODER(rsa, rsa, EncryptedPrivateKeyInfo, pem);
  1302. MAKE_ENCODER(rsa, rsa, PrivateKeyInfo, der);
  1303. MAKE_ENCODER(rsa, rsa, PrivateKeyInfo, pem);
  1304. MAKE_ENCODER(rsa, rsa, SubjectPublicKeyInfo, der);
  1305. MAKE_ENCODER(rsa, rsa, SubjectPublicKeyInfo, pem);
  1306. MAKE_ENCODER(rsapss, rsa, EncryptedPrivateKeyInfo, der);
  1307. MAKE_ENCODER(rsapss, rsa, EncryptedPrivateKeyInfo, pem);
  1308. MAKE_ENCODER(rsapss, rsa, PrivateKeyInfo, der);
  1309. MAKE_ENCODER(rsapss, rsa, PrivateKeyInfo, pem);
  1310. MAKE_ENCODER(rsapss, rsa, SubjectPublicKeyInfo, der);
  1311. MAKE_ENCODER(rsapss, rsa, SubjectPublicKeyInfo, pem);
  1312. #ifndef OPENSSL_NO_DH
  1313. MAKE_ENCODER(dh, dh, EncryptedPrivateKeyInfo, der);
  1314. MAKE_ENCODER(dh, dh, EncryptedPrivateKeyInfo, pem);
  1315. MAKE_ENCODER(dh, dh, PrivateKeyInfo, der);
  1316. MAKE_ENCODER(dh, dh, PrivateKeyInfo, pem);
  1317. MAKE_ENCODER(dh, dh, SubjectPublicKeyInfo, der);
  1318. MAKE_ENCODER(dh, dh, SubjectPublicKeyInfo, pem);
  1319. MAKE_ENCODER(dhx, dh, EncryptedPrivateKeyInfo, der);
  1320. MAKE_ENCODER(dhx, dh, EncryptedPrivateKeyInfo, pem);
  1321. MAKE_ENCODER(dhx, dh, PrivateKeyInfo, der);
  1322. MAKE_ENCODER(dhx, dh, PrivateKeyInfo, pem);
  1323. MAKE_ENCODER(dhx, dh, SubjectPublicKeyInfo, der);
  1324. MAKE_ENCODER(dhx, dh, SubjectPublicKeyInfo, pem);
  1325. #endif
  1326. #ifndef OPENSSL_NO_DSA
  1327. MAKE_ENCODER(dsa, dsa, EncryptedPrivateKeyInfo, der);
  1328. MAKE_ENCODER(dsa, dsa, EncryptedPrivateKeyInfo, pem);
  1329. MAKE_ENCODER(dsa, dsa, PrivateKeyInfo, der);
  1330. MAKE_ENCODER(dsa, dsa, PrivateKeyInfo, pem);
  1331. MAKE_ENCODER(dsa, dsa, SubjectPublicKeyInfo, der);
  1332. MAKE_ENCODER(dsa, dsa, SubjectPublicKeyInfo, pem);
  1333. #endif
  1334. #ifndef OPENSSL_NO_EC
  1335. MAKE_ENCODER(ec, ec, EncryptedPrivateKeyInfo, der);
  1336. MAKE_ENCODER(ec, ec, EncryptedPrivateKeyInfo, pem);
  1337. MAKE_ENCODER(ec, ec, PrivateKeyInfo, der);
  1338. MAKE_ENCODER(ec, ec, PrivateKeyInfo, pem);
  1339. MAKE_ENCODER(ec, ec, SubjectPublicKeyInfo, der);
  1340. MAKE_ENCODER(ec, ec, SubjectPublicKeyInfo, pem);
  1341. # ifndef OPENSSL_NO_SM2
  1342. MAKE_ENCODER(sm2, ec, EncryptedPrivateKeyInfo, der);
  1343. MAKE_ENCODER(sm2, ec, EncryptedPrivateKeyInfo, pem);
  1344. MAKE_ENCODER(sm2, ec, PrivateKeyInfo, der);
  1345. MAKE_ENCODER(sm2, ec, PrivateKeyInfo, pem);
  1346. MAKE_ENCODER(sm2, ec, SubjectPublicKeyInfo, der);
  1347. MAKE_ENCODER(sm2, ec, SubjectPublicKeyInfo, pem);
  1348. # endif
  1349. # ifndef OPENSSL_NO_ECX
  1350. MAKE_ENCODER(ed25519, ecx, EncryptedPrivateKeyInfo, der);
  1351. MAKE_ENCODER(ed25519, ecx, EncryptedPrivateKeyInfo, pem);
  1352. MAKE_ENCODER(ed25519, ecx, PrivateKeyInfo, der);
  1353. MAKE_ENCODER(ed25519, ecx, PrivateKeyInfo, pem);
  1354. MAKE_ENCODER(ed25519, ecx, SubjectPublicKeyInfo, der);
  1355. MAKE_ENCODER(ed25519, ecx, SubjectPublicKeyInfo, pem);
  1356. MAKE_ENCODER(ed448, ecx, EncryptedPrivateKeyInfo, der);
  1357. MAKE_ENCODER(ed448, ecx, EncryptedPrivateKeyInfo, pem);
  1358. MAKE_ENCODER(ed448, ecx, PrivateKeyInfo, der);
  1359. MAKE_ENCODER(ed448, ecx, PrivateKeyInfo, pem);
  1360. MAKE_ENCODER(ed448, ecx, SubjectPublicKeyInfo, der);
  1361. MAKE_ENCODER(ed448, ecx, SubjectPublicKeyInfo, pem);
  1362. MAKE_ENCODER(x25519, ecx, EncryptedPrivateKeyInfo, der);
  1363. MAKE_ENCODER(x25519, ecx, EncryptedPrivateKeyInfo, pem);
  1364. MAKE_ENCODER(x25519, ecx, PrivateKeyInfo, der);
  1365. MAKE_ENCODER(x25519, ecx, PrivateKeyInfo, pem);
  1366. MAKE_ENCODER(x25519, ecx, SubjectPublicKeyInfo, der);
  1367. MAKE_ENCODER(x25519, ecx, SubjectPublicKeyInfo, pem);
  1368. MAKE_ENCODER(x448, ecx, EncryptedPrivateKeyInfo, der);
  1369. MAKE_ENCODER(x448, ecx, EncryptedPrivateKeyInfo, pem);
  1370. MAKE_ENCODER(x448, ecx, PrivateKeyInfo, der);
  1371. MAKE_ENCODER(x448, ecx, PrivateKeyInfo, pem);
  1372. MAKE_ENCODER(x448, ecx, SubjectPublicKeyInfo, der);
  1373. MAKE_ENCODER(x448, ecx, SubjectPublicKeyInfo, pem);
  1374. # endif
  1375. #endif
  1376. #ifndef OPENSSL_NO_SLH_DSA
  1377. MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, EncryptedPrivateKeyInfo, der);
  1378. MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, EncryptedPrivateKeyInfo, der);
  1379. MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, EncryptedPrivateKeyInfo, der);
  1380. MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, EncryptedPrivateKeyInfo, der);
  1381. MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, EncryptedPrivateKeyInfo, der);
  1382. MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, EncryptedPrivateKeyInfo, der);
  1383. MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, EncryptedPrivateKeyInfo, pem);
  1384. MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, EncryptedPrivateKeyInfo, pem);
  1385. MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, EncryptedPrivateKeyInfo, pem);
  1386. MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, EncryptedPrivateKeyInfo, pem);
  1387. MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, EncryptedPrivateKeyInfo, pem);
  1388. MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, EncryptedPrivateKeyInfo, pem);
  1389. MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, EncryptedPrivateKeyInfo, der);
  1390. MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, EncryptedPrivateKeyInfo, der);
  1391. MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, EncryptedPrivateKeyInfo, der);
  1392. MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, EncryptedPrivateKeyInfo, der);
  1393. MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, EncryptedPrivateKeyInfo, der);
  1394. MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, EncryptedPrivateKeyInfo, der);
  1395. MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, EncryptedPrivateKeyInfo, pem);
  1396. MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, EncryptedPrivateKeyInfo, pem);
  1397. MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, EncryptedPrivateKeyInfo, pem);
  1398. MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, EncryptedPrivateKeyInfo, pem);
  1399. MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, EncryptedPrivateKeyInfo, pem);
  1400. MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, EncryptedPrivateKeyInfo, pem);
  1401. MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, PrivateKeyInfo, der);
  1402. MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, PrivateKeyInfo, der);
  1403. MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, PrivateKeyInfo, der);
  1404. MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, PrivateKeyInfo, der);
  1405. MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, PrivateKeyInfo, der);
  1406. MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, PrivateKeyInfo, der);
  1407. MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, PrivateKeyInfo, pem);
  1408. MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, PrivateKeyInfo, pem);
  1409. MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, PrivateKeyInfo, pem);
  1410. MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, PrivateKeyInfo, pem);
  1411. MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, PrivateKeyInfo, pem);
  1412. MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, PrivateKeyInfo, pem);
  1413. MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, PrivateKeyInfo, der);
  1414. MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, PrivateKeyInfo, der);
  1415. MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, PrivateKeyInfo, der);
  1416. MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, PrivateKeyInfo, der);
  1417. MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, PrivateKeyInfo, der);
  1418. MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, PrivateKeyInfo, der);
  1419. MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, PrivateKeyInfo, pem);
  1420. MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, PrivateKeyInfo, pem);
  1421. MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, PrivateKeyInfo, pem);
  1422. MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, PrivateKeyInfo, pem);
  1423. MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, PrivateKeyInfo, pem);
  1424. MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, PrivateKeyInfo, pem);
  1425. MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, SubjectPublicKeyInfo, der);
  1426. MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, SubjectPublicKeyInfo, der);
  1427. MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, SubjectPublicKeyInfo, der);
  1428. MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, SubjectPublicKeyInfo, der);
  1429. MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, SubjectPublicKeyInfo, der);
  1430. MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, SubjectPublicKeyInfo, der);
  1431. MAKE_ENCODER(slh_dsa_sha2_128s, slh_dsa, SubjectPublicKeyInfo, pem);
  1432. MAKE_ENCODER(slh_dsa_sha2_128f, slh_dsa, SubjectPublicKeyInfo, pem);
  1433. MAKE_ENCODER(slh_dsa_sha2_192s, slh_dsa, SubjectPublicKeyInfo, pem);
  1434. MAKE_ENCODER(slh_dsa_sha2_192f, slh_dsa, SubjectPublicKeyInfo, pem);
  1435. MAKE_ENCODER(slh_dsa_sha2_256s, slh_dsa, SubjectPublicKeyInfo, pem);
  1436. MAKE_ENCODER(slh_dsa_sha2_256f, slh_dsa, SubjectPublicKeyInfo, pem);
  1437. MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, SubjectPublicKeyInfo, der);
  1438. MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, SubjectPublicKeyInfo, der);
  1439. MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, SubjectPublicKeyInfo, der);
  1440. MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, SubjectPublicKeyInfo, der);
  1441. MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, SubjectPublicKeyInfo, der);
  1442. MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, SubjectPublicKeyInfo, der);
  1443. MAKE_ENCODER(slh_dsa_shake_128s, slh_dsa, SubjectPublicKeyInfo, pem);
  1444. MAKE_ENCODER(slh_dsa_shake_128f, slh_dsa, SubjectPublicKeyInfo, pem);
  1445. MAKE_ENCODER(slh_dsa_shake_192s, slh_dsa, SubjectPublicKeyInfo, pem);
  1446. MAKE_ENCODER(slh_dsa_shake_192f, slh_dsa, SubjectPublicKeyInfo, pem);
  1447. MAKE_ENCODER(slh_dsa_shake_256s, slh_dsa, SubjectPublicKeyInfo, pem);
  1448. MAKE_ENCODER(slh_dsa_shake_256f, slh_dsa, SubjectPublicKeyInfo, pem);
  1449. #endif /* OPENSSL_NO_SLH_DSA */
  1450. #ifndef OPENSSL_NO_ML_KEM
  1451. MAKE_ENCODER(ml_kem_512, ml_kem, EncryptedPrivateKeyInfo, der);
  1452. MAKE_ENCODER(ml_kem_512, ml_kem, EncryptedPrivateKeyInfo, pem);
  1453. MAKE_ENCODER(ml_kem_512, ml_kem, PrivateKeyInfo, der);
  1454. MAKE_ENCODER(ml_kem_512, ml_kem, PrivateKeyInfo, pem);
  1455. MAKE_ENCODER(ml_kem_512, ml_kem, SubjectPublicKeyInfo, der);
  1456. MAKE_ENCODER(ml_kem_512, ml_kem, SubjectPublicKeyInfo, pem);
  1457. MAKE_ENCODER(ml_kem_768, ml_kem, EncryptedPrivateKeyInfo, der);
  1458. MAKE_ENCODER(ml_kem_768, ml_kem, EncryptedPrivateKeyInfo, pem);
  1459. MAKE_ENCODER(ml_kem_768, ml_kem, PrivateKeyInfo, der);
  1460. MAKE_ENCODER(ml_kem_768, ml_kem, PrivateKeyInfo, pem);
  1461. MAKE_ENCODER(ml_kem_768, ml_kem, SubjectPublicKeyInfo, der);
  1462. MAKE_ENCODER(ml_kem_768, ml_kem, SubjectPublicKeyInfo, pem);
  1463. MAKE_ENCODER(ml_kem_1024, ml_kem, EncryptedPrivateKeyInfo, der);
  1464. MAKE_ENCODER(ml_kem_1024, ml_kem, EncryptedPrivateKeyInfo, pem);
  1465. MAKE_ENCODER(ml_kem_1024, ml_kem, PrivateKeyInfo, der);
  1466. MAKE_ENCODER(ml_kem_1024, ml_kem, PrivateKeyInfo, pem);
  1467. MAKE_ENCODER(ml_kem_1024, ml_kem, SubjectPublicKeyInfo, der);
  1468. MAKE_ENCODER(ml_kem_1024, ml_kem, SubjectPublicKeyInfo, pem);
  1469. #endif
  1470. /*
  1471. * Support for key type specific output formats. Not all key types have
  1472. * this, we only aim to duplicate what is available in 1.1.1 as
  1473. * i2d_TYPEPrivateKey(), i2d_TYPEPublicKey() and i2d_TYPEparams().
  1474. * For example, there are no publicly available i2d_ function for
  1475. * ED25519, ED448, X25519 or X448, and they therefore only have PKCS#8
  1476. * and SubjectPublicKeyInfo implementations as implemented above.
  1477. */
  1478. MAKE_ENCODER(rsa, rsa, RSA, der);
  1479. MAKE_ENCODER(rsa, rsa, RSA, pem);
  1480. #ifndef OPENSSL_NO_DH
  1481. MAKE_ENCODER(dh, dh, DH, der);
  1482. MAKE_ENCODER(dh, dh, DH, pem);
  1483. MAKE_ENCODER(dhx, dh, DHX, der);
  1484. MAKE_ENCODER(dhx, dh, DHX, pem);
  1485. #endif
  1486. #ifndef OPENSSL_NO_DSA
  1487. MAKE_ENCODER(dsa, dsa, DSA, der);
  1488. MAKE_ENCODER(dsa, dsa, DSA, pem);
  1489. #endif
  1490. #ifndef OPENSSL_NO_EC
  1491. MAKE_ENCODER(ec, ec, EC, der);
  1492. MAKE_ENCODER(ec, ec, EC, pem);
  1493. # ifndef OPENSSL_NO_SM2
  1494. MAKE_ENCODER(sm2, ec, SM2, der);
  1495. MAKE_ENCODER(sm2, ec, SM2, pem);
  1496. # endif
  1497. #endif
  1498. /* Convenience structure names */
  1499. MAKE_ENCODER(rsa, rsa, PKCS1, der);
  1500. MAKE_ENCODER(rsa, rsa, PKCS1, pem);
  1501. MAKE_ENCODER(rsapss, rsa, PKCS1, der);
  1502. MAKE_ENCODER(rsapss, rsa, PKCS1, pem);
  1503. #ifndef OPENSSL_NO_DH
  1504. MAKE_ENCODER(dh, dh, PKCS3, der); /* parameters only */
  1505. MAKE_ENCODER(dh, dh, PKCS3, pem); /* parameters only */
  1506. MAKE_ENCODER(dhx, dh, X9_42, der); /* parameters only */
  1507. MAKE_ENCODER(dhx, dh, X9_42, pem); /* parameters only */
  1508. #endif
  1509. #ifndef OPENSSL_NO_EC
  1510. MAKE_ENCODER(ec, ec, X9_62, der);
  1511. MAKE_ENCODER(ec, ec, X9_62, pem);
  1512. #endif
  1513. #ifndef OPENSSL_NO_ML_DSA
  1514. MAKE_ENCODER(ml_dsa_44, ml_dsa, EncryptedPrivateKeyInfo, der);
  1515. MAKE_ENCODER(ml_dsa_44, ml_dsa, EncryptedPrivateKeyInfo, pem);
  1516. MAKE_ENCODER(ml_dsa_44, ml_dsa, PrivateKeyInfo, der);
  1517. MAKE_ENCODER(ml_dsa_44, ml_dsa, PrivateKeyInfo, pem);
  1518. MAKE_ENCODER(ml_dsa_44, ml_dsa, SubjectPublicKeyInfo, der);
  1519. MAKE_ENCODER(ml_dsa_44, ml_dsa, SubjectPublicKeyInfo, pem);
  1520. MAKE_ENCODER(ml_dsa_65, ml_dsa, EncryptedPrivateKeyInfo, der);
  1521. MAKE_ENCODER(ml_dsa_65, ml_dsa, EncryptedPrivateKeyInfo, pem);
  1522. MAKE_ENCODER(ml_dsa_65, ml_dsa, PrivateKeyInfo, der);
  1523. MAKE_ENCODER(ml_dsa_65, ml_dsa, PrivateKeyInfo, pem);
  1524. MAKE_ENCODER(ml_dsa_65, ml_dsa, SubjectPublicKeyInfo, der);
  1525. MAKE_ENCODER(ml_dsa_65, ml_dsa, SubjectPublicKeyInfo, pem);
  1526. MAKE_ENCODER(ml_dsa_87, ml_dsa, EncryptedPrivateKeyInfo, der);
  1527. MAKE_ENCODER(ml_dsa_87, ml_dsa, EncryptedPrivateKeyInfo, pem);
  1528. MAKE_ENCODER(ml_dsa_87, ml_dsa, PrivateKeyInfo, der);
  1529. MAKE_ENCODER(ml_dsa_87, ml_dsa, PrivateKeyInfo, pem);
  1530. MAKE_ENCODER(ml_dsa_87, ml_dsa, SubjectPublicKeyInfo, der);
  1531. MAKE_ENCODER(ml_dsa_87, ml_dsa, SubjectPublicKeyInfo, pem);
  1532. #endif /* OPENSSL_NO_ML_DSA */