pub const CWT_PREFIX: &[u8] = &[0xd8, 0x3d];
pub const ENCRYPT0_PREFIX: &[u8] = &[0xd0];
pub const MAC0_PREFIX: &[u8] = &[0xd1];
pub const SIGN1_PREFIX: &[u8] = &[0xd2];
pub const ENCRYPT_PREFIX: &[u8] = &[0xd8, 0x60];
pub const MAC_PREFIX: &[u8] = &[0xd8, 0x61];
pub const SIGN_PREFIX: &[u8] = &[0xd8, 0x62];
pub const CBOR_SELF_PREFIX: &[u8] = &[0xd9, 0xd9, 0xf7];
pub fn with_tag(tag: &[u8], data: &[u8]) -> Vec<u8> {
let mut out = Vec::with_capacity(tag.len() + data.len());
out.extend_from_slice(tag);
out.extend_from_slice(data);
out
}
pub fn skip_tag<'a>(tag: &[u8], data: &'a [u8]) -> &'a [u8] {
match data.strip_prefix(tag) {
Some(rest) => rest,
None => data,
}
}
pub fn remove_cbor_tag(data: &[u8]) -> &[u8] {
let data = skip_tag(CBOR_SELF_PREFIX, data);
let data = skip_tag(CWT_PREFIX, data);
for prefix in [
SIGN1_PREFIX,
MAC0_PREFIX,
ENCRYPT0_PREFIX,
SIGN_PREFIX,
MAC_PREFIX,
ENCRYPT_PREFIX,
] {
if let Some(rest) = data.strip_prefix(prefix) {
return rest;
}
}
data
}
pub(crate) fn strip_message_wrappers(data: &[u8]) -> &[u8] {
let data = skip_tag(CBOR_SELF_PREFIX, data);
skip_tag(CWT_PREFIX, data)
}
pub(crate) fn starts_with_cbor_tag(data: &[u8]) -> bool {
matches!(data.first(), Some(0xc0..=0xdb))
}