2008-11-06 02:39:08 +08:00
|
|
|
/*
|
2024-09-05 15:35:49 +08:00
|
|
|
* Copyright 2006-2024 The OpenSSL Project Authors. All Rights Reserved.
|
2006-04-12 18:20:47 +08:00
|
|
|
*
|
2018-12-06 20:36:26 +08:00
|
|
|
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
2016-05-18 02:51:26 +08:00
|
|
|
* 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
|
2006-04-12 18:20:47 +08:00
|
|
|
*/
|
|
|
|
|
2020-01-30 05:23:39 +08:00
|
|
|
/*
|
|
|
|
* DSA low level APIs are deprecated for public use, but still ok for
|
|
|
|
* internal use.
|
|
|
|
*/
|
|
|
|
#include "internal/deprecated.h"
|
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
#include <stdio.h>
|
2015-05-14 22:56:48 +08:00
|
|
|
#include "internal/cryptlib.h"
|
2006-04-12 18:20:47 +08:00
|
|
|
#include <openssl/asn1t.h>
|
|
|
|
#include <openssl/x509.h>
|
|
|
|
#include <openssl/evp.h>
|
2008-03-17 05:05:46 +08:00
|
|
|
#include <openssl/bn.h>
|
2019-09-28 06:45:33 +08:00
|
|
|
#include "crypto/evp.h"
|
2019-09-28 06:45:40 +08:00
|
|
|
#include "dsa_local.h"
|
2006-04-12 18:20:47 +08:00
|
|
|
|
|
|
|
/* DSA pkey context structure */
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
/* Parameter gen parameters */
|
2019-04-13 18:32:48 +08:00
|
|
|
int nbits; /* size of p in bits (default: 2048) */
|
|
|
|
int qbits; /* size of q in bits (default: 224) */
|
2007-02-03 22:41:12 +08:00
|
|
|
const EVP_MD *pmd; /* MD for parameter generation */
|
2006-04-12 18:20:47 +08:00
|
|
|
/* Keygen callback info */
|
|
|
|
int gentmp[2];
|
|
|
|
/* message digest */
|
2007-02-03 22:41:12 +08:00
|
|
|
const EVP_MD *md; /* MD for the signature */
|
2006-04-12 18:20:47 +08:00
|
|
|
} DSA_PKEY_CTX;
|
|
|
|
|
|
|
|
static int pkey_dsa_init(EVP_PKEY_CTX *ctx)
|
|
|
|
{
|
2016-12-10 04:17:05 +08:00
|
|
|
DSA_PKEY_CTX *dctx = OPENSSL_malloc(sizeof(*dctx));
|
|
|
|
|
2015-10-30 19:12:26 +08:00
|
|
|
if (dctx == NULL)
|
2006-04-12 18:20:47 +08:00
|
|
|
return 0;
|
2019-04-13 18:32:48 +08:00
|
|
|
dctx->nbits = 2048;
|
|
|
|
dctx->qbits = 224;
|
2007-02-03 22:41:12 +08:00
|
|
|
dctx->pmd = NULL;
|
2006-04-12 18:20:47 +08:00
|
|
|
dctx->md = NULL;
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
ctx->data = dctx;
|
|
|
|
ctx->keygen_info = dctx->gentmp;
|
|
|
|
ctx->keygen_info_count = 2;
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2019-01-16 04:51:25 +08:00
|
|
|
static int pkey_dsa_copy(EVP_PKEY_CTX *dst, const EVP_PKEY_CTX *src)
|
2006-05-25 07:49:30 +08:00
|
|
|
{
|
|
|
|
DSA_PKEY_CTX *dctx, *sctx;
|
2016-12-10 04:17:05 +08:00
|
|
|
|
2006-05-25 07:49:30 +08:00
|
|
|
if (!pkey_dsa_init(dst))
|
|
|
|
return 0;
|
|
|
|
sctx = src->data;
|
|
|
|
dctx = dst->data;
|
|
|
|
dctx->nbits = sctx->nbits;
|
2007-02-03 22:41:12 +08:00
|
|
|
dctx->qbits = sctx->qbits;
|
|
|
|
dctx->pmd = sctx->pmd;
|
|
|
|
dctx->md = sctx->md;
|
2006-05-25 07:49:30 +08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
static void pkey_dsa_cleanup(EVP_PKEY_CTX *ctx)
|
|
|
|
{
|
|
|
|
DSA_PKEY_CTX *dctx = ctx->data;
|
2015-05-01 22:02:07 +08:00
|
|
|
OPENSSL_free(dctx);
|
2006-04-12 18:20:47 +08:00
|
|
|
}
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-05-24 20:33:46 +08:00
|
|
|
static int pkey_dsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig,
|
|
|
|
size_t *siglen, const unsigned char *tbs,
|
|
|
|
size_t tbslen)
|
2006-04-12 18:20:47 +08:00
|
|
|
{
|
2024-03-23 07:32:44 +08:00
|
|
|
int ret, md_size;
|
2006-04-12 18:20:47 +08:00
|
|
|
unsigned int sltmp;
|
|
|
|
DSA_PKEY_CTX *dctx = ctx->data;
|
2021-07-20 16:58:53 +08:00
|
|
|
/*
|
|
|
|
* Discard const. Its marked as const because this may be a cached copy of
|
|
|
|
* the "real" key. These calls don't make any modifications that need to
|
|
|
|
* be reflected back in the "original" key.
|
|
|
|
*/
|
|
|
|
DSA *dsa = (DSA *)EVP_PKEY_get0_DSA(ctx->pkey);
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2024-03-23 07:32:44 +08:00
|
|
|
if (dctx->md != NULL) {
|
|
|
|
md_size = EVP_MD_get_size(dctx->md);
|
|
|
|
if (md_size <= 0)
|
|
|
|
return 0;
|
|
|
|
if (tbslen != (size_t)md_size)
|
|
|
|
return 0;
|
|
|
|
}
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2025-06-11 16:48:01 +08:00
|
|
|
ret = DSA_sign(0, tbs, (int)tbslen, sig, &sltmp, dsa);
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2009-12-02 02:39:33 +08:00
|
|
|
if (ret <= 0)
|
2006-04-12 18:20:47 +08:00
|
|
|
return ret;
|
|
|
|
*siglen = sltmp;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int pkey_dsa_verify(EVP_PKEY_CTX *ctx,
|
2006-05-24 20:33:46 +08:00
|
|
|
const unsigned char *sig, size_t siglen,
|
|
|
|
const unsigned char *tbs, size_t tbslen)
|
2006-04-12 18:20:47 +08:00
|
|
|
{
|
2024-03-23 07:32:44 +08:00
|
|
|
int ret, md_size;
|
2006-04-12 18:20:47 +08:00
|
|
|
DSA_PKEY_CTX *dctx = ctx->data;
|
2021-07-20 16:58:53 +08:00
|
|
|
/*
|
|
|
|
* Discard const. Its marked as const because this may be a cached copy of
|
|
|
|
* the "real" key. These calls don't make any modifications that need to
|
|
|
|
* be reflected back in the "original" key.
|
|
|
|
*/
|
|
|
|
DSA *dsa = (DSA *)EVP_PKEY_get0_DSA(ctx->pkey);
|
2006-04-12 18:20:47 +08:00
|
|
|
|
2024-03-23 07:32:44 +08:00
|
|
|
if (dctx->md != NULL) {
|
|
|
|
md_size = EVP_MD_get_size(dctx->md);
|
|
|
|
if (md_size <= 0)
|
|
|
|
return 0;
|
|
|
|
if (tbslen != (size_t)md_size)
|
|
|
|
return 0;
|
|
|
|
}
|
2006-04-12 18:20:47 +08:00
|
|
|
|
2025-06-11 16:48:01 +08:00
|
|
|
ret = DSA_verify(0, tbs, (int)tbslen, sig, (int)siglen, dsa);
|
2006-04-12 18:20:47 +08:00
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int pkey_dsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
|
|
|
|
{
|
|
|
|
DSA_PKEY_CTX *dctx = ctx->data;
|
2016-12-10 04:17:05 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
switch (type) {
|
|
|
|
case EVP_PKEY_CTRL_DSA_PARAMGEN_BITS:
|
|
|
|
if (p1 < 256)
|
|
|
|
return -2;
|
|
|
|
dctx->nbits = p1;
|
|
|
|
return 1;
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2007-02-03 22:41:12 +08:00
|
|
|
case EVP_PKEY_CTRL_DSA_PARAMGEN_Q_BITS:
|
|
|
|
if (p1 != 160 && p1 != 224 && p1 && p1 != 256)
|
|
|
|
return -2;
|
|
|
|
dctx->qbits = p1;
|
|
|
|
return 1;
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2007-02-03 22:41:12 +08:00
|
|
|
case EVP_PKEY_CTRL_DSA_PARAMGEN_MD:
|
Rename all getters to use get/get0 in name
For functions that exist in 1.1.1 provide a simple aliases via #define.
Fixes #15236
Functions with OSSL_DECODER_, OSSL_ENCODER_, OSSL_STORE_LOADER_,
EVP_KEYEXCH_, EVP_KEM_, EVP_ASYM_CIPHER_, EVP_SIGNATURE_,
EVP_KEYMGMT_, EVP_RAND_, EVP_MAC_, EVP_KDF_, EVP_PKEY_,
EVP_MD_, and EVP_CIPHER_ prefixes are renamed.
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/15405)
2021-05-21 22:58:08 +08:00
|
|
|
if (EVP_MD_get_type((const EVP_MD *)p2) != NID_sha1 &&
|
|
|
|
EVP_MD_get_type((const EVP_MD *)p2) != NID_sha224 &&
|
|
|
|
EVP_MD_get_type((const EVP_MD *)p2) != NID_sha256) {
|
2020-11-04 19:23:19 +08:00
|
|
|
ERR_raise(ERR_LIB_DSA, DSA_R_INVALID_DIGEST_TYPE);
|
2007-02-03 22:41:12 +08:00
|
|
|
return 0;
|
|
|
|
}
|
2017-01-18 23:19:26 +08:00
|
|
|
dctx->pmd = p2;
|
2007-02-03 22:41:12 +08:00
|
|
|
return 1;
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
case EVP_PKEY_CTRL_MD:
|
Rename all getters to use get/get0 in name
For functions that exist in 1.1.1 provide a simple aliases via #define.
Fixes #15236
Functions with OSSL_DECODER_, OSSL_ENCODER_, OSSL_STORE_LOADER_,
EVP_KEYEXCH_, EVP_KEM_, EVP_ASYM_CIPHER_, EVP_SIGNATURE_,
EVP_KEYMGMT_, EVP_RAND_, EVP_MAC_, EVP_KDF_, EVP_PKEY_,
EVP_MD_, and EVP_CIPHER_ prefixes are renamed.
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/15405)
2021-05-21 22:58:08 +08:00
|
|
|
if (EVP_MD_get_type((const EVP_MD *)p2) != NID_sha1 &&
|
|
|
|
EVP_MD_get_type((const EVP_MD *)p2) != NID_dsa &&
|
|
|
|
EVP_MD_get_type((const EVP_MD *)p2) != NID_dsaWithSHA &&
|
|
|
|
EVP_MD_get_type((const EVP_MD *)p2) != NID_sha224 &&
|
|
|
|
EVP_MD_get_type((const EVP_MD *)p2) != NID_sha256 &&
|
|
|
|
EVP_MD_get_type((const EVP_MD *)p2) != NID_sha384 &&
|
|
|
|
EVP_MD_get_type((const EVP_MD *)p2) != NID_sha512 &&
|
|
|
|
EVP_MD_get_type((const EVP_MD *)p2) != NID_sha3_224 &&
|
|
|
|
EVP_MD_get_type((const EVP_MD *)p2) != NID_sha3_256 &&
|
|
|
|
EVP_MD_get_type((const EVP_MD *)p2) != NID_sha3_384 &&
|
|
|
|
EVP_MD_get_type((const EVP_MD *)p2) != NID_sha3_512) {
|
2020-11-04 19:23:19 +08:00
|
|
|
ERR_raise(ERR_LIB_DSA, DSA_R_INVALID_DIGEST_TYPE);
|
2006-04-12 18:20:47 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
dctx->md = p2;
|
|
|
|
return 1;
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2013-06-20 01:20:03 +08:00
|
|
|
case EVP_PKEY_CTRL_GET_MD:
|
|
|
|
*(const EVP_MD **)p2 = dctx->md;
|
|
|
|
return 1;
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2008-05-02 19:24:40 +08:00
|
|
|
case EVP_PKEY_CTRL_DIGESTINIT:
|
2006-07-11 02:36:55 +08:00
|
|
|
case EVP_PKEY_CTRL_PKCS7_SIGN:
|
2008-03-13 05:14:28 +08:00
|
|
|
case EVP_PKEY_CTRL_CMS_SIGN:
|
2006-07-11 02:36:55 +08:00
|
|
|
return 1;
|
2015-01-22 11:40:55 +08:00
|
|
|
|
1. Changes for s_client.c to make it return non-zero exit code in case
of handshake failure
2. Changes to x509_certificate_type function (crypto/x509/x509type.c) to
make it recognize GOST certificates as EVP_PKT_SIGN|EVP_PKT_EXCH
(required for s3_srvr to accept GOST client certificates).
3. Changes to EVP
- adding of function EVP_PKEY_CTX_get0_peerkey
- Make function EVP_PKEY_derive_set_peerkey work for context with
ENCRYPT operation, because we use peerkey field in the context to
pass non-ephemeral secret key to GOST encrypt operation.
- added EVP_PKEY_CTRL_SET_IV control command. It is really
GOST-specific, but it is used in SSL code, so it has to go
in some header file, available during libssl compilation
4. Fix to HMAC to avoid call of OPENSSL_cleanse on undefined data
5. Include des.h if KSSL_DEBUG is defined into some libssl files, to
make debugging output which depends on constants defined there, work
and other KSSL_DEBUG output fixes
6. Declaration of real GOST ciphersuites, two authentication methods
SSL_aGOST94 and SSL_aGOST2001 and one key exchange method SSL_kGOST
7. Implementation of these methods.
8. Support for sending unsolicited serverhello extension if GOST
ciphersuite is selected. It is require for interoperability with
CryptoPro CSP 3.0 and 3.6 and controlled by
SSL_OP_CRYPTOPRO_TLSEXT_BUG constant.
This constant is added to SSL_OP_ALL, because it does nothing, if
non-GOST ciphersuite is selected, and all implementation of GOST
include compatibility with CryptoPro.
9. Support for CertificateVerify message without length field. It is
another CryptoPro bug, but support is made unconditional, because it
does no harm for draft-conforming implementation.
10. In tls1_mac extra copy of stream mac context is no more done.
When I've written currently commited code I haven't read
EVP_DigestSignFinal manual carefully enough and haven't noticed that
it does an internal digest ctx copying.
This implementation was tested against
1. CryptoPro CSP 3.6 client and server
2. Cryptopro CSP 3.0 server
2007-10-26 20:06:36 +08:00
|
|
|
case EVP_PKEY_CTRL_PEER_KEY:
|
2020-11-04 19:23:19 +08:00
|
|
|
ERR_raise(ERR_LIB_DSA, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
|
1. Changes for s_client.c to make it return non-zero exit code in case
of handshake failure
2. Changes to x509_certificate_type function (crypto/x509/x509type.c) to
make it recognize GOST certificates as EVP_PKT_SIGN|EVP_PKT_EXCH
(required for s3_srvr to accept GOST client certificates).
3. Changes to EVP
- adding of function EVP_PKEY_CTX_get0_peerkey
- Make function EVP_PKEY_derive_set_peerkey work for context with
ENCRYPT operation, because we use peerkey field in the context to
pass non-ephemeral secret key to GOST encrypt operation.
- added EVP_PKEY_CTRL_SET_IV control command. It is really
GOST-specific, but it is used in SSL code, so it has to go
in some header file, available during libssl compilation
4. Fix to HMAC to avoid call of OPENSSL_cleanse on undefined data
5. Include des.h if KSSL_DEBUG is defined into some libssl files, to
make debugging output which depends on constants defined there, work
and other KSSL_DEBUG output fixes
6. Declaration of real GOST ciphersuites, two authentication methods
SSL_aGOST94 and SSL_aGOST2001 and one key exchange method SSL_kGOST
7. Implementation of these methods.
8. Support for sending unsolicited serverhello extension if GOST
ciphersuite is selected. It is require for interoperability with
CryptoPro CSP 3.0 and 3.6 and controlled by
SSL_OP_CRYPTOPRO_TLSEXT_BUG constant.
This constant is added to SSL_OP_ALL, because it does nothing, if
non-GOST ciphersuite is selected, and all implementation of GOST
include compatibility with CryptoPro.
9. Support for CertificateVerify message without length field. It is
another CryptoPro bug, but support is made unconditional, because it
does no harm for draft-conforming implementation.
10. In tls1_mac extra copy of stream mac context is no more done.
When I've written currently commited code I haven't read
EVP_DigestSignFinal manual carefully enough and haven't noticed that
it does an internal digest ctx copying.
This implementation was tested against
1. CryptoPro CSP 3.6 client and server
2. Cryptopro CSP 3.0 server
2007-10-26 20:06:36 +08:00
|
|
|
return -2;
|
2006-04-12 18:20:47 +08:00
|
|
|
default:
|
|
|
|
return -2;
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
}
|
|
|
|
}
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
static int pkey_dsa_ctrl_str(EVP_PKEY_CTX *ctx,
|
|
|
|
const char *type, const char *value)
|
|
|
|
{
|
2015-05-07 02:56:14 +08:00
|
|
|
if (strcmp(type, "dsa_paramgen_bits") == 0) {
|
2006-04-12 18:20:47 +08:00
|
|
|
int nbits;
|
|
|
|
nbits = atoi(value);
|
|
|
|
return EVP_PKEY_CTX_set_dsa_paramgen_bits(ctx, nbits);
|
|
|
|
}
|
2015-05-07 02:56:14 +08:00
|
|
|
if (strcmp(type, "dsa_paramgen_q_bits") == 0) {
|
2007-02-03 22:41:12 +08:00
|
|
|
int qbits = atoi(value);
|
2019-01-26 03:56:45 +08:00
|
|
|
return EVP_PKEY_CTX_set_dsa_paramgen_q_bits(ctx, qbits);
|
2007-02-03 22:41:12 +08:00
|
|
|
}
|
2015-05-07 02:56:14 +08:00
|
|
|
if (strcmp(type, "dsa_paramgen_md") == 0) {
|
2018-03-30 00:48:28 +08:00
|
|
|
const EVP_MD *md = EVP_get_digestbyname(value);
|
|
|
|
|
|
|
|
if (md == NULL) {
|
2020-11-04 19:23:19 +08:00
|
|
|
ERR_raise(ERR_LIB_DSA, DSA_R_INVALID_DIGEST_TYPE);
|
2018-03-30 00:48:28 +08:00
|
|
|
return 0;
|
|
|
|
}
|
2019-01-26 03:56:45 +08:00
|
|
|
return EVP_PKEY_CTX_set_dsa_paramgen_md(ctx, md);
|
2007-02-03 22:41:12 +08:00
|
|
|
}
|
2006-04-12 18:20:47 +08:00
|
|
|
return -2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int pkey_dsa_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
|
|
|
|
{
|
|
|
|
DSA *dsa = NULL;
|
|
|
|
DSA_PKEY_CTX *dctx = ctx->data;
|
2014-10-29 06:56:18 +08:00
|
|
|
BN_GENCB *pcb;
|
2020-02-06 20:28:36 +08:00
|
|
|
int ret, res;
|
2016-12-10 04:17:05 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
if (ctx->pkey_gencb) {
|
2014-10-29 06:56:18 +08:00
|
|
|
pcb = BN_GENCB_new();
|
2015-10-30 19:12:26 +08:00
|
|
|
if (pcb == NULL)
|
2014-10-29 06:56:18 +08:00
|
|
|
return 0;
|
2006-04-12 18:20:47 +08:00
|
|
|
evp_pkey_set_cb_translate(pcb, ctx);
|
|
|
|
} else
|
|
|
|
pcb = NULL;
|
|
|
|
dsa = DSA_new();
|
2015-10-30 19:12:26 +08:00
|
|
|
if (dsa == NULL) {
|
2015-05-01 09:37:06 +08:00
|
|
|
BN_GENCB_free(pcb);
|
2006-04-12 18:20:47 +08:00
|
|
|
return 0;
|
2014-10-29 06:56:18 +08:00
|
|
|
}
|
2020-06-17 09:33:16 +08:00
|
|
|
if (dctx->md != NULL)
|
Rename all getters to use get/get0 in name
For functions that exist in 1.1.1 provide a simple aliases via #define.
Fixes #15236
Functions with OSSL_DECODER_, OSSL_ENCODER_, OSSL_STORE_LOADER_,
EVP_KEYEXCH_, EVP_KEM_, EVP_ASYM_CIPHER_, EVP_SIGNATURE_,
EVP_KEYMGMT_, EVP_RAND_, EVP_MAC_, EVP_KDF_, EVP_PKEY_,
EVP_MD_, and EVP_CIPHER_ prefixes are renamed.
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/15405)
2021-05-21 22:58:08 +08:00
|
|
|
ossl_ffc_set_digest(&dsa->params, EVP_MD_get0_name(dctx->md), NULL);
|
2020-06-17 09:33:16 +08:00
|
|
|
|
ffc: add _ossl to exported but internal functions
The functions updated are:
ffc_generate_private_key, ffc_named_group_from_uid,
ffc_named_group_to_uid, ffc_params_FIPS186_2_gen_verify,
ffc_params_FIPS186_2_generate, ffc_params_FIPS186_2_validate,
ffc_params_FIPS186_4_gen_verify, ffc_params_FIPS186_4_generate,
ffc_params_FIPS186_4_validate, ffc_params_cleanup, ffc_params_cmp,
ffc_params_copy, ffc_params_enable_flags, ffc_params_flags_from_name,
ffc_params_flags_to_name, ffc_params_fromdata,
ffc_params_get0_pqg, ffc_params_get_validate_params,
ffc_params_init, ffc_params_print, ffc_params_set0_j,
ffc_params_set0_pqg, ffc_params_set_flags, ffc_params_set_gindex,
ffc_params_set_h, ffc_params_set_pcounter, ffc_params_set_seed,
ffc_params_set_validate_params, ffc_params_simple_validate,
ffc_params_todata, ffc_params_validate_unverifiable_g, ffc_set_digest,
ffc_set_group_pqg, ffc_validate_private_key, ffc_validate_public_key
and ffc_validate_public_key_partial.
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/13041)
2020-09-30 13:07:24 +08:00
|
|
|
ret = ossl_ffc_params_FIPS186_4_generate(NULL, &dsa->params,
|
|
|
|
FFC_PARAM_TYPE_DSA, dctx->nbits,
|
|
|
|
dctx->qbits, &res, pcb);
|
2015-05-01 09:37:06 +08:00
|
|
|
BN_GENCB_free(pcb);
|
2020-06-06 03:27:34 +08:00
|
|
|
if (ret > 0)
|
2006-04-12 18:20:47 +08:00
|
|
|
EVP_PKEY_assign_DSA(pkey, dsa);
|
|
|
|
else
|
|
|
|
DSA_free(dsa);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2006-04-12 19:14:11 +08:00
|
|
|
static int pkey_dsa_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
|
|
|
|
{
|
|
|
|
DSA *dsa = NULL;
|
2016-12-10 04:17:05 +08:00
|
|
|
|
2006-04-12 19:14:11 +08:00
|
|
|
if (ctx->pkey == NULL) {
|
2020-11-04 19:23:19 +08:00
|
|
|
ERR_raise(ERR_LIB_DSA, DSA_R_NO_PARAMETERS_SET);
|
2006-04-12 19:14:11 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
dsa = DSA_new();
|
2015-10-30 19:12:26 +08:00
|
|
|
if (dsa == NULL)
|
2006-04-12 19:14:11 +08:00
|
|
|
return 0;
|
|
|
|
EVP_PKEY_assign_DSA(pkey, dsa);
|
|
|
|
/* Note: if error return, pkey is freed by parent routine */
|
|
|
|
if (!EVP_PKEY_copy_parameters(pkey, ctx->pkey))
|
|
|
|
return 0;
|
2021-07-20 16:58:53 +08:00
|
|
|
return DSA_generate_key((DSA *)EVP_PKEY_get0_DSA(pkey));
|
2006-04-12 19:14:11 +08:00
|
|
|
}
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2019-09-19 21:31:27 +08:00
|
|
|
static const EVP_PKEY_METHOD dsa_pkey_meth = {
|
2006-04-12 18:20:47 +08:00
|
|
|
EVP_PKEY_DSA,
|
2006-04-16 02:50:56 +08:00
|
|
|
EVP_PKEY_FLAG_AUTOARGLEN,
|
2006-04-12 18:20:47 +08:00
|
|
|
pkey_dsa_init,
|
2006-05-25 07:49:30 +08:00
|
|
|
pkey_dsa_copy,
|
2006-04-12 18:20:47 +08:00
|
|
|
pkey_dsa_cleanup,
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
0,
|
|
|
|
pkey_dsa_paramgen,
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-12 19:14:11 +08:00
|
|
|
0,
|
|
|
|
pkey_dsa_keygen,
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
0,
|
|
|
|
pkey_dsa_sign,
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
0,
|
|
|
|
pkey_dsa_verify,
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
0, 0,
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
0, 0, 0, 0,
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
0, 0,
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
0, 0,
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-13 20:56:41 +08:00
|
|
|
0, 0,
|
2015-01-22 11:40:55 +08:00
|
|
|
|
2006-04-12 18:20:47 +08:00
|
|
|
pkey_dsa_ctrl,
|
|
|
|
pkey_dsa_ctrl_str
|
|
|
|
};
|
2019-09-19 21:31:27 +08:00
|
|
|
|
Fix external symbols related to dsa keys
Partial fix for #12964
This adds ossl_ names for the following symbols:
dsa_check_pairwise, dsa_check_params, dsa_check_priv_key, dsa_check_pub_key, dsa_check_pub_key_partial,
dsa_do_sign_int, dsa_ffc_params_fromdata,
dsa_generate_ffc_parameters, dsa_generate_public_key,
dsa_get0_params, dsa_key_fromdata, dsa_new_with_ctx, dsa_pkey_method, dsa_sign_int
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/14231)
2021-02-18 14:30:37 +08:00
|
|
|
const EVP_PKEY_METHOD *ossl_dsa_pkey_method(void)
|
2019-09-19 21:31:27 +08:00
|
|
|
{
|
|
|
|
return &dsa_pkey_meth;
|
|
|
|
}
|