use crate::envelope::{encode_b64, Envelope, Signature};
use crate::error::Result;
use crate::pae::pae;
use crate::traits::Signer;
pub fn sign(payload_type: &str, payload: &[u8], signer: &dyn Signer) -> Result<Envelope> {
sign_with(payload_type, payload, &[signer])
}
pub fn sign_with(payload_type: &str, payload: &[u8], signers: &[&dyn Signer]) -> Result<Envelope> {
if payload_type.is_empty() {
return Err(crate::Error::EmptyPayloadType);
}
let pre_image = pae(payload_type, payload);
let mut signatures = Vec::with_capacity(signers.len());
for signer in signers {
let sig = signer.sign(&pre_image)?;
signatures.push(Signature {
keyid: signer.key_id().filter(|k| !k.is_empty()),
sig: encode_b64(&sig),
});
}
Ok(Envelope {
payload: encode_b64(payload),
payload_type: payload_type.to_string(),
signatures,
})
}