diff options
Diffstat (limited to 'ext/crypto/shared.rs')
-rw-r--r-- | ext/crypto/shared.rs | 31 |
1 files changed, 31 insertions, 0 deletions
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<Cow<'_, [u8]>, 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<Cow<'static, str>>) -> AnyError { custom_error("DOMExceptionDataError", msg) } |