#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
pub enum EcdsaSpec {
Es256,
Es384,
}
impl EcdsaSpec {
pub fn es256() -> Self {
Self::Es256
}
pub fn es384() -> Self {
Self::Es384
}
pub fn alg_name(&self) -> &'static str {
match self {
Self::Es256 => "ES256",
Self::Es384 => "ES384",
}
}
pub fn curve_name(&self) -> &'static str {
match self {
Self::Es256 => "P-256",
Self::Es384 => "P-384",
}
}
pub fn coordinate_len_bytes(&self) -> usize {
match self {
Self::Es256 => 32,
Self::Es384 => 48,
}
}
pub fn stable_bytes(&self) -> [u8; 4] {
match self {
Self::Es256 => [0, 0, 0, 1],
Self::Es384 => [0, 0, 0, 2],
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn alg_and_curve_names_match_specs() {
let es256 = EcdsaSpec::es256();
assert_eq!(es256.alg_name(), "ES256");
assert_eq!(es256.curve_name(), "P-256");
assert_eq!(es256.coordinate_len_bytes(), 32);
let es384 = EcdsaSpec::es384();
assert_eq!(es384.alg_name(), "ES384");
assert_eq!(es384.curve_name(), "P-384");
assert_eq!(es384.coordinate_len_bytes(), 48);
}
#[test]
fn stable_bytes_are_unique() {
let es256 = EcdsaSpec::es256().stable_bytes();
let es384 = EcdsaSpec::es384().stable_bytes();
assert_ne!(es256, es384);
}
}