1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* crypto/des/des_enc.c */
2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * All rights reserved.
4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This package is an SSL implementation written
6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * by Eric Young (eay@cryptsoft.com).
7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The implementation was written so as to conform with Netscapes SSL.
8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This library is free for commercial and non-commercial use as long as
10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the following conditions are aheared to.  The following conditions
11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * apply to all code found in this distribution, be it the RC4, RSA,
12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * included with this distribution is covered by the same copyright terms
14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Copyright remains Eric Young's, and as such any Copyright notices in
17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the code are not to be removed.
18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * If this package is used in a product, Eric Young should be given attribution
19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * as the author of the parts of the library used.
20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This can be in the form of a textual message at program startup or
21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * in documentation (online or textual) provided with the package.
22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Redistribution and use in source and binary forms, with or without
24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * modification, are permitted provided that the following conditions
25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * are met:
26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 1. Redistributions of source code must retain the copyright
27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    notice, this list of conditions and the following disclaimer.
28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 2. Redistributions in binary form must reproduce the above copyright
29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    notice, this list of conditions and the following disclaimer in the
30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    documentation and/or other materials provided with the distribution.
31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 3. All advertising materials mentioning features or use of this software
32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    must display the following acknowledgement:
33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    "This product includes cryptographic software written by
34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *     Eric Young (eay@cryptsoft.com)"
35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    The word 'cryptographic' can be left out if the rouines from the library
36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    being used are not cryptographic related :-).
37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 4. If you include any Windows specific code (or a derivative thereof) from
38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    the apps directory (application code) you must include an acknowledgement:
39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * SUCH DAMAGE.
52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The licence and distribution terms for any publically available version or
54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * derivative of this code cannot be changed.  i.e. this code cannot simply be
55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * copied and put under another distribution licence
56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * [including the GNU Public Licence.]
57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */
58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "des_locl.h"
60480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include "spr.h"
61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid DES_encrypt1(DES_LONG *data, DES_key_schedule *ks, int enc)
63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register DES_LONG l,r,t,u;
65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef DES_PTR
66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register const unsigned char *des_SP=(const unsigned char *)DES_SPtrans;
67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef DES_UNROLL
69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register int i;
70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register DES_LONG *s;
72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	r=data[0];
74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	l=data[1];
75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	IP(r,l);
77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* Things have been modified so that the initial rotate is
78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * done outside the loop.  This required the
79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * DES_SPtrans values in sp.h to be rotated 1 bit to the right.
80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * One perl script later and things have a 5% speed up on a sparc2.
81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * for pointing this out. */
83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* clear the top bits on machines with 8byte longs */
84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* shift left by 2 */
85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	r=ROTATE(r,29)&0xffffffffL;
86c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	l=ROTATE(l,29)&0xffffffffL;
87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	s=ks->ks->deslong;
89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* I don't know if it is worth the effort of loop unrolling the
90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * inner loop */
91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (enc)
92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef DES_UNROLL
94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r, 0); /*  1 */
95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l, 2); /*  2 */
96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r, 4); /*  3 */
97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l, 6); /*  4 */
98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r, 8); /*  5 */
99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,10); /*  6 */
100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,12); /*  7 */
101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,14); /*  8 */
102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,16); /*  9 */
103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,18); /*  10 */
104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,20); /*  11 */
105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,22); /*  12 */
106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,24); /*  13 */
107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,26); /*  14 */
108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,28); /*  15 */
109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,30); /*  16 */
110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else
111480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		for (i=0; i<32; i+=4)
112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			D_ENCRYPT(l,r,i+0); /*  1 */
114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			D_ENCRYPT(r,l,i+2); /*  2 */
115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef DES_UNROLL
121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,30); /* 16 */
122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,28); /* 15 */
123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,26); /* 14 */
124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,24); /* 13 */
125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,22); /* 12 */
126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,20); /* 11 */
127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,18); /* 10 */
128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,16); /*  9 */
129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,14); /*  8 */
130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,12); /*  7 */
131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,10); /*  6 */
132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l, 8); /*  5 */
133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r, 6); /*  4 */
134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l, 4); /*  3 */
135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r, 2); /*  2 */
136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l, 0); /*  1 */
137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else
138480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		for (i=30; i>0; i-=4)
139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			D_ENCRYPT(l,r,i-0); /* 16 */
141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			D_ENCRYPT(r,l,i-2); /* 15 */
142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* rotate and clear the top bits on machines with 8byte longs */
147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	l=ROTATE(l,3)&0xffffffffL;
148c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	r=ROTATE(r,3)&0xffffffffL;
149c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
150c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	FP(r,l);
151c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	data[0]=l;
152c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	data[1]=r;
153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	l=r=t=u=0;
154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc)
157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register DES_LONG l,r,t,u;
159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef DES_PTR
160c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register const unsigned char *des_SP=(const unsigned char *)DES_SPtrans;
161c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
162c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef DES_UNROLL
163c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register int i;
164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register DES_LONG *s;
166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	r=data[0];
168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	l=data[1];
169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* Things have been modified so that the initial rotate is
171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * done outside the loop.  This required the
172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * DES_SPtrans values in sp.h to be rotated 1 bit to the right.
173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * One perl script later and things have a 5% speed up on a sparc2.
174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * for pointing this out. */
176c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* clear the top bits on machines with 8byte longs */
177c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	r=ROTATE(r,29)&0xffffffffL;
178c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	l=ROTATE(l,29)&0xffffffffL;
179c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
180c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	s=ks->ks->deslong;
181c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* I don't know if it is worth the effort of loop unrolling the
182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * inner loop */
183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (enc)
184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef DES_UNROLL
186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r, 0); /*  1 */
187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l, 2); /*  2 */
188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r, 4); /*  3 */
189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l, 6); /*  4 */
190c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r, 8); /*  5 */
191c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,10); /*  6 */
192c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,12); /*  7 */
193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,14); /*  8 */
194c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,16); /*  9 */
195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,18); /*  10 */
196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,20); /*  11 */
197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,22); /*  12 */
198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,24); /*  13 */
199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,26); /*  14 */
200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,28); /*  15 */
201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,30); /*  16 */
202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else
203480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		for (i=0; i<32; i+=4)
204c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			D_ENCRYPT(l,r,i+0); /*  1 */
206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			D_ENCRYPT(r,l,i+2); /*  2 */
207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
211c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
212c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef DES_UNROLL
213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,30); /* 16 */
214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,28); /* 15 */
215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,26); /* 14 */
216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,24); /* 13 */
217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,22); /* 12 */
218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,20); /* 11 */
219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,18); /* 10 */
220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,16); /*  9 */
221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,14); /*  8 */
222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l,12); /*  7 */
223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r,10); /*  6 */
224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l, 8); /*  5 */
225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r, 6); /*  4 */
226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l, 4); /*  3 */
227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(l,r, 2); /*  2 */
228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		D_ENCRYPT(r,l, 0); /*  1 */
229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else
230480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		for (i=30; i>0; i-=4)
231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			D_ENCRYPT(l,r,i-0); /* 16 */
233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			D_ENCRYPT(r,l,i-2); /* 15 */
234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* rotate and clear the top bits on machines with 8byte longs */
238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	data[0]=ROTATE(l,3)&0xffffffffL;
239c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	data[1]=ROTATE(r,3)&0xffffffffL;
240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	l=r=t=u=0;
241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1,
244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		  DES_key_schedule *ks2, DES_key_schedule *ks3)
245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register DES_LONG l,r;
247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	l=data[0];
249c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	r=data[1];
250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	IP(l,r);
251c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	data[0]=l;
252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	data[1]=r;
253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_encrypt2((DES_LONG *)data,ks1,DES_ENCRYPT);
254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_encrypt2((DES_LONG *)data,ks2,DES_DECRYPT);
255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_encrypt2((DES_LONG *)data,ks3,DES_ENCRYPT);
256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	l=data[0];
257c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	r=data[1];
258c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	FP(r,l);
259c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	data[0]=l;
260c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	data[1]=r;
261c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
262c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
263c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1,
264c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		  DES_key_schedule *ks2, DES_key_schedule *ks3)
265c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
266c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register DES_LONG l,r;
267c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	l=data[0];
269c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	r=data[1];
270c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	IP(l,r);
271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	data[0]=l;
272c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	data[1]=r;
273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_encrypt2((DES_LONG *)data,ks3,DES_DECRYPT);
274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_encrypt2((DES_LONG *)data,ks2,DES_ENCRYPT);
275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_encrypt2((DES_LONG *)data,ks1,DES_DECRYPT);
276c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	l=data[0];
277c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	r=data[1];
278c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	FP(r,l);
279c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	data[0]=l;
280c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	data[1]=r;
281c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
282c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
283c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef DES_DEFAULT_OPTIONS
284c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
285c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#undef CBC_ENC_C__DONT_UPDATE_IV
286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "ncbc_enc.c" /* DES_ncbc_encrypt */
287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output,
289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			  long length, DES_key_schedule *ks1,
290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			  DES_key_schedule *ks2, DES_key_schedule *ks3,
291c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			  DES_cblock *ivec, int enc)
292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register DES_LONG tin0,tin1;
294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register DES_LONG tout0,tout1,xor0,xor1;
295c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register const unsigned char *in;
296c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned char *out;
297c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	register long l=length;
298c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DES_LONG tin[2];
299c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned char *iv;
300c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
301c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	in=input;
302c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	out=output;
303c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	iv = &(*ivec)[0];
304c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
305c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (enc)
306c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
307c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		c2l(iv,tout0);
308c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		c2l(iv,tout1);
309c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (l-=8; l>=0; l-=8)
310c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
311c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			c2l(in,tin0);
312c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			c2l(in,tin1);
313c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tin0^=tout0;
314c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tin1^=tout1;
315c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
316c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tin[0]=tin0;
317c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tin[1]=tin1;
318c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			DES_encrypt3((DES_LONG *)tin,ks1,ks2,ks3);
319c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tout0=tin[0];
320c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tout1=tin[1];
321c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
322c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			l2c(tout0,out);
323c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			l2c(tout1,out);
324c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
325c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (l != -8)
326c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
327c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			c2ln(in,tin0,tin1,l+8);
328c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tin0^=tout0;
329c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tin1^=tout1;
330c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
331c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tin[0]=tin0;
332c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tin[1]=tin1;
333c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			DES_encrypt3((DES_LONG *)tin,ks1,ks2,ks3);
334c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tout0=tin[0];
335c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tout1=tin[1];
336c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
337c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			l2c(tout0,out);
338c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			l2c(tout1,out);
339c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
340c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		iv = &(*ivec)[0];
341c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		l2c(tout0,iv);
342c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		l2c(tout1,iv);
343c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
344c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
345c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
346c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		register DES_LONG t0,t1;
347c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
348c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		c2l(iv,xor0);
349c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		c2l(iv,xor1);
350c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (l-=8; l>=0; l-=8)
351c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
352c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			c2l(in,tin0);
353c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			c2l(in,tin1);
354c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
355c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			t0=tin0;
356c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			t1=tin1;
357c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
358c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tin[0]=tin0;
359c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tin[1]=tin1;
360c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			DES_decrypt3((DES_LONG *)tin,ks1,ks2,ks3);
361c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tout0=tin[0];
362c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tout1=tin[1];
363c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
364c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tout0^=xor0;
365c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tout1^=xor1;
366c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			l2c(tout0,out);
367c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			l2c(tout1,out);
368c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			xor0=t0;
369c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			xor1=t1;
370c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
371c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (l != -8)
372c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
373c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			c2l(in,tin0);
374c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			c2l(in,tin1);
375c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
376c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			t0=tin0;
377c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			t1=tin1;
378c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
379c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tin[0]=tin0;
380c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tin[1]=tin1;
381c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			DES_decrypt3((DES_LONG *)tin,ks1,ks2,ks3);
382c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tout0=tin[0];
383c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tout1=tin[1];
384c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
385c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tout0^=xor0;
386c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			tout1^=xor1;
387c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			l2cn(tout0,tout1,out,l+8);
388c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			xor0=t0;
389c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			xor1=t1;
390c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
391c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
392c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		iv = &(*ivec)[0];
393c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		l2c(xor0,iv);
394c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		l2c(xor1,iv);
395c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
396c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	tin0=tin1=tout0=tout1=xor0=xor1=0;
397c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	tin[0]=tin[1]=0;
398c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
399c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
400c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif /* DES_DEFAULT_OPTIONS */
401