Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 29a2559

Browse files
committedOct 14, 2021
src,crypto: use std::variant in DH params
Signed-off-by: Darshan Sen <[email protected]>
1 parent b80b85e commit 29a2559

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed
 

‎src/crypto/crypto_dh.cc

+16-10
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#include "threadpoolwork-inl.h"
1010
#include "v8.h"
1111

12+
#include <variant>
13+
1214
namespace node {
1315

1416
using v8::ArrayBuffer;
@@ -437,7 +439,7 @@ Maybe<bool> DhKeyGenTraits::AdditionalConfig(
437439
return Nothing<bool>();
438440
}
439441

440-
params->params.prime_fixed_value = BignumPointer(
442+
params->params.prime = BignumPointer(
441443
BN_bin2bn(reinterpret_cast<const unsigned char*>(group->prime),
442444
group->prime_size, nullptr));
443445
params->params.generator = group->gen;
@@ -449,14 +451,14 @@ Maybe<bool> DhKeyGenTraits::AdditionalConfig(
449451
THROW_ERR_OUT_OF_RANGE(env, "Invalid prime size");
450452
return Nothing<bool>();
451453
}
452-
params->params.prime_size = size;
454+
params->params.prime = size;
453455
} else {
454456
ArrayBufferOrViewContents<unsigned char> input(args[*offset]);
455457
if (UNLIKELY(!input.CheckSizeInt32())) {
456458
THROW_ERR_OUT_OF_RANGE(env, "prime is too big");
457459
return Nothing<bool>();
458460
}
459-
params->params.prime_fixed_value = BignumPointer(
461+
params->params.prime = BignumPointer(
460462
BN_bin2bn(input.data(), input.size(), nullptr));
461463
}
462464

@@ -470,31 +472,33 @@ Maybe<bool> DhKeyGenTraits::AdditionalConfig(
470472

471473
EVPKeyCtxPointer DhKeyGenTraits::Setup(DhKeyPairGenConfig* params) {
472474
EVPKeyPointer key_params;
473-
if (params->params.prime_fixed_value) {
475+
if (BignumPointer* prime_fixed_value =
476+
std::get_if<BignumPointer>(&params->params.prime)) {
474477
DHPointer dh(DH_new());
475478
if (!dh)
476479
return EVPKeyCtxPointer();
477480

478-
BIGNUM* prime = params->params.prime_fixed_value.get();
481+
BIGNUM* prime = prime_fixed_value->get();
479482
BignumPointer bn_g(BN_new());
480483
if (!BN_set_word(bn_g.get(), params->params.generator) ||
481-
!DH_set0_pqg(dh.get(), prime, nullptr, bn_g.get()))
484+
!DH_set0_pqg(dh.get(), prime, nullptr, bn_g.get())) {
482485
return EVPKeyCtxPointer();
486+
}
483487

484-
params->params.prime_fixed_value.release();
488+
prime_fixed_value->release();
485489
bn_g.release();
486490

487491
key_params = EVPKeyPointer(EVP_PKEY_new());
488492
CHECK(key_params);
489-
EVP_PKEY_assign_DH(key_params.get(), dh.release());
490-
} else {
493+
CHECK_EQ(EVP_PKEY_assign_DH(key_params.get(), dh.release()), 1);
494+
} else if (int* prime_size = std::get_if<int>(&params->params.prime)) {
491495
EVPKeyCtxPointer param_ctx(EVP_PKEY_CTX_new_id(EVP_PKEY_DH, nullptr));
492496
EVP_PKEY* raw_params = nullptr;
493497
if (!param_ctx ||
494498
EVP_PKEY_paramgen_init(param_ctx.get()) <= 0 ||
495499
EVP_PKEY_CTX_set_dh_paramgen_prime_len(
496500
param_ctx.get(),
497-
params->params.prime_size) <= 0 ||
501+
*prime_size) <= 0 ||
498502
EVP_PKEY_CTX_set_dh_paramgen_generator(
499503
param_ctx.get(),
500504
params->params.generator) <= 0 ||
@@ -503,6 +507,8 @@ EVPKeyCtxPointer DhKeyGenTraits::Setup(DhKeyPairGenConfig* params) {
503507
}
504508

505509
key_params = EVPKeyPointer(raw_params);
510+
} else {
511+
UNREACHABLE();
506512
}
507513

508514
EVPKeyCtxPointer ctx(EVP_PKEY_CTX_new(key_params.get(), nullptr));

‎src/crypto/crypto_dh.h

+2-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include "memory_tracker.h"
1111
#include "v8.h"
1212

13-
#include <vector>
13+
#include <variant>
1414

1515
namespace node {
1616
namespace crypto {
@@ -58,12 +58,10 @@ class DiffieHellman : public BaseObject {
5858
};
5959

6060
struct DhKeyPairParams final : public MemoryRetainer {
61-
// TODO(tniessen): Use std::variant instead.
6261
// Diffie-Hellman can either generate keys using a fixed prime, or by first
6362
// generating a random prime of a given size (in bits). Only one of both
6463
// options may be specified.
65-
BignumPointer prime_fixed_value;
66-
unsigned int prime_size;
64+
std::variant<BignumPointer, int> prime;
6765
unsigned int generator;
6866
SET_NO_MEMORY_INFO()
6967
SET_MEMORY_INFO_NAME(DhKeyPairParams)

0 commit comments

Comments
 (0)
Please sign in to comment.