Coverage Report

Created: 2022-11-30 06:20

/src/openssl/crypto/dsa/dsa_ameth.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
3
 * 2006.
4
 */
5
/* ====================================================================
6
 * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.
7
 *
8
 * Redistribution and use in source and binary forms, with or without
9
 * modification, are permitted provided that the following conditions
10
 * are met:
11
 *
12
 * 1. Redistributions of source code must retain the above copyright
13
 *    notice, this list of conditions and the following disclaimer.
14
 *
15
 * 2. Redistributions in binary form must reproduce the above copyright
16
 *    notice, this list of conditions and the following disclaimer in
17
 *    the documentation and/or other materials provided with the
18
 *    distribution.
19
 *
20
 * 3. All advertising materials mentioning features or use of this
21
 *    software must display the following acknowledgment:
22
 *    "This product includes software developed by the OpenSSL Project
23
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24
 *
25
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26
 *    endorse or promote products derived from this software without
27
 *    prior written permission. For written permission, please contact
28
 *    licensing@OpenSSL.org.
29
 *
30
 * 5. Products derived from this software may not be called "OpenSSL"
31
 *    nor may "OpenSSL" appear in their names without prior written
32
 *    permission of the OpenSSL Project.
33
 *
34
 * 6. Redistributions of any form whatsoever must retain the following
35
 *    acknowledgment:
36
 *    "This product includes software developed by the OpenSSL Project
37
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38
 *
39
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50
 * OF THE POSSIBILITY OF SUCH DAMAGE.
51
 * ====================================================================
52
 *
53
 * This product includes cryptographic software written by Eric Young
54
 * (eay@cryptsoft.com).  This product includes software written by Tim
55
 * Hudson (tjh@cryptsoft.com).
56
 *
57
 */
58
59
#include <stdio.h>
60
#include "cryptlib.h"
61
#include <openssl/x509.h>
62
#include <openssl/asn1.h>
63
#include <openssl/dsa.h>
64
#include <openssl/bn.h>
65
#ifndef OPENSSL_NO_CMS
66
# include <openssl/cms.h>
67
#endif
68
#include "asn1_locl.h"
69
70
static int dsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)
71
0
{
72
0
    const unsigned char *p, *pm;
73
0
    int pklen, pmlen;
74
0
    int ptype;
75
0
    void *pval;
76
0
    ASN1_STRING *pstr;
77
0
    X509_ALGOR *palg;
78
0
    ASN1_INTEGER *public_key = NULL;
79
80
0
    DSA *dsa = NULL;
81
82
0
    if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, &palg, pubkey))
83
0
        return 0;
84
0
    X509_ALGOR_get0(NULL, &ptype, &pval, palg);
85
86
0
    if (ptype == V_ASN1_SEQUENCE) {
87
0
        pstr = pval;
88
0
        pm = pstr->data;
89
0
        pmlen = pstr->length;
90
91
0
        if (!(dsa = d2i_DSAparams(NULL, &pm, pmlen))) {
92
0
            DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_DECODE_ERROR);
93
0
            goto err;
94
0
        }
95
96
0
    } else if ((ptype == V_ASN1_NULL) || (ptype == V_ASN1_UNDEF)) {
97
0
        if (!(dsa = DSA_new())) {
98
0
            DSAerr(DSA_F_DSA_PUB_DECODE, ERR_R_MALLOC_FAILURE);
99
0
            goto err;
100
0
        }
101
0
    } else {
102
0
        DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_PARAMETER_ENCODING_ERROR);
103
0
        goto err;
104
0
    }
105
106
0
    if (!(public_key = d2i_ASN1_INTEGER(NULL, &p, pklen))) {
107
0
        DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_DECODE_ERROR);
108
0
        goto err;
109
0
    }
110
111
0
    if (!(dsa->pub_key = ASN1_INTEGER_to_BN(public_key, NULL))) {
112
0
        DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_BN_DECODE_ERROR);
113
0
        goto err;
114
0
    }
115
116
0
    ASN1_INTEGER_free(public_key);
117
0
    EVP_PKEY_assign_DSA(pkey, dsa);
118
0
    return 1;
119
120
0
 err:
121
0
    if (public_key)
122
0
        ASN1_INTEGER_free(public_key);
123
0
    if (dsa)
124
0
        DSA_free(dsa);
125
0
    return 0;
