1use crate::des::{gen_keys, Des};
4use cipher::{
5 consts::{U16, U24, U8},
6 AlgorithmName, BlockCipher, Key, KeyInit, KeySizeUser,
7};
8use core::fmt;
9
10#[cfg(feature = "zeroize")]
11use cipher::zeroize::ZeroizeOnDrop;
12
13#[derive(Clone)]
15pub struct TdesEde3 {
16 d1: Des,
17 d2: Des,
18 d3: Des,
19}
20
21impl BlockCipher for TdesEde3 {}
22
23impl KeySizeUser for TdesEde3 {
24 type KeySize = U24;
25}
26
27impl KeyInit for TdesEde3 {
28 #[inline]
29 fn new(key: &Key<Self>) -> Self {
30 let k1 = u64::from_be_bytes(key[0..8].try_into().unwrap());
31 let k2 = u64::from_be_bytes(key[8..16].try_into().unwrap());
32 let k3 = u64::from_be_bytes(key[16..24].try_into().unwrap());
33 let d1 = Des { keys: gen_keys(k1) };
34 let d2 = Des { keys: gen_keys(k2) };
35 let d3 = Des { keys: gen_keys(k3) };
36 Self { d1, d2, d3 }
37 }
38}
39
40impl fmt::Debug for TdesEde3 {
41 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
42 f.write_str("TdesEee3 { ... }")
43 }
44}
45
46impl AlgorithmName for TdesEde3 {
47 fn write_alg_name(f: &mut fmt::Formatter<'_>) -> fmt::Result {
48 f.write_str("TdesEde3")
49 }
50}
51
52#[cfg(feature = "zeroize")]
53#[cfg_attr(docsrs, doc(cfg(feature = "zeroize")))]
54impl ZeroizeOnDrop for TdesEde3 {}
55
56cipher::impl_simple_block_encdec!(
57 TdesEde3, U8, cipher, block,
58 encrypt: {
59 let mut data = u64::from_be_bytes(block.clone_in().into());
60 data = cipher.d1.encrypt(data);
61 data = cipher.d2.decrypt(data);
62 data = cipher.d3.encrypt(data);
63 block.get_out().copy_from_slice(&data.to_be_bytes());
64 }
65 decrypt: {
66 let mut data = u64::from_be_bytes(block.clone_in().into());
67 data = cipher.d3.decrypt(data);
68 data = cipher.d2.encrypt(data);
69 data = cipher.d1.decrypt(data);
70 block.get_out().copy_from_slice(&data.to_be_bytes());
71 }
72);
73
74#[derive(Clone)]
76pub struct TdesEee3 {
77 d1: Des,
78 d2: Des,
79 d3: Des,
80}
81
82impl BlockCipher for TdesEee3 {}
83
84impl KeySizeUser for TdesEee3 {
85 type KeySize = U24;
86}
87
88impl KeyInit for TdesEee3 {
89 #[inline]
90 fn new(key: &Key<Self>) -> Self {
91 let k1 = u64::from_be_bytes(key[0..8].try_into().unwrap());
92 let k2 = u64::from_be_bytes(key[8..16].try_into().unwrap());
93 let k3 = u64::from_be_bytes(key[16..24].try_into().unwrap());
94 let d1 = Des { keys: gen_keys(k1) };
95 let d2 = Des { keys: gen_keys(k2) };
96 let d3 = Des { keys: gen_keys(k3) };
97 Self { d1, d2, d3 }
98 }
99}
100
101impl fmt::Debug for TdesEee3 {
102 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
103 f.write_str("TdesEee3 { ... }")
104 }
105}
106
107impl AlgorithmName for TdesEee3 {
108 fn write_alg_name(f: &mut fmt::Formatter<'_>) -> fmt::Result {
109 f.write_str("TdesEee3")
110 }
111}
112
113#[cfg(feature = "zeroize")]
114#[cfg_attr(docsrs, doc(cfg(feature = "zeroize")))]
115impl ZeroizeOnDrop for TdesEee3 {}
116
117cipher::impl_simple_block_encdec!(
118 TdesEee3, U8, cipher, block,
119 encrypt: {
120 let mut data = u64::from_be_bytes(block.clone_in().into());
121 data = cipher.d1.encrypt(data);
122 data = cipher.d2.encrypt(data);
123 data = cipher.d3.encrypt(data);
124 block.get_out().copy_from_slice(&data.to_be_bytes());
125 }
126 decrypt: {
127 let mut data = u64::from_be_bytes(block.clone_in().into());
128 data = cipher.d3.decrypt(data);
129 data = cipher.d2.decrypt(data);
130 data = cipher.d1.decrypt(data);
131 block.get_out().copy_from_slice(&data.to_be_bytes());
132 }
133);
134
135#[derive(Clone)]
137pub struct TdesEde2 {
138 d1: Des,
139 d2: Des,
140}
141
142impl BlockCipher for TdesEde2 {}
143
144impl KeySizeUser for TdesEde2 {
145 type KeySize = U16;
146}
147
148impl KeyInit for TdesEde2 {
149 #[inline]
150 fn new(key: &Key<Self>) -> Self {
151 let k1 = u64::from_be_bytes(key[0..8].try_into().unwrap());
152 let k2 = u64::from_be_bytes(key[8..16].try_into().unwrap());
153 let d1 = Des { keys: gen_keys(k1) };
154 let d2 = Des { keys: gen_keys(k2) };
155 Self { d1, d2 }
156 }
157}
158
159impl fmt::Debug for TdesEde2 {
160 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
161 f.write_str("TdesEde2 { ... }")
162 }
163}
164
165impl AlgorithmName for TdesEde2 {
166 fn write_alg_name(f: &mut fmt::Formatter<'_>) -> fmt::Result {
167 f.write_str("TdesEde2")
168 }
169}
170
171#[cfg(feature = "zeroize")]
172#[cfg_attr(docsrs, doc(cfg(feature = "zeroize")))]
173impl ZeroizeOnDrop for TdesEde2 {}
174
175cipher::impl_simple_block_encdec!(
176 TdesEde2, U8, cipher, block,
177 encrypt: {
178 let mut data = u64::from_be_bytes(block.clone_in().into());
179 data = cipher.d1.encrypt(data);
180 data = cipher.d2.decrypt(data);
181 data = cipher.d1.encrypt(data);
182 block.get_out().copy_from_slice(&data.to_be_bytes());
183 }
184 decrypt: {
185 let mut data = u64::from_be_bytes(block.clone_in().into());
186 data = cipher.d1.decrypt(data);
187 data = cipher.d2.encrypt(data);
188 data = cipher.d1.decrypt(data);
189 block.get_out().copy_from_slice(&data.to_be_bytes());
190 }
191);
192
193#[derive(Clone)]
195pub struct TdesEee2 {
196 d1: Des,
197 d2: Des,
198}
199
200impl BlockCipher for TdesEee2 {}
201
202impl KeySizeUser for TdesEee2 {
203 type KeySize = U16;
204}
205
206impl KeyInit for TdesEee2 {
207 #[inline]
208 fn new(key: &Key<Self>) -> Self {
209 let k1 = u64::from_be_bytes(key[0..8].try_into().unwrap());
210 let k2 = u64::from_be_bytes(key[8..16].try_into().unwrap());
211 let d1 = Des { keys: gen_keys(k1) };
212 let d2 = Des { keys: gen_keys(k2) };
213 Self { d1, d2 }
214 }
215}
216
217impl fmt::Debug for TdesEee2 {
218 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
219 f.write_str("TdesEee2 { ... }")
220 }
221}
222
223impl AlgorithmName for TdesEee2 {
224 fn write_alg_name(f: &mut fmt::Formatter<'_>) -> fmt::Result {
225 f.write_str("TdesEee2")
226 }
227}
228
229#[cfg(feature = "zeroize")]
230#[cfg_attr(docsrs, doc(cfg(feature = "zeroize")))]
231impl ZeroizeOnDrop for TdesEee2 {}
232
233cipher::impl_simple_block_encdec!(
234 TdesEee2, U8, cipher, block,
235 encrypt: {
236 let mut data = u64::from_be_bytes(block.clone_in().into());
237 data = cipher.d1.encrypt(data);
238 data = cipher.d2.encrypt(data);
239 data = cipher.d1.encrypt(data);
240 block.get_out().copy_from_slice(&data.to_be_bytes());
241 }
242 decrypt: {
243 let mut data = u64::from_be_bytes(block.clone_in().into());
244 data = cipher.d1.decrypt(data);
245 data = cipher.d2.decrypt(data);
246 data = cipher.d1.decrypt(data);
247 block.get_out().copy_from_slice(&data.to_be_bytes());
248 }
249);