summaryrefslogtreecommitdiff
path: root/ext/crypto/export_key.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ext/crypto/export_key.rs')
-rw-r--r--ext/crypto/export_key.rs61
1 files changed, 59 insertions, 2 deletions
diff --git a/ext/crypto/export_key.rs b/ext/crypto/export_key.rs
index 22a4b55ca..2e74d61f2 100644
--- a/ext/crypto/export_key.rs
+++ b/ext/crypto/export_key.rs
@@ -1,9 +1,12 @@
+use deno_core::error::custom_error;
use deno_core::error::AnyError;
use deno_core::OpState;
use deno_core::ZeroCopyBuf;
+use rsa::pkcs1::UIntBytes;
use serde::Deserialize;
use serde::Serialize;
use spki::der::asn1;
+use spki::der::Decodable;
use spki::der::Encodable;
use crate::shared::*;
@@ -21,7 +24,8 @@ pub struct ExportKeyOptions {
pub enum ExportKeyFormat {
Pkcs8,
Spki,
- Jwk,
+ JwkPublic,
+ JwkPrivate,
}
#[derive(Deserialize)]
@@ -40,6 +44,20 @@ pub enum ExportKeyAlgorithm {
pub enum ExportKeyResult {
Pkcs8(ZeroCopyBuf),
Spki(ZeroCopyBuf),
+ JwkPublicRsa {
+ n: String,
+ e: String,
+ },
+ JwkPrivateRsa {
+ n: String,
+ e: String,
+ d: String,
+ p: String,
+ q: String,
+ dp: String,
+ dq: String,
+ qi: String,
+ },
}
pub fn op_crypto_export_key(
@@ -54,6 +72,10 @@ pub fn op_crypto_export_key(
}
}
+fn uint_to_b64(bytes: UIntBytes) -> String {
+ base64::encode_config(bytes.as_bytes(), base64::URL_SAFE_NO_PAD)
+}
+
fn export_key_rsa(
format: ExportKeyFormat,
key_data: RawKeyData,
@@ -108,6 +130,41 @@ fn export_key_rsa(
Ok(ExportKeyResult::Pkcs8(pkcs8_der.into()))
}
- _ => Err(unsupported_format()),
+ ExportKeyFormat::JwkPublic => {
+ let public_key = key_data.as_rsa_public_key()?;
+ let public_key = rsa::pkcs1::RsaPublicKey::from_der(&public_key)
+ .map_err(|_| {
+ custom_error(
+ "DOMExceptionOperationError",
+ "failed to decode public key",
+ )
+ })?;
+
+ Ok(ExportKeyResult::JwkPublicRsa {
+ n: uint_to_b64(public_key.modulus),
+ e: uint_to_b64(public_key.public_exponent),
+ })
+ }
+ ExportKeyFormat::JwkPrivate => {
+ let private_key = key_data.as_rsa_private_key()?;
+ let private_key = rsa::pkcs1::RsaPrivateKey::from_der(private_key)
+ .map_err(|_| {
+ custom_error(
+ "DOMExceptionOperationError",
+ "failed to decode private key",
+ )
+ })?;
+
+ Ok(ExportKeyResult::JwkPrivateRsa {
+ n: uint_to_b64(private_key.modulus),
+ e: uint_to_b64(private_key.public_exponent),
+ d: uint_to_b64(private_key.private_exponent),
+ p: uint_to_b64(private_key.prime1),
+ q: uint_to_b64(private_key.prime2),
+ dp: uint_to_b64(private_key.exponent1),
+ dq: uint_to_b64(private_key.exponent2),
+ qi: uint_to_b64(private_key.coefficient),
+ })
+ }
}
}