summaryrefslogtreecommitdiffstats
path: root/crypto/dh
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2020-12-01 19:11:59 +0100
committerRichard Levitte <levitte@openssl.org>2020-12-16 11:55:39 +0100
commitc829c23b67308ad8e8ab677c78db1d5151106c3c (patch)
treea1b4b7aeb5cc3093db9df76e06e02ce18f1653ed /crypto/dh
parentd33ab074ef9847b67d96961f85f4ad614395d2c2 (diff)
EVP_PKEY & DH: Make DH EVP_PKEY_CTX parameter ctrls / setters more available
EVP_PKEY_CTX_set_dh_ functions were only available when DH was enabled ('no-dsa' not configured). However, that makes it impossible to use these functions with an engine or a provider that happens to implement DH. This change solves that problem by shuffling these functions to more appropriate places. By consequence, there are a number of places where we can remove the check of OPENSSL_NO_DH. This requires some re-arrangements of internal tables to translate between numeric identities and names. Partially fixes #13550 Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org> (Merged from https://github.com/openssl/openssl/pull/13589)
Diffstat (limited to 'crypto/dh')
-rw-r--r--crypto/dh/build.info2
-rw-r--r--crypto/dh/dh_ctrl.c569
-rw-r--r--crypto/dh/dh_group_params.c162
3 files changed, 20 insertions, 713 deletions
diff --git a/crypto/dh/build.info b/crypto/dh/build.info
index 887ef78b0b..b413567271 100644
--- a/crypto/dh/build.info
+++ b/crypto/dh/build.info
@@ -5,7 +5,7 @@ $COMMON=dh_lib.c dh_key.c dh_group_params.c dh_check.c dh_backend.c dh_gen.c \
SOURCE[../../libcrypto]=$COMMON\
dh_asn1.c dh_err.c \
- dh_ameth.c dh_pmeth.c dh_prn.c dh_rfc5114.c dh_meth.c dh_ctrl.c
+ dh_ameth.c dh_pmeth.c dh_prn.c dh_rfc5114.c dh_meth.c
IF[{- !$disabled{'deprecated-0.9.8'} -}]
SOURCE[../../libcrypto]=dh_depr.c
ENDIF
diff --git a/crypto/dh/dh_ctrl.c b/crypto/dh/dh_ctrl.c
deleted file mode 100644
index 291b0ad419..0000000000
--- a/crypto/dh/dh_ctrl.c
+++ /dev/null
@@ -1,569 +0,0 @@
-/*
- * Copyright 1995-2020 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
- * in the file LICENSE in the source distribution or at
- * https://www.openssl.org/source/license.html
- */
-
-/*
- * DH low level APIs are deprecated for public use, but still ok for
- * internal use.
- */
-#include "internal/deprecated.h"
-
-#include <stdio.h>
-#include "crypto/evp.h"
-#include <openssl/bn.h>
-#include <openssl/engine.h>
-#include <openssl/obj_mac.h>
-#include <openssl/core_names.h>
-#include "internal/cryptlib.h"
-#include "internal/refcount.h"
-#include "crypto/dh.h"
-#include "dh_local.h"
-
-static int dh_paramgen_check(EVP_PKEY_CTX *ctx)
-{
- if (ctx == NULL || !EVP_PKEY_CTX_IS_GEN_OP(ctx)) {
- ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
- /* Uses the same return values as EVP_PKEY_CTX_ctrl */
- return -2;
- }
- /* If key type not DH return error */
- if (ctx->pmeth != NULL
- && ctx->pmeth->pkey_id != EVP_PKEY_DH
- && ctx->pmeth->pkey_id != EVP_PKEY_DHX)
- return -1;
- return 1;
-}
-
-static int dh_param_derive_check(EVP_PKEY_CTX *ctx)
-{
- if (ctx == NULL || !EVP_PKEY_CTX_IS_DERIVE_OP(ctx)) {
- ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
- /* Uses the same return values as EVP_PKEY_CTX_ctrl */
- return -2;
- }
- /* If key type not DH return error */
- if (ctx->pmeth != NULL
- && ctx->pmeth->pkey_id != EVP_PKEY_DH
- && ctx->pmeth->pkey_id != EVP_PKEY_DHX)
- return -1;
- return 1;
-}
-
-int EVP_PKEY_CTX_set_dh_paramgen_gindex(EVP_PKEY_CTX *ctx, int gindex)
-{
- int ret;
- OSSL_PARAM params[2], *p = params;
-
- if ((ret = dh_paramgen_check(ctx)) <= 0)
- return ret;
-
- *p++ = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_FFC_GINDEX, &gindex);
- *p = OSSL_PARAM_construct_end();
-
- return EVP_PKEY_CTX_set_params(ctx, params);
-}
-
-int EVP_PKEY_CTX_set_dh_paramgen_seed(EVP_PKEY_CTX *ctx,
- const unsigned char *seed,
- size_t seedlen)
-{
- int ret;
- OSSL_PARAM params[2], *p = params;
-
- if ((ret = dh_paramgen_check(ctx)) <= 0)
- return ret;
-
- *p++ = OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_FFC_SEED,
- (void *)seed, seedlen);
- *p = OSSL_PARAM_construct_end();
-
- return EVP_PKEY_CTX_set_params(ctx, params);
-}
-
-int EVP_PKEY_CTX_set_dh_paramgen_type(EVP_PKEY_CTX *ctx, int typ)
-{
- int ret;
- OSSL_PARAM params[2], *p = params;
- const char *name;
-
- if ((ret = dh_paramgen_check(ctx)) <= 0)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.keymgmt.genctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN,
- EVP_PKEY_CTRL_DH_PARAMGEN_TYPE, typ, NULL);
-
- name = dh_gen_type_id2name(typ);
- if (name == NULL)
- return 0;
- *p++ = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_FFC_TYPE,
- (char *) name, 0);
- *p = OSSL_PARAM_construct_end();
-
- return EVP_PKEY_CTX_set_params(ctx, params);
-}
-
-int EVP_PKEY_CTX_set_dh_paramgen_prime_len(EVP_PKEY_CTX *ctx, int pbits)
-{
- int ret;
- OSSL_PARAM params[2], *p = params;
- size_t bits = pbits;
-
- if ((ret = dh_paramgen_check(ctx)) <= 0)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.keymgmt.genctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN,
- EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN, pbits,
- NULL);
- *p++ = OSSL_PARAM_construct_size_t(OSSL_PKEY_PARAM_FFC_PBITS, &bits);
- *p = OSSL_PARAM_construct_end();
- return EVP_PKEY_CTX_set_params(ctx, params);
-}
-
-int EVP_PKEY_CTX_set_dh_paramgen_subprime_len(EVP_PKEY_CTX *ctx, int qbits)
-{
- int ret;
- OSSL_PARAM params[2], *p = params;
- size_t bits2 = qbits;
-
- if ((ret = dh_paramgen_check(ctx)) <= 0)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.keymgmt.genctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN,
- EVP_PKEY_CTRL_DH_PARAMGEN_SUBPRIME_LEN, qbits,
- NULL);
- *p++ = OSSL_PARAM_construct_size_t(OSSL_PKEY_PARAM_FFC_QBITS, &bits2);
- *p = OSSL_PARAM_construct_end();
-
- return EVP_PKEY_CTX_set_params(ctx, params);
-}
-
-int EVP_PKEY_CTX_set_dh_paramgen_generator(EVP_PKEY_CTX *ctx, int gen)
-{
- int ret;
- OSSL_PARAM params[2], *p = params;
-
- if ((ret = dh_paramgen_check(ctx)) <= 0)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.keymgmt.genctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN,
- EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR, gen, NULL);
- *p++ = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_DH_GENERATOR, &gen);
- *p = OSSL_PARAM_construct_end();
-
- return EVP_PKEY_CTX_set_params(ctx, params);
-}
-
-int EVP_PKEY_CTX_set_dh_rfc5114(EVP_PKEY_CTX *ctx, int gen)
-{
- int ret;
- OSSL_PARAM params[2], *p = params;
- const char *name;
-
- if ((ret = dh_paramgen_check(ctx)) <= 0)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.keymgmt.genctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_PARAMGEN,
- EVP_PKEY_CTRL_DH_RFC5114, gen, NULL);
- name = ossl_ffc_named_group_from_uid(gen);
- if (name == NULL)
- return 0;
-
- *p++ = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME,
- (void *)name, 0);
- *p = OSSL_PARAM_construct_end();
- return EVP_PKEY_CTX_set_params(ctx, params);
-}
-
-int EVP_PKEY_CTX_set_dhx_rfc5114(EVP_PKEY_CTX *ctx, int gen)
-{
- return EVP_PKEY_CTX_set_dh_rfc5114(ctx, gen);
-}
-
-int EVP_PKEY_CTX_set_dh_nid(EVP_PKEY_CTX *ctx, int nid)
-{
- int ret;
- OSSL_PARAM params[2], *p = params;
- const char *name;
-
- if ((ret = dh_paramgen_check(ctx)) <= 0)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.keymgmt.genctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH,
- EVP_PKEY_OP_PARAMGEN | EVP_PKEY_OP_KEYGEN,
- EVP_PKEY_CTRL_DH_NID, nid, NULL);
- name = ossl_ffc_named_group_from_uid(nid);
- if (name == NULL)
- return 0;
-
- *p++ = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME,
- (void *)name, 0);
- *p = OSSL_PARAM_construct_end();
- return EVP_PKEY_CTX_set_params(ctx, params);
-}
-
-int EVP_PKEY_CTX_set_dh_kdf_type(EVP_PKEY_CTX *ctx, int kdf)
-{
- int ret;
- const char *kdf_type;
- OSSL_PARAM params[2], *p = params;
-
- ret = dh_param_derive_check(ctx);
- if (ret != 1)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.kex.exchprovctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE,
- EVP_PKEY_CTRL_DH_KDF_TYPE, kdf, NULL);
- switch (kdf) {
- case EVP_PKEY_DH_KDF_NONE:
- kdf_type = "";
- break;
- case EVP_PKEY_DH_KDF_X9_42:
- kdf_type = OSSL_KDF_NAME_X942KDF_ASN1;
- break;
- default:
- return -2;
- }
- *p++ = OSSL_PARAM_construct_utf8_string(OSSL_EXCHANGE_PARAM_KDF_TYPE,
- /*
- * Cast away the const. This is read
- * only so should be safe
- */
- (char *)kdf_type, 0);
- *p = OSSL_PARAM_construct_end();
-
- ret = evp_pkey_ctx_set_params_strict(ctx, params);
- if (ret == -2) {
- ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
- /* Uses the same return values as EVP_PKEY_CTX_ctrl */
- return -2;
- }
-
- return ret;
-}
-
-int EVP_PKEY_CTX_get_dh_kdf_type(EVP_PKEY_CTX *ctx)
-{
- int ret;
- char kdf_type[80]; /* 80 should be big enough */
- OSSL_PARAM params[2], *p = params;
-
- ret = dh_param_derive_check(ctx);
- if (ret != 1)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.kex.exchprovctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE,
- EVP_PKEY_CTRL_DH_KDF_TYPE, -2, NULL);
- *p++ = OSSL_PARAM_construct_utf8_string(OSSL_EXCHANGE_PARAM_KDF_TYPE,
- kdf_type, sizeof(kdf_type));
- *p = OSSL_PARAM_construct_end();
-
- ret = evp_pkey_ctx_get_params_strict(ctx, params);
- if (ret == -2) {
- ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
- /* Uses the same return values as EVP_PKEY_CTX_ctrl */
- return -2;
- } else if (ret != 1) {
- return -1;
- }
-
- if (kdf_type[0] == '\0')
- return EVP_PKEY_DH_KDF_NONE;
- else if (strcmp(kdf_type, OSSL_KDF_NAME_X942KDF_ASN1) == 0)
- return EVP_PKEY_DH_KDF_X9_42;
-
- return -1;
-}
-
-int EVP_PKEY_CTX_set0_dh_kdf_oid(EVP_PKEY_CTX *ctx, ASN1_OBJECT *oid)
-{
- int ret;
- OSSL_PARAM params[2], *p = params;
- const char *oid_name;
-
- ret = dh_param_derive_check(ctx);
- if (ret != 1)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.kex.exchprovctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE,
- EVP_PKEY_CTRL_DH_KDF_OID, 0, (void *)(oid));
- oid_name = OBJ_nid2sn(OBJ_obj2nid(oid));
-
- *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_CEK_ALG,
- (char *)oid_name, 0);
- *p = OSSL_PARAM_construct_end();
- ret = evp_pkey_ctx_set_params_strict(ctx, params);
- if (ret == -2) {
- ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
- /* Uses the same return values as EVP_PKEY_CTX_ctrl */
- return -2;
- }
-
- return ret;
-}
-
-int EVP_PKEY_CTX_get0_dh_kdf_oid(EVP_PKEY_CTX *ctx, ASN1_OBJECT **oid)
-{
- int ret, nid;
- OSSL_PARAM params[2], *p = params;
- char oid_name[80]; /* 80 should be big enough */
-
- ret = dh_param_derive_check(ctx);
- if (ret != 1)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.kex.exchprovctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE,
- EVP_PKEY_CTRL_GET_DH_KDF_OID, 0, (void *)(oid));
- *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_CEK_ALG,
- oid_name, sizeof(oid_name));
- *p = OSSL_PARAM_construct_end();
-
- ret = evp_pkey_ctx_get_params_strict(ctx, params);
- if (ret == -2) {
- ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
- /* Uses the same return values as EVP_PKEY_CTX_ctrl */
- return -2;
- } else if (ret != 1) {
- return -1;
- }
- nid = OBJ_sn2nid(oid_name);
- if (nid == NID_undef)
- nid = OBJ_ln2nid(oid_name);
- *oid = (nid == NID_undef ? NULL : OBJ_nid2obj(nid));
- return *oid != NULL;
-}
-
-int EVP_PKEY_CTX_set_dh_kdf_md(EVP_PKEY_CTX *ctx, const EVP_MD *md)
-{
- int ret;
- OSSL_PARAM params[2], *p = params;
- const char *md_name = NULL;
-
- ret = dh_param_derive_check(ctx);
- if (ret != 1)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.kex.exchprovctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE,
- EVP_PKEY_CTRL_DH_KDF_MD, 0, (void *)(md));
- md_name = (md == NULL) ? "" : EVP_MD_name(md);
-
- *p++ = OSSL_PARAM_construct_utf8_string(OSSL_EXCHANGE_PARAM_KDF_DIGEST,
- /*
- * Cast away the const. This is read
- * only so should be safe
- */
- (char *)md_name, 0);
- *p = OSSL_PARAM_construct_end();
-
- ret = evp_pkey_ctx_set_params_strict(ctx, params);
- if (ret == -2) {
- ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
- /* Uses the same return values as EVP_PKEY_CTX_ctrl */
- return -2;
- }
- return ret;
-}
-
-int EVP_PKEY_CTX_get_dh_kdf_md(EVP_PKEY_CTX *ctx, const EVP_MD **pmd)
-{
- int ret;
- char name[80] = ""; /* 80 should be big enough */
- OSSL_PARAM params[2], *p = params;
-
- ret = dh_param_derive_check(ctx);
- if (ret != 1)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.kex.exchprovctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE,
- EVP_PKEY_CTRL_GET_DH_KDF_MD, 0, (void *)(pmd));
- *p++ = OSSL_PARAM_construct_utf8_string(OSSL_EXCHANGE_PARAM_KDF_DIGEST,
- name, sizeof(name));
- *p = OSSL_PARAM_construct_end();
-
- ret = evp_pkey_ctx_get_params_strict(ctx, params);
- if (ret == -2) {
- ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
- /* Uses the same return values as EVP_PKEY_CTX_ctrl */
- return -2;
- } else if (ret != 1) {
- return -1;
- }
-
- /* May be NULL meaning "unknown" */
- *pmd = EVP_get_digestbyname(name);
-
- return 1;
-}
-
-int EVP_PKEY_CTX_set_dh_kdf_outlen(EVP_PKEY_CTX *ctx, int inlen)
-{
- int ret;
- size_t len = inlen;
- OSSL_PARAM params[2], *p = params;
-
- ret = dh_param_derive_check(ctx);
- if (ret != 1)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.kex.exchprovctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE,
- EVP_PKEY_CTRL_DH_KDF_OUTLEN, inlen, NULL);
- if (inlen <= 0) {
- /*
- * This would ideally be -1 or 0, but we have to retain compatibility
- * with legacy behaviour of EVP_PKEY_CTX_ctrl() which returned -2 if
- * in <= 0
- */
- return -2;
- }
-
- *p++ = OSSL_PARAM_construct_size_t(OSSL_EXCHANGE_PARAM_KDF_OUTLEN,
- &len);
- *p = OSSL_PARAM_construct_end();
-
- ret = evp_pkey_ctx_set_params_strict(ctx, params);
- if (ret == -2) {
- ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
- /* Uses the same return values as EVP_PKEY_CTX_ctrl */
- return -2;
- }
- return ret;
-}
-
-int EVP_PKEY_CTX_get_dh_kdf_outlen(EVP_PKEY_CTX *ctx, int *plen)
-{
- int ret;
- size_t len = UINT_MAX;
- OSSL_PARAM params[2], *p = params;
-
- ret = dh_param_derive_check(ctx);
- if (ret != 1)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.kex.exchprovctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE,
- EVP_PKEY_CTRL_GET_DH_KDF_OUTLEN, 0,
- (void *)(plen));
- *p++ = OSSL_PARAM_construct_size_t(OSSL_EXCHANGE_PARAM_KDF_OUTLEN,
- &len);
- *p = OSSL_PARAM_construct_end();
-
- ret = evp_pkey_ctx_get_params_strict(ctx, params);
- if (ret == -2) {
- ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
- /* Uses the same return values as EVP_PKEY_CTX_ctrl */
- return -2;
- } else if (ret != 1) {
- return -1;
- }
-
- if (len > INT_MAX)
- return -1;
-
- *plen = (int)len;
-
- return 1;
-}
-
-int EVP_PKEY_CTX_set0_dh_kdf_ukm(EVP_PKEY_CTX *ctx, unsigned char *ukm, int len)
-{
- int ret;
- OSSL_PARAM params[2], *p = params;
-
- if (len <= 0)
- return -1;
-
- ret = dh_param_derive_check(ctx);
- if (ret != 1)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.kex.exchprovctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE,
- EVP_PKEY_CTRL_DH_KDF_UKM, len, (void *)(ukm));
-
- *p++ = OSSL_PARAM_construct_octet_string(OSSL_EXCHANGE_PARAM_KDF_UKM,
- /*
- * Cast away the const. This is read
- * only so should be safe
- */
- (void *)ukm,
- (size_t)len);
- *p = OSSL_PARAM_construct_end();
-
- ret = evp_pkey_ctx_set_params_strict(ctx, params);
- if (ret == -2) {
- ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
- /* Uses the same return values as EVP_PKEY_CTX_ctrl */
- return -2;
- }
- if (ret == 1)
- OPENSSL_free(ukm);
- return ret;
-}
-
-int EVP_PKEY_CTX_get0_dh_kdf_ukm(EVP_PKEY_CTX *ctx, unsigned char **pukm)
-{
- int ret;
- size_t ukmlen;
- OSSL_PARAM params[3], *p = params;
-
- ret = dh_param_derive_check(ctx);
- if (ret != 1)
- return ret;
-
- /* TODO(3.0): Remove this eventually when no more legacy */
- if (ctx->op.kex.exchprovctx == NULL)
- return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE,
- EVP_PKEY_CTRL_GET_DH_KDF_UKM, 0, (void *)(pukm));
-
- *p++ = OSSL_PARAM_construct_octet_ptr(OSSL_EXCHANGE_PARAM_KDF_UKM,
- (void **)pukm, 0);
- *p++ = OSSL_PARAM_construct_size_t(OSSL_EXCHANGE_PARAM_KDF_UKM_LEN,
- &ukmlen);
- *p = OSSL_PARAM_construct_end();
-
- ret = evp_pkey_ctx_get_params_strict(ctx, params);
- if (ret == -2) {
- ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED);
- /* Uses the same return values as EVP_PKEY_CTX_ctrl */
- return -2;
- } else if (ret != 1) {
- return -1;
- }
-
- if (ukmlen > INT_MAX)
- return -1;
-
- return (int)ukmlen;
-}
diff --git a/crypto/dh/dh_group_params.c b/crypto/dh/dh_group_params.c
index e03693f687..a752cf9a98 100644
--- a/crypto/dh/dh_group_params.c
+++ b/crypto/dh/dh_group_params.c
@@ -21,160 +21,43 @@
#include "dh_local.h"
#include <openssl/bn.h>
#include <openssl/objects.h>
-#include "crypto/bn_dh.h"
+#include "internal/nelem.h"
#include "crypto/dh.h"
#include "e_os.h" /* strcasecmp */
-#define FFDHE(sz) { \
- SN_ffdhe##sz, NID_ffdhe##sz, \
- sz, \
- &_bignum_ffdhe##sz##_p, &_bignum_ffdhe##sz##_q, &_bignum_const_2 \
-}
-
-#define MODP(sz) { \
- SN_modp_##sz, NID_modp_##sz, \
- sz, \
- &_bignum_modp_##sz##_p, &_bignum_modp_##sz##_q, &_bignum_const_2 \
-}
-
-#define RFC5114(name, uid, sz, tag) { \
- name, uid, \
- sz, \
- &_bignum_dh##tag##_p, &_bignum_dh##tag##_q, &_bignum_dh##tag##_g \
-}
-
-typedef struct dh_named_group_st {
- const char *name;
- int uid;
- int32_t nbits;
- const BIGNUM *p;
- const BIGNUM *q;
- const BIGNUM *g;
-} DH_NAMED_GROUP;
-
-
-static const DH_NAMED_GROUP dh_named_groups[] = {
- FFDHE(2048),
- FFDHE(3072),
- FFDHE(4096),
- FFDHE(6144),
- FFDHE(8192),
-#ifndef FIPS_MODULE
- MODP(1536),
-#endif
- MODP(2048),
- MODP(3072),
- MODP(4096),
- MODP(6144),
- MODP(8192),
- /*
- * Additional dh named groups from RFC 5114 that have a different g.
- * The uid can be any unique identifier.
- */
-#ifndef FIPS_MODULE
- RFC5114("dh_1024_160", 1, 1024, 1024_160),
- RFC5114("dh_2048_224", 2, 2048, 2048_224),
- RFC5114("dh_2048_256", 3, 2048, 2048_256),
-#endif
-};
-
-int ossl_ffc_named_group_to_uid(const char *name)
-{
- size_t i;
-
- for (i = 0; i < OSSL_NELEM(dh_named_groups); ++i) {
- if (strcasecmp(dh_named_groups[i].name, name) == 0)
- return dh_named_groups[i].uid;
- }
- return NID_undef;
-}
-
-const char *ossl_ffc_named_group_from_uid(int uid)
-{
- size_t i;
-
- for (i = 0; i < OSSL_NELEM(dh_named_groups); ++i) {
- if (dh_named_groups[i].uid == uid)
- return dh_named_groups[i].name;
- }
- return NULL;
-}
-
-static DH *dh_param_init(OSSL_LIB_CTX *libctx, int uid, const BIGNUM *p,
- const BIGNUM *q, const BIGNUM *g)
+static DH *dh_param_init(OSSL_LIB_CTX *libctx, const DH_NAMED_GROUP *group)
{
DH *dh = dh_new_ex(libctx);
if (dh == NULL)
return NULL;
- dh->params.nid = uid;
- dh->params.p = (BIGNUM *)p;
- dh->params.q = (BIGNUM *)q;
- dh->params.g = (BIGNUM *)g;
- dh->length = BN_num_bits(q);
+ ossl_ffc_named_group_set_pqg(&dh->params, group);
+ dh->params.nid = ossl_ffc_named_group_get_uid(group);
+ dh->length = BN_num_bits(dh->params.q);
dh->dirty_cnt++;
return dh;
}
-static DH *dh_new_by_group_name(OSSL_LIB_CTX *libctx, const char *name)
+DH *dh_new_by_nid_ex(OSSL_LIB_CTX *libctx, int nid)
{
- int i;
+ const DH_NAMED_GROUP *group;
- if (name == NULL)
- return NULL;
+ if ((group = ossl_ffc_uid_to_dh_named_group(nid)) != NULL)
+ return dh_param_init(libctx, group);
- for (i = 0; i < (int)OSSL_NELEM(dh_named_groups); ++i) {
- if (strcasecmp(dh_named_groups[i].name, name) == 0) {
- return dh_param_init(libctx, dh_named_groups[i].uid,
- dh_named_groups[i].p,
- dh_named_groups[i].q,
- dh_named_groups[i].g);
- }
- }
ERR_raise(ERR_LIB_DH, DH_R_INVALID_PARAMETER_NID);
return NULL;
}
-DH *dh_new_by_nid_ex(OSSL_LIB_CTX *libctx, int nid)
-{
- const char *name = ossl_ffc_named_group_from_uid(nid);
-
- return dh_new_by_group_name(libctx, name);
-}
-
DH *DH_new_by_nid(int nid)
{
return dh_new_by_nid_ex(NULL, nid);
}
-int ossl_ffc_set_group_pqg(FFC_PARAMS *ffc, const char *group_name)
-{
- int i;
- BIGNUM *q = NULL;
-
- if (ffc == NULL)
- return 0;
-
- for (i = 0; i < (int)OSSL_NELEM(dh_named_groups); ++i) {
- if (strcasecmp(dh_named_groups[i].name, group_name) == 0) {
- ossl_ffc_params_set0_pqg(ffc,
- (BIGNUM *)dh_named_groups[i].p,
- (BIGNUM *)dh_named_groups[i].q,
- (BIGNUM *)dh_named_groups[i].g);
- /* flush the cached nid, The DH layer is responsible for caching */
- ffc->nid = NID_undef;
- return 1;
- }
- }
- /* gets here on error or if the name was not found */
- BN_free(q);
- return 0;
-}
-
void dh_cache_named_group(DH *dh)
{
- int i;
+ const DH_NAMED_GROUP *group;
if (dh == NULL)
return;
@@ -186,22 +69,15 @@ void dh_cache_named_group(DH *dh)
|| dh->params.g == NULL)
return;
- for (i = 0; i < (int)OSSL_NELEM(dh_named_groups); ++i) {
- /* Keep searching until a matching p and g is found */
- if (BN_cmp(dh->params.p, dh_named_groups[i].p) == 0
- && BN_cmp(dh->params.g, dh_named_groups[i].g) == 0) {
- /* Verify q is correct if it exists */
- if (dh->params.q != NULL) {
- if (BN_cmp(dh->params.q, dh_named_groups[i].q) != 0)
- continue; /* ignore if q does not match */
- } else {
- dh->params.q = (BIGNUM *)dh_named_groups[i].q;
- }
- dh->params.nid = dh_named_groups[i].uid; /* cache the nid */
- dh->length = BN_num_bits(dh->params.q);
- dh->dirty_cnt++;
- break;
- }
+ if ((group = ossl_ffc_numbers_to_dh_named_group(dh->params.p,
+ dh->params.q,
+ dh->params.g)) != NULL) {
+ if (dh->params.q == NULL)
+ dh->params.q = (BIGNUM *)ossl_ffc_named_group_get_q(group);
+ /* cache the nid */
+ dh->params.nid = ossl_ffc_named_group_get_uid(group);
+ dh->length = BN_num_bits(dh->params.q);
+ dh->dirty_cnt++;
}
}