126
127
0
}
128
129
static int dsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
130
0
{
131
0
    DSA *dsa;
132
0
    int ptype;
133
0
    unsigned char *penc = NULL;
134
0
    int penclen;
135
0
    ASN1_STRING *str = NULL;
136
137
0
    dsa = pkey->pkey.dsa;
138
0
    if (pkey->save_parameters && dsa->p && dsa->q && dsa->g) {
139
0
        str = ASN1_STRING_new();
140
0
        if (!str) {
141
0
            DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
142
0
            goto err;
143
0
        }
144
0
        str->length = i2d_DSAparams(dsa, &str->data);
145
0
        if (str->length <= 0) {
146
0
            DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
147
0
            goto err;
148
0
        }
149
0
        ptype = V_ASN1_SEQUENCE;
150
0
    } else
151
0
        ptype = V_ASN1_UNDEF;
152
153
0
    dsa->write_params = 0;
154
155
0
    penclen = i2d_DSAPublicKey(dsa, &penc);
156
157
0
    if (penclen <= 0) {
158
0
        DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
159
0
        goto err;
160
0
    }
161
162
0
    if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(EVP_PKEY_DSA),
163
0
                               ptype, str, penc, penclen))
164
0
        return 1;
165
166
0
 err:
167
0
    if (penc)
168
0
        OPENSSL_free(penc);
169
0
    if (str)
170
0
        ASN1_STRING_free(str);
171
172
0
    return 0;
173
0
}
174
175
/*
176
 * In PKCS#8 DSA: you just get a private key integer and parameters in the
177
 * AlgorithmIdentifier the pubkey must be recalculated.
178
 */
179
180
static int dsa_priv_decode(EVP_PKEY *pkey, PKCS8_PRIV_KEY_INFO *p8)
181
0
{
182
0
    const unsigned char *p, *pm;
183
0
    int pklen, pmlen;
184
0
    int ptype;
185
0
    void *pval;
186
0
    ASN1_STRING *pstr;
187
0
    X509_ALGOR *palg;
188
0
    ASN1_INTEGER *privkey = NULL;
189
0
    BN_CTX *ctx = NULL;
190
191
0
    STACK_OF(ASN1_TYPE) *ndsa = NULL;
192
0
    DSA *dsa = NULL;
193
194
0
    int ret = 0;
195
196
0
    if (!PKCS8_pkey_get0(NULL, &p, &pklen, &palg, p8))
197
0
        return 0;
198
0
    X509_ALGOR_get0(NULL, &ptype, &pval, palg);
199
200
    /* Check for broken DSA PKCS#8, UGH! */
201
0
    if (*p == (V_ASN1_SEQUENCE | V_ASN1_CONSTRUCTED)) {
202
0
        ASN1_TYPE *t1, *t2;
203
0
        if (!(ndsa = d2i_ASN1_SEQUENCE_ANY(NULL, &p, pklen)))
204
0
            goto decerr;
205
0
        if (sk_ASN1_TYPE_num(ndsa) != 2)
206
0
            goto decerr;
207
        /*-
208
         * Handle Two broken types:
209
         * SEQUENCE {parameters, priv_key}
210
         * SEQUENCE {pub_key, priv_key}
211
         */
212
213
0
        t1 = sk_ASN1_TYPE_value(ndsa, 0);
214
0
        t2 = sk_ASN1_TYPE_value(ndsa, 1);
215
0
        if (t1->type == V_ASN1_SEQUENCE) {
216
0
            p8->broken = PKCS8_EMBEDDED_PARAM;
217
0
            pval = t1->value.ptr;
218
0
        } else if (ptype == V_ASN1_SEQUENCE)
219
0
            p8->broken = PKCS8_NS_DB;
220
0
        else
221
0
            goto decerr;
222
223
0
        if (t2->type != V_ASN1_INTEGER)
224
0
            goto decerr;
225
226
0
        privkey = t2->value.integer;
227
0
    } else {
228
0
        const unsigned char *q = p;
229
0
        if (!(privkey = d2i_ASN1_INTEGER(NULL, &p, pklen)))
230
0
            goto decerr;
231
0
        if (privkey->type == V_ASN1_NEG_INTEGER) {
232
0
            p8->broken = PKCS8_NEG_PRIVKEY;
233
0
            ASN1_STRING_clear_free(privkey);
234
0
            if (!(privkey = d2i_ASN1_UINTEGER(NULL, &q, pklen)))
235
0
                goto decerr;
236
0
        }
237
0
        if (ptype != V_ASN1_SEQUENCE)
238
0
            goto decerr;
239
0
    }
240
241
0
    pstr = pval;
242
0
    pm = pstr->data;
243
0
    pmlen = pstr->length;
244
0
    if (!(dsa = d2i_DSAparams(NULL, &pm, pmlen)))
245
0
        goto decerr;
246
    /* We have parameters now set private key */
247
0
    if (!(dsa->priv_key = ASN1_INTEGER_to_BN(privkey, NULL))) {
248
0
        DSAerr(DSA_F_DSA_PRIV_DECODE, DSA_R_BN_ERROR);
249
0
        goto dsaerr;
250
0
    }
251
    /* Calculate public key */
252
0
    if (!(dsa->pub_key = BN_new())) {
253
0
        DSAerr(DSA_F_DSA_PRIV_DECODE, ERR_R_MALLOC_FAILURE);
254
0
        goto dsaerr;
255
0
    }
256
0
    if (!(ctx = BN_CTX_new())) {
257
0
        DSAerr(DSA_F_DSA_PRIV_DECODE, ERR_R_MALLOC_FAILURE);
258
0
        goto dsaerr;
259
0
    }
260
261
0
    BN_set_flags(dsa->priv_key, BN_FLG_CONSTTIME);
262
0
    if (!BN_mod_exp(dsa->pub_key, dsa->g, dsa->priv_key, dsa->p, ctx)) {
263
0
        DSAerr(DSA_F_DSA_PRIV_DECODE, DSA_R_BN_ERROR);
264
0
        goto dsaerr;
265
0
    }
266
267
0
    EVP_PKEY_assign_DSA(pkey, dsa);
268
269
0
    ret = 1;
270
0
    goto done;
271
272
0
 decerr:
273
0
    DSAerr(DSA_F_DSA_PRIV_DECODE, DSA_R_DECODE_ERROR);
274
0
 dsaerr:
275
0
    DSA_free(dsa);
276
0
 done:
277
0
    BN_CTX_free(ctx);
278
0
    if (ndsa)
279
0
        sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free);
