pub const EDDSA_ALG: &str = "EdDSA";
pub const ED25519_CRV: &str = "Ed25519";
#[inline]
pub fn is_allowed_alg(alg: &str) -> bool {
alg == EDDSA_ALG
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum KeyAlgorithm {
#[serde(rename = "EdDSA")]
Ed25519,
}
impl KeyAlgorithm {
#[inline]
pub fn jose_alg(self) -> &'static str {
match self {
Self::Ed25519 => EDDSA_ALG,
}
}
#[inline]
pub fn from_jose_alg(alg: &str) -> Option<Self> {
match alg {
EDDSA_ALG => Some(Self::Ed25519),
_ => None,
}
}
pub fn public_key_jwk(self, public_key: &[u8]) -> serde_json::Value {
use base64::Engine;
let b64 = base64::engine::general_purpose::URL_SAFE_NO_PAD;
match self {
Self::Ed25519 => serde_json::json!({
"kty": "OKP",
"crv": ED25519_CRV,
"x": b64.encode(public_key),
}),
}
}
}