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.rs79
1 files changed, 29 insertions, 50 deletions
diff --git a/ext/crypto/export_key.rs b/ext/crypto/export_key.rs
index 00ce7e11c..edf0d7239 100644
--- a/ext/crypto/export_key.rs
+++ b/ext/crypto/export_key.rs
@@ -4,8 +4,6 @@ use base64::prelude::BASE64_URL_SAFE_NO_PAD;
use base64::Engine;
use const_oid::AssociatedOid;
use const_oid::ObjectIdentifier;
-use deno_core::error::custom_error;
-use deno_core::error::AnyError;
use deno_core::op2;
use deno_core::ToJsBuffer;
use elliptic_curve::sec1::ToEncodedPoint;
@@ -22,6 +20,16 @@ use spki::AlgorithmIdentifierOwned;
use crate::shared::*;
+#[derive(Debug, thiserror::Error)]
+pub enum ExportKeyError {
+ #[error(transparent)]
+ General(#[from] SharedError),
+ #[error(transparent)]
+ Der(#[from] spki::der::Error),
+ #[error("Unsupported named curve")]
+ UnsupportedNamedCurve,
+}
+
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExportKeyOptions {
@@ -99,7 +107,7 @@ pub enum ExportKeyResult {
pub fn op_crypto_export_key(
#[serde] opts: ExportKeyOptions,
#[serde] key_data: V8RawKeyData,
-) -> Result<ExportKeyResult, AnyError> {
+) -> Result<ExportKeyResult, ExportKeyError> {
match opts.algorithm {
ExportKeyAlgorithm::RsassaPkcs1v15 {}
| ExportKeyAlgorithm::RsaPss {}
@@ -125,7 +133,7 @@ fn bytes_to_b64(bytes: &[u8]) -> String {
fn export_key_rsa(
format: ExportKeyFormat,
key_data: V8RawKeyData,
-) -> Result<ExportKeyResult, deno_core::anyhow::Error> {
+) -> Result<ExportKeyResult, ExportKeyError> {
match format {
ExportKeyFormat::Spki => {
let subject_public_key = &key_data.as_rsa_public_key()?;
@@ -181,12 +189,7 @@ fn export_key_rsa(
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",
- )
- })?;
+ .map_err(|_| SharedError::FailedDecodePublicKey)?;
Ok(ExportKeyResult::JwkPublicRsa {
n: uint_to_b64(public_key.modulus),
@@ -196,12 +199,7 @@ fn export_key_rsa(
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",
- )
- })?;
+ .map_err(|_| SharedError::FailedDecodePrivateKey)?;
Ok(ExportKeyResult::JwkPrivateRsa {
n: uint_to_b64(private_key.modulus),
@@ -214,14 +212,14 @@ fn export_key_rsa(
qi: uint_to_b64(private_key.coefficient),
})
}
- _ => Err(unsupported_format()),
+ _ => Err(SharedError::UnsupportedFormat.into()),
}
}
fn export_key_symmetric(
format: ExportKeyFormat,
key_data: V8RawKeyData,
-) -> Result<ExportKeyResult, deno_core::anyhow::Error> {
+) -> Result<ExportKeyResult, ExportKeyError> {
match format {
ExportKeyFormat::JwkSecret => {
let bytes = key_data.as_secret_key()?;
@@ -230,7 +228,7 @@ fn export_key_symmetric(
k: bytes_to_b64(bytes),
})
}
- _ => Err(unsupported_format()),
+ _ => Err(SharedError::UnsupportedFormat.into()),
}
}
@@ -239,7 +237,7 @@ fn export_key_ec(
key_data: V8RawKeyData,
algorithm: ExportKeyAlgorithm,
named_curve: EcNamedCurve,
-) -> Result<ExportKeyResult, deno_core::anyhow::Error> {
+) -> Result<ExportKeyResult, ExportKeyError> {
match format {
ExportKeyFormat::Raw => {
let subject_public_key = match named_curve {
@@ -332,10 +330,7 @@ fn export_key_ec(
y: bytes_to_b64(y),
})
} else {
- Err(custom_error(
- "DOMExceptionOperationError",
- "failed to decode public key",
- ))
+ Err(SharedError::FailedDecodePublicKey.into())
}
}
EcNamedCurve::P384 => {
@@ -350,10 +345,7 @@ fn export_key_ec(
y: bytes_to_b64(y),
})
} else {
- Err(custom_error(
- "DOMExceptionOperationError",
- "failed to decode public key",
- ))
+ Err(SharedError::FailedDecodePublicKey.into())
}
}
EcNamedCurve::P521 => {
@@ -368,10 +360,7 @@ fn export_key_ec(
y: bytes_to_b64(y),
})
} else {
- Err(custom_error(
- "DOMExceptionOperationError",
- "failed to decode public key",
- ))
+ Err(SharedError::FailedDecodePublicKey.into())
}
}
},
@@ -380,13 +369,8 @@ fn export_key_ec(
match named_curve {
EcNamedCurve::P256 => {
- let ec_key =
- p256::SecretKey::from_pkcs8_der(private_key).map_err(|_| {
- custom_error(
- "DOMExceptionOperationError",
- "failed to decode private key",
- )
- })?;
+ let ec_key = p256::SecretKey::from_pkcs8_der(private_key)
+ .map_err(|_| SharedError::FailedDecodePrivateKey)?;
let point = ec_key.public_key().to_encoded_point(false);
if let elliptic_curve::sec1::Coordinates::Uncompressed { x, y } =
@@ -398,18 +382,13 @@ fn export_key_ec(
d: bytes_to_b64(&ec_key.to_bytes()),
})
} else {
- Err(data_error("expected valid public EC key"))
+ Err(SharedError::ExpectedValidPublicECKey.into())
}
}
EcNamedCurve::P384 => {
- let ec_key =
- p384::SecretKey::from_pkcs8_der(private_key).map_err(|_| {
- custom_error(
- "DOMExceptionOperationError",
- "failed to decode private key",
- )
- })?;
+ let ec_key = p384::SecretKey::from_pkcs8_der(private_key)
+ .map_err(|_| SharedError::FailedDecodePrivateKey)?;
let point = ec_key.public_key().to_encoded_point(false);
if let elliptic_curve::sec1::Coordinates::Uncompressed { x, y } =
@@ -421,12 +400,12 @@ fn export_key_ec(
d: bytes_to_b64(&ec_key.to_bytes()),
})
} else {
- Err(data_error("expected valid public EC key"))
+ Err(SharedError::ExpectedValidPublicECKey.into())
}
}
- _ => Err(not_supported_error("Unsupported namedCurve")),
+ _ => Err(ExportKeyError::UnsupportedNamedCurve),
}
}
- ExportKeyFormat::JwkSecret => Err(unsupported_format()),
+ ExportKeyFormat::JwkSecret => Err(SharedError::UnsupportedFormat.into()),
}
}