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)), \
294d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   (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  uint32_t *k;
302d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int i;
303d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
304d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  k = &schedule->ks->deslong[0];
305d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  in = key->bytes;
306d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
307d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  c2l(in, c);
308d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  c2l(in, d);
309d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
310d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* do PC1 in 47 simple operations :-)
311d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
312d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * for the inspiration. :-) */
313d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PERM_OP(d, c, t, 4, 0x0f0f0f0fL);
314d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  HPERM_OP(c, t, -2, 0xcccc0000L);
315d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  HPERM_OP(d, t, -2, 0xcccc0000L);
316d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PERM_OP(d, c, t, 1, 0x55555555L);
317d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PERM_OP(c, d, t, 8, 0x00ff00ffL);
318d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  PERM_OP(d, c, t, 1, 0x55555555L);
319d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  d = (((d & 0x000000ffL) << 16L) | (d & 0x0000ff00L) |
320d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       ((d & 0x00ff0000L) >> 16L) | ((c & 0xf0000000L) >> 4L));
321d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  c &= 0x0fffffffL;
322d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
323d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  for (i = 0; i < ITERATIONS; i++) {
324d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (shifts2[i]) {
325d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c = ((c >> 2L) | (c << 26L));
326d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      d = ((d >> 2L) | (d << 26L));
327d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    } else {
328d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c = ((c >> 1L) | (c << 27L));
329d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      d = ((d >> 1L) | (d << 27L));
330d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
331d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c &= 0x0fffffffL;
332d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    d &= 0x0fffffffL;
333d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    /* could be a few less shifts but I am to lazy at this
334d9e397b599b13d642138480a28c14db7a136bf0Adam Langley     * point in time to investigate */
335d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    s = des_skb[0][(c) & 0x3f] |
336d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        des_skb[1][((c >> 6L) & 0x03) | ((c >> 7L) & 0x3c)] |
337d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        des_skb[2][((c >> 13L) & 0x0f) | ((c >> 14L) & 0x30)] |
338d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        des_skb[3][((c >> 20L) & 0x01) | ((c >> 21L) & 0x06) |
339d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                   ((c >> 22L) & 0x38)];
340d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t = des_skb[4][(d) & 0x3f] |
341d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        des_skb[5][((d >> 7L) & 0x03) | ((d >> 8L) & 0x3c)] |
342d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        des_skb[6][(d >> 15L) & 0x3f] |
343d9e397b599b13d642138480a28c14db7a136bf0Adam Langley        des_skb[7][((d >> 21L) & 0x0f) | ((d >> 22L) & 0x30)];
344d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
345d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    /* table contained 0213 4657 */
346d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t2 = ((t << 16L) | (s & 0x0000ffffL)) & 0xffffffffL;
347d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    *(k++) = ROTATE(t2, 30) & 0xffffffffL;
348d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
349d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    t2 = ((s >> 16L) | (t & 0xffff0000L));
350d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    *(k++) = ROTATE(t2, 26) & 0xffffffffL;
351d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
352d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
353d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
354e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleystatic const uint8_t kOddParity[256] = {
355e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    1,   1,   2,   2,   4,   4,   7,   7,   8,   8,   11,  11,  13,  13,  14,
356e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    14,  16,  16,  19,  19,  21,  21,  22,  22,  25,  25,  26,  26,  28,  28,
357e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    31,  31,  32,  32,  35,  35,  37,  37,  38,  38,  41,  41,  42,  42,  44,
358e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    44,  47,  47,  49,  49,  50,  50,  52,  52,  55,  55,  56,  56,  59,  59,
359e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    61,  61,  62,  62,  64,  64,  67,  67,  69,  69,  70,  70,  73,  73,  74,
360e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    74,  76,  76,  79,  79,  81,  81,  82,  82,  84,  84,  87,  87,  88,  88,
361e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    91,  91,  93,  93,  94,  94,  97,  97,  98,  98,  100, 100, 103, 103, 104,
362e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    104, 107, 107, 109, 109, 110, 110, 112, 112, 115, 115, 117, 117, 118, 118,
363e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    121, 121, 122, 122, 124, 124, 127, 127, 128, 128, 131, 131, 133, 133, 134,
364e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    134, 137, 137, 138, 138, 140, 140, 143, 143, 145, 145, 146, 146, 148, 148,
365e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    151, 151, 152, 152, 155, 155, 157, 157, 158, 158, 161, 161, 162, 162, 164,
366e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    164, 167, 167, 168, 168, 171, 171, 173, 173, 174, 174, 176, 176, 179, 179,
367e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    181, 181, 182, 182, 185, 185, 186, 186, 188, 188, 191, 191, 193, 193, 194,
368e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    194, 196, 196, 199, 199, 200, 200, 203, 203, 205, 205, 206, 206, 208, 208,
369e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    211, 211, 213, 213, 214, 214, 217, 217, 218, 218, 220, 220, 223, 223, 224,
370e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    224, 227, 227, 229, 229, 230, 230, 233, 233, 234, 234, 236, 236, 239, 239,
371e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    241, 241, 242, 242, 244, 244, 247, 247, 248, 248, 251, 251, 253, 253, 254,
372e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    254
373e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley};
374e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
375e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleyvoid DES_set_odd_parity(DES_cblock *key) {
376e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  unsigned i;
377e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
378e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  for (i = 0; i < DES_KEY_SZ; i++) {
379e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    key->bytes[i] = kOddParity[key->bytes[i]];
380e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  }
381e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley}
382e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
383d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic void DES_encrypt1(uint32_t *data, const DES_key_schedule *ks, int enc) {
384d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t l, r, t, u;
385d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const uint32_t *s;
386d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
387d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = data[0];
388d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = data[1];
389d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
390d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  IP(r, l);
391d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* Things have been modified so that the initial rotate is done outside
392d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * the loop.  This required the DES_SPtrans values in sp.h to be
393d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * rotated 1 bit to the right. One perl script later and things have a
394d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * 5% speed up on a sparc2. Thanks to Richard Outerbridge
395d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * <71755.204@CompuServe.COM> for pointing this out. */
396d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* clear the top bits on machines with 8byte longs */
397d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* shift left by 2 */
398d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = ROTATE(r, 29) & 0xffffffffL;
399d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = ROTATE(l, 29) & 0xffffffffL;
400d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
401d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s = ks->ks->deslong;
402d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* I don't know if it is worth the effort of loop unrolling the
403d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * inner loop */
404d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (enc) {
405d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 0);  /*  1 */
406d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 2);  /*  2 */
407d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 4);  /*  3 */
408d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 6);  /*  4 */
409d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 8);  /*  5 */
410d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 10); /*  6 */
411d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 12); /*  7 */
412d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 14); /*  8 */
413d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 16); /*  9 */
414d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 18); /*  10 */
415d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 20); /*  11 */
416d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 22); /*  12 */
417d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 24); /*  13 */
418d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 26); /*  14 */
419d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 28); /*  15 */
420d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 30); /*  16 */
421d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  } else {
422d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 30); /* 16 */
423d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 28); /* 15 */
424d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 26); /* 14 */
425d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 24); /* 13 */
426d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 22); /* 12 */
427d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 20); /* 11 */
428d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 18); /* 10 */
429d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 16); /*  9 */
430d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 14); /*  8 */
431d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 12); /*  7 */
432d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 10); /*  6 */
433d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 8);  /*  5 */
434d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 6);  /*  4 */
435d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 4);  /*  3 */
436d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 2);  /*  2 */
437d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 0);  /*  1 */
438d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
439d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
440d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* rotate and clear the top bits on machines with 8byte longs */
441d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = ROTATE(l, 3) & 0xffffffffL;
442d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = ROTATE(r, 3) & 0xffffffffL;
443d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
444d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  FP(r, l);
445d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[0] = l;
446d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[1] = r;
447d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
448d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
449d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic void DES_encrypt2(uint32_t *data, const DES_key_schedule *ks, int enc) {
450d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t l, r, t, u;
451d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const uint32_t *s;
452d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
453d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = data[0];
454d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = data[1];
455d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
456d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* Things have been modified so that the initial rotate is done outside the
457d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * loop.  This required the DES_SPtrans values in sp.h to be rotated 1 bit to
458d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * the right. One perl script later and things have a 5% speed up on a
459d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * sparc2. Thanks to Richard Outerbridge <71755.204@CompuServe.COM> for
460d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * pointing this out. */
461d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* clear the top bits on machines with 8byte longs */
462d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = ROTATE(r, 29) & 0xffffffffL;
463d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = ROTATE(l, 29) & 0xffffffffL;
464d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
465d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  s = ks->ks->deslong;
466d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* I don't know if it is worth the effort of loop unrolling the
467d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * inner loop */
468d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (enc) {
469d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 0);  /*  1 */
470d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 2);  /*  2 */
471d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 4);  /*  3 */
472d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 6);  /*  4 */
473d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 8);  /*  5 */
474d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 10); /*  6 */
475d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 12); /*  7 */
476d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 14); /*  8 */
477d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 16); /*  9 */
478d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 18); /*  10 */
479d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 20); /*  11 */
480d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 22); /*  12 */
481d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 24); /*  13 */
482d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 26); /*  14 */
483d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 28); /*  15 */
484d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 30); /*  16 */
485d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  } else {
486d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 30); /* 16 */
487d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 28); /* 15 */
488d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 26); /* 14 */
489d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 24); /* 13 */
490d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 22); /* 12 */
491d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 20); /* 11 */
492d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 18); /* 10 */
493d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 16); /*  9 */
494d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 14); /*  8 */
495d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 12); /*  7 */
496d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 10); /*  6 */
497d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 8);  /*  5 */
498d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 6);  /*  4 */
499d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 4);  /*  3 */
500d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(l, r, 2);  /*  2 */
501d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    D_ENCRYPT(r, l, 0);  /*  1 */
502d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
503d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* rotate and clear the top bits on machines with 8byte longs */
504d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[0] = ROTATE(l, 3) & 0xffffffffL;
505d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[1] = ROTATE(r, 3) & 0xffffffffL;
506d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
507d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
508d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic void DES_encrypt3(uint32_t *data, const DES_key_schedule *ks1,
509d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                         const DES_key_schedule *ks2,
510d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                         const DES_key_schedule *ks3) {
511d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t l, r;
512d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
513d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = data[0];
514d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = data[1];
515d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  IP(l, r);
516d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[0] = l;
517d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[1] = r;
518d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  DES_encrypt2((uint32_t *)data, ks1, DES_ENCRYPT);
519d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  DES_encrypt2((uint32_t *)data, ks2, DES_DECRYPT);
520d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  DES_encrypt2((uint32_t *)data, ks3, DES_ENCRYPT);
521d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = data[0];
522d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = data[1];
523d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  FP(r, l);
524d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[0] = l;
525d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[1] = r;
526d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
527d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
528d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic void DES_decrypt3(uint32_t *data, const DES_key_schedule *ks1,
529d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                         const DES_key_schedule *ks2,
530d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                         const DES_key_schedule *ks3) {
531d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t l, r;
532d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
533d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = data[0];
534d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = data[1];
535d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  IP(l, r);
536d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[0] = l;
537d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[1] = r;
538d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  DES_encrypt2((uint32_t *)data, ks3, DES_DECRYPT);
539d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  DES_encrypt2((uint32_t *)data, ks2, DES_ENCRYPT);
540d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  DES_encrypt2((uint32_t *)data, ks1, DES_DECRYPT);
541d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = data[0];
542d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  r = data[1];
543d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  FP(r, l);
544d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[0] = l;
545d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  data[1] = r;
546d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
547d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
548d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid DES_ecb_encrypt(const DES_cblock *in_block, DES_cblock *out_block,
549d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                     const DES_key_schedule *schedule, int is_encrypt) {
550d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t l;
551d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t ll[2];
552d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const uint8_t *in = in_block->bytes;
553d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint8_t *out = out_block->bytes;
554d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
555d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  c2l(in, l);
556d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  ll[0] = l;
557d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  c2l(in, l);
558d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  ll[1] = l;
559d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  DES_encrypt1(ll, schedule, is_encrypt);
560d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = ll[0];
561d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l2c(l, out);
562d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l = ll[1];
563d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  l2c(l, out);
564d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  ll[0] = ll[1] = 0;
565d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
566d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
567d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid DES_ncbc_encrypt(const uint8_t *in, uint8_t *out, size_t len,
568d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                      const DES_key_schedule *schedule, DES_cblock *ivec,
569d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                      int enc) {
570d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t tin0, tin1;
571d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t tout0, tout1, xor0, xor1;
572d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t tin[2];
573d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  unsigned char *iv;
574d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
575d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  iv = ivec->bytes;
576d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
577d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (enc) {
578d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, tout0);
579d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, tout1);
580d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    for (; len >= 8; len -= 8) {
581d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin0);
582d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin1);
583d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin0 ^= tout0;
584d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
585d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin1 ^= tout1;
586d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
587d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_encrypt1((uint32_t *)tin, schedule, DES_ENCRYPT);
588d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0];
589d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout0, out);
590d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1];
591d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout1, out);
592d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
593d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (len != 0) {
594d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2ln(in, tin0, tin1, len);
595d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin0 ^= tout0;
596d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
597d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin1 ^= tout1;
598d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
599d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_encrypt1((uint32_t *)tin, schedule, DES_ENCRYPT);
600d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0];
601d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout0, out);
602d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1];
603d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout1, out);
604d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
605d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    iv = ivec->bytes;
606d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(tout0, iv);
607d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(tout1, iv);
608d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  } else {
609d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, xor0);
610d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, xor1);
611d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    for (; len >= 8; len -= 8) {
612d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin0);
613d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
614d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin1);
615d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
616d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_encrypt1((uint32_t *)tin, schedule, DES_DECRYPT);
617d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0] ^ xor0;
618d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1] ^ xor1;
619d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout0, out);
620d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout1, out);
621d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor0 = tin0;
622d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor1 = tin1;
623d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
624d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (len != 0) {
625d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin0);
626d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
627d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin1);
628d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
629d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_encrypt1((uint32_t *)tin, schedule, DES_DECRYPT);
630d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0] ^ xor0;
631d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1] ^ xor1;
632d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2cn(tout0, tout1, out, len);
633d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor0 = tin0;
634d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor1 = tin1;
635d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
636d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    iv = ivec->bytes;
637d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(xor0, iv);
638d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(xor1, iv);
639d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
640d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  tin[0] = tin[1] = 0;
641d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
642d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
643e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleyvoid DES_ecb3_encrypt(const DES_cblock *input, DES_cblock *output,
644e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley                      const DES_key_schedule *ks1, const DES_key_schedule *ks2,
645e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley                      const DES_key_schedule *ks3, int enc) {
646e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  uint32_t l0, l1;
647e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  uint32_t ll[2];
648e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  const uint8_t *in = input->bytes;
649e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  uint8_t *out = output->bytes;
650e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
651e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  c2l(in, l0);
652e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  c2l(in, l1);
653e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  ll[0] = l0;
654e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  ll[1] = l1;
655e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  if (enc) {
656e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    DES_encrypt3(ll, ks1, ks2, ks3);
657e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  } else {
658e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley    DES_decrypt3(ll, ks1, ks2, ks3);
659e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  }
660e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  l0 = ll[0];
661e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  l1 = ll[1];
662e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  l2c(l0, out);
663e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  l2c(l1, out);
664e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley}
665e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
666d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid DES_ede3_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t len,
667d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                          const DES_key_schedule *ks1,
668d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                          const DES_key_schedule *ks2,
669d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                          const DES_key_schedule *ks3, DES_cblock *ivec,
670d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                          int enc) {
671d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t tin0, tin1;
672d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t tout0, tout1, xor0, xor1;
673d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint32_t tin[2];
674d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint8_t *iv;
675d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
676d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  iv = ivec->bytes;
677d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
678d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  if (enc) {
679d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, tout0);
680d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, tout1);
681d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    for (; len >= 8; len -= 8) {
682d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin0);
683d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin1);
684d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin0 ^= tout0;
685d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin1 ^= tout1;
686d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
687d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
688d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
689d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_encrypt3((uint32_t *)tin, ks1, ks2, ks3);
690d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0];
691d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1];
692d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
693d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout0, out);
694d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout1, out);
695d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
696d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (len != 0) {
697d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2ln(in, tin0, tin1, len);
698d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin0 ^= tout0;
699d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin1 ^= tout1;
700d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
701d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
702d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
703d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_encrypt3((uint32_t *)tin, ks1, ks2, ks3);
704d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0];
705d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1];
706d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
707d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout0, out);
708d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout1, out);
709d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
710d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    iv = ivec->bytes;
711d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(tout0, iv);
712d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(tout1, iv);
713d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  } else {
714d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    uint32_t t0, t1;
715d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
716d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, xor0);
717d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    c2l(iv, xor1);
718d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    for (; len >= 8; len -= 8) {
719d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin0);
720d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin1);
721d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
722d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t0 = tin0;
723d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t1 = tin1;
724d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
725d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
726d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
727d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_decrypt3((uint32_t *)tin, ks1, ks2, ks3);
728d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0];
729d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1];
730d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
731d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 ^= xor0;
732d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 ^= xor1;
733d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout0, out);
734d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2c(tout1, out);
735d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor0 = t0;
736d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor1 = t1;
737d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
738d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (len != 0) {
739d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin0);
740d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      c2l(in, tin1);
741d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
742d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t0 = tin0;
743d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      t1 = tin1;
744d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
745d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[0] = tin0;
746d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tin[1] = tin1;
747d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      DES_decrypt3((uint32_t *)tin, ks1, ks2, ks3);
748d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 = tin[0];
749d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 = tin[1];
750d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
751d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout0 ^= xor0;
752d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      tout1 ^= xor1;
753d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      l2cn(tout0, tout1, out, len);
754d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor0 = t0;
755d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      xor1 = t1;
756d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
757d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
758d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    iv = ivec->bytes;
759d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(xor0, iv);
760d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    l2c(xor1, iv);
761d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
762d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
763d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  tin[0] = tin[1] = 0;
764d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
76553b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley
76653b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langleyvoid DES_ede2_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t len,
76753b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley                          const DES_key_schedule *ks1,
76853b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley                          const DES_key_schedule *ks2,
76953b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley                          DES_cblock *ivec,
77053b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley                          int enc) {
77153b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley  DES_ede3_cbc_encrypt(in, out, len, ks1, ks2, ks1, ivec, enc);
77253b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley}
773