280
0
    else
281
0
        ASN1_STRING_clear_free(privkey);
282
0
    return ret;
283
0
}
284
285
static int dsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey)
286
0
{
287
0
    ASN1_STRING *params = NULL;
288
0
    ASN1_INTEGER *prkey = NULL;
289
0
    unsigned char *dp = NULL;
290
0
    int dplen;
291
292
0
    if (!pkey->pkey.dsa || !pkey->pkey.dsa->priv_key) {
293
0
        DSAerr(DSA_F_DSA_PRIV_ENCODE, DSA_R_MISSING_PARAMETERS);
294
0
        goto err;
295
0
    }
296
297
0
    params = ASN1_STRING_new();
298
299
0
    if (!params) {
300
0
        DSAerr(DSA_F_DSA_PRIV_ENCODE, ERR_R_MALLOC_FAILURE);
301
0
        goto err;
302
0
    }
303
304
0
    params->length = i2d_DSAparams(pkey->pkey.dsa, &params->data);
305
0
    if (params->length <= 0) {
306
0
        DSAerr(DSA_F_DSA_PRIV_ENCODE, ERR_R_MALLOC_FAILURE);
307
0
        goto err;
308
0
    }
309
0
    params->type = V_ASN1_SEQUENCE;
310
311
    /* Get private key into integer */
312
0
    prkey = BN_to_ASN1_INTEGER(pkey->pkey.dsa->priv_key, NULL);
313
314
0
    if (!prkey) {
315
0
        DSAerr(DSA_F_DSA_PRIV_ENCODE, DSA_R_BN_ERROR);
316
0
        goto err;
317
0
    }
318
319
0
    dplen = i2d_ASN1_INTEGER(prkey, &dp);
320
321
0
    ASN1_STRING_clear_free(prkey);
322
0
    prkey = NULL;
323
324
0
    if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(NID_dsa), 0,
325
0
                         V_ASN1_SEQUENCE, params, dp, dplen))
326
0
        goto err;
327
328
0
    return 1;
329
330
0
 err:
331
0
    if (dp != NULL)
332
0
        OPENSSL_free(dp);
333
0
    if (params != NULL)
334
0
        ASN1_STRING_free(params);
335
0
    if (prkey != NULL)
336
0
        ASN1_STRING_clear_free(prkey);
337
0
    return 0;
