From 1f60b8af97b15cb8e33f68c44f602cf69d79bd7a Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Thu, 21 Mar 2024 14:11:54 +0530 Subject: fix(ext/node): ECDH.publicKey() point encoding (#23013) --- ext/node/ops/crypto/mod.rs | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) (limited to 'ext/node/ops') diff --git a/ext/node/ops/crypto/mod.rs b/ext/node/ops/crypto/mod.rs index 7ea96c031..ed1b7fc75 100644 --- a/ext/node/ops/crypto/mod.rs +++ b/ext/node/ops/crypto/mod.rs @@ -1047,6 +1047,75 @@ pub async fn op_node_scrypt_async( .await? } +#[op2] +#[buffer] +pub fn op_node_ecdh_encode_pubkey( + #[string] curve: &str, + #[buffer] pubkey: &[u8], + compress: bool, +) -> Result, AnyError> { + use elliptic_curve::sec1::FromEncodedPoint; + + match curve { + "secp256k1" => { + let pubkey = + elliptic_curve::PublicKey::::from_encoded_point( + &elliptic_curve::sec1::EncodedPoint::::from_bytes( + pubkey, + )?, + ); + // CtOption does not expose its variants. + if pubkey.is_none().into() { + return Err(type_error("Invalid public key")); + } + + let pubkey = pubkey.unwrap(); + + Ok(pubkey.to_encoded_point(compress).as_ref().to_vec()) + } + "prime256v1" | "secp256r1" => { + let pubkey = elliptic_curve::PublicKey::::from_encoded_point( + &elliptic_curve::sec1::EncodedPoint::::from_bytes(pubkey)?, + ); + // CtOption does not expose its variants. + if pubkey.is_none().into() { + return Err(type_error("Invalid public key")); + } + + let pubkey = pubkey.unwrap(); + + Ok(pubkey.to_encoded_point(compress).as_ref().to_vec()) + } + "secp384r1" => { + let pubkey = elliptic_curve::PublicKey::::from_encoded_point( + &elliptic_curve::sec1::EncodedPoint::::from_bytes(pubkey)?, + ); + // CtOption does not expose its variants. + if pubkey.is_none().into() { + return Err(type_error("Invalid public key")); + } + + let pubkey = pubkey.unwrap(); + + Ok(pubkey.to_encoded_point(compress).as_ref().to_vec()) + } + "secp224r1" => { + let pubkey = elliptic_curve::PublicKey::::from_encoded_point( + &elliptic_curve::sec1::EncodedPoint::::from_bytes(pubkey)?, + ); + // CtOption does not expose its variants. + if pubkey.is_none().into() { + return Err(type_error("Invalid public key")); + } + + let pubkey = pubkey.unwrap(); + + Ok(pubkey.to_encoded_point(compress).as_ref().to_vec()) + } + &_ => Err(type_error("Unsupported curve")), + } +} + #[op2(fast)] pub fn op_node_ecdh_generate_keys( #[string] curve: &str, -- cgit v1.2.3