dsa_ameth.c 16.3 KB
Newer Older
1
/*
R
Rich Salz 已提交
2
 * Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
R
Rich Salz 已提交
5 6 7
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
8 9
 */

P
Pauli 已提交
10 11 12 13 14 15
/*
 * DSA low level APIs are deprecated for public use, but still ok for
 * internal use.
 */
#include "internal/deprecated.h"

16 17 18
#include <stdio.h>
#include <openssl/x509.h>
#include <openssl/asn1.h>
19
#include <openssl/bn.h>
R
Rich Salz 已提交
20
#include <openssl/cms.h>
21
#include <openssl/core_names.h>
S
Shane Lontis 已提交
22
#include <openssl/param_build.h>
23
#include "internal/cryptlib.h"
24
#include "crypto/asn1.h"
25
#include "crypto/dsa.h"
26
#include "crypto/evp.h"
27
#include "internal/ffc.h"
28
#include "dsa_local.h"
29 30

static int dsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)
31 32 33 34
{
    const unsigned char *p, *pm;
    int pklen, pmlen;
    int ptype;
D
Dr. Stephen Henson 已提交
35 36
    const void *pval;
    const ASN1_STRING *pstr;
37 38 39 40 41 42 43 44 45 46 47 48 49 50
    X509_ALGOR *palg;
    ASN1_INTEGER *public_key = NULL;

    DSA *dsa = NULL;

    if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, &palg, pubkey))
        return 0;
    X509_ALGOR_get0(NULL, &ptype, &pval, palg);

    if (ptype == V_ASN1_SEQUENCE) {
        pstr = pval;
        pm = pstr->data;
        pmlen = pstr->length;

51
        if ((dsa = d2i_DSAparams(NULL, &pm, pmlen)) == NULL) {
52 53 54 55 56
            DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_DECODE_ERROR);
            goto err;
        }

    } else if ((ptype == V_ASN1_NULL) || (ptype == V_ASN1_UNDEF)) {
57
        if ((dsa = DSA_new()) == NULL) {
58 59 60 61 62 63 64 65
            DSAerr(DSA_F_DSA_PUB_DECODE, ERR_R_MALLOC_FAILURE);
            goto err;
        }
    } else {
        DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_PARAMETER_ENCODING_ERROR);
        goto err;
    }

66
    if ((public_key = d2i_ASN1_INTEGER(NULL, &p, pklen)) == NULL) {
67 68 69 70
        DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_DECODE_ERROR);
        goto err;
    }

71
    if ((dsa->pub_key = ASN1_INTEGER_to_BN(public_key, NULL)) == NULL) {
72 73 74 75
        DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_BN_DECODE_ERROR);
        goto err;
    }

76
    dsa->dirty_cnt++;
77 78 79 80 81
    ASN1_INTEGER_free(public_key);
    EVP_PKEY_assign_DSA(pkey, dsa);
    return 1;

 err:
R
Rich Salz 已提交
82
    ASN1_INTEGER_free(public_key);
R
Rich Salz 已提交
83
    DSA_free(dsa);
84 85 86
    return 0;

}
87

88
static int dsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
89 90 91 92 93
{
    DSA *dsa;
    int ptype;
    unsigned char *penc = NULL;
    int penclen;
M
Matt Caswell 已提交
94
    ASN1_STRING *str = NULL;
95
    ASN1_INTEGER *pubint = NULL;
96
    ASN1_OBJECT *aobj;
97 98

    dsa = pkey->pkey.dsa;
99 100 101 102
    if (pkey->save_parameters
        && dsa->params.p != NULL
        && dsa->params.q != NULL
        && dsa->params.g != NULL) {
103
        str = ASN1_STRING_new();
104
        if (str == NULL) {
M
Matt Caswell 已提交
105 106 107
            DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
            goto err;
        }
108 109 110 111 112 113 114 115 116
        str->length = i2d_DSAparams(dsa, &str->data);
        if (str->length <= 0) {
            DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
            goto err;
        }
        ptype = V_ASN1_SEQUENCE;
    } else
        ptype = V_ASN1_UNDEF;

117
    pubint = BN_to_ASN1_INTEGER(dsa->pub_key, NULL);
118

119 120 121 122 123 124 125
    if (pubint == NULL) {
        DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
        goto err;
    }

    penclen = i2d_ASN1_INTEGER(pubint, &penc);
    ASN1_INTEGER_free(pubint);
126 127 128 129 130 131

    if (penclen <= 0) {
        DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
        goto err;
    }

132 133 134 135 136
    aobj = OBJ_nid2obj(EVP_PKEY_DSA);
    if (aobj == NULL)
        goto err;

    if (X509_PUBKEY_set0_param(pk, aobj, ptype, str, penc, penclen))
137 138 139
        return 1;

 err:
R
Rich Salz 已提交
140
    OPENSSL_free(penc);
R
Rich Salz 已提交
141
    ASN1_STRING_free(str);
142 143 144 145 146 147

    return 0;
}

