diff --git a/src/aead.rs b/src/aead.rs index 4c22888f16e..c50b564eedb 100644 --- a/src/aead.rs +++ b/src/aead.rs @@ -1,8 +1,10 @@ +use crate::IdLookupError; +use num_enum::TryFromPrimitive; +use std::str::FromStr; + #[cfg(target_arch = "wasm32")] use wasm_bindgen::prelude::*; -use num_enum::TryFromPrimitive; - /** Aead represents an authenticated encryption with additional data encryption function, as per [RFC9180§7.3](https://www.rfc-editor.org/rfc/rfc9180.html#section-7.3) @@ -29,6 +31,22 @@ pub enum Aead { ChaCha20Poly1305 = 3, } +impl FromStr for Aead { + type Err = IdLookupError; + + fn from_str(s: &str) -> Result { + match &*s.to_lowercase().replace('-', "") { + #[cfg(feature = "aead-aes-gcm-128")] + "aesgcm128" | "aes128gcm" => Ok(Self::AesGcm128), + #[cfg(feature = "aead-aes-gcm-256")] + "aesgcm256" | "aes256gcm" => Ok(Self::AesGcm256), + #[cfg(feature = "aead-chacha-20-poly-1305")] + "chacha20poly1305" => Ok(Self::ChaCha20Poly1305), + _ => Err(IdLookupError("aead not recognized")), + } + } +} + /// An iterable slice of [`Aead`] variants pub const AEAD_ALL: &[Aead] = &[ #[cfg(feature = "aead-aes-gcm-128")] diff --git a/src/kdf.rs b/src/kdf.rs index 890c3d99bbe..32102683f31 100644 --- a/src/kdf.rs +++ b/src/kdf.rs @@ -1,8 +1,10 @@ +use crate::IdLookupError; +use num_enum::TryFromPrimitive; +use std::str::FromStr; + #[cfg(target_arch = "wasm32")] use wasm_bindgen::prelude::*; -use num_enum::TryFromPrimitive; - /** Kdf represents an key derivation function, as per [RFC9180§7.2](https://www.rfc-editor.org/rfc/rfc9180.html#section-7.2) @@ -29,6 +31,22 @@ pub enum Kdf { Sha512 = 3, } +impl FromStr for Kdf { + type Err = IdLookupError; + + fn from_str(s: &str) -> Result { + match &*s.to_lowercase().replace('-', "") { + #[cfg(feature = "kdf-sha256")] + "hkdfsha256" | "sha256" => Ok(Self::Sha256), + #[cfg(feature = "kdf-sha384")] + "hkdfsha384" | "sha384" => Ok(Self::Sha384), + #[cfg(feature = "kdf-sha512")] + "hkdfsha512" | "sha512" => Ok(Self::Sha512), + _ => Err(IdLookupError("kdf not recognized")), + } + } +} + /// An iterable slice of [`Kdf`] variants pub const KDF_ALL: &[Kdf] = &[ #[cfg(feature = "kdf-sha256")] diff --git a/src/kem.rs b/src/kem.rs index 98247e42e2c..a63ff564136 100644 --- a/src/kem.rs +++ b/src/kem.rs @@ -1,9 +1,10 @@ +use crate::{IdLookupError, Keypair}; +use num_enum::TryFromPrimitive; +use std::str::FromStr; + #[cfg(target_arch = "wasm32")] use wasm_bindgen::prelude::*; -use crate::Keypair; -use num_enum::TryFromPrimitive; - /** Kem represents an asymmetric key encapsulation mechanism, as per [RFC9180§7.1][section-7.1]. Currently only two of options listed in @@ -31,6 +32,25 @@ pub enum Kem { X25519HkdfSha256 = 32, } +impl FromStr for Kem { + type Err = IdLookupError; + + fn from_str(s: &str) -> Result { + match &*s.to_lowercase().replace('-', "") { + #[cfg(feature = "kem-dh-p256-hkdf-sha256")] + "p256sha256" | "dhkemp256hkdfsha256" | "p256hkdfsha256" | "dhkem(p256, hkdfsha256)" => { + Ok(Self::DhP256HkdfSha256) + } + #[cfg(feature = "kem-x25519-hkdf-sha256")] + "x25519sha256" + | "dhkemx25519hkdfsha256" + | "x25519hkdfsha256" + | "dhkem(x25519, hkdfsha256)" => Ok(Self::X25519HkdfSha256), + _ => Err(IdLookupError("kem not recognized")), + } + } +} + impl Kem { /// generate a [`Keypair`] for this [`Config`] or [`Kem`]. #[must_use]