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