/*
 * In PKCS#8 DSA: you just get a private key integer and parameters in the
148 149
 * AlgorithmIdentifier the pubkey must be recalculated.
 */
150

151
static int dsa_priv_decode(EVP_PKEY *pkey, const PKCS8_PRIV_KEY_INFO *p8)
152
{
153
    const unsigned char *p, *pm;
154 155
    int pklen, pmlen;
    int ptype;
D
Dr. Stephen Henson 已提交
156 157
    const void *pval;
    const ASN1_STRING *pstr;
158
    const X509_ALGOR *palg;
159 160 161 162 163
    ASN1_INTEGER *privkey = NULL;
    BN_CTX *ctx = NULL;

    DSA *dsa = NULL;

164 165
    int ret = 0;

166 167 168 169
    if (!PKCS8_pkey_get0(NULL, &p, &pklen, &palg, p8))
        return 0;
    X509_ALGOR_get0(NULL, &ptype, &pval, palg);

170 171
    if ((privkey = d2i_ASN1_INTEGER(NULL, &p, pklen)) == NULL)
        goto decerr;
172
    if (privkey->type == V_ASN1_NEG_INTEGER || ptype != V_ASN1_SEQUENCE)
173
        goto decerr;
174 175 176 177

    pstr = pval;
    pm = pstr->data;
    pmlen = pstr->length;
178
    if ((dsa = d2i_DSAparams(NULL, &pm, pmlen)) == NULL)
179 180
        goto decerr;
    /* We have parameters now set private key */
R
Rich Salz 已提交
181 182
    if ((dsa->priv_key = BN_secure_new()) == NULL
        || !ASN1_INTEGER_to_BN(privkey, dsa->priv_key)) {
183 184 185 186
        DSAerr(DSA_F_DSA_PRIV_DECODE, DSA_R_BN_ERROR);
        goto dsaerr;
    }
    /* Calculate public key */
187
    if ((dsa->pub_key = BN_new()) == NULL) {
188 189 190
        DSAerr(DSA_F_DSA_PRIV_DECODE, ERR_R_MALLOC_FAILURE);
        goto dsaerr;
    }
191
    if ((ctx = BN_CTX_new()) == NULL) {
192 193 194 195
        DSAerr(DSA_F_DSA_PRIV_DECODE, ERR_R_MALLOC_FAILURE);
        goto dsaerr;
    }

196
    BN_set_flags(dsa->priv_key, BN_FLG_CONSTTIME);
197 198
    if (!BN_mod_exp(dsa->pub_key, dsa->params.g, dsa->priv_key, dsa->params.p,
                    ctx)) {
199 200 201 202
        DSAerr(DSA_F_DSA_PRIV_DECODE, DSA_R_BN_ERROR);
        goto dsaerr;
    }

203
    dsa->dirty_cnt++;
204 205
    EVP_PKEY_assign_DSA(pkey, dsa);

206 207
    ret = 1;
    goto done;
208 209

 decerr:
D
typo  
Dr. Stephen Henson 已提交
210
    DSAerr(DSA_F_DSA_PRIV_DECODE, DSA_R_DECODE_ERROR);
211
 dsaerr:
212 213
    DSA_free(dsa);
 done:
214
    BN_CTX_free(ctx);
R
Rich Salz 已提交
215
    ASN1_STRING_clear_free(privkey);
216
    return ret;
217
}
218

