use crate::{encoding::base64url_encode, jpa::algs::ProofAlgorithm};
use serde::{Deserialize, Serialize};
use std::fmt;
use super::{curves::EllipticCurveTypes, types::KeyType};
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Deserialize, Serialize)]
#[serde(untagged)]
pub enum Algorithm {
Proof(ProofAlgorithm),
}
impl fmt::Display for Algorithm {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Algorithm::Proof(proof_algorithm) => write!(f, "{}", proof_algorithm),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
#[serde(untagged)]
pub enum JwkAlgorithmParameters {
EllipticCurve(JwkEllipticCurveKeyParameters),
OctetKeyPair(JwkOctetKeyPairParameters),
}
impl JwkAlgorithmParameters {
pub fn to_public(&self) -> Option<Self> {
match self {
Self::OctetKeyPair(inner) => Some(Self::OctetKeyPair(inner.to_public())),
Self::EllipticCurve(value) => Some(Self::EllipticCurve(value.to_public())),
}
}
pub fn is_public(&self) -> bool {
match self {
Self::OctetKeyPair(value) => value.is_public(),
Self::EllipticCurve(value) => value.is_public(),
}
}
pub fn is_private(&self) -> bool {
match self {
Self::OctetKeyPair(value) => value.is_private(),
Self::EllipticCurve(value) => value.is_private(),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
pub struct JwkOctetKeyPairParameters {
pub kty: KeyType,
pub crv: EllipticCurveTypes,
pub x: String, #[serde(skip_serializing_if = "Option::is_none")]
pub d: Option<String>,
}
impl JwkOctetKeyPairParameters {
pub fn new<T: AsRef<[u8]>>(crv: EllipticCurveTypes, x: T, d: Option<T>) -> Self {
Self {
kty: KeyType::OctetKeyPair,
crv: crv,
x: base64url_encode(x),
d: match d {
Some(d) => Some(base64url_encode(d)),
None => None,
},
}
}
pub fn to_public(&self) -> Self {
Self {
kty: KeyType::OctetKeyPair,
crv: self.crv.clone(),
x: self.x.clone(),
d: None,
}
}
pub fn is_public(&self) -> bool {
self.d.is_none()
}
pub fn is_private(&self) -> bool {
self.d.is_some()
}
}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
pub struct JwkEllipticCurveKeyParameters {
pub kty: KeyType,
pub crv: EllipticCurveTypes,
pub x: String, pub y: String, #[serde(skip_serializing_if = "Option::is_none")]
pub d: Option<String>,
}
impl JwkEllipticCurveKeyParameters {
pub fn new(crv: EllipticCurveTypes, x: &[u8], y: &[u8], d: Option<&[u8]>) -> Self {
Self {
kty: KeyType::EllipticCurve,
crv: crv,
x: base64url_encode(x),
y: base64url_encode(y),
d: match d {
Some(d) => Some(base64url_encode(d)),
None => None,
},
}
}
pub fn to_public(&self) -> Self {
Self {
kty: KeyType::OctetKeyPair,
crv: self.crv.clone(),
x: self.x.clone(),
y: self.y.clone(),
d: None,
}
}
pub fn is_public(&self) -> bool {
self.d.is_none()
}
pub fn is_private(&self) -> bool {
self.d.is_some()
}
}