338
0
}
339
340
static int int_dsa_size(const EVP_PKEY *pkey)
341
0
{
342
0
    return (DSA_size(pkey->pkey.dsa));
343
0
}
344
345
static int dsa_bits(const EVP_PKEY *pkey)
346
0
{
347
0
    return BN_num_bits(pkey->pkey.dsa->p);
348
0
}
349
350
static int dsa_missing_parameters(const EVP_PKEY *pkey)
351
0
{
352
0
    DSA *dsa;
353
0
    dsa = pkey->pkey.dsa;
354
0
    if (dsa == NULL || dsa->p == NULL || dsa->q == NULL || dsa->g == NULL)
355
0
        return 1;
356
0
    return 0;
357
0
}
358
359
static int dsa_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
360
0
{
361
0
    BIGNUM *a;
362
363
0
    if ((a = BN_dup(from->pkey.dsa->p)) == NULL)
364
0
        return 0;
365
0
    if (to->pkey.dsa->p != NULL)
366
0
        BN_free(to->pkey.dsa->p);
367
0
    to->pkey.dsa->p = a;
368
369
0
    if ((a = BN_dup(from->pkey.dsa->q)) == NULL)
370
0
        return 0;
371
0
    if (to->pkey.dsa->q != NULL)
372
0
        BN_free(to->pkey.dsa->q);
373
0
    to->pkey.dsa->q = a;
374
375
0
    if ((a = BN_dup(from->pkey.dsa->g)) == NULL)
376
0
        return 0;
377
0
    if (to->pkey.dsa->g != NULL)
378
0
        BN_free(to->pkey.dsa->g);
379
0
    to->pkey.dsa->g = a;
380
0
    return 1;
381
0
}
382
383
static int dsa_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b)
384
0
{
385
0
    if (BN_cmp(a->pkey.dsa->p, b->pkey.dsa->p) ||
386
0
        BN_cmp(a->pkey.dsa->q, b->pkey.dsa->q) ||
387
0
        BN_cmp(a->pkey.dsa->g, b->pkey.dsa->g))
388
0
        return 0;
389
0
    else
390
0
        return 1;
391
0
}
392
393
static int dsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
394
0
{
395
0
    if (BN_cmp(b->pkey.dsa->pub_key, a->pkey.dsa->pub_key) != 0)
396
0
        return 0;
397
0
    else
398
0
        return 1;
399
0
}
400
401
static void int_dsa_free(EVP_PKEY *pkey)
402
0
{
403
0
    DSA_free(pkey->pkey.dsa);
404
0
}
405
406
static void update_buflen(const BIGNUM *b, size_t *pbuflen)
407
0
{
408
0
    size_t i;
409
0
    if (!b)
410
0
        return;
411
0
    if (*pbuflen < (i = (size_t)BN_num_bytes(b)))
412
0
        *pbuflen = i;
413
0
}
414
415
static int do_dsa_print(BIO *bp, const DSA *x, int off, int ptype)
416
0
{
417
0
    unsigned char *m = NULL;
418
0
    int ret = 0;
419
0
    size_t buf_len = 0;
420
0
    const char *ktype = NULL;
421
422
0
    const BIGNUM *priv_key, *pub_key;
423
424
0
    if (ptype == 2)
425
0
        priv_key = x->priv_key;
426
0
    else
427
0
        priv_key = NULL;
428
429
0
    if (ptype > 0)
430
0
        pub_key = x->pub_key;
431
0
    else
432
0
        pub_key = NULL;
433
434
0
    if (ptype == 2)
435
0
        ktype = "Private-Key";
436
0
    else if (ptype == 1)
437
0
        ktype = "Public-Key";
438
0
    else
439
0
        ktype = "DSA-Parameters";
440
441
0
    update_buflen(x->p, &buf_len);
442
0
    update_buflen(x->q, &buf_len);
443
0
    update_buflen(x->g, &buf_len);
444
0
    update_buflen(priv_key, &buf_len);
445
0
    update_buflen(pub_key, &buf_len);
446
447
0
    m = (unsigned char *)OPENSSL_malloc(buf_len + 10);
448
0
    if (m == NULL) {
449
0
        DSAerr(DSA_F_DO_DSA_PRINT, ERR_R_MALLOC_FAILURE);
450
0
        goto err;
451
0
    }
452
453
0
    if (priv_key) {
454
0
        if (!BIO_indent(bp, off, 128))
455
0
            goto err;
456
0
        if (BIO_printf(bp, "%s: (%d bit)\n", ktype, BN_num_bits(x->p))
457
0
            <= 0)
458
0
            goto err;
459
0
    }
460
461
0
    if (!ASN1_bn_print(bp, "priv:", priv_key, m, off))
462
0
        goto err;
463
0
    if (!ASN1_bn_print(bp, "pub: ", pub_key, m, off))
464
0
        goto err;
465
0
    if (!ASN1_bn_print(bp, "P:   ", x->p, m, off))
466
0
        goto err;
467
0
    if (!ASN1_bn_print(bp, "Q:   ", x->q, m, off))
468
0
        goto err;
469
0
    if (!ASN1_bn_print(bp, "G:   ", x->g, m, off))
470
0
        goto err;
471
0
    ret = 1;
472
0
 err:
473
0
    if (m != NULL)
474
0
        OPENSSL_free(m);
475
0
    return (ret);
476
0
}
477
478
static int dsa_param_decode(EVP_PKEY *pkey,
479
                            const unsigned char **pder, int derlen)