219
static int dsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey)
220
{
221 222 223 224 225
    ASN1_STRING *params = NULL;
    ASN1_INTEGER *prkey = NULL;
    unsigned char *dp = NULL;
    int dplen;

226
    if (pkey->pkey.dsa  == NULL|| pkey->pkey.dsa->priv_key == NULL) {
227 228 229 230 231 232
        DSAerr(DSA_F_DSA_PRIV_ENCODE, DSA_R_MISSING_PARAMETERS);
        goto err;
    }

    params = ASN1_STRING_new();

233
    if (params == NULL) {
234 235 236 237 238 239 240 241 242 243 244 245 246 247
        DSAerr(DSA_F_DSA_PRIV_ENCODE, ERR_R_MALLOC_FAILURE);
        goto err;
    }

    params->length = i2d_DSAparams(pkey->pkey.dsa, &params->data);
    if (params->length <= 0) {
        DSAerr(DSA_F_DSA_PRIV_ENCODE, ERR_R_MALLOC_FAILURE);
        goto err;
    }
    params->type = V_ASN1_SEQUENCE;

    /* Get private key into integer */
    prkey = BN_to_ASN1_INTEGER(pkey->pkey.dsa->priv_key, NULL);

248
    if (prkey == NULL) {
249 250 251 252 253 254
        DSAerr(DSA_F_DSA_PRIV_ENCODE, DSA_R_BN_ERROR);
        goto err;
    }

    dplen = i2d_ASN1_INTEGER(prkey, &dp);

255
    ASN1_STRING_clear_free(prkey);
M
Martin Vejnar 已提交
256
    prkey = NULL;
257 258 259 260 261 262 263 264

    if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(NID_dsa), 0,
                         V_ASN1_SEQUENCE, params, dp, dplen))
        goto err;

    return 1;

 err:
R
Rich Salz 已提交
265
    OPENSSL_free(dp);
R
Rich Salz 已提交
266
    ASN1_STRING_free(params);
R
Rich Salz 已提交
267
    ASN1_STRING_clear_free(prkey);
268
    return 0;
269 270
}

271
static int int_dsa_size(const EVP_PKEY *pkey)
272
{
K
KaoruToda 已提交
273
    return DSA_size(pkey->pkey.dsa);
274
}
275 276

static int dsa_bits(const EVP_PKEY *pkey)
277
{
D
Dr. Stephen Henson 已提交
278
    return DSA_bits(pkey->pkey.dsa);
279
}
280

281
static int dsa_security_bits(const EVP_PKEY *pkey)
282 283 284
{
    return DSA_security_bits(pkey->pkey.dsa);
}
285

286
static int dsa_missing_parameters(const EVP_PKEY *pkey)
287 288 289
{
    DSA *dsa;
    dsa = pkey->pkey.dsa;
290 291 292 293
    return dsa == NULL
        || dsa->params.p == NULL
        || dsa->params.q == NULL
        || dsa->params.g == NULL;
294
}
295 296

static int dsa_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
297
{
298 299 300 301 302
    if (to->pkey.dsa == NULL) {
        to->pkey.dsa = DSA_new();
        if (to->pkey.dsa == NULL)
            return 0;
    }
303
    if (!ffc_params_copy(&to->pkey.dsa->params, &from->pkey.dsa->params))
304 305
        return 0;

306
    to->pkey.dsa->dirty_cnt++;
307 308
    return 1;
}
309 310

static int dsa_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b)
311
{
312
    return ffc_params_cmp(&a->pkey.dsa->params, &b->pkey.dsa->params, 1);
313
}
314

315
static int dsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
316
{
317
    return BN_cmp(b->pkey.dsa->pub_key, a->pkey.dsa->pub_key) == 0;
318
}
319

320
static void int_dsa_free(EVP_PKEY *pkey)
321 322 323
{
    DSA_free(pkey->pkey.dsa);
}
324

