Coverage Report

Created: 2025-08-28 06:59

/src/boringssl/crypto/des/des.cc
Line
Count
Source (jump to first uncovered line)
1
// Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//     https://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#include <openssl/des.h>
16
17
#include <stdlib.h>
18
19
#include "internal.h"
20
21
22
/* IP and FP
23
 * The problem is more of a geometric problem that random bit fiddling.
24
 0  1  2  3  4  5  6  7      62 54 46 38 30 22 14  6
25
 8  9 10 11 12 13 14 15      60 52 44 36 28 20 12  4
26
16 17 18 19 20 21 22 23      58 50 42 34 26 18 10  2
27
24 25 26 27 28 29 30 31  to  56 48 40 32 24 16  8  0
28
29
32 33 34 35 36 37 38 39      63 55 47 39 31 23 15  7
30
40 41 42 43 44 45 46 47      61 53 45 37 29 21 13  5
31
48 49 50 51 52 53 54 55      59 51 43 35 27 19 11  3
32
56 57 58 59 60 61 62 63      57 49 41 33 25 17  9  1
33
34
The output has been subject to swaps of the form
35
0 1 -> 3 1 but the odd and even bits have been put into
36
2 3    2 0
37
different words.  The main trick is to remember that
38
t=((l>>size)^r)&(mask);
39
r^=t;
40
l^=(t<<size);
41
can be used to swap and move bits between words.
42
43
So l =  0  1  2  3  r = 16 17 18 19
44
        4  5  6  7      20 21 22 23
45
        8  9 10 11      24 25 26 27
46
       12 13 14 15      28 29 30 31
47
becomes (for size == 2 and mask == 0x3333)
48
   t =   2^16  3^17 -- --   l =  0  1 16 17  r =  2  3 18 19
49
         6^20  7^21 -- --        4  5 20 21       6  7 22 23
50
        10^24 11^25 -- --        8  9 24 25      10 11 24 25
51
        14^28 15^29 -- --       12 13 28 29      14 15 28 29
52
53
Thanks for hints from Richard Outerbridge - he told me IP&FP
54
could be done in 15 xor, 10 shifts and 5 ands.
55
When I finally started to think of the problem in 2D
56
I first got ~42 operations without xors.  When I remembered
57
how to use xors :-) I got it to its final state.
58
*/
59
#define PERM_OP(a, b, t, n, m)          \
60
250k
  do {                                  \
61
250k
    (t) = ((((a) >> (n)) ^ (b)) & (m)); \
62
250k
    (b) ^= (t);                         \
63
250k
    (a) ^= ((t) << (n));                \
64
250k
  } while (0)
65
66
#define IP(l, r)                        \
67
21.2k
  do {                                  \
68
21.2k
    uint32_t tt;                        \
69
21.2k
    PERM_OP(r, l, tt, 4, 0x0f0f0f0fL);  \
70
21.2k
    PERM_OP(l, r, tt, 16, 0x0000ffffL); \
71
21.2k
    PERM_OP(r, l, tt, 2, 0x33333333L);  \
72
21.2k
    PERM_OP(l, r, tt, 8, 0x00ff00ffL);  \
73
21.2k
    PERM_OP(r, l, tt, 1, 0x55555555L);  \
74
21.2k
  } while (0)
75
76
#define FP(l, r)                        \
77
21.2k
  do {                                  \
78
21.2k
    uint32_t tt;                        \
79
21.2k
    PERM_OP(l, r, tt, 1, 0x55555555L);  \
80
21.2k
    PERM_OP(r, l, tt, 8, 0x00ff00ffL);  \
81
21.2k
    PERM_OP(l, r, tt, 2, 0x33333333L);  \
82
21.2k
    PERM_OP(r, l, tt, 16, 0x0000ffffL); \
83
21.2k
    PERM_OP(l, r, tt, 4, 0x0f0f0f0fL);  \
84
21.2k
  } while (0)
85
86
#define LOAD_DATA(ks, R, S, u, t, E0, E1) \
87
1.02M
  do {                                    \
88
1.02M
    (u) = (R) ^ (ks)->subkeys[S][0];      \
89
1.02M
    (t) = (R) ^ (ks)->subkeys[S][1];      \
90
1.02M
  } while (0)
91
92
#define D_ENCRYPT(ks, LL, R, S)                                                \
93
1.02M
  do {                                                                         \
94
1.02M
    LOAD_DATA(ks, R, S, u, t, E0, E1);                                         \
95
1.02M
    t = CRYPTO_rotr_u32(t, 4);                                                 \
96
1.02M
    (LL) ^=                                                                    \
97
1.02M
        DES_SPtrans[0][(u >> 2L) & 0x3f] ^ DES_SPtrans[2][(u >> 10L) & 0x3f] ^ \
98
1.02M
        DES_SPtrans[4][(u >> 18L) & 0x3f] ^                                    \
99
1.02M
        DES_SPtrans[6][(u >> 26L) & 0x3f] ^ DES_SPtrans[1][(t >> 2L) & 0x3f] ^ \
100
1.02M
        DES_SPtrans[3][(t >> 10L) & 0x3f] ^                                    \
101
1.02M
        DES_SPtrans[5][(t >> 18L) & 0x3f] ^ DES_SPtrans[7][(t >> 26L) & 0x3f]; \
102
1.02M
  } while (0)
