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