rc5_cipher/
word.rs

1pub trait Word:
2    std::cmp::PartialEq
3    + std::fmt::Debug
4    + Copy
5    + num::traits::WrappingAdd
6    + num::traits::WrappingSub
7    + num::traits::WrappingShl
8    + num::traits::WrappingShr
9    + std::ops::BitAnd<Output = Self>
10    + std::ops::BitOr<Output = Self>
11    + std::ops::BitXor<Output = Self>
12    + std::ops::Shl<Output = Self>
13    + std::ops::Shr<Output = Self>
14{
15    const ZERO: Self;
16    const BYTES: usize;
17    const P: Self;
18    const Q: Self;
19
20    fn from_usize(val: usize) -> Self;
21    fn from_u8(val: u8) -> Self;
22}
23
24impl Word for u8 {
25    const ZERO: Self = 0u8;
26    const BYTES: usize = 1;
27    const P: Self = 0xB7u8;
28    const Q: Self = 0x9Fu8;
29
30    fn from_usize(val: usize) -> Self {
31        val as Self
32    }
33
34    fn from_u8(val: u8) -> Self {
35        val as Self
36    }
37}
38
39impl Word for u16 {
40    const ZERO: Self = 0u16;
41    const BYTES: usize = 2;
42    const P: Self = 0xB7E1u16;
43    const Q: Self = 0x9E37u16;
44
45    fn from_usize(val: usize) -> Self {
46        val as Self
47    }
48
49    fn from_u8(val: u8) -> Self {
50        val as Self
51    }
52}
53
54impl Word for u32 {
55    const ZERO: Self = 0u32;
56    const BYTES: usize = 4;
57    const P: Self = 0xB7E15163u32;
58    const Q: Self = 0x9E3779B9u32;
59
60    fn from_usize(val: usize) -> Self {
61        val as Self
62    }
63
64    fn from_u8(val: u8) -> Self {
65        val as Self
66    }
67}
68
69impl Word for u64 {
70    const ZERO: Self = 0u64;
71    const BYTES: usize = 8;
72    const P: Self = 0xB7E151628AED2A6Bu64;
73    const Q: Self = 0x9E3779B97F4A7C15u64;
74
75    fn from_usize(val: usize) -> Self {
76        val as Self
77    }
78
79    fn from_u8(val: u8) -> Self {
80        val as Self
81    }
82}
83
84impl Word for u128 {
85    const ZERO: Self = 0u128;
86    const BYTES: usize = 16;
87    const P: Self = 0xB7E151628AED2A6ABF7158809CF4F3C7u128;
88    const Q: Self = 0x9E3779B97F4A7C15F39CC0605CEDC835u128;
89
90    fn from_usize(val: usize) -> Self {
91        val as Self
92    }
93
94    fn from_u8(val: u8) -> Self {
95        val as Self
96    }
97}