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