#![cfg(all(any(unix, windows), feature = "alloc", feature = "heapless"))]
#![allow(clippy::std_instead_of_alloc)]
use der::{DerOrd, asn1::SetOfVec};
use proptest::{prelude::*, string::*};
use std::collections::BTreeSet;
proptest! {
#[test]
fn sort_equiv(bytes in bytes_regex(".{0,64}").unwrap()) {
let mut uniq = BTreeSet::new();
if bytes.iter().copied().all(move |x| uniq.insert(x)) {
let mut expected = bytes.clone();
expected.sort_by(|a, b| a.der_cmp(b).unwrap());
let set = SetOfVec::try_from(bytes).unwrap();
prop_assert_eq!(expected.as_slice(), set.as_slice());
}
}
}
mod encoding_order {
use der::{
Decode, Encode,
asn1::{Any, AnyRef, SetOfRef, SetOfVec},
};
use hex_literal::hex;
const SORTED: &[u8] = &hex!("3105 130161 3000");
#[test]
fn setofvec_encodes_in_octet_order() {
let mut set = SetOfVec::new();
set.insert(Any::from_der(&hex!("3000")).unwrap()).unwrap();
set.insert(Any::from_der(&hex!("130161")).unwrap()).unwrap();
assert_eq!(set.to_der().unwrap(), SORTED);
}
#[test]
fn setofref_accepts_octet_order() {
let set = SetOfRef::<AnyRef<'_>>::from_der(SORTED).unwrap();
assert_eq!(set.to_der().unwrap(), SORTED);
}
#[test]
fn constructed_bit_before_tag_number() {
let mut set = SetOfVec::new();
set.insert(Any::from_der(&hex!("6000")).unwrap()).unwrap();
set.insert(Any::from_der(&hex!("5d00")).unwrap()).unwrap();
assert_eq!(set.to_der().unwrap(), hex!("3104 5d00 6000"));
}
}
#[cfg(all(feature = "derive", feature = "oid"))]
mod ordering {
use der::{
Decode, Sequence, ValueOrd,
asn1::{AnyRef, ObjectIdentifier, SetOf, SetOfVec},
};
use hex_literal::hex;
#[derive(Copy, Clone, Debug, Eq, PartialEq, Sequence, ValueOrd)]
pub struct AttributeTypeAndValue<'a> {
pub oid: ObjectIdentifier,
pub value: AnyRef<'a>,
}
const OUT_OF_ORDER_RDN_EXAMPLE: &[u8] =
&hex!("311F301106035504030C0A4A4F484E20534D495448300A060355040A0C03313233");
#[test]
fn allow_out_of_order_setof() {
assert!(SetOf::<AttributeTypeAndValue<'_>, 2>::from_der(OUT_OF_ORDER_RDN_EXAMPLE).is_ok());
}
#[test]
fn allow_out_of_order_setofvec() {
assert!(SetOfVec::<AttributeTypeAndValue<'_>>::from_der(OUT_OF_ORDER_RDN_EXAMPLE).is_ok());
}
#[test]
fn ordering_regression() {
let der_bytes = hex!(
"3139301906035504030C12546573742055736572393031353734333830301C060A0992268993F22C640101130E3437303031303030303134373333"
);
let set = SetOf::<AttributeTypeAndValue<'_>, 3>::from_der(&der_bytes).unwrap();
let attr1 = set.get(0).unwrap();
assert_eq!(ObjectIdentifier::new("2.5.4.3").unwrap(), attr1.oid);
}
}
mod utctime_order {
use der::{
Decode, Encode,
asn1::{SetOfVec, UtcTime},
};
use hex_literal::hex;
const Y1999: [u8; 15] = hex!("170d 3939313233313233353935395a");
const Y2000: [u8; 15] = hex!("170d 3030303130313030303030305a");
#[test]
fn setofvec_utctime_encodes_in_octet_order() {
let mut set = SetOfVec::new();
set.insert(UtcTime::from_der(&Y1999).unwrap()).unwrap();
set.insert(UtcTime::from_der(&Y2000).unwrap()).unwrap();
let mut want = hex!("311e").to_vec();
want.extend_from_slice(&Y2000);
want.extend_from_slice(&Y1999);
assert_eq!(set.to_der().unwrap(), want);
}
}