#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CoseAlg {
Es256,
Es384,
Es512,
Ps256,
Ps384,
Ps512,
EdDsa,
}
impl CoseAlg {
pub fn cose_id(self) -> i128 {
match self {
CoseAlg::Es256 => -7,
CoseAlg::Es384 => -35,
CoseAlg::Es512 => -36,
CoseAlg::Ps256 => -37,
CoseAlg::Ps384 => -38,
CoseAlg::Ps512 => -39,
CoseAlg::EdDsa => -8,
}
}
pub fn from_cose_id(id: i128) -> Option<Self> {
match id {
-7 => Some(CoseAlg::Es256),
-35 => Some(CoseAlg::Es384),
-36 => Some(CoseAlg::Es512),
-37 => Some(CoseAlg::Ps256),
-38 => Some(CoseAlg::Ps384),
-39 => Some(CoseAlg::Ps512),
-8 => Some(CoseAlg::EdDsa),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn cose_id_round_trips() {
for alg in [
CoseAlg::Es256,
CoseAlg::Es384,
CoseAlg::Es512,
CoseAlg::Ps256,
CoseAlg::EdDsa,
] {
assert_eq!(CoseAlg::from_cose_id(alg.cose_id()), Some(alg));
}
}
#[test]
fn known_ids_match_registry() {
assert_eq!(CoseAlg::Es256.cose_id(), -7);
assert_eq!(CoseAlg::Es384.cose_id(), -35);
assert_eq!(CoseAlg::Es512.cose_id(), -36);
assert_eq!(CoseAlg::Ps256.cose_id(), -37);
assert_eq!(CoseAlg::EdDsa.cose_id(), -8);
}
#[test]
fn unknown_id_is_none() {
assert_eq!(CoseAlg::from_cose_id(0), None);
assert_eq!(CoseAlg::from_cose_id(-100), None);
}
}