1 /*
2 * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10 /*
11 * IDEA low level APIs are deprecated for public use, but still ok for internal
12 * use where we're using them to implement the higher level EVP interface, as is
13 * the case here.
14 */
15 #include "internal/deprecated.h"
16
17 #include <openssl/idea.h>
18 #include "idea_local.h"
19
IDEA_cbc_encrypt(const unsigned char * in,unsigned char * out,long length,IDEA_KEY_SCHEDULE * ks,unsigned char * iv,int encrypt)20 void IDEA_cbc_encrypt(const unsigned char *in, unsigned char *out,
21 long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv,
22 int encrypt)
23 {
24 register unsigned long tin0, tin1;
25 register unsigned long tout0, tout1, xor0, xor1;
26 register long l = length;
27 unsigned long tin[2];
28
29 if (encrypt) {
30 n2l(iv, tout0);
31 n2l(iv, tout1);
32 iv -= 8;
33 for (l -= 8; l >= 0; l -= 8) {
34 n2l(in, tin0);
35 n2l(in, tin1);
36 tin0 ^= tout0;
37 tin1 ^= tout1;
38 tin[0] = tin0;
39 tin[1] = tin1;
40 IDEA_encrypt(tin, ks);
41 tout0 = tin[0];
42 l2n(tout0, out);
43 tout1 = tin[1];
44 l2n(tout1, out);
45 }
46 if (l != -8) {
47 n2ln(in, tin0, tin1, l + 8);
48 tin0 ^= tout0;
49 tin1 ^= tout1;
50 tin[0] = tin0;
51 tin[1] = tin1;
52 IDEA_encrypt(tin, ks);
53 tout0 = tin[0];
54 l2n(tout0, out);
55 tout1 = tin[1];
56 l2n(tout1, out);
57 }
58 l2n(tout0, iv);
59 l2n(tout1, iv);
60 } else {
61 n2l(iv, xor0);
62 n2l(iv, xor1);
63 iv -= 8;
64 for (l -= 8; l >= 0; l -= 8) {
65 n2l(in, tin0);
66 tin[0] = tin0;
67 n2l(in, tin1);
68 tin[1] = tin1;
69 IDEA_encrypt(tin, ks);
70 tout0 = tin[0] ^ xor0;
71 tout1 = tin[1] ^ xor1;
72 l2n(tout0, out);
73 l2n(tout1, out);
74 xor0 = tin0;
75 xor1 = tin1;
76 }
77 if (l != -8) {
78 n2l(in, tin0);
79 tin[0] = tin0;
80 n2l(in, tin1);
81 tin[1] = tin1;
82 IDEA_encrypt(tin, ks);
83 tout0 = tin[0] ^ xor0;
84 tout1 = tin[1] ^ xor1;
85 l2nn(tout0, tout1, out, l + 8);
86 xor0 = tin0;
87 xor1 = tin1;
88 }
89 l2n(xor0, iv);
90 l2n(xor1, iv);
91 }
92 tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0;
93 tin[0] = tin[1] = 0;
94 }
95
IDEA_encrypt(unsigned long * d,IDEA_KEY_SCHEDULE * key)96 void IDEA_encrypt(unsigned long *d, IDEA_KEY_SCHEDULE *key)
97 {
98 register IDEA_INT *p;
99 register unsigned long x1, x2, x3, x4, t0, t1, ul;
100
101 x2 = d[0];
102 x1 = (x2 >> 16);
103 x4 = d[1];
104 x3 = (x4 >> 16);
105
106 p = &(key->data[0][0]);
107
108 E_IDEA(0);
109 E_IDEA(1);
110 E_IDEA(2);
111 E_IDEA(3);
112 E_IDEA(4);
113 E_IDEA(5);
114 E_IDEA(6);
115 E_IDEA(7);
116
117 x1 &= 0xffff;
118 idea_mul(x1, x1, *p, ul);
119 p++;
120
121 t0 = x3 + *(p++);
122 t1 = x2 + *(p++);
123
124 x4 &= 0xffff;
125 idea_mul(x4, x4, *p, ul);
126
127 d[0] = (t0 & 0xffff) | ((x1 & 0xffff) << 16);
128 d[1] = (x4 & 0xffff) | ((t1 & 0xffff) << 16);
129 }
130