From 9c348a0acd7d1bc288c2ce5b66016571b9603288 Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Thu, 14 Mar 2024 06:39:46 -0700 Subject: fix(ext/node): support `spki` format in createPublicKey (#22918) --- ext/node/ops/crypto/mod.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'ext/node/ops/crypto') diff --git a/ext/node/ops/crypto/mod.rs b/ext/node/ops/crypto/mod.rs index e597a9109..7f593520b 100644 --- a/ext/node/ops/crypto/mod.rs +++ b/ext/node/ops/crypto/mod.rs @@ -1480,14 +1480,11 @@ fn parse_public_key( } Ok(doc) } - "der" => { - match type_ { - "pkcs1" => pkcs8::Document::from_pkcs1_der(key) - .map_err(|_| type_error("Invalid PKCS1 public key")), - // TODO(@iuioiua): spki type - _ => Err(type_error(format!("Unsupported key type: {}", type_))), - } - } + "der" => match type_ { + "pkcs1" => pkcs8::Document::from_pkcs1_der(key) + .map_err(|_| type_error("Invalid PKCS1 public key")), + _ => Err(type_error(format!("Unsupported key type: {}", type_))), + }, _ => Err(type_error(format!("Unsupported key format: {}", format))), } } @@ -1499,8 +1496,14 @@ pub fn op_node_create_public_key( #[string] format: &str, #[string] type_: &str, ) -> Result { - let doc = parse_public_key(key, format, type_)?; - let pk_info = spki::SubjectPublicKeyInfoRef::try_from(doc.as_bytes())?; + let mut doc = None; + + let pk_info = if type_ != "spki" { + doc.replace(parse_public_key(key, format, type_)?); + spki::SubjectPublicKeyInfoRef::try_from(doc.as_ref().unwrap().as_bytes())? + } else { + spki::SubjectPublicKeyInfoRef::try_from(key)? + }; let alg = pk_info.algorithm.oid; -- cgit v1.2.3