blob: 00a28052d9781a9d44ce992ea23d078aab9c674f [file] [log] [blame]
Jack Jansen72781191995-08-07 14:34:15 +00001/*
2** Routines to represent binary data in ASCII and vice-versa
3**
4** This module currently supports the following encodings:
5** uuencode:
6** each line encodes 45 bytes (except possibly the last)
7** First char encodes (binary) length, rest data
8** each char encodes 6 bits, as follows:
9** binary: 01234567 abcdefgh ijklmnop
10** ascii: 012345 67abcd efghij klmnop
11** ASCII encoding method is "excess-space": 000000 is encoded as ' ', etc.
12** short binary data is zero-extended (so the bits are always in the
13** right place), this does *not* reflect in the length.
Jack Jansen84bbc2e1995-10-04 16:38:44 +000014** base64:
15** Line breaks are insignificant, but lines are at most 76 chars
16** each char encodes 6 bits, in similar order as uucode/hqx. Encoding
17** is done via a table.
18** Short binary data is filled (in ASCII) with '='.
Jack Jansen72781191995-08-07 14:34:15 +000019** hqx:
20** File starts with introductory text, real data starts and ends
21** with colons.
22** Data consists of three similar parts: info, datafork, resourcefork.
23** Each part is protected (at the end) with a 16-bit crc
24** The binary data is run-length encoded, and then ascii-fied:
25** binary: 01234567 abcdefgh ijklmnop
26** ascii: 012345 67abcd efghij klmnop
27** ASCII encoding is table-driven, see the code.
28** Short binary data results in the runt ascii-byte being output with
29** the bits in the right place.
30**
31** While I was reading dozens of programs that encode or decode the formats
32** here (documentation? hihi:-) I have formulated Jansen's Observation:
33**
34** Programs that encode binary data in ASCII are written in
35** such a style that they are as unreadable as possible. Devices used
36** include unnecessary global variables, burying important tables
37** in unrelated sourcefiles, putting functions in include files,
38** using seemingly-descriptive variable names for different purposes,
39** calls to empty subroutines and a host of others.
40**
41** I have attempted to break with this tradition, but I guess that that
42** does make the performance sub-optimal. Oh well, too bad...
43**
44** Jack Jansen, CWI, July 1995.
45*/
46
47
48#include "Python.h"
49
50static PyObject *Error;
51static PyObject *Incomplete;
52
53/*
54** hqx lookup table, ascii->binary.
55*/
56
57#define RUNCHAR 0x90
58
59#define DONE 0x7F
60#define SKIP 0x7E
61#define FAIL 0x7D
62
63static unsigned char table_a2b_hqx[256] = {
64/* ^@ ^A ^B ^C ^D ^E ^F ^G */
65/* 0*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
66/* \b \t \n ^K ^L \r ^N ^O */
67/* 1*/ FAIL, FAIL, SKIP, FAIL, FAIL, SKIP, FAIL, FAIL,
68/* ^P ^Q ^R ^S ^T ^U ^V ^W */
69/* 2*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
70/* ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ */
71/* 3*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
72/* ! " # $ % & ' */
73/* 4*/ FAIL, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
74/* ( ) * + , - . / */
75/* 5*/ 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, FAIL, FAIL,
76/* 0 1 2 3 4 5 6 7 */
77/* 6*/ 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, FAIL,
78/* 8 9 : ; < = > ? */
79/* 7*/ 0x14, 0x15, DONE, FAIL, FAIL, FAIL, FAIL, FAIL,
80/* @ A B C D E F G */
81/* 8*/ 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
82/* H I J K L M N O */
83/* 9*/ 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, FAIL,
84/* P Q R S T U V W */
85/*10*/ 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, FAIL,
86/* X Y Z [ \ ] ^ _ */
87/*11*/ 0x2C, 0x2D, 0x2E, 0x2F, FAIL, FAIL, FAIL, FAIL,
88/* ` a b c d e f g */
89/*12*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, FAIL,
90/* h i j k l m n o */
91/*13*/ 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, FAIL, FAIL,
92/* p q r s t u v w */
93/*14*/ 0x3D, 0x3E, 0x3F, FAIL, FAIL, FAIL, FAIL, FAIL,
94/* x y z { | } ~ ^? */
95/*15*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
96/*16*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
97 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
98 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
99 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
100 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
101 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
102 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
103 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
104 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
105 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
106 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
107 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
108 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
109 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
110 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
111 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
112};
113
114static unsigned char table_b2a_hqx[] =
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000115"!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr";
Jack Jansen72781191995-08-07 14:34:15 +0000116
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000117static char table_a2b_base64[] = {
118 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
119 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
120 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
121 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, /* Note PAD->0 */
122 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
123 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
124 -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
125 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
126};
127
128#define BASE64_PAD '='
129#define BASE64_MAXBIN 57 /* Max binary chunk size (76 char line) */
130
131static unsigned char table_b2a_base64[] =
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000132"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000133
134
135
Jack Jansen72781191995-08-07 14:34:15 +0000136static unsigned short crctab_hqx[256] = {
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000137 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
138 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
139 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
140 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
141 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
142 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
143 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
144 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
145 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
146 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
147 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
148 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
149 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
150 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
151 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
152 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
153 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
154 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
155 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
156 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
157 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
158 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
159 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
160 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
161 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
162 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
163 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
164 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
165 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
166 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
167 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
168 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
Jack Jansen72781191995-08-07 14:34:15 +0000169};
170
171static char doc_a2b_uu[] = "(ascii) -> bin. Decode a line of uuencoded data";
172
173static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000174binascii_a2b_uu(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000175{
176 unsigned char *ascii_data, *bin_data;
177 int leftbits = 0;
178 unsigned char this_ch;
179 unsigned int leftchar = 0;
180 PyObject *rv;
181 int ascii_len, bin_len;
182
Guido van Rossum43713e52000-02-29 13:59:29 +0000183 if ( !PyArg_ParseTuple(args, "t#:a2b_uu", &ascii_data, &ascii_len) )
Jack Jansen72781191995-08-07 14:34:15 +0000184 return NULL;
185
186 /* First byte: binary data length (in bytes) */
187 bin_len = (*ascii_data++ - ' ') & 077;
188 ascii_len--;
189
190 /* Allocate the buffer */
191 if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL )
192 return NULL;
193 bin_data = (unsigned char *)PyString_AsString(rv);
194
195 for( ; bin_len > 0 ; ascii_len--, ascii_data++ ) {
196 this_ch = *ascii_data;
197 if ( this_ch == '\n' || this_ch == '\r' || ascii_len <= 0) {
198 /*
199 ** Whitespace. Assume some spaces got eaten at
200 ** end-of-line. (We check this later)
201 */
202 this_ch = 0;
203 } else {
Jack Jansen5d957971995-11-14 10:35:19 +0000204 /* Check the character for legality
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000205 ** The 64 in stead of the expected 63 is because
206 ** there are a few uuencodes out there that use
Guido van Rossum92d89172001-01-09 02:11:57 +0000207 ** '`' as zero instead of space.
Jack Jansen5d957971995-11-14 10:35:19 +0000208 */
209 if ( this_ch < ' ' || this_ch > (' ' + 64)) {
Jack Jansen72781191995-08-07 14:34:15 +0000210 PyErr_SetString(Error, "Illegal char");
211 Py_DECREF(rv);
212 return NULL;
213 }
214 this_ch = (this_ch - ' ') & 077;
215 }
216 /*
217 ** Shift it in on the low end, and see if there's
218 ** a byte ready for output.
219 */
220 leftchar = (leftchar << 6) | (this_ch);
221 leftbits += 6;
222 if ( leftbits >= 8 ) {
223 leftbits -= 8;
224 *bin_data++ = (leftchar >> leftbits) & 0xff;
225 leftchar &= ((1 << leftbits) - 1);
226 bin_len--;
227 }
228 }
229 /*
230 ** Finally, check that if there's anything left on the line
231 ** that it's whitespace only.
232 */
233 while( ascii_len-- > 0 ) {
234 this_ch = *ascii_data++;
Guido van Rossum92d89172001-01-09 02:11:57 +0000235 /* Extra '`' may be written as padding in some cases */
236 if ( this_ch != ' ' && this_ch != ' '+64 &&
Guido van Rossum1243ae71997-07-11 18:36:28 +0000237 this_ch != '\n' && this_ch != '\r' ) {
Jack Jansen72781191995-08-07 14:34:15 +0000238 PyErr_SetString(Error, "Trailing garbage");
239 Py_DECREF(rv);
240 return NULL;
241 }
242 }
243 return rv;
244}
245
246static char doc_b2a_uu[] = "(bin) -> ascii. Uuencode line of data";
247
248static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000249binascii_b2a_uu(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000250{
251 unsigned char *ascii_data, *bin_data;
252 int leftbits = 0;
253 unsigned char this_ch;
254 unsigned int leftchar = 0;
255 PyObject *rv;
256 int bin_len;
257
Guido van Rossum43713e52000-02-29 13:59:29 +0000258 if ( !PyArg_ParseTuple(args, "s#:b2a_uu", &bin_data, &bin_len) )
Jack Jansen72781191995-08-07 14:34:15 +0000259 return NULL;
260 if ( bin_len > 45 ) {
261 /* The 45 is a limit that appears in all uuencode's */
262 PyErr_SetString(Error, "At most 45 bytes at once");
263 return NULL;
264 }
265
266 /* We're lazy and allocate to much (fixed up later) */
267 if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2)) == NULL )
268 return NULL;
269 ascii_data = (unsigned char *)PyString_AsString(rv);
270
271 /* Store the length */
272 *ascii_data++ = ' ' + (bin_len & 077);
273
274 for( ; bin_len > 0 || leftbits != 0 ; bin_len--, bin_data++ ) {
275 /* Shift the data (or padding) into our buffer */
276 if ( bin_len > 0 ) /* Data */
277 leftchar = (leftchar << 8) | *bin_data;
278 else /* Padding */
279 leftchar <<= 8;
280 leftbits += 8;
281
282 /* See if there are 6-bit groups ready */
283 while ( leftbits >= 6 ) {
284 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
285 leftbits -= 6;
286 *ascii_data++ = this_ch + ' ';
287 }
288 }
289 *ascii_data++ = '\n'; /* Append a courtesy newline */
290
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000291 _PyString_Resize(&rv, (ascii_data -
292 (unsigned char *)PyString_AsString(rv)));
Jack Jansen72781191995-08-07 14:34:15 +0000293 return rv;
294}
295
Guido van Rossum2db4f471999-10-19 19:05:14 +0000296
297static int
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000298binascii_find_valid(unsigned char *s, int slen, int num)
Guido van Rossum2db4f471999-10-19 19:05:14 +0000299{
300 /* Finds & returns the (num+1)th
301 ** valid character for base64, or -1 if none.
302 */
303
304 int ret = -1;
305 unsigned char c, b64val;
306
307 while ((slen > 0) && (ret == -1)) {
308 c = *s;
309 b64val = table_a2b_base64[c & 0x7f];
310 if ( ((c <= 0x7f) && (b64val != (unsigned char)-1)) ) {
311 if (num == 0)
312 ret = *s;
313 num--;
314 }
315
316 s++;
317 slen--;
318 }
319 return ret;
320}
321
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000322static char doc_a2b_base64[] = "(ascii) -> bin. Decode a line of base64 data";
323
324static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000325binascii_a2b_base64(PyObject *self, PyObject *args)
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000326{
327 unsigned char *ascii_data, *bin_data;
328 int leftbits = 0;
329 unsigned char this_ch;
330 unsigned int leftchar = 0;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000331 PyObject *rv;
332 int ascii_len, bin_len;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000333 int quad_pos = 0;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000334
Guido van Rossum43713e52000-02-29 13:59:29 +0000335 if ( !PyArg_ParseTuple(args, "t#:a2b_base64", &ascii_data, &ascii_len) )
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000336 return NULL;
337
Peter Schneider-Kampd895b202001-06-07 05:51:36 +0000338 if ( ascii_len == 0) {
339 PyErr_SetString(Error, "Cannot decode empty input");
340 return NULL;
341 }
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000342 bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */
343
344 /* Allocate the buffer */
345 if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL )
346 return NULL;
347 bin_data = (unsigned char *)PyString_AsString(rv);
348 bin_len = 0;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000349
350 for( ; ascii_len > 0; ascii_len--, ascii_data++) {
351 this_ch = *ascii_data;
352
353 if (this_ch > 0x7f ||
354 this_ch == '\r' || this_ch == '\n' || this_ch == ' ')
Jack Jansenba1de3b1996-01-22 10:47:15 +0000355 continue;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000356
357 /* Check for pad sequences and ignore
358 ** the invalid ones.
359 */
360 if (this_ch == BASE64_PAD) {
361 if ( (quad_pos < 2) ||
362 ((quad_pos == 2) &&
363 (binascii_find_valid(ascii_data, ascii_len, 1)
364 != BASE64_PAD)) )
365 {
366 continue;
367 }
368 else {
369 /* A pad sequence means no more input.
370 ** We've already interpreted the data
371 ** from the quad at this point.
372 */
373 leftbits = 0;
374 break;
375 }
376 }
377
378 this_ch = table_a2b_base64[*ascii_data];
379 if ( this_ch == (unsigned char) -1 )
380 continue;
381
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000382 /*
383 ** Shift it in on the low end, and see if there's
384 ** a byte ready for output.
385 */
Guido van Rossum2db4f471999-10-19 19:05:14 +0000386 quad_pos = (quad_pos + 1) & 0x03;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000387 leftchar = (leftchar << 6) | (this_ch);
388 leftbits += 6;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000389
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000390 if ( leftbits >= 8 ) {
391 leftbits -= 8;
392 *bin_data++ = (leftchar >> leftbits) & 0xff;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000393 bin_len++;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000394 leftchar &= ((1 << leftbits) - 1);
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000395 }
Guido van Rossum2db4f471999-10-19 19:05:14 +0000396 }
397
398 if (leftbits != 0) {
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000399 PyErr_SetString(Error, "Incorrect padding");
400 Py_DECREF(rv);
401 return NULL;
402 }
Guido van Rossum2db4f471999-10-19 19:05:14 +0000403
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000404 /* and set string size correctly */
405 _PyString_Resize(&rv, bin_len);
406 return rv;
407}
408
409static char doc_b2a_base64[] = "(bin) -> ascii. Base64-code line of data";
410
411static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000412binascii_b2a_base64(PyObject *self, PyObject *args)
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000413{
414 unsigned char *ascii_data, *bin_data;
415 int leftbits = 0;
416 unsigned char this_ch;
417 unsigned int leftchar = 0;
418 PyObject *rv;
419 int bin_len;
420
Guido van Rossum43713e52000-02-29 13:59:29 +0000421 if ( !PyArg_ParseTuple(args, "s#:b2a_base64", &bin_data, &bin_len) )
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000422 return NULL;
423 if ( bin_len > BASE64_MAXBIN ) {
424 PyErr_SetString(Error, "Too much data for base64 line");
425 return NULL;
426 }
427
428 /* We're lazy and allocate to much (fixed up later) */
429 if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2)) == NULL )
430 return NULL;
431 ascii_data = (unsigned char *)PyString_AsString(rv);
432
433 for( ; bin_len > 0 ; bin_len--, bin_data++ ) {
434 /* Shift the data into our buffer */
435 leftchar = (leftchar << 8) | *bin_data;
436 leftbits += 8;
437
438 /* See if there are 6-bit groups ready */
439 while ( leftbits >= 6 ) {
440 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
441 leftbits -= 6;
442 *ascii_data++ = table_b2a_base64[this_ch];
443 }
444 }
445 if ( leftbits == 2 ) {
446 *ascii_data++ = table_b2a_base64[(leftchar&3) << 4];
447 *ascii_data++ = BASE64_PAD;
448 *ascii_data++ = BASE64_PAD;
449 } else if ( leftbits == 4 ) {
450 *ascii_data++ = table_b2a_base64[(leftchar&0xf) << 2];
451 *ascii_data++ = BASE64_PAD;
452 }
453 *ascii_data++ = '\n'; /* Append a courtesy newline */
454
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000455 _PyString_Resize(&rv, (ascii_data -
456 (unsigned char *)PyString_AsString(rv)));
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000457 return rv;
458}
459
Jack Jansen72781191995-08-07 14:34:15 +0000460static char doc_a2b_hqx[] = "ascii -> bin, done. Decode .hqx coding";
461
462static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000463binascii_a2b_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000464{
465 unsigned char *ascii_data, *bin_data;
466 int leftbits = 0;
467 unsigned char this_ch;
Jack Janseneaeb1c81995-08-14 12:17:57 +0000468 unsigned int leftchar = 0;
Jack Jansen72781191995-08-07 14:34:15 +0000469 PyObject *rv;
470 int len;
471 int done = 0;
472
Guido van Rossum43713e52000-02-29 13:59:29 +0000473 if ( !PyArg_ParseTuple(args, "t#:a2b_hqx", &ascii_data, &len) )
Jack Jansen72781191995-08-07 14:34:15 +0000474 return NULL;
475
476 /* Allocate a string that is too big (fixed later) */
477 if ( (rv=PyString_FromStringAndSize(NULL, len)) == NULL )
478 return NULL;
479 bin_data = (unsigned char *)PyString_AsString(rv);
480
481 for( ; len > 0 ; len--, ascii_data++ ) {
482 /* Get the byte and look it up */
483 this_ch = table_a2b_hqx[*ascii_data];
484 if ( this_ch == SKIP )
485 continue;
486 if ( this_ch == FAIL ) {
487 PyErr_SetString(Error, "Illegal char");
488 Py_DECREF(rv);
489 return NULL;
490 }
491 if ( this_ch == DONE ) {
492 /* The terminating colon */
493 done = 1;
494 break;
495 }
496
497 /* Shift it into the buffer and see if any bytes are ready */
498 leftchar = (leftchar << 6) | (this_ch);
499 leftbits += 6;
500 if ( leftbits >= 8 ) {
501 leftbits -= 8;
502 *bin_data++ = (leftchar >> leftbits) & 0xff;
503 leftchar &= ((1 << leftbits) - 1);
504 }
505 }
506
507 if ( leftbits && !done ) {
508 PyErr_SetString(Incomplete,
509 "String has incomplete number of bytes");
510 Py_DECREF(rv);
511 return NULL;
512 }
Guido van Rossum9c6ba5e1997-01-12 20:02:04 +0000513 _PyString_Resize(
514 &rv, (bin_data - (unsigned char *)PyString_AsString(rv)));
515 if (rv) {
516 PyObject *rrv = Py_BuildValue("Oi", rv, done);
517 Py_DECREF(rv);
518 return rrv;
519 }
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000520
Jack Jansen72781191995-08-07 14:34:15 +0000521 return NULL;
522}
523
524static char doc_rlecode_hqx[] = "Binhex RLE-code binary data";
525
526static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000527binascii_rlecode_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000528{
529 unsigned char *in_data, *out_data;
530 PyObject *rv;
531 unsigned char ch;
532 int in, inend, len;
533
Guido van Rossum43713e52000-02-29 13:59:29 +0000534 if ( !PyArg_ParseTuple(args, "s#:rlecode_hqx", &in_data, &len) )
Jack Jansen72781191995-08-07 14:34:15 +0000535 return NULL;
536
537 /* Worst case: output is twice as big as input (fixed later) */
538 if ( (rv=PyString_FromStringAndSize(NULL, len*2)) == NULL )
539 return NULL;
540 out_data = (unsigned char *)PyString_AsString(rv);
541
542 for( in=0; in<len; in++) {
543 ch = in_data[in];
544 if ( ch == RUNCHAR ) {
545 /* RUNCHAR. Escape it. */
546 *out_data++ = RUNCHAR;
547 *out_data++ = 0;
548 } else {
549 /* Check how many following are the same */
550 for(inend=in+1;
551 inend<len && in_data[inend] == ch &&
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000552 inend < in+255;
Jack Jansen72781191995-08-07 14:34:15 +0000553 inend++) ;
Jack Jansen0223aa11995-08-31 13:44:23 +0000554 if ( inend - in > 3 ) {
555 /* More than 3 in a row. Output RLE. */
Jack Jansen72781191995-08-07 14:34:15 +0000556 *out_data++ = ch;
557 *out_data++ = RUNCHAR;
558 *out_data++ = inend-in;
559 in = inend-1;
560 } else {
561 /* Less than 3. Output the byte itself */
562 *out_data++ = ch;
563 }
564 }
565 }
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000566 _PyString_Resize(&rv, (out_data -
567 (unsigned char *)PyString_AsString(rv)));
Jack Jansen72781191995-08-07 14:34:15 +0000568 return rv;
569}
570
571static char doc_b2a_hqx[] = "Encode .hqx data";
572
573static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000574binascii_b2a_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000575{
576 unsigned char *ascii_data, *bin_data;
577 int leftbits = 0;
578 unsigned char this_ch;
Jack Janseneaeb1c81995-08-14 12:17:57 +0000579 unsigned int leftchar = 0;
Jack Jansen72781191995-08-07 14:34:15 +0000580 PyObject *rv;
581 int len;
582
Guido van Rossum43713e52000-02-29 13:59:29 +0000583 if ( !PyArg_ParseTuple(args, "s#:b2a_hqx", &bin_data, &len) )
Jack Jansen72781191995-08-07 14:34:15 +0000584 return NULL;
585
586 /* Allocate a buffer that is at least large enough */
587 if ( (rv=PyString_FromStringAndSize(NULL, len*2)) == NULL )
588 return NULL;
589 ascii_data = (unsigned char *)PyString_AsString(rv);
590
591 for( ; len > 0 ; len--, bin_data++ ) {
592 /* Shift into our buffer, and output any 6bits ready */
593 leftchar = (leftchar << 8) | *bin_data;
594 leftbits += 8;
595 while ( leftbits >= 6 ) {
596 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
597 leftbits -= 6;
598 *ascii_data++ = table_b2a_hqx[this_ch];
599 }
600 }
601 /* Output a possible runt byte */
602 if ( leftbits ) {
603 leftchar <<= (6-leftbits);
604 *ascii_data++ = table_b2a_hqx[leftchar & 0x3f];
605 }
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000606 _PyString_Resize(&rv, (ascii_data -
607 (unsigned char *)PyString_AsString(rv)));
Jack Jansen72781191995-08-07 14:34:15 +0000608 return rv;
609}
610
611static char doc_rledecode_hqx[] = "Decode hexbin RLE-coded string";
612
613static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000614binascii_rledecode_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000615{
616 unsigned char *in_data, *out_data;
617 unsigned char in_byte, in_repeat;
618 PyObject *rv;
619 int in_len, out_len, out_len_left;
620
Guido van Rossum43713e52000-02-29 13:59:29 +0000621 if ( !PyArg_ParseTuple(args, "s#:rledecode_hqx", &in_data, &in_len) )
Jack Jansen72781191995-08-07 14:34:15 +0000622 return NULL;
623
624 /* Empty string is a special case */
625 if ( in_len == 0 )
626 return Py_BuildValue("s", "");
627
628 /* Allocate a buffer of reasonable size. Resized when needed */
629 out_len = in_len*2;
630 if ( (rv=PyString_FromStringAndSize(NULL, out_len)) == NULL )
631 return NULL;
632 out_len_left = out_len;
633 out_data = (unsigned char *)PyString_AsString(rv);
634
635 /*
636 ** We need two macros here to get/put bytes and handle
637 ** end-of-buffer for input and output strings.
638 */
639#define INBYTE(b) \
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000640 do { \
641 if ( --in_len < 0 ) { \
642 PyErr_SetString(Incomplete, ""); \
643 Py_DECREF(rv); \
644 return NULL; \
645 } \
646 b = *in_data++; \
647 } while(0)
Jack Jansen72781191995-08-07 14:34:15 +0000648
649#define OUTBYTE(b) \
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000650 do { \
651 if ( --out_len_left < 0 ) { \
652 _PyString_Resize(&rv, 2*out_len); \
653 if ( rv == NULL ) return NULL; \
654 out_data = (unsigned char *)PyString_AsString(rv) \
655 + out_len; \
656 out_len_left = out_len-1; \
657 out_len = out_len * 2; \
658 } \
659 *out_data++ = b; \
660 } while(0)
Jack Jansen72781191995-08-07 14:34:15 +0000661
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000662 /*
663 ** Handle first byte separately (since we have to get angry
664 ** in case of an orphaned RLE code).
665 */
666 INBYTE(in_byte);
Jack Jansen72781191995-08-07 14:34:15 +0000667
668 if (in_byte == RUNCHAR) {
669 INBYTE(in_repeat);
670 if (in_repeat != 0) {
671 /* Note Error, not Incomplete (which is at the end
672 ** of the string only). This is a programmer error.
673 */
674 PyErr_SetString(Error, "Orphaned RLE code at start");
675 Py_DECREF(rv);
676 return NULL;
677 }
678 OUTBYTE(RUNCHAR);
679 } else {
680 OUTBYTE(in_byte);
681 }
682
683 while( in_len > 0 ) {
684 INBYTE(in_byte);
685
686 if (in_byte == RUNCHAR) {
687 INBYTE(in_repeat);
688 if ( in_repeat == 0 ) {
689 /* Just an escaped RUNCHAR value */
690 OUTBYTE(RUNCHAR);
691 } else {
692 /* Pick up value and output a sequence of it */
693 in_byte = out_data[-1];
694 while ( --in_repeat > 0 )
695 OUTBYTE(in_byte);
696 }
697 } else {
698 /* Normal byte */
699 OUTBYTE(in_byte);
700 }
701 }
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000702 _PyString_Resize(&rv, (out_data -
703 (unsigned char *)PyString_AsString(rv)));
Jack Jansen72781191995-08-07 14:34:15 +0000704 return rv;
705}
706
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000707static char doc_crc_hqx[] =
708"(data, oldcrc) -> newcrc. Compute hqx CRC incrementally";
Jack Jansen72781191995-08-07 14:34:15 +0000709
710static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000711binascii_crc_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000712{
713 unsigned char *bin_data;
714 unsigned int crc;
715 int len;
716
Guido van Rossum43713e52000-02-29 13:59:29 +0000717 if ( !PyArg_ParseTuple(args, "s#i:crc_hqx", &bin_data, &len, &crc) )
Jack Jansen72781191995-08-07 14:34:15 +0000718 return NULL;
719
720 while(len--) {
721 crc=((crc<<8)&0xff00)^crctab_hqx[((crc>>8)&0xff)^*bin_data++];
722 }
723
724 return Py_BuildValue("i", crc);
725}
726
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000727static char doc_crc32[] =
728"(data, oldcrc = 0) -> newcrc. Compute CRC-32 incrementally";
729
730/* Crc - 32 BIT ANSI X3.66 CRC checksum files
731 Also known as: ISO 3307
732**********************************************************************|
733* *|
734* Demonstration program to compute the 32-bit CRC used as the frame *|
735* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *|
736* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *|
737* protocol). The 32-bit FCS was added via the Federal Register, *|
738* 1 June 1982, p.23798. I presume but don't know for certain that *|
739* this polynomial is or will be included in CCITT V.41, which *|
740* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *|
741* PUB 78 says that the 32-bit FCS reduces otherwise undetected *|
742* errors by a factor of 10^-5 over 16-bit FCS. *|
743* *|
744**********************************************************************|
745
746 Copyright (C) 1986 Gary S. Brown. You may use this program, or
747 code or tables extracted from it, as desired without restriction.
748
749 First, the polynomial itself and its table of feedback terms. The
750 polynomial is
751 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
752 Note that we take it "backwards" and put the highest-order term in
753 the lowest-order bit. The X^32 term is "implied"; the LSB is the
754 X^31 term, etc. The X^0 term (usually shown as "+1") results in
755 the MSB being 1.
756
757 Note that the usual hardware shift register implementation, which
758 is what we're using (we're merely optimizing it by doing eight-bit
759 chunks at a time) shifts bits into the lowest-order term. In our
760 implementation, that means shifting towards the right. Why do we
761 do it this way? Because the calculated CRC must be transmitted in
762 order from highest-order term to lowest-order term. UARTs transmit
763 characters in order from LSB to MSB. By storing the CRC this way,
764 we hand it to the UART in the order low-byte to high-byte; the UART
765 sends each low-bit to hight-bit; and the result is transmission bit
766 by bit from highest- to lowest-order term without requiring any bit
767 shuffling on our part. Reception works similarly.
768
769 The feedback terms table consists of 256, 32-bit entries. Notes:
770
771 1. The table can be generated at runtime if desired; code to do so
772 is shown later. It might not be obvious, but the feedback
773 terms simply represent the results of eight shift/xor opera-
774 tions for all combinations of data and CRC register values.
775
776 2. The CRC accumulation logic is the same for all CRC polynomials,
777 be they sixteen or thirty-two bits wide. You simply choose the
778 appropriate table. Alternatively, because the table can be
779 generated at runtime, you can start by generating the table for
780 the polynomial in question and use exactly the same "updcrc",
781 if your application needn't simultaneously handle two CRC
782 polynomials. (Note, however, that XMODEM is strange.)
783
784 3. For 16-bit CRCs, the table entries need be only 16 bits wide;
785 of course, 32-bit entries work OK if the high 16 bits are zero.
786
787 4. The values must be right-shifted by eight bits by the "updcrc"
788 logic; the shift must be unsigned (bring in zeroes). On some
789 hardware you could probably optimize the shift in assembler by
790 using byte-swap instructions.
791********************************************************************/
792
793static unsigned long crc_32_tab[256] = {
7940x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
7950x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
7960xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
7970x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
7980x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
7990x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
8000xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
8010xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
8020x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
8030x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
8040xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
8050xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
8060x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
8070x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
8080x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
8090xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
8100x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
8110x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
8120x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
8130xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
8140x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
8150x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
8160xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
8170xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
8180x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
8190x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
8200x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
8210x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
8220xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
8230x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
8240x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
8250x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
8260xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
8270xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
8280x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
8290x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
8300xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
8310xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
8320x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
8330x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
8340x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
8350xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
8360x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
8370x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
8380x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
8390xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
8400x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
8410x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
8420xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
8430xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
8440x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
8450x2d02ef8dUL
846};
847
848static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000849binascii_crc32(PyObject *self, PyObject *args)
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000850{ /* By Jim Ahlstrom; All rights transferred to CNRI */
851 unsigned char *bin_data;
852 unsigned long crc = 0UL; /* initial value of CRC */
853 int len;
854
Guido van Rossum43713e52000-02-29 13:59:29 +0000855 if ( !PyArg_ParseTuple(args, "s#|l:crc32", &bin_data, &len, &crc) )
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000856 return NULL;
857
858 crc = crc ^ 0xFFFFFFFFUL;
859 while(len--)
860 crc = crc_32_tab[(crc ^ *bin_data++) & 0xffUL] ^ (crc >> 8);
861 /* Note: (crc >> 8) MUST zero fill on left */
862 return Py_BuildValue("l", crc ^ 0xFFFFFFFFUL);
863}
864
Barry Warsawe977c212000-08-15 06:07:13 +0000865
866static PyObject *
867binascii_hexlify(PyObject *self, PyObject *args)
868{
869 char* argbuf;
870 int arglen;
871 PyObject *retval;
872 char* retbuf;
873 int i, j;
874
875 if (!PyArg_ParseTuple(args, "t#:b2a_hex", &argbuf, &arglen))
876 return NULL;
877
878 retval = PyString_FromStringAndSize(NULL, arglen*2);
879 if (!retval)
880 return NULL;
881 retbuf = PyString_AsString(retval);
882 if (!retbuf)
883 goto finally;
884
885 /* make hex version of string, taken from shamodule.c */
886 for (i=j=0; i < arglen; i++) {
887 char c;
888 c = (argbuf[i] >> 4) & 0xf;
889 c = (c>9) ? c+'a'-10 : c + '0';
890 retbuf[j++] = c;
891 c = argbuf[i] & 0xf;
892 c = (c>9) ? c+'a'-10 : c + '0';
893 retbuf[j++] = c;
894 }
895 return retval;
896
897 finally:
898 Py_DECREF(retval);
899 return NULL;
900}
901
902static char doc_hexlify[] =
903"b2a_hex(data) -> s; Hexadecimal representation of binary data.\n\
904\n\
905This function is also available as \"hexlify()\".";
906
907
908static int
Tim Petersb59ab422000-08-15 16:41:26 +0000909to_int(int c)
Barry Warsawe977c212000-08-15 06:07:13 +0000910{
911 if (isdigit(c))
912 return c - '0';
913 else {
914 if (isupper(c))
915 c = tolower(c);
916 if (c >= 'a' && c <= 'f')
917 return c - 'a' + 10;
918 }
919 return -1;
920}
921
922
923static PyObject *
924binascii_unhexlify(PyObject *self, PyObject *args)
925{
926 char* argbuf;
927 int arglen;
928 PyObject *retval;
929 char* retbuf;
930 int i, j;
931
932 if (!PyArg_ParseTuple(args, "s#:a2b_hex", &argbuf, &arglen))
933 return NULL;
934
Barry Warsaw16168472000-08-15 06:59:58 +0000935 /* XXX What should we do about strings with an odd length? Should
936 * we add an implicit leading zero, or a trailing zero? For now,
937 * raise an exception.
Barry Warsawe977c212000-08-15 06:07:13 +0000938 */
939 if (arglen % 2) {
Barry Warsaw16168472000-08-15 06:59:58 +0000940 PyErr_SetString(PyExc_TypeError, "Odd-length string");
Barry Warsawe977c212000-08-15 06:07:13 +0000941 return NULL;
942 }
943
944 retval = PyString_FromStringAndSize(NULL, (arglen/2));
945 if (!retval)
946 return NULL;
947 retbuf = PyString_AsString(retval);
948 if (!retbuf)
949 goto finally;
950
951 for (i=j=0; i < arglen; i += 2) {
952 int top = to_int(Py_CHARMASK(argbuf[i]));
953 int bot = to_int(Py_CHARMASK(argbuf[i+1]));
954 if (top == -1 || bot == -1) {
955 PyErr_SetString(PyExc_TypeError,
Barry Warsaw16168472000-08-15 06:59:58 +0000956 "Non-hexadecimal digit found");
Barry Warsawe977c212000-08-15 06:07:13 +0000957 goto finally;
958 }
959 retbuf[j++] = (top << 4) + bot;
960 }
961 return retval;
962
963 finally:
964 Py_DECREF(retval);
965 return NULL;
966}
967
968static char doc_unhexlify[] =
969"a2b_hex(hexstr) -> s; Binary data of hexadecimal representation.\n\
970\n\
971hexstr must contain an even number of hex digits (upper or lower case).\n\
972This function is also available as \"unhexlify()\"";
973
974
Jack Jansen72781191995-08-07 14:34:15 +0000975/* List of functions defined in the module */
976
977static struct PyMethodDef binascii_module_methods[] = {
Barry Warsawe977c212000-08-15 06:07:13 +0000978 {"a2b_uu", binascii_a2b_uu, METH_VARARGS, doc_a2b_uu},
979 {"b2a_uu", binascii_b2a_uu, METH_VARARGS, doc_b2a_uu},
980 {"a2b_base64", binascii_a2b_base64, METH_VARARGS, doc_a2b_base64},
981 {"b2a_base64", binascii_b2a_base64, METH_VARARGS, doc_b2a_base64},
982 {"a2b_hqx", binascii_a2b_hqx, METH_VARARGS, doc_a2b_hqx},
983 {"b2a_hqx", binascii_b2a_hqx, METH_VARARGS, doc_b2a_hqx},
984 {"b2a_hex", binascii_hexlify, METH_VARARGS, doc_hexlify},
985 {"a2b_hex", binascii_unhexlify, METH_VARARGS, doc_unhexlify},
986 {"hexlify", binascii_hexlify, METH_VARARGS, doc_hexlify},
987 {"unhexlify", binascii_unhexlify, METH_VARARGS, doc_unhexlify},
988 {"rlecode_hqx", binascii_rlecode_hqx, METH_VARARGS, doc_rlecode_hqx},
989 {"rledecode_hqx", binascii_rledecode_hqx, METH_VARARGS,
990 doc_rledecode_hqx},
991 {"crc_hqx", binascii_crc_hqx, METH_VARARGS, doc_crc_hqx},
992 {"crc32", binascii_crc32, METH_VARARGS, doc_crc32},
993 {NULL, NULL} /* sentinel */
Jack Jansen72781191995-08-07 14:34:15 +0000994};
995
996
997/* Initialization function for the module (*must* be called initbinascii) */
998static char doc_binascii[] = "Conversion between binary data and ASCII";
999
Guido van Rossum3886bb61998-12-04 18:50:17 +00001000DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001001initbinascii(void)
Jack Jansen72781191995-08-07 14:34:15 +00001002{
1003 PyObject *m, *d, *x;
1004
1005 /* Create the module and add the functions */
1006 m = Py_InitModule("binascii", binascii_module_methods);
1007
1008 d = PyModule_GetDict(m);
1009 x = PyString_FromString(doc_binascii);
1010 PyDict_SetItemString(d, "__doc__", x);
Guido van Rossum5c159bd1997-08-04 23:55:25 +00001011 Py_XDECREF(x);
Jack Jansen72781191995-08-07 14:34:15 +00001012
Guido van Rossum7dbb48a1997-10-08 15:26:07 +00001013 Error = PyErr_NewException("binascii.Error", NULL, NULL);
Jack Jansen72781191995-08-07 14:34:15 +00001014 PyDict_SetItemString(d, "Error", Error);
Guido van Rossum7dbb48a1997-10-08 15:26:07 +00001015 Incomplete = PyErr_NewException("binascii.Incomplete", NULL, NULL);
Jack Jansen72781191995-08-07 14:34:15 +00001016 PyDict_SetItemString(d, "Incomplete", Incomplete);
Jack Jansen72781191995-08-07 14:34:15 +00001017}