summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/rc2/rc2_cbc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/rc2/rc2_cbc.c')
-rw-r--r--src/lib/libcrypto/rc2/rc2_cbc.c317
1 files changed, 162 insertions, 155 deletions
diff --git a/src/lib/libcrypto/rc2/rc2_cbc.c b/src/lib/libcrypto/rc2/rc2_cbc.c
index 44204affbf..c4a58384db 100644
--- a/src/lib/libcrypto/rc2/rc2_cbc.c
+++ b/src/lib/libcrypto/rc2/rc2_cbc.c
@@ -1,25 +1,25 @@
1/* $OpenBSD: rc2_cbc.c,v 1.6 2022/11/26 16:08:54 tb Exp $ */ 1/* $OpenBSD: rc2_cbc.c,v 1.7 2023/07/07 08:29:37 beck Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
5 * This package is an SSL implementation written 5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com). 6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL. 7 * The implementation was written so as to conform with Netscapes SSL.
8 * 8 *
9 * This library is free for commercial and non-commercial use as long as 9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions 10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA, 11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms 13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 * 15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in 16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed. 17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution 18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used. 19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or 20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package. 21 * in documentation (online or textual) provided with the package.
22 * 22 *
23 * Redistribution and use in source and binary forms, with or without 23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions 24 * modification, are permitted provided that the following conditions
25 * are met: 25 * are met:
@@ -34,10 +34,10 @@
34 * Eric Young (eay@cryptsoft.com)" 34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library 35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-). 36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from 37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement: 38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 * 40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -49,7 +49,7 @@
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE. 51 * SUCH DAMAGE.
52 * 52 *
53 * The licence and distribution terms for any publically available version or 53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be 54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
@@ -59,168 +59,175 @@
59#include <openssl/rc2.h> 59#include <openssl/rc2.h>
60#include "rc2_local.h" 60#include "rc2_local.h"
61 61
62void RC2_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, 62void
63 RC2_KEY *ks, unsigned char *iv, int encrypt) 63RC2_cbc_encrypt(const unsigned char *in, unsigned char *out, long length,
64 { 64 RC2_KEY *ks, unsigned char *iv, int encrypt)
65 unsigned long tin0,tin1; 65{
66 unsigned long tout0,tout1,xor0,xor1; 66 unsigned long tin0, tin1;
67 long l=length; 67 unsigned long tout0, tout1, xor0, xor1;
68 long l = length;
68 unsigned long tin[2]; 69 unsigned long tin[2];
69 70
70 if (encrypt) 71 if (encrypt) {
72 c2l(iv, tout0);
73 c2l(iv, tout1);
74 iv -= 8;
75 for (l -= 8; l >= 0; l -= 8)
71 { 76 {
72 c2l(iv,tout0); 77 c2l(in, tin0);
73 c2l(iv,tout1); 78 c2l(in, tin1);
74 iv-=8; 79 tin0 ^= tout0;
75 for (l-=8; l>=0; l-=8) 80 tin1 ^= tout1;
76 { 81 tin[0] = tin0;
77 c2l(in,tin0); 82 tin[1] = tin1;
78 c2l(in,tin1); 83 RC2_encrypt(tin, ks);
79 tin0^=tout0; 84 tout0 = tin[0];
80 tin1^=tout1; 85 l2c(tout0, out);
81 tin[0]=tin0; 86 tout1 = tin[1];
82 tin[1]=tin1; 87 l2c(tout1, out);
83 RC2_encrypt(tin,ks); 88 }
84 tout0=tin[0]; l2c(tout0,out); 89 if (l != -8) {
85 tout1=tin[1]; l2c(tout1,out); 90 c2ln(in, tin0, tin1, l + 8);
86 } 91 tin0 ^= tout0;
87 if (l != -8) 92 tin1 ^= tout1;
88 { 93 tin[0] = tin0;
89 c2ln(in,tin0,tin1,l+8); 94 tin[1] = tin1;
90 tin0^=tout0; 95 RC2_encrypt(tin, ks);
91 tin1^=tout1; 96 tout0 = tin[0];
92 tin[0]=tin0; 97 l2c(tout0, out);
93 tin[1]=tin1; 98 tout1 = tin[1];
94 RC2_encrypt(tin,ks); 99 l2c(tout1, out);
95 tout0=tin[0]; l2c(tout0,out);
96 tout1=tin[1]; l2c(tout1,out);
97 }
98 l2c(tout0,iv);
99 l2c(tout1,iv);
100 } 100 }
101 else 101 l2c(tout0, iv);
102 l2c(tout1, iv);
103 } else {
104 c2l(iv, xor0);
105 c2l(iv, xor1);
106 iv -= 8;
107 for (l -= 8; l >= 0; l -= 8)
102 { 108 {
103 c2l(iv,xor0); 109 c2l(in, tin0);
104 c2l(iv,xor1); 110 tin[0] = tin0;
105 iv-=8; 111 c2l(in, tin1);
106 for (l-=8; l>=0; l-=8) 112 tin[1] = tin1;
107 { 113 RC2_decrypt(tin, ks);
108 c2l(in,tin0); tin[0]=tin0; 114 tout0 = tin[0] ^ xor0;
109 c2l(in,tin1); tin[1]=tin1; 115 tout1 = tin[1] ^ xor1;
110 RC2_decrypt(tin,ks); 116 l2c(tout0, out);
111 tout0=tin[0]^xor0; 117 l2c(tout1, out);
112 tout1=tin[1]^xor1; 118 xor0 = tin0;
113 l2c(tout0,out); 119 xor1 = tin1;
114 l2c(tout1,out);
115 xor0=tin0;
116 xor1=tin1;
117 }
118 if (l != -8)
119 {
120 c2l(in,tin0); tin[0]=tin0;
121 c2l(in,tin1); tin[1]=tin1;
122 RC2_decrypt(tin,ks);
123 tout0=tin[0]^xor0;
124 tout1=tin[1]^xor1;
125 l2cn(tout0,tout1,out,l+8);
126 xor0=tin0;
127 xor1=tin1;
128 }
129 l2c(xor0,iv);
130 l2c(xor1,iv);
131 } 120 }
132 tin0=tin1=tout0=tout1=xor0=xor1=0; 121 if (l != -8) {
133 tin[0]=tin[1]=0; 122 c2l(in, tin0);
123 tin[0] = tin0;
124 c2l(in, tin1);
125 tin[1] = tin1;
126 RC2_decrypt(tin, ks);
127 tout0 = tin[0] ^ xor0;
128 tout1 = tin[1] ^ xor1;
129 l2cn(tout0, tout1, out, l + 8);
130 xor0 = tin0;
131 xor1 = tin1;
132 }
133 l2c(xor0, iv);
134 l2c(xor1, iv);
134 } 135 }
135 136 tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0;
136void RC2_encrypt(unsigned long *d, RC2_KEY *key) 137 tin[0] = tin[1] = 0;
137 { 138}
138 int i,n; 139
139 RC2_INT *p0,*p1; 140void
140 RC2_INT x0,x1,x2,x3,t; 141RC2_encrypt(unsigned long *d, RC2_KEY *key)
142{
143 int i, n;
144 RC2_INT *p0, *p1;
145 RC2_INT x0, x1, x2, x3, t;
141 unsigned long l; 146 unsigned long l;
142 147
143 l=d[0]; 148 l = d[0];
144 x0=(RC2_INT)l&0xffff; 149 x0 = (RC2_INT)l & 0xffff;
145 x1=(RC2_INT)(l>>16L); 150 x1 = (RC2_INT)(l >> 16L);
146 l=d[1]; 151 l = d[1];
147 x2=(RC2_INT)l&0xffff; 152 x2 = (RC2_INT)l & 0xffff;
148 x3=(RC2_INT)(l>>16L); 153 x3 = (RC2_INT)(l >> 16L);
149 154
150 n=3; 155 n = 3;
151 i=5; 156 i = 5;
152 157
153 p0=p1= &(key->data[0]); 158 p0 = p1 = &(key->data[0]);
154 for (;;) 159 for (;;) {
155 { 160 t = (x0 + (x1 & ~x3) + (x2 & x3) + *(p0++)) & 0xffff;
156 t=(x0+(x1& ~x3)+(x2&x3)+ *(p0++))&0xffff; 161 x0 = (t << 1)|(t >> 15);
157 x0=(t<<1)|(t>>15); 162 t = (x1 + (x2 & ~x0) + (x3 & x0) + *(p0++)) & 0xffff;
158 t=(x1+(x2& ~x0)+(x3&x0)+ *(p0++))&0xffff; 163 x1 = (t << 2)|(t >> 14);
159 x1=(t<<2)|(t>>14); 164 t = (x2 + (x3 & ~x1) + (x0 & x1) + *(p0++)) & 0xffff;
160 t=(x2+(x3& ~x1)+(x0&x1)+ *(p0++))&0xffff; 165 x2 = (t << 3)|(t >> 13);
161 x2=(t<<3)|(t>>13); 166 t = (x3 + (x0 & ~x2) + (x1 & x2) + *(p0++)) & 0xffff;
162 t=(x3+(x0& ~x2)+(x1&x2)+ *(p0++))&0xffff; 167 x3 = (t << 5)|(t >> 11);
163 x3=(t<<5)|(t>>11); 168
164 169 if (--i == 0) {
165 if (--i == 0) 170 if (--n == 0)
166 { 171 break;
167 if (--n == 0) break; 172 i = (n == 2) ? 6 : 5;
168 i=(n == 2)?6:5; 173
169 174 x0 += p1[x3 & 0x3f];
170 x0+=p1[x3&0x3f]; 175 x1 += p1[x0 & 0x3f];
171 x1+=p1[x0&0x3f]; 176 x2 += p1[x1 & 0x3f];
172 x2+=p1[x1&0x3f]; 177 x3 += p1[x2 & 0x3f];
173 x3+=p1[x2&0x3f];
174 }
175 } 178 }
176
177 d[0]=(unsigned long)(x0&0xffff)|((unsigned long)(x1&0xffff)<<16L);
178 d[1]=(unsigned long)(x2&0xffff)|((unsigned long)(x3&0xffff)<<16L);
179 } 179 }
180 180
181void RC2_decrypt(unsigned long *d, RC2_KEY *key) 181 d[0] = (unsigned long)(x0 & 0xffff)|((unsigned long)(x1 & 0xffff) <<
182 { 182 16L);
183 int i,n; 183 d[1] = (unsigned long)(x2 & 0xffff)|((unsigned long)(x3 & 0xffff) <<
184 RC2_INT *p0,*p1; 184 16L);
185 RC2_INT x0,x1,x2,x3,t; 185}
186
187void
188RC2_decrypt(unsigned long *d, RC2_KEY *key)
189{
190 int i, n;
191 RC2_INT *p0, *p1;
192 RC2_INT x0, x1, x2, x3, t;
186 unsigned long l; 193 unsigned long l;
187 194
188 l=d[0]; 195 l = d[0];
189 x0=(RC2_INT)l&0xffff; 196 x0 = (RC2_INT)l & 0xffff;
190 x1=(RC2_INT)(l>>16L); 197 x1 = (RC2_INT)(l >> 16L);
191 l=d[1]; 198 l = d[1];
192 x2=(RC2_INT)l&0xffff; 199 x2 = (RC2_INT)l & 0xffff;
193 x3=(RC2_INT)(l>>16L); 200 x3 = (RC2_INT)(l >> 16L);
194 201
195 n=3; 202 n = 3;
196 i=5; 203 i = 5;
197 204
198 p0= &(key->data[63]); 205 p0 = &(key->data[63]);
199 p1= &(key->data[0]); 206 p1 = &(key->data[0]);
200 for (;;) 207 for (;;) {
201 { 208 t = ((x3 << 11)|(x3 >> 5)) & 0xffff;
202 t=((x3<<11)|(x3>>5))&0xffff; 209 x3 = (t - (x0 & ~x2) - (x1 & x2) - *(p0--)) & 0xffff;
203 x3=(t-(x0& ~x2)-(x1&x2)- *(p0--))&0xffff; 210 t = ((x2 << 13)|(x2 >> 3)) & 0xffff;
204 t=((x2<<13)|(x2>>3))&0xffff; 211 x2 = (t - (x3 & ~x1) - (x0 & x1) - *(p0--)) & 0xffff;
205 x2=(t-(x3& ~x1)-(x0&x1)- *(p0--))&0xffff; 212 t = ((x1 << 14)|(x1 >> 2)) & 0xffff;
206 t=((x1<<14)|(x1>>2))&0xffff; 213 x1 = (t - (x2 & ~x0) - (x3 & x0) - *(p0--)) & 0xffff;
207 x1=(t-(x2& ~x0)-(x3&x0)- *(p0--))&0xffff; 214 t = ((x0 << 15)|(x0 >> 1)) & 0xffff;
208 t=((x0<<15)|(x0>>1))&0xffff; 215 x0 = (t - (x1 & ~x3) - (x2 & x3) - *(p0--)) & 0xffff;
209 x0=(t-(x1& ~x3)-(x2&x3)- *(p0--))&0xffff; 216
210 217 if (--i == 0) {
211 if (--i == 0) 218 if (--n == 0)
212 { 219 break;
213 if (--n == 0) break; 220 i = (n == 2) ? 6 : 5;
214 i=(n == 2)?6:5; 221
215 222 x3 = (x3 - p1[x2 & 0x3f]) & 0xffff;
216 x3=(x3-p1[x2&0x3f])&0xffff; 223 x2 = (x2 - p1[x1 & 0x3f]) & 0xffff;
217 x2=(x2-p1[x1&0x3f])&0xffff; 224 x1 = (x1 - p1[x0 & 0x3f]) & 0xffff;
218 x1=(x1-p1[x0&0x3f])&0xffff; 225 x0 = (x0 - p1[x3 & 0x3f]) & 0xffff;
219 x0=(x0-p1[x3&0x3f])&0xffff;
220 }
221 } 226 }
222
223 d[0]=(unsigned long)(x0&0xffff)|((unsigned long)(x1&0xffff)<<16L);
224 d[1]=(unsigned long)(x2&0xffff)|((unsigned long)(x3&0xffff)<<16L);
225 } 227 }
226 228
229 d[0] = (unsigned long)(x0 & 0xffff)|((unsigned long)(x1 & 0xffff) <<
230 16L);
231 d[1] = (unsigned long)(x2 & 0xffff)|((unsigned long)(x3 & 0xffff) <<
232 16L);
233}