1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
use ring::hmac; use serde::{Deserialize, Serialize}; use std::{fmt, str::FromStr}; #[derive(Debug, Eq, PartialEq, Clone, Copy, Serialize, Deserialize)] pub enum Algorithm { SHA1, SHA256, SHA512, } impl From<Algorithm> for hmac::Algorithm { fn from(h: Algorithm) -> Self { match h { Algorithm::SHA1 => hmac::HMAC_SHA1_FOR_LEGACY_USE_ONLY, Algorithm::SHA256 => hmac::HMAC_SHA256, Algorithm::SHA512 => hmac::HMAC_SHA512, } } } impl fmt::Display for Algorithm { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let s = match *self { Algorithm::SHA1 => "sha1", Algorithm::SHA256 => "sha256", Algorithm::SHA512 => "sha512", }; write!(f, "{}", s) } } impl Default for Algorithm { fn default() -> Self { Self::SHA1 } } impl FromStr for Algorithm { type Err = anyhow::Error; fn from_str(s: &str) -> Result<Self, Self::Err> { match s.to_lowercase().as_ref() { "sha1" | "otp" => Ok(Self::SHA1), "sha256" => Ok(Self::SHA256), "sha512" => Ok(Self::SHA512), _ => anyhow::bail!("Unsupported HMAC-algorithm"), } } }