Make DSA_METHOD opaque
Move the dsa_method structure out of the public header file, and provide getter and setter functions for creating and modifying custom DSA_METHODs. Reviewed-by: Richard Levitte <levitte@openssl.org> Reviewed-by: Stephen Henson <steve@openssl.org>
This commit is contained in:
parent
1258396d73
commit
6e9fa57c6d
14 changed files with 476 additions and 153 deletions
|
@ -243,8 +243,10 @@ int dsa_main(int argc, char **argv)
|
|||
}
|
||||
|
||||
if (modulus) {
|
||||
BIGNUM *pub_key = NULL;
|
||||
DSA_get0_key(dsa, &pub_key, NULL);
|
||||
BIO_printf(out, "Public Key=");
|
||||
BN_print(out, DSA_get0_pub_key(dsa));
|
||||
BN_print(out, pub_key);
|
||||
BIO_printf(out, "\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -263,14 +263,19 @@ int dsaparam_main(int argc, char **argv)
|
|||
}
|
||||
|
||||
if (C) {
|
||||
int len = BN_num_bytes(DSA_get0_p(dsa));
|
||||
int bits_p = BN_num_bits(DSA_get0_p(dsa));
|
||||
BIGNUM *p = NULL, *q = NULL, *g = NULL;
|
||||
int len, bits_p;
|
||||
|
||||
DSA_get0_pqg(dsa, &p, &q, &g);
|
||||
len = BN_num_bytes(p);
|
||||
bits_p = BN_num_bits(p);
|
||||
|
||||
unsigned char *data = app_malloc(len + 20, "BN space");
|
||||
|
||||
BIO_printf(bio_out, "DSA *get_dsa%d()\n{\n", bits_p);
|
||||
print_bignum_var(bio_out, DSA_get0_p(dsa), "dsap", len, data);
|
||||
print_bignum_var(bio_out, DSA_get0_q(dsa), "dsaq", len, data);
|
||||
print_bignum_var(bio_out, DSA_get0_g(dsa), "dsag", len, data);
|
||||
print_bignum_var(bio_out, p, "dsap", len, data);
|
||||
print_bignum_var(bio_out, q, "dsaq", len, data);
|
||||
print_bignum_var(bio_out, g, "dsag", len, data);
|
||||
BIO_printf(bio_out, " DSA *dsa = DSA_new();\n"
|
||||
"\n");
|
||||
BIO_printf(bio_out, " if (dsa == NULL)\n"
|
||||
|
|
|
@ -101,6 +101,7 @@ int gendsa_main(int argc, char **argv)
|
|||
char *outfile = NULL, *passoutarg = NULL, *passout = NULL, *prog;
|
||||
OPTION_CHOICE o;
|
||||
int ret = 1, private = 0;
|
||||
BIGNUM *p = NULL;
|
||||
|
||||
prog = opt_init(argc, argv, gendsa_options);
|
||||
while ((o = opt_next()) != OPT_EOF) {
|
||||
|
@ -168,7 +169,8 @@ int gendsa_main(int argc, char **argv)
|
|||
BIO_printf(bio_err, "%ld semi-random bytes loaded\n",
|
||||
app_RAND_load_files(inrand));
|
||||
|
||||
BIO_printf(bio_err, "Generating DSA key, %d bits\n", BN_num_bits(DSA_get0_p(dsa)));
|
||||
DSA_get0_pqg(dsa, &p, NULL, NULL);
|
||||
BIO_printf(bio_err, "Generating DSA key, %d bits\n", BN_num_bits(p));
|
||||
if (!DSA_generate_key(dsa))
|
||||
goto end;
|
||||
|
||||
|
|
10
apps/x509.c
10
apps/x509.c
|
@ -734,11 +734,15 @@ int x509_main(int argc, char **argv)
|
|||
else
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_DSA
|
||||
if (EVP_PKEY_id(pkey) == EVP_PKEY_DSA)
|
||||
BN_print(out, DSA_get0_pub_key(EVP_PKEY_get0_DSA(pkey)));
|
||||
else
|
||||
if (EVP_PKEY_id(pkey) == EVP_PKEY_DSA) {
|
||||
BIGNUM *dsapub = NULL;
|
||||
DSA_get0_key(EVP_PKEY_get0_DSA(pkey), &dsapub, NULL);
|
||||
BN_print(out, dsapub);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
BIO_printf(out, "Wrong Algorithm type");
|
||||
}
|
||||
BIO_printf(out, "\n");
|
||||
} else if (pubkey == i) {
|
||||
EVP_PKEY *pkey;
|
||||
|
|
|
@ -16,9 +16,11 @@ GENERAL=Makefile
|
|||
|
||||
LIB=$(TOP)/libcrypto.a
|
||||
LIBSRC= dsa_gen.c dsa_key.c dsa_lib.c dsa_asn1.c dsa_vrf.c dsa_sign.c \
|
||||
dsa_err.c dsa_ossl.c dsa_depr.c dsa_ameth.c dsa_pmeth.c dsa_prn.c
|
||||
dsa_err.c dsa_ossl.c dsa_depr.c dsa_ameth.c dsa_pmeth.c dsa_prn.c \
|
||||
dsa_meth.c
|
||||
LIBOBJ= dsa_gen.o dsa_key.o dsa_lib.o dsa_asn1.o dsa_vrf.o dsa_sign.o \
|
||||
dsa_err.o dsa_ossl.o dsa_depr.o dsa_ameth.o dsa_pmeth.o dsa_prn.o
|
||||
dsa_err.o dsa_ossl.o dsa_depr.o dsa_ameth.o dsa_pmeth.o dsa_prn.o \
|
||||
dsa_meth.o
|
||||
|
||||
SRC= $(LIBSRC)
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
LIBS=../../libcrypto
|
||||
SOURCE[../../libcrypto]=\
|
||||
dsa_gen.c dsa_key.c dsa_lib.c dsa_asn1.c dsa_vrf.c dsa_sign.c \
|
||||
dsa_err.c dsa_ossl.c dsa_depr.c dsa_ameth.c dsa_pmeth.c dsa_prn.c
|
||||
dsa_err.c dsa_ossl.c dsa_depr.c dsa_ameth.c dsa_pmeth.c dsa_prn.c \
|
||||
dsa_meth.c
|
||||
|
|
|
@ -104,6 +104,11 @@ int DSA_set_method(DSA *dsa, const DSA_METHOD *meth)
|
|||
return 1;
|
||||
}
|
||||
|
||||
const DSA_METHOD *DSA_get_method(DSA *d)
|
||||
{
|
||||
return d->meth;
|
||||
}
|
||||
|
||||
DSA *DSA_new_method(ENGINE *engine)
|
||||
{
|
||||
DSA *ret;
|
||||
|
@ -281,19 +286,14 @@ DH *DSA_dup_DH(const DSA *r)
|
|||
}
|
||||
#endif
|
||||
|
||||
BIGNUM *DSA_get0_p(const DSA *d)
|
||||
void DSA_get0_pqg(const DSA *d, BIGNUM **p, BIGNUM **q, BIGNUM **g)
|
||||
{
|
||||
return d->p;
|
||||
}
|
||||
|
||||
BIGNUM *DSA_get0_q(const DSA *d)
|
||||
{
|
||||
return d->q;
|
||||
}
|
||||
|
||||
BIGNUM *DSA_get0_g(const DSA *d)
|
||||
{
|
||||
return d->g;
|
||||
if (p != NULL)
|
||||
*p = d->p;
|
||||
if (q != NULL)
|
||||
*q = d->q;
|
||||
if (g != NULL)
|
||||
*g = d->g;
|
||||
}
|
||||
|
||||
int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g)
|
||||
|
@ -310,17 +310,15 @@ int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g)
|
|||
return 1;
|
||||
}
|
||||
|
||||
BIGNUM *DSA_get0_priv_key(const DSA *d)
|
||||
void DSA_get0_key(const DSA *d, BIGNUM **pub_key, BIGNUM **priv_key)
|
||||
{
|
||||
return d->priv_key;
|
||||
if (pub_key != NULL)
|
||||
*pub_key = d->pub_key;
|
||||
if (priv_key != NULL)
|
||||
*priv_key = d->priv_key;
|
||||
}
|
||||
|
||||
BIGNUM *DSA_get0_pub_key(const DSA *d)
|
||||
{
|
||||
return d->pub_key;
|
||||
}
|
||||
|
||||
void DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key)
|
||||
int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key)
|
||||
{
|
||||
/* Note that it is valid for priv_key to be NULL */
|
||||
if (pub_key == NULL)
|
||||
|
|
|
@ -77,6 +77,32 @@ struct dsa_st {
|
|||
CRYPTO_RWLOCK *lock;
|
||||
};
|
||||
|
||||
struct dsa_method {
|
||||
char *name;
|
||||
DSA_SIG *(*dsa_do_sign) (const unsigned char *dgst, int dlen, DSA *dsa);
|
||||
int (*dsa_sign_setup) (DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp,
|
||||
BIGNUM **rp);
|
||||
int (*dsa_do_verify) (const unsigned char *dgst, int dgst_len,
|
||||
DSA_SIG *sig, DSA *dsa);
|
||||
int (*dsa_mod_exp) (DSA *dsa, BIGNUM *rr, BIGNUM *a1, BIGNUM *p1,
|
||||
BIGNUM *a2, BIGNUM *p2, BIGNUM *m, BN_CTX *ctx,
|
||||
BN_MONT_CTX *in_mont);
|
||||
/* Can be null */
|
||||
int (*bn_mod_exp) (DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p,
|
||||
const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
|
||||
int (*init) (DSA *dsa);
|
||||
int (*finish) (DSA *dsa);
|
||||
int flags;
|
||||
void *app_data;
|
||||
/* If this is non-NULL, it is used to generate DSA parameters */
|
||||
int (*dsa_paramgen) (DSA *dsa, int bits,
|
||||
const unsigned char *seed, int seed_len,
|
||||
int *counter_ret, unsigned long *h_ret,
|
||||
BN_GENCB *cb);
|
||||
/* If this is non-NULL, it is used to generate DSA keys */
|
||||
int (*dsa_keygen) (DSA *dsa);
|
||||
};
|
||||
|
||||
int dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits,
|
||||
const EVP_MD *evpmd, const unsigned char *seed_in,
|
||||
size_t seed_len, unsigned char *seed_out,
|
||||
|
|
243
crypto/dsa/dsa_meth.c
Normal file
243
crypto/dsa/dsa_meth.c
Normal file
|
@ -0,0 +1,243 @@
|
|||
/* ====================================================================
|
||||
* Copyright (c) 2016 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
#include "dsa_locl.h"
|
||||
#include <string.h>
|
||||
|
||||
DSA_METHOD *DSA_meth_new(const char *name, int flags)
|
||||
{
|
||||
DSA_METHOD *dsam = OPENSSL_zalloc(sizeof(DSA_METHOD));
|
||||
|
||||
if (dsam != NULL) {
|
||||
dsam->name = OPENSSL_strdup(name);
|
||||
dsam->flags = flags;
|
||||
}
|
||||
|
||||
return dsam;
|
||||
}
|
||||
|
||||
void DSA_meth_free(DSA_METHOD *dsam)
|
||||
{
|
||||
if (dsam != NULL) {
|
||||
if (dsam->name != NULL)
|
||||
OPENSSL_free(dsam->name);
|
||||
OPENSSL_free(dsam);
|
||||
}
|
||||
}
|
||||
|
||||
DSA_METHOD *DSA_meth_dup(const DSA_METHOD *meth)
|
||||
{
|
||||
DSA_METHOD *ret;
|
||||
|
||||
ret = OPENSSL_malloc(sizeof(DSA_METHOD));
|
||||
|
||||
if (ret != NULL) {
|
||||
memcpy(ret, meth, sizeof(*meth));
|
||||
ret->name = OPENSSL_strdup(meth->name);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
const char *DSA_meth_get_name(const DSA_METHOD *dsam)
|
||||
{
|
||||
return dsam->name;
|
||||
}
|
||||
|
||||
int DSA_meth_set_name(DSA_METHOD *dsam, const char *name)
|
||||
{
|
||||
OPENSSL_free(dsam->name);
|
||||
dsam->name = OPENSSL_strdup(name);
|
||||
|
||||
return dsam->name != NULL;
|
||||
}
|
||||
|
||||
int DSA_meth_get_flags(DSA_METHOD *dsam)
|
||||
{
|
||||
return dsam->flags;
|
||||
}
|
||||
|
||||
int DSA_meth_set_flags(DSA_METHOD *dsam, int flags)
|
||||
{
|
||||
dsam->flags = flags;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void *DSA_meth_get_app_data(const DSA_METHOD *dsam)
|
||||
{
|
||||
return dsam->app_data;
|
||||
}
|
||||
|
||||
int DSA_meth_set_app_data(DSA_METHOD *dsam, void *app_data)
|
||||
{
|
||||
dsam->app_data = app_data;
|
||||
return 1;
|
||||
}
|
||||
|
||||
DSA_SIG *(*DSA_meth_get_sign(const DSA_METHOD *dsam))
|
||||
(const unsigned char *, int, DSA *)
|
||||
{
|
||||
return dsam->dsa_do_sign;
|
||||
}
|
||||
|
||||
int DSA_meth_set_sign(DSA_METHOD *dsam,
|
||||
DSA_SIG *(*sign) (const unsigned char *, int, DSA *))
|
||||
{
|
||||
dsam->dsa_do_sign = sign;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*DSA_meth_get_sign_setup(const DSA_METHOD *dsam))
|
||||
(DSA *, BN_CTX *, BIGNUM **, BIGNUM **)
|
||||
{
|
||||
return dsam->dsa_sign_setup;
|
||||
}
|
||||
|
||||
int DSA_meth_set_sign_setup(DSA_METHOD *dsam,
|
||||
int (*sign_setup) (DSA *, BN_CTX *, BIGNUM **, BIGNUM **))
|
||||
{
|
||||
dsam->dsa_sign_setup = sign_setup;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*DSA_meth_get_verify(const DSA_METHOD *dsam))
|
||||
(const unsigned char *, int , DSA_SIG *, DSA *)
|
||||
{
|
||||
return dsam->dsa_do_verify;
|
||||
}
|
||||
|
||||
int DSA_meth_set_verify(DSA_METHOD *dsam,
|
||||
int (*verify) (const unsigned char *, int, DSA_SIG *, DSA *))
|
||||
{
|
||||
dsam->dsa_do_verify = verify;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*DSA_meth_get_mod_exp(const DSA_METHOD *dsam))
|
||||
(DSA *, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *,
|
||||
BN_CTX *, BN_MONT_CTX *)
|
||||
{
|
||||
return dsam->dsa_mod_exp;
|
||||
}
|
||||
|
||||
int DSA_meth_set_mod_exp(DSA_METHOD *dsam,
|
||||
int (*mod_exp) (DSA *, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *,
|
||||
BIGNUM *, BN_CTX *, BN_MONT_CTX *))
|
||||
{
|
||||
dsam->dsa_mod_exp = mod_exp;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*DSA_meth_get_bn_mod_exp(const DSA_METHOD *dsam))
|
||||
(DSA *, BIGNUM *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *,
|
||||
BN_MONT_CTX *)
|
||||
{
|
||||
return dsam->bn_mod_exp;
|
||||
}
|
||||
|
||||
int DSA_meth_set_bn_mod_exp(DSA_METHOD *dsam,
|
||||
int (*bn_mod_exp) (DSA *, BIGNUM *, BIGNUM *, const BIGNUM *,
|
||||
const BIGNUM *, BN_CTX *, BN_MONT_CTX *))
|
||||
{
|
||||
dsam->bn_mod_exp = bn_mod_exp;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*DSA_meth_get_init(const DSA_METHOD *dsam))(DSA *)
|
||||
{
|
||||
return dsam->init;
|
||||
}
|
||||
|
||||
int DSA_meth_set_init(DSA_METHOD *dsam, int (*init)(DSA *))
|
||||
{
|
||||
dsam->init = init;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*DSA_meth_get_finish(const DSA_METHOD *dsam)) (DSA *)
|
||||
{
|
||||
return dsam->finish;
|
||||
}
|
||||
|
||||
int DSA_meth_set_finish(DSA_METHOD *dsam, int (*finish) (DSA *))
|
||||
{
|
||||
dsam->finish = finish;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*DSA_meth_get_paramgen(const DSA_METHOD *dsam))
|
||||
(DSA *, int, const unsigned char *, int, int *, unsigned long *,
|
||||
BN_GENCB *)
|
||||
{
|
||||
return dsam->dsa_paramgen;
|
||||
}
|
||||
|
||||
int DSA_meth_set_paramgen(DSA_METHOD *dsam,
|
||||
int (*paramgen) (DSA *, int, const unsigned char *, int, int *,
|
||||
unsigned long *, BN_GENCB *))
|
||||
{
|
||||
dsam->dsa_paramgen = paramgen;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*DSA_meth_get_keygen(const DSA_METHOD *dsam)) (DSA *)
|
||||
{
|
||||
return dsam->dsa_keygen;
|
||||
}
|
||||
|
||||
int DSA_meth_set_keygen(DSA_METHOD *dsam, int (*keygen) (DSA *))
|
||||
{
|
||||
dsam->dsa_keygen = keygen;
|
||||
return 1;
|
||||
}
|
|
@ -84,6 +84,10 @@ struct dev_crypto_state {
|
|||
|
||||
static u_int32_t cryptodev_asymfeat = 0;
|
||||
|
||||
#ifndef OPENSSL_NO_DSA
|
||||
static DSA_METHOD *cryptodev_dsa = NULL;
|
||||
#endif
|
||||
|
||||
static int get_asym_dev_crypto(void);
|
||||
static int open_dev_crypto(void);
|
||||
static int get_dev_crypto(void);
|
||||
|
@ -1172,6 +1176,10 @@ static int cryptodev_engine_destroy(ENGINE *e)
|
|||
EVP_MD_meth_free(md5_md);
|
||||
md5_md = NULL;
|
||||
# endif
|
||||
#ifndef OPENSSL_NO_DSA
|
||||
DSA_meth_free(cryptodev_dsa);
|
||||
cryptodev_dsa = NULL;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -1399,8 +1407,11 @@ cryptodev_dsa_dsa_mod_exp(DSA *dsa, BIGNUM *t1, BIGNUM *g,
|
|||
BIGNUM *u1, BIGNUM *pub_key, BIGNUM *u2, BIGNUM *p,
|
||||
BN_CTX *ctx, BN_MONT_CTX *mont)
|
||||
{
|
||||
BIGNUM *t2;
|
||||
BIGNUM *t2, *dsag, *dsap, *dsapub_key;
|
||||
int ret = 0;
|
||||
const DSA_METHOD *meth;
|
||||
int (*bn_mod_exp)(DSA *, BIGNUM *, BIGNUM *, const BIGNUM *, const BIGNUM *,
|
||||
BN_CTX *, BN_MONT_CTX *);
|
||||
|
||||
t2 = BN_new();
|
||||
if (t2 == NULL)
|
||||
|
@ -1410,14 +1421,24 @@ cryptodev_dsa_dsa_mod_exp(DSA *dsa, BIGNUM *t1, BIGNUM *g,
|
|||
/* let t1 = g ^ u1 mod p */
|
||||
ret = 0;
|
||||
|
||||
if (!dsa->meth->bn_mod_exp(dsa, t1, dsa->g, u1, dsa->p, ctx, mont))
|
||||
DSA_get0_pqg(dsa, &dsap, NULL, &dsag);
|
||||
DSA_get0_key(dsa, &dsapub_key, NULL);
|
||||
|
||||
meth = DSA_get_method(dsa);
|
||||
if (meth == NULL)
|
||||
goto err;
|
||||
bn_mod_exp = DSA_meth_get_bn_mod_exp(meth);
|
||||
if (bn_mod_exp == NULL)
|
||||
goto err;
|
||||
|
||||
if (!bn_mod_exp(dsa, t1, dsag, u1, dsap, ctx, mont))
|
||||
goto err;
|
||||
|
||||
/* let t2 = y ^ u2 mod p */
|
||||
if (!dsa->meth->bn_mod_exp(dsa, t2, dsa->pub_key, u2, dsa->p, ctx, mont))
|
||||
if (!bn_mod_exp(dsa, t2, dsapub_key, u2, dsap, ctx, mont))
|
||||
goto err;
|
||||
/* let u1 = t1 * t2 mod p */
|
||||
if (!BN_mod_mul(u1, t1, t2, dsa->p, ctx))
|
||||
if (!BN_mod_mul(u1, t1, t2, dsap, ctx))
|
||||
goto err;
|
||||
|
||||
BN_copy(t1, u1);
|
||||
|
@ -1432,7 +1453,8 @@ static DSA_SIG *cryptodev_dsa_do_sign(const unsigned char *dgst, int dlen,
|
|||
DSA *dsa)
|
||||
{
|
||||
struct crypt_kop kop;
|
||||
BIGNUM *r = NULL, *s = NULL;
|
||||
BIGNUM *r = NULL, *s = NULL, *dsap = NULL, *dsaq = NULL, *dsag = NULL;
|
||||
BIGNUM *priv_key = NULL;
|
||||
DSA_SIG *dsasig, *dsaret = NULL;
|
||||
|
||||
dsasig = DSA_SIG_new();
|
||||
|
@ -1446,22 +1468,23 @@ static DSA_SIG *cryptodev_dsa_do_sign(const unsigned char *dgst, int dlen,
|
|||
/* inputs: dgst dsa->p dsa->q dsa->g dsa->priv_key */
|
||||
kop.crk_param[0].crp_p = (caddr_t) dgst;
|
||||
kop.crk_param[0].crp_nbits = dlen * 8;
|
||||
if (bn2crparam(dsa->p, &kop.crk_param[1]))
|
||||
DSA_get0_pqg(dsa, &dsap, &dsaq, &dsag);
|
||||
DSA_get0_key(dsa, NULL, &priv_key);
|
||||
if (bn2crparam(dsap, &kop.crk_param[1]))
|
||||
goto err;
|
||||
if (bn2crparam(dsa->q, &kop.crk_param[2]))
|
||||
if (bn2crparam(dsaq, &kop.crk_param[2]))
|
||||
goto err;
|
||||
if (bn2crparam(dsa->g, &kop.crk_param[3]))
|
||||
if (bn2crparam(dsag, &kop.crk_param[3]))
|
||||
goto err;
|
||||
if (bn2crparam(dsa->priv_key, &kop.crk_param[4]))
|
||||
if (bn2crparam(priv_key, &kop.crk_param[4]))
|
||||
goto err;
|
||||
kop.crk_iparams = 5;
|
||||
|
||||
if (cryptodev_asym(&kop, BN_num_bytes(dsa->q), r,
|
||||
BN_num_bytes(dsa->q), s) == 0) {
|
||||
if (cryptodev_asym(&kop, BN_num_bytes(dsaq), r,
|
||||
BN_num_bytes(dsaq), s) == 0) {
|
||||
dsaret = dsasig;
|
||||
} else {
|
||||
const DSA_METHOD *meth = DSA_OpenSSL();
|
||||
dsaret = (meth->dsa_do_sign) (dgst, dlen, dsa);
|
||||
dsaret = DSA_meth_get_sign(DSA_OpenSSL())(dgst, dlen, dsa);
|
||||
}
|
||||
err:
|
||||
if (dsaret != dsasig)
|
||||
|
@ -1477,7 +1500,7 @@ cryptodev_dsa_verify(const unsigned char *dgst, int dlen,
|
|||
{
|
||||
struct crypt_kop kop;
|
||||
int dsaret = 1;
|
||||
BIGNUM *pr, *ps;
|
||||
BIGNUM *pr, *ps, *p = NULL, *q = NULL, *g = NULL, *pub_key = NULL;
|
||||
|
||||
memset(&kop, 0, sizeof(kop));
|
||||
kop.crk_op = CRK_DSA_VERIFY;
|
||||
|
@ -1485,13 +1508,15 @@ cryptodev_dsa_verify(const unsigned char *dgst, int dlen,
|
|||
/* inputs: dgst dsa->p dsa->q dsa->g dsa->pub_key sig->r sig->s */
|
||||
kop.crk_param[0].crp_p = (caddr_t) dgst;
|
||||
kop.crk_param[0].crp_nbits = dlen * 8;
|
||||
if (bn2crparam(dsa->p, &kop.crk_param[1]))
|
||||
DSA_get0_pqg(dsa, &p, &q, &g);
|
||||
if (bn2crparam(p, &kop.crk_param[1]))
|
||||
goto err;
|
||||
if (bn2crparam(dsa->q, &kop.crk_param[2]))
|
||||
if (bn2crparam(q, &kop.crk_param[2]))
|
||||
goto err;
|
||||
if (bn2crparam(dsa->g, &kop.crk_param[3]))
|
||||
if (bn2crparam(g, &kop.crk_param[3]))
|
||||
goto err;
|
||||
if (bn2crparam(dsa->pub_key, &kop.crk_param[4]))
|
||||
DSA_get0_key(dsa, &pub_key, NULL);
|
||||
if (bn2crparam(pub_key, &kop.crk_param[4]))
|
||||
goto err;
|
||||
DSA_SIG_get0(&pr, &ps, sig);
|
||||
if (bn2crparam(pr, &kop.crk_param[5]))
|
||||
|
@ -1507,28 +1532,13 @@ cryptodev_dsa_verify(const unsigned char *dgst, int dlen,
|
|||
if (0 != kop.crk_status)
|
||||
dsaret = 0;
|
||||
} else {
|
||||
const DSA_METHOD *meth = DSA_OpenSSL();
|
||||
|
||||
dsaret = (meth->dsa_do_verify) (dgst, dlen, sig, dsa);
|
||||
dsaret = DSA_meth_get_verify(DSA_OpenSSL())(dgst, dlen, sig, dsa);
|
||||
}
|
||||
err:
|
||||
kop.crk_param[0].crp_p = NULL;
|
||||
zapparams(&kop);
|
||||
return (dsaret);
|
||||
}
|
||||
|
||||
static DSA_METHOD cryptodev_dsa = {
|
||||
"cryptodev DSA method",
|
||||
NULL,
|
||||
NULL, /* dsa_sign_setup */
|
||||
NULL,
|
||||
NULL, /* dsa_mod_exp */
|
||||
NULL,
|
||||
NULL, /* init */
|
||||
NULL, /* finish */
|
||||
0, /* flags */
|
||||
NULL /* app_data */
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_DH
|
||||
|
@ -1670,18 +1680,23 @@ void engine_load_cryptodev_internal(void)
|
|||
}
|
||||
|
||||
#ifndef OPENSSL_NO_DSA
|
||||
if (ENGINE_set_DSA(engine, &cryptodev_dsa)) {
|
||||
const DSA_METHOD *meth = DSA_OpenSSL();
|
||||
|
||||
memcpy(&cryptodev_dsa, meth, sizeof(DSA_METHOD));
|
||||
if (cryptodev_asymfeat & CRF_DSA_SIGN)
|
||||
cryptodev_dsa.dsa_do_sign = cryptodev_dsa_do_sign;
|
||||
if (cryptodev_asymfeat & CRF_MOD_EXP) {
|
||||
cryptodev_dsa.bn_mod_exp = cryptodev_dsa_bn_mod_exp;
|
||||
cryptodev_dsa.dsa_mod_exp = cryptodev_dsa_dsa_mod_exp;
|
||||
cryptodev_dsa = DSA_meth_dup(DSA_OpenSSL());
|
||||
if (cryptodev_dsa != NULL) {
|
||||
DSA_meth_set_name(cryptodev_dsa, "cryptodev DSA method");
|
||||
DSA_meth_set_flags(cryptodev_dsa, 0);
|
||||
if (ENGINE_set_DSA(engine, cryptodev_dsa)) {
|
||||
if (cryptodev_asymfeat & CRF_DSA_SIGN)
|
||||
DSA_meth_set_sign(cryptodev_dsa, cryptodev_dsa_do_sign);
|
||||
if (cryptodev_asymfeat & CRF_MOD_EXP) {
|
||||
DSA_meth_set_bn_mod_exp(cryptodev_dsa, cryptodev_dsa_bn_mod_exp);
|
||||
DSA_meth_set_mod_exp(cryptodev_dsa, cryptodev_dsa_dsa_mod_exp);
|
||||
}
|
||||
if (cryptodev_asymfeat & CRF_DSA_VERIFY)
|
||||
DSA_meth_set_verify(cryptodev_dsa, cryptodev_dsa_verify);
|
||||
}
|
||||
if (cryptodev_asymfeat & CRF_DSA_VERIFY)
|
||||
cryptodev_dsa.dsa_do_verify = cryptodev_dsa_verify;
|
||||
} else {
|
||||
ENGINE_free(engine);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -503,16 +503,20 @@ static int do_i2b_bio(BIO *out, EVP_PKEY *pk, int ispub)
|
|||
static int check_bitlen_dsa(DSA *dsa, int ispub, unsigned int *pmagic)
|
||||
{
|
||||
int bitlen;
|
||||
bitlen = BN_num_bits(DSA_get0_p(dsa));
|
||||
if ((bitlen & 7) || (BN_num_bits(DSA_get0_q(dsa)) != 160)
|
||||
|| (BN_num_bits(DSA_get0_g(dsa)) > bitlen))
|
||||
BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub_key = NULL, *priv_key = NULL;
|
||||
|
||||
DSA_get0_pqg(dsa, &p, &q, &g);
|
||||
DSA_get0_key(dsa, &pub_key, &priv_key);
|
||||
bitlen = BN_num_bits(p);
|
||||
if ((bitlen & 7) || (BN_num_bits(q) != 160)
|
||||
|| (BN_num_bits(g) > bitlen))
|
||||
goto badkey;
|
||||
if (ispub) {
|
||||
if (BN_num_bits(DSA_get0_pub_key(dsa)) > bitlen)
|
||||
if (BN_num_bits(pub_key) > bitlen)
|
||||
goto badkey;
|
||||
*pmagic = MS_DSS1MAGIC;
|
||||
} else {
|
||||
if (BN_num_bits(DSA_get0_priv_key(dsa)) > 160)
|
||||
if (BN_num_bits(priv_key) > 160)
|
||||
goto badkey;
|
||||
*pmagic = MS_DSS2MAGIC;
|
||||
}
|
||||
|
@ -574,14 +578,18 @@ static void write_rsa(unsigned char **out, RSA *rsa, int ispub)
|
|||
static void write_dsa(unsigned char **out, DSA *dsa, int ispub)
|
||||
{
|
||||
int nbyte;
|
||||
nbyte = BN_num_bytes(DSA_get0_p(dsa));
|
||||
write_lebn(out, DSA_get0_p(dsa), nbyte);
|
||||
write_lebn(out, DSA_get0_q(dsa), 20);
|
||||
write_lebn(out, DSA_get0_g(dsa), nbyte);
|
||||
BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub_key = NULL, *priv_key = NULL;
|
||||
|
||||
DSA_get0_pqg(dsa, &p, &q, &g);
|
||||
DSA_get0_key(dsa, &pub_key, &priv_key);
|
||||
nbyte = BN_num_bytes(p);
|
||||
write_lebn(out, p, nbyte);
|
||||
write_lebn(out, q, 20);
|
||||
write_lebn(out, g, nbyte);
|
||||
if (ispub)
|
||||
write_lebn(out, DSA_get0_pub_key(dsa), nbyte);
|
||||
write_lebn(out, pub_key, nbyte);
|
||||
else
|
||||
write_lebn(out, DSA_get0_priv_key(dsa), 20);
|
||||
write_lebn(out, priv_key, 20);
|
||||
/* Set "invalid" for seed structure values */
|
||||
memset(*out, 0xff, 24);
|
||||
*out += 24;
|
||||
|
|
|
@ -447,20 +447,7 @@ static RSA_METHOD capi_rsa_method = {
|
|||
0 /* rsa_verify */
|
||||
};
|
||||
|
||||
static DSA_METHOD capi_dsa_method = {
|
||||
"CryptoAPI DSA method",
|
||||
capi_dsa_do_sign, /* dsa_do_sign */
|
||||
0, /* dsa_sign_setup */
|
||||
0, /* dsa_do_verify */
|
||||
0, /* dsa_mod_exp */
|
||||
0, /* bn_mod_exp */
|
||||
0, /* init */
|
||||
capi_dsa_free, /* finish */
|
||||
0, /* flags */
|
||||
NULL, /* app_data */
|
||||
0, /* dsa_paramgen */
|
||||
0 /* dsa_keygen */
|
||||
};
|
||||
static DSA_METHOD *capi_dsa_method = NULL;
|
||||
|
||||
static int use_aes_csp = 0;
|
||||
|
||||
|
@ -489,9 +476,12 @@ static int capi_init(ENGINE *e)
|
|||
/* Setup DSA Method */
|
||||
dsa_capi_idx = DSA_get_ex_new_index(0, NULL, NULL, NULL, 0);
|
||||
ossl_dsa_meth = DSA_OpenSSL();
|
||||
capi_dsa_method.dsa_do_verify = ossl_dsa_meth->dsa_do_verify;
|
||||
capi_dsa_method.dsa_mod_exp = ossl_dsa_meth->dsa_mod_exp;
|
||||
capi_dsa_method.bn_mod_exp = ossl_dsa_meth->bn_mod_exp;
|
||||
DSA_meth_set_sign(capi_dsa_method, capi_dsa_do_sign);
|
||||
DSA_meth_set_verify(capi_dsa_method, DSA_meth_get_verify(ossl_dsa_meth));
|
||||
DSA_meth_set_finish(capi_dsa_method, capi_dsa_free);
|
||||
DSA_meth_set_mod_exp(capi_dsa_method, DSA_meth_get_mod_exp(ossl_dsa_meth));
|
||||
DSA_meth_set_bn_mod_exp(capi_dsa_method,
|
||||
DSA_meth_get_bn_mod_exp(ossl_dsa_meth));
|
||||
}
|
||||
|
||||
ctx = capi_ctx_new();
|
||||
|
@ -535,6 +525,8 @@ static int capi_init(ENGINE *e)
|
|||
|
||||
static int capi_destroy(ENGINE *e)
|
||||
{
|
||||
DSA_meth_free(capi_dsa_method);
|
||||
capi_dsa_method = NULL;
|
||||
ERR_unload_CAPI_strings();
|
||||
return 1;
|
||||
}
|
||||
|
@ -564,6 +556,9 @@ struct CAPI_KEY_st {
|
|||
|
||||
static int bind_capi(ENGINE *e)
|
||||
{
|
||||
capi_dsa_method = DSA_meth_new("CryptoAPI DSA method", 0);
|
||||
if (capi_dsa_method == NULL)
|
||||
return 0;
|
||||
if (!ENGINE_set_id(e, engine_capi_id)
|
||||
|| !ENGINE_set_name(e, engine_capi_name)
|
||||
|| !ENGINE_set_flags(e, ENGINE_FLAGS_NO_REGISTER_ALL)
|
||||
|
@ -571,7 +566,7 @@ static int bind_capi(ENGINE *e)
|
|||
|| !ENGINE_set_finish_function(e, capi_finish)
|
||||
|| !ENGINE_set_destroy_function(e, capi_destroy)
|
||||
|| !ENGINE_set_RSA(e, &capi_rsa_method)
|
||||
|| !ENGINE_set_DSA(e, &capi_dsa_method)
|
||||
|| !ENGINE_set_DSA(e, capi_dsa_method)
|
||||
|| !ENGINE_set_load_privkey_function(e, capi_load_privkey)
|
||||
|| !ENGINE_set_load_ssl_client_cert_function(e,
|
||||
capi_load_ssl_client_cert)
|
||||
|
@ -716,6 +711,7 @@ static EVP_PKEY *capi_get_pkey(ENGINE *eng, CAPI_KEY * key)
|
|||
DSSPUBKEY *dp;
|
||||
DWORD dsa_plen;
|
||||
unsigned char *btmp;
|
||||
BIGNUM *p, *q, *g, *pub_key;
|
||||
dp = (DSSPUBKEY *) (bh + 1);
|
||||
if (dp->magic != 0x31535344) {
|
||||
char magstr[10];
|
||||
|
@ -730,23 +726,24 @@ static EVP_PKEY *capi_get_pkey(ENGINE *eng, CAPI_KEY * key)
|
|||
dkey = DSA_new_method(eng);
|
||||
if (!dkey)
|
||||
goto memerr;
|
||||
dkey->p = BN_new();
|
||||
dkey->q = BN_new();
|
||||
dkey->g = BN_new();
|
||||
dkey->pub_key = BN_new();
|
||||
if (dkey->p == NULL || dkey->q == NULL || dkey->g == NULL
|
||||
|| dkey->pub_key == NULL)
|
||||
p = BN_new();
|
||||
q = BN_new();
|
||||
g = BN_new();
|
||||
pub_key = BN_new();
|
||||
if (p == NULL || q == NULL || g == NULL || pub_key == NULL)
|
||||
goto memerr;
|
||||
if (!lend_tobn(dkey->p, btmp, dsa_plen))
|
||||
DSA_set0_pqg(dkey, p, q, g);
|
||||
DSA_set0_key(dkey, pub_key, NULL);
|
||||
if (!lend_tobn(p, btmp, dsa_plen))
|
||||
goto memerr;
|
||||
btmp += dsa_plen;
|
||||
if (!lend_tobn(dkey->q, btmp, 20))
|
||||
if (!lend_tobn(q, btmp, 20))
|
||||
goto memerr;
|
||||
btmp += 20;
|
||||
if (!lend_tobn(dkey->g, btmp, dsa_plen))
|
||||
if (!lend_tobn(g, btmp, dsa_plen))
|
||||
goto memerr;
|
||||
btmp += dsa_plen;
|
||||
if (!lend_tobn(dkey->pub_key, btmp, dsa_plen))
|
||||
if (!lend_tobn(pub_key, btmp, dsa_plen))
|
||||
goto memerr;
|
||||
btmp += dsa_plen;
|
||||
|
||||
|
@ -985,7 +982,7 @@ static DSA_SIG *capi_dsa_do_sign(const unsigned char *digest, int dlen,
|
|||
CAPI_CTX *ctx;
|
||||
unsigned char csigbuf[40];
|
||||
|
||||
ctx = ENGINE_get_ex_data(dsa->engine, capi_idx);
|
||||
ctx = ENGINE_get_ex_data(DSA_get0_engine(dsa), capi_idx);
|
||||
|
||||
CAPI_trace(ctx, "Called CAPI_dsa_do_sign()\n");
|
||||
|
||||
|
|
|
@ -74,8 +74,8 @@ extern "C" {
|
|||
# include <openssl/crypto.h>
|
||||
# include <openssl/ossl_typ.h>
|
||||
# include <openssl/opensslconf.h>
|
||||
# include <openssl/bn.h>
|
||||
# if OPENSSL_API_COMPAT < 0x10100000L
|
||||
# include <openssl/bn.h>
|
||||
# include <openssl/dh.h>
|
||||
# endif
|
||||
|
||||
|
@ -117,32 +117,6 @@ extern "C" {
|
|||
|
||||
typedef struct DSA_SIG_st DSA_SIG;
|
||||
|
||||
struct dsa_method {
|
||||
const char *name;
|
||||
DSA_SIG *(*dsa_do_sign) (const unsigned char *dgst, int dlen, DSA *dsa);
|
||||
int (*dsa_sign_setup) (DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp,
|
||||
BIGNUM **rp);
|
||||
int (*dsa_do_verify) (const unsigned char *dgst, int dgst_len,
|
||||
DSA_SIG *sig, DSA *dsa);
|
||||
int (*dsa_mod_exp) (DSA *dsa, BIGNUM *rr, BIGNUM *a1, BIGNUM *p1,
|
||||
BIGNUM *a2, BIGNUM *p2, BIGNUM *m, BN_CTX *ctx,
|
||||
BN_MONT_CTX *in_mont);
|
||||
/* Can be null */
|
||||
int (*bn_mod_exp) (DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p,
|
||||
const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
|
||||
int (*init) (DSA *dsa);
|
||||
int (*finish) (DSA *dsa);
|
||||
int flags;
|
||||
char *app_data;
|
||||
/* If this is non-NULL, it is used to generate DSA parameters */
|
||||
int (*dsa_paramgen) (DSA *dsa, int bits,
|
||||
const unsigned char *seed, int seed_len,
|
||||
int *counter_ret, unsigned long *h_ret,
|
||||
BN_GENCB *cb);
|
||||
/* If this is non-NULL, it is used to generate DSA keys */
|
||||
int (*dsa_keygen) (DSA *dsa);
|
||||
};
|
||||
|
||||
# define d2i_DSAparams_fp(fp,x) (DSA *)ASN1_d2i_fp((char *(*)())DSA_new, \
|
||||
(char *(*)())d2i_DSAparams,(fp),(unsigned char **)(x))
|
||||
# define i2d_DSAparams_fp(fp,x) ASN1_i2d_fp(i2d_DSAparams,(fp), \
|
||||
|
@ -166,6 +140,7 @@ const DSA_METHOD *DSA_OpenSSL(void);
|
|||
void DSA_set_default_method(const DSA_METHOD *);
|
||||
const DSA_METHOD *DSA_get_default_method(void);
|
||||
int DSA_set_method(DSA *dsa, const DSA_METHOD *);
|
||||
const DSA_METHOD *DSA_get_method(DSA *d);
|
||||
|
||||
DSA *DSA_new(void);
|
||||
DSA *DSA_new_method(ENGINE *engine);
|
||||
|
@ -241,18 +216,61 @@ DH *DSA_dup_DH(const DSA *r);
|
|||
# define EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS (EVP_PKEY_ALG_CTRL + 2)
|
||||
# define EVP_PKEY_CTRL_DSA_PARAMGEN_MD (EVP_PKEY_ALG_CTRL + 3)
|
||||
|
||||
BIGNUM *DSA_get0_p(const DSA *d);
|
||||
BIGNUM *DSA_get0_q(const DSA *d);
|
||||
BIGNUM *DSA_get0_g(const DSA *d);
|
||||
void DSA_get0_pqg(const DSA *d, BIGNUM **p, BIGNUM **q, BIGNUM **g);
|
||||
int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g);
|
||||
BIGNUM *DSA_get0_priv_key(const DSA *d);
|
||||
BIGNUM *DSA_get0_pub_key(const DSA *d);
|
||||
void DSA_get0_key(const DSA *d, BIGNUM **pub_key, BIGNUM **priv_key);
|
||||
int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key);
|
||||
void DSA_clear_flags(DSA *d, int flags);
|
||||
int DSA_test_flags(const DSA *d, int flags);
|
||||
void DSA_set_flags(DSA *d, int flags);
|
||||
ENGINE *DSA_get0_engine(DSA *d);
|
||||
|
||||
DSA_METHOD *DSA_meth_new(const char *name, int flags);
|
||||
void DSA_meth_free(DSA_METHOD *dsam);
|
||||
DSA_METHOD *DSA_meth_dup(const DSA_METHOD *meth);
|
||||
const char *DSA_meth_get_name(const DSA_METHOD *dsam);
|
||||
int DSA_meth_set_name(DSA_METHOD *dsam, const char *name);
|
||||
int DSA_meth_get_flags(DSA_METHOD *dsam);
|
||||
int DSA_meth_set_flags(DSA_METHOD *dsam, int flags);
|
||||
void *DSA_meth_get_app_data(const DSA_METHOD *dsam);
|
||||
int DSA_meth_set_app_data(DSA_METHOD *dsam, void *app_data);
|
||||
DSA_SIG *(*DSA_meth_get_sign(const DSA_METHOD *dsam))
|
||||
(const unsigned char *, int, DSA *);
|
||||
int DSA_meth_set_sign(DSA_METHOD *dsam,
|
||||
DSA_SIG *(*sign) (const unsigned char *, int, DSA *));
|
||||
int (*DSA_meth_get_sign_setup(const DSA_METHOD *dsam))
|
||||
(DSA *, BN_CTX *, BIGNUM **, BIGNUM **);
|
||||
int DSA_meth_set_sign_setup(DSA_METHOD *dsam,
|
||||
int (*sign_setup) (DSA *, BN_CTX *, BIGNUM **, BIGNUM **));
|
||||
int (*DSA_meth_get_verify(const DSA_METHOD *dsam))
|
||||
(const unsigned char *, int , DSA_SIG *, DSA *);
|
||||
int DSA_meth_set_verify(DSA_METHOD *dsam,
|
||||
int (*verify) (const unsigned char *, int, DSA_SIG *, DSA *));
|
||||
int (*DSA_meth_get_mod_exp(const DSA_METHOD *dsam))
|
||||
(DSA *, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *,
|
||||
BN_CTX *, BN_MONT_CTX *);
|
||||
int DSA_meth_set_mod_exp(DSA_METHOD *dsam,
|
||||
int (*mod_exp) (DSA *, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *,
|
||||
BIGNUM *, BN_CTX *, BN_MONT_CTX *));
|
||||
int (*DSA_meth_get_bn_mod_exp(const DSA_METHOD *dsam))
|
||||
(DSA *, BIGNUM *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *,
|
||||
BN_MONT_CTX *);
|
||||
int DSA_meth_set_bn_mod_exp(DSA_METHOD *dsam,
|
||||
int (*bn_mod_exp) (DSA *, BIGNUM *, BIGNUM *, const BIGNUM *,
|
||||
const BIGNUM *, BN_CTX *, BN_MONT_CTX *));
|
||||
int (*DSA_meth_get_init(const DSA_METHOD *dsam))(DSA *);
|
||||
int DSA_meth_set_init(DSA_METHOD *dsam, int (*init)(DSA *));
|
||||
int (*DSA_meth_get_finish(const DSA_METHOD *dsam)) (DSA *);
|
||||
int DSA_meth_set_finish(DSA_METHOD *dsam, int (*finish) (DSA *));
|
||||
int (*DSA_meth_get_paramgen(const DSA_METHOD *dsam))
|
||||
(DSA *, int, const unsigned char *, int, int *, unsigned long *,
|
||||
BN_GENCB *);
|
||||
int DSA_meth_set_paramgen(DSA_METHOD *dsam,
|
||||
int (*paramgen) (DSA *, int, const unsigned char *, int, int *,
|
||||
unsigned long *, BN_GENCB *));
|
||||
int (*DSA_meth_get_keygen(const DSA_METHOD *dsam)) (DSA *);
|
||||
int DSA_meth_set_keygen(DSA_METHOD *dsam, int (*keygen) (DSA *));
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/*
|
||||
* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
|
|
|
@ -133,6 +133,7 @@ int main(int argc, char **argv)
|
|||
unsigned long h;
|
||||
unsigned char sig[256];
|
||||
unsigned int siglen;
|
||||
BIGNUM *p = NULL, *q = NULL, *g = NULL;
|
||||
|
||||
if (bio_err == NULL)
|
||||
bio_err = BIO_new_fp(stderr, BIO_NOCLOSE | BIO_FP_TEXT);
|
||||
|
@ -172,21 +173,22 @@ int main(int argc, char **argv)
|
|||
goto end;
|
||||
}
|
||||
|
||||
i = BN_bn2bin(DSA_get0_q(dsa), buf);
|
||||
DSA_get0_pqg(dsa, &p, &q, &g);
|
||||
i = BN_bn2bin(q, buf);
|
||||
j = sizeof(out_q);
|
||||
if ((i != j) || (memcmp(buf, out_q, i) != 0)) {
|
||||
BIO_printf(bio_err, "q value is wrong\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
i = BN_bn2bin(DSA_get0_p(dsa), buf);
|
||||
i = BN_bn2bin(p, buf);
|
||||
j = sizeof(out_p);
|
||||
if ((i != j) || (memcmp(buf, out_p, i) != 0)) {
|
||||
BIO_printf(bio_err, "p value is wrong\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
i = BN_bn2bin(DSA_get0_g(dsa), buf);
|
||||
i = BN_bn2bin(g, buf);
|
||||
j = sizeof(out_g);
|
||||
if ((i != j) || (memcmp(buf, out_g, i) != 0)) {
|
||||
BIO_printf(bio_err, "g value is wrong\n");
|
||||
|
|
Loading…
Reference in a new issue