From becdad531f2b56684133b3b7ea25169c7102f765 Mon Sep 17 00:00:00 2001 From: Satya Rohith Date: Mon, 18 Mar 2024 13:20:10 +0530 Subject: fix(ext/node): support public key point encoding in ECDH.generateKeys() (#22976) Towards https://github.com/denoland/deno/issues/22921 Co-authored-by: Divy Srivastava --- ext/node/ops/crypto/mod.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'ext/node/ops') diff --git a/ext/node/ops/crypto/mod.rs b/ext/node/ops/crypto/mod.rs index 6b1ca9a38..cf44f48f7 100644 --- a/ext/node/ops/crypto/mod.rs +++ b/ext/node/ops/crypto/mod.rs @@ -10,6 +10,7 @@ use deno_core::OpState; use deno_core::ResourceId; use deno_core::StringOrBuffer; use deno_core::ToJsBuffer; +use elliptic_curve::sec1::ToEncodedPoint; use hkdf::Hkdf; use num_bigint::BigInt; use num_bigint_dig::BigUint; @@ -739,8 +740,6 @@ pub async fn op_node_dsa_generate_async( fn ec_generate( named_curve: &str, ) -> Result<(ToJsBuffer, ToJsBuffer), AnyError> { - use elliptic_curve::sec1::ToEncodedPoint; - let mut rng = rand::thread_rng(); // TODO(@littledivy): Support public key point encoding. // Default is uncompressed. @@ -1054,14 +1053,16 @@ pub fn op_node_ecdh_generate_keys( #[string] curve: &str, #[buffer] pubbuf: &mut [u8], #[buffer] privbuf: &mut [u8], + #[string] format: &str, ) -> Result { let mut rng = rand::thread_rng(); + let compress = format == "compressed"; match curve { "secp256k1" => { let privkey = elliptic_curve::SecretKey::::random(&mut rng); let pubkey = privkey.public_key(); - pubbuf.copy_from_slice(pubkey.to_sec1_bytes().as_ref()); + pubbuf.copy_from_slice(pubkey.to_encoded_point(compress).as_ref()); privbuf.copy_from_slice(privkey.to_nonzero_scalar().to_bytes().as_ref()); Ok(0) @@ -1069,21 +1070,21 @@ pub fn op_node_ecdh_generate_keys( "prime256v1" | "secp256r1" => { let privkey = elliptic_curve::SecretKey::::random(&mut rng); let pubkey = privkey.public_key(); - pubbuf.copy_from_slice(pubkey.to_sec1_bytes().as_ref()); + pubbuf.copy_from_slice(pubkey.to_encoded_point(compress).as_ref()); privbuf.copy_from_slice(privkey.to_nonzero_scalar().to_bytes().as_ref()); Ok(0) } "secp384r1" => { let privkey = elliptic_curve::SecretKey::::random(&mut rng); let pubkey = privkey.public_key(); - pubbuf.copy_from_slice(pubkey.to_sec1_bytes().as_ref()); + pubbuf.copy_from_slice(pubkey.to_encoded_point(compress).as_ref()); privbuf.copy_from_slice(privkey.to_nonzero_scalar().to_bytes().as_ref()); Ok(0) } "secp224r1" => { let privkey = elliptic_curve::SecretKey::::random(&mut rng); let pubkey = privkey.public_key(); - pubbuf.copy_from_slice(pubkey.to_sec1_bytes().as_ref()); + pubbuf.copy_from_slice(pubkey.to_encoded_point(compress).as_ref()); privbuf.copy_from_slice(privkey.to_nonzero_scalar().to_bytes().as_ref()); Ok(0) } -- cgit v1.2.3