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