diff options
author | beck <> | 2000-03-19 11:13:58 +0000 |
---|---|---|
committer | beck <> | 2000-03-19 11:13:58 +0000 |
commit | 796d609550df3a33fc11468741c5d2f6d3df4c11 (patch) | |
tree | 6c6d539061caa20372dad0ac4ddb1dfae2fbe7fe /src/lib/libcrypto/rc4 | |
parent | 5be3114c1fd7e0dfea1e38d3abb4cbba75244419 (diff) | |
download | openbsd-796d609550df3a33fc11468741c5d2f6d3df4c11.tar.gz openbsd-796d609550df3a33fc11468741c5d2f6d3df4c11.tar.bz2 openbsd-796d609550df3a33fc11468741c5d2f6d3df4c11.zip |
OpenSSL 0.9.5 merge
*warning* this bumps shared lib minors for libssl and libcrypto from 2.1 to 2.2
if you are using the ssl26 packages for ssh and other things to work you will
need to get new ones (see ~beck/libsslsnap/<arch>) on cvs or ~beck/src-patent.tar.gz on cvs
Diffstat (limited to 'src/lib/libcrypto/rc4')
-rw-r--r-- | src/lib/libcrypto/rc4/rc4.h | 4 | ||||
-rw-r--r-- | src/lib/libcrypto/rc4/rc4_enc.c | 186 | ||||
-rw-r--r-- | src/lib/libcrypto/rc4/rc4_skey.c | 2 | ||||
-rw-r--r-- | src/lib/libcrypto/rc4/rc4speed.c | 2 | ||||
-rw-r--r-- | src/lib/libcrypto/rc4/rc4test.c | 8 |
5 files changed, 193 insertions, 9 deletions
diff --git a/src/lib/libcrypto/rc4/rc4.h b/src/lib/libcrypto/rc4/rc4.h index 7418c2a9a2..8556dddab0 100644 --- a/src/lib/libcrypto/rc4/rc4.h +++ b/src/lib/libcrypto/rc4/rc4.h | |||
@@ -77,8 +77,8 @@ typedef struct rc4_key_st | |||
77 | 77 | ||
78 | 78 | ||
79 | const char *RC4_options(void); | 79 | const char *RC4_options(void); |
80 | void RC4_set_key(RC4_KEY *key, int len, unsigned char *data); | 80 | void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data); |
81 | void RC4(RC4_KEY *key, unsigned long len, unsigned char *indata, | 81 | void RC4(RC4_KEY *key, unsigned long len, const unsigned char *indata, |
82 | unsigned char *outdata); | 82 | unsigned char *outdata); |
83 | 83 | ||
84 | #ifdef __cplusplus | 84 | #ifdef __cplusplus |
diff --git a/src/lib/libcrypto/rc4/rc4_enc.c b/src/lib/libcrypto/rc4/rc4_enc.c index 3256bea8cc..d5f18a3a70 100644 --- a/src/lib/libcrypto/rc4/rc4_enc.c +++ b/src/lib/libcrypto/rc4/rc4_enc.c | |||
@@ -67,7 +67,7 @@ | |||
67 | * Date: Wed, 14 Sep 1994 06:35:31 GMT | 67 | * Date: Wed, 14 Sep 1994 06:35:31 GMT |
68 | */ | 68 | */ |
69 | 69 | ||
70 | void RC4(RC4_KEY *key, unsigned long len, unsigned char *indata, | 70 | void RC4(RC4_KEY *key, unsigned long len, const unsigned char *indata, |
71 | unsigned char *outdata) | 71 | unsigned char *outdata) |
72 | { | 72 | { |
73 | register RC4_INT *d; | 73 | register RC4_INT *d; |
@@ -78,6 +78,190 @@ void RC4(RC4_KEY *key, unsigned long len, unsigned char *indata, | |||
78 | y=key->y; | 78 | y=key->y; |
79 | d=key->data; | 79 | d=key->data; |
80 | 80 | ||
81 | #if defined(RC4_CHUNK) | ||
82 | /* | ||
83 | * The original reason for implementing this(*) was the fact that | ||
84 | * pre-21164a Alpha CPUs don't have byte load/store instructions | ||
85 | * and e.g. a byte store has to be done with 64-bit load, shift, | ||
86 | * and, or and finally 64-bit store. Peaking data and operating | ||
87 | * at natural word size made it possible to reduce amount of | ||
88 | * instructions as well as to perform early read-ahead without | ||
89 | * suffering from RAW (read-after-write) hazard. This resulted | ||
90 | * in ~40%(**) performance improvement on 21064 box with gcc. | ||
91 | * But it's not only Alpha users who win here:-) Thanks to the | ||
92 | * early-n-wide read-ahead this implementation also exhibits | ||
93 | * >40% speed-up on SPARC and 20-30% on 64-bit MIPS (depending | ||
94 | * on sizeof(RC4_INT)). | ||
95 | * | ||
96 | * (*) "this" means code which recognizes the case when input | ||
97 | * and output pointers appear to be aligned at natural CPU | ||
98 | * word boundary | ||
99 | * (**) i.e. according to 'apps/openssl speed rc4' benchmark, | ||
100 | * crypto/rc4/rc4speed.c exhibits almost 70% speed-up... | ||
101 | * | ||
102 | * Cavets. | ||
103 | * | ||
104 | * - RC4_CHUNK="unsigned long long" should be a #1 choice for | ||
105 | * UltraSPARC. Unfortunately gcc generates very slow code | ||
106 | * (2.5-3 times slower than one generated by Sun's WorkShop | ||
107 | * C) and therefore gcc (at least 2.95 and earlier) should | ||
108 | * always be told that RC4_CHUNK="unsigned long". | ||
109 | * | ||
110 | * <appro@fy.chalmers.se> | ||
111 | */ | ||
112 | |||
113 | # define RC4_STEP ( \ | ||
114 | x=(x+1) &0xff, \ | ||
115 | tx=d[x], \ | ||
116 | y=(tx+y)&0xff, \ | ||
117 | ty=d[y], \ | ||
118 | d[y]=tx, \ | ||
119 | d[x]=ty, \ | ||
120 | (RC4_CHUNK)d[(tx+ty)&0xff]\ | ||
121 | ) | ||
122 | |||
123 | if ( ( ((unsigned long)indata & (sizeof(RC4_CHUNK)-1)) | | ||
124 | ((unsigned long)outdata & (sizeof(RC4_CHUNK)-1)) ) == 0 ) | ||
125 | { | ||
126 | RC4_CHUNK ichunk,otp; | ||
127 | const union { long one; char little; } is_endian = {1}; | ||
128 | |||
129 | /* | ||
130 | * I reckon we can afford to implement both endian | ||
131 | * cases and to decide which way to take at run-time | ||
132 | * because the machine code appears to be very compact | ||
133 | * and redundant 1-2KB is perfectly tolerable (i.e. | ||
134 | * in case the compiler fails to eliminate it:-). By | ||
135 | * suggestion from Terrel Larson <terr@terralogic.net> | ||
136 | * who also stands for the is_endian union:-) | ||
137 | * | ||
138 | * Special notes. | ||
139 | * | ||
140 | * - is_endian is declared automatic as doing otherwise | ||
141 | * (declaring static) prevents gcc from eliminating | ||
142 | * the redundant code; | ||
143 | * - compilers (those I've tried) don't seem to have | ||
144 | * problems eliminating either the operators guarded | ||
145 | * by "if (sizeof(RC4_CHUNK)==8)" or the condition | ||
146 | * expressions themselves so I've got 'em to replace | ||
147 | * corresponding #ifdefs from the previous version; | ||
148 | * - I chose to let the redundant switch cases when | ||
149 | * sizeof(RC4_CHUNK)!=8 be (were also #ifdefed | ||
150 | * before); | ||
151 | * - in case you wonder "&(sizeof(RC4_CHUNK)*8-1)" in | ||
152 | * [LB]ESHFT guards against "shift is out of range" | ||
153 | * warnings when sizeof(RC4_CHUNK)!=8 | ||
154 | * | ||
155 | * <appro@fy.chalmers.se> | ||
156 | */ | ||
157 | if (!is_endian.little) | ||
158 | { /* BIG-ENDIAN CASE */ | ||
159 | # define BESHFT(c) (((sizeof(RC4_CHUNK)-(c)-1)*8)&(sizeof(RC4_CHUNK)*8-1)) | ||
160 | for (;len&-sizeof(RC4_CHUNK);len-=sizeof(RC4_CHUNK)) | ||
161 | { | ||
162 | ichunk = *(RC4_CHUNK *)indata; | ||
163 | otp = RC4_STEP<<BESHFT(0); | ||
164 | otp |= RC4_STEP<<BESHFT(1); | ||
165 | otp |= RC4_STEP<<BESHFT(2); | ||
166 | otp |= RC4_STEP<<BESHFT(3); | ||
167 | if (sizeof(RC4_CHUNK)==8) | ||
168 | { | ||
169 | otp |= RC4_STEP<<BESHFT(4); | ||
170 | otp |= RC4_STEP<<BESHFT(5); | ||
171 | otp |= RC4_STEP<<BESHFT(6); | ||
172 | otp |= RC4_STEP<<BESHFT(7); | ||
173 | } | ||
174 | *(RC4_CHUNK *)outdata = otp^ichunk; | ||
175 | indata += sizeof(RC4_CHUNK); | ||
176 | outdata += sizeof(RC4_CHUNK); | ||
177 | } | ||
178 | if (len) | ||
179 | { | ||
180 | RC4_CHUNK mask=(RC4_CHUNK)-1, ochunk; | ||
181 | |||
182 | ichunk = *(RC4_CHUNK *)indata; | ||
183 | ochunk = *(RC4_CHUNK *)outdata; | ||
184 | otp = 0; | ||
185 | i = BESHFT(0); | ||
186 | mask <<= (sizeof(RC4_CHUNK)-len)<<3; | ||
187 | switch (len&(sizeof(RC4_CHUNK)-1)) | ||
188 | { | ||
189 | case 7: otp = RC4_STEP<<i, i-=8; | ||
190 | case 6: otp |= RC4_STEP<<i, i-=8; | ||
191 | case 5: otp |= RC4_STEP<<i, i-=8; | ||
192 | case 4: otp |= RC4_STEP<<i, i-=8; | ||
193 | case 3: otp |= RC4_STEP<<i, i-=8; | ||
194 | case 2: otp |= RC4_STEP<<i, i-=8; | ||
195 | case 1: otp |= RC4_STEP<<i, i-=8; | ||
196 | case 0: ; /* | ||
197 | * it's never the case, | ||
198 | * but it has to be here | ||
199 | * for ultrix? | ||
200 | */ | ||
201 | } | ||
202 | ochunk &= ~mask; | ||
203 | ochunk |= (otp^ichunk) & mask; | ||
204 | *(RC4_CHUNK *)outdata = ochunk; | ||
205 | } | ||
206 | key->x=x; | ||
207 | key->y=y; | ||
208 | return; | ||
209 | } | ||
210 | else | ||
211 | { /* LITTLE-ENDIAN CASE */ | ||
212 | # define LESHFT(c) (((c)*8)&(sizeof(RC4_CHUNK)*8-1)) | ||
213 | for (;len&-sizeof(RC4_CHUNK);len-=sizeof(RC4_CHUNK)) | ||
214 | { | ||
215 | ichunk = *(RC4_CHUNK *)indata; | ||
216 | otp = RC4_STEP; | ||
217 | otp |= RC4_STEP<<8; | ||
218 | otp |= RC4_STEP<<16; | ||
219 | otp |= RC4_STEP<<24; | ||
220 | if (sizeof(RC4_CHUNK)==8) | ||
221 | { | ||
222 | otp |= RC4_STEP<<LESHFT(4); | ||
223 | otp |= RC4_STEP<<LESHFT(5); | ||
224 | otp |= RC4_STEP<<LESHFT(6); | ||
225 | otp |= RC4_STEP<<LESHFT(7); | ||
226 | } | ||
227 | *(RC4_CHUNK *)outdata = otp^ichunk; | ||
228 | indata += sizeof(RC4_CHUNK); | ||
229 | outdata += sizeof(RC4_CHUNK); | ||
230 | } | ||
231 | if (len) | ||
232 | { | ||
233 | RC4_CHUNK mask=(RC4_CHUNK)-1, ochunk; | ||
234 | |||
235 | ichunk = *(RC4_CHUNK *)indata; | ||
236 | ochunk = *(RC4_CHUNK *)outdata; | ||
237 | otp = 0; | ||
238 | i = 0; | ||
239 | mask >>= (sizeof(RC4_CHUNK)-len)<<3; | ||
240 | switch (len&(sizeof(RC4_CHUNK)-1)) | ||
241 | { | ||
242 | case 7: otp = RC4_STEP, i+=8; | ||
243 | case 6: otp |= RC4_STEP<<i, i+=8; | ||
244 | case 5: otp |= RC4_STEP<<i, i+=8; | ||
245 | case 4: otp |= RC4_STEP<<i, i+=8; | ||
246 | case 3: otp |= RC4_STEP<<i, i+=8; | ||
247 | case 2: otp |= RC4_STEP<<i, i+=8; | ||
248 | case 1: otp |= RC4_STEP<<i, i+=8; | ||
249 | case 0: ; /* | ||
250 | * it's never the case, | ||
251 | * but it has to be here | ||
252 | * for ultrix? | ||
253 | */ | ||
254 | } | ||
255 | ochunk &= ~mask; | ||
256 | ochunk |= (otp^ichunk) & mask; | ||
257 | *(RC4_CHUNK *)outdata = ochunk; | ||
258 | } | ||
259 | key->x=x; | ||
260 | key->y=y; | ||
261 | return; | ||
262 | } | ||
263 | } | ||
264 | #endif | ||
81 | #define LOOP(in,out) \ | 265 | #define LOOP(in,out) \ |
82 | x=((x+1)&0xff); \ | 266 | x=((x+1)&0xff); \ |
83 | tx=d[x]; \ | 267 | tx=d[x]; \ |
diff --git a/src/lib/libcrypto/rc4/rc4_skey.c b/src/lib/libcrypto/rc4/rc4_skey.c index c67a445f1f..bb10c1ebe2 100644 --- a/src/lib/libcrypto/rc4/rc4_skey.c +++ b/src/lib/libcrypto/rc4/rc4_skey.c | |||
@@ -85,7 +85,7 @@ const char *RC4_options(void) | |||
85 | * Date: Wed, 14 Sep 1994 06:35:31 GMT | 85 | * Date: Wed, 14 Sep 1994 06:35:31 GMT |
86 | */ | 86 | */ |
87 | 87 | ||
88 | void RC4_set_key(RC4_KEY *key, int len, register unsigned char *data) | 88 | void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data) |
89 | { | 89 | { |
90 | register RC4_INT tmp; | 90 | register RC4_INT tmp; |
91 | register int id1,id2; | 91 | register int id1,id2; |
diff --git a/src/lib/libcrypto/rc4/rc4speed.c b/src/lib/libcrypto/rc4/rc4speed.c index 4fb5ebf573..b448f4a5c6 100644 --- a/src/lib/libcrypto/rc4/rc4speed.c +++ b/src/lib/libcrypto/rc4/rc4speed.c | |||
@@ -183,7 +183,7 @@ int main(int argc, char **argv) | |||
183 | #endif | 183 | #endif |
184 | 184 | ||
185 | #ifndef TIMES | 185 | #ifndef TIMES |
186 | printf("To get the most acurate results, try to run this\n"); | 186 | printf("To get the most accurate results, try to run this\n"); |
187 | printf("program when this computer is idle.\n"); | 187 | printf("program when this computer is idle.\n"); |
188 | #endif | 188 | #endif |
189 | 189 | ||
diff --git a/src/lib/libcrypto/rc4/rc4test.c b/src/lib/libcrypto/rc4/rc4test.c index 5abf8cff30..3914eb6c38 100644 --- a/src/lib/libcrypto/rc4/rc4test.c +++ b/src/lib/libcrypto/rc4/rc4test.c | |||
@@ -69,7 +69,7 @@ int main(int argc, char *argv[]) | |||
69 | #else | 69 | #else |
70 | #include <openssl/rc4.h> | 70 | #include <openssl/rc4.h> |
71 | 71 | ||
72 | unsigned char keys[7][30]={ | 72 | static unsigned char keys[7][30]={ |
73 | {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}, | 73 | {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}, |
74 | {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}, | 74 | {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}, |
75 | {8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, | 75 | {8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, |
@@ -78,8 +78,8 @@ unsigned char keys[7][30]={ | |||
78 | {4,0xef,0x01,0x23,0x45}, | 78 | {4,0xef,0x01,0x23,0x45}, |
79 | }; | 79 | }; |
80 | 80 | ||
81 | unsigned char data_len[7]={8,8,8,20,28,10}; | 81 | static unsigned char data_len[7]={8,8,8,20,28,10}; |
82 | unsigned char data[7][30]={ | 82 | static unsigned char data[7][30]={ |
83 | {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xff}, | 83 | {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xff}, |
84 | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff}, | 84 | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff}, |
85 | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff}, | 85 | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff}, |
@@ -94,7 +94,7 @@ unsigned char data[7][30]={ | |||
94 | {0}, | 94 | {0}, |
95 | }; | 95 | }; |
96 | 96 | ||
97 | unsigned char output[7][30]={ | 97 | static unsigned char output[7][30]={ |
98 | {0x75,0xb7,0x87,0x80,0x99,0xe0,0xc5,0x96,0x00}, | 98 | {0x75,0xb7,0x87,0x80,0x99,0xe0,0xc5,0x96,0x00}, |
99 | {0x74,0x94,0xc2,0xe7,0x10,0x4b,0x08,0x79,0x00}, | 99 | {0x74,0x94,0xc2,0xe7,0x10,0x4b,0x08,0x79,0x00}, |
100 | {0xde,0x18,0x89,0x41,0xa3,0x37,0x5d,0x3a,0x00}, | 100 | {0xde,0x18,0x89,0x41,0xa3,0x37,0x5d,0x3a,0x00}, |