#[cfg(feature = "raw-crypto")]
use crate::crypto::{CryptoAlgorithm, SignatureAlgorithm};
use crate::{Jwk, MessageType};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct JwmHeader {
pub typ: MessageType,
#[serde(skip_serializing_if = "Option::is_none")]
pub enc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub kid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub skid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub alg: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub jku: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub jwk: Option<Jwk>,
#[serde(skip_serializing_if = "Option::is_none")]
pub epk: Option<Jwk>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cty: Option<String>,
}
impl JwmHeader {
#[cfg(feature = "raw-crypto")]
pub fn as_signed(&mut self, alg: &SignatureAlgorithm) {
self.typ = MessageType::DidCommJws;
match alg {
SignatureAlgorithm::EdDsa => {
self.alg = Some(String::from("EdDSA"));
}
SignatureAlgorithm::Es256 => {
self.alg = Some(String::from("ES256"));
}
SignatureAlgorithm::Es256k => {
self.alg = Some(String::from("ES256K"));
}
}
}
#[cfg(feature = "raw-crypto")]
pub fn as_encrypted(&mut self, alg: &CryptoAlgorithm) {
self.typ = MessageType::DidCommJwe;
match alg {
CryptoAlgorithm::A256GCM => {
self.enc = Some("A256GCM".into());
self.alg = Some("ECDH-1PU+A256KW".into());
}
CryptoAlgorithm::XC20P => {
self.enc = Some("XC20P".into());
self.alg = Some("ECDH-1PU+XC20PKW".into());
}
CryptoAlgorithm::A256CBC => {
self.alg = Some("A256CBC".into());
self.enc = Some("ECDH-1PU+A256KW".into())
}
}
}
pub fn kid(&mut self, kid: Option<String>) {
self.kid = kid;
}
}
impl Default for JwmHeader {
fn default() -> Self {
JwmHeader {
typ: MessageType::DidCommRaw,
enc: None,
kid: None,
skid: None,
epk: None,
alg: None,
cty: None,
jku: None,
jwk: None,
}
}
}