Skip to content

Commit

Permalink
add FromStr representations of kdf, kem, and aead
Browse files Browse the repository at this point in the history
  • Loading branch information
jbr committed Aug 9, 2023
1 parent 513784a commit 018fe22
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 7 deletions.
25 changes: 23 additions & 2 deletions src/aead.rs
Original file line number Diff line number Diff line change
@@ -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)
Expand All @@ -29,6 +31,25 @@ pub enum Aead {
ChaCha20Poly1305 = 3,
}

impl FromStr for Aead {
type Err = IdLookupError;

fn from_str(s: &str) -> Result<Self, Self::Err> {
match &*s.to_lowercase() {
#[cfg(feature = "aead-aes-gcm-128")]
"aesgcm128" | "aes-gcm-128" | "aes-128-gcm" => Ok(Self::AesGcm128),
#[cfg(feature = "aead-aes-gcm-256")]
"aesgcm256" | "aes-gcm-256" | "aes-256-gcm" => Ok(Self::AesGcm256),
#[cfg(feature = "aead-chacha-20-poly-1305")]
"chacha20poly1305"
| "chacha-20-poly-1305"
| "cha-cha-20-poly-1305"
| "chacha20-poly1305" => 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")]
Expand Down
22 changes: 20 additions & 2 deletions src/kdf.rs
Original file line number Diff line number Diff line change
@@ -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)
Expand All @@ -29,6 +31,22 @@ pub enum Kdf {
Sha512 = 3,
}

impl FromStr for Kdf {
type Err = IdLookupError;

fn from_str(s: &str) -> Result<Self, Self::Err> {
match &*s.to_lowercase() {
#[cfg(feature = "kdf-sha256")]
"sha256" | "sha-256" => Ok(Self::Sha256),
#[cfg(feature = "kdf-sha384")]
"sha384" | "sha-384" => Ok(Self::Sha384),
#[cfg(feature = "kdf-sha512")]
"sha512" | "sha-512" => Ok(Self::Sha512),
_ => Err(IdLookupError("kdf not recognized")),
}
}
}

/// An iterable slice of [`Kdf`] variants
pub const KDF_ALL: &[Kdf] = &[
#[cfg(feature = "kdf-sha256")]
Expand Down
25 changes: 22 additions & 3 deletions src/kem.rs
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -31,6 +32,24 @@ pub enum Kem {
X25519HkdfSha256 = 32,
}

impl FromStr for Kem {
type Err = IdLookupError;

fn from_str(s: &str) -> Result<Self, Self::Err> {
match &*s.to_lowercase() {
#[cfg(feature = "kem-dh-p256-hkdf-sha256")]
"dhp256hkdfsha256" | "dh-p256-hkdf-sha256" | "dhkem(p-256, hkdf-sha256)" => {
Ok(Self::DhP256HkdfSha256)
}
#[cfg(feature = "kem-x25519-hkdf-sha256")]
"x25519hkdfsha256" | "x25519-hkdf-sha256" | "dhkem(x25519, hkdf-sha256)" => {
Ok(Self::X25519HkdfSha256)
}
_ => Err(IdLookupError("kem not recognized")),
}
}
}

impl Kem {
/// generate a [`Keypair`] for this [`Config`] or [`Kem`].
#[must_use]
Expand Down

0 comments on commit 018fe22

Please sign in to comment.