103
104
160k
#define ITERATIONS 16
105
#define HALF_ITERATIONS 8
106
107
static const uint32_t des_skb[8][64] = {
108
    {  // for C bits (numbered as per FIPS 46) 1 2 3 4 5 6
109
     0x00000000, 0x00000010, 0x20000000, 0x20000010, 0x00010000,
110
     0x00010010, 0x20010000, 0x20010010, 0x00000800, 0x00000810,
111
     0x20000800, 0x20000810, 0x00010800, 0x00010810, 0x20010800,
112
     0x20010810, 0x00000020, 0x00000030, 0x20000020, 0x20000030,
113
     0x00010020, 0x00010030, 0x20010020, 0x20010030, 0x00000820,
114
     0x00000830, 0x20000820, 0x20000830, 0x00010820, 0x00010830,
115
     0x20010820, 0x20010830, 0x00080000, 0x00080010, 0x20080000,
116
     0x20080010, 0x00090000, 0x00090010, 0x20090000, 0x20090010,
117
     0x00080800, 0x00080810, 0x20080800, 0x20080810, 0x00090800,
118
     0x00090810, 0x20090800, 0x20090810, 0x00080020, 0x00080030,
119
     0x20080020, 0x20080030, 0x00090020, 0x00090030, 0x20090020,
120
     0x20090030, 0x00080820, 0x00080830, 0x20080820, 0x20080830,
121
     0x00090820, 0x00090830, 0x20090820, 0x20090830, },
122
    {  // for C bits (numbered as per FIPS 46) 7 8 10 11 12 13
123
     0x00000000, 0x02000000, 0x00002000, 0x02002000, 0x00200000,
124
     0x02200000, 0x00202000, 0x02202000, 0x00000004, 0x02000004,
125
     0x00002004, 0x02002004, 0x00200004, 0x02200004, 0x00202004,
126
     0x02202004, 0x00000400, 0x02000400, 0x00002400, 0x02002400,
127
     0x00200400, 0x02200400, 0x00202400, 0x02202400, 0x00000404,
128
     0x02000404, 0x00002404, 0x02002404, 0x00200404, 0x02200404,
129
     0x00202404, 0x02202404, 0x10000000, 0x12000000, 0x10002000,
130
     0x12002000, 0x10200000, 0x12200000, 0x10202000, 0x12202000,
131
     0x10000004, 0x12000004, 0x10002004, 0x12002004, 0x10200004,
132
     0x12200004, 0x10202004, 0x12202004, 0x10000400, 0x12000400,
133
     0x10002400, 0x12002400, 0x10200400, 0x12200400, 0x10202400,
134
     0x12202400, 0x10000404, 0x12000404, 0x10002404, 0x12002404,
135
     0x10200404, 0x12200404, 0x10202404, 0x12202404, },
136
    {  // for C bits (numbered as per FIPS 46) 14 15 16 17 19 20
137
     0x00000000, 0x00000001, 0x00040000, 0x00040001, 0x01000000,
138
     0x01000001, 0x01040000, 0x01040001, 0x00000002, 0x00000003,
139
     0x00040002, 0x00040003, 0x01000002, 0x01000003, 0x01040002,
140
     0x01040003, 0x00000200, 0x00000201, 0x00040200, 0x00040201,
141
     0x01000200, 0x01000201, 0x01040200, 0x01040201, 0x00000202,
142
     0x00000203, 0x00040202, 0x00040203, 0x01000202, 0x01000203,
143
     0x01040202, 0x01040203, 0x08000000, 0x08000001, 0x08040000,
144
     0x08040001, 0x09000000, 0x09000001, 0x09040000, 0x09040001,
145
     0x08000002, 0x08000003, 0x08040002, 0x08040003, 0x09000002,
146
     0x09000003, 0x09040002, 0x09040003, 0x08000200, 0x08000201,
147
     0x08040200, 0x08040201, 0x09000200, 0x09000201, 0x09040200,
148
     0x09040201, 0x08000202, 0x08000203, 0x08040202, 0x08040203,
149
     0x09000202, 0x09000203, 0x09040202, 0x09040203, },
150
    {  // for C bits (numbered as per FIPS 46) 21 23 24 26 27 28
151
     0x00000000, 0x00100000, 0x00000100, 0x00100100, 0x00000008,
152
     0x00100008, 0x00000108, 0x00100108, 0x00001000, 0x00101000,
153
     0x00001100, 0x00101100, 0x00001008, 0x00101008, 0x00001108,
154
     0x00101108, 0x04000000, 0x04100000, 0x04000100, 0x04100100,
155
     0x04000008, 0x04100008, 0x04000108, 0x04100108, 0x04001000,
156
     0x04101000, 0x04001100, 0x04101100, 0x04001008, 0x04101008,
157
     0x04001108, 0x04101108, 0x00020000, 0x00120000, 0x00020100,
158
     0x00120100, 0x00020008, 0x00120008, 0x00020108, 0x00120108,
159
     0x00021000, 0x00121000, 0x00021100, 0x00121100, 0x00021008,
160
     0x00121008, 0x00021108, 0x00121108, 0x04020000, 0x04120000,
161
     0x04020100, 0x04120100, 0x04020008, 0x04120008, 0x04020108,
162
     0x04120108, 0x04021000, 0x04121000, 0x04021100, 0x04121100,
163
     0x04021008, 0x04121008, 0x04021108, 0x04121108, },
164
    {  // for D bits (numbered as per FIPS 46) 1 2 3 4 5 6
165
     0x00000000, 0x10000000, 0x00010000, 0x10010000, 0x00000004,
166
     0x10000004, 0x00010004, 0x10010004, 0x20000000, 0x30000000,
167
     0x20010000, 0x30010000, 0x20000004, 0x30000004, 0x20010004,
168
     0x30010004, 0x00100000, 0x10100000, 0x00110000, 0x10110000,
169
     0x00100004, 0x10100004, 0x00110004, 0x10110004, 0x20100000,
170
     0x30100000, 0x20110000, 0x30110000, 0x20100004, 0x30100004,
171
     0x20110004, 0x30110004, 0x00001000, 0x10001000, 0x00011000,
172
     0x10011000, 0x00001004, 0x10001004, 0x00011004, 0x10011004,
173
     0x20001000, 0x30001000, 0x20011000, 0x30011000, 0x20001004,
174
     0x30001004, 0x20011004, 0x30011004, 0x00101000, 0x10101000,
175
     0x00111000, 0x10111000, 0x00101004, 0x10101004, 0x00111004,
176
     0x10111004, 0x20101000, 0x30101000, 0x20111000, 0x30111000,
177
     0x20101004, 0x30101004, 0x20111004, 0x30111004, },
178
    {  // for D bits (numbered as per FIPS 46) 8 9 11 12 13 14
179
     0x00000000, 0x08000000, 0x00000008, 0x08000008, 0x00000400,
180
     0x08000400, 0x00000408, 0x08000408, 0x00020000, 0x08020000,
181
     0x00020008, 0x08020008, 0x00020400, 0x08020400, 0x00020408,
182
     0x08020408, 0x00000001, 0x08000001, 0x00000009, 0x08000009,
183
     0x00000401, 0x08000401, 0x00000409, 0x08000409, 0x00020001,
184
     0x08020001, 0x00020009, 0x08020009, 0x00020401, 0x08020401,
185
     0x00020409, 0x08020409, 0x02000000, 0x0A000000, 0x02000008,
186
     0x0A000008, 0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
187
     0x02020000, 0x0A020000, 0x02020008, 0x0A020008, 0x02020400,
188
     0x0A020400, 0x02020408, 0x0A020408, 0x02000001, 0x0A000001,
189
     0x02000009, 0x0A000009, 0x02000401, 0x0A000401, 0x02000409,
190
     0x0A000409, 0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
191
     0x02020401, 0x0A020401, 0x02020409, 0x0A020409, },
192
    {  // for D bits (numbered as per FIPS 46) 16 17 18 19 20 21
193
     0x00000000, 0x00000100, 0x00080000, 0x00080100, 0x01000000,
194
     0x01000100, 0x01080000, 0x01080100, 0x00000010, 0x00000110,
195
     0x00080010, 0x00080110, 0x01000010, 0x01000110, 0x01080010,
196
     0x01080110, 0x00200000, 0x00200100, 0x00280000, 0x00280100,
197
     0x01200000, 0x01200100, 0x01280000, 0x01280100, 0x00200010,
198
     0x00200110, 0x00280010, 0x00280110, 0x01200010, 0x01200110,
199
     0x01280010, 0x01280110, 0x00000200, 0x00000300, 0x00080200,
200
     0x00080300, 0x01000200, 0x01000300, 0x01080200, 0x01080300,
201
     0x00000210, 0x00000310, 0x00080210, 0x00080310, 0x01000210,
202
     0x01000310, 0x01080210, 0x01080310, 0x00200200, 0x00200300,
203
     0x00280200, 0x00280300, 0x01200200, 0x01200300, 0x01280200,
204
     0x01280300, 0x00200210, 0x00200310, 0x00280210, 0x00280310,
205
     0x01200210, 0x01200310, 0x01280210, 0x01280310, },
206
    {  // for D bits (numbered as per FIPS 46) 22 23 24 25 27 28
207
     0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000002,
208
     0x04000002, 0x00040002, 0x04040002, 0x00002000, 0x04002000,
209
     0x00042000, 0x04042000, 0x00002002, 0x04002002, 0x00042002,
210
     0x04042002, 0x00000020, 0x04000020, 0x00040020, 0x04040020,
211
     0x00000022, 0x04000022, 0x00040022, 0x04040022, 0x00002020,
212
     0x04002020, 0x00042020, 0x04042020, 0x00002022, 0x04002022,
213
     0x00042022, 0x04042022, 0x00000800, 0x04000800, 0x00040800,
214
     0x04040800, 0x00000802, 0x04000802, 0x00040802, 0x04040802,
215
     0x00002800, 0x04002800, 0x00042800, 0x04042800, 0x00002802,
216
     0x04002802, 0x00042802, 0x04042802, 0x00000820, 0x04000820,
217
     0x00040820, 0x04040820, 0x00000822, 0x04000822, 0x00040822,
218
     0x04040822, 0x00002820, 0x04002820, 0x00042820, 0x04042820,
219
     0x00002822, 0x04002822, 0x00042822, 0x04042822, }};