325
static int do_dsa_print(BIO *bp, const DSA *x, int off, int ptype)
326 327 328 329
{
    int ret = 0;
    const char *ktype = NULL;
    const BIGNUM *priv_key, *pub_key;
330 331
    int mod_len = 0;

332 333
    if (x->params.p != NULL)
        mod_len = DSA_bits(x);
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351

    if (ptype == 2)
        priv_key = x->priv_key;
    else
        priv_key = NULL;

    if (ptype > 0)
        pub_key = x->pub_key;
    else
        pub_key = NULL;

    if (ptype == 2)
        ktype = "Private-Key";
    else if (ptype == 1)
        ktype = "Public-Key";
    else
        ktype = "DSA-Parameters";

352
    if (priv_key != NULL) {
353 354
        if (!BIO_indent(bp, off, 128))
            goto err;
355
        if (BIO_printf(bp, "%s: (%d bit)\n", ktype, mod_len) <= 0)
356
            goto err;
357 358 359
    } else {
        if (BIO_printf(bp, "Public-Key: (%d bit)\n", mod_len) <= 0)
            goto err;
360 361
    }

362
    if (!ASN1_bn_print(bp, "priv:", priv_key, NULL, off))
363
        goto err;
364
    if (!ASN1_bn_print(bp, "pub: ", pub_key, NULL, off))
365
        goto err;
366
    if (!ffc_params_print(bp, &x->params, off))
367 368 369
        goto err;
    ret = 1;
 err:
K
KaoruToda 已提交
370
    return ret;
371
}
372

373
static int dsa_param_decode(EVP_PKEY *pkey,
374 375 376
                            const unsigned char **pder, int derlen)
{
    DSA *dsa;
377 378

    if ((dsa = d2i_DSAparams(NULL, pder, derlen)) == NULL) {
379 380 381
        DSAerr(DSA_F_DSA_PARAM_DECODE, ERR_R_DSA_LIB);
        return 0;
    }
382
    dsa->dirty_cnt++;
383 384 385
    EVP_PKEY_assign_DSA(pkey, dsa);
    return 1;
}
386 387

static int dsa_param_encode(const EVP_PKEY *pkey, unsigned char **pder)
388 389 390
{
    return i2d_DSAparams(pkey->pkey.dsa, pder);
}
391 392

static int dsa_param_print(BIO *bp, const EVP_PKEY *pkey, int indent,
393 394 395 396
                           ASN1_PCTX *ctx)
{
    return do_dsa_print(bp, pkey->pkey.dsa, indent, 0);
}
397 398

static int dsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent,
399 400 401 402
                         ASN1_PCTX *ctx)
{
    return do_dsa_print(bp, pkey->pkey.dsa, indent, 1);
}
403 404

static int dsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent,
405 406 407 408
                          ASN1_PCTX *ctx)
{
    return do_dsa_print(bp, pkey->pkey.dsa, indent, 2);
}
409

410
static int old_dsa_priv_decode(EVP_PKEY *pkey,
411 412 413
                               const unsigned char **pder, int derlen)
{
    DSA *dsa;
414 415

    if ((dsa = d2i_DSAPrivateKey(NULL, pder, derlen)) == NULL) {
416 417 418
        DSAerr(DSA_F_OLD_DSA_PRIV_DECODE, ERR_R_DSA_LIB);
        return 0;
    }
419
    dsa->dirty_cnt++;
420 421 422
    EVP_PKEY_assign_DSA(pkey, dsa);
    return 1;
}
423 424

static int old_dsa_priv_encode(const EVP_PKEY *pkey, unsigned char **pder)
425 426 427
{
    return i2d_DSAPrivateKey(pkey->pkey.dsa, pder);
}
428

429
static int dsa_sig_print(BIO *bp, const X509_ALGOR *sigalg,
430 431 432 433
                         const ASN1_STRING *sig, int indent, ASN1_PCTX *pctx)
{
    DSA_SIG *dsa_sig;
    const unsigned char *p;
434

435
    if (sig == NULL) {
436 437 438 439 440 441 442
        if (BIO_puts(bp, "\n") <= 0)
            return 0;
        else
            return 1;
    }
    p = sig->data;
    dsa_sig = d2i_DSA_SIG(NULL, &p, sig->length);
443
    if (dsa_sig != NULL) {
444
        int rv = 0;
445
        const BIGNUM *r, *s;
D
Dr. Stephen Henson 已提交
446

447
        DSA_SIG_get0(dsa_sig, &r, &s);
448 449 450 451

        if (BIO_write(bp, "\n", 1) != 1)
            goto err;

D
Dr. Stephen Henson 已提交
452
        if (!ASN1_bn_print(bp, "r:   ", r, NULL, indent))
453
            goto err;
D
Dr. Stephen Henson 已提交
454
        if (!ASN1_bn_print(bp, "s:   ", s, NULL, indent))
455 456 457 458 459 460
            goto err;
        rv = 1;
 err:
        DSA_SIG_free(dsa_sig);
        return rv;
    }
461 462
    if (BIO_puts(bp, "\n") <= 0)
        return 0;
463 464
    return X509_signature_dump(bp, sig, indent);
}
465

