1d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * All rights reserved.
3d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
4d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This package is an SSL implementation written
5d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * by Eric Young (eay@cryptsoft.com).
6d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * The implementation was written so as to conform with Netscapes SSL.
7d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
8d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This library is free for commercial and non-commercial use as long as
9d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * the following conditions are aheared to.  The following conditions
10d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * apply to all code found in this distribution, be it the RC4, RSA,
11d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
12d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * included with this distribution is covered by the same copyright terms
13d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
15d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Copyright remains Eric Young's, and as such any Copyright notices in
16d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * the code are not to be removed.
17d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * If this package is used in a product, Eric Young should be given attribution
18d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * as the author of the parts of the library used.
19d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This can be in the form of a textual message at program startup or
20d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * in documentation (online or textual) provided with the package.
21d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
22d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Redistribution and use in source and binary forms, with or without
23d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * modification, are permitted provided that the following conditions
24d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * are met:
25d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 1. Redistributions of source code must retain the copyright
26d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    notice, this list of conditions and the following disclaimer.
27d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 2. Redistributions in binary form must reproduce the above copyright
28d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    notice, this list of conditions and the following disclaimer in the
29d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    documentation and/or other materials provided with the distribution.
30d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 3. All advertising materials mentioning features or use of this software
31d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    must display the following acknowledgement:
32d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    "This product includes cryptographic software written by
33d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *     Eric Young (eay@cryptsoft.com)"
34d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    The word 'cryptographic' can be left out if the rouines from the library
35d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    being used are not cryptographic related :-).
36d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 4. If you include any Windows specific code (or a derivative thereof) from
37d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    the apps directory (application code) you must include an acknowledgement:
38d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
40d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * SUCH DAMAGE.
51d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
52d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * The licence and distribution terms for any publically available version or
53d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * derivative of this code cannot be changed.  i.e. this code cannot simply be
54d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * copied and put under another distribution licence
55d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * [including the GNU Public Licence.] */
56d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
57d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/des.h>
58d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
59e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley#include <stdlib.h>
60e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
61d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include "internal.h"
62d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
63d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
64d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic const uint32_t des_skb[8][64] = {
65d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
66d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x00000010L, 0x20000000L, 0x20000010L, 0x00010000L,
67d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00010010L, 0x20010000L, 0x20010010L, 0x00000800L, 0x00000810L,
68d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20000800L, 0x20000810L, 0x00010800L, 0x00010810L, 0x20010800L,
69d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20010810L, 0x00000020L, 0x00000030L, 0x20000020L, 0x20000030L,
70d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00010020L, 0x00010030L, 0x20010020L, 0x20010030L, 0x00000820L,
71d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000830L, 0x20000820L, 0x20000830L, 0x00010820L, 0x00010830L,
72d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20010820L, 0x20010830L, 0x00080000L, 0x00080010L, 0x20080000L,
73d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20080010L, 0x00090000L, 0x00090010L, 0x20090000L, 0x20090010L,
74d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00080800L, 0x00080810L, 0x20080800L, 0x20080810L, 0x00090800L,
75d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00090810L, 0x20090800L, 0x20090810L, 0x00080020L, 0x00080030L,
76d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20080020L, 0x20080030L, 0x00090020L, 0x00090030L, 0x20090020L,
77d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20090030L, 0x00080820L, 0x00080830L, 0x20080820L, 0x20080830L,
78d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00090820L, 0x00090830L, 0x20090820L, 0x20090830L, },
79d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
80d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x02000000L, 0x00002000L, 0x02002000L, 0x00200000L,
81d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x02200000L, 0x00202000L, 0x02202000L, 0x00000004L, 0x02000004L,
82d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00002004L, 0x02002004L, 0x00200004L, 0x02200004L, 0x00202004L,
83d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x02202004L, 0x00000400L, 0x02000400L, 0x00002400L, 0x02002400L,
84d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00200400L, 0x02200400L, 0x00202400L, 0x02202400L, 0x00000404L,
85d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x02000404L, 0x00002404L, 0x02002404L, 0x00200404L, 0x02200404L,
86d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00202404L, 0x02202404L, 0x10000000L, 0x12000000L, 0x10002000L,
87d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x12002000L, 0x10200000L, 0x12200000L, 0x10202000L, 0x12202000L,
88d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x10000004L, 0x12000004L, 0x10002004L, 0x12002004L, 0x10200004L,
89d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x12200004L, 0x10202004L, 0x12202004L, 0x10000400L, 0x12000400L,
90d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x10002400L, 0x12002400L, 0x10200400L, 0x12200400L, 0x10202400L,
91d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x12202400L, 0x10000404L, 0x12000404L, 0x10002404L, 0x12002404L,
92d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x10200404L, 0x12200404L, 0x10202404L, 0x12202404L, },
93d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
94d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x00000001L, 0x00040000L, 0x00040001L, 0x01000000L,
95d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01000001L, 0x01040000L, 0x01040001L, 0x00000002L, 0x00000003L,
96d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00040002L, 0x00040003L, 0x01000002L, 0x01000003L, 0x01040002L,
97d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01040003L, 0x00000200L, 0x00000201L, 0x00040200L, 0x00040201L,
98d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01000200L, 0x01000201L, 0x01040200L, 0x01040201L, 0x00000202L,
99d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000203L, 0x00040202L, 0x00040203L, 0x01000202L, 0x01000203L,
100d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01040202L, 0x01040203L, 0x08000000L, 0x08000001L, 0x08040000L,
101d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x08040001L, 0x09000000L, 0x09000001L, 0x09040000L, 0x09040001L,
102d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x08000002L, 0x08000003L, 0x08040002L, 0x08040003L, 0x09000002L,
103d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x09000003L, 0x09040002L, 0x09040003L, 0x08000200L, 0x08000201L,
104d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x08040200L, 0x08040201L, 0x09000200L, 0x09000201L, 0x09040200L,
105d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x09040201L, 0x08000202L, 0x08000203L, 0x08040202L, 0x08040203L,
106d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x09000202L, 0x09000203L, 0x09040202L, 0x09040203L, },
107d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
108d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x00100000L, 0x00000100L, 0x00100100L, 0x00000008L,
109d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00100008L, 0x00000108L, 0x00100108L, 0x00001000L, 0x00101000L,
110d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00001100L, 0x00101100L, 0x00001008L, 0x00101008L, 0x00001108L,
111d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00101108L, 0x04000000L, 0x04100000L, 0x04000100L, 0x04100100L,
112d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04000008L, 0x04100008L, 0x04000108L, 0x04100108L, 0x04001000L,
113d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04101000L, 0x04001100L, 0x04101100L, 0x04001008L, 0x04101008L,
114d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04001108L, 0x04101108L, 0x00020000L, 0x00120000L, 0x00020100L,
115d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00120100L, 0x00020008L, 0x00120008L, 0x00020108L, 0x00120108L,
116d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00021000L, 0x00121000L, 0x00021100L, 0x00121100L, 0x00021008L,
117d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00121008L, 0x00021108L, 0x00121108L, 0x04020000L, 0x04120000L,
118d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04020100L, 0x04120100L, 0x04020008L, 0x04120008L, 0x04020108L,
119d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04120108L, 0x04021000L, 0x04121000L, 0x04021100L, 0x04121100L,
120d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04021008L, 0x04121008L, 0x04021108L, 0x04121108L, },
121d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
122d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x10000000L, 0x00010000L, 0x10010000L, 0x00000004L,
123d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x10000004L, 0x00010004L, 0x10010004L, 0x20000000L, 0x30000000L,
124d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20010000L, 0x30010000L, 0x20000004L, 0x30000004L, 0x20010004L,
125d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x30010004L, 0x00100000L, 0x10100000L, 0x00110000L, 0x10110000L,
126d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00100004L, 0x10100004L, 0x00110004L, 0x10110004L, 0x20100000L,
127d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x30100000L, 0x20110000L, 0x30110000L, 0x20100004L, 0x30100004L,
128d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20110004L, 0x30110004L, 0x00001000L, 0x10001000L, 0x00011000L,
129d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x10011000L, 0x00001004L, 0x10001004L, 0x00011004L, 0x10011004L,
130d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20001000L, 0x30001000L, 0x20011000L, 0x30011000L, 0x20001004L,
131d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x30001004L, 0x20011004L, 0x30011004L, 0x00101000L, 0x10101000L,
132d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00111000L, 0x10111000L, 0x00101004L, 0x10101004L, 0x00111004L,
133d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x10111004L, 0x20101000L, 0x30101000L, 0x20111000L, 0x30111000L,
134d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20101004L, 0x30101004L, 0x20111004L, 0x30111004L, },
135d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
136d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x08000000L, 0x00000008L, 0x08000008L, 0x00000400L,
137d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x08000400L, 0x00000408L, 0x08000408L, 0x00020000L, 0x08020000L,
138d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00020008L, 0x08020008L, 0x00020400L, 0x08020400L, 0x00020408L,
139d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x08020408L, 0x00000001L, 0x08000001L, 0x00000009L, 0x08000009L,
140d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000401L, 0x08000401L, 0x00000409L, 0x08000409L, 0x00020001L,
141d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x08020001L, 0x00020009L, 0x08020009L, 0x00020401L, 0x08020401L,
142d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00020409L, 0x08020409L, 0x02000000L, 0x0A000000L, 0x02000008L,
143d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x0A000008L, 0x02000400L, 0x0A000400L, 0x02000408L, 0x0A000408L,
144d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x02020000L, 0x0A020000L, 0x02020008L, 0x0A020008L, 0x02020400L,
145d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x0A020400L, 0x02020408L, 0x0A020408L, 0x02000001L, 0x0A000001L,
146d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x02000009L, 0x0A000009L, 0x02000401L, 0x0A000401L, 0x02000409L,
147d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x0A000409L, 0x02020001L, 0x0A020001L, 0x02020009L, 0x0A020009L,
148d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x02020401L, 0x0A020401L, 0x02020409L, 0x0A020409L, },
149d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
150d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x00000100L, 0x00080000L, 0x00080100L, 0x01000000L,
151d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01000100L, 0x01080000L, 0x01080100L, 0x00000010L, 0x00000110L,
152d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00080010L, 0x00080110L, 0x01000010L, 0x01000110L, 0x01080010L,
153d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01080110L, 0x00200000L, 0x00200100L, 0x00280000L, 0x00280100L,
154d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01200000L, 0x01200100L, 0x01280000L, 0x01280100L, 0x00200010L,
155d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00200110L, 0x00280010L, 0x00280110L, 0x01200010L, 0x01200110L,
156d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01280010L, 0x01280110L, 0x00000200L, 0x00000300L, 0x00080200L,
157d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00080300L, 0x01000200L, 0x01000300L, 0x01080200L, 0x01080300L,
158d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000210L, 0x00000310L, 0x00080210L, 0x00080310L, 0x01000210L,
159d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01000310L, 0x01080210L, 0x01080310L, 0x00200200L, 0x00200300L,
160d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00280200L, 0x00280300L, 0x01200200L, 0x01200300L, 0x01280200L,
161d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01280300L, 0x00200210L, 0x00200310L, 0x00280210L, 0x00280310L,
162d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01200210L, 0x01200310L, 0x01280210L, 0x01280310L, },
163d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
164d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x04000000L, 0x00040000L, 0x04040000L, 0x00000002L,
165d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04000002L, 0x00040002L, 0x04040002L, 0x00002000L, 0x04002000L,
166d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00042000L, 0x04042000L, 0x00002002L, 0x04002002L, 0x00042002L,
167d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04042002L, 0x00000020L, 0x04000020L, 0x00040020L, 0x04040020L,
168d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000022L, 0x04000022L, 0x00040022L, 0x04040022L, 0x00002020L,
169d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04002020L, 0x00042020L, 0x04042020L, 0x00002022L, 0x04002022L,
170d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00042022L, 0x04042022L, 0x00000800L, 0x04000800L, 0x00040800L,
171d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04040800L, 0x00000802L, 0x04000802L, 0x00040802L, 0x04040802L,
172d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00002800L, 0x04002800L, 0x00042800L, 0x04042800L, 0x00002802L,
173d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04002802L, 0x00042802L, 0x04042802L, 0x00000820L, 0x04000820L,
174d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00040820L, 0x04040820L, 0x00000822L, 0x04000822L, 0x00040822L,
175d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04040822L, 0x00002820L, 0x04002820L, 0x00042820L, 0x04042820L,
176d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00002822L, 0x04002822L, 0x00042822L, 0x04042822L, }};
177d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
178d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic const uint32_t DES_SPtrans[8][64] = {
179d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* nibble 0 */
180d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x02080800L, 0x00080000L, 0x02000002L, 0x02080802L, 0x02000000L,
181d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00080802L, 0x00080002L, 0x02000002L, 0x00080802L, 0x02080800L,
182d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x02080000L, 0x00000802L, 0x02000802L, 0x02000000L, 0x00000000L,
183d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00080002L, 0x00080000L, 0x00000002L, 0x02000800L, 0x00080800L,
184d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x02080802L, 0x02080000L, 0x00000802L, 0x02000800L, 0x00000002L,
185d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000800L, 0x00080800L, 0x02080002L, 0x00000800L, 0x02000802L,
186d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x02080002L, 0x00000000L, 0x00000000L, 0x02080802L, 0x02000800L,
187d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00080002L, 0x02080800L, 0x00080000L, 0x00000802L, 0x02000800L,
188d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x02080002L, 0x00000800L, 0x00080800L, 0x02000002L, 0x00080802L,
189d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000002L, 0x02000002L, 0x02080000L, 0x02080802L, 0x00080800L,
190d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x02080000L, 0x02000802L, 0x02000000L, 0x00000802L, 0x00080002L,
191d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x00080000L, 0x02000000L, 0x02000802L, 0x02080800L,
192d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000002L, 0x02080002L, 0x00000800L, 0x00080802L, },
193d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* nibble 1 */
194d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x40108010L, 0x00000000L, 0x00108000L, 0x40100000L, 0x40000010L,
195d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00008010L, 0x40008000L, 0x00108000L, 0x00008000L, 0x40100010L,
196d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000010L, 0x40008000L, 0x00100010L, 0x40108000L, 0x40100000L,
197d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000010L, 0x00100000L, 0x40008010L, 0x40100010L, 0x00008000L,
198d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00108010L, 0x40000000L, 0x00000000L, 0x00100010L, 0x40008010L,
199d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00108010L, 0x40108000L, 0x40000010L, 0x40000000L, 0x00100000L,
200d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00008010L, 0x40108010L, 0x00100010L, 0x40108000L, 0x40008000L,
201d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00108010L, 0x40108010L, 0x00100010L, 0x40000010L, 0x00000000L,
202d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x40000000L, 0x00008010L, 0x00100000L, 0x40100010L, 0x00008000L,
203d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x40000000L, 0x00108010L, 0x40008010L, 0x40108000L, 0x00008000L,
204d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x40000010L, 0x00000010L, 0x40108010L, 0x00108000L,
205d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x40100000L, 0x40100010L, 0x00100000L, 0x00008010L, 0x40008000L,
206d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x40008010L, 0x00000010L, 0x40100000L, 0x00108000L, },
207d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* nibble 2 */
208d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04000001L, 0x04040100L, 0x00000100L, 0x04000101L, 0x00040001L,
209d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04000000L, 0x04000101L, 0x00040100L, 0x04000100L, 0x00040000L,
210d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04040000L, 0x00000001L, 0x04040101L, 0x00000101L, 0x00000001L,
211d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04040001L, 0x00000000L, 0x00040001L, 0x04040100L, 0x00000100L,
212d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000101L, 0x04040101L, 0x00040000L, 0x04000001L, 0x04040001L,
213d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04000100L, 0x00040101L, 0x04040000L, 0x00040100L, 0x00000000L,
214d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04000000L, 0x00040101L, 0x04040100L, 0x00000100L, 0x00000001L,
215d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00040000L, 0x00000101L, 0x00040001L, 0x04040000L, 0x04000101L,
216d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x04040100L, 0x00040100L, 0x04040001L, 0x00040001L,
217d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04000000L, 0x04040101L, 0x00000001L, 0x00040101L, 0x04000001L,
218d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04000000L, 0x04040101L, 0x00040000L, 0x04000100L, 0x04000101L,
219d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00040100L, 0x04000100L, 0x00000000L, 0x04040001L, 0x00000101L,
220d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x04000001L, 0x00040101L, 0x00000100L, 0x04040000L, },
221d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* nibble 3 */
222d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00401008L, 0x10001000L, 0x00000008L, 0x10401008L, 0x00000000L,
223d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x10400000L, 0x10001008L, 0x00400008L, 0x10401000L, 0x10000008L,
224d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x10000000L, 0x00001008L, 0x10000008L, 0x00401008L, 0x00400000L,
225d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x10000000L, 0x10400008L, 0x00401000L, 0x00001000L, 0x00000008L,
226d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00401000L, 0x10001008L, 0x10400000L, 0x00001000L, 0x00001008L,
227d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x00400008L, 0x10401000L, 0x10001000L, 0x10400008L,
228d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x10401008L, 0x00400000L, 0x10400008L, 0x00001008L, 0x00400000L,
229d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x10000008L, 0x00401000L, 0x10001000L, 0x00000008L, 0x10400000L,
230d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x10001008L, 0x00000000L, 0x00001000L, 0x00400008L, 0x00000000L,
231d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x10400008L, 0x10401000L, 0x00001000L, 0x10000000L, 0x10401008L,
232d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00401008L, 0x00400000L, 0x10401008L, 0x00000008L, 0x10001000L,
233d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00401008L, 0x00400008L, 0x00401000L, 0x10400000L, 0x10001008L,
234d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00001008L, 0x10000000L, 0x10000008L, 0x10401000L, },
235d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* nibble 4 */
236d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x08000000L, 0x00010000L, 0x00000400L, 0x08010420L, 0x08010020L,
237d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x08000400L, 0x00010420L, 0x08010000L, 0x00010000L, 0x00000020L,
238d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x08000020L, 0x00010400L, 0x08000420L, 0x08010020L, 0x08010400L,
239d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x00010400L, 0x08000000L, 0x00010020L, 0x00000420L,
240d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x08000400L, 0x00010420L, 0x00000000L, 0x08000020L, 0x00000020L,
241d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x08000420L, 0x08010420L, 0x00010020L, 0x08010000L, 0x00000400L,
242d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000420L, 0x08010400L, 0x08010400L, 0x08000420L, 0x00010020L,
243d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x08010000L, 0x00010000L, 0x00000020L, 0x08000020L, 0x08000400L,
244d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x08000000L, 0x00010400L, 0x08010420L, 0x00000000L, 0x00010420L,
245d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x08000000L, 0x00000400L, 0x00010020L, 0x08000420L, 0x00000400L,
246d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x08010420L, 0x08010020L, 0x08010400L, 0x00000420L,
247d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00010000L, 0x00010400L, 0x08010020L, 0x08000400L, 0x00000420L,
248d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000020L, 0x00010420L, 0x08010000L, 0x08000020L, },
249d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* nibble 5 */
250d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x80000040L, 0x00200040L, 0x00000000L, 0x80202000L, 0x00200040L,
251d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00002000L, 0x80002040L, 0x00200000L, 0x00002040L, 0x80202040L,
252d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00202000L, 0x80000000L, 0x80002000L, 0x80000040L, 0x80200000L,
253d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00202040L, 0x00200000L, 0x80002040L, 0x80200040L, 0x00000000L,
254d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00002000L, 0x00000040L, 0x80202000L, 0x80200040L, 0x80202040L,
255d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x80200000L, 0x80000000L, 0x00002040L, 0x00000040L, 0x00202000L,
256d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00202040L, 0x80002000L, 0x00002040L, 0x80000000L, 0x80002000L,
257d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00202040L, 0x80202000L, 0x00200040L, 0x00000000L, 0x80002000L,
258d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x80000000L, 0x00002000L, 0x80200040L, 0x00200000L, 0x00200040L,
259d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x80202040L, 0x00202000L, 0x00000040L, 0x80202040L, 0x00202000L,
260d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00200000L, 0x80002040L, 0x80000040L, 0x80200000L, 0x00202040L,
261d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x00002000L, 0x80000040L, 0x80002040L, 0x80202000L,
262d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x80200000L, 0x00002040L, 0x00000040L, 0x80200040L, },
263d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* nibble 6 */
264d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00004000L, 0x00000200L, 0x01000200L, 0x01000004L, 0x01004204L,
265d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00004004L, 0x00004200L, 0x00000000L, 0x01000000L, 0x01000204L,
266d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000204L, 0x01004000L, 0x00000004L, 0x01004200L, 0x01004000L,
267d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000204L, 0x01000204L, 0x00004000L, 0x00004004L, 0x01004204L,
268d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000000L, 0x01000200L, 0x01000004L, 0x00004200L, 0x01004004L,
269d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00004204L, 0x01004200L, 0x00000004L, 0x00004204L, 0x01004004L,
270d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000200L, 0x01000000L, 0x00004204L, 0x01004000L, 0x01004004L,
271d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000204L, 0x00004000L, 0x00000200L, 0x01000000L, 0x01004004L,
272d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01000204L, 0x00004204L, 0x00004200L, 0x00000000L, 0x00000200L,
273d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01000004L, 0x00000004L, 0x01000200L, 0x00000000L, 0x01000204L,
274d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01000200L, 0x00004200L, 0x00000204L, 0x00004000L, 0x01004204L,
275d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01000000L, 0x01004200L, 0x00000004L, 0x00004004L, 0x01004204L,
276d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x01000004L, 0x01004200L, 0x01004000L, 0x00004004L, },
277d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {/* nibble 7 */
278d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20800080L, 0x20820000L, 0x00020080L, 0x00000000L, 0x20020000L,
279d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00800080L, 0x20800000L, 0x20820080L, 0x00000080L, 0x20000000L,
280d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00820000L, 0x00020080L, 0x00820080L, 0x20020080L, 0x20000080L,
281d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20800000L, 0x00020000L, 0x00820080L, 0x00800080L, 0x20020000L,
282d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20820080L, 0x20000080L, 0x00000000L, 0x00820000L, 0x20000000L,
283d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00800000L, 0x20020080L, 0x20800080L, 0x00800000L, 0x00020000L,
284d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20820000L, 0x00000080L, 0x00800000L, 0x00020000L, 0x20000080L,
285d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20820080L, 0x00020080L, 0x20000000L, 0x00000000L, 0x00820000L,
286d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20800080L, 0x20020080L, 0x20020000L, 0x00800080L, 0x20820000L,
287d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x00000080L, 0x00800080L, 0x20020000L, 0x20820080L, 0x00800000L,
288d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20800000L, 0x20000080L, 0x00820000L, 0x00020080L, 0x20020080L,
289d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20800000L, 0x00000080L, 0x20820000L, 0x00820080L, 0x00000000L,
290d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     0x20000000L, 0x20800080L, 0x00020000L, 0x00820080L, }};
291d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
292d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define HPERM_OP(a, t, n, m)                  \
293d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  ((t) = ((((a) << (16 - (n))) ^ (a)) & (m)), \
29495add82835138f09cf7bb4a51c04c6320c241674David Benjamin   (a) = (a) ^ (t) ^ ((t) >> (16 - (n))))
295d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
296d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid DES_set_key(const DES_cblock *key, DES_key_schedule *schedule) {
297d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  static const int shifts2[16] = {0, 0, 1, 1, 1, 1, 1, 1,
298d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                                  0, 1, 1, 1, 1, 1, 1, 0};
299d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t c, d, t, s, t2;
300d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const uint8_t *in;
301d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int i;
302d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
303d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  in = key->bytes;
304d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
305d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  c2l(in, c);
306d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  c2l(in, d);
307d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
308d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* do PC1 in 47 simple operations :-)
309d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
310d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * for the inspiration. :-) */
311d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PERM_OP(d, c, t, 4, 0x0f0f0f0fL);
312d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  HPERM_OP(c, t, -2, 0xcccc0000L);
313d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  HPERM_OP(d, t, -2, 0xcccc0000L);
314d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PERM_OP(d, c, t, 1, 0x55555555L);
315d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PERM_OP(c, d, t, 8, 0x00ff00ffL);
316d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PERM_OP(d, c, t, 1, 0x55555555L);
317d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  d = (((d & 0x000000ffL) << 16L) | (d & 0x0000ff00L) |
318d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       ((d & 0x00ff0000L) >> 16L) | ((c & 0xf0000000L) >> 4L));
319d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  c &= 0x0fffffffL;
320d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
321d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  for (i = 0; i < ITERATIONS; i++) {
322d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (shifts2[i]) {
323d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c = ((c >> 2L) | (c << 26L));
324d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      d = ((d >> 2L) | (d << 26L));
325d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    } else {
326d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c = ((c >> 1L) | (c << 27L));
327d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      d = ((d >> 1L) | (d << 27L));
328d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
329d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c &= 0x0fffffffL;
330d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    d &= 0x0fffffffL;
331d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    /* could be a few less shifts but I am to lazy at this
332d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     * point in time to investigate */
333d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s = des_skb[0][(c) & 0x3f] |
334d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        des_skb[1][((c >> 6L) & 0x03) | ((c >> 7L) & 0x3c)] |
335d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        des_skb[2][((c >> 13L) & 0x0f) | ((c >> 14L) & 0x30)] |
336d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        des_skb[3][((c >> 20L) & 0x01) | ((c >> 21L) & 0x06) |
337d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                   ((c >> 22L) & 0x38)];
338d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t = des_skb[4][(d) & 0x3f] |
339d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        des_skb[5][((d >> 7L) & 0x03) | ((d >> 8L) & 0x3c)] |
340d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        des_skb[6][(d >> 15L) & 0x3f] |
341d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        des_skb[7][((d >> 21L) & 0x0f) | ((d >> 22L) & 0x30)];
342d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
343d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    /* table contained 0213 4657 */
344d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t2 = ((t << 16L) | (s & 0x0000ffffL)) & 0xffffffffL;
345b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    schedule->subkeys[i][0] = ROTATE(t2, 30) & 0xffffffffL;
346d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
347d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t2 = ((s >> 16L) | (t & 0xffff0000L));
348b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    schedule->subkeys[i][1] = ROTATE(t2, 26) & 0xffffffffL;
349d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
350d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
351d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
352e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleystatic const uint8_t kOddParity[256] = {
353e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    1,   1,   2,   2,   4,   4,   7,   7,   8,   8,   11,  11,  13,  13,  14,
354e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    14,  16,  16,  19,  19,  21,  21,  22,  22,  25,  25,  26,  26,  28,  28,
355e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    31,  31,  32,  32,  35,  35,  37,  37,  38,  38,  41,  41,  42,  42,  44,
356e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    44,  47,  47,  49,  49,  50,  50,  52,  52,  55,  55,  56,  56,  59,  59,
357e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    61,  61,  62,  62,  64,  64,  67,  67,  69,  69,  70,  70,  73,  73,  74,
358e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    74,  76,  76,  79,  79,  81,  81,  82,  82,  84,  84,  87,  87,  88,  88,
359e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    91,  91,  93,  93,  94,  94,  97,  97,  98,  98,  100, 100, 103, 103, 104,
360e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    104, 107, 107, 109, 109, 110, 110, 112, 112, 115, 115, 117, 117, 118, 118,
361e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    121, 121, 122, 122, 124, 124, 127, 127, 128, 128, 131, 131, 133, 133, 134,
362e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    134, 137, 137, 138, 138, 140, 140, 143, 143, 145, 145, 146, 146, 148, 148,
363e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    151, 151, 152, 152, 155, 155, 157, 157, 158, 158, 161, 161, 162, 162, 164,
364e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    164, 167, 167, 168, 168, 171, 171, 173, 173, 174, 174, 176, 176, 179, 179,
365e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    181, 181, 182, 182, 185, 185, 186, 186, 188, 188, 191, 191, 193, 193, 194,
366e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    194, 196, 196, 199, 199, 200, 200, 203, 203, 205, 205, 206, 206, 208, 208,
367e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    211, 211, 213, 213, 214, 214, 217, 217, 218, 218, 220, 220, 223, 223, 224,
368e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    224, 227, 227, 229, 229, 230, 230, 233, 233, 234, 234, 236, 236, 239, 239,
369e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    241, 241, 242, 242, 244, 244, 247, 247, 248, 248, 251, 251, 253, 253, 254,
370e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    254
371e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley};
372e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
373e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleyvoid DES_set_odd_parity(DES_cblock *key) {
374e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  unsigned i;
375e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
376e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  for (i = 0; i < DES_KEY_SZ; i++) {
377e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    key->bytes[i] = kOddParity[key->bytes[i]];
378e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  }
379e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley}
380e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
381d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic void DES_encrypt1(uint32_t *data, const DES_key_schedule *ks, int enc) {
382d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t l, r, t, u;
383d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
384d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = data[0];
385d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = data[1];
386d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
387d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  IP(r, l);
388d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* Things have been modified so that the initial rotate is done outside
389d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * the loop.  This required the DES_SPtrans values in sp.h to be
390d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * rotated 1 bit to the right. One perl script later and things have a
391d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * 5% speed up on a sparc2. Thanks to Richard Outerbridge
392d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * <71755.204@CompuServe.COM> for pointing this out. */
393d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* clear the top bits on machines with 8byte longs */
394d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* shift left by 2 */
395d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = ROTATE(r, 29) & 0xffffffffL;
396d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = ROTATE(l, 29) & 0xffffffffL;
397d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
398d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* I don't know if it is worth the effort of loop unrolling the
399d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * inner loop */
400d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (enc) {
401b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 0);
402b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 1);
403b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 2);
404b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 3);
405b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 4);
406b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 5);
407b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 6);
408b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 7);
409b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 8);
410b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 9);
411b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 10);
412b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 11);
413b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 12);
414b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 13);
415b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 14);
416b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 15);
417d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  } else {
418b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 15);
419b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 14);
420b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 13);
421b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 12);
422b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 11);
423b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 10);
424b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 9);
425b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 8);
426b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 7);
427b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 6);
428b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 5);
429b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 4);
430b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 3);
431b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 2);
432b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 1);
433b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 0);
434d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
435d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
436d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* rotate and clear the top bits on machines with 8byte longs */
437d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = ROTATE(l, 3) & 0xffffffffL;
438d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = ROTATE(r, 3) & 0xffffffffL;
439d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
440d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  FP(r, l);
441d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[0] = l;
442d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[1] = r;
443d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
444d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
445d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic void DES_encrypt2(uint32_t *data, const DES_key_schedule *ks, int enc) {
446d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t l, r, t, u;
447d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
448d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = data[0];
449d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = data[1];
450d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
451d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* Things have been modified so that the initial rotate is done outside the
452d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * loop.  This required the DES_SPtrans values in sp.h to be rotated 1 bit to
453d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * the right. One perl script later and things have a 5% speed up on a
454d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * sparc2. Thanks to Richard Outerbridge <71755.204@CompuServe.COM> for
455d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * pointing this out. */
456d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* clear the top bits on machines with 8byte longs */
457d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = ROTATE(r, 29) & 0xffffffffL;
458d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = ROTATE(l, 29) & 0xffffffffL;
459d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
460d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* I don't know if it is worth the effort of loop unrolling the
461d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * inner loop */
462d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (enc) {
463b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 0);
464b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 1);
465b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 2);
466b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 3);
467b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 4);
468b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 5);
469b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 6);
470b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 7);
471b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 8);
472b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 9);
473b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 10);
474b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 11);
475b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 12);
476b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 13);
477b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 14);
478b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 15);
479d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  } else {
480b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 15);
481b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 14);
482b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 13);
483b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 12);
484b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 11);
485b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 10);
486b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 9);
487b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 8);
488b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 7);
489b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 6);
490b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 5);
491b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 4);
492b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 3);
493b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 2);
494b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, l, r, 1);
495b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root    D_ENCRYPT(ks, r, l, 0);
496d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
497d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* rotate and clear the top bits on machines with 8byte longs */
498d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[0] = ROTATE(l, 3) & 0xffffffffL;
499d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[1] = ROTATE(r, 3) & 0xffffffffL;
500d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
501d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
502b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Rootvoid DES_encrypt3(uint32_t *data, const DES_key_schedule *ks1,
503b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root                  const DES_key_schedule *ks2, const DES_key_schedule *ks3) {
504d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t l, r;
505d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
506d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = data[0];
507d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = data[1];
508d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  IP(l, r);
509d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[0] = l;
510d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[1] = r;
511d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  DES_encrypt2((uint32_t *)data, ks1, DES_ENCRYPT);
512d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  DES_encrypt2((uint32_t *)data, ks2, DES_DECRYPT);
513d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  DES_encrypt2((uint32_t *)data, ks3, DES_ENCRYPT);
514d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = data[0];
515d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = data[1];
516d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  FP(r, l);
517d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[0] = l;
518d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[1] = r;
519d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
520d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
521b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Rootvoid DES_decrypt3(uint32_t *data, const DES_key_schedule *ks1,
522b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root                  const DES_key_schedule *ks2, const DES_key_schedule *ks3) {
523d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t l, r;
524d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
525d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = data[0];
526d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = data[1];
527d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  IP(l, r);
528d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[0] = l;
529d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[1] = r;
530d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  DES_encrypt2((uint32_t *)data, ks3, DES_DECRYPT);
531d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  DES_encrypt2((uint32_t *)data, ks2, DES_ENCRYPT);
532d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  DES_encrypt2((uint32_t *)data, ks1, DES_DECRYPT);
533d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = data[0];
534d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = data[1];
535d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  FP(r, l);
536d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[0] = l;
537d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[1] = r;
538d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
539d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
540d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid DES_ecb_encrypt(const DES_cblock *in_block, DES_cblock *out_block,
541d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                     const DES_key_schedule *schedule, int is_encrypt) {
542d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t l;
543d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t ll[2];
544d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const uint8_t *in = in_block->bytes;
545d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint8_t *out = out_block->bytes;
546d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
547d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  c2l(in, l);
548d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  ll[0] = l;
549d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  c2l(in, l);
550d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  ll[1] = l;
551d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  DES_encrypt1(ll, schedule, is_encrypt);
552d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = ll[0];
553d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l2c(l, out);
554d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = ll[1];
555d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l2c(l, out);
556d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  ll[0] = ll[1] = 0;
557d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
558d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
559d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid DES_ncbc_encrypt(const uint8_t *in, uint8_t *out, size_t len,
560d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                      const DES_key_schedule *schedule, DES_cblock *ivec,
561d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                      int enc) {
562d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t tin0, tin1;
563d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t tout0, tout1, xor0, xor1;
564d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t tin[2];
565d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  unsigned char *iv;
566d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
567d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  iv = ivec->bytes;
568d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
569d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (enc) {
570d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, tout0);
571d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, tout1);
572d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    for (; len >= 8; len -= 8) {
573d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin0);
574d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin1);
575d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin0 ^= tout0;
576d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
577d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin1 ^= tout1;
578d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
579d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_encrypt1((uint32_t *)tin, schedule, DES_ENCRYPT);
580d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0];
581d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout0, out);
582d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1];
583d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout1, out);
584d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
585d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (len != 0) {
586d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2ln(in, tin0, tin1, len);
587d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin0 ^= tout0;
588d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
589d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin1 ^= tout1;
590d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
591d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_encrypt1((uint32_t *)tin, schedule, DES_ENCRYPT);
592d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0];
593d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout0, out);
594d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1];
595d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout1, out);
596d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
597d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    iv = ivec->bytes;
598d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(tout0, iv);
599d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(tout1, iv);
600d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  } else {
601d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, xor0);
602d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, xor1);
603d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    for (; len >= 8; len -= 8) {
604d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin0);
605d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
606d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin1);
607d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
608d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_encrypt1((uint32_t *)tin, schedule, DES_DECRYPT);
609d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0] ^ xor0;
610d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1] ^ xor1;
611d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout0, out);
612d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout1, out);
613d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor0 = tin0;
614d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor1 = tin1;
615d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
616d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (len != 0) {
617d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin0);
618d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
619d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin1);
620d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
621d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_encrypt1((uint32_t *)tin, schedule, DES_DECRYPT);
622d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0] ^ xor0;
623d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1] ^ xor1;
624d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2cn(tout0, tout1, out, len);
625d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor0 = tin0;
626d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor1 = tin1;
627d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
628d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    iv = ivec->bytes;
629d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(xor0, iv);
630d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(xor1, iv);
631d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
632d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  tin[0] = tin[1] = 0;
633d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
634d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
635e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleyvoid DES_ecb3_encrypt(const DES_cblock *input, DES_cblock *output,
636e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley                      const DES_key_schedule *ks1, const DES_key_schedule *ks2,
637e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley                      const DES_key_schedule *ks3, int enc) {
638e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  uint32_t l0, l1;
639e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  uint32_t ll[2];
640e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  const uint8_t *in = input->bytes;
641e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  uint8_t *out = output->bytes;
642e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
643e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  c2l(in, l0);
644e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  c2l(in, l1);
645e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  ll[0] = l0;
646e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  ll[1] = l1;
647e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  if (enc) {
648e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    DES_encrypt3(ll, ks1, ks2, ks3);
649e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  } else {
650e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    DES_decrypt3(ll, ks1, ks2, ks3);
651e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  }
652e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  l0 = ll[0];
653e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  l1 = ll[1];
654e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  l2c(l0, out);
655e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  l2c(l1, out);
656e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley}
657e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
658d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid DES_ede3_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t len,
659d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                          const DES_key_schedule *ks1,
660d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                          const DES_key_schedule *ks2,
661d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                          const DES_key_schedule *ks3, DES_cblock *ivec,
662d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                          int enc) {
663d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t tin0, tin1;
664d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t tout0, tout1, xor0, xor1;
665d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t tin[2];
666d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint8_t *iv;
667d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
668d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  iv = ivec->bytes;
669d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
670d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (enc) {
671d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, tout0);
672d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, tout1);
673d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    for (; len >= 8; len -= 8) {
674d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin0);
675d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin1);
676d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin0 ^= tout0;
677d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin1 ^= tout1;
678d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
679d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
680d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
681d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_encrypt3((uint32_t *)tin, ks1, ks2, ks3);
682d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0];
683d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1];
684d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
685d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout0, out);
686d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout1, out);
687d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
688d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (len != 0) {
689d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2ln(in, tin0, tin1, len);
690d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin0 ^= tout0;
691d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin1 ^= tout1;
692d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
693d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
694d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
695d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_encrypt3((uint32_t *)tin, ks1, ks2, ks3);
696d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0];
697d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1];
698d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
699d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout0, out);
700d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout1, out);
701d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
702d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    iv = ivec->bytes;
703d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(tout0, iv);
704d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(tout1, iv);
705d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  } else {
706d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    uint32_t t0, t1;
707d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
708d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, xor0);
709d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, xor1);
710d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    for (; len >= 8; len -= 8) {
711d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin0);
712d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin1);
713d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
714d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t0 = tin0;
715d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t1 = tin1;
716d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
717d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
718d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
719d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_decrypt3((uint32_t *)tin, ks1, ks2, ks3);
720d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0];
721d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1];
722d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
723d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 ^= xor0;
724d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 ^= xor1;
725d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout0, out);
726d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout1, out);
727d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor0 = t0;
728d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor1 = t1;
729d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
730d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (len != 0) {
731d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin0);
732d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin1);
733d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
734d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t0 = tin0;
735d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t1 = tin1;
736d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
737d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
738d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
739d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_decrypt3((uint32_t *)tin, ks1, ks2, ks3);
740d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0];
741d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1];
742d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
743d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 ^= xor0;
744d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 ^= xor1;
745d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2cn(tout0, tout1, out, len);
746d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor0 = t0;
747d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor1 = t1;
748d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
749d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
750d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    iv = ivec->bytes;
751d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(xor0, iv);
752d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(xor1, iv);
753d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
754d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
755d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  tin[0] = tin[1] = 0;
756d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
757f4e427204234da139fd0585def4b4e22502e33f0Adam Langley
758f4e427204234da139fd0585def4b4e22502e33f0Adam Langleyvoid DES_ede2_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t len,
759f4e427204234da139fd0585def4b4e22502e33f0Adam Langley                          const DES_key_schedule *ks1,
760f4e427204234da139fd0585def4b4e22502e33f0Adam Langley                          const DES_key_schedule *ks2,
761f4e427204234da139fd0585def4b4e22502e33f0Adam Langley                          DES_cblock *ivec,
762f4e427204234da139fd0585def4b4e22502e33f0Adam Langley                          int enc) {
763f4e427204234da139fd0585def4b4e22502e33f0Adam Langley  DES_ede3_cbc_encrypt(in, out, len, ks1, ks2, ks1, ivec, enc);
764f4e427204234da139fd0585def4b4e22502e33f0Adam Langley}
765b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root
766b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root
767b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root/* Deprecated functions. */
768b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root
769b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Rootvoid DES_set_key_unchecked(const DES_cblock *key, DES_key_schedule *schedule) {
770b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root  DES_set_key(key, schedule);
771b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root}
7728ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan
7738ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#undef HPERM_OP
7748ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#undef c2l
7758ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#undef l2c
7768ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#undef c2ln
7778ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#undef l2cn
7788ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#undef PERM_OP
7798ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#undef IP
7808ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#undef FP
7818ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#undef LOAD_DATA
7828ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#undef D_ENCRYPT
7838ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#undef ITERATIONS
7848ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#undef HALF_ITERATIONS
7858ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#undef ROTATE
786