/[webpac]/openisis/0.9.9e/tcl/crypto.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /openisis/0.9.9e/tcl/crypto.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 604 - (show annotations)
Mon Dec 27 21:49:01 2004 UTC (19 years, 3 months ago) by dpavlin
File MIME type: text/plain
File size: 32556 byte(s)
import of new openisis release, 0.9.9e

1 /*
2 The Malete project - the Z39.2/Z39.50 database framework of OpenIsis.
3 Version 0.9.x (patchlevel see file Version)
4 Copyright (C) 2001-2004 by Erik Grziwotz, erik@openisis.org
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 See the GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20 see README for more information
21
22 THIS IS NOT a proper or required part of Malete.
23 The crypto code is borrowed -- with heavy modifications -- from:
24
25 SHA1 spec at http://ietf.org/rfc/rfc3174.txt
26 (originally at http://www.itl.nist.gov/fipspubs/fip180-1.htm)
27 SHA1_Transform (not much diff to RFC 3174) from
28 * SHA-1 in C
29 * By Steve Reid <steve@edmweb.com>
30 * 100% Public Domain
31 once distributed
32 * Copyright (c) 1999 Scriptics Corporation.
33 as
34 * exampleA.c --
35 at ftp://tcl.activestate.com/pub/tcl/examples/tea/sampleextension-0.2.tar.gz
36
37 The blowfish is basically as described by it's inventor Bruce Schneier
38 in http://www.schneier.com/paper-blowfish-fse.html
39 (c.f. Applied Cryptography http://www.schneier.com/book-applied-toc.html)
40 and available at http://www.schneier.com/blowfish.html
41
42 Some code was copied from Paul Kocher's LGPLed implementation
43 available at http://www.schneier.com/code/bfsh-koc.zip
44
45 EOH */
46
47 /*
48 $Id: crypto.c,v 1.4 2004/09/29 12:48:16 kripke Exp $
49 malete crypto utilities for Tcl
50 */
51
52 #include <tcl.h>
53 /* #include <tclInt.h> tclByteArrayType */
54 extern Tcl_ObjType tclByteArrayType;
55
56 #if defined( __sparc__ ) || defined( __ppc__ )
57 # define CPU_BIG_ENDIAN
58 #endif
59
60 #include <string.h> /* memcpy/set :( */
61
62 /* so here goes license.terms accompanying exampleA.c by Scriptics:
63 This software is copyrighted by the Scriptics Corporation, and other
64 parties. The following terms apply to all files associated with the
65 software unless explicitly disclaimed in individual files.
66
67 The authors hereby grant permission to use, copy, modify, distribute,
68 and license this software and its documentation for any purpose, provided
69 that existing copyright notices are retained in all copies and that this
70 notice is included verbatim in any distributions. No written agreement,
71 license, or royalty fee is required for any of the authorized uses.
72 Modifications to this software may be copyrighted by their authors
73 and need not follow the licensing terms described here, provided that
74 the new terms are clearly indicated on the first page of each file where
75 they apply.
76
77 IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
78 FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
79 ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
80 DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
81 POSSIBILITY OF SUCH DAMAGE.
82
83 THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
84 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
85 FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
86 IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
87 NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
88 MODIFICATIONS.
89
90 GOVERNMENT USE: If you are acquiring this software on behalf of the
91 U.S. government, the Government shall have only "Restricted Rights"
92 in the software and related documentation as defined in the Federal
93 Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you
94 are acquiring the software on behalf of the Department of Defense, the
95 software shall be classified as "Commercial Computer Software" and the
96 Government shall have only "Restricted Rights" as defined in Clause
97 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the
98 authors grant the U.S. Government and others acting in its behalf
99 permission to use and distribute the software in accordance with the
100 terms specified in this license.
101 */
102
103 /*
104 * SHA-1 in C
105 * By Steve Reid <steve@edmweb.com>
106 * 100% Public Domain
107 *
108 * Test Vectors (from FIPS PUB 180-1)
109 * "abc"
110 * A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
111 * "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
112 * 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
113 * A million repetitions of "a"
114 * 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
115 try malete::sha1 [string repeat a 1000000]
116 */
117
118
119 /*
120 sha1 string [state]
121 */
122 static int sha1Cmd (
123 ClientData ignore, Tcl_Interp *ip, int objc, Tcl_Obj* const objv[]
124 ) {
125 /* SHA1 initialization constants */
126 unsigned A = 0x67452301, B = 0xEFCDAB89,
127 C = 0x98BADCFE, D = 0x10325476, E = 0xC3D2E1F0;
128 unsigned l[16];
129 Tcl_WideUInt ll;
130 char ret[64]; /* 40 len \0 */
131 char *bytes;
132 int len, state = 0, add = 0;
133
134 (void) ignore;
135 switch ( objc ) {
136 case 3: /* state */
137 state = 1;
138 bytes = Tcl_GetStringFromObj(objv[2], &len); /* MUST be proper string */
139 if ( len /* init from previous state */
140 && 6 != sscanf(bytes, "%8x%8x%8x%8x%8x %d", &A,&B,&C,&D,&E,&add)
141 ) { /* sorrry for using sscanf ! */
142 Tcl_SetResult(ip, "bad state", TCL_STATIC);
143 return TCL_ERROR;
144 }
145 case 2:
146 break;
147 default:
148 Tcl_AppendResult(ip, "usage: ", Tcl_GetString(objv[0]), " string", 0);
149 return TCL_ERROR;
150 }
151
152 bytes = (&tclByteArrayType == objv[1]->typePtr)
153 ? (char*)Tcl_GetByteArrayFromObj(objv[1], &len)
154 : Tcl_GetStringFromObj(objv[1], &len);
155 ll = ((Tcl_WideUInt)(add+len)) << 3; /* bitcount */
156
157 if ( !len || 63&len ) /* close */
158 state = 0;
159 else if (state)
160 state = add+len;
161 for (; len > -9; bytes += 64, len -= 64) {
162 if ( 64 <= len ) /* fits */
163 memcpy(l, bytes, 64);
164 else {
165 memset(l, 0, 64); /* lazy pad */
166 if ( 0 <= len ) { /* previous block was fully used */
167 if ( 0 < len )
168 memcpy(l, bytes, len);
169 else if (state) /* return current unclosed A-E state */
170 break;
171 ((unsigned char*)l)[len] = 0x80; /* always pad binary 10000000 */
172 }
173 if ( 56 > len ) { /* room for the count (after pad) */
174 #ifdef CPU_BIG_ENDIAN
175 ((Tcl_WideUInt*)l)[7] = ll;
176 #else
177 char *d = (char*)(l+14), *s = (char*)&ll, *e = s+8;
178 do *d++ = *--e; while (e > s);
179 #endif
180 state = 0; /* closed */
181 }
182 }
183 /* SHA1_Transform */ {
184 register unsigned int a=A, b=B, c=C, d=D, e=E;
185
186 #define Rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
187 /*
188 * Blk0() and Blk() perform the initial expand.
189 * I got the idea of expanding during the round function from SSLeay
190 */
191 #ifdef CPU_BIG_ENDIAN
192 # define Blk0(i) l[i]
193 #else
194 # define Blk0(i) (l[i] = (Rol(l[i],24)&0xFF00FF00) \
195 |(Rol(l[i],8)&0x00FF00FF))
196 #endif
197 #define Blk(i) (l[i&15] = Rol(l[(i+13)&15]^l[(i+8)&15] \
198 ^l[(i+2)&15]^l[i&15],1))
199 /*
200 * (R0+R1), R2, R3, R4 are the different operations used in SHA1
201 */
202 #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+Blk0(i)+0x5A827999+Rol(v,5);w=Rol(w,30);
203 #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+Blk(i)+0x5A827999+Rol(v,5);w=Rol(w,30);
204 #define R2(v,w,x,y,z,i) z+=(w^x^y)+Blk(i)+0x6ED9EBA1+Rol(v,5);w=Rol(w,30);
205 #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+Blk(i)+0x8F1BBCDC+Rol(v,5);w=Rol(w,30);
206 #define R4(v,w,x,y,z,i) z+=(w^x^y)+Blk(i)+0xCA62C1D6+Rol(v,5);w=Rol(w,30);
207
208 /*
209 * 4 rounds of 20 operations each. Loop unrolled.
210 */
211
212 R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
213 R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
214 R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
215 R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
216 R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
217 R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
218 R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
219 R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
220 R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
221 R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
222 R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
223 R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
224 R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
225 R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
226 R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
227 R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
228 R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
229 R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
230 R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
231 R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
232
233 /*
234 * Add the working vars back into context.state[]
235 */
236
237 A += a;
238 B += b;
239 C += c;
240 D += d;
241 E += e;
242 }}
243 memset(l, 0, 64); /* wipe traces */
244
245 /* this always prints a big-endian representation */
246 if ( state )
247 sprintf(ret, "%08x%08x%08x%08x%08x %d", A,B,C,D,E, state);
248 else
249 sprintf(ret, "%08x%08x%08x%08x%08x", A,B,C,D,E);
250 Tcl_SetResult(ip, ret, TCL_VOLATILE);
251 return TCL_OK;
252 } /* sha1Cmd */
253
254
255
256 /*
257 blowfish.c: C implementation of the Blowfish algorithm.
258
259 Copyright (C) 1997 by Paul Kocher
260
261 This library is free software; you can redistribute it and/or
262 modify it under the terms of the GNU Lesser General Public
263 License as published by the Free Software Foundation; either
264 version 2.1 of the License, or (at your option) any later version.
265 This library is distributed in the hope that it will be useful,
266 but WITHOUT ANY WARRANTY; without even the implied warranty of
267 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
268 Lesser General Public License for more details.
269 You should have received a copy of the GNU Lesser General Public
270 License along with this library; if not, write to the Free Software
271 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
272
273
274
275
276 COMMENTS ON USING THIS CODE:
277
278 Normal usage is as follows:
279 [1] Allocate a BFish. (It may be too big for the stack.)
280 [2] Call Blowfish_Init with a pointer to your BFish, a pointer to
281 the key, and the number of bytes in the key.
282 [3] To encrypt a 64-bit block, call Blowfish_Encrypt with a pointer to
283 BFish, a pointer to the 32-bit left half of the plaintext
284 and a pointer to the 32-bit right half. The plaintext will be
285 overwritten with the ciphertext.
286 [4] Decryption is the same as encryption except that the plaintext and
287 ciphertext are reversed.
288
289 Warning #1: The code does not check key lengths. (Caveat encryptor.)
290 Warning #2: Beware that Blowfish keys repeat such that "ab" = "abab".
291 Warning #3: It is normally a good idea to zeroize the BFish before
292 freeing it.
293 Warning #4: Endianness conversions are the responsibility of the caller.
294 (To encrypt bytes on a little-endian platforms, you'll probably want
295 to swap bytes around instead of just casting.)
296 Warning #5: Make sure to use a reasonable mode of operation for your
297 application. (If you don't know what CBC mode is, see Warning #7.)
298 Warning #6: This code is susceptible to timing attacks.
299 Warning #7: Security engineering is risky and non-intuitive. Have someone
300 check your work. If you don't know what you are doing, get help.
301
302
303 This is code is fast enough for most applications, but is not optimized for
304 speed.
305
306 If you require this code under a license other than LGPL, please ask. (I
307 can be located using your favorite search engine.) Unfortunately, I do not
308 have time to provide unpaid support for everyone who uses this code.
309
310 -- Paul Kocher
311 */
312
313
314
315 typedef struct {
316 unsigned S[4][256];
317 unsigned P[18];
318 } BFish;
319
320
321 static const BFish BFishInit = {
322 {{
323 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,
324 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
325 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
326 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,
327 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
328 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
329 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,
330 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,
331 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
332 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,
333 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,
334 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
335 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,
336 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,
337 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
338 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
339 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,
340 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
341 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,
342 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,
343 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
344 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,
345 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,
346 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
347 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,
348 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,
349 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
350 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,
351 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,
352 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
353 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,
354 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,
355 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
356 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,
357 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,
358 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
359 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,
360 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,
361 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
362 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,
363 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,
364 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
365 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,
366 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,
367 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
368 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,
369 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,
370 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
371 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,
372 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,
373 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
374 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,
375 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,
376 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
377 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,
378 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
379 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
380 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
381 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,
382 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
383 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
384 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
385 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
386 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A,
387 }, {
388 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,
389 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,
390 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
391 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,
392 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,
393 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
394 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,
395 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,
396 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
397 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,
398 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,
399 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
400 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,
401 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,
402 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
403 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,
404 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,
405 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
406 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,
407 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,
408 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
409 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,
410 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,
411 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
412 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,
413 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,
414 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
415 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,
416 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,
417 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
418 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,
419 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,
420 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
421 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,
422 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,
423 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
424 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,
425 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,
426 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
427 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,
428 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,
429 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
430 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,
431 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,
432 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
433 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,
434 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,
435 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
436 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,
437 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,
438 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
439 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,
440 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,
441 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
442 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,
443 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
444 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
445 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
446 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,
447 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
448 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,
449 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
450 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
451 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7,
452 }, {
453 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,
454 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,
455 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
456 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,
457 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,
458 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
459 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,
460 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,
461 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
462 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,
463 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,
464 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
465 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,
466 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,
467 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
468 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,
469 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,
470 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
471 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,
472 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,
473 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
474 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,
475 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,
476 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
477 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,
478 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
479 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
480 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,
481 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,
482 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
483 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,
484 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,
485 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
486 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,
487 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,
488 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
489 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,
490 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,
491 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
492 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,
493 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,
494 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
495 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,
496 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,
497 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
498 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,
499 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,
500 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
501 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,
502 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,
503 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
504 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,
505 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,
506 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
507 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,
508 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
509 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
510 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
511 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,
512 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
513 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,
514 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
515 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
516 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0,
517 }, {
518 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,
519 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,
520 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
521 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,
522 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,
523 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
524 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
525 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,
526 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
527 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,
528 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,
529 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
530 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,
531 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,
532 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
533 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,
534 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,
535 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
536 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,
537 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,
538 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
539 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,
540 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,
541 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
542 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,
543 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,
544 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
545 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,
546 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,
547 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
548 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,
549 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,
550 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
551 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,
552 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,
553 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
554 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,
555 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,
556 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
557 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,
558 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,
559 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
560 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,
561 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,
562 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
563 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,
564 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,
565 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
566 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,
567 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,
568 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
569 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,
570 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,
571 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
572 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
573 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
574 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
575 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
576 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,
577 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
578 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,
579 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
580 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
581 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6
582 }},
583 {
584 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,
585 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,
586 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
587 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
588 0x9216D5D9, 0x8979FB1B
589 }};
590
591
592
593 /* enc/dec one 8byte block
594 Blowfish is defined in terms of two 32bit numbers ("left" and "right")
595 At least the paper http://www.schneier.com/paper-blowfish-fse.html
596 says nothing about byte order ("Divide x into two 32-bit halves").
597 Our preset P and S are already defined as numbers, which is fine.
598 So we leave input/output byte swapping to the outer layer.
599 */
600 static void bfish ( BFish *ctx, unsigned *block, int dec )
601 {
602 /* slow and sloppy version
603 See Eric Young's implementation in openssl for how to speed things up
604 */
605 union {
606 unsigned u;
607 unsigned char b[4];
608 } l, r;
609 enum { /* byte indexes, A=MSB .. D=LSB */
610 #ifdef CPU_BIG_ENDIAN
611 A,B,C,D
612 #else
613 D,C,B,A
614 #endif
615 };
616 const unsigned *a = ctx->S[0], *b = ctx->S[1], *c = ctx->S[2], *d = ctx->S[3];
617 #define F(x) (((a[x.b[A]] + b[x.b[B]]) ^ c[x.b[C]]) + d[x.b[D]])
618 unsigned *P, *E;
619 int step;
620
621 l.u = block[0];
622 r.u = block[1];
623 if ( dec ) {
624 E = ctx->P + 1;
625 P = E + 16;
626 step = -1;
627 } else {
628 P = ctx->P;
629 E = P + 16;
630 step = 1;
631 }
632
633 do { /* two per rep to at least avoid the swapping w/o too much code */
634 l.u ^= *P;
635 r.u ^= F(l);
636
637 r.u ^= *(P += step);
638 l.u ^= F(r);
639 } while (E != (P += step));
640
641 block[1] = l.u ^ E[0];
642 block[0] = r.u ^ E[step];
643 l.u = r.u = 0;
644 } /* bfish */
645
646
647 static void bfishInit (BFish *ctx, unsigned char *key, int keyLen)
648 {
649 int i, j, k;
650 unsigned data, block[2];
651
652 *ctx = BFishInit;
653
654 for (j = i = 0; i < 18; ++i) {
655 for (data = 0, k = 0; k < 4; ++k) {
656 /* http://www.schneier.com/blowfish-bug.txt */
657 data = (data << 8) | key[j];
658 if (++j >= keyLen)
659 j = 0;
660 }
661 ctx->P[i] ^= data;
662 }
663
664 block[0] = block[1] = 0;
665 for (i = 0; i < 18; i += 2) {
666 bfish(ctx, block, 0);
667 ctx->P[i] = block[0];
668 ctx->P[i + 1] = block[1];
669 }
670 for (i = 0; i < 4; ++i)
671 for (j = 0; j < 256; j += 2) {
672 bfish(ctx, block, 0);
673 ctx->S[i][j] = block[0];
674 ctx->S[i][j + 1] = block[1];
675 }
676 data = block[0] = block[1] = 0;
677 }
678
679 /* return !0 iff we had a bad key (duplicate in S-box) */
680 static int bfishChkkey (BFish *ctx)
681 {
682 int i;
683 for (i = 0; i < 4; ++i) {
684 unsigned *s = ctx->S[i], *p=s+1, *e=s+256, *q;
685 do {
686 unsigned t = *p;
687 for (q = p; s < q--; )
688 if ( t == *q )
689 return 1;
690 } while (e > ++p);
691 }
692 return 0;
693 }
694
695
696 typedef struct {
697 BFish bfish;
698 int bin; /* ciphertext uses ByteArrayObject */
699 int swap; /* do swapping */
700 Tcl_WideUInt ev; /* encrypting vector/last cipher block */
701 Tcl_WideUInt dv; /* decrypting " */
702 } BfCd;
703
704 static void bfishFree ( ClientData self )
705 {
706 memset(self, 0, sizeof(BfCd));
707 Tcl_Free((char*)self);
708 }
709
710 /*
711 blowfish encrypt|decrypt [options] key data
712 blowfish open [options] key command
713 command encrypt|decrypt data
714 command close
715
716 does blowfish in CBC mode: every input block is XORed with the
717 previous cipher clock before being encrypted.
718 Applications should prefix every stream with an initialization vector.
719
720 Options:
721 -string (default) decrypt to strings
722 -binary decrypt to ByteArray
723 encrypt always creates ByteArrays, and input is used as is
724 -encvector|-decvector <iv> use initialization vector for enc/dec
725 (must be as of printf %08X%08X, left, right)
726 -native|-littleendian|-bigendian|-swap byte order to use
727 (default: -bigendian)
728
729 Although I really hate the ByteArrayObj, because the conversion is braindead,
730 I use it, because the conversion is braindead :(
731
732 */
733 static int bfishCmd (
734 ClientData self, Tcl_Interp *ip, int objc, Tcl_Obj* const objv[]
735 ) {
736 static const char *commandnames[]
737 = {"encrypt", "decrypt", "open", "close", 0};
738 enum { CMD_ENC, CMD_DEC, CMD_OPEN, CMD_CLOSE };
739 static const char *optnames[] = {"-string", "-binary",
740 "-encvector", "-decvector",
741 "-native", "-littleendian", "-bigendian", "-swap", 0};
742 enum { OPT_STR/*must be 0*/, OPT_BIN,
743 OPT_EV, OPT_DV,
744 OPT_NAT, OPT_LE, OPT_BE, OPT_SWAP };
745 BfCd tmp, *bf;
746 int cmd, len, blocks;
747 char *bytes;
748 Tcl_WideUInt *out;
749 Tcl_Obj *data, *ret;
750 unsigned *u, *e;
751
752 if ( 2 > objc )
753 goto badargs;
754 if ( Tcl_GetIndexFromObj(ip, objv[1], commandnames, "command", 0, &cmd) )
755 return TCL_ERROR;
756 if ( self && CMD_OPEN != cmd ) {
757 bf = (BfCd *)self;
758 if ( CMD_CLOSE == cmd ) { /* ignore args - close */
759 Tcl_DeleteCommand(ip, Tcl_GetString(objv[0]));
760 return TCL_OK;
761 }
762 if ( 3 > objc )
763 goto badargs;
764 data = objv[2];
765 } else { /* new context */
766 int bin = OPT_STR, swap = OPT_BE;
767 unsigned vec[4] = {0,0,0,0}, *leri;
768 if ( CMD_CLOSE == cmd )
769 goto badargs;
770 if ( 4 > objc )
771 goto badargs;
772 if ( 4 < objc ) {
773 int i, opt;
774 for ( i=2; i<objc-2; i++ ) {
775 if ( Tcl_GetIndexFromObj(ip, objv[i], optnames, "option", 0, &opt) )
776 return TCL_ERROR;
777 switch (opt) {
778 case OPT_STR:
779 case OPT_BIN:
780 bin = opt;
781 break;
782 case OPT_EV:
783 case OPT_DV:
784 leri = OPT_EV == opt ? vec : vec+2;
785 if ( i == objc-3
786 || !(bytes = Tcl_GetStringFromObj(objv[++i],&len))
787 || 16 != len
788 || 2 != sscanf(bytes,"%8X%8X", leri, leri+1)
789 ) {
790 Tcl_SetResult(ip, "bad vector", TCL_STATIC);
791 return TCL_ERROR;
792 }
793 break;
794 case OPT_NAT:
795 case OPT_LE:
796 case OPT_BE:
797 case OPT_SWAP:
798 swap = opt;
799 break;
800 }
801 }
802 }
803 bytes = Tcl_GetStringFromObj(objv[objc-2], &len);
804 data = objv[objc-1];
805 bf = CMD_OPEN == cmd ? (BfCd*)Tcl_Alloc(sizeof(*bf)) : &tmp;
806 bfishInit(&bf->bfish, (unsigned char*)bytes, len);
807 bf->bin = bin;
808 bf->swap = OPT_SWAP == swap ||
809 #ifdef CPU_BIG_ENDIAN
810 OPT_LE
811 #else
812 OPT_BE
813 #endif
814 == swap;
815 #define SWAP32(x) \
816 (((0xff&x)<<24)|((0xff00&x)<<8)|(0xff00&(x>>8))|(0xff&(x>>24)))
817 /*
818 sscanf reads in iv ints as from BE repr to native, which we want.
819 need to fixup, if external is not BE.
820 */
821 if (
822 #ifndef CPU_BIG_ENDIAN
823 !
824 #endif
825 bf->swap
826 ) /* swap the init vec's ints, too */
827 for (e=vec, u=vec+4; e < u--; ) *u = SWAP32(*u);
828 ((int*)&bf->ev)[0] = vec[0];
829 ((int*)&bf->ev)[1] = vec[1];
830 ((int*)&bf->dv)[0] = vec[2];
831 ((int*)&bf->dv)[1] = vec[3];
832 if ( CMD_OPEN == cmd ) {
833 Tcl_CreateObjCommand(ip, Tcl_GetString(data), bfishCmd,
834 (ClientData)bf, bfishFree);
835 Tcl_SetIntObj(Tcl_GetObjResult(ip), bfishChkkey(&bf->bfish));
836 return TCL_OK;
837 }
838 }
839 /* now cmd is enc (0) or dec */
840
841 bytes = (cmd || &tclByteArrayType == data->typePtr)
842 ? (char*)Tcl_GetByteArrayFromObj(data, &len) /* decode or enc from binary */
843 : Tcl_GetStringFromObj(data, &len);
844 if ( !len )
845 return TCL_OK;
846 if ( cmd && (7 & len) ) {
847 Tcl_SetResult(ip, "bad cipher len", TCL_STATIC);
848 return TCL_ERROR;
849 }
850 blocks = (len+7)>>3;
851 ret = Tcl_GetObjResult(ip);
852 if ( !cmd || bf->bin ) { /* encode or dec to binary */
853 out = (Tcl_WideUInt*)Tcl_SetByteArrayLength(ret, blocks<<3);
854 } else {
855 Tcl_SetObjLength(ret, blocks<<3);
856 out = (Tcl_WideUInt*)Tcl_GetString(ret);
857 }
858 out[blocks - 1] = 0; /* pad input */
859 memcpy(out, bytes, len);
860 if ( bf->swap ) {
861 u = (unsigned*)out;
862 e = u+(blocks<<1);
863 do *u = SWAP32(*u); while ( e > ++u );
864 u = (unsigned*)out;
865 } else u=e=0; /* just to please the compiler */
866 if ( cmd )
867 for ( ;blocks--; out++ ) {
868 Tcl_WideUInt ciph = *out;
869 bfish(&bf->bfish, (unsigned*)out, 1);
870 *out ^= bf->dv;
871 bf->dv = ciph;
872 }
873 else
874 for ( ;blocks--; out++ ) {
875 *out ^= bf->ev;
876 bfish(&bf->bfish, (unsigned*)out, 0);
877 bf->ev = *out;
878 }
879 if ( bf->swap )
880 do *u = SWAP32(*u); while ( e > ++u );
881
882 return TCL_OK;
883 badargs:
884 Tcl_AppendResult(ip, "usage: ", Tcl_GetString(objv[0]),
885 " encode|decode|open|close options...", 0);
886 return TCL_ERROR;
887 } /* bfishCmd */
888
889
890 int cryptoInit(Tcl_Interp *interp)
891 {
892 Tcl_CreateObjCommand(interp, "::malete::sha1", sha1Cmd, 0, 0);
893 Tcl_CreateObjCommand(interp, "::malete::blowfish", bfishCmd, 0, 0);
894
895 return TCL_OK;
896 }

  ViewVC Help
Powered by ViewVC 1.1.26