diff options
author | Luca Casonato <hello@lcas.dev> | 2021-12-10 22:23:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-10 22:23:19 +0100 |
commit | cbfc8dd59d79fa6e8c5a59ca97508ea4285ff155 (patch) | |
tree | 586ff050dc320de8cdb68d38e58a481d505c2bcc /ext/crypto/import_key.rs | |
parent | 2bdb528eb89bae468b802a65338001ac95f8f563 (diff) |
refactor(ext/crypto): symmetric jwk decode in rust (#13047)
Diffstat (limited to 'ext/crypto/import_key.rs')
-rw-r--r-- | ext/crypto/import_key.rs | 40 |
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()), + }) +} |