10
10
#ifndef CRYPTO3_DES_H_
11
11
#define CRYPTO3_DES_H_
12
12
13
+ #include < boost/endian/arithmetic.hpp>
14
+
13
15
#include < nil/crypto3/block/detail/des/des_functions.hpp>
14
16
15
17
#include < nil/crypto3/block/detail/block_state_preprocessor.hpp>
@@ -89,7 +91,6 @@ namespace nil {
89
91
}
90
92
91
93
inline block_type encrypt_block (const block_type &plaintext) {
92
- block_type out = {0 };
93
94
uint64_t T = (policy_type::iptab1[plaintext[0 ]]) | (policy_type::iptab1[plaintext[1 ]] << 1 ) |
94
95
(policy_type::iptab1[plaintext[2 ]] << 2 ) | (policy_type::iptab1[plaintext[3 ]] << 3 ) |
95
96
(policy_type::iptab1[plaintext[4 ]] << 4 ) | (policy_type::iptab1[plaintext[5 ]] << 5 ) |
@@ -100,48 +101,42 @@ namespace nil {
100
101
101
102
policy_type::des_encrypt (L, R, round_key);
102
103
103
- T = (policy_type::fptab1[extract_uint_t <CHAR_BIT>(L, 0 )] << 5 ) |
104
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(L, 1 )] << 3 ) |
105
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(L, 2 )] << 1 ) |
106
- (policy_type::fptab2[extract_uint_t <CHAR_BIT>(L, 3 )] << 1 ) |
107
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(R, 0 )] << 4 ) |
108
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(R, 1 )] << 2 ) |
109
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(R, 2 )]) |
110
- (policy_type::fptab2[extract_uint_t <CHAR_BIT>(R, 3 )]);
111
- T = policy_type::rotl<32 >(T);
112
-
113
- store_be (T, out.data ());
114
-
115
- return out;
104
+ T = (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(L, 0 )] << 5 ) |
105
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(L, 1 )] << 3 ) |
106
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(L, 2 )] << 1 ) |
107
+ (policy_type::fptab2[policy_type::template extract_uint_t <CHAR_BIT>(L, 3 )] << 1 ) |
108
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(R, 0 )] << 4 ) |
109
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(R, 1 )] << 2 ) |
110
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(R, 2 )]) |
111
+ (policy_type::fptab2[policy_type::template extract_uint_t <CHAR_BIT>(R, 3 )]);
112
+ T = policy_type::template rotl<32 >(T);
113
+
114
+ return {boost::endian::big_to_native<typename block_type::value_type>(T)};
116
115
}
117
116
118
117
inline block_type decrypt_block (const block_type &ciphertext) {
119
- block_type out = {0 };
120
-
121
118
uint64_t T = (policy_type::iptab1[ciphertext[0 ]]) | (policy_type::iptab1[ciphertext[1 ]] << 1 ) |
122
119
(policy_type::iptab1[ciphertext[2 ]] << 2 ) | (policy_type::iptab1[ciphertext[3 ]] << 3 ) |
123
120
(policy_type::iptab1[ciphertext[4 ]] << 4 ) | (policy_type::iptab1[ciphertext[5 ]] << 5 ) |
124
121
(policy_type::iptab1[ciphertext[6 ]] << 6 ) | (policy_type::iptab2[ciphertext[7 ]]);
125
122
126
- word_type L = static_cast <uint32_t >(T >> word_bits);
127
- word_type R = static_cast <uint32_t >(T);
123
+ word_type L = static_cast <word_type >(T >> word_bits);
124
+ word_type R = static_cast <word_type >(T);
128
125
129
126
policy_type::des_decrypt (L, R, round_key);
130
127
131
- T = (policy_type::fptab1[extract_uint_t <CHAR_BIT>(L, 0 )] << 5 ) |
132
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(L, 1 )] << 3 ) |
133
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(L, 2 )] << 1 ) |
134
- (policy_type::fptab2[extract_uint_t <CHAR_BIT>(L, 3 )] << 1 ) |
135
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(R, 0 )] << 4 ) |
136
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(R, 1 )] << 2 ) |
137
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(R, 2 )]) |
138
- (policy_type::fptab2[extract_uint_t <CHAR_BIT>(R, 3 )]);
139
-
140
- T = policy_type::rotl<32 >(T);
128
+ T = (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(L, 0 )] << 5 ) |
129
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(L, 1 )] << 3 ) |
130
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(L, 2 )] << 1 ) |
131
+ (policy_type::fptab2[policy_type::template extract_uint_t <CHAR_BIT>(L, 3 )] << 1 ) |
132
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(R, 0 )] << 4 ) |
133
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(R, 1 )] << 2 ) |
134
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(R, 2 )]) |
135
+ (policy_type::fptab2[policy_type::template extract_uint_t <CHAR_BIT>(R, 3 )]);
141
136
142
- store_be (T, out. data () );
137
+ T = policy_type:: template rotl< 32 >(T );
143
138
144
- return out ;
139
+ return {boost::endian::big_to_native< typename block_type::value_type>(T)} ;
145
140
}
146
141
};
147
142
@@ -211,20 +206,18 @@ namespace nil {
211
206
policy_type::des_decrypt (R, L, &round_key[32 ]);
212
207
policy_type::des_encrypt (L, R, &round_key[64 ]);
213
208
214
- T = (policy_type::fptab1[extract_uint_t <CHAR_BIT>(L, 0 )] << 5 ) |
215
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(L, 1 )] << 3 ) |
216
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(L, 2 )] << 1 ) |
217
- (policy_type::fptab2[extract_uint_t <CHAR_BIT>(L, 3 )] << 1 ) |
218
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(R, 0 )] << 4 ) |
219
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(R, 1 )] << 2 ) |
220
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(R, 2 )]) |
221
- (policy_type::fptab2[extract_uint_t <CHAR_BIT>(R, 3 )]);
222
-
223
- T = policy_type::rotl<32 >(T);
209
+ T = (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(L, 0 )] << 5 ) |
210
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(L, 1 )] << 3 ) |
211
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(L, 2 )] << 1 ) |
212
+ (policy_type::fptab2[policy_type::template extract_uint_t <CHAR_BIT>(L, 3 )] << 1 ) |
213
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(R, 0 )] << 4 ) |
214
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(R, 1 )] << 2 ) |
215
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(R, 2 )]) |
216
+ (policy_type::fptab2[policy_type::template extract_uint_t <CHAR_BIT>(R, 3 )]);
224
217
225
- store_be (T, out. data () );
218
+ T = policy_type:: template rotl< 32 >(T );
226
219
227
- return out ;
220
+ return {boost::endian::big_to_native< typename block_type::value_type>(T)} ;
228
221
}
229
222
230
223
inline block_type decrypt_block (const block_type &ciphertext) {
@@ -234,27 +227,25 @@ namespace nil {
234
227
(policy_type::iptab1[ciphertext[4 ]] << 4 ) | (policy_type::iptab1[ciphertext[5 ]] << 5 ) |
235
228
(policy_type::iptab1[ciphertext[6 ]] << 6 ) | (policy_type::iptab2[ciphertext[7 ]]);
236
229
237
- word_type L = static_cast <uint32_t >(T >> word_bits);
238
- word_type R = static_cast <uint32_t >(T);
230
+ word_type L = static_cast <word_type >(T >> word_bits);
231
+ word_type R = static_cast <word_type >(T);
239
232
240
233
policy_type::des_decrypt (L, R, &round_key[64 ]);
241
234
policy_type::des_encrypt (R, L, &round_key[32 ]);
242
235
policy_type::des_decrypt (L, R, &round_key[0 ]);
243
236
244
- T = (policy_type::fptab1[extract_uint_t <CHAR_BIT>(L, 0 )] << 5 ) |
245
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(L, 1 )] << 3 ) |
246
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(L, 2 )] << 1 ) |
247
- (policy_type::fptab2[extract_uint_t <CHAR_BIT>(L, 3 )] << 1 ) |
248
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(R, 0 )] << 4 ) |
249
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(R, 1 )] << 2 ) |
250
- (policy_type::fptab1[extract_uint_t <CHAR_BIT>(R, 2 )]) |
251
- (policy_type::fptab2[extract_uint_t <CHAR_BIT>(R, 3 )]);
252
-
253
- T = policy_type::rotl<32 >(T);
237
+ T = (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(L, 0 )] << 5 ) |
238
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(L, 1 )] << 3 ) |
239
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(L, 2 )] << 1 ) |
240
+ (policy_type::fptab2[policy_type::template extract_uint_t <CHAR_BIT>(L, 3 )] << 1 ) |
241
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(R, 0 )] << 4 ) |
242
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(R, 1 )] << 2 ) |
243
+ (policy_type::fptab1[policy_type::template extract_uint_t <CHAR_BIT>(R, 2 )]) |
244
+ (policy_type::fptab2[policy_type::template extract_uint_t <CHAR_BIT>(R, 3 )]);
254
245
255
- store_be (T, out. data () );
246
+ T = policy_type:: template rotl< 32 >(T );
256
247
257
- return out ;
248
+ return {boost::endian::big_to_native< typename block_type::value_type>(T)} ;
258
249
}
259
250
};
260
251
}
0 commit comments