summaryrefslogtreecommitdiff
path: root/ext/crypto/import_key.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ext/crypto/import_key.rs')
-rw-r--r--ext/crypto/import_key.rs40
1 files changed, 38 insertions, 2 deletions
diff --git a/ext/crypto/import_key.rs b/ext/crypto/import_key.rs
index 16a8d155f..c93e2a9bb 100644
--- a/ext/crypto/import_key.rs
+++ b/ext/crypto/import_key.rs
@@ -11,12 +11,12 @@ use crate::OaepPrivateKeyParameters;
use crate::PssPrivateKeyParameters;
#[derive(Deserialize)]
-#[serde(rename_all = "lowercase")]
+#[serde(rename_all = "camelCase")]
pub enum KeyData {
Spki(ZeroCopyBuf),
Pkcs8(ZeroCopyBuf),
Raw(ZeroCopyBuf),
- Jwk { k: String },
+ JwkSecret { k: String },
}
#[derive(Deserialize)]
@@ -32,6 +32,10 @@ pub enum ImportKeyOptions {
Ecdsa { named_curve: EcNamedCurve },
#[serde(rename = "ECDH", rename_all = "camelCase")]
Ecdh { named_curve: EcNamedCurve },
+ #[serde(rename = "AES", rename_all = "camelCase")]
+ Aes {},
+ #[serde(rename = "HMAC", rename_all = "camelCase")]
+ Hmac {},
}
#[derive(Serialize)]
@@ -45,6 +49,10 @@ pub enum ImportKeyResult {
},
#[serde(rename_all = "camelCase")]
Ec { raw_data: RawKeyData },
+ #[serde(rename_all = "camelCase")]
+ Aes { raw_data: RawKeyData },
+ #[serde(rename_all = "camelCase")]
+ Hmac { raw_data: RawKeyData },
}
pub fn op_crypto_import_key(
@@ -62,6 +70,8 @@ pub fn op_crypto_import_key(
| ImportKeyOptions::Ecdh { named_curve } => {
import_key_ec(key_data, named_curve)
}
+ ImportKeyOptions::Aes {} => import_key_aes(key_data),
+ ImportKeyOptions::Hmac {} => import_key_hmac(key_data),
}
}
@@ -576,3 +586,29 @@ fn import_key_ec(
_ => return Err(unsupported_format()),
})
}
+
+fn import_key_aes(key_data: KeyData) -> Result<ImportKeyResult, AnyError> {
+ Ok(match key_data {
+ KeyData::JwkSecret { k } => {
+ let data = base64::decode_config(k, base64::URL_SAFE)
+ .map_err(|_| data_error("invalid key data"))?;
+ ImportKeyResult::Hmac {
+ raw_data: RawKeyData::Secret(data.into()),
+ }
+ }
+ _ => return Err(unsupported_format()),
+ })
+}
+
+fn import_key_hmac(key_data: KeyData) -> Result<ImportKeyResult, AnyError> {
+ Ok(match key_data {
+ KeyData::JwkSecret { k } => {
+ let data = base64::decode_config(k, base64::URL_SAFE)
+ .map_err(|_| data_error("invalid key data"))?;
+ ImportKeyResult::Hmac {
+ raw_data: RawKeyData::Secret(data.into()),
+ }
+ }
+ _ => return Err(unsupported_format()),
+ })
+}