466
static int dsa_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2)
467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483
{
    switch (op) {
    case ASN1_PKEY_CTRL_PKCS7_SIGN:
        if (arg1 == 0) {
            int snid, hnid;
            X509_ALGOR *alg1, *alg2;
            PKCS7_SIGNER_INFO_get0_algs(arg2, NULL, &alg1, &alg2);
            if (alg1 == NULL || alg1->algorithm == NULL)
                return -1;
            hnid = OBJ_obj2nid(alg1->algorithm);
            if (hnid == NID_undef)
                return -1;
            if (!OBJ_find_sigid_by_algs(&snid, hnid, EVP_PKEY_id(pkey)))
                return -1;
            X509_ALGOR_set0(alg2, OBJ_nid2obj(snid), V_ASN1_UNDEF, 0);
        }
        return 1;
D
Dr. Stephen Henson 已提交
484
#ifndef OPENSSL_NO_CMS
485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
    case ASN1_PKEY_CTRL_CMS_SIGN:
        if (arg1 == 0) {
            int snid, hnid;
            X509_ALGOR *alg1, *alg2;
            CMS_SignerInfo_get0_algs(arg2, NULL, NULL, &alg1, &alg2);
            if (alg1 == NULL || alg1->algorithm == NULL)
                return -1;
            hnid = OBJ_obj2nid(alg1->algorithm);
            if (hnid == NID_undef)
                return -1;
            if (!OBJ_find_sigid_by_algs(&snid, hnid, EVP_PKEY_id(pkey)))
                return -1;
            X509_ALGOR_set0(alg2, OBJ_nid2obj(snid), V_ASN1_UNDEF, 0);
        }
        return 1;

    case ASN1_PKEY_CTRL_CMS_RI_TYPE:
        *(int *)arg2 = CMS_RECIPINFO_NONE;
        return 1;
D
Dr. Stephen Henson 已提交
504
#endif
505

506 507
    case ASN1_PKEY_CTRL_DEFAULT_MD_NID:
        *(int *)arg2 = NID_sha256;
508
        return 1;
509

510 511
    default:
        return -2;
512

513
    }
514

515
}
516

517 518 519 520 521
static size_t dsa_pkey_dirty_cnt(const EVP_PKEY *pkey)
{
    return pkey->pkey.dsa->dirty_cnt;
}

522
static int dsa_pkey_export_to(const EVP_PKEY *from, void *to_keydata,
523 524
                              EVP_KEYMGMT *to_keymgmt, OPENSSL_CTX *libctx,
                              const char *propq)
