Latest update.
This commit is contained in:
+68
-3
@@ -8,14 +8,16 @@
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/asn1.h>
|
||||
#include "dsa_locl.h"
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/cms.h>
|
||||
#include <openssl/core_names.h>
|
||||
#include "internal/cryptlib.h"
|
||||
#include "internal/asn1_int.h"
|
||||
#include "internal/evp_int.h"
|
||||
#include "internal/param_build.h"
|
||||
#include "dsa_locl.h"
|
||||
|
||||
static int dsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)
|
||||
{
|
||||
@@ -63,6 +65,7 @@ static int dsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)
|
||||
goto err;
|
||||
}
|
||||
|
||||
dsa->dirty_cnt++;
|
||||
ASN1_INTEGER_free(public_key);
|
||||
EVP_PKEY_assign_DSA(pkey, dsa);
|
||||
return 1;
|
||||
@@ -185,6 +188,7 @@ static int dsa_priv_decode(EVP_PKEY *pkey, const PKCS8_PRIV_KEY_INFO *p8)
|
||||
goto dsaerr;
|
||||
}
|
||||
|
||||
dsa->dirty_cnt++;
|
||||
EVP_PKEY_assign_DSA(pkey, dsa);
|
||||
|
||||
ret = 1;
|
||||
@@ -300,6 +304,7 @@ static int dsa_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
|
||||
return 0;
|
||||
BN_free(to->pkey.dsa->g);
|
||||
to->pkey.dsa->g = a;
|
||||
to->pkey.dsa->dirty_cnt++;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -381,6 +386,7 @@ static int dsa_param_decode(EVP_PKEY *pkey,
|
||||
DSAerr(DSA_F_DSA_PARAM_DECODE, ERR_R_DSA_LIB);
|
||||
return 0;
|
||||
}
|
||||
dsa->dirty_cnt++;
|
||||
EVP_PKEY_assign_DSA(pkey, dsa);
|
||||
return 1;
|
||||
}
|
||||
@@ -417,6 +423,7 @@ static int old_dsa_priv_decode(EVP_PKEY *pkey,
|
||||
DSAerr(DSA_F_OLD_DSA_PRIV_DECODE, ERR_R_DSA_LIB);
|
||||
return 0;
|
||||
}
|
||||
dsa->dirty_cnt++;
|
||||
EVP_PKEY_assign_DSA(pkey, dsa);
|
||||
return 1;
|
||||
}
|
||||
@@ -514,6 +521,56 @@ static int dsa_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2)
|
||||
|
||||
}
|
||||
|
||||
static size_t dsa_pkey_dirty_cnt(const EVP_PKEY *pkey)
|
||||
{
|
||||
return pkey->pkey.dsa->dirty_cnt;
|
||||
}
|
||||
|
||||
static void *dsa_pkey_export_to(const EVP_PKEY *pk, EVP_KEYMGMT *keymgmt)
|
||||
{
|
||||
DSA *dsa = pk->pkey.dsa;
|
||||
OSSL_PARAM_BLD tmpl;
|
||||
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;
|
||||
void *provkey = NULL;
|
||||
|
||||
if (p == NULL || q == NULL || g == NULL)
|
||||
return NULL;
|
||||
|
||||
ossl_param_bld_init(&tmpl);
|
||||
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))
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* This may be used to pass domain parameters only without any key data -
|
||||
* so "pub_key" is optional. We can never have a "priv_key" without a
|
||||
* corresponding "pub_key" though.
|
||||
*/
|
||||
if (pub_key != NULL) {
|
||||
if (!ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_DSA_PUB_KEY,
|
||||
pub_key))
|
||||
return NULL;
|
||||
|
||||
if (priv_key != NULL) {
|
||||
if (!ossl_param_bld_push_BN(&tmpl, OSSL_PKEY_PARAM_DSA_PRIV_KEY,
|
||||
priv_key))
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
params = ossl_param_bld_to_param(&tmpl);
|
||||
|
||||
/* We export, the provider imports */
|
||||
provkey = evp_keymgmt_importkey(keymgmt, params);
|
||||
|
||||
ossl_param_bld_free(params);
|
||||
return provkey;
|
||||
}
|
||||
|
||||
/* NB these are sorted in pkey_id order, lowest first */
|
||||
|
||||
const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[5] = {
|
||||
@@ -570,5 +627,13 @@ const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[5] = {
|
||||
int_dsa_free,
|
||||
dsa_pkey_ctrl,
|
||||
old_dsa_priv_decode,
|
||||
old_dsa_priv_encode}
|
||||
old_dsa_priv_encode,
|
||||
|
||||
NULL, NULL, NULL,
|
||||
NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
|
||||
dsa_pkey_dirty_cnt,
|
||||
dsa_pkey_export_to
|
||||
}
|
||||
};
|
||||
+69
-7
@@ -13,13 +13,7 @@
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/asn1t.h>
|
||||
#include <openssl/rand.h>
|
||||
|
||||
ASN1_SEQUENCE(DSA_SIG) = {
|
||||
ASN1_SIMPLE(DSA_SIG, r, CBIGNUM),
|
||||
ASN1_SIMPLE(DSA_SIG, s, CBIGNUM)
|
||||
} static_ASN1_SEQUENCE_END(DSA_SIG)
|
||||
|
||||
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(DSA_SIG, DSA_SIG, DSA_SIG)
|
||||
#include "internal/asn1_dsa.h"
|
||||
|
||||
DSA_SIG *DSA_SIG_new(void)
|
||||
{
|
||||
@@ -38,6 +32,74 @@ void DSA_SIG_free(DSA_SIG *sig)
|
||||
OPENSSL_free(sig);
|
||||
}
|
||||
|
||||
DSA_SIG *d2i_DSA_SIG(DSA_SIG **psig, const unsigned char **ppin, long len)
|
||||
{
|
||||
DSA_SIG *sig;
|
||||
|
||||
if (len < 0)
|
||||
return NULL;
|
||||
if (psig != NULL && *psig != NULL) {
|
||||
sig = *psig;
|
||||
} else {
|
||||
sig = DSA_SIG_new();
|
||||
if (sig == NULL)
|
||||
return NULL;
|
||||
}
|
||||
if (sig->r == NULL)
|
||||
sig->r = BN_new();
|
||||
if (sig->s == NULL)
|
||||
sig->s = BN_new();
|
||||
if (decode_der_dsa_sig(sig->r, sig->s, ppin, (size_t)len) == 0) {
|
||||
if (psig == NULL || *psig == NULL)
|
||||
DSA_SIG_free(sig);
|
||||
return NULL;
|
||||
}
|
||||
if (psig != NULL && *psig == NULL)
|
||||
*psig = sig;
|
||||
return sig;
|
||||
}
|
||||
|
||||
int i2d_DSA_SIG(const DSA_SIG *sig, unsigned char **ppout)
|
||||
{
|
||||
BUF_MEM *buf = NULL;
|
||||
size_t encoded_len;
|
||||
WPACKET pkt;
|
||||
|
||||
if (ppout == NULL) {
|
||||
if (!WPACKET_init_null(&pkt, 0))
|
||||
return -1;
|
||||
} else if (*ppout == NULL) {
|
||||
if ((buf = BUF_MEM_new()) == NULL
|
||||
|| !WPACKET_init_len(&pkt, buf, 0)) {
|
||||
BUF_MEM_free(buf);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
if (!WPACKET_init_static_len(&pkt, *ppout, SIZE_MAX, 0))
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!encode_der_dsa_sig(&pkt, sig->r, sig->s)
|
||||
|| !WPACKET_get_total_written(&pkt, &encoded_len)
|
||||
|| !WPACKET_finish(&pkt)) {
|
||||
BUF_MEM_free(buf);
|
||||
WPACKET_cleanup(&pkt);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ppout != NULL) {
|
||||
if (*ppout == NULL) {
|
||||
*ppout = (unsigned char *)buf->data;
|
||||
buf->data = NULL;
|
||||
BUF_MEM_free(buf);
|
||||
} else {
|
||||
*ppout += encoded_len;
|
||||
}
|
||||
}
|
||||
|
||||
return (int)encoded_len;
|
||||
}
|
||||
|
||||
void DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps)
|
||||
{
|
||||
if (pr != NULL)
|
||||
|
||||
+4
-34
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Generated by util/mkerr.pl DO NOT EDIT
|
||||
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -13,36 +13,6 @@
|
||||
|
||||
#ifndef OPENSSL_NO_ERR
|
||||
|
||||
static const ERR_STRING_DATA DSA_str_functs[] = {
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSAPARAMS_PRINT, 0), "DSAparams_print"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSAPARAMS_PRINT_FP, 0), "DSAparams_print_fp"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_BUILTIN_PARAMGEN, 0),
|
||||
"dsa_builtin_paramgen"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_BUILTIN_PARAMGEN2, 0),
|
||||
"dsa_builtin_paramgen2"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_DO_SIGN, 0), "DSA_do_sign"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_DO_VERIFY, 0), "DSA_do_verify"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_METH_DUP, 0), "DSA_meth_dup"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_METH_NEW, 0), "DSA_meth_new"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_METH_SET1_NAME, 0), "DSA_meth_set1_name"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_NEW_METHOD, 0), "DSA_new_method"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_PARAM_DECODE, 0), "dsa_param_decode"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_PRINT_FP, 0), "DSA_print_fp"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_PRIV_DECODE, 0), "dsa_priv_decode"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_PRIV_ENCODE, 0), "dsa_priv_encode"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_PUB_DECODE, 0), "dsa_pub_decode"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_PUB_ENCODE, 0), "dsa_pub_encode"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_SIGN, 0), "DSA_sign"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_SIGN_SETUP, 0), "DSA_sign_setup"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_DSA_SIG_NEW, 0), "DSA_SIG_new"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_OLD_DSA_PRIV_DECODE, 0),
|
||||
"old_dsa_priv_decode"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_PKEY_DSA_CTRL, 0), "pkey_dsa_ctrl"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_PKEY_DSA_CTRL_STR, 0), "pkey_dsa_ctrl_str"},
|
||||
{ERR_PACK(ERR_LIB_DSA, DSA_F_PKEY_DSA_KEYGEN, 0), "pkey_dsa_keygen"},
|
||||
{0, NULL}
|
||||
};
|
||||
|
||||
static const ERR_STRING_DATA DSA_str_reasons[] = {
|
||||
{ERR_PACK(ERR_LIB_DSA, 0, DSA_R_BAD_Q_VALUE), "bad q value"},
|
||||
{ERR_PACK(ERR_LIB_DSA, 0, DSA_R_BN_DECODE_ERROR), "bn decode error"},
|
||||
@@ -52,6 +22,8 @@ static const ERR_STRING_DATA DSA_str_reasons[] = {
|
||||
"invalid digest type"},
|
||||
{ERR_PACK(ERR_LIB_DSA, 0, DSA_R_INVALID_PARAMETERS), "invalid parameters"},
|
||||
{ERR_PACK(ERR_LIB_DSA, 0, DSA_R_MISSING_PARAMETERS), "missing parameters"},
|
||||
{ERR_PACK(ERR_LIB_DSA, 0, DSA_R_MISSING_PRIVATE_KEY),
|
||||
"missing private key"},
|
||||
{ERR_PACK(ERR_LIB_DSA, 0, DSA_R_MODULUS_TOO_LARGE), "modulus too large"},
|
||||
{ERR_PACK(ERR_LIB_DSA, 0, DSA_R_NO_PARAMETERS_SET), "no parameters set"},
|
||||
{ERR_PACK(ERR_LIB_DSA, 0, DSA_R_PARAMETER_ENCODING_ERROR),
|
||||
@@ -67,10 +39,8 @@ static const ERR_STRING_DATA DSA_str_reasons[] = {
|
||||
int ERR_load_DSA_strings(void)
|
||||
{
|
||||
#ifndef OPENSSL_NO_ERR
|
||||
if (ERR_func_error_string(DSA_str_functs[0].error) == NULL) {
|
||||
ERR_load_strings_const(DSA_str_functs);
|
||||
if (ERR_reason_error_string(DSA_str_reasons[0].error) == NULL)
|
||||
ERR_load_strings_const(DSA_str_reasons);
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
@@ -281,6 +281,7 @@ int dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits,
|
||||
ret->p = BN_dup(p);
|
||||
ret->q = BN_dup(q);
|
||||
ret->g = BN_dup(g);
|
||||
ret->dirty_cnt++;
|
||||
if (ret->p == NULL || ret->q == NULL || ret->g == NULL) {
|
||||
ok = 0;
|
||||
goto err;
|
||||
@@ -598,6 +599,7 @@ int dsa_builtin_paramgen2(DSA *ret, size_t L, size_t N,
|
||||
ok = -1;
|
||||
goto err;
|
||||
}
|
||||
ret->dirty_cnt++;
|
||||
if (counter_ret != NULL)
|
||||
*counter_ret = counter;
|
||||
if (h_ret != NULL)
|
||||
|
||||
@@ -65,6 +65,7 @@ static int dsa_builtin_keygen(DSA *dsa)
|
||||
|
||||
dsa->priv_key = priv_key;
|
||||
dsa->pub_key = pub_key;
|
||||
dsa->dirty_cnt++;
|
||||
ok = 1;
|
||||
|
||||
err:
|
||||
|
||||
@@ -273,6 +273,7 @@ int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g)
|
||||
BN_free(d->g);
|
||||
d->g = g;
|
||||
}
|
||||
d->dirty_cnt++;
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -303,6 +304,7 @@ int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key)
|
||||
BN_free(d->priv_key);
|
||||
d->priv_key = priv_key;
|
||||
}
|
||||
d->dirty_cnt++;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -31,6 +31,9 @@ struct dsa_st {
|
||||
/* functional reference if 'meth' is ENGINE-provided */
|
||||
ENGINE *engine;
|
||||
CRYPTO_RWLOCK *lock;
|
||||
|
||||
/* Provider data */
|
||||
size_t dirty_cnt; /* If any key material changes, increment this */
|
||||
};
|
||||
|
||||
struct DSA_SIG_st {
|
||||
|
||||
@@ -72,6 +72,10 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)
|
||||
reason = DSA_R_MISSING_PARAMETERS;
|
||||
goto err;
|
||||
}
|
||||
if (dsa->priv_key == NULL) {
|
||||
reason = DSA_R_MISSING_PRIVATE_KEY;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = DSA_SIG_new();
|
||||
if (ret == NULL)
|
||||
@@ -195,6 +199,10 @@ static int dsa_sign_setup(DSA *dsa, BN_CTX *ctx_in,
|
||||
DSAerr(DSA_F_DSA_SIGN_SETUP, DSA_R_INVALID_PARAMETERS);
|
||||
return 0;
|
||||
}
|
||||
if (dsa->priv_key == NULL) {
|
||||
DSAerr(DSA_F_DSA_SIGN_SETUP, DSA_R_MISSING_PRIVATE_KEY);
|
||||
return 0;
|
||||
}
|
||||
|
||||
k = BN_new();
|
||||
l = BN_new();
|
||||
|
||||
Reference in New Issue
Block a user