220
221
static const uint32_t DES_SPtrans[8][64] = {
222
    {  // nibble 0
223
     0x02080800, 0x00080000, 0x02000002, 0x02080802, 0x02000000,
224
     0x00080802, 0x00080002, 0x02000002, 0x00080802, 0x02080800,
225
     0x02080000, 0x00000802, 0x02000802, 0x02000000, 0x00000000,
226
     0x00080002, 0x00080000, 0x00000002, 0x02000800, 0x00080800,
227
     0x02080802, 0x02080000, 0x00000802, 0x02000800, 0x00000002,
228
     0x00000800, 0x00080800, 0x02080002, 0x00000800, 0x02000802,
229
     0x02080002, 0x00000000, 0x00000000, 0x02080802, 0x02000800,
230
     0x00080002, 0x02080800, 0x00080000, 0x00000802, 0x02000800,
231
     0x02080002, 0x00000800, 0x00080800, 0x02000002, 0x00080802,
232
     0x00000002, 0x02000002, 0x02080000, 0x02080802, 0x00080800,
233
     0x02080000, 0x02000802, 0x02000000, 0x00000802, 0x00080002,
234
     0x00000000, 0x00080000, 0x02000000, 0x02000802, 0x02080800,
235
     0x00000002, 0x02080002, 0x00000800, 0x00080802, },
236
    {  // nibble 1
237
     0x40108010, 0x00000000, 0x00108000, 0x40100000, 0x40000010,
238
     0x00008010, 0x40008000, 0x00108000, 0x00008000, 0x40100010,
239
     0x00000010, 0x40008000, 0x00100010, 0x40108000, 0x40100000,
240
     0x00000010, 0x00100000, 0x40008010, 0x40100010, 0x00008000,
241
     0x00108010, 0x40000000, 0x00000000, 0x00100010, 0x40008010,
242
     0x00108010, 0x40108000, 0x40000010, 0x40000000, 0x00100000,
243
     0x00008010, 0x40108010, 0x00100010, 0x40108000, 0x40008000,
244
     0x00108010, 0x40108010, 0x00100010, 0x40000010, 0x00000000,
245
     0x40000000, 0x00008010, 0x00100000, 0x40100010, 0x00008000,
246
     0x40000000, 0x00108010, 0x40008010, 0x40108000, 0x00008000,
247
     0x00000000, 0x40000010, 0x00000010, 0x40108010, 0x00108000,
248
     0x40100000, 0x40100010, 0x00100000, 0x00008010, 0x40008000,
249
     0x40008010, 0x00000010, 0x40100000, 0x00108000, },
250
    {  // nibble 2
251
     0x04000001, 0x04040100, 0x00000100, 0x04000101, 0x00040001,
252
     0x04000000, 0x04000101, 0x00040100, 0x04000100, 0x00040000,
253
     0x04040000, 0x00000001, 0x04040101, 0x00000101, 0x00000001,
254
     0x04040001, 0x00000000, 0x00040001, 0x04040100, 0x00000100,
255
     0x00000101, 0x04040101, 0x00040000, 0x04000001, 0x04040001,
256
     0x04000100, 0x00040101, 0x04040000, 0x00040100, 0x00000000,
257
     0x04000000, 0x00040101, 0x04040100, 0x00000100, 0x00000001,
258
     0x00040000, 0x00000101, 0x00040001, 0x04040000, 0x04000101,
259
     0x00000000, 0x04040100, 0x00040100, 0x04040001, 0x00040001,
260
     0x04000000, 0x04040101, 0x00000001, 0x00040101, 0x04000001,
261
     0x04000000, 0x04040101, 0x00040000, 0x04000100, 0x04000101,
262
     0x00040100, 0x04000100, 0x00000000, 0x04040001, 0x00000101,
263
     0x04000001, 0x00040101, 0x00000100, 0x04040000, },
264
    {  // nibble 3
265
     0x00401008, 0x10001000, 0x00000008, 0x10401008, 0x00000000,
266
     0x10400000, 0x10001008, 0x00400008, 0x10401000, 0x10000008,
267
     0x10000000, 0x00001008, 0x10000008, 0x00401008, 0x00400000,
268
     0x10000000, 0x10400008, 0x00401000, 0x00001000, 0x00000008,
269
     0x00401000, 0x10001008, 0x10400000, 0x00001000, 0x00001008,
270
     0x00000000, 0x00400008, 0x10401000, 0x10001000, 0x10400008,
271
     0x10401008, 0x00400000, 0x10400008, 0x00001008, 0x00400000,
272
     0x10000008, 0x00401000, 0x10001000, 0x00000008, 0x10400000,
273
     0x10001008, 0x00000000, 0x00001000, 0x00400008, 0x00000000,
274
     0x10400008, 0x10401000, 0x00001000, 0x10000000, 0x10401008,
275
     0x00401008, 0x00400000, 0x10401008, 0x00000008, 0x10001000,
276
     0x00401008, 0x00400008, 0x00401000, 0x10400000, 0x10001008,
277
     0x00001008, 0x10000000, 0x10000008, 0x10401000, },
278
    {  // nibble 4
279
     0x08000000, 0x00010000, 0x00000400, 0x08010420, 0x08010020,
280
     0x08000400, 0x00010420, 0x08010000, 0x00010000, 0x00000020,
281
     0x08000020, 0x00010400, 0x08000420, 0x08010020, 0x08010400,
282
     0x00000000, 0x00010400, 0x08000000, 0x00010020, 0x00000420,
283
     0x08000400, 0x00010420, 0x00000000, 0x08000020, 0x00000020,
284
     0x08000420, 0x08010420, 0x00010020, 0x08010000, 0x00000400,
285
     0x00000420, 0x08010400, 0x08010400, 0x08000420, 0x00010020,
286
     0x08010000, 0x00010000, 0x00000020, 0x08000020, 0x08000400,
287
     0x08000000, 0x00010400, 0x08010420, 0x00000000, 0x00010420,
288
     0x08000000, 0x00000400, 0x00010020, 0x08000420, 0x00000400,
289
     0x00000000, 0x08010420, 0x08010020, 0x08010400, 0x00000420,
290
     0x00010000, 0x00010400, 0x08010020, 0x08000400, 0x00000420,
291
     0x00000020, 0x00010420, 0x08010000, 0x08000020, },
292
    {  // nibble 5
293
     0x80000040, 0x00200040, 0x00000000, 0x80202000, 0x00200040,
294
     0x00002000, 0x80002040, 0x00200000, 0x00002040, 0x80202040,
295
     0x00202000, 0x80000000, 0x80002000, 0x80000040, 0x80200000,
296
     0x00202040, 0x00200000, 0x80002040, 0x80200040, 0x00000000,
297
     0x00002000, 0x00000040, 0x80202000, 0x80200040, 0x80202040,
298
     0x80200000, 0x80000000, 0x00002040, 0x00000040, 0x00202000,
299
     0x00202040, 0x80002000, 0x00002040, 0x80000000, 0x80002000,
300
     0x00202040, 0x80202000, 0x00200040, 0x00000000, 0x80002000,
301
     0x80000000, 0x00002000, 0x80200040, 0x00200000, 0x00200040,
302
     0x80202040, 0x00202000, 0x00000040, 0x80202040, 0x00202000,
303
     0x00200000, 0x80002040, 0x80000040, 0x80200000, 0x00202040,
304
     0x00000000, 0x00002000, 0x80000040, 0x80002040, 0x80202000,
305
     0x80200000, 0x00002040, 0x00000040, 0x80200040, },
306
    {  // nibble 6
307
     0x00004000, 0x00000200, 0x01000200, 0x01000004, 0x01004204,
308
     0x00004004, 0x00004200, 0x00000000, 0x01000000, 0x01000204,
309
     0x00000204, 0x01004000, 0x00000004, 0x01004200, 0x01004000,
310
     0x00000204, 0x01000204, 0x00004000, 0x00004004, 0x01004204,
311
     0x00000000, 0x01000200, 0x01000004, 0x00004200, 0x01004004,
312
     0x00004204, 0x01004200, 0x00000004, 0x00004204, 0x01004004,
313
     0x00000200, 0x01000000, 0x00004204, 0x01004000, 0x01004004,
314
     0x00000204, 0x00004000, 0x00000200, 0x01000000, 0x01004004,
315
     0x01000204, 0x00004204, 0x00004200, 0x00000000, 0x00000200,
316
     0x01000004, 0x00000004, 0x01000200, 0x00000000, 0x01000204,
317
     0x01000200, 0x00004200, 0x00000204, 0x00004000, 0x01004204,
318
     0x01000000, 0x01004200, 0x00000004, 0x00004004, 0x01004204,
319
     0x01000004, 0x01004200, 0x01004000, 0x00004004, },
320
    {  // nibble 7
321
     0x20800080, 0x20820000, 0x00020080, 0x00000000, 0x20020000,
322
     0x00800080, 0x20800000, 0x20820080, 0x00000080, 0x20000000,
323
     0x00820000, 0x00020080, 0x00820080, 0x20020080, 0x20000080,
324
     0x20800000, 0x00020000, 0x00820080, 0x00800080, 0x20020000,
325
     0x20820080, 0x20000080, 0x00000000, 0x00820000, 0x20000000,
326
     0x00800000, 0x20020080, 0x20800080, 0x00800000, 0x00020000,
327
     0x20820000, 0x00000080, 0x00800000, 0x00020000, 0x20000080,
328
     0x20820080, 0x00020080, 0x20000000, 0x00000000, 0x00820000,
329
     0x20800080, 0x20020080, 0x20020000, 0x00800080, 0x20820000,
330
     0x00000080, 0x00800080, 0x20020000, 0x20820080, 0x00800000,
331
     0x20800000, 0x20000080, 0x00820000, 0x00020080, 0x20020080,
332
     0x20800000, 0x00000080, 0x20820000, 0x00820080, 0x00000000,
333
     0x20000000, 0x20800080, 0x00020000, 0x00820080, }};
