pub use darkbio_crypto_cbor_derive::Cbor;
use std::cmp::Ordering;
const MAJOR_UINT: u8 = 0;
const MAJOR_NINT: u8 = 1;
const MAJOR_BYTES: u8 = 2;
const MAJOR_TEXT: u8 = 3;
const MAJOR_ARRAY: u8 = 4;
const MAJOR_MAP: u8 = 5;
const MAJOR_SIMPLE: u8 = 7;
const INFO_UINT8: u8 = 24;
const INFO_UINT16: u8 = 25;
const INFO_UINT32: u8 = 26;
const INFO_UINT64: u8 = 27;
const SIMPLE_FALSE: u8 = 20;
const SIMPLE_TRUE: u8 = 21;
const SIMPLE_NULL: u8 = 22;
const MAX_DEPTH: usize = 32;
#[derive(Clone, Debug, PartialEq, Eq, thiserror::Error)]
pub enum Error {
#[error("invalid major type: {0}, want {1}")]
InvalidMajorType(u8, u8),
#[error("invalid additional info: {0}")]
InvalidAdditionalInfo(u8),
#[error("unexpected end of data")]
UnexpectedEof,
#[error("non-canonical encoding")]
NonCanonical,
#[error("invalid UTF-8 in text string")]
InvalidUtf8,
#[error("unexpected trailing bytes")]
TrailingBytes,
#[error("unexpected item count: {0}, want {1}")]
UnexpectedItemCount(u64, usize),
#[error("unsupported type: {0}")]
UnsupportedType(u8),
#[error("{sign} integer overflow: {value} exceeds max {max}", sign = if *.0 { "negative" } else { "positive" }, value = .1, max = .2)]
IntegerOverflow(bool, u64, u64),
#[error("duplicate map key: {0}")]
DuplicateMapKey(i64),
#[error("invalid map key order: {0} must come before {1}")]
InvalidMapKeyOrder(i64, i64),
#[error("nesting depth exceeds maximum of {0}")]
MaxDepthExceeded(usize),
#[error("decode failed: {0}")]
DecodeFailed(String),
}
pub fn encode<T: Encode>(value: T) -> Vec<u8> {
value.encode_cbor()
}
pub fn decode<T: Decode>(data: &[u8]) -> Result<T, Error> {
T::decode_cbor(data)
}
pub fn verify(data: &[u8]) -> Result<(), Error> {
let mut decoder = Decoder::new(data);
verify_object(&mut decoder, MAX_DEPTH)?;
decoder.finish()
}
pub struct Encoder {
buf: Vec<u8>,
}
impl Encoder {
pub fn new() -> Self {
Self {
buf: Vec::with_capacity(1024),
}
}
pub fn finish(self) -> Vec<u8> {
self.buf
}
pub fn extend(&mut self, bytes: &[u8]) {
self.buf.extend_from_slice(bytes);
}
pub fn encode_uint(&mut self, value: u64) {
self.encode_length(MAJOR_UINT, value);
}
pub fn encode_int(&mut self, value: i64) {
if value >= 0 {
self.encode_length(MAJOR_UINT, value as u64);
} else {
self.encode_length(MAJOR_NINT, (-1 - value) as u64);
}
}
pub fn encode_bytes(&mut self, value: &[u8]) {
self.encode_length(MAJOR_BYTES, value.len() as u64);
self.buf.extend_from_slice(value);
}
pub fn encode_text(&mut self, value: &str) {
self.encode_length(MAJOR_TEXT, value.len() as u64);
self.buf.extend_from_slice(value.as_bytes());
}
pub fn encode_array_header(&mut self, len: usize) {
self.encode_length(MAJOR_ARRAY, len as u64);
}
pub fn encode_empty_tuple(&mut self) {
self.encode_array_header(0);
}
pub fn encode_map_header(&mut self, len: usize) {
self.encode_length(MAJOR_MAP, len as u64);
}
pub fn encode_bool(&mut self, value: bool) {
self.buf
.push(MAJOR_SIMPLE << 5 | if value { SIMPLE_TRUE } else { SIMPLE_FALSE });
}
pub fn encode_null(&mut self) {
self.buf.push(MAJOR_SIMPLE << 5 | SIMPLE_NULL);
}
fn encode_length(&mut self, major_type: u8, len: u64) {
if len < 24 {
self.buf.push(major_type << 5 | len as u8);
} else if len <= u8::MAX as u64 {
self.buf.push(major_type << 5 | INFO_UINT8);
self.buf.push(len as u8);
} else if len <= u16::MAX as u64 {
self.buf.push(major_type << 5 | INFO_UINT16);
self.buf.extend_from_slice(&(len as u16).to_be_bytes());
} else if len <= u32::MAX as u64 {
self.buf.push(major_type << 5 | INFO_UINT32);
self.buf.extend_from_slice(&(len as u32).to_be_bytes());
} else {
self.buf.push(major_type << 5 | INFO_UINT64);
self.buf.extend_from_slice(&len.to_be_bytes());
}
}
}
impl Default for Encoder {
fn default() -> Self {
Self::new()
}
}
#[derive(Clone)]
pub struct Decoder<'a> {
data: &'a [u8],
pos: usize,
}
impl<'a> Decoder<'a> {
pub fn new(data: &'a [u8]) -> Self {
Self { data, pos: 0 }
}
pub fn finish(self) -> Result<(), Error> {
if self.pos != self.data.len() {
return Err(Error::TrailingBytes);
}
Ok(())
}
pub fn decode_uint(&mut self) -> Result<u64, Error> {
let (major, value) = self.decode_header()?;
if major != MAJOR_UINT {
return Err(Error::InvalidMajorType(major, MAJOR_UINT));
}
Ok(value)
}
pub fn decode_int(&mut self) -> Result<i64, Error> {
let (major, value) = self.decode_header()?;
match major {
MAJOR_UINT => {
if value > i64::MAX as u64 {
return Err(Error::IntegerOverflow(false, value, i64::MAX as u64));
}
Ok(value as i64)
}
MAJOR_NINT => {
if value > i64::MAX as u64 {
return Err(Error::IntegerOverflow(true, value, i64::MAX as u64));
}
Ok(-1 - value as i64)
}
_ => Err(Error::InvalidMajorType(major, MAJOR_UINT)),
}
}
pub fn decode_bytes(&mut self) -> Result<Vec<u8>, Error> {
let (major, len) = self.decode_header()?;
if major != MAJOR_BYTES {
return Err(Error::InvalidMajorType(major, MAJOR_BYTES));
}
let bytes = self.read_bytes(len)?;
Ok(bytes.to_vec())
}
pub fn decode_bytes_fixed<const N: usize>(&mut self) -> Result<[u8; N], Error> {
let (major, len) = self.decode_header()?;
if major != MAJOR_BYTES {
return Err(Error::InvalidMajorType(major, MAJOR_BYTES));
}
if len as usize != N {
return Err(Error::UnexpectedItemCount(len, N));
}
let bytes = self.read_bytes(N as u64)?;
let mut array = [0u8; N];
array.copy_from_slice(bytes);
Ok(array)
}
pub fn decode_text(&mut self) -> Result<String, Error> {
let (major, len) = self.decode_header()?;
if major != MAJOR_TEXT {
return Err(Error::InvalidMajorType(major, MAJOR_TEXT));
}
let bytes = self.read_bytes(len)?;
String::from_utf8(bytes.to_vec()).map_err(|_| Error::InvalidUtf8)
}
pub fn decode_array_header(&mut self) -> Result<u64, Error> {
let (major, len) = self.decode_header()?;
if major != MAJOR_ARRAY {
return Err(Error::InvalidMajorType(major, MAJOR_ARRAY));
}
Ok(len)
}
pub fn decode_map_header(&mut self) -> Result<u64, Error> {
let (major, len) = self.decode_header()?;
if major != MAJOR_MAP {
return Err(Error::InvalidMajorType(major, MAJOR_MAP));
}
Ok(len)
}
pub fn decode_bool(&mut self) -> Result<bool, Error> {
if self.pos >= self.data.len() {
return Err(Error::UnexpectedEof);
}
let byte = self.data[self.pos];
match byte {
b if b == (MAJOR_SIMPLE << 5 | SIMPLE_FALSE) => {
self.pos += 1;
Ok(false)
}
b if b == (MAJOR_SIMPLE << 5 | SIMPLE_TRUE) => {
self.pos += 1;
Ok(true)
}
_ => Err(Error::InvalidMajorType(byte >> 5, MAJOR_SIMPLE)),
}
}
pub fn decode_null(&mut self) -> Result<(), Error> {
if self.pos >= self.data.len() {
return Err(Error::UnexpectedEof);
}
let byte = self.data[self.pos];
if byte != (MAJOR_SIMPLE << 5 | SIMPLE_NULL) {
return Err(Error::InvalidMajorType(byte >> 5, MAJOR_SIMPLE));
}
self.pos += 1;
Ok(())
}
pub fn peek_null(&self) -> bool {
self.pos < self.data.len() && self.data[self.pos] == (MAJOR_SIMPLE << 5 | SIMPLE_NULL)
}
fn decode_header(&mut self) -> Result<(u8, u64), Error> {
if self.pos >= self.data.len() {
return Err(Error::UnexpectedEof);
}
let byte = self.data[self.pos];
self.pos += 1;
let major = byte >> 5;
let info = byte & 0x1f;
let value = match info {
0..=23 => Ok(info as u64),
INFO_UINT8 => {
let bytes = self.read_bytes(1)?;
Ok(bytes[0] as u64)
}
INFO_UINT16 => {
let bytes = self.read_bytes(2)?;
Ok(u16::from_be_bytes([bytes[0], bytes[1]]) as u64)
}
INFO_UINT32 => {
let bytes = self.read_bytes(4)?;
Ok(u32::from_be_bytes([bytes[0], bytes[1], bytes[2], bytes[3]]) as u64)
}
INFO_UINT64 => {
let bytes = self.read_bytes(8)?;
Ok(u64::from_be_bytes([
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
]))
}
_ => Err(Error::InvalidAdditionalInfo(info)),
}?;
if !match info {
0..=23 => value < 24,
INFO_UINT8 => value >= 24 && value <= u8::MAX as u64,
INFO_UINT16 => value > u8::MAX as u64 && value <= u16::MAX as u64,
INFO_UINT32 => value > u16::MAX as u64 && value <= u32::MAX as u64,
INFO_UINT64 => value > u32::MAX as u64,
_ => false,
} {
return Err(Error::NonCanonical);
}
Ok((major, value))
}
fn read_bytes(&mut self, len: u64) -> Result<&'a [u8], Error> {
if len > usize::MAX as u64 {
return Err(Error::UnexpectedEof);
}
let len = len as usize;
match self.pos.checked_add(len) {
None => return Err(Error::UnexpectedEof),
Some(end) => {
if end > self.data.len() {
return Err(Error::UnexpectedEof);
}
}
}
let bytes = &self.data[self.pos..self.pos + len];
self.pos += len;
Ok(bytes)
}
}
pub trait Encode {
fn encode_cbor(&self) -> Vec<u8>;
}
pub trait Decode: Sized {
fn decode_cbor(data: &[u8]) -> Result<Self, Error>;
fn decode_cbor_notrail(decoder: &mut Decoder<'_>) -> Result<Self, Error>;
}
impl Encode for bool {
fn encode_cbor(&self) -> Vec<u8> {
let mut encoder = Encoder::new();
encoder.encode_bool(*self);
encoder.finish()
}
}
impl Decode for bool {
fn decode_cbor(data: &[u8]) -> Result<Self, Error> {
let mut decoder = Decoder::new(data);
let value = decoder.decode_bool()?;
decoder.finish()?;
Ok(value)
}
fn decode_cbor_notrail(decoder: &mut Decoder<'_>) -> Result<Self, Error> {
decoder.decode_bool()
}
}
impl Encode for u64 {
fn encode_cbor(&self) -> Vec<u8> {
let mut encoder = Encoder::new();
encoder.encode_uint(*self);
encoder.finish()
}
}
impl Decode for u64 {
fn decode_cbor(data: &[u8]) -> Result<Self, Error> {
let mut decoder = Decoder::new(data);
let value = decoder.decode_uint()?;
decoder.finish()?;
Ok(value)
}
fn decode_cbor_notrail(decoder: &mut Decoder<'_>) -> Result<Self, Error> {
decoder.decode_uint()
}
}
impl Encode for i64 {
fn encode_cbor(&self) -> Vec<u8> {
let mut encoder = Encoder::new();
encoder.encode_int(*self);
encoder.finish()
}
}
impl Decode for i64 {
fn decode_cbor(data: &[u8]) -> Result<Self, Error> {
let mut decoder = Decoder::new(data);
let value = decoder.decode_int()?;
decoder.finish()?;
Ok(value)
}
fn decode_cbor_notrail(decoder: &mut Decoder<'_>) -> Result<Self, Error> {
decoder.decode_int()
}
}
impl Encode for Vec<u8> {
fn encode_cbor(&self) -> Vec<u8> {
let mut encoder = Encoder::new();
encoder.encode_bytes(self);
encoder.finish()
}
}
impl Encode for &[u8] {
fn encode_cbor(&self) -> Vec<u8> {
let mut encoder = Encoder::new();
encoder.encode_bytes(self);
encoder.finish()
}
}
impl Decode for Vec<u8> {
fn decode_cbor(data: &[u8]) -> Result<Self, Error> {
let mut decoder = Decoder::new(data);
let value = decoder.decode_bytes()?;
decoder.finish()?;
Ok(value)
}
fn decode_cbor_notrail(decoder: &mut Decoder<'_>) -> Result<Self, Error> {
decoder.decode_bytes()
}
}
impl<const N: usize> Encode for [u8; N] {
fn encode_cbor(&self) -> Vec<u8> {
let mut encoder = Encoder::new();
encoder.encode_bytes(self);
encoder.finish()
}
}
impl<const N: usize> Decode for [u8; N] {
fn decode_cbor(data: &[u8]) -> Result<Self, Error> {
let mut decoder = Decoder::new(data);
let value = decoder.decode_bytes_fixed::<N>()?;
decoder.finish()?;
Ok(value)
}
fn decode_cbor_notrail(decoder: &mut Decoder<'_>) -> Result<Self, Error> {
decoder.decode_bytes_fixed::<N>()
}
}
impl Encode for String {
fn encode_cbor(&self) -> Vec<u8> {
let mut encoder = Encoder::new();
encoder.encode_text(self);
encoder.finish()
}
}
impl Encode for &str {
fn encode_cbor(&self) -> Vec<u8> {
let mut encoder = Encoder::new();
encoder.encode_text(self);
encoder.finish()
}
}
impl Decode for String {
fn decode_cbor(data: &[u8]) -> Result<Self, Error> {
let mut decoder = Decoder::new(data);
let value = decoder.decode_text()?;
decoder.finish()?;
Ok(value)
}
fn decode_cbor_notrail(decoder: &mut Decoder<'_>) -> Result<Self, Error> {
decoder.decode_text()
}
}
impl Encode for () {
fn encode_cbor(&self) -> Vec<u8> {
let mut encoder = Encoder::new();
encoder.encode_empty_tuple();
encoder.finish()
}
}
impl Decode for () {
fn decode_cbor(data: &[u8]) -> Result<Self, Error> {
let mut decoder = Decoder::new(data);
let len = decoder.decode_array_header()?;
if len != 0 {
return Err(Error::UnexpectedItemCount(len, 0));
}
decoder.finish()?;
Ok(())
}
fn decode_cbor_notrail(decoder: &mut Decoder<'_>) -> Result<Self, Error> {
let len = decoder.decode_array_header()?;
if len != 0 {
return Err(Error::UnexpectedItemCount(len, 0));
}
Ok(())
}
}
macro_rules! impl_tuple {
($($t:ident),+) => {
impl<$($t: Encode),+> Encode for ($($t,)+) {
fn encode_cbor(&self) -> Vec<u8> {
let mut encoder = Encoder::new();
let len = args!($($t),+);
encoder.encode_array_header(len);
let ($($t,)+) = self;
$(encoder.buf.extend_from_slice(&$t.encode_cbor());)+
encoder.finish()
}
}
impl<$($t: Decode),+> Decode for ($($t,)+) {
fn decode_cbor(data: &[u8]) -> Result<Self, Error> {
let mut decoder = Decoder::new(data);
let len = decoder.decode_array_header()?;
let exp = args!($($t),+);
if len != exp as u64 {
return Err(Error::UnexpectedItemCount(len, exp));
}
$(
let $t = $t::decode_cbor_notrail(&mut decoder)?;
)+
decoder.finish()?;
Ok(($($t,)+))
}
fn decode_cbor_notrail(decoder: &mut Decoder<'_>) -> Result<Self, Error> {
let len = decoder.decode_array_header()?;
let exp = args!($($t),+);
if len != exp as u64 {
return Err(Error::UnexpectedItemCount(len, exp));
}
$(
let $t = $t::decode_cbor_notrail(decoder)?;
)+
Ok(($($t,)+))
}
}
};
}
macro_rules! args {
($($t:ident),+) => { args!(@count $($t),+) };
(@count $t1:ident) => { 1 };
(@count $t1:ident, $($t:ident),+) => { 1 + args!(@count $($t),+) };
}
#[allow(non_snake_case)]
mod tuple_impls {
use super::*;
impl_tuple!(T1);
impl_tuple!(T1, T2);
impl_tuple!(T1, T2, T3);
impl_tuple!(T1, T2, T3, T4);
impl_tuple!(T1, T2, T3, T4, T5);
impl_tuple!(T1, T2, T3, T4, T5, T6);
impl_tuple!(T1, T2, T3, T4, T5, T6, T7);
impl_tuple!(T1, T2, T3, T4, T5, T6, T7, T8);
}
impl<T: Encode> Encode for &T {
fn encode_cbor(&self) -> Vec<u8> {
(*self).encode_cbor()
}
}
pub const NULL: Null = Null;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct Null;
impl Encode for Null {
fn encode_cbor(&self) -> Vec<u8> {
let mut encoder = Encoder::new();
encoder.encode_null();
encoder.finish()
}
}
impl Decode for Null {
fn decode_cbor(data: &[u8]) -> Result<Self, Error> {
let mut decoder = Decoder::new(data);
let result = Self::decode_cbor_notrail(&mut decoder)?;
decoder.finish()?;
Ok(result)
}
fn decode_cbor_notrail(decoder: &mut Decoder<'_>) -> Result<Self, Error> {
decoder.decode_null()?;
Ok(Null)
}
}
impl<T: Encode> Encode for Option<T> {
fn encode_cbor(&self) -> Vec<u8> {
match self {
Some(value) => value.encode_cbor(),
None => {
let mut encoder = Encoder::new();
encoder.encode_null();
encoder.finish()
}
}
}
}
impl<T: Decode> Decode for Option<T> {
fn decode_cbor(data: &[u8]) -> Result<Self, Error> {
let mut decoder = Decoder::new(data);
let result = Self::decode_cbor_notrail(&mut decoder)?;
decoder.finish()?;
Ok(result)
}
fn decode_cbor_notrail(decoder: &mut Decoder<'_>) -> Result<Self, Error> {
if decoder.peek_null() {
decoder.decode_null()?;
Ok(None)
} else {
Ok(Some(T::decode_cbor_notrail(decoder)?))
}
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Raw(pub Vec<u8>);
impl std::ops::Deref for Raw {
type Target = Vec<u8>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl std::ops::DerefMut for Raw {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl Encode for Raw {
fn encode_cbor(&self) -> Vec<u8> {
self.0.clone()
}
}
impl Decode for Raw {
fn decode_cbor(data: &[u8]) -> Result<Self, Error> {
let mut decoder = Decoder::new(data);
let result = Self::decode_cbor_notrail(&mut decoder)?;
decoder.finish()?;
Ok(result)
}
fn decode_cbor_notrail(decoder: &mut Decoder<'_>) -> Result<Self, Error> {
let start = decoder.pos;
skip_object(decoder, MAX_DEPTH)?;
let end = decoder.pos;
Ok(Raw(decoder.data[start..end].to_vec()))
}
}
fn skip_object(decoder: &mut Decoder<'_>, depth: usize) -> Result<(), Error> {
if depth == 0 {
return Err(Error::MaxDepthExceeded(MAX_DEPTH));
}
let (major, value) = decoder.decode_header()?;
match major {
MAJOR_UINT | MAJOR_NINT => Ok(()),
MAJOR_BYTES | MAJOR_TEXT => {
decoder.read_bytes(value)?;
Ok(())
}
MAJOR_ARRAY => {
for _ in 0..value {
skip_object(decoder, depth - 1)?;
}
Ok(())
}
MAJOR_MAP => {
for _ in 0..value {
skip_object(decoder, depth - 1)?;
skip_object(decoder, depth - 1)?;
}
Ok(())
}
MAJOR_SIMPLE
if value == SIMPLE_FALSE as u64
|| value == SIMPLE_TRUE as u64
|| value == SIMPLE_NULL as u64 =>
{
Ok(())
}
_ => Err(Error::UnsupportedType(major)),
}
}
fn map_key_cmp(a: i64, b: i64) -> Ordering {
fn encode_key(k: i64) -> Vec<u8> {
let mut enc = Encoder::new();
enc.encode_int(k);
enc.finish()
}
encode_key(a).cmp(&encode_key(b))
}
fn verify_object(decoder: &mut Decoder, depth: usize) -> Result<(), Error> {
if depth == 0 {
return Err(Error::MaxDepthExceeded(MAX_DEPTH));
}
let (major, value) = decoder.decode_header()?;
match major {
MAJOR_UINT | MAJOR_NINT => {
Ok(())
}
MAJOR_BYTES => {
_ = decoder.read_bytes(value)?;
Ok(())
}
MAJOR_TEXT => {
let bytes = decoder.read_bytes(value)?;
std::str::from_utf8(bytes).map_err(|_| Error::InvalidUtf8)?;
Ok(())
}
MAJOR_ARRAY => {
let len = value as usize;
for _ in 0..len {
verify_object(decoder, depth - 1)?;
}
Ok(())
}
MAJOR_MAP => {
let len = value as usize;
let mut prev_key: Option<i64> = None;
for _ in 0..len {
let key = decoder.decode_int()?;
if let Some(prev) = prev_key
&& map_key_cmp(prev, key) != Ordering::Less
{
return Err(Error::InvalidMapKeyOrder(key, prev));
}
prev_key = Some(key);
verify_object(decoder, depth - 1)?;
}
Ok(())
}
MAJOR_SIMPLE
if value == SIMPLE_FALSE as u64
|| value == SIMPLE_TRUE as u64
|| value == SIMPLE_NULL as u64 =>
{
Ok(())
}
_ => {
Err(Error::UnsupportedType(major))
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_bool_encoding() {
assert_eq!(encode(&false), vec![0xf4]);
assert_eq!(encode(&true), vec![0xf5]);
}
#[test]
fn test_bool_decoding() {
assert_eq!(decode::<bool>(&[0xf4]).unwrap(), false);
assert_eq!(decode::<bool>(&[0xf5]).unwrap(), true);
assert!(decode::<bool>(&[0xf6]).is_err()); assert!(decode::<bool>(&[0x00]).is_err()); }
#[test]
fn test_null_encoding() {
assert_eq!(encode(&None::<u64>), vec![0xf6]);
assert_eq!(encode(&Some(42u64)), encode(&42u64));
}
#[test]
fn test_null_decoding() {
assert_eq!(decode::<Option<u64>>(&[0xf6]).unwrap(), None);
assert_eq!(decode::<Option<u64>>(&encode(&42u64)).unwrap(), Some(42));
assert_eq!(decode::<Option<bool>>(&[0xf4]).unwrap(), Some(false));
assert_eq!(decode::<Option<bool>>(&[0xf5]).unwrap(), Some(true));
assert_eq!(decode::<Option<bool>>(&[0xf6]).unwrap(), None);
assert_eq!(decode::<Null>(&[0xf6]).unwrap(), Null);
assert!(decode::<Null>(&[0xf4]).is_err()); assert!(decode::<Null>(&[0x00]).is_err()); }
#[test]
fn test_uint_encoding() {
let cases = [
(0u64, vec![0x00]),
(23u64, vec![0x17]),
(24u64, vec![0x18, 0x18]),
(u8::MAX as u64, vec![0x18, 0xff]),
(u8::MAX as u64 + 1, vec![0x19, 0x01, 0x00]),
(u16::MAX as u64, vec![0x19, 0xff, 0xff]),
(u16::MAX as u64 + 1, vec![0x1a, 0x00, 0x01, 0x00, 0x00]),
(u32::MAX as u64, vec![0x1a, 0xff, 0xff, 0xff, 0xff]),
(
u32::MAX as u64 + 1,
vec![0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00],
),
(
u64::MAX,
vec![0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff],
),
];
for (value, expected) in cases {
assert_eq!(
encode(&value),
expected,
"encoding failed for value {}",
value
);
}
}
#[test]
fn test_uint_decoding() {
let cases = [
(vec![0x00], 0u64),
(vec![0x17], 23u64),
(vec![0x18, 0x18], 24u64),
(vec![0x18, 0xff], u8::MAX as u64),
(vec![0x19, 0x01, 0x00], u8::MAX as u64 + 1),
(vec![0x19, 0xff, 0xff], u16::MAX as u64),
(vec![0x1a, 0x00, 0x01, 0x00, 0x00], u16::MAX as u64 + 1),
(vec![0x1a, 0xff, 0xff, 0xff, 0xff], u32::MAX as u64),
(
vec![0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00],
u32::MAX as u64 + 1,
),
(
vec![0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff],
u64::MAX,
),
];
for (data, expected) in cases {
assert_eq!(
decode::<u64>(&data).unwrap(),
expected,
"decoding failed for data {:?}",
data
);
}
}
#[test]
fn test_uint_rejection() {
for value in 0..24u64 {
let mut data = vec![MAJOR_UINT << 5 | INFO_UINT8, value as u8];
assert!(decode::<u64>(&data).is_err());
data = vec![MAJOR_UINT << 5 | INFO_UINT16];
data.extend_from_slice(&(value as u16).to_be_bytes());
assert!(decode::<u64>(&data).is_err());
data = vec![MAJOR_UINT << 5 | INFO_UINT32];
data.extend_from_slice(&(value as u32).to_be_bytes());
assert!(decode::<u64>(&data).is_err());
data = vec![MAJOR_UINT << 5 | INFO_UINT64];
data.extend_from_slice(&value.to_be_bytes());
assert!(decode::<u64>(&data).is_err());
}
for value in 24..=u8::MAX as u64 {
let mut data = vec![MAJOR_UINT << 5 | INFO_UINT16];
data.extend_from_slice(&(value as u16).to_be_bytes());
assert!(decode::<u64>(&data).is_err());
data = vec![MAJOR_UINT << 5 | INFO_UINT32];
data.extend_from_slice(&(value as u32).to_be_bytes());
assert!(decode::<u64>(&data).is_err());
data = vec![MAJOR_UINT << 5 | INFO_UINT64];
data.extend_from_slice(&value.to_be_bytes());
assert!(decode::<u64>(&data).is_err());
}
for value in [(u8::MAX as u64 + 1), u16::MAX as u64] {
let mut data = vec![MAJOR_UINT << 5 | INFO_UINT32];
data.extend_from_slice(&(value as u32).to_be_bytes());
assert!(decode::<u64>(&data).is_err());
data = vec![MAJOR_UINT << 5 | INFO_UINT64];
data.extend_from_slice(&value.to_be_bytes());
assert!(decode::<u64>(&data).is_err());
}
for value in [(u16::MAX as u64 + 1), u32::MAX as u64] {
let mut data = vec![MAJOR_UINT << 5 | INFO_UINT64];
data.extend_from_slice(&value.to_be_bytes());
assert!(decode::<u64>(&data).is_err());
}
}
#[test]
fn test_int_encoding() {
let cases = [
(0i64, vec![0x00]),
(23i64, vec![0x17]),
(24i64, vec![0x18, 0x18]),
(
i64::MAX,
vec![0x1b, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff],
),
(-1i64, vec![0x20]), (-24i64, vec![0x37]), (-25i64, vec![0x38, 0x18]), (-256i64, vec![0x38, 0xff]), (-257i64, vec![0x39, 0x01, 0x00]), (
i64::MIN,
vec![0x3b, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff],
),
];
for (value, expected) in cases {
assert_eq!(
encode(&value),
expected,
"encoding failed for value {}",
value
);
}
}
#[test]
fn test_int_decoding() {
let cases = [
(vec![0x00], 0i64),
(vec![0x17], 23i64),
(vec![0x18, 0x18], 24i64),
(
vec![0x1b, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff],
i64::MAX,
),
(vec![0x20], -1i64),
(vec![0x37], -24i64),
(vec![0x38, 0x18], -25i64),
(vec![0x38, 0xff], -256i64),
(vec![0x39, 0x01, 0x00], -257i64),
(
vec![0x3b, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff],
i64::MIN,
),
];
for (data, expected) in cases {
assert_eq!(
decode::<i64>(&data).unwrap(),
expected,
"decoding failed for data {:?}",
data
);
}
}
#[test]
fn test_int_rejection() {
let mut data = vec![MAJOR_UINT << 5 | INFO_UINT64];
data.extend_from_slice(&((i64::MAX as u64) + 1).to_be_bytes());
let result = decode::<i64>(&data);
assert!(result.is_err());
match result.unwrap_err() {
Error::IntegerOverflow(negative, v, max) => {
assert!(!negative);
assert_eq!(v, 9223372036854775808);
assert_eq!(max, 9223372036854775807);
}
other => panic!("Expected IntegerOverflow error, got {:?}", other),
}
let mut data = vec![MAJOR_NINT << 5 | INFO_UINT64];
data.extend_from_slice(&((i64::MAX as u64) + 1).to_be_bytes());
let result = decode::<i64>(&data);
assert!(result.is_err());
match result.unwrap_err() {
Error::IntegerOverflow(negative, v, max) => {
assert!(negative);
assert_eq!(v, 9223372036854775808);
assert_eq!(max, 9223372036854775807);
}
other => panic!("Expected IntegerOverflow error, got {:?}", other),
}
let data = vec![MAJOR_NINT << 5 | INFO_UINT8, 0x10]; let result = decode::<i64>(&data);
assert!(result.is_err());
match result.unwrap_err() {
Error::NonCanonical => {}
other => panic!("Expected NonCanonical error, got {:?}", other),
}
}
#[test]
fn test_bytes_encoding() {
let empty: Vec<u8> = vec![];
let encoded = encode(&empty);
assert_eq!(encoded, vec![0x40]);
let one_byte = vec![0xaa];
let encoded = encode(&one_byte);
assert_eq!(encoded, vec![0x41, 0xaa]);
let long_bytes = vec![0xde, 0xad, 0xbe, 0xef];
let encoded = encode(&long_bytes);
assert_eq!(encoded, vec![0x44, 0xde, 0xad, 0xbe, 0xef]);
let bytes_vec = vec![1, 2, 3];
let bytes_vec_ref = &bytes_vec;
let encoded = encode(&bytes_vec_ref);
assert_eq!(encoded, vec![0x43, 1, 2, 3]);
let bytes_slice: &[u8] = &[4, 5, 6];
let encoded = encode(&bytes_slice);
assert_eq!(encoded, vec![0x43, 4, 5, 6]);
let bytes_array: [u8; 3] = [7, 8, 9];
let encoded = encode(&bytes_array);
assert_eq!(encoded, vec![0x43, 7, 8, 9]);
let bytes_array_ref = &[10u8, 11, 12];
let encoded = encode(&bytes_array_ref);
assert_eq!(encoded, vec![0x43, 10, 11, 12]);
}
#[test]
fn test_bytes_decoding() {
let encoded = vec![0x40];
let decoded = decode::<Vec<u8>>(&encoded).unwrap();
assert_eq!(decoded, Vec::<u8>::new());
let encoded = vec![0x41, 0xaa];
let decoded = decode::<Vec<u8>>(&encoded).unwrap();
assert_eq!(decoded, vec![0xaa]);
let data = vec![0xde, 0xad, 0xbe, 0xef];
let mut encoded = vec![0x44]; encoded.extend_from_slice(&data);
let decoded = decode::<Vec<u8>>(&encoded).unwrap();
assert_eq!(decoded, data);
let encoded = vec![0x43, 1, 2, 3]; let decoded = decode::<[u8; 3]>(&encoded).unwrap();
assert_eq!(decoded, [1, 2, 3]);
let encoded = vec![0x40]; let decoded = decode::<[u8; 0]>(&encoded).unwrap();
assert_eq!(decoded, []);
}
#[test]
fn test_bytes_rejection() {
let encoded = vec![0x43, 1, 2, 3]; let result = decode::<[u8; 4]>(&encoded);
assert!(result.is_err());
match result.unwrap_err() {
Error::UnexpectedItemCount(3, 4) => {} other => panic!("Expected UnexpectedItemCount(3, 4) error, got {:?}", other),
}
let encoded = vec![0x44, 1, 2, 3, 4]; let result = decode::<[u8; 2]>(&encoded);
assert!(result.is_err());
match result.unwrap_err() {
Error::UnexpectedItemCount(4, 2) => {} other => panic!("Expected UnexpectedItemCount(4, 2) error, got {:?}", other),
}
}
#[test]
fn test_string_encoding() {
let empty = "";
let encoded = encode(&empty);
assert_eq!(encoded, vec![0x60]);
let one_char = "a";
let encoded = encode(&one_char);
assert_eq!(encoded, vec![0x61, 0x61]);
let long_string = "Peter says hi!";
let encoded = encode(&long_string);
assert_eq!(encoded[0], 0x60 | long_string.len() as u8); assert_eq!(&encoded[1..], long_string.as_bytes());
let string_type = "Peter says hi!".to_string();
let encoded = encode(&string_type);
assert_eq!(encoded[0], 0x60 | string_type.len() as u8); assert_eq!(&encoded[1..], string_type.as_bytes());
let string_ref = &"Peter says hi!".to_string();
let encoded = encode(&string_ref);
assert_eq!(encoded[0], 0x60 | string_ref.len() as u8); assert_eq!(&encoded[1..], string_ref.as_bytes());
}
#[test]
fn test_string_decoding() {
let encoded = vec![0x60];
let decoded = decode::<String>(&encoded).unwrap();
assert_eq!(decoded, "");
let encoded = vec![0x61, 0x61];
let decoded = decode::<String>(&encoded).unwrap();
assert_eq!(decoded, "a");
let test_str = "Peter says hi!";
let mut encoded = vec![0x60 | test_str.len() as u8];
encoded.extend_from_slice(test_str.as_bytes());
let decoded = decode::<String>(&encoded).unwrap();
assert_eq!(decoded, test_str);
}
#[test]
fn test_string_rejection() {
let encoded = vec![0x61, 0xff]; let result = decode::<String>(&encoded);
assert!(result.is_err());
match result.unwrap_err() {
Error::InvalidUtf8 => {} other => panic!("Expected InvalidUtf8 error, got {:?}", other),
}
let encoded = vec![0x62, 0xc2, 0x00]; let result = decode::<String>(&encoded);
assert!(result.is_err());
match result.unwrap_err() {
Error::InvalidUtf8 => {} other => panic!("Expected InvalidUtf8 error, got {:?}", other),
}
}
#[test]
fn test_tuple_encoding() {
let empty = ();
let encoded = encode(&empty);
assert_eq!(encoded, vec![0x80]);
let one_tuple = (42u64,);
let encoded = encode(&one_tuple);
assert_eq!(encoded[0], 0x81); assert_eq!(encoded[1], 0x18); assert_eq!(encoded[2], 42);
let t = ("hello".to_string(), 42u64);
let encoded = encode(&t);
assert_eq!(encoded[0], 0x82); assert_eq!(encoded[1], 0x65); assert_eq!(&encoded[2..7], b"hello");
assert_eq!(encoded[7], 0x18); assert_eq!(encoded[8], 42);
}
#[test]
fn test_tuple_decoding() {
let encoded = vec![0x80]; let decoded = decode::<()>(&encoded).unwrap();
assert_eq!(decoded, ());
let mut encoded = vec![0x81]; encoded.extend_from_slice(&encode(&42u64)); let decoded = decode::<(u64,)>(&encoded).unwrap();
assert_eq!(decoded, (42u64,));
let mut encoded = vec![0x82]; encoded.extend_from_slice(&encode(&"hello".to_string())); encoded.extend_from_slice(&encode(&42u64)); let decoded = decode::<(String, u64)>(&encoded).unwrap();
assert_eq!(decoded, ("hello".to_string(), 42u64));
}
#[test]
fn test_tuple_rejection() {
let mut encoded = vec![0x81]; encoded.extend_from_slice(&encode(&42u64)); let result = decode::<(u64, u64)>(&encoded);
assert!(result.is_err());
match result.unwrap_err() {
Error::UnexpectedItemCount(1, 2) => {} other => panic!("Expected UnexpectedItemCount(1, 2) error, got {:?}", other),
}
let mut encoded = vec![0x83]; encoded.extend_from_slice(&encode(&42u64));
encoded.extend_from_slice(&encode(&"test".to_string()));
encoded.extend_from_slice(&encode(&vec![1u8, 2]));
let result = decode::<(u64, String)>(&encoded);
assert!(result.is_err());
match result.unwrap_err() {
Error::UnexpectedItemCount(3, 2) => {} other => panic!("Expected UnexpectedItemCount(3, 2) error, got {:?}", other),
}
let mut encoded = vec![0x81]; encoded.extend_from_slice(&encode(&42u64));
let result = decode::<()>(&encoded);
assert!(result.is_err());
match result.unwrap_err() {
Error::UnexpectedItemCount(1, 0) => {} other => panic!("Expected UnexpectedItemCount(1, 0) error, got {:?}", other),
}
}
#[derive(Debug, PartialEq, Cbor)]
#[cbor(array)]
struct TestArray {
first: u64,
second: String,
third: Vec<u8>,
}
#[test]
fn test_array_encoding() {
let arr = TestArray {
first: 42,
second: "hello".to_string(),
third: vec![1, 2, 3],
};
let encoded = encode(&arr);
let mut expected = vec![0x83]; expected.extend_from_slice(&encode(&42u64));
expected.extend_from_slice(&encode(&"hello".to_string()));
expected.extend_from_slice(&encode(&vec![1u8, 2, 3]));
assert_eq!(encoded, expected);
}
#[test]
fn test_array_decoding() {
let mut data = vec![0x83]; data.extend_from_slice(&encode(&100u64));
data.extend_from_slice(&encode(&"world".to_string()));
data.extend_from_slice(&encode(&vec![4u8, 5, 6]));
let decoded = decode::<TestArray>(&data).unwrap();
assert_eq!(decoded.first, 100);
assert_eq!(decoded.second, "world");
assert_eq!(decoded.third, vec![4, 5, 6]);
}
#[test]
fn test_array_rejection() {
let mut data = vec![0x82]; data.extend_from_slice(&encode(&42u64));
data.extend_from_slice(&encode(&"test".to_string()));
let result = decode::<TestArray>(&data);
assert!(result.is_err());
match result.unwrap_err() {
Error::UnexpectedItemCount(2, 3) => {}
other => panic!("Expected UnexpectedItemCount(2, 3) error, got {:?}", other),
}
let mut data = vec![0x84]; data.extend_from_slice(&encode(&42u64));
data.extend_from_slice(&encode(&"test".to_string()));
data.extend_from_slice(&encode(&vec![1u8]));
data.extend_from_slice(&encode(&42u64));
let result = decode::<TestArray>(&data);
assert!(result.is_err());
match result.unwrap_err() {
Error::UnexpectedItemCount(4, 3) => {}
other => panic!("Expected UnexpectedItemCount(4, 3) error, got {:?}", other),
}
}
#[derive(Debug, PartialEq, Cbor)]
struct TestMap {
#[cbor(key = 1)]
key1: u64,
#[cbor(key = 2)]
key2: u64,
#[cbor(key = -1)]
key_neg1: u64,
}
#[test]
fn test_map_encoding() {
let map = TestMap {
key1: 42,
key2: 67,
key_neg1: 100,
};
let encoded = encode(&map);
assert_eq!(encoded[0], 0xa3); assert_eq!(encoded[1], 0x01); assert_eq!(encoded[2], 0x18);
assert_eq!(encoded[3], 42);
assert_eq!(encoded[4], 0x02); assert_eq!(encoded[5], 0x18);
assert_eq!(encoded[6], 67);
assert_eq!(encoded[7], 0x20); assert_eq!(encoded[8], 0x18);
assert_eq!(encoded[9], 100);
}
#[test]
fn test_map_decoding() {
let decoded = decode::<TestMap>(&vec![
0xa3, 0x01, 0x18, 0x2a, 0x02, 0x18, 0x43, 0x20, 0x18, 0x64, ])
.unwrap();
assert_eq!(decoded.key1, 42);
assert_eq!(decoded.key2, 67);
assert_eq!(decoded.key_neg1, 100);
}
#[test]
fn test_map_rejection() {
let result = decode::<TestMap>(&vec![
0xa3, 0x02, 0x18, 0x43, 0x01, 0x18, 0x2a, 0x20, 0x18, 0x64, ]);
assert!(result.is_err());
let result = decode::<TestMap>(&vec![
0xa3, 0x05, 0x18, 0x2a, 0x02, 0x18, 0x43, 0x20, 0x18, 0x64, ]);
assert!(result.is_err());
}
#[test]
fn test_raw_encoding() {
let raw = Raw(vec![0x18, 0x2a]);
assert_eq!(encode(&raw), vec![0x18, 0x2a]);
let raw = Raw(vec![0x65, 0x68, 0x65, 0x6c, 0x6c, 0x6f]);
assert_eq!(encode(&raw), vec![0x65, 0x68, 0x65, 0x6c, 0x6c, 0x6f]);
let raw = Raw(vec![0x01]);
let encoded = encode(&("method", raw));
assert_eq!(
encoded,
vec![
0x82, 0x66, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x01 ]
);
}
#[test]
fn test_raw_decoding() {
let data = vec![0x18, 0x2a];
let raw: Raw = decode(&data).unwrap();
assert_eq!(raw.0, vec![0x18, 0x2a]);
let data = vec![0x65, 0x68, 0x65, 0x6c, 0x6c, 0x6f];
let raw: Raw = decode(&data).unwrap();
assert_eq!(raw.0, vec![0x65, 0x68, 0x65, 0x6c, 0x6c, 0x6f]);
let data = vec![
0x82, 0x66, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x82, 0x01, 0x63, 0x61, 0x72, 0x67, ];
let (method, params): (String, Raw) = decode(&data).unwrap();
assert_eq!(method, "method");
assert_eq!(params.0, vec![0x82, 0x01, 0x63, 0x61, 0x72, 0x67]);
}
#[test]
fn test_raw_rejection() {
let data = vec![0xc0, 0x01]; assert!(matches!(
decode::<Raw>(&data),
Err(Error::UnsupportedType(6))
));
let data = vec![0xf5]; assert!(decode::<Raw>(&data).is_ok());
let data = vec![0xf9, 0x3c, 0x00]; assert!(matches!(
decode::<Raw>(&data),
Err(Error::UnsupportedType(7))
));
let data = vec![0x18, 0x2a, 0x00]; assert!(matches!(decode::<Raw>(&data), Err(Error::TrailingBytes)));
}
#[test]
fn test_verify() {
assert!(verify(&encode(&42u64)).is_ok());
assert!(verify(&encode(&-42i64)).is_ok());
assert!(verify(&encode(&"hello")).is_ok());
assert!(verify(&encode(&vec![1u8, 2, 3])).is_ok());
assert!(verify(&encode(&())).is_ok());
assert!(verify(&encode(&(42u64, "test"))).is_ok());
assert!(verify(&encode(&(-42i64, "test"))).is_ok());
assert!(
verify(&encode(&TestMap {
key1: 1,
key2: 2,
key_neg1: 3,
}))
.is_ok()
);
let mut large_uint = vec![MAJOR_UINT << 5 | INFO_UINT64];
large_uint.extend_from_slice(&u64::MAX.to_be_bytes());
assert!(verify(&large_uint).is_ok());
let mut large_nint = vec![MAJOR_NINT << 5 | INFO_UINT64];
large_nint.extend_from_slice(&u64::MAX.to_be_bytes());
assert!(verify(&large_nint).is_ok());
let mut bad_data = encode(&42u64);
bad_data.push(0x00);
assert!(verify(&bad_data).is_err());
match verify(&bad_data).unwrap_err() {
Error::TrailingBytes => {}
other => panic!("Expected TrailingBytes error, got {:?}", other),
}
let map_str_key = vec![0xa1, 0x61, 0x61, 0x61, 0x62]; assert!(verify(&map_str_key).is_err());
match verify(&map_str_key).unwrap_err() {
Error::InvalidMajorType(3, 0) => {} other => panic!(
"Expected InvalidMajorType error for string key, got {:?}",
other
),
}
let tagged_data = vec![
0xc0, 0x74, 0x32, 0x30, 0x31, 0x33, 0x2d, 0x30, 0x33, 0x2d, 0x32, 0x31, 0x54, 0x32,
0x30, 0x3a, 0x30, 0x34, 0x3a, 0x30, 0x30, 0x5a,
]; assert!(verify(&tagged_data).is_err());
match verify(&tagged_data).unwrap_err() {
Error::UnsupportedType(6) => {}
other => panic!("Expected UnsupportedType(6) error, got {:?}", other),
}
assert!(verify(&encode(&false)).is_ok());
assert!(verify(&encode(&true)).is_ok());
assert!(verify(&encode(&None::<u64>)).is_ok());
let undefined_val = vec![0xf7];
assert!(verify(&undefined_val).is_err());
match verify(&undefined_val).unwrap_err() {
Error::UnsupportedType(7) => {}
other => panic!("Expected UnsupportedType(7) error, got {:?}", other),
}
let float16 = vec![0xf9, 0x3c, 0x00]; assert!(verify(&float16).is_err());
match verify(&float16).unwrap_err() {
Error::UnsupportedType(7) => {}
other => panic!("Expected UnsupportedType(7) error, got {:?}", other),
}
let float32 = vec![0xfa, 0x3f, 0x80, 0x00, 0x00]; assert!(verify(&float32).is_err());
match verify(&float32).unwrap_err() {
Error::UnsupportedType(7) => {}
other => panic!("Expected UnsupportedType(7) error, got {:?}", other),
}
let float64 = vec![0xfb, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; assert!(verify(&float64).is_err());
match verify(&float64).unwrap_err() {
Error::UnsupportedType(7) => {}
other => panic!("Expected UnsupportedType(7) error, got {:?}", other),
}
let invalid_text = vec![0x61, 0xff]; assert!(verify(&invalid_text).is_err());
match verify(&invalid_text).unwrap_err() {
Error::InvalidUtf8 => {}
other => panic!("Expected InvalidUtf8 error, got {:?}", other),
}
let non_canonical = vec![0x18, 0x10]; assert!(verify(&non_canonical).is_err());
match verify(&non_canonical).unwrap_err() {
Error::NonCanonical => {}
other => panic!("Expected NonCanonical error, got {:?}", other),
}
let nested_bool = vec![0x81, 0xf4]; assert!(verify(&nested_bool).is_ok());
let nested_float = vec![0x81, 0xf9, 0x3c, 0x00]; assert!(verify(&nested_float).is_err());
match verify(&nested_float).unwrap_err() {
Error::UnsupportedType(7) => {}
other => panic!("Expected UnsupportedType(7) error, got {:?}", other),
}
let incomplete = vec![0x61]; assert!(verify(&incomplete).is_err());
match verify(&incomplete).unwrap_err() {
Error::UnexpectedEof => {}
other => panic!("Expected UnexpectedEof error, got {:?}", other),
}
let invalid_info = vec![0x1c]; assert!(verify(&invalid_info).is_err());
match verify(&invalid_info).unwrap_err() {
Error::InvalidAdditionalInfo(28) => {}
other => panic!("Expected InvalidAdditionalInfo(28) error, got {:?}", other),
}
}
#[test]
fn test_issue_3() {
let encoded = vec![123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255];
let result = decode::<String>(&encoded);
assert!(result.is_err());
}
#[test]
fn test_max_nesting_depth() {
let mut at_limit = vec![0x81u8; MAX_DEPTH - 1];
at_limit.push(0x00);
assert!(verify(&at_limit).is_ok());
let mut over_limit = vec![0x81u8; MAX_DEPTH + 1];
over_limit.push(0x00);
assert_eq!(verify(&over_limit), Err(Error::MaxDepthExceeded(MAX_DEPTH)));
}
}