480
0
{
481
0
    DSA *dsa;
482
0
    if (!(dsa = d2i_DSAparams(NULL, pder, derlen))) {
483
0
        DSAerr(DSA_F_DSA_PARAM_DECODE, ERR_R_DSA_LIB);
484
0
        return 0;
485
0
    }
486
0
    EVP_PKEY_assign_DSA(pkey, dsa);
487
0
    return 1;
488
0
}
489
490
static int dsa_param_encode(const EVP_PKEY *pkey, unsigned char **pder)
491
0
{
492
0
    return i2d_DSAparams(pkey->pkey.dsa, pder);
493
0
}
494
495
static int dsa_param_print(BIO *bp, const EVP_PKEY *pkey, int indent,
496
                           ASN1_PCTX *ctx)
497
0
{
498
0
    return do_dsa_print(bp, pkey->pkey.dsa, indent, 0);
499
0
}
500
501
static int dsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent,
502
                         ASN1_PCTX *ctx)
503
0
{
504
0
    return do_dsa_print(bp, pkey->pkey.dsa, indent, 1);
505
0
}
506
507
static int dsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent,
508
                          ASN1_PCTX *ctx)
509
0
{
510
0
    return do_dsa_print(bp, pkey->pkey.dsa, indent, 2);
511
0
}
512
513
static int old_dsa_priv_decode(EVP_PKEY *pkey,
514
                               const unsigned char **pder, int derlen)
515
0
{
516
0
    DSA *dsa;
517
0
    if (!(dsa = d2i_DSAPrivateKey(NULL, pder, derlen))) {
518
0
        DSAerr(DSA_F_OLD_DSA_PRIV_DECODE, ERR_R_DSA_LIB);
519
0
        return 0;
520
0
    }
521
0
    EVP_PKEY_assign_DSA(pkey, dsa);
522
0
    return 1;
523
0
}
524
525
static int old_dsa_priv_encode(const EVP_PKEY *pkey, unsigned char **pder)
526
0
{
527
0
    return i2d_DSAPrivateKey(pkey->pkey.dsa, pder);
528
0
}
529
530
static int dsa_sig_print(BIO *bp, const X509_ALGOR *sigalg,
531
                         const ASN1_STRING *sig, int indent, ASN1_PCTX *pctx)
