diff options
author | Luca Casonato <hello@lcas.dev> | 2021-12-13 13:22:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-13 13:22:03 +0100 |
commit | 5afb2cca65f10b8d0baaff4989a102d24d629087 (patch) | |
tree | b390f1e3dccdff3bc9b58fd79473ba967ee62783 /ext/crypto/shared.rs | |
parent | cd03de3c7b8a99aeee3953e69392c26d3667c41d (diff) |
refactor(ext/crypto): clean up exportKey rust code (#13052)
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) } |