xref: /openbsd-src/lib/libcrypto/idea/idea.c (revision cc6c685f78ec203be343d985b642ef688edec7cf)
1*cc6c685fSjsing /* $OpenBSD: idea.c,v 1.1 2024/03/29 05:23:50 jsing Exp $ */
2*cc6c685fSjsing /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3*cc6c685fSjsing  * All rights reserved.
4*cc6c685fSjsing  *
5*cc6c685fSjsing  * This package is an SSL implementation written
6*cc6c685fSjsing  * by Eric Young (eay@cryptsoft.com).
7*cc6c685fSjsing  * The implementation was written so as to conform with Netscapes SSL.
8*cc6c685fSjsing  *
9*cc6c685fSjsing  * This library is free for commercial and non-commercial use as long as
10*cc6c685fSjsing  * the following conditions are aheared to.  The following conditions
11*cc6c685fSjsing  * apply to all code found in this distribution, be it the RC4, RSA,
12*cc6c685fSjsing  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13*cc6c685fSjsing  * included with this distribution is covered by the same copyright terms
14*cc6c685fSjsing  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15*cc6c685fSjsing  *
16*cc6c685fSjsing  * Copyright remains Eric Young's, and as such any Copyright notices in
17*cc6c685fSjsing  * the code are not to be removed.
18*cc6c685fSjsing  * If this package is used in a product, Eric Young should be given attribution
19*cc6c685fSjsing  * as the author of the parts of the library used.
20*cc6c685fSjsing  * This can be in the form of a textual message at program startup or
21*cc6c685fSjsing  * in documentation (online or textual) provided with the package.
22*cc6c685fSjsing  *
23*cc6c685fSjsing  * Redistribution and use in source and binary forms, with or without
24*cc6c685fSjsing  * modification, are permitted provided that the following conditions
25*cc6c685fSjsing  * are met:
26*cc6c685fSjsing  * 1. Redistributions of source code must retain the copyright
27*cc6c685fSjsing  *    notice, this list of conditions and the following disclaimer.
28*cc6c685fSjsing  * 2. Redistributions in binary form must reproduce the above copyright
29*cc6c685fSjsing  *    notice, this list of conditions and the following disclaimer in the
30*cc6c685fSjsing  *    documentation and/or other materials provided with the distribution.
31*cc6c685fSjsing  * 3. All advertising materials mentioning features or use of this software
32*cc6c685fSjsing  *    must display the following acknowledgement:
33*cc6c685fSjsing  *    "This product includes cryptographic software written by
34*cc6c685fSjsing  *     Eric Young (eay@cryptsoft.com)"
35*cc6c685fSjsing  *    The word 'cryptographic' can be left out if the rouines from the library
36*cc6c685fSjsing  *    being used are not cryptographic related :-).
37*cc6c685fSjsing  * 4. If you include any Windows specific code (or a derivative thereof) from
38*cc6c685fSjsing  *    the apps directory (application code) you must include an acknowledgement:
39*cc6c685fSjsing  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40*cc6c685fSjsing  *
41*cc6c685fSjsing  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42*cc6c685fSjsing  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43*cc6c685fSjsing  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44*cc6c685fSjsing  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45*cc6c685fSjsing  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46*cc6c685fSjsing  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47*cc6c685fSjsing  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48*cc6c685fSjsing  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49*cc6c685fSjsing  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50*cc6c685fSjsing  * OUT OF THE USE OF THIS  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51*cc6c685fSjsing  * SUCH DAMAGE.
52*cc6c685fSjsing  *
53*cc6c685fSjsing  * The licence and distribution terms for any publically available version or
54*cc6c685fSjsing  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55*cc6c685fSjsing  * copied and put under another distribution licence
56*cc6c685fSjsing  * [including the GNU Public Licence.]
57*cc6c685fSjsing  */
58*cc6c685fSjsing 
59*cc6c685fSjsing #include <openssl/idea.h>
60*cc6c685fSjsing #include "idea_local.h"
61*cc6c685fSjsing 
62*cc6c685fSjsing void
idea_cbc_encrypt(const unsigned char * in,unsigned char * out,long length,IDEA_KEY_SCHEDULE * ks,unsigned char * iv,int encrypt)63*cc6c685fSjsing idea_cbc_encrypt(const unsigned char *in, unsigned char *out, long length,
64*cc6c685fSjsing     IDEA_KEY_SCHEDULE *ks, unsigned char *iv, int encrypt)
65*cc6c685fSjsing {
66*cc6c685fSjsing 	unsigned long tin0, tin1;
67*cc6c685fSjsing 	unsigned long tout0, tout1, xor0, xor1;
68*cc6c685fSjsing 	long l = length;
69*cc6c685fSjsing 	unsigned long tin[2];
70*cc6c685fSjsing 
71*cc6c685fSjsing 	if (encrypt) {
72*cc6c685fSjsing 		n2l(iv, tout0);
73*cc6c685fSjsing 		n2l(iv, tout1);
74*cc6c685fSjsing 		iv -= 8;
75*cc6c685fSjsing 		for (l -= 8; l >= 0; l -= 8)
76*cc6c685fSjsing 		{
77*cc6c685fSjsing 			n2l(in, tin0);
78*cc6c685fSjsing 			n2l(in, tin1);
79*cc6c685fSjsing 			tin0 ^= tout0;
80*cc6c685fSjsing 			tin1 ^= tout1;
81*cc6c685fSjsing 			tin[0] = tin0;
82*cc6c685fSjsing 			tin[1] = tin1;
83*cc6c685fSjsing 			idea_encrypt(tin, ks);
84*cc6c685fSjsing 			tout0 = tin[0];
85*cc6c685fSjsing 			l2n(tout0, out);
86*cc6c685fSjsing 			tout1 = tin[1];
87*cc6c685fSjsing 			l2n(tout1, out);
88*cc6c685fSjsing 		}
89*cc6c685fSjsing 		if (l != -8) {
90*cc6c685fSjsing 			n2ln(in, tin0, tin1, l + 8);
91*cc6c685fSjsing 			tin0 ^= tout0;
92*cc6c685fSjsing 			tin1 ^= tout1;
93*cc6c685fSjsing 			tin[0] = tin0;
94*cc6c685fSjsing 			tin[1] = tin1;
95*cc6c685fSjsing 			idea_encrypt(tin, ks);
96*cc6c685fSjsing 			tout0 = tin[0];
97*cc6c685fSjsing 			l2n(tout0, out);
98*cc6c685fSjsing 			tout1 = tin[1];
99*cc6c685fSjsing 			l2n(tout1, out);
100*cc6c685fSjsing 		}
101*cc6c685fSjsing 		l2n(tout0, iv);
102*cc6c685fSjsing 		l2n(tout1, iv);
103*cc6c685fSjsing 	} else {
104*cc6c685fSjsing 		n2l(iv, xor0);
105*cc6c685fSjsing 		n2l(iv, xor1);
106*cc6c685fSjsing 		iv -= 8;
107*cc6c685fSjsing 		for (l -= 8; l >= 0; l -= 8)
108*cc6c685fSjsing 		{
109*cc6c685fSjsing 			n2l(in, tin0);
110*cc6c685fSjsing 			tin[0] = tin0;
111*cc6c685fSjsing 			n2l(in, tin1);
112*cc6c685fSjsing 			tin[1] = tin1;
113*cc6c685fSjsing 			idea_encrypt(tin, ks);
114*cc6c685fSjsing 			tout0 = tin[0] ^ xor0;
115*cc6c685fSjsing 			tout1 = tin[1] ^ xor1;
116*cc6c685fSjsing 			l2n(tout0, out);
117*cc6c685fSjsing 			l2n(tout1, out);
118*cc6c685fSjsing 			xor0 = tin0;
119*cc6c685fSjsing 			xor1 = tin1;
120*cc6c685fSjsing 		}
121*cc6c685fSjsing 		if (l != -8) {
122*cc6c685fSjsing 			n2l(in, tin0);
123*cc6c685fSjsing 			tin[0] = tin0;
124*cc6c685fSjsing 			n2l(in, tin1);
125*cc6c685fSjsing 			tin[1] = tin1;
126*cc6c685fSjsing 			idea_encrypt(tin, ks);
127*cc6c685fSjsing 			tout0 = tin[0] ^ xor0;
128*cc6c685fSjsing 			tout1 = tin[1] ^ xor1;
129*cc6c685fSjsing 			l2nn(tout0, tout1, out, l + 8);
130*cc6c685fSjsing 			xor0 = tin0;
131*cc6c685fSjsing 			xor1 = tin1;
132*cc6c685fSjsing 		}
133*cc6c685fSjsing 		l2n(xor0, iv);
134*cc6c685fSjsing 		l2n(xor1, iv);
135*cc6c685fSjsing 	}
136*cc6c685fSjsing 	tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0;
137*cc6c685fSjsing 	tin[0] = tin[1] = 0;
138*cc6c685fSjsing }
139*cc6c685fSjsing LCRYPTO_ALIAS(idea_cbc_encrypt);
140*cc6c685fSjsing 
141*cc6c685fSjsing void
idea_encrypt(unsigned long * d,IDEA_KEY_SCHEDULE * key)142*cc6c685fSjsing idea_encrypt(unsigned long *d, IDEA_KEY_SCHEDULE *key)
143*cc6c685fSjsing {
144*cc6c685fSjsing 	IDEA_INT *p;
145*cc6c685fSjsing 	unsigned long x1, x2, x3, x4, t0, t1, ul;
146*cc6c685fSjsing 
147*cc6c685fSjsing 	x2 = d[0];
148*cc6c685fSjsing 	x1 = (x2 >> 16);
149*cc6c685fSjsing 	x4 = d[1];
150*cc6c685fSjsing 	x3 = (x4 >> 16);
151*cc6c685fSjsing 
152*cc6c685fSjsing 	p = &(key->data[0][0]);
153*cc6c685fSjsing 
154*cc6c685fSjsing 	E_IDEA(0);
155*cc6c685fSjsing 	E_IDEA(1);
156*cc6c685fSjsing 	E_IDEA(2);
157*cc6c685fSjsing 	E_IDEA(3);
158*cc6c685fSjsing 	E_IDEA(4);
159*cc6c685fSjsing 	E_IDEA(5);
160*cc6c685fSjsing 	E_IDEA(6);
161*cc6c685fSjsing 	E_IDEA(7);
162*cc6c685fSjsing 
163*cc6c685fSjsing 	x1 &= 0xffff;
164*cc6c685fSjsing 	idea_mul(x1, x1, *p, ul);
165*cc6c685fSjsing 	p++;
166*cc6c685fSjsing 
167*cc6c685fSjsing 	t0 = x3 + *(p++);
168*cc6c685fSjsing 	t1 = x2 + *(p++);
169*cc6c685fSjsing 
170*cc6c685fSjsing 	x4 &= 0xffff;
171*cc6c685fSjsing 	idea_mul(x4, x4, *p, ul);
172*cc6c685fSjsing 
173*cc6c685fSjsing 	d[0] = (t0 & 0xffff)|((x1 & 0xffff) << 16);
174*cc6c685fSjsing 	d[1] = (x4 & 0xffff)|((t1 & 0xffff) << 16);
175*cc6c685fSjsing }
176*cc6c685fSjsing LCRYPTO_ALIAS(idea_encrypt);
177*cc6c685fSjsing 
178*cc6c685fSjsing /* The input and output encrypted as though 64bit cfb mode is being
179*cc6c685fSjsing  * used.  The extra state information to record how much of the
180*cc6c685fSjsing  * 64bit block we have used is contained in *num;
181*cc6c685fSjsing  */
182*cc6c685fSjsing 
183*cc6c685fSjsing void
idea_cfb64_encrypt(const unsigned char * in,unsigned char * out,long length,IDEA_KEY_SCHEDULE * schedule,unsigned char * ivec,int * num,int encrypt)184*cc6c685fSjsing idea_cfb64_encrypt(const unsigned char *in, unsigned char *out,
185*cc6c685fSjsing     long length, IDEA_KEY_SCHEDULE *schedule,
186*cc6c685fSjsing     unsigned char *ivec, int *num, int encrypt)
187*cc6c685fSjsing {
188*cc6c685fSjsing 	unsigned long v0, v1, t;
189*cc6c685fSjsing 	int n = *num;
190*cc6c685fSjsing 	long l = length;
191*cc6c685fSjsing 	unsigned long ti[2];
192*cc6c685fSjsing 	unsigned char *iv, c, cc;
193*cc6c685fSjsing 
194*cc6c685fSjsing 	iv = (unsigned char *)ivec;
195*cc6c685fSjsing 	if (encrypt) {
196*cc6c685fSjsing 		while (l--) {
197*cc6c685fSjsing 			if (n == 0) {
198*cc6c685fSjsing 				n2l(iv, v0);
199*cc6c685fSjsing 				ti[0] = v0;
200*cc6c685fSjsing 				n2l(iv, v1);
201*cc6c685fSjsing 				ti[1] = v1;
202*cc6c685fSjsing 				idea_encrypt((unsigned long *)ti, schedule);
203*cc6c685fSjsing 				iv = (unsigned char *)ivec;
204*cc6c685fSjsing 				t = ti[0];
205*cc6c685fSjsing 				l2n(t, iv);
206*cc6c685fSjsing 				t = ti[1];
207*cc6c685fSjsing 				l2n(t, iv);
208*cc6c685fSjsing 				iv = (unsigned char *)ivec;
209*cc6c685fSjsing 			}
210*cc6c685fSjsing 			c = *(in++) ^ iv[n];
211*cc6c685fSjsing 			*(out++) = c;
212*cc6c685fSjsing 			iv[n] = c;
213*cc6c685fSjsing 			n = (n + 1) & 0x07;
214*cc6c685fSjsing 		}
215*cc6c685fSjsing 	} else {
216*cc6c685fSjsing 		while (l--) {
217*cc6c685fSjsing 			if (n == 0) {
218*cc6c685fSjsing 				n2l(iv, v0);
219*cc6c685fSjsing 				ti[0] = v0;
220*cc6c685fSjsing 				n2l(iv, v1);
221*cc6c685fSjsing 				ti[1] = v1;
222*cc6c685fSjsing 				idea_encrypt((unsigned long *)ti, schedule);
223*cc6c685fSjsing 				iv = (unsigned char *)ivec;
224*cc6c685fSjsing 				t = ti[0];
225*cc6c685fSjsing 				l2n(t, iv);
226*cc6c685fSjsing 				t = ti[1];
227*cc6c685fSjsing 				l2n(t, iv);
228*cc6c685fSjsing 				iv = (unsigned char *)ivec;
229*cc6c685fSjsing 			}
230*cc6c685fSjsing 			cc = *(in++);
231*cc6c685fSjsing 			c = iv[n];
232*cc6c685fSjsing 			iv[n] = cc;
233*cc6c685fSjsing 			*(out++) = c ^ cc;
234*cc6c685fSjsing 			n = (n + 1) & 0x07;
235*cc6c685fSjsing 		}
236*cc6c685fSjsing 	}
237*cc6c685fSjsing 	v0 = v1 = ti[0] = ti[1] = t = c = cc = 0;
238*cc6c685fSjsing 	*num = n;
239*cc6c685fSjsing }
240*cc6c685fSjsing LCRYPTO_ALIAS(idea_cfb64_encrypt);
241*cc6c685fSjsing 
242*cc6c685fSjsing void
idea_ecb_encrypt(const unsigned char * in,unsigned char * out,IDEA_KEY_SCHEDULE * ks)243*cc6c685fSjsing idea_ecb_encrypt(const unsigned char *in, unsigned char *out,
244*cc6c685fSjsing     IDEA_KEY_SCHEDULE *ks)
245*cc6c685fSjsing {
246*cc6c685fSjsing 	unsigned long l0, l1, d[2];
247*cc6c685fSjsing 
248*cc6c685fSjsing 	n2l(in, l0);
249*cc6c685fSjsing 	d[0] = l0;
250*cc6c685fSjsing 	n2l(in, l1);
251*cc6c685fSjsing 	d[1] = l1;
252*cc6c685fSjsing 	idea_encrypt(d, ks);
253*cc6c685fSjsing 	l0 = d[0];
254*cc6c685fSjsing 	l2n(l0, out);
255*cc6c685fSjsing 	l1 = d[1];
256*cc6c685fSjsing 	l2n(l1, out);
257*cc6c685fSjsing 	l0 = l1 = d[0] = d[1] = 0;
258*cc6c685fSjsing }
259*cc6c685fSjsing LCRYPTO_ALIAS(idea_ecb_encrypt);
260*cc6c685fSjsing 
261*cc6c685fSjsing /*
262*cc6c685fSjsing  * The input and output encrypted as though 64bit ofb mode is being
263*cc6c685fSjsing  * used.  The extra state information to record how much of the
264*cc6c685fSjsing  * 64bit block we have used is contained in *num;
265*cc6c685fSjsing  */
266*cc6c685fSjsing void
idea_ofb64_encrypt(const unsigned char * in,unsigned char * out,long length,IDEA_KEY_SCHEDULE * schedule,unsigned char * ivec,int * num)267*cc6c685fSjsing idea_ofb64_encrypt(const unsigned char *in, unsigned char *out,
268*cc6c685fSjsing     long length, IDEA_KEY_SCHEDULE *schedule,
269*cc6c685fSjsing     unsigned char *ivec, int *num)
270*cc6c685fSjsing {
271*cc6c685fSjsing 	unsigned long v0, v1, t;
272*cc6c685fSjsing 	int n = *num;
273*cc6c685fSjsing 	long l = length;
274*cc6c685fSjsing 	unsigned char d[8];
275*cc6c685fSjsing 	char *dp;
276*cc6c685fSjsing 	unsigned long ti[2];
277*cc6c685fSjsing 	unsigned char *iv;
278*cc6c685fSjsing 	int save = 0;
279*cc6c685fSjsing 
280*cc6c685fSjsing 	iv = (unsigned char *)ivec;
281*cc6c685fSjsing 	n2l(iv, v0);
282*cc6c685fSjsing 	n2l(iv, v1);
283*cc6c685fSjsing 	ti[0] = v0;
284*cc6c685fSjsing 	ti[1] = v1;
285*cc6c685fSjsing 	dp = (char *)d;
286*cc6c685fSjsing 	l2n(v0, dp);
287*cc6c685fSjsing 	l2n(v1, dp);
288*cc6c685fSjsing 	while (l--) {
289*cc6c685fSjsing 		if (n == 0) {
290*cc6c685fSjsing 			idea_encrypt((unsigned long *)ti, schedule);
291*cc6c685fSjsing 			dp = (char *)d;
292*cc6c685fSjsing 			t = ti[0];
293*cc6c685fSjsing 			l2n(t, dp);
294*cc6c685fSjsing 			t = ti[1];
295*cc6c685fSjsing 			l2n(t, dp);
296*cc6c685fSjsing 			save++;
297*cc6c685fSjsing 		}
298*cc6c685fSjsing 		*(out++) = *(in++) ^ d[n];
299*cc6c685fSjsing 		n = (n + 1) & 0x07;
300*cc6c685fSjsing 	}
301*cc6c685fSjsing 	if (save) {
302*cc6c685fSjsing 		v0 = ti[0];
303*cc6c685fSjsing 		v1 = ti[1];
304*cc6c685fSjsing 		iv = (unsigned char *)ivec;
305*cc6c685fSjsing 		l2n(v0, iv);
306*cc6c685fSjsing 		l2n(v1, iv);
307*cc6c685fSjsing 	}
308*cc6c685fSjsing 	t = v0 = v1 = ti[0] = ti[1] = 0;
309*cc6c685fSjsing 	*num = n;
310*cc6c685fSjsing }
311*cc6c685fSjsing LCRYPTO_ALIAS(idea_ofb64_encrypt);
312*cc6c685fSjsing 
313*cc6c685fSjsing /* taken directly from the 'paper' I'll have a look at it later */
314*cc6c685fSjsing static IDEA_INT
inverse(unsigned int xin)315*cc6c685fSjsing inverse(unsigned int xin)
316*cc6c685fSjsing {
317*cc6c685fSjsing 	long n1, n2, q, r, b1, b2, t;
318*cc6c685fSjsing 
319*cc6c685fSjsing 	if (xin == 0)
320*cc6c685fSjsing 		b2 = 0;
321*cc6c685fSjsing 	else {
322*cc6c685fSjsing 		n1 = 0x10001;
323*cc6c685fSjsing 		n2 = xin;
324*cc6c685fSjsing 		b2 = 1;
325*cc6c685fSjsing 		b1 = 0;
326*cc6c685fSjsing 
327*cc6c685fSjsing 		do {
328*cc6c685fSjsing 			r = (n1 % n2);
329*cc6c685fSjsing 			q = (n1 - r)/n2;
330*cc6c685fSjsing 			if (r == 0) {
331*cc6c685fSjsing 				if (b2 < 0)
332*cc6c685fSjsing 					b2 = 0x10001 + b2;
333*cc6c685fSjsing 			} else {
334*cc6c685fSjsing 				n1 = n2;
335*cc6c685fSjsing 				n2 = r;
336*cc6c685fSjsing 				t = b2;
337*cc6c685fSjsing 				b2 = b1 - q*b2;
338*cc6c685fSjsing 				b1 = t;
339*cc6c685fSjsing 			}
340*cc6c685fSjsing 		} while (r != 0);
341*cc6c685fSjsing 	}
342*cc6c685fSjsing 	return ((IDEA_INT)b2);
343*cc6c685fSjsing }
344*cc6c685fSjsing 
345*cc6c685fSjsing void
idea_set_encrypt_key(const unsigned char * key,IDEA_KEY_SCHEDULE * ks)346*cc6c685fSjsing idea_set_encrypt_key(const unsigned char *key, IDEA_KEY_SCHEDULE *ks)
347*cc6c685fSjsing {
348*cc6c685fSjsing 	int i;
349*cc6c685fSjsing 	IDEA_INT *kt, *kf, r0, r1, r2;
350*cc6c685fSjsing 
351*cc6c685fSjsing 	kt = &(ks->data[0][0]);
352*cc6c685fSjsing 	n2s(key, kt[0]);
353*cc6c685fSjsing 	n2s(key, kt[1]);
354*cc6c685fSjsing 	n2s(key, kt[2]);
355*cc6c685fSjsing 	n2s(key, kt[3]);
356*cc6c685fSjsing 	n2s(key, kt[4]);
357*cc6c685fSjsing 	n2s(key, kt[5]);
358*cc6c685fSjsing 	n2s(key, kt[6]);
359*cc6c685fSjsing 	n2s(key, kt[7]);
360*cc6c685fSjsing 
361*cc6c685fSjsing 	kf = kt;
362*cc6c685fSjsing 	kt += 8;
363*cc6c685fSjsing 	for (i = 0; i < 6; i++)
364*cc6c685fSjsing 	{
365*cc6c685fSjsing 		r2 = kf[1];
366*cc6c685fSjsing 		r1 = kf[2];
367*cc6c685fSjsing 		*(kt++) = ((r2 << 9) | (r1 >> 7)) & 0xffff;
368*cc6c685fSjsing 		r0 = kf[3];
369*cc6c685fSjsing 		*(kt++) = ((r1 << 9) | (r0 >> 7)) & 0xffff;
370*cc6c685fSjsing 		r1 = kf[4];
371*cc6c685fSjsing 		*(kt++) = ((r0 << 9) | (r1 >> 7)) & 0xffff;
372*cc6c685fSjsing 		r0 = kf[5];
373*cc6c685fSjsing 		*(kt++) = ((r1 << 9) | (r0 >> 7)) & 0xffff;
374*cc6c685fSjsing 		r1 = kf[6];
375*cc6c685fSjsing 		*(kt++) = ((r0 << 9) | (r1 >> 7)) & 0xffff;
376*cc6c685fSjsing 		r0 = kf[7];
377*cc6c685fSjsing 		*(kt++) = ((r1 << 9) | (r0 >> 7)) & 0xffff;
378*cc6c685fSjsing 		r1 = kf[0];
379*cc6c685fSjsing 		if (i >= 5)
380*cc6c685fSjsing 			break;
381*cc6c685fSjsing 		*(kt++) = ((r0 << 9) | (r1 >> 7)) & 0xffff;
382*cc6c685fSjsing 		*(kt++) = ((r1 << 9) | (r2 >> 7)) & 0xffff;
383*cc6c685fSjsing 		kf += 8;
384*cc6c685fSjsing 	}
385*cc6c685fSjsing }
386*cc6c685fSjsing LCRYPTO_ALIAS(idea_set_encrypt_key);
387*cc6c685fSjsing 
388*cc6c685fSjsing void
idea_set_decrypt_key(IDEA_KEY_SCHEDULE * ek,IDEA_KEY_SCHEDULE * dk)389*cc6c685fSjsing idea_set_decrypt_key(IDEA_KEY_SCHEDULE *ek, IDEA_KEY_SCHEDULE *dk)
390*cc6c685fSjsing {
391*cc6c685fSjsing 	int r;
392*cc6c685fSjsing 	IDEA_INT *fp, *tp, t;
393*cc6c685fSjsing 
394*cc6c685fSjsing 	tp = &(dk->data[0][0]);
395*cc6c685fSjsing 	fp = &(ek->data[8][0]);
396*cc6c685fSjsing 	for (r = 0; r < 9; r++)
397*cc6c685fSjsing 	{
398*cc6c685fSjsing 		*(tp++) = inverse(fp[0]);
399*cc6c685fSjsing 		*(tp++) = ((int)(0x10000L - fp[2]) & 0xffff);
400*cc6c685fSjsing 		*(tp++) = ((int)(0x10000L - fp[1]) & 0xffff);
401*cc6c685fSjsing 		*(tp++) = inverse(fp[3]);
402*cc6c685fSjsing 		if (r == 8)
403*cc6c685fSjsing 			break;
404*cc6c685fSjsing 		fp -= 6;
405*cc6c685fSjsing 		*(tp++) = fp[4];
406*cc6c685fSjsing 		*(tp++) = fp[5];
407*cc6c685fSjsing 	}
408*cc6c685fSjsing 
409*cc6c685fSjsing 	tp = &(dk->data[0][0]);
410*cc6c685fSjsing 	t = tp[1];
411*cc6c685fSjsing 	tp[1] = tp[2];
412*cc6c685fSjsing 	tp[2] = t;
413*cc6c685fSjsing 
414*cc6c685fSjsing 	t = tp[49];
415*cc6c685fSjsing 	tp[49] = tp[50];
416*cc6c685fSjsing 	tp[50] = t;
417*cc6c685fSjsing }
418*cc6c685fSjsing LCRYPTO_ALIAS(idea_set_decrypt_key);
419