| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434 |
- //! Test that the [`libthreema_macros::ConstantTimeEq`] works as expected.
- #![expect(unused_crate_dependencies, reason = "False positive")]
- #![expect(
- clippy::single_char_lifetime_names,
- single_use_lifetimes,
- reason = "Test lifetimes"
- )]
- use libthreema_macros::ConstantTimeEq;
- #[derive(Clone, Copy, ConstantTimeEq, Debug)]
- struct NamedField {
- data: [u8; 3],
- }
- #[derive(ConstantTimeEq, Debug)]
- struct NamedFields {
- data1: [u8; 3],
- data2: u64,
- }
- #[derive(ConstantTimeEq, Debug)]
- struct NamedFieldsBorrowed<'a> {
- data1: &'a [u8],
- data2: u64,
- }
- #[derive(ConstantTimeEq, Debug)]
- struct NamedFieldsMultipleBorrowed<'a, 'b> {
- data1: &'a [u8],
- data2: &'b [u8],
- }
- #[derive(Clone, Copy, ConstantTimeEq, Debug)]
- struct UnnamedField(NamedField);
- #[derive(Clone, Copy, ConstantTimeEq, Debug)]
- struct UnnamedArrayField([u8; 3]);
- #[derive(Clone, Copy, ConstantTimeEq, Debug)]
- struct UnnamedFields(u32, u64, u32);
- #[derive(ConstantTimeEq, Debug)]
- struct NamedFieldWithInnerUnnamedField {
- data: UnnamedField,
- }
- #[derive(ConstantTimeEq, Debug)]
- struct NamedFieldWithInnerUnnamedFields {
- data: UnnamedFields,
- }
- #[derive(ConstantTimeEq, Debug)]
- struct NamedFieldWithInnerUnnamedArrayField {
- data: UnnamedArrayField,
- }
- #[derive(ConstantTimeEq, Debug)]
- struct NamedFieldsWithInnerUnnamedField {
- data1: UnnamedField,
- data2: u64,
- }
- #[derive(ConstantTimeEq, Debug)]
- struct NamedFieldsWithInnerUnnamedFields {
- data1: UnnamedFields,
- data2: u64,
- }
- #[derive(ConstantTimeEq, Debug)]
- struct NamedFieldsWithInnerUnnamedArrayField {
- data1: UnnamedArrayField,
- data2: u64,
- }
- #[cfg(test)]
- mod test {
- use rstest::rstest;
- use subtle::ConstantTimeEq as _;
- use crate::*;
- #[test]
- fn ct_eq_named_field() {
- let left = NamedField { data: [3; 3] };
- let right = NamedField { data: [3; 3] };
- assert!(bool::from(left.ct_eq(&right)));
- assert_eq!(left, right);
- }
- #[rstest]
- #[case([1, 0, 0])]
- #[case([0, 1, 1])]
- #[case([1, 1, 1])]
- fn ct_not_eq_named_field(#[case] right: [u8; 3]) {
- let left = NamedField { data: [0; 3] };
- let right = NamedField { data: right };
- assert!(bool::from(!left.ct_eq(&right)));
- assert_ne!(left, right);
- }
- #[test]
- fn ct_eq_named_fields() {
- let left = NamedFields {
- data1: [45; 3],
- data2: 3,
- };
- let right = NamedFields {
- data1: [45; 3],
- data2: 3,
- };
- assert!(bool::from(left.ct_eq(&right)));
- assert_eq!(left, right);
- }
- #[rstest]
- #[case(([87; 3], 3))]
- #[case(([45; 3], 2))]
- #[case(([34; 3], 5))]
- fn ct_not_eq_named_fields(#[case] right: ([u8; 3], u64)) {
- let left = NamedFields {
- data1: [45; 3],
- data2: 3,
- };
- let right = NamedFields {
- data1: right.0,
- data2: right.1,
- };
- assert!(bool::from(!left.ct_eq(&right)));
- assert_ne!(left, right);
- }
- #[test]
- fn ct_eq_unnamed_array_field() {
- let left = UnnamedArrayField([3; 3]);
- let right = UnnamedArrayField([3; 3]);
- assert!(bool::from(left.ct_eq(&right)));
- assert_eq!(left, right);
- }
- #[rstest]
- #[case([0, 0, 1])]
- #[case([1, 1, 0])]
- #[case([1, 1, 1])]
- fn ct_not_eq_unnamed_array_field(#[case] right: [u8; 3]) {
- let left = UnnamedArrayField([0, 0, 0]);
- let right = UnnamedArrayField(right);
- assert!(bool::from(!left.ct_eq(&right)));
- assert_ne!(left, right);
- }
- #[test]
- fn ct_eq_unnamed_field() {
- let left = UnnamedField(NamedField { data: [23; 3] });
- let right = UnnamedField(NamedField { data: [23; 3] });
- assert!(bool::from(left.ct_eq(&right)));
- assert_eq!(left, right);
- }
- #[rstest]
- #[case([0, 1, 0])]
- #[case([0, 1, 1])]
- #[case([1, 1, 1])]
- fn ct_not_eq_unnamed_field(#[case] right: [u8; 3]) {
- let left = UnnamedField(NamedField { data: [0; 3] });
- let right = UnnamedField(NamedField { data: right });
- assert!(bool::from(!left.ct_eq(&right)));
- assert_ne!(left, right);
- }
- #[test]
- fn ct_eq_unnamed_fields() {
- let left = UnnamedFields(109, 2, 35);
- let right = UnnamedFields(109, 2, 35);
- assert!(bool::from(left.ct_eq(&right)));
- assert_eq!(left, right);
- }
- #[rstest]
- #[case((0, 0, 1))]
- #[case((0, 1, 0))]
- #[case((0, 1, 1))]
- #[case((1, 0, 0))]
- #[case((1, 0, 1))]
- #[case((1, 1, 0))]
- #[case((1, 1, 1))]
- fn ct_not_eq_unnamed_fields(#[case] right: (u32, u64, u32)) {
- let left = UnnamedFields(0, 0, 0);
- let right = UnnamedFields(right.0, right.1, right.2);
- assert!(bool::from(!left.ct_eq(&right)));
- assert_ne!(left, right);
- }
- #[test]
- fn ct_eq_named_field_with_inner_unnamed_field() {
- let left = NamedFieldWithInnerUnnamedField {
- data: UnnamedField(NamedField { data: [23; 3] }),
- };
- let right = NamedFieldWithInnerUnnamedField {
- data: UnnamedField(NamedField { data: [23; 3] }),
- };
- assert!(bool::from(left.ct_eq(&right)));
- assert_eq!(left, right);
- }
- #[rstest]
- #[case([0, 0, 1])]
- #[case([0, 1, 1])]
- #[case([1, 1, 1])]
- fn ct_not_eq_named_field_with_inner_unnamed_field(#[case] right: [u8; 3]) {
- let left = NamedFieldWithInnerUnnamedField {
- data: UnnamedField(NamedField { data: [0; 3] }),
- };
- let right = NamedFieldWithInnerUnnamedField {
- data: UnnamedField(NamedField { data: right }),
- };
- assert!(bool::from(!left.ct_eq(&right)));
- assert_ne!(left, right);
- }
- #[test]
- fn ct_eq_named_field_with_inner_unnamed_fields() {
- let left = NamedFieldWithInnerUnnamedFields {
- data: UnnamedFields(109, 2, 35),
- };
- let right = NamedFieldWithInnerUnnamedFields {
- data: UnnamedFields(109, 2, 35),
- };
- assert!(bool::from(left.ct_eq(&right)));
- assert_eq!(left, right);
- }
- #[rstest]
- #[case((0, 0, 1))]
- #[case((0, 1, 0))]
- #[case((0, 1, 1))]
- #[case((1, 0, 0))]
- #[case((1, 0, 1))]
- #[case((1, 1, 0))]
- #[case((1, 1, 1))]
- fn ct_not_eq_named_field_with_inner_unnamed_fields(#[case] right: (u32, u64, u32)) {
- let left = NamedFieldWithInnerUnnamedFields {
- data: UnnamedFields(0, 0, 0),
- };
- let right = NamedFieldWithInnerUnnamedFields {
- data: UnnamedFields(right.0, right.1, right.2),
- };
- assert!(bool::from(!left.ct_eq(&right)));
- assert_ne!(left, right);
- }
- #[test]
- fn ct_eq_named_field_with_inner_unnamed_array_field() {
- let left = NamedFieldWithInnerUnnamedArrayField {
- data: UnnamedArrayField([75; 3]),
- };
- let right = NamedFieldWithInnerUnnamedArrayField {
- data: UnnamedArrayField([75; 3]),
- };
- assert!(bool::from(left.ct_eq(&right)));
- assert_eq!(left, right);
- }
- #[rstest]
- #[case([0, 0, 1])]
- #[case([1, 1, 0])]
- #[case([1, 1, 1])]
- fn ct_not_eq_named_field_with_inner_unnamed_array_field(#[case] right: [u8; 3]) {
- let left = NamedFieldWithInnerUnnamedArrayField {
- data: UnnamedArrayField([0; 3]),
- };
- let right = NamedFieldWithInnerUnnamedArrayField {
- data: UnnamedArrayField(right),
- };
- assert!(bool::from(!left.ct_eq(&right)));
- assert_ne!(left, right);
- }
- #[test]
- fn ct_eq_named_fields_with_inner_unnamed_field() {
- let left = NamedFieldsWithInnerUnnamedField {
- data1: UnnamedField(NamedField { data: [23; 3] }),
- data2: 3,
- };
- let right = NamedFieldsWithInnerUnnamedField {
- data1: UnnamedField(NamedField { data: [23; 3] }),
- data2: 3,
- };
- assert!(bool::from(left.ct_eq(&right)));
- assert_eq!(left, right);
- }
- #[rstest]
- #[case(([0, 0, 0], 1))]
- #[case(([1, 0, 1], 0))]
- #[case(([1, 1, 0], 1))]
- fn ct_not_eq_named_fields_with_inner_unnamed_field(#[case] right: ([u8; 3], u64)) {
- let left = NamedFieldsWithInnerUnnamedField {
- data1: UnnamedField(NamedField { data: [0; 3] }),
- data2: 0,
- };
- let right = NamedFieldsWithInnerUnnamedField {
- data1: UnnamedField(NamedField { data: right.0 }),
- data2: right.1,
- };
- assert!(bool::from(!left.ct_eq(&right)));
- assert_ne!(left, right);
- }
- #[test]
- fn ct_eq_named_fields_with_inner_unnamed_fields() {
- let left = NamedFieldsWithInnerUnnamedFields {
- data1: UnnamedFields(109, 2, 35),
- data2: 8,
- };
- let right = NamedFieldsWithInnerUnnamedFields {
- data1: UnnamedFields(109, 2, 35),
- data2: 8,
- };
- assert!(bool::from(left.ct_eq(&right)));
- assert_eq!(left, right);
- }
- #[rstest]
- #[case((0, 0, 0, 1))]
- #[case((0, 1, 0, 0))]
- #[case((1, 1, 1, 0))]
- #[case((1, 1, 0, 1))]
- fn ct_not_eq_named_fields_with_inner_unnamed_fields(#[case] right: (u32, u64, u32, u64)) {
- let left = NamedFieldsWithInnerUnnamedFields {
- data1: UnnamedFields(0, 0, 0),
- data2: 0,
- };
- let right = NamedFieldsWithInnerUnnamedFields {
- data1: UnnamedFields(right.0, right.1, right.2),
- data2: right.3,
- };
- assert!(bool::from(!left.ct_eq(&right)));
- assert_ne!(left, right);
- }
- #[test]
- fn ct_eq_named_fields_with_inner_unnamed_array_field() {
- let left = NamedFieldsWithInnerUnnamedArrayField {
- data1: UnnamedArrayField([75; 3]),
- data2: 5,
- };
- let right = NamedFieldsWithInnerUnnamedArrayField {
- data1: UnnamedArrayField([75; 3]),
- data2: 5,
- };
- assert!(bool::from(left.ct_eq(&right)));
- assert_eq!(left, right);
- }
- #[rstest]
- #[case(([0, 0, 1], 0))]
- #[case(([0, 0, 0], 1))]
- #[case(([0, 1, 1], 1))]
- fn ct_not_eq_named_fields_with_inner_unnamed_array_field(#[case] right: ([u8; 3], u64)) {
- let left = NamedFieldsWithInnerUnnamedArrayField {
- data1: UnnamedArrayField([0; 3]),
- data2: 0,
- };
- let right = NamedFieldsWithInnerUnnamedArrayField {
- data1: UnnamedArrayField(right.0),
- data2: right.1,
- };
- assert!(bool::from(!left.ct_eq(&right)));
- assert_ne!(left, right);
- }
- #[test]
- fn ct_eq_named_fields_borrowed() {
- let left = NamedFieldsBorrowed {
- data1: &[75; 3],
- data2: 5,
- };
- let right = NamedFieldsBorrowed {
- data1: &[75; 3],
- data2: 5,
- };
- assert!(bool::from(left.ct_eq(&right)));
- assert_eq!(left, right);
- }
- #[rstest]
- #[case(([0, 0, 0], 1))]
- #[case(([0, 0, 1], 0))]
- #[case(([1, 1, 1], 1))]
- fn ct_not_eq_named_fields_borrowed(#[case] right: ([u8; 3], u64)) {
- let left = NamedFieldsBorrowed {
- data1: &[0; 3],
- data2: 0,
- };
- let right = NamedFieldsBorrowed {
- data1: &right.0,
- data2: right.1,
- };
- assert!(bool::from(!left.ct_eq(&right)));
- assert_ne!(left, right);
- }
- #[test]
- fn ct_eq_named_fields_multiple_borrowed() {
- let left = NamedFieldsMultipleBorrowed {
- data1: &[75; 3],
- data2: &[38; 3],
- };
- let right = NamedFieldsMultipleBorrowed {
- data1: &[75; 3],
- data2: &[38; 3],
- };
- assert!(bool::from(left.ct_eq(&right)));
- assert_eq!(left, right);
- }
- #[rstest]
- #[case(([0, 0, 1], [0, 0, 0]))]
- #[case(([0, 0, 0], [0, 1, 1]))]
- #[case(([1, 1, 1], [1, 0, 0]))]
- fn ct_not_eq_named_fields_multiple_borrowed(#[case] right: ([u8; 3], [u8; 3])) {
- let left = NamedFieldsMultipleBorrowed {
- data1: &[0; 3],
- data2: &[0; 3],
- };
- let right = NamedFieldsMultipleBorrowed {
- data1: &right.0,
- data2: &right.1,
- };
- assert!(bool::from(!left.ct_eq(&right)));
- assert_ne!(left, right);
- }
- }
|