[go: up one dir, main page]

des/
tdes.rs

1//! Triple DES (3DES) block ciphers.
2
3use 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/// Triple DES (3DES) block cipher.
14#[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/// Triple DES (3DES) block cipher.
75#[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/// Triple DES (3DES) block cipher.
136#[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/// Triple DES (3DES) block cipher.
194#[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);