use crate::{
helpers::create_fallback_getter,
messages::helpers::{serialization_base64_buffer, serialization_base64_jwm_header},
Jwk,
JwmHeader,
};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Signature {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(with = "serialization_base64_jwm_header")]
pub protected: Option<JwmHeader>,
#[serde(skip_serializing_if = "Option::is_none")]
pub header: Option<JwmHeader>,
#[serde(default)]
#[serde(with = "serialization_base64_buffer")]
pub signature: Vec<u8>,
}
impl Signature {
pub fn new(
protected: Option<JwmHeader>,
header: Option<JwmHeader>,
signature: Vec<u8>,
) -> Self {
Signature {
protected,
header,
signature,
}
}
create_fallback_getter!(header, protected, alg, String);
create_fallback_getter!(header, protected, cty, String);
create_fallback_getter!(header, protected, enc, String);
create_fallback_getter!(header, protected, epk, Jwk);
create_fallback_getter!(header, protected, jku, String);
create_fallback_getter!(header, protected, jwk, Jwk);
create_fallback_getter!(header, protected, kid, String);
create_fallback_getter!(header, protected, skid, String);
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Jws {
pub payload: String,
#[serde(flatten)]
#[serde(skip_serializing_if = "Option::is_none")]
pub signature: Option<Signature>,
#[serde(skip_serializing_if = "Option::is_none")]
pub signatures: Option<Vec<Signature>>,
}
impl Jws {
pub fn new(payload: String, signatures: Vec<Signature>) -> Self {
Jws {
payload,
signature: None,
signatures: Some(signatures),
}
}
pub fn new_flat(payload: String, signature_value: Signature) -> Self {
Jws {
payload,
signature: Some(signature_value),
signatures: None,
}
}
}