summaryrefslogtreecommitdiff
path: root/ext/crypto/shared.rs
diff options
context:
space:
mode:
authorLuca Casonato <hello@lcas.dev>2021-12-13 13:22:03 +0100
committerGitHub <noreply@github.com>2021-12-13 13:22:03 +0100
commit5afb2cca65f10b8d0baaff4989a102d24d629087 (patch)
treeb390f1e3dccdff3bc9b58fd79473ba967ee62783 /ext/crypto/shared.rs
parentcd03de3c7b8a99aeee3953e69392c26d3667c41d (diff)
refactor(ext/crypto): clean up exportKey rust code (#13052)
Diffstat (limited to 'ext/crypto/shared.rs')
-rw-r--r--ext/crypto/shared.rs31
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)
}