532
0
{
533
0
    DSA_SIG *dsa_sig;
534
0
    const unsigned char *p;
535
0
    if (!sig) {
536
0
        if (BIO_puts(bp, "\n") <= 0)
537
0
            return 0;
538
0
        else
539
0
            return 1;
540
0
    }
541
0
    p = sig->data;
542
0
    dsa_sig = d2i_DSA_SIG(NULL, &p, sig->length);
543
0
    if (dsa_sig) {
544
0
        int rv = 0;
545
0
        size_t buf_len = 0;
546
0
        unsigned char *m = NULL;
547
0
        update_buflen(dsa_sig->r, &buf_len);
548
0
        update_buflen(dsa_sig->s, &buf_len);
549
0
        m = OPENSSL_malloc(buf_len + 10);
550
0
        if (m == NULL) {
551
0
            DSAerr(DSA_F_DSA_SIG_PRINT, ERR_R_MALLOC_FAILURE);
552
0
            goto err;
553
0
        }
554
555
0
        if (BIO_write(bp, "\n", 1) != 1)
556
0
            goto err;
557
558
0
        if (!ASN1_bn_print(bp, "r:   ", dsa_sig->r, m, indent))
559
0
            goto err;
560
0
        if (!ASN1_bn_print(bp, "s:   ", dsa_sig->s, m, indent))
561
0
            goto err;
562
0
        rv = 1;
563
0
 err:
564
0
        if (m)
565
0
            OPENSSL_free(m);
566
0
        DSA_SIG_free(dsa_sig);
567
0
        return rv;
568
0
    }
569
0
    return X509_signature_dump(bp, sig, indent);
570
0
}
571
572
static int dsa_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2)
573
0
{
574
0
    switch (op) {
575
0
    case ASN1_PKEY_CTRL_PKCS7_SIGN:
576
0
        if (arg1 == 0) {
577
0
            int snid, hnid;
578
0
            X509_ALGOR *alg1, *alg2;
579
0
            PKCS7_SIGNER_INFO_get0_algs(arg2, NULL, &alg1, &alg2);
580
0
            if (alg1 == NULL || alg1->algorithm == NULL)
581
0
                return -1;
582
0
            hnid = OBJ_obj2nid(alg1->algorithm);
583
0
            if (hnid == NID_undef)
584
0
                return -1;
585
0
            if (!OBJ_find_sigid_by_algs(&snid, hnid, EVP_PKEY_id(pkey)))
586
0
                return -1;
587
0
            X509_ALGOR_set0(alg2, OBJ_nid2obj(snid), V_ASN1_UNDEF, 0);
588
0
        }
589
0
        return 1;
590
0
#ifndef OPENSSL_NO_CMS
591
0
    case ASN1_PKEY_CTRL_CMS_SIGN:
592
0
        if (arg1 == 0) {
593
0
            int snid, hnid;
594
0
            X509_ALGOR *alg1, *alg2;
595
0
            CMS_SignerInfo_get0_algs(arg2, NULL, NULL, &alg1, &alg2);
596
0
            if (alg1 == NULL || alg1->algorithm == NULL)
597
0
                return -1;
598
0
            hnid = OBJ_obj2nid(alg1->algorithm);
599
0
            if (hnid == NID_undef)
600
0
                return -1;
601
0
            if (!OBJ_find_sigid_by_algs(&snid, hnid, EVP_PKEY_id(pkey)))
602
0
                return -1;
603
0
            X509_ALGOR_set0(alg2, OBJ_nid2obj(snid), V_ASN1_UNDEF, 0);
604
0
        }
605
0
        return 1;
606
607
0
    case ASN1_PKEY_CTRL_CMS_RI_TYPE:
608
0
        *(int *)arg2 = CMS_RECIPINFO_NONE;
609
0
        return 1;
610
0
#endif
611
612
0
    case ASN1_PKEY_CTRL_DEFAULT_MD_NID:
613
0
        *(int *)arg2 = NID_sha256;
614
0
        return 2;
615
616
0
    default:
617
0
        return -2;
618
619
0
    }
620
621
0
}
622
623
/* NB these are sorted in pkey_id order, lowest first */
624
625
const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[] = {
626
627
    {
628
     EVP_PKEY_DSA2,
629
     EVP_PKEY_DSA,
630
     ASN1_PKEY_ALIAS},
631
632
    {
633
     EVP_PKEY_DSA1,
634
     EVP_PKEY_DSA,
635
     ASN1_PKEY_ALIAS},
636
637
    {
638
     EVP_PKEY_DSA4,
639
     EVP_PKEY_DSA,
640
     ASN1_PKEY_ALIAS},
641
642
    {
643
     EVP_PKEY_DSA3,
644
     EVP_PKEY_DSA,
645
     ASN1_PKEY_ALIAS},
646
647
    {
648
     EVP_PKEY_DSA,
649
     EVP_PKEY_DSA,
650
     0,
651
652
     "DSA",
653
     "OpenSSL DSA method",
654
655
     dsa_pub_decode,
656
     dsa_pub_encode,
657
     dsa_pub_cmp,
658
     dsa_pub_print,
659
660
     dsa_priv_decode,
661
     dsa_priv_encode,
662
     dsa_priv_print,
663
664
     int_dsa_size,
665
     dsa_bits,
666
667
     dsa_param_decode,
668
     dsa_param_encode,
669
     dsa_missing_parameters,
670
     dsa_copy_parameters,
671
     dsa_cmp_parameters,
672
     dsa_param_print,
673
     dsa_sig_print,
674
675
     int_dsa_free,
676
     dsa_pkey_ctrl,
677
     old_dsa_priv_decode,
678
     old_dsa_priv_encode}
679
};