blob: d1ada651e26e5040741a03310690c2249769d703 [file] [log] [blame]
Jack Jansen72781191995-08-07 14:34:15 +00001/***********************************************************
2Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
4
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Jack Jansen72781191995-08-07 14:34:15 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Jack Jansen72781191995-08-07 14:34:15 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Jack Jansen72781191995-08-07 14:34:15 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Jack Jansen72781191995-08-07 14:34:15 +000029
30******************************************************************/
31
32/*
33** Routines to represent binary data in ASCII and vice-versa
34**
35** This module currently supports the following encodings:
36** uuencode:
37** each line encodes 45 bytes (except possibly the last)
38** First char encodes (binary) length, rest data
39** each char encodes 6 bits, as follows:
40** binary: 01234567 abcdefgh ijklmnop
41** ascii: 012345 67abcd efghij klmnop
42** ASCII encoding method is "excess-space": 000000 is encoded as ' ', etc.
43** short binary data is zero-extended (so the bits are always in the
44** right place), this does *not* reflect in the length.
Jack Jansen84bbc2e1995-10-04 16:38:44 +000045** base64:
46** Line breaks are insignificant, but lines are at most 76 chars
47** each char encodes 6 bits, in similar order as uucode/hqx. Encoding
48** is done via a table.
49** Short binary data is filled (in ASCII) with '='.
Jack Jansen72781191995-08-07 14:34:15 +000050** hqx:
51** File starts with introductory text, real data starts and ends
52** with colons.
53** Data consists of three similar parts: info, datafork, resourcefork.
54** Each part is protected (at the end) with a 16-bit crc
55** The binary data is run-length encoded, and then ascii-fied:
56** binary: 01234567 abcdefgh ijklmnop
57** ascii: 012345 67abcd efghij klmnop
58** ASCII encoding is table-driven, see the code.
59** Short binary data results in the runt ascii-byte being output with
60** the bits in the right place.
61**
62** While I was reading dozens of programs that encode or decode the formats
63** here (documentation? hihi:-) I have formulated Jansen's Observation:
64**
65** Programs that encode binary data in ASCII are written in
66** such a style that they are as unreadable as possible. Devices used
67** include unnecessary global variables, burying important tables
68** in unrelated sourcefiles, putting functions in include files,
69** using seemingly-descriptive variable names for different purposes,
70** calls to empty subroutines and a host of others.
71**
72** I have attempted to break with this tradition, but I guess that that
73** does make the performance sub-optimal. Oh well, too bad...
74**
75** Jack Jansen, CWI, July 1995.
76*/
77
78
79#include "Python.h"
80
81static PyObject *Error;
82static PyObject *Incomplete;
83
84/*
85** hqx lookup table, ascii->binary.
86*/
87
88#define RUNCHAR 0x90
89
90#define DONE 0x7F
91#define SKIP 0x7E
92#define FAIL 0x7D
93
94static unsigned char table_a2b_hqx[256] = {
95/* ^@ ^A ^B ^C ^D ^E ^F ^G */
96/* 0*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
97/* \b \t \n ^K ^L \r ^N ^O */
98/* 1*/ FAIL, FAIL, SKIP, FAIL, FAIL, SKIP, FAIL, FAIL,
99/* ^P ^Q ^R ^S ^T ^U ^V ^W */
100/* 2*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
101/* ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ */
102/* 3*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
103/* ! " # $ % & ' */
104/* 4*/ FAIL, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
105/* ( ) * + , - . / */
106/* 5*/ 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, FAIL, FAIL,
107/* 0 1 2 3 4 5 6 7 */
108/* 6*/ 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, FAIL,
109/* 8 9 : ; < = > ? */
110/* 7*/ 0x14, 0x15, DONE, FAIL, FAIL, FAIL, FAIL, FAIL,
111/* @ A B C D E F G */
112/* 8*/ 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
113/* H I J K L M N O */
114/* 9*/ 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, FAIL,
115/* P Q R S T U V W */
116/*10*/ 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, FAIL,
117/* X Y Z [ \ ] ^ _ */
118/*11*/ 0x2C, 0x2D, 0x2E, 0x2F, FAIL, FAIL, FAIL, FAIL,
119/* ` a b c d e f g */
120/*12*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, FAIL,
121/* h i j k l m n o */
122/*13*/ 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, FAIL, FAIL,
123/* p q r s t u v w */
124/*14*/ 0x3D, 0x3E, 0x3F, FAIL, FAIL, FAIL, FAIL, FAIL,
125/* x y z { | } ~ ^? */
126/*15*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
127/*16*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
128 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
129 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
130 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
131 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
132 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
133 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
134 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
135 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
136 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
137 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
138 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
139 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
140 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
141 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
142 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
143};
144
145static unsigned char table_b2a_hqx[] =
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000146"!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr";
Jack Jansen72781191995-08-07 14:34:15 +0000147
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000148static char table_a2b_base64[] = {
149 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
150 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
151 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
152 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, /* Note PAD->0 */
153 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
154 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
155 -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
156 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
157};
158
159#define BASE64_PAD '='
160#define BASE64_MAXBIN 57 /* Max binary chunk size (76 char line) */
161
162static unsigned char table_b2a_base64[] =
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000163"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000164
165
166
Jack Jansen72781191995-08-07 14:34:15 +0000167static unsigned short crctab_hqx[256] = {
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000168 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
169 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
170 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
171 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
172 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
173 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
174 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
175 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
176 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
177 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
178 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
179 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
180 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
181 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
182 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
183 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
184 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
185 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
186 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
187 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
188 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
189 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
190 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
191 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
192 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
193 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
194 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
195 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
196 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
197 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
198 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
199 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
Jack Jansen72781191995-08-07 14:34:15 +0000200};
201
202static char doc_a2b_uu[] = "(ascii) -> bin. Decode a line of uuencoded data";
203
204static PyObject *
205binascii_a2b_uu(self, args)
206 PyObject *self;
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000207 PyObject *args;
Jack Jansen72781191995-08-07 14:34:15 +0000208{
209 unsigned char *ascii_data, *bin_data;
210 int leftbits = 0;
211 unsigned char this_ch;
212 unsigned int leftchar = 0;
213 PyObject *rv;
214 int ascii_len, bin_len;
215
Guido van Rossum43713e52000-02-29 13:59:29 +0000216 if ( !PyArg_ParseTuple(args, "t#:a2b_uu", &ascii_data, &ascii_len) )
Jack Jansen72781191995-08-07 14:34:15 +0000217 return NULL;
218
219 /* First byte: binary data length (in bytes) */
220 bin_len = (*ascii_data++ - ' ') & 077;
221 ascii_len--;
222
223 /* Allocate the buffer */
224 if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL )
225 return NULL;
226 bin_data = (unsigned char *)PyString_AsString(rv);
227
228 for( ; bin_len > 0 ; ascii_len--, ascii_data++ ) {
229 this_ch = *ascii_data;
230 if ( this_ch == '\n' || this_ch == '\r' || ascii_len <= 0) {
231 /*
232 ** Whitespace. Assume some spaces got eaten at
233 ** end-of-line. (We check this later)
234 */
235 this_ch = 0;
236 } else {
Jack Jansen5d957971995-11-14 10:35:19 +0000237 /* Check the character for legality
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000238 ** The 64 in stead of the expected 63 is because
239 ** there are a few uuencodes out there that use
240 ** '@' as zero instead of space.
Jack Jansen5d957971995-11-14 10:35:19 +0000241 */
242 if ( this_ch < ' ' || this_ch > (' ' + 64)) {
Jack Jansen72781191995-08-07 14:34:15 +0000243 PyErr_SetString(Error, "Illegal char");
244 Py_DECREF(rv);
245 return NULL;
246 }
247 this_ch = (this_ch - ' ') & 077;
248 }
249 /*
250 ** Shift it in on the low end, and see if there's
251 ** a byte ready for output.
252 */
253 leftchar = (leftchar << 6) | (this_ch);
254 leftbits += 6;
255 if ( leftbits >= 8 ) {
256 leftbits -= 8;
257 *bin_data++ = (leftchar >> leftbits) & 0xff;
258 leftchar &= ((1 << leftbits) - 1);
259 bin_len--;
260 }
261 }
262 /*
263 ** Finally, check that if there's anything left on the line
264 ** that it's whitespace only.
265 */
266 while( ascii_len-- > 0 ) {
267 this_ch = *ascii_data++;
Guido van Rossum1243ae71997-07-11 18:36:28 +0000268 /* Extra '@' may be written as padding in some cases */
269 if ( this_ch != ' ' && this_ch != '@' &&
270 this_ch != '\n' && this_ch != '\r' ) {
Jack Jansen72781191995-08-07 14:34:15 +0000271 PyErr_SetString(Error, "Trailing garbage");
272 Py_DECREF(rv);
273 return NULL;
274 }
275 }
276 return rv;
277}
278
279static char doc_b2a_uu[] = "(bin) -> ascii. Uuencode line of data";
280
281static PyObject *
282binascii_b2a_uu(self, args)
283 PyObject *self;
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000284 PyObject *args;
Jack Jansen72781191995-08-07 14:34:15 +0000285{
286 unsigned char *ascii_data, *bin_data;
287 int leftbits = 0;
288 unsigned char this_ch;
289 unsigned int leftchar = 0;
290 PyObject *rv;
291 int bin_len;
292
Guido van Rossum43713e52000-02-29 13:59:29 +0000293 if ( !PyArg_ParseTuple(args, "s#:b2a_uu", &bin_data, &bin_len) )
Jack Jansen72781191995-08-07 14:34:15 +0000294 return NULL;
295 if ( bin_len > 45 ) {
296 /* The 45 is a limit that appears in all uuencode's */
297 PyErr_SetString(Error, "At most 45 bytes at once");
298 return NULL;
299 }
300
301 /* We're lazy and allocate to much (fixed up later) */
302 if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2)) == NULL )
303 return NULL;
304 ascii_data = (unsigned char *)PyString_AsString(rv);
305
306 /* Store the length */
307 *ascii_data++ = ' ' + (bin_len & 077);
308
309 for( ; bin_len > 0 || leftbits != 0 ; bin_len--, bin_data++ ) {
310 /* Shift the data (or padding) into our buffer */
311 if ( bin_len > 0 ) /* Data */
312 leftchar = (leftchar << 8) | *bin_data;
313 else /* Padding */
314 leftchar <<= 8;
315 leftbits += 8;
316
317 /* See if there are 6-bit groups ready */
318 while ( leftbits >= 6 ) {
319 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
320 leftbits -= 6;
321 *ascii_data++ = this_ch + ' ';
322 }
323 }
324 *ascii_data++ = '\n'; /* Append a courtesy newline */
325
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000326 _PyString_Resize(&rv, (ascii_data -
327 (unsigned char *)PyString_AsString(rv)));
Jack Jansen72781191995-08-07 14:34:15 +0000328 return rv;
329}
330
Guido van Rossum2db4f471999-10-19 19:05:14 +0000331
332static int
333binascii_find_valid(s, slen, num)
334 char *s;
335 int slen;
336 int num;
337{
338 /* Finds & returns the (num+1)th
339 ** valid character for base64, or -1 if none.
340 */
341
342 int ret = -1;
343 unsigned char c, b64val;
344
345 while ((slen > 0) && (ret == -1)) {
346 c = *s;
347 b64val = table_a2b_base64[c & 0x7f];
348 if ( ((c <= 0x7f) && (b64val != (unsigned char)-1)) ) {
349 if (num == 0)
350 ret = *s;
351 num--;
352 }
353
354 s++;
355 slen--;
356 }
357 return ret;
358}
359
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000360static char doc_a2b_base64[] = "(ascii) -> bin. Decode a line of base64 data";
361
362static PyObject *
363binascii_a2b_base64(self, args)
364 PyObject *self;
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000365 PyObject *args;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000366{
367 unsigned char *ascii_data, *bin_data;
368 int leftbits = 0;
369 unsigned char this_ch;
370 unsigned int leftchar = 0;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000371 PyObject *rv;
372 int ascii_len, bin_len;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000373 int quad_pos = 0;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000374
Guido van Rossum43713e52000-02-29 13:59:29 +0000375 if ( !PyArg_ParseTuple(args, "t#:a2b_base64", &ascii_data, &ascii_len) )
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000376 return NULL;
377
378 bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */
379
380 /* Allocate the buffer */
381 if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL )
382 return NULL;
383 bin_data = (unsigned char *)PyString_AsString(rv);
384 bin_len = 0;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000385
386 for( ; ascii_len > 0; ascii_len--, ascii_data++) {
387 this_ch = *ascii_data;
388
389 if (this_ch > 0x7f ||
390 this_ch == '\r' || this_ch == '\n' || this_ch == ' ')
Jack Jansenba1de3b1996-01-22 10:47:15 +0000391 continue;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000392
393 /* Check for pad sequences and ignore
394 ** the invalid ones.
395 */
396 if (this_ch == BASE64_PAD) {
397 if ( (quad_pos < 2) ||
398 ((quad_pos == 2) &&
399 (binascii_find_valid(ascii_data, ascii_len, 1)
400 != BASE64_PAD)) )
401 {
402 continue;
403 }
404 else {
405 /* A pad sequence means no more input.
406 ** We've already interpreted the data
407 ** from the quad at this point.
408 */
409 leftbits = 0;
410 break;
411 }
412 }
413
414 this_ch = table_a2b_base64[*ascii_data];
415 if ( this_ch == (unsigned char) -1 )
416 continue;
417
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000418 /*
419 ** Shift it in on the low end, and see if there's
420 ** a byte ready for output.
421 */
Guido van Rossum2db4f471999-10-19 19:05:14 +0000422 quad_pos = (quad_pos + 1) & 0x03;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000423 leftchar = (leftchar << 6) | (this_ch);
424 leftbits += 6;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000425
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000426 if ( leftbits >= 8 ) {
427 leftbits -= 8;
428 *bin_data++ = (leftchar >> leftbits) & 0xff;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000429 bin_len++;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000430 leftchar &= ((1 << leftbits) - 1);
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000431 }
Guido van Rossum2db4f471999-10-19 19:05:14 +0000432 }
433
434 if (leftbits != 0) {
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000435 PyErr_SetString(Error, "Incorrect padding");
436 Py_DECREF(rv);
437 return NULL;
438 }
Guido van Rossum2db4f471999-10-19 19:05:14 +0000439
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000440 /* and set string size correctly */
441 _PyString_Resize(&rv, bin_len);
442 return rv;
443}
444
445static char doc_b2a_base64[] = "(bin) -> ascii. Base64-code line of data";
446
447static PyObject *
448binascii_b2a_base64(self, args)
449 PyObject *self;
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000450 PyObject *args;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000451{
452 unsigned char *ascii_data, *bin_data;
453 int leftbits = 0;
454 unsigned char this_ch;
455 unsigned int leftchar = 0;
456 PyObject *rv;
457 int bin_len;
458
Guido van Rossum43713e52000-02-29 13:59:29 +0000459 if ( !PyArg_ParseTuple(args, "s#:b2a_base64", &bin_data, &bin_len) )
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000460 return NULL;
461 if ( bin_len > BASE64_MAXBIN ) {
462 PyErr_SetString(Error, "Too much data for base64 line");
463 return NULL;
464 }
465
466 /* We're lazy and allocate to much (fixed up later) */
467 if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2)) == NULL )
468 return NULL;
469 ascii_data = (unsigned char *)PyString_AsString(rv);
470
471 for( ; bin_len > 0 ; bin_len--, bin_data++ ) {
472 /* Shift the data into our buffer */
473 leftchar = (leftchar << 8) | *bin_data;
474 leftbits += 8;
475
476 /* See if there are 6-bit groups ready */
477 while ( leftbits >= 6 ) {
478 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
479 leftbits -= 6;
480 *ascii_data++ = table_b2a_base64[this_ch];
481 }
482 }
483 if ( leftbits == 2 ) {
484 *ascii_data++ = table_b2a_base64[(leftchar&3) << 4];
485 *ascii_data++ = BASE64_PAD;
486 *ascii_data++ = BASE64_PAD;
487 } else if ( leftbits == 4 ) {
488 *ascii_data++ = table_b2a_base64[(leftchar&0xf) << 2];
489 *ascii_data++ = BASE64_PAD;
490 }
491 *ascii_data++ = '\n'; /* Append a courtesy newline */
492
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000493 _PyString_Resize(&rv, (ascii_data -
494 (unsigned char *)PyString_AsString(rv)));
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000495 return rv;
496}
497
Jack Jansen72781191995-08-07 14:34:15 +0000498static char doc_a2b_hqx[] = "ascii -> bin, done. Decode .hqx coding";
499
500static PyObject *
501binascii_a2b_hqx(self, args)
502 PyObject *self;
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000503 PyObject *args;
Jack Jansen72781191995-08-07 14:34:15 +0000504{
505 unsigned char *ascii_data, *bin_data;
506 int leftbits = 0;
507 unsigned char this_ch;
Jack Janseneaeb1c81995-08-14 12:17:57 +0000508 unsigned int leftchar = 0;
Jack Jansen72781191995-08-07 14:34:15 +0000509 PyObject *rv;
510 int len;
511 int done = 0;
512
Guido van Rossum43713e52000-02-29 13:59:29 +0000513 if ( !PyArg_ParseTuple(args, "t#:a2b_hqx", &ascii_data, &len) )
Jack Jansen72781191995-08-07 14:34:15 +0000514 return NULL;
515
516 /* Allocate a string that is too big (fixed later) */
517 if ( (rv=PyString_FromStringAndSize(NULL, len)) == NULL )
518 return NULL;
519 bin_data = (unsigned char *)PyString_AsString(rv);
520
521 for( ; len > 0 ; len--, ascii_data++ ) {
522 /* Get the byte and look it up */
523 this_ch = table_a2b_hqx[*ascii_data];
524 if ( this_ch == SKIP )
525 continue;
526 if ( this_ch == FAIL ) {
527 PyErr_SetString(Error, "Illegal char");
528 Py_DECREF(rv);
529 return NULL;
530 }
531 if ( this_ch == DONE ) {
532 /* The terminating colon */
533 done = 1;
534 break;
535 }
536
537 /* Shift it into the buffer and see if any bytes are ready */
538 leftchar = (leftchar << 6) | (this_ch);
539 leftbits += 6;
540 if ( leftbits >= 8 ) {
541 leftbits -= 8;
542 *bin_data++ = (leftchar >> leftbits) & 0xff;
543 leftchar &= ((1 << leftbits) - 1);
544 }
545 }
546
547 if ( leftbits && !done ) {
548 PyErr_SetString(Incomplete,
549 "String has incomplete number of bytes");
550 Py_DECREF(rv);
551 return NULL;
552 }
Guido van Rossum9c6ba5e1997-01-12 20:02:04 +0000553 _PyString_Resize(
554 &rv, (bin_data - (unsigned char *)PyString_AsString(rv)));
555 if (rv) {
556 PyObject *rrv = Py_BuildValue("Oi", rv, done);
557 Py_DECREF(rv);
558 return rrv;
559 }
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000560
Jack Jansen72781191995-08-07 14:34:15 +0000561 return NULL;
562}
563
564static char doc_rlecode_hqx[] = "Binhex RLE-code binary data";
565
566static PyObject *
567binascii_rlecode_hqx(self, args)
568 PyObject *self;
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000569PyObject *args;
Jack Jansen72781191995-08-07 14:34:15 +0000570{
571 unsigned char *in_data, *out_data;
572 PyObject *rv;
573 unsigned char ch;
574 int in, inend, len;
575
Guido van Rossum43713e52000-02-29 13:59:29 +0000576 if ( !PyArg_ParseTuple(args, "s#:rlecode_hqx", &in_data, &len) )
Jack Jansen72781191995-08-07 14:34:15 +0000577 return NULL;
578
579 /* Worst case: output is twice as big as input (fixed later) */
580 if ( (rv=PyString_FromStringAndSize(NULL, len*2)) == NULL )
581 return NULL;
582 out_data = (unsigned char *)PyString_AsString(rv);
583
584 for( in=0; in<len; in++) {
585 ch = in_data[in];
586 if ( ch == RUNCHAR ) {
587 /* RUNCHAR. Escape it. */
588 *out_data++ = RUNCHAR;
589 *out_data++ = 0;
590 } else {
591 /* Check how many following are the same */
592 for(inend=in+1;
593 inend<len && in_data[inend] == ch &&
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000594 inend < in+255;
Jack Jansen72781191995-08-07 14:34:15 +0000595 inend++) ;
Jack Jansen0223aa11995-08-31 13:44:23 +0000596 if ( inend - in > 3 ) {
597 /* More than 3 in a row. Output RLE. */
Jack Jansen72781191995-08-07 14:34:15 +0000598 *out_data++ = ch;
599 *out_data++ = RUNCHAR;
600 *out_data++ = inend-in;
601 in = inend-1;
602 } else {
603 /* Less than 3. Output the byte itself */
604 *out_data++ = ch;
605 }
606 }
607 }
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000608 _PyString_Resize(&rv, (out_data -
609 (unsigned char *)PyString_AsString(rv)));
Jack Jansen72781191995-08-07 14:34:15 +0000610 return rv;
611}
612
613static char doc_b2a_hqx[] = "Encode .hqx data";
614
615static PyObject *
616binascii_b2a_hqx(self, args)
617 PyObject *self;
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000618 PyObject *args;
Jack Jansen72781191995-08-07 14:34:15 +0000619{
620 unsigned char *ascii_data, *bin_data;
621 int leftbits = 0;
622 unsigned char this_ch;
Jack Janseneaeb1c81995-08-14 12:17:57 +0000623 unsigned int leftchar = 0;
Jack Jansen72781191995-08-07 14:34:15 +0000624 PyObject *rv;
625 int len;
626
Guido van Rossum43713e52000-02-29 13:59:29 +0000627 if ( !PyArg_ParseTuple(args, "s#:b2a_hqx", &bin_data, &len) )
Jack Jansen72781191995-08-07 14:34:15 +0000628 return NULL;
629
630 /* Allocate a buffer that is at least large enough */
631 if ( (rv=PyString_FromStringAndSize(NULL, len*2)) == NULL )
632 return NULL;
633 ascii_data = (unsigned char *)PyString_AsString(rv);
634
635 for( ; len > 0 ; len--, bin_data++ ) {
636 /* Shift into our buffer, and output any 6bits ready */
637 leftchar = (leftchar << 8) | *bin_data;
638 leftbits += 8;
639 while ( leftbits >= 6 ) {
640 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
641 leftbits -= 6;
642 *ascii_data++ = table_b2a_hqx[this_ch];
643 }
644 }
645 /* Output a possible runt byte */
646 if ( leftbits ) {
647 leftchar <<= (6-leftbits);
648 *ascii_data++ = table_b2a_hqx[leftchar & 0x3f];
649 }
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000650 _PyString_Resize(&rv, (ascii_data -
651 (unsigned char *)PyString_AsString(rv)));
Jack Jansen72781191995-08-07 14:34:15 +0000652 return rv;
653}
654
655static char doc_rledecode_hqx[] = "Decode hexbin RLE-coded string";
656
657static PyObject *
658binascii_rledecode_hqx(self, args)
659 PyObject *self;
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000660 PyObject *args;
Jack Jansen72781191995-08-07 14:34:15 +0000661{
662 unsigned char *in_data, *out_data;
663 unsigned char in_byte, in_repeat;
664 PyObject *rv;
665 int in_len, out_len, out_len_left;
666
Guido van Rossum43713e52000-02-29 13:59:29 +0000667 if ( !PyArg_ParseTuple(args, "s#:rledecode_hqx", &in_data, &in_len) )
Jack Jansen72781191995-08-07 14:34:15 +0000668 return NULL;
669
670 /* Empty string is a special case */
671 if ( in_len == 0 )
672 return Py_BuildValue("s", "");
673
674 /* Allocate a buffer of reasonable size. Resized when needed */
675 out_len = in_len*2;
676 if ( (rv=PyString_FromStringAndSize(NULL, out_len)) == NULL )
677 return NULL;
678 out_len_left = out_len;
679 out_data = (unsigned char *)PyString_AsString(rv);
680
681 /*
682 ** We need two macros here to get/put bytes and handle
683 ** end-of-buffer for input and output strings.
684 */
685#define INBYTE(b) \
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000686 do { \
687 if ( --in_len < 0 ) { \
688 PyErr_SetString(Incomplete, ""); \
689 Py_DECREF(rv); \
690 return NULL; \
691 } \
692 b = *in_data++; \
693 } while(0)
Jack Jansen72781191995-08-07 14:34:15 +0000694
695#define OUTBYTE(b) \
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000696 do { \
697 if ( --out_len_left < 0 ) { \
698 _PyString_Resize(&rv, 2*out_len); \
699 if ( rv == NULL ) return NULL; \
700 out_data = (unsigned char *)PyString_AsString(rv) \
701 + out_len; \
702 out_len_left = out_len-1; \
703 out_len = out_len * 2; \
704 } \
705 *out_data++ = b; \
706 } while(0)
Jack Jansen72781191995-08-07 14:34:15 +0000707
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000708 /*
709 ** Handle first byte separately (since we have to get angry
710 ** in case of an orphaned RLE code).
711 */
712 INBYTE(in_byte);
Jack Jansen72781191995-08-07 14:34:15 +0000713
714 if (in_byte == RUNCHAR) {
715 INBYTE(in_repeat);
716 if (in_repeat != 0) {
717 /* Note Error, not Incomplete (which is at the end
718 ** of the string only). This is a programmer error.
719 */
720 PyErr_SetString(Error, "Orphaned RLE code at start");
721 Py_DECREF(rv);
722 return NULL;
723 }
724 OUTBYTE(RUNCHAR);
725 } else {
726 OUTBYTE(in_byte);
727 }
728
729 while( in_len > 0 ) {
730 INBYTE(in_byte);
731
732 if (in_byte == RUNCHAR) {
733 INBYTE(in_repeat);
734 if ( in_repeat == 0 ) {
735 /* Just an escaped RUNCHAR value */
736 OUTBYTE(RUNCHAR);
737 } else {
738 /* Pick up value and output a sequence of it */
739 in_byte = out_data[-1];
740 while ( --in_repeat > 0 )
741 OUTBYTE(in_byte);
742 }
743 } else {
744 /* Normal byte */
745 OUTBYTE(in_byte);
746 }
747 }
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000748 _PyString_Resize(&rv, (out_data -
749 (unsigned char *)PyString_AsString(rv)));
Jack Jansen72781191995-08-07 14:34:15 +0000750 return rv;
751}
752
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000753static char doc_crc_hqx[] =
754"(data, oldcrc) -> newcrc. Compute hqx CRC incrementally";
Jack Jansen72781191995-08-07 14:34:15 +0000755
756static PyObject *
757binascii_crc_hqx(self, args)
758 PyObject *self;
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000759PyObject *args;
Jack Jansen72781191995-08-07 14:34:15 +0000760{
761 unsigned char *bin_data;
762 unsigned int crc;
763 int len;
764
Guido van Rossum43713e52000-02-29 13:59:29 +0000765 if ( !PyArg_ParseTuple(args, "s#i:crc_hqx", &bin_data, &len, &crc) )
Jack Jansen72781191995-08-07 14:34:15 +0000766 return NULL;
767
768 while(len--) {
769 crc=((crc<<8)&0xff00)^crctab_hqx[((crc>>8)&0xff)^*bin_data++];
770 }
771
772 return Py_BuildValue("i", crc);
773}
774
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000775static char doc_crc32[] =
776"(data, oldcrc = 0) -> newcrc. Compute CRC-32 incrementally";
777
778/* Crc - 32 BIT ANSI X3.66 CRC checksum files
779 Also known as: ISO 3307
780**********************************************************************|
781* *|
782* Demonstration program to compute the 32-bit CRC used as the frame *|
783* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *|
784* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *|
785* protocol). The 32-bit FCS was added via the Federal Register, *|
786* 1 June 1982, p.23798. I presume but don't know for certain that *|
787* this polynomial is or will be included in CCITT V.41, which *|
788* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *|
789* PUB 78 says that the 32-bit FCS reduces otherwise undetected *|
790* errors by a factor of 10^-5 over 16-bit FCS. *|
791* *|
792**********************************************************************|
793
794 Copyright (C) 1986 Gary S. Brown. You may use this program, or
795 code or tables extracted from it, as desired without restriction.
796
797 First, the polynomial itself and its table of feedback terms. The
798 polynomial is
799 X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
800 Note that we take it "backwards" and put the highest-order term in
801 the lowest-order bit. The X^32 term is "implied"; the LSB is the
802 X^31 term, etc. The X^0 term (usually shown as "+1") results in
803 the MSB being 1.
804
805 Note that the usual hardware shift register implementation, which
806 is what we're using (we're merely optimizing it by doing eight-bit
807 chunks at a time) shifts bits into the lowest-order term. In our
808 implementation, that means shifting towards the right. Why do we
809 do it this way? Because the calculated CRC must be transmitted in
810 order from highest-order term to lowest-order term. UARTs transmit
811 characters in order from LSB to MSB. By storing the CRC this way,
812 we hand it to the UART in the order low-byte to high-byte; the UART
813 sends each low-bit to hight-bit; and the result is transmission bit
814 by bit from highest- to lowest-order term without requiring any bit
815 shuffling on our part. Reception works similarly.
816
817 The feedback terms table consists of 256, 32-bit entries. Notes:
818
819 1. The table can be generated at runtime if desired; code to do so
820 is shown later. It might not be obvious, but the feedback
821 terms simply represent the results of eight shift/xor opera-
822 tions for all combinations of data and CRC register values.
823
824 2. The CRC accumulation logic is the same for all CRC polynomials,
825 be they sixteen or thirty-two bits wide. You simply choose the
826 appropriate table. Alternatively, because the table can be
827 generated at runtime, you can start by generating the table for
828 the polynomial in question and use exactly the same "updcrc",
829 if your application needn't simultaneously handle two CRC
830 polynomials. (Note, however, that XMODEM is strange.)
831
832 3. For 16-bit CRCs, the table entries need be only 16 bits wide;
833 of course, 32-bit entries work OK if the high 16 bits are zero.
834
835 4. The values must be right-shifted by eight bits by the "updcrc"
836 logic; the shift must be unsigned (bring in zeroes). On some
837 hardware you could probably optimize the shift in assembler by
838 using byte-swap instructions.
839********************************************************************/
840
841static unsigned long crc_32_tab[256] = {
8420x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
8430x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
8440xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
8450x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
8460x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
8470x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
8480xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
8490xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
8500x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
8510x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
8520xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
8530xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
8540x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
8550x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
8560x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
8570xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
8580x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
8590x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
8600x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
8610xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
8620x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
8630x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
8640xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
8650xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
8660x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
8670x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
8680x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
8690x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
8700xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
8710x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
8720x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
8730x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
8740xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
8750xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
8760x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
8770x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
8780xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
8790xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
8800x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
8810x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
8820x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
8830xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
8840x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
8850x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
8860x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
8870xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
8880x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
8890x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
8900xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
8910xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
8920x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
8930x2d02ef8dUL
894};
895
896static PyObject *
897binascii_crc32(self, args)
898 PyObject *self;
899 PyObject *args;
900{ /* By Jim Ahlstrom; All rights transferred to CNRI */
901 unsigned char *bin_data;
902 unsigned long crc = 0UL; /* initial value of CRC */
903 int len;
904
Guido van Rossum43713e52000-02-29 13:59:29 +0000905 if ( !PyArg_ParseTuple(args, "s#|l:crc32", &bin_data, &len, &crc) )
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000906 return NULL;
907
908 crc = crc ^ 0xFFFFFFFFUL;
909 while(len--)
910 crc = crc_32_tab[(crc ^ *bin_data++) & 0xffUL] ^ (crc >> 8);
911 /* Note: (crc >> 8) MUST zero fill on left */
912 return Py_BuildValue("l", crc ^ 0xFFFFFFFFUL);
913}
914
Jack Jansen72781191995-08-07 14:34:15 +0000915/* List of functions defined in the module */
916
917static struct PyMethodDef binascii_module_methods[] = {
918 {"a2b_uu", binascii_a2b_uu, 1, doc_a2b_uu},
919 {"b2a_uu", binascii_b2a_uu, 1, doc_b2a_uu},
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000920 {"a2b_base64", binascii_a2b_base64, 1,
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000921 doc_a2b_base64},
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000922 {"b2a_base64", binascii_b2a_base64, 1,
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000923 doc_b2a_base64},
Jack Jansen72781191995-08-07 14:34:15 +0000924 {"a2b_hqx", binascii_a2b_hqx, 1, doc_a2b_hqx},
925 {"b2a_hqx", binascii_b2a_hqx, 1, doc_b2a_hqx},
926 {"rlecode_hqx", binascii_rlecode_hqx, 1,
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000927 doc_rlecode_hqx},
Jack Jansen72781191995-08-07 14:34:15 +0000928 {"rledecode_hqx", binascii_rledecode_hqx, 1,
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000929 doc_rledecode_hqx},
Jack Jansen72781191995-08-07 14:34:15 +0000930 {"crc_hqx", binascii_crc_hqx, 1, doc_crc_hqx},
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000931 {"crc32", binascii_crc32, 1, doc_crc32},
Jack Jansen72781191995-08-07 14:34:15 +0000932 {NULL, NULL} /* sentinel */
933};
934
935
936/* Initialization function for the module (*must* be called initbinascii) */
937static char doc_binascii[] = "Conversion between binary data and ASCII";
938
Guido van Rossum3886bb61998-12-04 18:50:17 +0000939DL_EXPORT(void)
Jack Jansen72781191995-08-07 14:34:15 +0000940initbinascii()
941{
942 PyObject *m, *d, *x;
943
944 /* Create the module and add the functions */
945 m = Py_InitModule("binascii", binascii_module_methods);
946
947 d = PyModule_GetDict(m);
948 x = PyString_FromString(doc_binascii);
949 PyDict_SetItemString(d, "__doc__", x);
Guido van Rossum5c159bd1997-08-04 23:55:25 +0000950 Py_XDECREF(x);
Jack Jansen72781191995-08-07 14:34:15 +0000951
Guido van Rossum7dbb48a1997-10-08 15:26:07 +0000952 Error = PyErr_NewException("binascii.Error", NULL, NULL);
Jack Jansen72781191995-08-07 14:34:15 +0000953 PyDict_SetItemString(d, "Error", Error);
Guido van Rossum7dbb48a1997-10-08 15:26:07 +0000954 Incomplete = PyErr_NewException("binascii.Incomplete", NULL, NULL);
Jack Jansen72781191995-08-07 14:34:15 +0000955 PyDict_SetItemString(d, "Incomplete", Incomplete);
Jack Jansen72781191995-08-07 14:34:15 +0000956}