use std::ops::Deref;
use aws_lc_rs::signature::{
ECDSA_P256_SHA256_FIXED_SIGNING, ECDSA_P384_SHA384_FIXED_SIGNING, EcdsaSigningAlgorithm,
EcdsaVerificationAlgorithm,
};
use rama_core::error::OpaqueError;
use serde::{Deserialize, Serialize};
use crate::jose::JWKEllipticCurves;
#[derive(Debug, Serialize, Deserialize, Copy, Clone, PartialEq, Eq)]
#[serde(rename_all = "UPPERCASE")]
pub enum JWA {
HS256,
HS384,
HS512,
RS256,
RS384,
RS512,
ES256,
ES384,
ES512,
PS256,
PS384,
PS512,
}
impl From<JWKEllipticCurves> for JWA {
fn from(value: JWKEllipticCurves) -> Self {
match value {
JWKEllipticCurves::P256 => Self::ES256,
JWKEllipticCurves::P384 => Self::ES384,
JWKEllipticCurves::P521 => Self::ES512,
}
}
}
impl TryFrom<JWA> for JWKEllipticCurves {
type Error = OpaqueError;
fn try_from(value: JWA) -> Result<Self, Self::Error> {
match value {
JWA::ES256 => Ok(Self::P256),
JWA::ES384 => Ok(Self::P384),
JWA::ES512 => Ok(Self::P521),
JWA::HS256 | JWA::HS384 | JWA::HS512 => Err(OpaqueError::from_display(
"Hmac cannot be converted to elliptic curve",
)),
JWA::RS256 | JWA::RS384 | JWA::RS512 | JWA::PS256 | JWA::PS384 | JWA::PS512 => Err(
OpaqueError::from_display("RSA cannot be converted to elliptic curve"),
),
}
}
}
impl TryFrom<JWA> for &'static EcdsaSigningAlgorithm {
type Error = OpaqueError;
fn try_from(value: JWA) -> Result<Self, Self::Error> {
match value {
JWA::ES256 | JWA::ES512 => Ok(&ECDSA_P256_SHA256_FIXED_SIGNING),
JWA::ES384 => Ok(&ECDSA_P384_SHA384_FIXED_SIGNING),
JWA::HS256 | JWA::HS384 | JWA::HS512 => Err(OpaqueError::from_display(
"Hmac cannot be converted to elliptic curve",
)),
JWA::RS256 | JWA::RS384 | JWA::RS512 | JWA::PS256 | JWA::PS384 | JWA::PS512 => Err(
OpaqueError::from_display("RSA cannot be converted to elliptic curve"),
),
}
}
}
impl TryFrom<JWA> for &'static EcdsaVerificationAlgorithm {
type Error = OpaqueError;
fn try_from(value: JWA) -> Result<Self, Self::Error> {
let signing_algo: &'static EcdsaSigningAlgorithm = value.try_into()?;
Ok(signing_algo.deref())
}
}