summaryrefslogtreecommitdiff
path: root/ext/node/ops
diff options
context:
space:
mode:
authorLevente Kurusa <lkurusa@kernelstuff.org>2023-05-15 19:41:53 +0200
committerGitHub <noreply@github.com>2023-05-15 19:41:53 +0200
commit3356173d00486ffda99f3907de97489ac79c70dd (patch)
treea5a027bb846011ecd055386dda66a6c69979d920 /ext/node/ops
parentbfe93c6e814b5ba27e9bd356359910ff3c3f49bd (diff)
feat(node/crypto): Diffie Hellman Support (#18943)
Support crypto.DiffieHellman class in ext/node/crypto
Diffstat (limited to 'ext/node/ops')
-rw-r--r--ext/node/ops/crypto/dh.rs2
-rw-r--r--ext/node/ops/crypto/mod.rs25
2 files changed, 26 insertions, 1 deletions
diff --git a/ext/node/ops/crypto/dh.rs b/ext/node/ops/crypto/dh.rs
index 4da9a01bf..8b756d9a2 100644
--- a/ext/node/ops/crypto/dh.rs
+++ b/ext/node/ops/crypto/dh.rs
@@ -63,7 +63,7 @@ impl DiffieHellman {
}
pub fn new(prime: Prime, generator: usize) -> Self {
- let private_key = PrivateKey::new(32);
+ let private_key = PrivateKey::new(prime.bits());
let generator = BigUint::from_usize(generator).unwrap();
let public_key = private_key.compute_public_key(&generator, &prime);
diff --git a/ext/node/ops/crypto/mod.rs b/ext/node/ops/crypto/mod.rs
index 0f8feb2a9..05f2d34f7 100644
--- a/ext/node/ops/crypto/mod.rs
+++ b/ext/node/ops/crypto/mod.rs
@@ -11,6 +11,7 @@ use deno_core::StringOrBuffer;
use deno_core::ZeroCopyBuf;
use hkdf::Hkdf;
use num_bigint::BigInt;
+use num_bigint_dig::BigUint;
use num_traits::FromPrimitive;
use rand::distributions::Distribution;
use rand::distributions::Uniform;
@@ -788,6 +789,30 @@ pub fn op_node_dh_generate(
dh_generate(prime, prime_len, generator)
}
+// TODO(lev): This duplication should be avoided.
+#[op]
+pub fn op_node_dh_generate2(
+ prime: ZeroCopyBuf,
+ prime_len: usize,
+ generator: usize,
+) -> Result<(ZeroCopyBuf, ZeroCopyBuf), AnyError> {
+ dh_generate(Some(prime).as_deref(), prime_len, generator)
+}
+
+#[op]
+pub fn op_node_dh_compute_secret(
+ prime: ZeroCopyBuf,
+ private_key: ZeroCopyBuf,
+ their_public_key: ZeroCopyBuf,
+) -> Result<ZeroCopyBuf, AnyError> {
+ let pubkey: BigUint = BigUint::from_bytes_be(their_public_key.as_ref());
+ let privkey: BigUint = BigUint::from_bytes_be(private_key.as_ref());
+ let primei: BigUint = BigUint::from_bytes_be(prime.as_ref());
+ let shared_secret: BigUint = pubkey.modpow(&privkey, &primei);
+
+ Ok(shared_secret.to_bytes_be().into())
+}
+
#[op]
pub async fn op_node_dh_generate_async(
prime: Option<ZeroCopyBuf>,