334
335
#define HPERM_OP(a, t, n, m)                  \
336
18.8k
  ((t) = ((((a) << (16 - (n))) ^ (a)) & (m)), \
337
18.8k
   (a) = (a) ^ (t) ^ ((t) >> (16 - (n))))
338
339
0
void DES_set_key(const DES_cblock *key, DES_key_schedule *schedule) {
340
0
  DES_set_key_ex(key->bytes, schedule);
341
0
}
342
343
9.43k
void DES_set_key_ex(const uint8_t key[8], DES_key_schedule *schedule) {
344
9.43k
  static const int shifts2[16] = {0, 0, 1, 1, 1, 1, 1, 1,
345
9.43k
                                  0, 1, 1, 1, 1, 1, 1, 0};
346
9.43k
  uint32_t c, d, t, s, t2;
347
9.43k
  const uint8_t *in;
348
9.43k
  int i;
349
350
9.43k
  in = key;
351
352
9.43k
  c2l(in, c);
353
9.43k
  c2l(in, d);
354
355
  // do PC1 in 47 simple operations :-)
356
  // Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
357
  // for the inspiration. :-)
358
9.43k
  PERM_OP(d, c, t, 4, 0x0f0f0f0f);
359
9.43k
  HPERM_OP(c, t, -2, 0xcccc0000);
360
9.43k
  HPERM_OP(d, t, -2, 0xcccc0000);
361
9.43k
  PERM_OP(d, c, t, 1, 0x55555555);
362
9.43k
  PERM_OP(c, d, t, 8, 0x00ff00ff);
363
9.43k
  PERM_OP(d, c, t, 1, 0x55555555);
364
9.43k
  d = (((d & 0x000000ff) << 16) | (d & 0x0000ff00) |
365
9.43k
       ((d & 0x00ff0000) >> 16) | ((c & 0xf0000000) >> 4));
366
9.43k
  c &= 0x0fffffff;
367
368
160k
  for (i = 0; i < ITERATIONS; i++) {
369
150k
    if (shifts2[i]) {
370
113k
      c = ((c >> 2) | (c << 26));
371
113k
      d = ((d >> 2) | (d << 26));
372
113k
    } else {
373
37.7k
      c = ((c >> 1) | (c << 27));
374
37.7k
      d = ((d >> 1) | (d << 27));
375
37.7k
    }
376
150k
    c &= 0x0fffffff;
377
150k
    d &= 0x0fffffff;
378
    // could be a few less shifts but I am to lazy at this
379
    // point in time to investigate
380
150k
    s = des_skb[0][(c) & 0x3f] |
381
150k
        des_skb[1][((c >> 6) & 0x03) | ((c >> 7) & 0x3c)] |
382
150k
        des_skb[2][((c >> 13) & 0x0f) | ((c >> 14) & 0x30)] |
383
150k
        des_skb[3][((c >> 20) & 0x01) | ((c >> 21) & 0x06) |
384
150k
                   ((c >> 22) & 0x38)];
385
150k
    t = des_skb[4][(d) & 0x3f] |
386
150k
        des_skb[5][((d >> 7) & 0x03) | ((d >> 8) & 0x3c)] |
387
150k
        des_skb[6][(d >> 15) & 0x3f] |
388
150k
        des_skb[7][((d >> 21) & 0x0f) | ((d >> 22) & 0x30)];
389
390
    // table contained 0213 4657
391
150k
    t2 = ((t << 16) | (s & 0x0000ffff)) & 0xffffffff;
392
150k
    schedule->subkeys[i][0] = CRYPTO_rotr_u32(t2, 30);
393
394
150k
    t2 = ((s >> 16) | (t & 0xffff0000));
395
150k
    schedule->subkeys[i][1] = CRYPTO_rotr_u32(t2, 26);
396
150k
  }
397
9.43k
}
398
399
static const uint8_t kOddParity[256] = {
400
    1,   1,   2,   2,   4,   4,   7,   7,   8,   8,   11,  11,  13,  13,  14,
401
    14,  16,  16,  19,  19,  21,  21,  22,  22,  25,  25,  26,  26,  28,  28,
402
    31,  31,  32,  32,  35,  35,  37,  37,  38,  38,  41,  41,  42,  42,  44,
403
    44,  47,  47,  49,  49,  50,  50,  52,  52,  55,  55,  56,  56,  59,  59,
404
    61,  61,  62,  62,  64,  64,  67,  67,  69,  69,  70,  70,  73,  73,  74,
405
    74,  76,  76,  79,  79,  81,  81,  82,  82,  84,  84,  87,  87,  88,  88,
406
    91,  91,  93,  93,  94,  94,  97,  97,  98,  98,  100, 100, 103, 103, 104,
407
    104, 107, 107, 109, 109, 110, 110, 112, 112, 115, 115, 117, 117, 118, 118,
408
    121, 121, 122, 122, 124, 124, 127, 127, 128, 128, 131, 131, 133, 133, 134,
409
    134, 137, 137, 138, 138, 140, 140, 143, 143, 145, 145, 146, 146, 148, 148,
410
    151, 151, 152, 152, 155, 155, 157, 157, 158, 158, 161, 161, 162, 162, 164,
411
    164, 167, 167, 168, 168, 171, 171, 173, 173, 174, 174, 176, 176, 179, 179,
412
    181, 181, 182, 182, 185, 185, 186, 186, 188, 188, 191, 191, 193, 193, 194,
413
    194, 196, 196, 199, 199, 200, 200, 203, 203, 205, 205, 206, 206, 208, 208,
414
    211, 211, 213, 213, 214, 214, 217, 217, 218, 218, 220, 220, 223, 223, 224,
415
    224, 227, 227, 229, 229, 230, 230, 233, 233, 234, 234, 236, 236, 239, 239,
416
    241, 241, 242, 242, 244, 244, 247, 247, 248, 248, 251, 251, 253, 253, 254,
417
    254
418
};
419
420
0
void DES_set_odd_parity(DES_cblock *key) {
421
0
  unsigned i;
422
423
0
  for (i = 0; i < DES_KEY_SZ; i++) {
424
0
    key->bytes[i] = kOddParity[key->bytes[i]];
425
0
  }
426
0
}
427
428
static void DES_encrypt1(uint32_t data[2], const DES_key_schedule *ks,
429
0
                         int enc) {
430
0
  uint32_t l, r, t, u;
431
432
0
  r = data[0];
433
0
  l = data[1];
434
435
0
  IP(r, l);
436
  // Things have been modified so that the initial rotate is done outside
437
  // the loop.  This required the DES_SPtrans values in sp.h to be
438
  // rotated 1 bit to the right. One perl script later and things have a
439
  // 5% speed up on a sparc2. Thanks to Richard Outerbridge
440
  // <71755.204@CompuServe.COM> for pointing this out.
441
  // clear the top bits on machines with 8byte longs
442
  // shift left by 2
443
0
  r = CRYPTO_rotr_u32(r, 29);
444
0
  l = CRYPTO_rotr_u32(l, 29);
445
446
  // I don't know if it is worth the effort of loop unrolling the
447
  // inner loop
448
0
  if (enc) {
449
0
    D_ENCRYPT(ks, l, r, 0);
450
0
    D_ENCRYPT(ks, r, l, 1);
451
0
    D_ENCRYPT(ks, l, r, 2);
452
0
    D_ENCRYPT(ks, r, l, 3);
453
0
    D_ENCRYPT(ks, l, r, 4);
454
0
    D_ENCRYPT(ks, r, l, 5);
455
0
    D_ENCRYPT(ks, l, r, 6);
456
0
    D_ENCRYPT(ks, r, l, 7);
457
0
    D_ENCRYPT(ks, l, r, 8);
458
0
    D_ENCRYPT(ks, r, l, 9);
459
0
    D_ENCRYPT(ks, l, r, 10);
460
0
    D_ENCRYPT(ks, r, l, 11);
461
0
    D_ENCRYPT(ks, l, r, 12);
462
0
    D_ENCRYPT(ks, r, l, 13);
463
0
    D_ENCRYPT(ks, l, r, 14);
464
0
    D_ENCRYPT(ks, r, l, 15);
465
0
  } else {
466
0
    D_ENCRYPT(ks, l, r, 15);
467
0
    D_ENCRYPT(ks, r, l, 14);
468
0
    D_ENCRYPT(ks, l, r, 13);
469
0
    D_ENCRYPT(ks, r, l, 12);
470
0
    D_ENCRYPT(ks, l, r, 11);
471
0
    D_ENCRYPT(ks, r, l, 10);
472
0
    D_ENCRYPT(ks, l, r, 9);
473
0
    D_ENCRYPT(ks, r, l, 8);
474
0
    D_ENCRYPT(ks, l, r, 7);
475
0
    D_ENCRYPT(ks, r, l, 6);
476
0
    D_ENCRYPT(ks, l, r, 5);
477
0
    D_ENCRYPT(ks, r, l, 4);
478
0
    D_ENCRYPT(ks, l, r, 3);
479
0
    D_ENCRYPT(ks, r, l, 2);
480
0
    D_ENCRYPT(ks, l, r, 1);
481
0
    D_ENCRYPT(ks, r, l, 0);
482
0
  }
483
484
  // rotate and clear the top bits on machines with 8byte longs
485
0
  l = CRYPTO_rotr_u32(l, 3);
486
0
  r = CRYPTO_rotr_u32(r, 3);
487
488
0
  FP(r, l);
489
0
  data[0] = l;
490
0
  data[1] = r;
491
0
}
492
493
static void DES_encrypt2(uint32_t data[2], const DES_key_schedule *ks,
494
63.7k
                         int enc) {
495
63.7k
  uint32_t l, r, t, u;
496
497
63.7k
  r = data[0];
498
63.7k
  l = data[1];
499
500
  // Things have been modified so that the initial rotate is done outside the
501
  // loop.  This required the DES_SPtrans values in sp.h to be rotated 1 bit to
502
  // the right. One perl script later and things have a 5% speed up on a
503
  // sparc2. Thanks to Richard Outerbridge <71755.204@CompuServe.COM> for
504
  // pointing this out.
505
  // clear the top bits on machines with 8byte longs
506
63.7k
  r = CRYPTO_rotr_u32(r, 29);
507
63.7k
  l = CRYPTO_rotr_u32(l, 29);
508
509
  // I don't know if it is worth the effort of loop unrolling the
510
  // inner loop
511
63.7k
  if (enc) {
512
22.9k
    D_ENCRYPT(ks, l, r, 0);
513
22.9k
    D_ENCRYPT(ks, r, l, 1);
514
22.9k
    D_ENCRYPT(ks, l, r, 2);
515
22.9k
    D_ENCRYPT(ks, r, l, 3);
516
22.9k
    D_ENCRYPT(ks, l, r, 4);
517
22.9k
    D_ENCRYPT(ks, r, l, 5);
518
22.9k
    D_ENCRYPT(ks, l, r, 6);
519
22.9k
    D_ENCRYPT(ks, r, l, 7);
520
22.9k
    D_ENCRYPT(ks, l, r, 8);
521
22.9k
    D_ENCRYPT(ks, r, l, 9);
522
22.9k
    D_ENCRYPT(ks, l, r, 10);
523
22.9k
    D_ENCRYPT(ks, r, l, 11);
524
22.9k
    D_ENCRYPT(ks, l, r, 12);
525
22.9k
    D_ENCRYPT(ks, r, l, 13);
526
22.9k
    D_ENCRYPT(ks, l, r, 14);
527
22.9k
    D_ENCRYPT(ks, r, l, 15);
528
40.8k
  } else {
529
40.8k
    D_ENCRYPT(ks, l, r, 15);
530
40.8k
    D_ENCRYPT(ks, r, l, 14);
531
40.8k
    D_ENCRYPT(ks, l, r, 13);
532
40.8k
    D_ENCRYPT(ks, r, l, 12);
533
40.8k
    D_ENCRYPT(ks, l, r, 11);
534
40.8k
    D_ENCRYPT(ks, r, l, 10);
535
40.8k
    D_ENCRYPT(ks, l, r, 9);
536
40.8k
    D_ENCRYPT(ks, r, l, 8);
537
40.8k
    D_ENCRYPT(ks, l, r, 7);
538
40.8k
    D_ENCRYPT(ks, r, l, 6);
539
40.8k
    D_ENCRYPT(ks, l, r, 5);
540
40.8k
    D_ENCRYPT(ks, r, l, 4);
541
40.8k
    D_ENCRYPT(ks, l, r, 3);
542
40.8k
    D_ENCRYPT(ks, r, l, 2);
543
40.8k
    D_ENCRYPT(ks, l, r, 1);
544
40.8k
    D_ENCRYPT(ks, r, l, 0);
545
40.8k
  }
546
  // rotate and clear the top bits on machines with 8byte longs
547
63.7k
  data[0] = CRYPTO_rotr_u32(l, 3);
548
63.7k
  data[1] = CRYPTO_rotr_u32(r, 3);
549
63.7k
}
550
551
void DES_encrypt3(uint32_t data[2], const DES_key_schedule *ks1,
552
1.71k
                  const DES_key_schedule *ks2, const DES_key_schedule *ks3) {
553
1.71k
  uint32_t l, r;
554
555
1.71k
  l = data[0];
556
1.71k
  r = data[1];
557
1.71k
  IP(l, r);
558
1.71k
  data[0] = l;
559
1.71k
  data[1] = r;
560
1.71k
  DES_encrypt2(data, ks1, DES_ENCRYPT);
561
1.71k
  DES_encrypt2(data, ks2, DES_DECRYPT);
562
1.71k
  DES_encrypt2(data, ks3, DES_ENCRYPT);
563
1.71k
  l = data[0];
564
1.71k
  r = data[1];
565
1.71k
  FP(r, l);
566
1.71k
  data[0] = l;
567
1.71k
  data[1] = r;
568
1.71k
}
569
570
void DES_decrypt3(uint32_t data[2], const DES_key_schedule *ks1,
571
19.5k
                  const DES_key_schedule *ks2, const DES_key_schedule *ks3) {
572
19.5k
  uint32_t l, r;
573
574
19.5k
  l = data[0];
575
19.5k
  r = data[1];
576
19.5k
  IP(l, r);
577
19.5k
  data[0] = l;
578
19.5k
  data[1] = r;
579
19.5k
  DES_encrypt2(data, ks3, DES_DECRYPT);
580
19.5k
  DES_encrypt2(data, ks2, DES_ENCRYPT);
581
19.5k
  DES_encrypt2(data, ks1, DES_DECRYPT);
582
19.5k
  l = data[0];
583
19.5k
  r = data[1];
584
19.5k
  FP(r, l);
585
19.5k
  data[0] = l;
586
19.5k
  data[1] = r;
587
19.5k
}
588
589
void DES_ecb_encrypt(const DES_cblock *in_block, DES_cblock *out_block,
590
0
                     const DES_key_schedule *schedule, int is_encrypt) {
591
0
  DES_ecb_encrypt_ex(in_block->bytes, out_block->bytes, schedule, is_encrypt);
592
0
}
593
594
void DES_ecb_encrypt_ex(const uint8_t in[8], uint8_t out[8],
595
0
                        const DES_key_schedule *schedule, int is_encrypt) {
596
0
  uint32_t ll[2];
597
0
  ll[0] = CRYPTO_load_u32_le(in);
598
0
  ll[1] = CRYPTO_load_u32_le(in + 4);
599
0
  DES_encrypt1(ll, schedule, is_encrypt);
600
0
  CRYPTO_store_u32_le(out, ll[0]);
601
0
  CRYPTO_store_u32_le(out + 4, ll[1]);
602
0
}
603
604
void DES_ncbc_encrypt(const uint8_t *in, uint8_t *out, size_t len,
605
                      const DES_key_schedule *schedule, DES_cblock *ivec,
606
0
                      int enc) {
607
0
  DES_ncbc_encrypt_ex(in, out, len, schedule, ivec->bytes, enc);
608
0
}
609
610
void DES_ncbc_encrypt_ex(const uint8_t *in, uint8_t *out, size_t len,
611
                         const DES_key_schedule *schedule, uint8_t ivec[8],
612
0
                         int enc) {
613
0
  uint32_t tin0, tin1;
614
0
  uint32_t tout0, tout1, xor0, xor1;
615
0
  uint32_t tin[2];
616
0
  unsigned char *iv;
617
618
0
  iv = ivec;
619
620
0
  if (enc) {
621
0
    c2l(iv, tout0);
622
0
    c2l(iv, tout1);
623
0
    for (; len >= 8; len -= 8) {
624
0
      c2l(in, tin0);
625
0
      c2l(in, tin1);
626
0
      tin0 ^= tout0;
627
0
      tin[0] = tin0;
628
0
      tin1 ^= tout1;
629
0
      tin[1] = tin1;
630
0
      DES_encrypt1(tin, schedule, DES_ENCRYPT);
631
0
      tout0 = tin[0];
632
0
      l2c(tout0, out);
633
0
      tout1 = tin[1];
634
0
      l2c(tout1, out);
635
0
    }
636
0
    if (len != 0) {
637
0
      c2ln(in, tin0, tin1, len);
638
0
      tin0 ^= tout0;
639
0
      tin[0] = tin0;
640
0
      tin1 ^= tout1;
641
0
      tin[1] = tin1;
642
0
      DES_encrypt1(tin, schedule, DES_ENCRYPT);
643
0
      tout0 = tin[0];
644
0
      l2c(tout0, out);
645
0
      tout1 = tin[1];
646
0
      l2c(tout1, out);
647
0
    }
648
0
    iv = ivec;
649
0
    l2c(tout0, iv);
650
0
    l2c(tout1, iv);
651
0
  } else {
652
0
    c2l(iv, xor0);
653
0
    c2l(iv, xor1);
654
0
    for (; len >= 8; len -= 8) {
655
0
      c2l(in, tin0);
656
0
      tin[0] = tin0;
657
0
      c2l(in, tin1);
658
0
      tin[1] = tin1;
659
0
      DES_encrypt1(tin, schedule, DES_DECRYPT);
660
0
      tout0 = tin[0] ^ xor0;
661
0
      tout1 = tin[1] ^ xor1;
662
0
      l2c(tout0, out);
663
0
      l2c(tout1, out);
664
0
      xor0 = tin0;
665
0
      xor1 = tin1;
666
0
    }
667
0
    if (len != 0) {
668
0
      c2l(in, tin0);
669
0
      tin[0] = tin0;
670
0
      c2l(in, tin1);
671
0
      tin[1] = tin1;
672
0
      DES_encrypt1(tin, schedule, DES_DECRYPT);
673
0
      tout0 = tin[0] ^ xor0;
674
0
      tout1 = tin[1] ^ xor1;
675
0
      l2cn(tout0, tout1, out, len);
676
0
      xor0 = tin0;
677
0
      xor1 = tin1;
678
0
    }
679
0
    iv = ivec;
680
0
    l2c(xor0, iv);
681
0
    l2c(xor1, iv);
682
0
  }
683
0
  tin[0] = tin[1] = 0;
684
0
}
685
686
void DES_ecb3_encrypt(const DES_cblock *input, DES_cblock *output,
687
                      const DES_key_schedule *ks1, const DES_key_schedule *ks2,
688
0
                      const DES_key_schedule *ks3, int enc) {
689
0
  DES_ecb3_encrypt_ex(input->bytes, output->bytes, ks1, ks2, ks3, enc);
690
0
}
691
692
void DES_ecb3_encrypt_ex(const uint8_t in[8], uint8_t out[8],
693
                         const DES_key_schedule *ks1,
694
                         const DES_key_schedule *ks2,
695
0
                         const DES_key_schedule *ks3, int enc) {
696
0
  uint32_t ll[2];
697
0
  ll[0] = CRYPTO_load_u32_le(in);
698
0
  ll[1] = CRYPTO_load_u32_le(in + 4);
699
0
  if (enc) {
700
0
    DES_encrypt3(ll, ks1, ks2, ks3);
701
0
  } else {
702
0
    DES_decrypt3(ll, ks1, ks2, ks3);
703
0
  }
704
0
  CRYPTO_store_u32_le(out, ll[0]);
705
0
  CRYPTO_store_u32_le(out + 4, ll[1]);
706
0
}
707
708
void DES_ede3_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t len,
709
                          const DES_key_schedule *ks1,
