From 5afb2cca65f10b8d0baaff4989a102d24d629087 Mon Sep 17 00:00:00 2001 From: Luca Casonato Date: Mon, 13 Dec 2021 13:22:03 +0100 Subject: refactor(ext/crypto): clean up exportKey rust code (#13052) --- ext/crypto/shared.rs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'ext/crypto/shared.rs') diff --git a/ext/crypto/shared.rs b/ext/crypto/shared.rs index 696b1c087..1af0169ef 100644 --- a/ext/crypto/shared.rs +++ b/ext/crypto/shared.rs @@ -1,8 +1,12 @@ use std::borrow::Cow; use deno_core::error::custom_error; +use deno_core::error::type_error; use deno_core::error::AnyError; use deno_core::ZeroCopyBuf; +use rsa::pkcs1::FromRsaPrivateKey; +use rsa::pkcs1::ToRsaPublicKey; +use rsa::RsaPrivateKey; use serde::Deserialize; use serde::Serialize; @@ -61,6 +65,33 @@ pub enum RawKeyData { Public(ZeroCopyBuf), } +impl RawKeyData { + pub fn as_rsa_public_key(&self) -> Result, AnyError> { + match self { + RawKeyData::Public(data) => Ok(Cow::Borrowed(data)), + RawKeyData::Private(data) => { + let private_key = RsaPrivateKey::from_pkcs1_der(data) + .map_err(|_| type_error("expected valid private key"))?; + + let public_key_doc = private_key + .to_public_key() + .to_pkcs1_der() + .map_err(|_| type_error("expected valid public key"))?; + + Ok(Cow::Owned(public_key_doc.as_der().into())) + } + _ => Err(type_error("expected public key")), + } + } + + pub fn as_rsa_private_key(&self) -> Result<&[u8], AnyError> { + match self { + RawKeyData::Private(data) => Ok(data), + _ => Err(type_error("expected private key")), + } + } +} + pub fn data_error(msg: impl Into>) -> AnyError { custom_error("DOMExceptionDataError", msg) } -- cgit v1.2.3