dsa_sig.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085
  1. /*
  2. * Copyright 2019-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. * DSA low level APIs are deprecated for public use, but still ok for
  11. * internal use.
  12. */
  13. #include "internal/deprecated.h"
  14. #include <string.h>
  15. #include <openssl/crypto.h>
  16. #include <openssl/core_dispatch.h>
  17. #include <openssl/core_names.h>
  18. #include <openssl/err.h>
  19. #include <openssl/dsa.h>
  20. #include <openssl/params.h>
  21. #include <openssl/evp.h>
  22. #include <openssl/proverr.h>
  23. #include "internal/nelem.h"
  24. #include "internal/sizes.h"
  25. #include "internal/cryptlib.h"
  26. #include "prov/providercommon.h"
  27. #include "prov/implementations.h"
  28. #include "prov/provider_ctx.h"
  29. #include "prov/securitycheck.h"
  30. #include "prov/der_dsa.h"
  31. #include "crypto/dsa.h"
  32. static OSSL_FUNC_signature_newctx_fn dsa_newctx;
  33. static OSSL_FUNC_signature_sign_init_fn dsa_sign_init;
  34. static OSSL_FUNC_signature_verify_init_fn dsa_verify_init;
  35. static OSSL_FUNC_signature_sign_fn dsa_sign;
  36. static OSSL_FUNC_signature_sign_message_update_fn dsa_signverify_message_update;
  37. static OSSL_FUNC_signature_sign_message_final_fn dsa_sign_message_final;
  38. static OSSL_FUNC_signature_verify_fn dsa_verify;
  39. static OSSL_FUNC_signature_verify_message_update_fn dsa_signverify_message_update;
  40. static OSSL_FUNC_signature_verify_message_final_fn dsa_verify_message_final;
  41. static OSSL_FUNC_signature_digest_sign_init_fn dsa_digest_sign_init;
  42. static OSSL_FUNC_signature_digest_sign_update_fn dsa_digest_signverify_update;
  43. static OSSL_FUNC_signature_digest_sign_final_fn dsa_digest_sign_final;
  44. static OSSL_FUNC_signature_digest_verify_init_fn dsa_digest_verify_init;
  45. static OSSL_FUNC_signature_digest_verify_update_fn dsa_digest_signverify_update;
  46. static OSSL_FUNC_signature_digest_verify_final_fn dsa_digest_verify_final;
  47. static OSSL_FUNC_signature_freectx_fn dsa_freectx;
  48. static OSSL_FUNC_signature_dupctx_fn dsa_dupctx;
  49. static OSSL_FUNC_signature_query_key_types_fn dsa_sigalg_query_key_types;
  50. static OSSL_FUNC_signature_get_ctx_params_fn dsa_get_ctx_params;
  51. static OSSL_FUNC_signature_gettable_ctx_params_fn dsa_gettable_ctx_params;
  52. static OSSL_FUNC_signature_set_ctx_params_fn dsa_set_ctx_params;
  53. static OSSL_FUNC_signature_settable_ctx_params_fn dsa_settable_ctx_params;
  54. static OSSL_FUNC_signature_get_ctx_md_params_fn dsa_get_ctx_md_params;
  55. static OSSL_FUNC_signature_gettable_ctx_md_params_fn dsa_gettable_ctx_md_params;
  56. static OSSL_FUNC_signature_set_ctx_md_params_fn dsa_set_ctx_md_params;
  57. static OSSL_FUNC_signature_settable_ctx_md_params_fn dsa_settable_ctx_md_params;
  58. static OSSL_FUNC_signature_set_ctx_params_fn dsa_sigalg_set_ctx_params;
  59. static OSSL_FUNC_signature_settable_ctx_params_fn dsa_sigalg_settable_ctx_params;
  60. /*
  61. * What's passed as an actual key is defined by the KEYMGMT interface.
  62. * We happen to know that our KEYMGMT simply passes DSA structures, so
  63. * we use that here too.
  64. */
  65. typedef struct {
  66. OSSL_LIB_CTX *libctx;
  67. char *propq;
  68. DSA *dsa;
  69. /* |operation| reuses EVP's operation bitfield */
  70. int operation;
  71. /*
  72. * Flag to determine if a full sigalg is run (1) or if a composable
  73. * signature algorithm is run (0).
  74. *
  75. * When a full sigalg is run (1), this currently affects the following
  76. * other flags, which are to remain untouched after their initialization:
  77. *
  78. * - flag_allow_md (initialized to 0)
  79. */
  80. unsigned int flag_sigalg : 1;
  81. /*
  82. * Flag to determine if the hash function can be changed (1) or not (0)
  83. * Because it's dangerous to change during a DigestSign or DigestVerify
  84. * operation, this flag is cleared by their Init function, and set again
  85. * by their Final function.
  86. */
  87. unsigned int flag_allow_md : 1;
  88. /* If this is set to 1 then the generated k is not random */
  89. unsigned int nonce_type;
  90. /* The Algorithm Identifier of the combined signature algorithm */
  91. unsigned char aid_buf[OSSL_MAX_ALGORITHM_ID_SIZE];
  92. size_t aid_len;
  93. /* main digest */
  94. char mdname[OSSL_MAX_NAME_SIZE];
  95. EVP_MD *md;
  96. EVP_MD_CTX *mdctx;
  97. /* Signature, for verification */
  98. unsigned char *sig;
  99. size_t siglen;
  100. OSSL_FIPS_IND_DECLARE
  101. } PROV_DSA_CTX;
  102. static size_t dsa_get_md_size(const PROV_DSA_CTX *pdsactx)
  103. {
  104. int md_size;
  105. if (pdsactx->md != NULL) {
  106. md_size = EVP_MD_get_size(pdsactx->md);
  107. if (md_size <= 0)
  108. return 0;
  109. return (size_t)md_size;
  110. }
  111. return 0;
  112. }
  113. static void *dsa_newctx(void *provctx, const char *propq)
  114. {
  115. PROV_DSA_CTX *pdsactx;
  116. if (!ossl_prov_is_running())
  117. return NULL;
  118. pdsactx = OPENSSL_zalloc(sizeof(PROV_DSA_CTX));
  119. if (pdsactx == NULL)
  120. return NULL;
  121. pdsactx->libctx = PROV_LIBCTX_OF(provctx);
  122. pdsactx->flag_allow_md = 1;
  123. OSSL_FIPS_IND_INIT(pdsactx)
  124. if (propq != NULL && (pdsactx->propq = OPENSSL_strdup(propq)) == NULL) {
  125. OPENSSL_free(pdsactx);
  126. pdsactx = NULL;
  127. }
  128. return pdsactx;
  129. }
  130. static int dsa_setup_md(PROV_DSA_CTX *ctx,
  131. const char *mdname, const char *mdprops,
  132. const char *desc)
  133. {
  134. EVP_MD *md = NULL;
  135. if (mdprops == NULL)
  136. mdprops = ctx->propq;
  137. if (mdname != NULL) {
  138. WPACKET pkt;
  139. int md_nid;
  140. size_t mdname_len = strlen(mdname);
  141. unsigned char *aid = NULL;
  142. md = EVP_MD_fetch(ctx->libctx, mdname, mdprops);
  143. md_nid = ossl_digest_get_approved_nid(md);
  144. if (md == NULL) {
  145. ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
  146. "%s could not be fetched", mdname);
  147. goto err;
  148. }
  149. if (md_nid == NID_undef) {
  150. ERR_raise_data(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED,
  151. "digest=%s", mdname);
  152. goto err;
  153. }
  154. if (mdname_len >= sizeof(ctx->mdname)) {
  155. ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
  156. "%s exceeds name buffer length", mdname);
  157. goto err;
  158. }
  159. /* XOF digests don't work */
  160. if (EVP_MD_xof(md)) {
  161. ERR_raise(ERR_LIB_PROV, PROV_R_XOF_DIGESTS_NOT_ALLOWED);
  162. goto err;
  163. }
  164. #ifdef FIPS_MODULE
  165. {
  166. int sha1_allowed
  167. = ((ctx->operation
  168. & (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_SIGNMSG)) == 0);
  169. if (!ossl_fips_ind_digest_sign_check(OSSL_FIPS_IND_GET(ctx),
  170. OSSL_FIPS_IND_SETTABLE1,
  171. ctx->libctx,
  172. md_nid, sha1_allowed, 0, desc,
  173. ossl_fips_config_signature_digest_check))
  174. goto err;
  175. }
  176. #endif
  177. if (!ctx->flag_allow_md) {
  178. if (ctx->mdname[0] != '\0'
  179. && !EVP_MD_is_a(md, ctx->mdname)) {
  180. ERR_raise_data(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED,
  181. "digest %s != %s", mdname, ctx->mdname);
  182. goto err;
  183. }
  184. EVP_MD_free(md);
  185. return 1;
  186. }
  187. EVP_MD_CTX_free(ctx->mdctx);
  188. EVP_MD_free(ctx->md);
  189. /*
  190. * We do not care about DER writing errors.
  191. * All it really means is that for some reason, there's no
  192. * AlgorithmIdentifier to be had, but the operation itself is
  193. * still valid, just as long as it's not used to construct
  194. * anything that needs an AlgorithmIdentifier.
  195. */
  196. ctx->aid_len = 0;
  197. if (WPACKET_init_der(&pkt, ctx->aid_buf, sizeof(ctx->aid_buf))
  198. && ossl_DER_w_algorithmIdentifier_DSA_with_MD(&pkt, -1, ctx->dsa,
  199. md_nid)
  200. && WPACKET_finish(&pkt)) {
  201. WPACKET_get_total_written(&pkt, &ctx->aid_len);
  202. aid = WPACKET_get_curr(&pkt);
  203. }
  204. WPACKET_cleanup(&pkt);
  205. if (aid != NULL && ctx->aid_len != 0)
  206. memmove(ctx->aid_buf, aid, ctx->aid_len);
  207. ctx->mdctx = NULL;
  208. ctx->md = md;
  209. OPENSSL_strlcpy(ctx->mdname, mdname, sizeof(ctx->mdname));
  210. }
  211. return 1;
  212. err:
  213. EVP_MD_free(md);
  214. return 0;
  215. }
  216. #ifdef FIPS_MODULE
  217. static int dsa_sign_check_approved(PROV_DSA_CTX *ctx, int signing,
  218. const char *desc)
  219. {
  220. /* DSA Signing is not approved in FIPS 140-3 */
  221. if (signing
  222. && !OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE2,
  223. ctx->libctx, desc, "DSA",
  224. ossl_fips_config_dsa_sign_disallowed))
  225. return 0;
  226. return 1;
  227. }
  228. static int dsa_check_key(PROV_DSA_CTX *ctx, int sign, const char *desc)
  229. {
  230. int approved = ossl_dsa_check_key(ctx->dsa, sign);
  231. if (!approved) {
  232. if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE0,
  233. ctx->libctx, desc, "DSA Key",
  234. ossl_fips_config_signature_digest_check)) {
  235. ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
  236. return 0;
  237. }
  238. }
  239. return 1;
  240. }
  241. #endif
  242. static int
  243. dsa_signverify_init(void *vpdsactx, void *vdsa,
  244. OSSL_FUNC_signature_set_ctx_params_fn *set_ctx_params,
  245. const OSSL_PARAM params[], int operation,
  246. const char *desc)
  247. {
  248. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  249. if (!ossl_prov_is_running()
  250. || pdsactx == NULL)
  251. return 0;
  252. if (vdsa == NULL && pdsactx->dsa == NULL) {
  253. ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
  254. return 0;
  255. }
  256. if (vdsa != NULL) {
  257. if (!DSA_up_ref(vdsa))
  258. return 0;
  259. DSA_free(pdsactx->dsa);
  260. pdsactx->dsa = vdsa;
  261. }
  262. pdsactx->operation = operation;
  263. OSSL_FIPS_IND_SET_APPROVED(pdsactx)
  264. if (!set_ctx_params(pdsactx, params))
  265. return 0;
  266. #ifdef FIPS_MODULE
  267. {
  268. int operation_is_sign
  269. = (operation & (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_SIGNMSG)) != 0;
  270. if (!dsa_sign_check_approved(pdsactx, operation_is_sign, desc))
  271. return 0;
  272. if (!dsa_check_key(pdsactx, operation_is_sign, desc))
  273. return 0;
  274. }
  275. #endif
  276. return 1;
  277. }
  278. static int dsa_sign_init(void *vpdsactx, void *vdsa, const OSSL_PARAM params[])
  279. {
  280. return dsa_signverify_init(vpdsactx, vdsa, dsa_set_ctx_params, params,
  281. EVP_PKEY_OP_SIGN, "DSA Sign Init");
  282. }
  283. /*
  284. * Sign tbs without digesting it first. This is suitable for "primitive"
  285. * signing and signing the digest of a message, i.e. should be used with
  286. * implementations of the keytype related algorithms.
  287. */
  288. static int dsa_sign_directly(void *vpdsactx,
  289. unsigned char *sig, size_t *siglen, size_t sigsize,
  290. const unsigned char *tbs, size_t tbslen)
  291. {
  292. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  293. int ret;
  294. unsigned int sltmp;
  295. size_t dsasize = DSA_size(pdsactx->dsa);
  296. size_t mdsize = dsa_get_md_size(pdsactx);
  297. if (!ossl_prov_is_running())
  298. return 0;
  299. #ifdef FIPS_MODULE
  300. if (!dsa_sign_check_approved(pdsactx, 1, "Sign"))
  301. return 0;
  302. #endif
  303. if (sig == NULL) {
  304. *siglen = dsasize;
  305. return 1;
  306. }
  307. if (sigsize < dsasize)
  308. return 0;
  309. if (mdsize != 0 && tbslen != mdsize)
  310. return 0;
  311. ret = ossl_dsa_sign_int(0, tbs, tbslen, sig, &sltmp, pdsactx->dsa,
  312. pdsactx->nonce_type, pdsactx->mdname,
  313. pdsactx->libctx, pdsactx->propq);
  314. if (ret <= 0)
  315. return 0;
  316. *siglen = sltmp;
  317. return 1;
  318. }
  319. static int dsa_signverify_message_update(void *vpdsactx,
  320. const unsigned char *data,
  321. size_t datalen)
  322. {
  323. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  324. if (pdsactx == NULL)
  325. return 0;
  326. return EVP_DigestUpdate(pdsactx->mdctx, data, datalen);
  327. }
  328. static int dsa_sign_message_final(void *vpdsactx, unsigned char *sig,
  329. size_t *siglen, size_t sigsize)
  330. {
  331. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  332. unsigned char digest[EVP_MAX_MD_SIZE];
  333. unsigned int dlen = 0;
  334. if (!ossl_prov_is_running() || pdsactx == NULL || pdsactx->mdctx == NULL)
  335. return 0;
  336. /*
  337. * If sig is NULL then we're just finding out the sig size. Other fields
  338. * are ignored. Defer to dsa_sign.
  339. */
  340. if (sig != NULL) {
  341. /*
  342. * When this function is used through dsa_digest_sign_final(),
  343. * there is the possibility that some externally provided digests
  344. * exceed EVP_MAX_MD_SIZE. We should probably handle that
  345. * somehow but that problem is much larger than just in DSA.
  346. */
  347. if (!EVP_DigestFinal_ex(pdsactx->mdctx, digest, &dlen))
  348. return 0;
  349. }
  350. return dsa_sign_directly(vpdsactx, sig, siglen, sigsize, digest, dlen);
  351. }
  352. /*
  353. * If signing a message, digest tbs and sign the result.
  354. * Otherwise, sign tbs directly.
  355. */
  356. static int dsa_sign(void *vpdsactx, unsigned char *sig, size_t *siglen,
  357. size_t sigsize, const unsigned char *tbs, size_t tbslen)
  358. {
  359. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  360. if (pdsactx->operation == EVP_PKEY_OP_SIGNMSG) {
  361. /*
  362. * If |sig| is NULL, the caller is only looking for the sig length.
  363. * DO NOT update the input in this case.
  364. */
  365. if (sig == NULL)
  366. return dsa_sign_message_final(pdsactx, sig, siglen, sigsize);
  367. if (dsa_signverify_message_update(pdsactx, tbs, tbslen) <= 0)
  368. return 0;
  369. return dsa_sign_message_final(pdsactx, sig, siglen, sigsize);
  370. }
  371. return dsa_sign_directly(pdsactx, sig, siglen, sigsize, tbs, tbslen);
  372. }
  373. static int dsa_verify_init(void *vpdsactx, void *vdsa,
  374. const OSSL_PARAM params[])
  375. {
  376. return dsa_signverify_init(vpdsactx, vdsa, dsa_set_ctx_params, params,
  377. EVP_PKEY_OP_VERIFY, "DSA Verify Init");
  378. }
  379. static int dsa_verify_directly(void *vpdsactx,
  380. const unsigned char *sig, size_t siglen,
  381. const unsigned char *tbs, size_t tbslen)
  382. {
  383. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  384. size_t mdsize = dsa_get_md_size(pdsactx);
  385. if (!ossl_prov_is_running() || (mdsize != 0 && tbslen != mdsize))
  386. return 0;
  387. return DSA_verify(0, tbs, tbslen, sig, siglen, pdsactx->dsa);
  388. }
  389. static int dsa_verify_set_sig(void *vpdsactx,
  390. const unsigned char *sig, size_t siglen)
  391. {
  392. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  393. OSSL_PARAM params[2];
  394. params[0] =
  395. OSSL_PARAM_construct_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE,
  396. (unsigned char *)sig, siglen);
  397. params[1] = OSSL_PARAM_construct_end();
  398. return dsa_sigalg_set_ctx_params(pdsactx, params);
  399. }
  400. static int dsa_verify_message_final(void *vpdsactx)
  401. {
  402. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  403. unsigned char digest[EVP_MAX_MD_SIZE];
  404. unsigned int dlen = 0;
  405. if (!ossl_prov_is_running())
  406. return 0;
  407. if (pdsactx == NULL || pdsactx->mdctx == NULL)
  408. return 0;
  409. /*
  410. * The digests used here are all known (see dsa_get_md_nid()), so they
  411. * should not exceed the internal buffer size of EVP_MAX_MD_SIZE.
  412. */
  413. if (!EVP_DigestFinal_ex(pdsactx->mdctx, digest, &dlen))
  414. return 0;
  415. return dsa_verify_directly(vpdsactx, pdsactx->sig, pdsactx->siglen,
  416. digest, dlen);
  417. }
  418. /*
  419. * If verifying a message, digest tbs and verify the result.
  420. * Otherwise, verify tbs directly.
  421. */
  422. static int dsa_verify(void *vpdsactx,
  423. const unsigned char *sig, size_t siglen,
  424. const unsigned char *tbs, size_t tbslen)
  425. {
  426. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  427. if (pdsactx->operation == EVP_PKEY_OP_VERIFYMSG) {
  428. if (dsa_verify_set_sig(pdsactx, sig, siglen) <= 0)
  429. return 0;
  430. if (dsa_signverify_message_update(pdsactx, tbs, tbslen) <= 0)
  431. return 0;
  432. return dsa_verify_message_final(pdsactx);
  433. }
  434. return dsa_verify_directly(pdsactx, sig, siglen, tbs, tbslen);
  435. }
  436. /* DigestSign/DigestVerify wrappers */
  437. static int dsa_digest_signverify_init(void *vpdsactx, const char *mdname,
  438. void *vdsa, const OSSL_PARAM params[],
  439. int operation, const char *desc)
  440. {
  441. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  442. if (!ossl_prov_is_running())
  443. return 0;
  444. if (!dsa_signverify_init(vpdsactx, vdsa, dsa_set_ctx_params, params,
  445. operation, desc))
  446. return 0;
  447. if (mdname != NULL
  448. /* was dsa_setup_md already called in dsa_signverify_init()? */
  449. && (mdname[0] == '\0' || OPENSSL_strcasecmp(pdsactx->mdname, mdname) != 0)
  450. && !dsa_setup_md(pdsactx, mdname, NULL, desc))
  451. return 0;
  452. pdsactx->flag_allow_md = 0;
  453. if (pdsactx->mdctx == NULL) {
  454. pdsactx->mdctx = EVP_MD_CTX_new();
  455. if (pdsactx->mdctx == NULL)
  456. goto error;
  457. }
  458. if (!EVP_DigestInit_ex2(pdsactx->mdctx, pdsactx->md, params))
  459. goto error;
  460. return 1;
  461. error:
  462. EVP_MD_CTX_free(pdsactx->mdctx);
  463. pdsactx->mdctx = NULL;
  464. return 0;
  465. }
  466. static int dsa_digest_sign_init(void *vpdsactx, const char *mdname,
  467. void *vdsa, const OSSL_PARAM params[])
  468. {
  469. return dsa_digest_signverify_init(vpdsactx, mdname, vdsa, params,
  470. EVP_PKEY_OP_SIGNMSG,
  471. "DSA Digest Sign Init");
  472. }
  473. static int dsa_digest_signverify_update(void *vpdsactx, const unsigned char *data,
  474. size_t datalen)
  475. {
  476. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  477. if (pdsactx == NULL)
  478. return 0;
  479. /* Sigalg implementations shouldn't do digest_sign */
  480. if (pdsactx->flag_sigalg)
  481. return 0;
  482. return dsa_signverify_message_update(vpdsactx, data, datalen);
  483. }
  484. static int dsa_digest_sign_final(void *vpdsactx, unsigned char *sig,
  485. size_t *siglen, size_t sigsize)
  486. {
  487. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  488. int ok = 0;
  489. if (pdsactx == NULL)
  490. return 0;
  491. /* Sigalg implementations shouldn't do digest_sign */
  492. if (pdsactx->flag_sigalg)
  493. return 0;
  494. ok = dsa_sign_message_final(pdsactx, sig, siglen, sigsize);
  495. pdsactx->flag_allow_md = 1;
  496. return ok;
  497. }
  498. static int dsa_digest_verify_init(void *vpdsactx, const char *mdname,
  499. void *vdsa, const OSSL_PARAM params[])
  500. {
  501. return dsa_digest_signverify_init(vpdsactx, mdname, vdsa, params,
  502. EVP_PKEY_OP_VERIFYMSG,
  503. "DSA Digest Verify Init");
  504. }
  505. int dsa_digest_verify_final(void *vpdsactx, const unsigned char *sig,
  506. size_t siglen)
  507. {
  508. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  509. int ok = 0;
  510. if (pdsactx == NULL)
  511. return 0;
  512. /* Sigalg implementations shouldn't do digest_verify */
  513. if (pdsactx->flag_sigalg)
  514. return 0;
  515. if (dsa_verify_set_sig(pdsactx, sig, siglen))
  516. ok = dsa_verify_message_final(vpdsactx);
  517. pdsactx->flag_allow_md = 1;
  518. return ok;
  519. }
  520. static void dsa_freectx(void *vpdsactx)
  521. {
  522. PROV_DSA_CTX *ctx = (PROV_DSA_CTX *)vpdsactx;
  523. EVP_MD_CTX_free(ctx->mdctx);
  524. EVP_MD_free(ctx->md);
  525. OPENSSL_free(ctx->sig);
  526. OPENSSL_free(ctx->propq);
  527. DSA_free(ctx->dsa);
  528. OPENSSL_free(ctx);
  529. }
  530. static void *dsa_dupctx(void *vpdsactx)
  531. {
  532. PROV_DSA_CTX *srcctx = (PROV_DSA_CTX *)vpdsactx;
  533. PROV_DSA_CTX *dstctx;
  534. if (!ossl_prov_is_running())
  535. return NULL;
  536. dstctx = OPENSSL_zalloc(sizeof(*srcctx));
  537. if (dstctx == NULL)
  538. return NULL;
  539. *dstctx = *srcctx;
  540. dstctx->dsa = NULL;
  541. dstctx->propq = NULL;
  542. if (srcctx->dsa != NULL && !DSA_up_ref(srcctx->dsa))
  543. goto err;
  544. dstctx->dsa = srcctx->dsa;
  545. if (srcctx->md != NULL && !EVP_MD_up_ref(srcctx->md))
  546. goto err;
  547. dstctx->md = srcctx->md;
  548. if (srcctx->mdctx != NULL) {
  549. dstctx->mdctx = EVP_MD_CTX_new();
  550. if (dstctx->mdctx == NULL
  551. || !EVP_MD_CTX_copy_ex(dstctx->mdctx, srcctx->mdctx))
  552. goto err;
  553. }
  554. if (srcctx->propq != NULL) {
  555. dstctx->propq = OPENSSL_strdup(srcctx->propq);
  556. if (dstctx->propq == NULL)
  557. goto err;
  558. }
  559. return dstctx;
  560. err:
  561. dsa_freectx(dstctx);
  562. return NULL;
  563. }
  564. static int dsa_get_ctx_params(void *vpdsactx, OSSL_PARAM *params)
  565. {
  566. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  567. OSSL_PARAM *p;
  568. if (pdsactx == NULL)
  569. return 0;
  570. p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_ALGORITHM_ID);
  571. if (p != NULL
  572. && !OSSL_PARAM_set_octet_string(p,
  573. pdsactx->aid_len == 0 ? NULL : pdsactx->aid_buf,
  574. pdsactx->aid_len))
  575. return 0;
  576. p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_DIGEST);
  577. if (p != NULL && !OSSL_PARAM_set_utf8_string(p, pdsactx->mdname))
  578. return 0;
  579. p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_NONCE_TYPE);
  580. if (p != NULL && !OSSL_PARAM_set_uint(p, pdsactx->nonce_type))
  581. return 0;
  582. if (!OSSL_FIPS_IND_GET_CTX_PARAM(pdsactx, params))
  583. return 0;
  584. return 1;
  585. }
  586. static const OSSL_PARAM known_gettable_ctx_params[] = {
  587. OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_ALGORITHM_ID, NULL, 0),
  588. OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
  589. OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_NONCE_TYPE, NULL),
  590. OSSL_FIPS_IND_GETTABLE_CTX_PARAM()
  591. OSSL_PARAM_END
  592. };
  593. static const OSSL_PARAM *dsa_gettable_ctx_params(ossl_unused void *ctx,
  594. ossl_unused void *provctx)
  595. {
  596. return known_gettable_ctx_params;
  597. }
  598. /**
  599. * @brief Setup common params for dsa_set_ctx_params and dsa_sigalg_set_ctx_params
  600. * The caller is responsible for checking |vpdsactx| is not NULL and |params|
  601. * is not empty.
  602. */
  603. static int dsa_common_set_ctx_params(void *vpdsactx, const OSSL_PARAM params[])
  604. {
  605. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  606. const OSSL_PARAM *p;
  607. if (!OSSL_FIPS_IND_SET_CTX_PARAM(pdsactx, OSSL_FIPS_IND_SETTABLE0, params,
  608. OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK))
  609. return 0;
  610. if (!OSSL_FIPS_IND_SET_CTX_PARAM(pdsactx, OSSL_FIPS_IND_SETTABLE1, params,
  611. OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK))
  612. return 0;
  613. if (!OSSL_FIPS_IND_SET_CTX_PARAM(pdsactx, OSSL_FIPS_IND_SETTABLE2, params,
  614. OSSL_SIGNATURE_PARAM_FIPS_SIGN_CHECK))
  615. return 0;
  616. p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_NONCE_TYPE);
  617. if (p != NULL
  618. && !OSSL_PARAM_get_uint(p, &pdsactx->nonce_type))
  619. return 0;
  620. return 1;
  621. }
  622. #define DSA_COMMON_SETTABLE_CTX_PARAMS \
  623. OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_NONCE_TYPE, NULL), \
  624. OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK) \
  625. OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK) \
  626. OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_SIGNATURE_PARAM_FIPS_SIGN_CHECK) \
  627. OSSL_PARAM_END
  628. static int dsa_set_ctx_params(void *vpdsactx, const OSSL_PARAM params[])
  629. {
  630. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  631. const OSSL_PARAM *p;
  632. int ret;
  633. if (pdsactx == NULL)
  634. return 0;
  635. if (ossl_param_is_empty(params))
  636. return 1;
  637. if ((ret = dsa_common_set_ctx_params(pdsactx, params)) <= 0)
  638. return ret;
  639. p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_DIGEST);
  640. if (p != NULL) {
  641. char mdname[OSSL_MAX_NAME_SIZE] = "", *pmdname = mdname;
  642. char mdprops[OSSL_MAX_PROPQUERY_SIZE] = "", *pmdprops = mdprops;
  643. const OSSL_PARAM *propsp =
  644. OSSL_PARAM_locate_const(params,
  645. OSSL_SIGNATURE_PARAM_PROPERTIES);
  646. if (!OSSL_PARAM_get_utf8_string(p, &pmdname, sizeof(mdname)))
  647. return 0;
  648. if (propsp != NULL
  649. && !OSSL_PARAM_get_utf8_string(propsp, &pmdprops, sizeof(mdprops)))
  650. return 0;
  651. if (!dsa_setup_md(pdsactx, mdname, mdprops, "DSA Set Ctx"))
  652. return 0;
  653. }
  654. return 1;
  655. }
  656. static const OSSL_PARAM settable_ctx_params[] = {
  657. OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
  658. OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PROPERTIES, NULL, 0),
  659. DSA_COMMON_SETTABLE_CTX_PARAMS
  660. };
  661. static const OSSL_PARAM settable_ctx_params_no_digest[] = {
  662. OSSL_PARAM_END
  663. };
  664. static const OSSL_PARAM *dsa_settable_ctx_params(void *vpdsactx,
  665. ossl_unused void *provctx)
  666. {
  667. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  668. if (pdsactx != NULL && !pdsactx->flag_allow_md)
  669. return settable_ctx_params_no_digest;
  670. return settable_ctx_params;
  671. }
  672. static int dsa_get_ctx_md_params(void *vpdsactx, OSSL_PARAM *params)
  673. {
  674. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  675. if (pdsactx->mdctx == NULL)
  676. return 0;
  677. return EVP_MD_CTX_get_params(pdsactx->mdctx, params);
  678. }
  679. static const OSSL_PARAM *dsa_gettable_ctx_md_params(void *vpdsactx)
  680. {
  681. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  682. if (pdsactx->md == NULL)
  683. return 0;
  684. return EVP_MD_gettable_ctx_params(pdsactx->md);
  685. }
  686. static int dsa_set_ctx_md_params(void *vpdsactx, const OSSL_PARAM params[])
  687. {
  688. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  689. if (pdsactx->mdctx == NULL)
  690. return 0;
  691. return EVP_MD_CTX_set_params(pdsactx->mdctx, params);
  692. }
  693. static const OSSL_PARAM *dsa_settable_ctx_md_params(void *vpdsactx)
  694. {
  695. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  696. if (pdsactx->md == NULL)
  697. return 0;
  698. return EVP_MD_settable_ctx_params(pdsactx->md);
  699. }
  700. const OSSL_DISPATCH ossl_dsa_signature_functions[] = {
  701. { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))dsa_newctx },
  702. { OSSL_FUNC_SIGNATURE_SIGN_INIT, (void (*)(void))dsa_sign_init },
  703. { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))dsa_sign },
  704. { OSSL_FUNC_SIGNATURE_VERIFY_INIT, (void (*)(void))dsa_verify_init },
  705. { OSSL_FUNC_SIGNATURE_VERIFY, (void (*)(void))dsa_verify },
  706. { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT,
  707. (void (*)(void))dsa_digest_sign_init },
  708. { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_UPDATE,
  709. (void (*)(void))dsa_digest_signverify_update },
  710. { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_FINAL,
  711. (void (*)(void))dsa_digest_sign_final },
  712. { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_INIT,
  713. (void (*)(void))dsa_digest_verify_init },
  714. { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_UPDATE,
  715. (void (*)(void))dsa_digest_signverify_update },
  716. { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_FINAL,
  717. (void (*)(void))dsa_digest_verify_final },
  718. { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))dsa_freectx },
  719. { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))dsa_dupctx },
  720. { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS, (void (*)(void))dsa_get_ctx_params },
  721. { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS,
  722. (void (*)(void))dsa_gettable_ctx_params },
  723. { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS, (void (*)(void))dsa_set_ctx_params },
  724. { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS,
  725. (void (*)(void))dsa_settable_ctx_params },
  726. { OSSL_FUNC_SIGNATURE_GET_CTX_MD_PARAMS,
  727. (void (*)(void))dsa_get_ctx_md_params },
  728. { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_MD_PARAMS,
  729. (void (*)(void))dsa_gettable_ctx_md_params },
  730. { OSSL_FUNC_SIGNATURE_SET_CTX_MD_PARAMS,
  731. (void (*)(void))dsa_set_ctx_md_params },
  732. { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_MD_PARAMS,
  733. (void (*)(void))dsa_settable_ctx_md_params },
  734. OSSL_DISPATCH_END
  735. };
  736. /* ------------------------------------------------------------------ */
  737. /*
  738. * So called sigalgs (composite DSA+hash) implemented below. They
  739. * are pretty much hard coded.
  740. */
  741. static OSSL_FUNC_signature_query_key_types_fn dsa_sigalg_query_key_types;
  742. static OSSL_FUNC_signature_settable_ctx_params_fn dsa_sigalg_settable_ctx_params;
  743. static OSSL_FUNC_signature_set_ctx_params_fn dsa_sigalg_set_ctx_params;
  744. /*
  745. * dsa_sigalg_signverify_init() is almost like dsa_digest_signverify_init(),
  746. * just doesn't allow fetching an MD from whatever the user chooses.
  747. */
  748. static int dsa_sigalg_signverify_init(void *vpdsactx, void *vdsa,
  749. OSSL_FUNC_signature_set_ctx_params_fn *set_ctx_params,
  750. const OSSL_PARAM params[],
  751. const char *mdname,
  752. int operation, const char *desc)
  753. {
  754. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  755. if (!ossl_prov_is_running())
  756. return 0;
  757. if (!dsa_signverify_init(vpdsactx, vdsa, set_ctx_params, params, operation,
  758. desc))
  759. return 0;
  760. if (!dsa_setup_md(pdsactx, mdname, NULL, desc))
  761. return 0;
  762. pdsactx->flag_sigalg = 1;
  763. pdsactx->flag_allow_md = 0;
  764. if (pdsactx->mdctx == NULL) {
  765. pdsactx->mdctx = EVP_MD_CTX_new();
  766. if (pdsactx->mdctx == NULL)
  767. goto error;
  768. }
  769. if (!EVP_DigestInit_ex2(pdsactx->mdctx, pdsactx->md, params))
  770. goto error;
  771. return 1;
  772. error:
  773. EVP_MD_CTX_free(pdsactx->mdctx);
  774. pdsactx->mdctx = NULL;
  775. return 0;
  776. }
  777. static const char **dsa_sigalg_query_key_types(void)
  778. {
  779. static const char *keytypes[] = { "DSA", NULL };
  780. return keytypes;
  781. }
  782. static const OSSL_PARAM settable_sigalg_ctx_params[] = {
  783. OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE, NULL, 0),
  784. DSA_COMMON_SETTABLE_CTX_PARAMS
  785. };
  786. static const OSSL_PARAM *dsa_sigalg_settable_ctx_params(void *vpdsactx,
  787. ossl_unused void *provctx)
  788. {
  789. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  790. if (pdsactx != NULL && pdsactx->operation == EVP_PKEY_OP_VERIFYMSG)
  791. return settable_sigalg_ctx_params;
  792. return NULL;
  793. }
  794. static int dsa_sigalg_set_ctx_params(void *vpdsactx, const OSSL_PARAM params[])
  795. {
  796. PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
  797. const OSSL_PARAM *p;
  798. int ret;
  799. if (pdsactx == NULL)
  800. return 0;
  801. if (ossl_param_is_empty(params))
  802. return 1;
  803. if ((ret = dsa_common_set_ctx_params(pdsactx, params)) <= 0)
  804. return ret;
  805. if (pdsactx->operation == EVP_PKEY_OP_VERIFYMSG) {
  806. p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_SIGNATURE);
  807. if (p != NULL) {
  808. OPENSSL_free(pdsactx->sig);
  809. pdsactx->sig = NULL;
  810. pdsactx->siglen = 0;
  811. if (!OSSL_PARAM_get_octet_string(p, (void **)&pdsactx->sig,
  812. 0, &pdsactx->siglen))
  813. return 0;
  814. }
  815. }
  816. return 1;
  817. }
  818. #define IMPL_DSA_SIGALG(md, MD) \
  819. static OSSL_FUNC_signature_sign_init_fn dsa_##md##_sign_init; \
  820. static OSSL_FUNC_signature_sign_message_init_fn \
  821. dsa_##md##_sign_message_init; \
  822. static OSSL_FUNC_signature_verify_init_fn dsa_##md##_verify_init; \
  823. static OSSL_FUNC_signature_verify_message_init_fn \
  824. dsa_##md##_verify_message_init; \
  825. \
  826. static int \
  827. dsa_##md##_sign_init(void *vpdsactx, void *vdsa, \
  828. const OSSL_PARAM params[]) \
  829. { \
  830. static const char desc[] = "DSA-" #MD " Sign Init"; \
  831. \
  832. return dsa_sigalg_signverify_init(vpdsactx, vdsa, \
  833. dsa_sigalg_set_ctx_params, \
  834. params, #MD, \
  835. EVP_PKEY_OP_SIGN, \
  836. desc); \
  837. } \
  838. \
  839. static int \
  840. dsa_##md##_sign_message_init(void *vpdsactx, void *vdsa, \
  841. const OSSL_PARAM params[]) \
  842. { \
  843. static const char desc[] = "DSA-" #MD " Sign Message Init"; \
  844. \
  845. return dsa_sigalg_signverify_init(vpdsactx, vdsa, \
  846. dsa_sigalg_set_ctx_params, \
  847. params, #MD, \
  848. EVP_PKEY_OP_SIGNMSG, \
  849. desc); \
  850. } \
  851. \
  852. static int \
  853. dsa_##md##_verify_init(void *vpdsactx, void *vdsa, \
  854. const OSSL_PARAM params[]) \
  855. { \
  856. static const char desc[] = "DSA-" #MD " Verify Init"; \
  857. \
  858. return dsa_sigalg_signverify_init(vpdsactx, vdsa, \
  859. dsa_sigalg_set_ctx_params, \
  860. params, #MD, \
  861. EVP_PKEY_OP_VERIFY, \
  862. desc); \
  863. } \
  864. \
  865. static int \
  866. dsa_##md##_verify_message_init(void *vpdsactx, void *vdsa, \
  867. const OSSL_PARAM params[]) \
  868. { \
  869. static const char desc[] = "DSA-" #MD " Verify Message Init"; \
  870. \
  871. return dsa_sigalg_signverify_init(vpdsactx, vdsa, \
  872. dsa_sigalg_set_ctx_params, \
  873. params, #MD, \
  874. EVP_PKEY_OP_VERIFYMSG, \
  875. desc); \
  876. } \
  877. \
  878. const OSSL_DISPATCH ossl_dsa_##md##_signature_functions[] = { \
  879. { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))dsa_newctx }, \
  880. { OSSL_FUNC_SIGNATURE_SIGN_INIT, \
  881. (void (*)(void))dsa_##md##_sign_init }, \
  882. { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))dsa_sign }, \
  883. { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_INIT, \
  884. (void (*)(void))dsa_##md##_sign_message_init }, \
  885. { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_UPDATE, \
  886. (void (*)(void))dsa_signverify_message_update }, \
  887. { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_FINAL, \
  888. (void (*)(void))dsa_sign_message_final }, \
  889. { OSSL_FUNC_SIGNATURE_VERIFY_INIT, \
  890. (void (*)(void))dsa_##md##_verify_init }, \
  891. { OSSL_FUNC_SIGNATURE_VERIFY, \
  892. (void (*)(void))dsa_verify }, \
  893. { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_INIT, \
  894. (void (*)(void))dsa_##md##_verify_message_init }, \
  895. { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_UPDATE, \
  896. (void (*)(void))dsa_signverify_message_update }, \
  897. { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_FINAL, \
  898. (void (*)(void))dsa_verify_message_final }, \
  899. { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))dsa_freectx }, \
  900. { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))dsa_dupctx }, \
  901. { OSSL_FUNC_SIGNATURE_QUERY_KEY_TYPES, \
  902. (void (*)(void))dsa_sigalg_query_key_types }, \
  903. { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS, \
  904. (void (*)(void))dsa_get_ctx_params }, \
  905. { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS, \
  906. (void (*)(void))dsa_gettable_ctx_params }, \
  907. { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS, \
  908. (void (*)(void))dsa_sigalg_set_ctx_params }, \
  909. { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS, \
  910. (void (*)(void))dsa_sigalg_settable_ctx_params }, \
  911. OSSL_DISPATCH_END \
  912. }
  913. IMPL_DSA_SIGALG(sha1, SHA1);
  914. IMPL_DSA_SIGALG(sha224, SHA2-224);
  915. IMPL_DSA_SIGALG(sha256, SHA2-256);
  916. IMPL_DSA_SIGALG(sha384, SHA2-384);
  917. IMPL_DSA_SIGALG(sha512, SHA2-512);
  918. IMPL_DSA_SIGALG(sha3_224, SHA3-224);
  919. IMPL_DSA_SIGALG(sha3_256, SHA3-256);
  920. IMPL_DSA_SIGALG(sha3_384, SHA3-384);
  921. IMPL_DSA_SIGALG(sha3_512, SHA3-512);