Skip to content

Commit ef1ace7

Browse files
RaisinTentargos
authored andcommitted
src,crypto: use std::variant in DH params
Signed-off-by: Darshan Sen <[email protected]> PR-URL: #40457 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Richard Lau <[email protected]> Reviewed-By: Tobias Nießen <[email protected]>
1 parent cdf5c44 commit ef1ace7

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;
@@ -459,7 +461,7 @@ Maybe<bool> DhKeyGenTraits::AdditionalConfig(
459461
return Nothing<bool>();
460462
}
461463

462-
params->params.prime_fixed_value = BignumPointer(
464+
params->params.prime = BignumPointer(
463465
BN_bin2bn(reinterpret_cast<const unsigned char*>(group->prime),
464466
group->prime_size, nullptr));
465467
params->params.generator = group->gen;
@@ -471,14 +473,14 @@ Maybe<bool> DhKeyGenTraits::AdditionalConfig(
471473
THROW_ERR_OUT_OF_RANGE(env, "Invalid prime size");
472474
return Nothing<bool>();
473475
}
474-
params->params.prime_size = size;
476+
params->params.prime = size;
475477
} else {
476478
ArrayBufferOrViewContents<unsigned char> input(args[*offset]);
477479
if (UNLIKELY(!input.CheckSizeInt32())) {
478480
THROW_ERR_OUT_OF_RANGE(env, "prime is too big");
479481
return Nothing<bool>();
480482
}
481-
params->params.prime_fixed_value = BignumPointer(
483+
params->params.prime = BignumPointer(
482484
BN_bin2bn(input.data(), input.size(), nullptr));
483485
}
484486

@@ -492,31 +494,33 @@ Maybe<bool> DhKeyGenTraits::AdditionalConfig(
492494

493495
EVPKeyCtxPointer DhKeyGenTraits::Setup(DhKeyPairGenConfig* params) {
494496
EVPKeyPointer key_params;
495-
if (params->params.prime_fixed_value) {
497+
if (BignumPointer* prime_fixed_value =
498+
std::get_if<BignumPointer>(&params->params.prime)) {
496499
DHPointer dh(DH_new());
497500
if (!dh)
498501
return EVPKeyCtxPointer();
499502

500-
BIGNUM* prime = params->params.prime_fixed_value.get();
503+
BIGNUM* prime = prime_fixed_value->get();
501504
BignumPointer bn_g(BN_new());
502505
if (!BN_set_word(bn_g.get(), params->params.generator) ||
503-
!DH_set0_pqg(dh.get(), prime, nullptr, bn_g.get()))
506+
!DH_set0_pqg(dh.get(), prime, nullptr, bn_g.get())) {
504507
return EVPKeyCtxPointer();
508+
}
505509

506-
params->params.prime_fixed_value.release();
510+
prime_fixed_value->release();
507511
bn_g.release();
508512

509513
key_params = EVPKeyPointer(EVP_PKEY_new());
510514
CHECK(key_params);
511-
EVP_PKEY_assign_DH(key_params.get(), dh.release());
512-
} else {
515+
CHECK_EQ(EVP_PKEY_assign_DH(key_params.get(), dh.release()), 1);
516+
} else if (int* prime_size = std::get_if<int>(&params->params.prime)) {
513517
EVPKeyCtxPointer param_ctx(EVP_PKEY_CTX_new_id(EVP_PKEY_DH, nullptr));
514518
EVP_PKEY* raw_params = nullptr;
515519
if (!param_ctx ||
516520
EVP_PKEY_paramgen_init(param_ctx.get()) <= 0 ||
517521
EVP_PKEY_CTX_set_dh_paramgen_prime_len(
518522
param_ctx.get(),
519-
params->params.prime_size) <= 0 ||
523+
*prime_size) <= 0 ||
520524
EVP_PKEY_CTX_set_dh_paramgen_generator(
521525
param_ctx.get(),
522526
params->params.generator) <= 0 ||
@@ -525,6 +529,8 @@ EVPKeyCtxPointer DhKeyGenTraits::Setup(DhKeyPairGenConfig* params) {
525529
}
526530

527531
key_params = EVPKeyPointer(raw_params);
532+
} else {
533+
UNREACHABLE();
528534
}
529535

530536
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 {
@@ -59,12 +59,10 @@ class DiffieHellman : public BaseObject {
5959
};
6060

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

0 commit comments

Comments
 (0)