ecdsa_sig.c 39 KB

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