use crate::{iana, Error, Header, Value};
pub(crate) fn payload_value(payload: &Option<Vec<u8>>) -> Value {
match payload {
Some(bytes) => Value::Bytes(bytes.clone()),
None => Value::Null,
}
}
pub(crate) fn encode_structure(parts: Vec<Value>) -> Vec<u8> {
cbor2::to_canonical_vec(&Value::Array(parts)).unwrap_or_default()
}
pub(crate) fn ensure_protected_alg(protected: &mut Header, alg: i64) -> Result<(), Error> {
if alg == iana::AlgorithmReserved {
return Ok(());
}
match protected.get_i64(iana::HeaderParameterAlg)? {
Some(existing) if existing != alg => Err(Error::Custom(format!(
"algorithm mismatch, header has {existing}, signer has {alg}"
))),
Some(_) => Ok(()),
None => {
protected.insert(iana::HeaderParameterAlg, alg);
Ok(())
}
}
}
pub(crate) fn check_protected_alg(protected: &Header, alg: i64) -> Result<(), Error> {
if alg == iana::AlgorithmReserved {
return Ok(());
}
if let Some(existing) = protected.get_i64(iana::HeaderParameterAlg)? {
if existing != alg {
return Err(Error::Custom(format!(
"algorithm mismatch, header has {existing}, verifier has {alg}"
)));
}
}
Ok(())
}
pub(crate) fn ensure_unprotected_kid(unprotected: &mut Header, kid: &[u8]) {
if !kid.is_empty() && !unprotected.contains_key(iana::HeaderParameterKid) {
unprotected.insert(iana::HeaderParameterKid, kid.to_vec());
}
}