710
                          const DES_key_schedule *ks2,
711
                          const DES_key_schedule *ks3, DES_cblock *ivec,
712
0
                          int enc) {
713
0
  DES_ede3_cbc_encrypt_ex(in, out, len, ks1, ks2, ks3, ivec->bytes, enc);
714
0
}
715
716
void DES_ede3_cbc_encrypt_ex(const uint8_t *in, uint8_t *out, size_t len,
717
                             const DES_key_schedule *ks1,
718
                             const DES_key_schedule *ks2,
719
                             const DES_key_schedule *ks3, uint8_t ivec[8],
720
1.15k
                             int enc) {
721
1.15k
  uint32_t tin0, tin1;
722
1.15k
  uint32_t tout0, tout1, xor0, xor1;
723
1.15k
  uint32_t tin[2];
724
1.15k
  uint8_t *iv;
725
726
1.15k
  iv = ivec;
727
728
1.15k
  if (enc) {
729
1.01k
    c2l(iv, tout0);
730
1.01k
    c2l(iv, tout1);
731
2.72k
    for (; len >= 8; len -= 8) {
732
1.71k
      c2l(in, tin0);
733
1.71k
      c2l(in, tin1);
734
1.71k
      tin0 ^= tout0;
735
1.71k
      tin1 ^= tout1;
736
737
1.71k
      tin[0] = tin0;
738
1.71k
      tin[1] = tin1;
739
1.71k
      DES_encrypt3(tin, ks1, ks2, ks3);
740
1.71k
      tout0 = tin[0];
741
1.71k
      tout1 = tin[1];
742
743
1.71k
      l2c(tout0, out);
744
1.71k
      l2c(tout1, out);
745
1.71k
    }
746
1.01k
    if (len != 0) {
747
0
      c2ln(in, tin0, tin1, len);
748
0
      tin0 ^= tout0;
749
0
      tin1 ^= tout1;
750
751
0
      tin[0] = tin0;
752
0
      tin[1] = tin1;
753
0
      DES_encrypt3(tin, ks1, ks2, ks3);
754
0
      tout0 = tin[0];
755
0
      tout1 = tin[1];
756
757
0
      l2c(tout0, out);
758
0
      l2c(tout1, out);
759
0
    }
760
1.01k
    iv = ivec;
761
1.01k
    l2c(tout0, iv);
762
1.01k
    l2c(tout1, iv);
763
1.01k
  } else {
764
139
    uint32_t t0, t1;
765
766
139
    c2l(iv, xor0);
767
139
    c2l(iv, xor1);
768
19.6k
    for (; len >= 8; len -= 8) {
769
19.5k
      c2l(in, tin0);
770
19.5k
      c2l(in, tin1);
771
772
19.5k
      t0 = tin0;
773
19.5k
      t1 = tin1;
774
775
19.5k
      tin[0] = tin0;
776
19.5k
      tin[1] = tin1;
777
19.5k
      DES_decrypt3(tin, ks1, ks2, ks3);
778
19.5k
      tout0 = tin[0];
779
19.5k
      tout1 = tin[1];
780
781
19.5k
      tout0 ^= xor0;
782
19.5k
      tout1 ^= xor1;
783
19.5k
      l2c(tout0, out);
784
19.5k
      l2c(tout1, out);
785
19.5k
      xor0 = t0;
786
19.5k
      xor1 = t1;
787
19.5k
    }
788
139
    if (len != 0) {
789
0
      c2l(in, tin0);
790
0
      c2l(in, tin1);
791
792
0
      t0 = tin0;
793
0
      t1 = tin1;
794
795
0
      tin[0] = tin0;
796
0
      tin[1] = tin1;
797
0
      DES_decrypt3(tin, ks1, ks2, ks3);
798
0
      tout0 = tin[0];
799
0
      tout1 = tin[1];
800
801
0
      tout0 ^= xor0;
802
0
      tout1 ^= xor1;
803
0
      l2cn(tout0, tout1, out, len);
804
0
      xor0 = t0;
805
0
      xor1 = t1;
806
0
    }
807
808
139
    iv = ivec;
809
139
    l2c(xor0, iv);
810
139
    l2c(xor1, iv);
811
139
  }
812
813
1.15k
  tin[0] = tin[1] = 0;
814
1.15k
}
815
816
void DES_ede2_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t len,
817
                          const DES_key_schedule *ks1,
818
                          const DES_key_schedule *ks2,
819
                          DES_cblock *ivec,
820
0
                          int enc) {
821
0
  DES_ede3_cbc_encrypt(in, out, len, ks1, ks2, ks1, ivec, enc);
822
0
}
823
824
825
// Deprecated functions.
826
827
0
void DES_set_key_unchecked(const DES_cblock *key, DES_key_schedule *schedule) {
828
0
  DES_set_key(key, schedule);
829
0
}