525
{
526
    DSA *dsa = from->pkey.dsa;
P
Pauli 已提交
527
    OSSL_PARAM_BLD *tmpl;
528 529 530 531
    const BIGNUM *p = DSA_get0_p(dsa), *g = DSA_get0_g(dsa);
    const BIGNUM *q = DSA_get0_q(dsa), *pub_key = DSA_get0_pub_key(dsa);
    const BIGNUM *priv_key = DSA_get0_priv_key(dsa);
    OSSL_PARAM *params;
532
    int selection = 0;
P
Pauli 已提交
533
    int rv = 0;
534

535 536 537 538 539 540 541
    /*
     * If the DSA method is foreign, then we can't be sure of anything, and
     * can therefore not export or pretend to export.
     */
    if (DSA_get_method(dsa) != DSA_OpenSSL())
        return 0;

542
    if (p == NULL || q == NULL || g == NULL)
543
        return 0;
544

P
Pauli 已提交
545 546
    tmpl = OSSL_PARAM_BLD_new();
    if (tmpl == NULL)
547
        return 0;
P
Pauli 已提交
548 549 550 551 552

    if (!OSSL_PARAM_BLD_push_BN(tmpl, OSSL_PKEY_PARAM_FFC_P, p)
        || !OSSL_PARAM_BLD_push_BN(tmpl, OSSL_PKEY_PARAM_FFC_Q, q)
        || !OSSL_PARAM_BLD_push_BN(tmpl, OSSL_PKEY_PARAM_FFC_G, g))
        goto err;
553 554
    selection |= OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
    if (pub_key != NULL) {
P
Pauli 已提交
555
        if (!OSSL_PARAM_BLD_push_BN(tmpl, OSSL_PKEY_PARAM_PUB_KEY,
556
                                    pub_key))
P
Pauli 已提交
557
            goto err;
558 559
        selection |= OSSL_KEYMGMT_SELECT_PUBLIC_KEY;
    }
560
    if (priv_key != NULL) {
P
Pauli 已提交
561
        if (!OSSL_PARAM_BLD_push_BN(tmpl, OSSL_PKEY_PARAM_PRIV_KEY,
562
                                    priv_key))
P
Pauli 已提交
563
            goto err;
564
        selection |= OSSL_KEYMGMT_SELECT_PRIVATE_KEY;
565 566
    }

P
Pauli 已提交
567 568
    if ((params = OSSL_PARAM_BLD_to_param(tmpl)) == NULL)
        goto err;
569 570

    /* We export, the provider imports */
571
    rv = evp_keymgmt_import(to_keymgmt, to_keydata, selection, params);
572

P
Pauli 已提交
573 574 575
    OSSL_PARAM_BLD_free_params(params);
err:
    OSSL_PARAM_BLD_free(tmpl);
576
    return rv;
577 578
}

579
static int dsa_pkey_import_from(const OSSL_PARAM params[], void *vpctx)
580
{
581 582 583
    EVP_PKEY_CTX *pctx = vpctx;
    EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(pctx);
    DSA *dsa = dsa_new_with_ctx(pctx->libctx);
584 585 586 587 588 589

    if (dsa == NULL) {
        ERR_raise(ERR_LIB_DSA, ERR_R_MALLOC_FAILURE);
        return 0;
    }

S
Shane Lontis 已提交
590
    if (!dsa_ffc_params_fromdata(dsa, params)
591 592 593 594 595 596 597 598
        || !dsa_key_fromdata(dsa, params)
        || !EVP_PKEY_assign_DSA(pkey, dsa)) {
        DSA_free(dsa);
        return 0;
    }
    return 1;
}

599 600
/* NB these are sorted in pkey_id order, lowest first */

K
Kurt Roeckx 已提交
601
const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[5] = {
602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654

    {
     EVP_PKEY_DSA2,
     EVP_PKEY_DSA,
     ASN1_PKEY_ALIAS},

    {
     EVP_PKEY_DSA1,
     EVP_PKEY_DSA,
     ASN1_PKEY_ALIAS},

    {
     EVP_PKEY_DSA4,
     EVP_PKEY_DSA,
     ASN1_PKEY_ALIAS},

    {
     EVP_PKEY_DSA3,
     EVP_PKEY_DSA,
     ASN1_PKEY_ALIAS},

    {
     EVP_PKEY_DSA,
     EVP_PKEY_DSA,
     0,

     "DSA",
     "OpenSSL DSA method",

     dsa_pub_decode,
     dsa_pub_encode,
     dsa_pub_cmp,
     dsa_pub_print,

     dsa_priv_decode,
     dsa_priv_encode,
     dsa_priv_print,

     int_dsa_size,
     dsa_bits,
     dsa_security_bits,

     dsa_param_decode,
     dsa_param_encode,
     dsa_missing_parameters,
     dsa_copy_parameters,
     dsa_cmp_parameters,
     dsa_param_print,
     dsa_sig_print,

     int_dsa_free,
     dsa_pkey_ctrl,
     old_dsa_priv_decode,
655 656 657 658 659 660 661
     old_dsa_priv_encode,

     NULL, NULL, NULL,
     NULL, NULL, NULL,
     NULL, NULL, NULL, NULL,

     dsa_pkey_dirty_cnt,
662 663
     dsa_pkey_export_to,
     dsa_pkey_import_from
664
    }
665
};