use crate::cbor::Cbor;
use crate::{xdsa, xhpke};
pub const HEADER_TIMESTAMP: i64 = -70002;
#[derive(Debug, Clone, PartialEq, Eq, Cbor)]
pub struct SigProtectedHeader {
#[cbor(key = 1)]
pub algorithm: i64,
#[cbor(key = 2)]
pub crit: CritHeader,
#[cbor(key = 4)]
pub kid: xdsa::Fingerprint,
#[cbor(key = -70002)]
pub timestamp: i64,
}
#[derive(Debug, Clone, PartialEq, Eq, Cbor)]
#[cbor(array)]
pub struct CritHeader {
pub timestamp: i64,
}
#[derive(Debug, Clone, PartialEq, Eq, Cbor)]
pub struct EncProtectedHeader {
#[cbor(key = 1)]
pub algorithm: i64,
#[cbor(key = 4)]
pub kid: xhpke::Fingerprint,
}
#[derive(Debug, Clone, PartialEq, Eq, Cbor)]
pub struct EmptyHeader {}
#[derive(Debug, Clone, PartialEq, Eq, Cbor)]
pub struct EncapKeyHeader {
#[cbor(key = -4)]
pub encap_key: Vec<u8>,
}
#[derive(Debug, Clone, PartialEq, Eq, Cbor)]
#[cbor(array)]
pub struct CoseSign1 {
pub protected: Vec<u8>,
pub unprotected: EmptyHeader,
pub payload: Option<Vec<u8>>,
pub signature: xdsa::Signature,
}
#[derive(Debug, Clone, PartialEq, Eq, Cbor)]
#[cbor(array)]
pub struct CoseEncrypt0 {
pub protected: Vec<u8>,
pub unprotected: EncapKeyHeader,
pub ciphertext: Vec<u8>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SigStructure<'a> {
pub context: &'static str,
pub protected: &'a [u8],
pub external_aad: &'a [u8],
pub payload: &'a [u8],
}
impl crate::cbor::Encode for SigStructure<'_> {
fn encode_cbor(&self) -> Vec<u8> {
let mut encoder = crate::cbor::Encoder::new();
encoder.encode_array_header(4);
encoder.encode_text(self.context);
encoder.encode_bytes(self.protected);
encoder.encode_bytes(self.external_aad);
encoder.encode_bytes(self.payload);
encoder.finish()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct EncStructure<'a> {
pub context: &'static str,
pub protected: &'a [u8],
pub external_aad: &'a [u8],
}
impl crate::cbor::Encode for EncStructure<'_> {
fn encode_cbor(&self) -> Vec<u8> {
let mut encoder = crate::cbor::Encoder::new();
encoder.encode_array_header(3);
encoder.encode_text(self.context);
encoder.encode_bytes(self.protected);
encoder.encode_bytes(self.external_aad);
encoder.finish()
}
}