libcrux_secrets/
traits.rs

1/// A trait for public types that can be classified into secret types
2pub trait Classify {
3    type Classified;
4    fn classify(self) -> Self::Classified;
5}
6
7/// A trait for classifying immutable references to public types
8pub trait ClassifyRef {
9    type ClassifiedRef;
10    fn classify_ref(self) -> Self::ClassifiedRef;
11}
12
13/// A trait for declassifying secret types into public types
14pub trait Declassify {
15    type Declassified;
16    fn declassify(self) -> Self::Declassified;
17}
18
19/// A trait for declassifying references to secret types
20pub trait DeclassifyRef {
21    type DeclassifiedRef;
22    fn declassify_ref(self) -> Self::DeclassifiedRef;
23}
24
25/// A trait for classifying mutable references to public types
26pub trait ClassifyRefMut {
27    type ClassifiedRefMut;
28    fn classify_ref_mut(self) -> Self::ClassifiedRefMut;
29}
30
31/// A trait for declassifying mutable references to secret types
32pub trait DeclassifyRefMut {
33    type DeclassifiedRefMut;
34    fn declassify_ref_mut(self) -> Self::DeclassifiedRefMut;
35}
36
37/// Marker trait for scalar types (machine integers)
38pub trait Scalar: Copy {}
39
40impl Scalar for u8 {}
41impl Scalar for u16 {}
42impl Scalar for u32 {}
43impl Scalar for u64 {}
44#[cfg(not(eurydice))]
45impl Scalar for u128 {}
46
47impl Scalar for i8 {}
48impl Scalar for i16 {}
49impl Scalar for i32 {}
50impl Scalar for i64 {}
51#[cfg(not(eurydice))]
52impl Scalar for i128 {}
53
54/// A trait for integer operations provided by Rust for machine integers
55pub trait IntOps
56where
57    Self: Sized,
58{
59    fn wrapping_add<T: Into<Self>>(self, rhs: T) -> Self;
60    fn wrapping_sub<T: Into<Self>>(self, rhs: T) -> Self;
61    fn wrapping_mul<T: Into<Self>>(self, rhs: T) -> Self;
62    fn wrapping_neg(self) -> Self;
63    fn rotate_left(self, rhs: u32) -> Self;
64    fn rotate_right(self, rhs: u32) -> Self;
65}
66
67/// A trait for byte conversion operations provided by Rust for machine integers
68pub trait EncodeOps<T, const N: usize> {
69    fn to_le_bytes(&self) -> [T; N];
70    fn to_be_bytes(&self) -> [T; N];
71
72    fn from_le_bytes(x: [T; N]) -> Self;
73    fn from_be_bytes(x: [T; N]) -> Self;
74}
75
76// SIMD values are also scalars
77#[cfg(target_arch = "x86")]
78impl Scalar for core::arch::x86::__m128i {}
79
80#[cfg(target_arch = "x86")]
81impl Scalar for core::arch::x86::__m256i {}
82
83#[cfg(target_arch = "x86")]
84impl Scalar for core::arch::x86::__m256 {}
85
86#[cfg(target_arch = "x86_64")]
87impl Scalar for core::arch::x86_64::__m128i {}
88
89#[cfg(target_arch = "x86_64")]
90impl Scalar for core::arch::x86_64::__m256i {}
91
92#[cfg(target_arch = "x86_64")]
93impl Scalar for core::arch::x86_64::__m256 {}
94
95#[cfg(target_arch = "aarch64")]
96impl Scalar for core::arch::aarch64::int8x8_t {}
97
98#[cfg(target_arch = "aarch64")]
99impl Scalar for core::arch::aarch64::int8x16_t {}
100
101#[cfg(target_arch = "aarch64")]
102impl Scalar for core::arch::aarch64::int16x4_t {}
103
104#[cfg(target_arch = "aarch64")]
105impl Scalar for core::arch::aarch64::int16x8_t {}
106
107#[cfg(target_arch = "aarch64")]
108impl Scalar for core::arch::aarch64::int32x2_t {}
109
110#[cfg(target_arch = "aarch64")]
111impl Scalar for core::arch::aarch64::int32x4_t {}
112
113#[cfg(target_arch = "aarch64")]
114impl Scalar for core::arch::aarch64::int64x1_t {}
115
116#[cfg(target_arch = "aarch64")]
117impl Scalar for core::arch::aarch64::int64x2_t {}
118
119#[cfg(target_arch = "aarch64")]
120impl Scalar for core::arch::aarch64::uint8x8_t {}
121
122#[cfg(target_arch = "aarch64")]
123impl Scalar for core::arch::aarch64::uint8x16_t {}
124
125#[cfg(target_arch = "aarch64")]
126impl Scalar for core::arch::aarch64::uint16x4_t {}
127
128#[cfg(target_arch = "aarch64")]
129impl Scalar for core::arch::aarch64::uint16x8_t {}
130
131#[cfg(target_arch = "aarch64")]
132impl Scalar for core::arch::aarch64::uint32x2_t {}
133
134#[cfg(target_arch = "aarch64")]
135impl Scalar for core::arch::aarch64::uint32x4_t {}
136
137#[cfg(target_arch = "aarch64")]
138impl Scalar for core::arch::aarch64::uint64x1_t {}
139
140#[cfg(target_arch = "aarch64")]
141impl Scalar for core::arch::aarch64::uint64x2_t {}