blob: 289225b03e5cb52886c76dfd95360fa9e2c0b42f [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.
Tim Peters934c1a12002-07-02 22:24:50 +000045**
Martin v. Löwis16dc7f42001-09-30 20:32:11 +000046** Added support for quoted-printable encoding, based on rfc 1521 et al
Tim Peters934c1a12002-07-02 22:24:50 +000047** quoted-printable encoding specifies that non printable characters (anything
Martin v. Löwis16dc7f42001-09-30 20:32:11 +000048** below 32 and above 126) be encoded as =XX where XX is the hexadecimal value
49** of the character. It also specifies some other behavior to enable 8bit data
Tim Peters934c1a12002-07-02 22:24:50 +000050** in a mail message with little difficulty (maximum line sizes, protecting
51** some cases of whitespace, etc).
Martin v. Löwis16dc7f42001-09-30 20:32:11 +000052**
53** Brandon Long, September 2001.
Jack Jansen72781191995-08-07 14:34:15 +000054*/
55
Thomas Wouters9c544482006-03-01 21:59:44 +000056#define PY_SSIZE_T_CLEAN
Jack Jansen72781191995-08-07 14:34:15 +000057
58#include "Python.h"
Christian Heimes1dc54002008-03-24 02:19:29 +000059#ifdef USE_ZLIB_CRC32
60#include "zlib.h"
61#endif
Jack Jansen72781191995-08-07 14:34:15 +000062
63static PyObject *Error;
64static PyObject *Incomplete;
65
66/*
67** hqx lookup table, ascii->binary.
68*/
69
70#define RUNCHAR 0x90
71
72#define DONE 0x7F
73#define SKIP 0x7E
74#define FAIL 0x7D
75
76static unsigned char table_a2b_hqx[256] = {
77/* ^@ ^A ^B ^C ^D ^E ^F ^G */
78/* 0*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
79/* \b \t \n ^K ^L \r ^N ^O */
80/* 1*/ FAIL, FAIL, SKIP, FAIL, FAIL, SKIP, FAIL, FAIL,
81/* ^P ^Q ^R ^S ^T ^U ^V ^W */
82/* 2*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
83/* ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ */
84/* 3*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
85/* ! " # $ % & ' */
86/* 4*/ FAIL, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
87/* ( ) * + , - . / */
88/* 5*/ 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, FAIL, FAIL,
89/* 0 1 2 3 4 5 6 7 */
90/* 6*/ 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, FAIL,
91/* 8 9 : ; < = > ? */
92/* 7*/ 0x14, 0x15, DONE, FAIL, FAIL, FAIL, FAIL, FAIL,
93/* @ A B C D E F G */
94/* 8*/ 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
95/* H I J K L M N O */
96/* 9*/ 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, FAIL,
97/* P Q R S T U V W */
98/*10*/ 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, FAIL,
99/* X Y Z [ \ ] ^ _ */
100/*11*/ 0x2C, 0x2D, 0x2E, 0x2F, FAIL, FAIL, FAIL, FAIL,
101/* ` a b c d e f g */
102/*12*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, FAIL,
103/* h i j k l m n o */
104/*13*/ 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, FAIL, FAIL,
105/* p q r s t u v w */
106/*14*/ 0x3D, 0x3E, 0x3F, FAIL, FAIL, FAIL, FAIL, FAIL,
107/* x y z { | } ~ ^? */
108/*15*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
109/*16*/ 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 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
113 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
114 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
115 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
116 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
117 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
118 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
119 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
120 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
121 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
122 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
123 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
124 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
125};
126
127static unsigned char table_b2a_hqx[] =
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000128"!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr";
Jack Jansen72781191995-08-07 14:34:15 +0000129
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000130static char table_a2b_base64[] = {
131 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
132 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
133 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
134 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, /* Note PAD->0 */
135 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
136 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
137 -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
138 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
139};
140
141#define BASE64_PAD '='
Guido van Rossum355bc0c2001-10-30 03:00:52 +0000142
143/* Max binary chunk size; limited only by available memory */
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000144#define BASE64_MAXBIN ((PY_SSIZE_T_MAX - 3) / 2)
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000145
146static unsigned char table_b2a_base64[] =
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000147"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000148
149
150
Jack Jansen72781191995-08-07 14:34:15 +0000151static unsigned short crctab_hqx[256] = {
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000152 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
153 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
154 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
155 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
156 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
157 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
158 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
159 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
160 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
161 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
162 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
163 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
164 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
165 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
166 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
167 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
168 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
169 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
170 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
171 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
172 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
173 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
174 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
175 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
176 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
177 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
178 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
179 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
180 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
181 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
182 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
183 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
Jack Jansen72781191995-08-07 14:34:15 +0000184};
185
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000186PyDoc_STRVAR(doc_a2b_uu, "(ascii) -> bin. Decode a line of uuencoded data");
Jack Jansen72781191995-08-07 14:34:15 +0000187
188static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000189binascii_a2b_uu(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000190{
Martin v. Löwis423be952008-08-13 15:53:07 +0000191 Py_buffer pascii;
Jack Jansen72781191995-08-07 14:34:15 +0000192 unsigned char *ascii_data, *bin_data;
193 int leftbits = 0;
194 unsigned char this_ch;
195 unsigned int leftchar = 0;
196 PyObject *rv;
Thomas Woutersf98db652006-03-01 21:37:32 +0000197 Py_ssize_t ascii_len, bin_len;
Tim Peters934c1a12002-07-02 22:24:50 +0000198
Martin v. Löwis423be952008-08-13 15:53:07 +0000199 if ( !PyArg_ParseTuple(args, "y*:a2b_uu", &pascii) )
Jack Jansen72781191995-08-07 14:34:15 +0000200 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000201 ascii_data = pascii.buf;
202 ascii_len = pascii.len;
Jack Jansen72781191995-08-07 14:34:15 +0000203
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000204 assert(ascii_len >= 0);
205
Jack Jansen72781191995-08-07 14:34:15 +0000206 /* First byte: binary data length (in bytes) */
207 bin_len = (*ascii_data++ - ' ') & 077;
208 ascii_len--;
209
210 /* Allocate the buffer */
Martin v. Löwis423be952008-08-13 15:53:07 +0000211 if ( (rv=PyBytes_FromStringAndSize(NULL, bin_len)) == NULL ) {
212 PyBuffer_Release(&pascii);
Jack Jansen72781191995-08-07 14:34:15 +0000213 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000214 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000215 bin_data = (unsigned char *)PyBytes_AS_STRING(rv);
Tim Peters934c1a12002-07-02 22:24:50 +0000216
Jack Jansen72781191995-08-07 14:34:15 +0000217 for( ; bin_len > 0 ; ascii_len--, ascii_data++ ) {
Neal Norwitzfe92eef2004-06-06 20:13:10 +0000218 /* XXX is it really best to add NULs if there's no more data */
219 this_ch = (ascii_len > 0) ? *ascii_data : 0;
Jack Jansen72781191995-08-07 14:34:15 +0000220 if ( this_ch == '\n' || this_ch == '\r' || ascii_len <= 0) {
221 /*
222 ** Whitespace. Assume some spaces got eaten at
223 ** end-of-line. (We check this later)
224 */
225 this_ch = 0;
226 } else {
Jack Jansen5d957971995-11-14 10:35:19 +0000227 /* Check the character for legality
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000228 ** The 64 in stead of the expected 63 is because
229 ** there are a few uuencodes out there that use
Guido van Rossum92d89172001-01-09 02:11:57 +0000230 ** '`' as zero instead of space.
Jack Jansen5d957971995-11-14 10:35:19 +0000231 */
232 if ( this_ch < ' ' || this_ch > (' ' + 64)) {
Jack Jansen72781191995-08-07 14:34:15 +0000233 PyErr_SetString(Error, "Illegal char");
Benjamin Peterson9edd2bd2008-08-27 00:31:37 +0000234 PyBuffer_Release(&pascii);
Jack Jansen72781191995-08-07 14:34:15 +0000235 Py_DECREF(rv);
236 return NULL;
237 }
238 this_ch = (this_ch - ' ') & 077;
239 }
240 /*
241 ** Shift it in on the low end, and see if there's
242 ** a byte ready for output.
243 */
244 leftchar = (leftchar << 6) | (this_ch);
245 leftbits += 6;
246 if ( leftbits >= 8 ) {
247 leftbits -= 8;
248 *bin_data++ = (leftchar >> leftbits) & 0xff;
249 leftchar &= ((1 << leftbits) - 1);
250 bin_len--;
251 }
252 }
253 /*
254 ** Finally, check that if there's anything left on the line
255 ** that it's whitespace only.
256 */
257 while( ascii_len-- > 0 ) {
258 this_ch = *ascii_data++;
Guido van Rossum92d89172001-01-09 02:11:57 +0000259 /* Extra '`' may be written as padding in some cases */
260 if ( this_ch != ' ' && this_ch != ' '+64 &&
Guido van Rossum1243ae71997-07-11 18:36:28 +0000261 this_ch != '\n' && this_ch != '\r' ) {
Jack Jansen72781191995-08-07 14:34:15 +0000262 PyErr_SetString(Error, "Trailing garbage");
Benjamin Peterson9edd2bd2008-08-27 00:31:37 +0000263 PyBuffer_Release(&pascii);
Jack Jansen72781191995-08-07 14:34:15 +0000264 Py_DECREF(rv);
265 return NULL;
266 }
267 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000268 PyBuffer_Release(&pascii);
Jack Jansen72781191995-08-07 14:34:15 +0000269 return rv;
270}
271
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000272PyDoc_STRVAR(doc_b2a_uu, "(bin) -> ascii. Uuencode line of data");
Tim Peters934c1a12002-07-02 22:24:50 +0000273
Jack Jansen72781191995-08-07 14:34:15 +0000274static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000275binascii_b2a_uu(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000276{
Martin v. Löwis423be952008-08-13 15:53:07 +0000277 Py_buffer pbin;
Jack Jansen72781191995-08-07 14:34:15 +0000278 unsigned char *ascii_data, *bin_data;
279 int leftbits = 0;
280 unsigned char this_ch;
281 unsigned int leftchar = 0;
282 PyObject *rv;
Thomas Woutersf98db652006-03-01 21:37:32 +0000283 Py_ssize_t bin_len;
Tim Peters934c1a12002-07-02 22:24:50 +0000284
Martin v. Löwis15b16a32008-12-02 06:00:15 +0000285 if ( !PyArg_ParseTuple(args, "y*:b2a_uu", &pbin) )
Jack Jansen72781191995-08-07 14:34:15 +0000286 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000287 bin_data = pbin.buf;
288 bin_len = pbin.len;
Jack Jansen72781191995-08-07 14:34:15 +0000289 if ( bin_len > 45 ) {
290 /* The 45 is a limit that appears in all uuencode's */
291 PyErr_SetString(Error, "At most 45 bytes at once");
Martin v. Löwis423be952008-08-13 15:53:07 +0000292 PyBuffer_Release(&pbin);
Jack Jansen72781191995-08-07 14:34:15 +0000293 return NULL;
294 }
295
296 /* We're lazy and allocate to much (fixed up later) */
Antoine Pitrou2843aa82010-01-15 00:27:43 +0000297 if ( (rv=PyBytes_FromStringAndSize(NULL, 2 + (bin_len+2)/3*4)) == NULL ) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000298 PyBuffer_Release(&pbin);
Jack Jansen72781191995-08-07 14:34:15 +0000299 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000300 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000301 ascii_data = (unsigned char *)PyBytes_AS_STRING(rv);
Jack Jansen72781191995-08-07 14:34:15 +0000302
303 /* Store the length */
304 *ascii_data++ = ' ' + (bin_len & 077);
Tim Peters934c1a12002-07-02 22:24:50 +0000305
Jack Jansen72781191995-08-07 14:34:15 +0000306 for( ; bin_len > 0 || leftbits != 0 ; bin_len--, bin_data++ ) {
307 /* Shift the data (or padding) into our buffer */
308 if ( bin_len > 0 ) /* Data */
309 leftchar = (leftchar << 8) | *bin_data;
310 else /* Padding */
311 leftchar <<= 8;
312 leftbits += 8;
313
314 /* See if there are 6-bit groups ready */
315 while ( leftbits >= 6 ) {
316 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
317 leftbits -= 6;
318 *ascii_data++ = this_ch + ' ';
319 }
320 }
321 *ascii_data++ = '\n'; /* Append a courtesy newline */
Tim Peters934c1a12002-07-02 22:24:50 +0000322
Christian Heimes72b710a2008-05-26 13:28:38 +0000323 if (_PyBytes_Resize(&rv,
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000324 (ascii_data -
Christian Heimes72b710a2008-05-26 13:28:38 +0000325 (unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000326 Py_DECREF(rv);
327 rv = NULL;
328 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000329 PyBuffer_Release(&pbin);
Jack Jansen72781191995-08-07 14:34:15 +0000330 return rv;
331}
332
Guido van Rossum2db4f471999-10-19 19:05:14 +0000333
334static int
Thomas Woutersf98db652006-03-01 21:37:32 +0000335binascii_find_valid(unsigned char *s, Py_ssize_t slen, int num)
Guido van Rossum2db4f471999-10-19 19:05:14 +0000336{
Tim Peters934c1a12002-07-02 22:24:50 +0000337 /* Finds & returns the (num+1)th
Guido van Rossum2db4f471999-10-19 19:05:14 +0000338 ** valid character for base64, or -1 if none.
339 */
340
341 int ret = -1;
342 unsigned char c, b64val;
343
344 while ((slen > 0) && (ret == -1)) {
345 c = *s;
346 b64val = table_a2b_base64[c & 0x7f];
347 if ( ((c <= 0x7f) && (b64val != (unsigned char)-1)) ) {
348 if (num == 0)
349 ret = *s;
350 num--;
351 }
352
353 s++;
354 slen--;
355 }
356 return ret;
357}
358
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000359PyDoc_STRVAR(doc_a2b_base64, "(ascii) -> bin. Decode a line of base64 data");
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000360
361static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000362binascii_a2b_base64(PyObject *self, PyObject *args)
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000363{
Martin v. Löwis423be952008-08-13 15:53:07 +0000364 Py_buffer pascii;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000365 unsigned char *ascii_data, *bin_data;
366 int leftbits = 0;
367 unsigned char this_ch;
368 unsigned int leftchar = 0;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000369 PyObject *rv;
Thomas Woutersf98db652006-03-01 21:37:32 +0000370 Py_ssize_t ascii_len, bin_len;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000371 int quad_pos = 0;
Tim Peters934c1a12002-07-02 22:24:50 +0000372
Martin v. Löwis423be952008-08-13 15:53:07 +0000373 if ( !PyArg_ParseTuple(args, "y*:a2b_base64", &pascii) )
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000374 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000375 ascii_data = pascii.buf;
376 ascii_len = pascii.len;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000377
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000378 assert(ascii_len >= 0);
379
Martin v. Löwis423be952008-08-13 15:53:07 +0000380 if (ascii_len > PY_SSIZE_T_MAX - 3) {
381 PyBuffer_Release(&pascii);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000382 return PyErr_NoMemory();
Martin v. Löwis423be952008-08-13 15:53:07 +0000383 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000384
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000385 bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */
386
387 /* Allocate the buffer */
Martin v. Löwis423be952008-08-13 15:53:07 +0000388 if ( (rv=PyBytes_FromStringAndSize(NULL, bin_len)) == NULL ) {
389 PyBuffer_Release(&pascii);
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000390 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000391 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000392 bin_data = (unsigned char *)PyBytes_AS_STRING(rv);
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000393 bin_len = 0;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000394
395 for( ; ascii_len > 0; ascii_len--, ascii_data++) {
396 this_ch = *ascii_data;
397
398 if (this_ch > 0x7f ||
399 this_ch == '\r' || this_ch == '\n' || this_ch == ' ')
Jack Jansenba1de3b1996-01-22 10:47:15 +0000400 continue;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000401
402 /* Check for pad sequences and ignore
403 ** the invalid ones.
404 */
405 if (this_ch == BASE64_PAD) {
406 if ( (quad_pos < 2) ||
407 ((quad_pos == 2) &&
408 (binascii_find_valid(ascii_data, ascii_len, 1)
409 != BASE64_PAD)) )
410 {
411 continue;
412 }
413 else {
414 /* A pad sequence means no more input.
415 ** We've already interpreted the data
416 ** from the quad at this point.
417 */
418 leftbits = 0;
419 break;
420 }
421 }
422
423 this_ch = table_a2b_base64[*ascii_data];
424 if ( this_ch == (unsigned char) -1 )
425 continue;
426
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000427 /*
428 ** Shift it in on the low end, and see if there's
429 ** a byte ready for output.
430 */
Guido van Rossum2db4f471999-10-19 19:05:14 +0000431 quad_pos = (quad_pos + 1) & 0x03;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000432 leftchar = (leftchar << 6) | (this_ch);
433 leftbits += 6;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000434
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000435 if ( leftbits >= 8 ) {
436 leftbits -= 8;
437 *bin_data++ = (leftchar >> leftbits) & 0xff;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000438 bin_len++;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000439 leftchar &= ((1 << leftbits) - 1);
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000440 }
Guido van Rossum2db4f471999-10-19 19:05:14 +0000441 }
442
443 if (leftbits != 0) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000444 PyBuffer_Release(&pascii);
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000445 PyErr_SetString(Error, "Incorrect padding");
446 Py_DECREF(rv);
447 return NULL;
448 }
Guido van Rossum2db4f471999-10-19 19:05:14 +0000449
Thomas Wouters9e1c1922003-03-17 11:24:29 +0000450 /* And set string size correctly. If the result string is empty
451 ** (because the input was all invalid) return the shared empty
Christian Heimes72b710a2008-05-26 13:28:38 +0000452 ** string instead; _PyBytes_Resize() won't do this for us.
Thomas Wouters9e1c1922003-03-17 11:24:29 +0000453 */
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000454 if (bin_len > 0) {
Christian Heimes72b710a2008-05-26 13:28:38 +0000455 if (_PyBytes_Resize(&rv, bin_len) < 0) {
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000456 Py_DECREF(rv);
457 rv = NULL;
458 }
459 }
Thomas Wouters9e1c1922003-03-17 11:24:29 +0000460 else {
461 Py_DECREF(rv);
Christian Heimes72b710a2008-05-26 13:28:38 +0000462 rv = PyBytes_FromStringAndSize("", 0);
Thomas Wouters9e1c1922003-03-17 11:24:29 +0000463 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000464 PyBuffer_Release(&pascii);
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000465 return rv;
466}
467
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000468PyDoc_STRVAR(doc_b2a_base64, "(bin) -> ascii. Base64-code line of data");
Tim Peters934c1a12002-07-02 22:24:50 +0000469
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000470static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000471binascii_b2a_base64(PyObject *self, PyObject *args)
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000472{
Martin v. Löwis423be952008-08-13 15:53:07 +0000473 Py_buffer pbuf;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000474 unsigned char *ascii_data, *bin_data;
475 int leftbits = 0;
476 unsigned char this_ch;
477 unsigned int leftchar = 0;
478 PyObject *rv;
Thomas Woutersf98db652006-03-01 21:37:32 +0000479 Py_ssize_t bin_len;
Tim Peters934c1a12002-07-02 22:24:50 +0000480
Martin v. Löwis15b16a32008-12-02 06:00:15 +0000481 if ( !PyArg_ParseTuple(args, "y*:b2a_base64", &pbuf) )
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000482 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000483 bin_data = pbuf.buf;
484 bin_len = pbuf.len;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000485
486 assert(bin_len >= 0);
487
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000488 if ( bin_len > BASE64_MAXBIN ) {
489 PyErr_SetString(Error, "Too much data for base64 line");
Martin v. Löwis423be952008-08-13 15:53:07 +0000490 PyBuffer_Release(&pbuf);
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000491 return NULL;
492 }
Tim Peters934c1a12002-07-02 22:24:50 +0000493
Tim Peters1fbb5772001-12-19 04:41:35 +0000494 /* We're lazy and allocate too much (fixed up later).
495 "+3" leaves room for up to two pad characters and a trailing
496 newline. Note that 'b' gets encoded as 'Yg==\n' (1 in, 5 out). */
Martin v. Löwis423be952008-08-13 15:53:07 +0000497 if ( (rv=PyBytes_FromStringAndSize(NULL, bin_len*2 + 3)) == NULL ) {
498 PyBuffer_Release(&pbuf);
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000499 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000500 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000501 ascii_data = (unsigned char *)PyBytes_AS_STRING(rv);
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000502
503 for( ; bin_len > 0 ; bin_len--, bin_data++ ) {
504 /* Shift the data into our buffer */
505 leftchar = (leftchar << 8) | *bin_data;
506 leftbits += 8;
507
508 /* See if there are 6-bit groups ready */
509 while ( leftbits >= 6 ) {
510 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
511 leftbits -= 6;
512 *ascii_data++ = table_b2a_base64[this_ch];
513 }
514 }
515 if ( leftbits == 2 ) {
516 *ascii_data++ = table_b2a_base64[(leftchar&3) << 4];
517 *ascii_data++ = BASE64_PAD;
518 *ascii_data++ = BASE64_PAD;
519 } else if ( leftbits == 4 ) {
520 *ascii_data++ = table_b2a_base64[(leftchar&0xf) << 2];
521 *ascii_data++ = BASE64_PAD;
Tim Peters934c1a12002-07-02 22:24:50 +0000522 }
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000523 *ascii_data++ = '\n'; /* Append a courtesy newline */
Tim Peters934c1a12002-07-02 22:24:50 +0000524
Christian Heimes72b710a2008-05-26 13:28:38 +0000525 if (_PyBytes_Resize(&rv,
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000526 (ascii_data -
Christian Heimes72b710a2008-05-26 13:28:38 +0000527 (unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000528 Py_DECREF(rv);
529 rv = NULL;
530 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000531 PyBuffer_Release(&pbuf);
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000532 return rv;
533}
534
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000535PyDoc_STRVAR(doc_a2b_hqx, "ascii -> bin, done. Decode .hqx coding");
Jack Jansen72781191995-08-07 14:34:15 +0000536
537static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000538binascii_a2b_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000539{
Antoine Pitrou747e8b32010-01-16 17:55:52 +0000540 Py_buffer pascii;
Jack Jansen72781191995-08-07 14:34:15 +0000541 unsigned char *ascii_data, *bin_data;
542 int leftbits = 0;
543 unsigned char this_ch;
Jack Janseneaeb1c81995-08-14 12:17:57 +0000544 unsigned int leftchar = 0;
Jack Jansen72781191995-08-07 14:34:15 +0000545 PyObject *rv;
Thomas Woutersf98db652006-03-01 21:37:32 +0000546 Py_ssize_t len;
Jack Jansen72781191995-08-07 14:34:15 +0000547 int done = 0;
Tim Peters934c1a12002-07-02 22:24:50 +0000548
Antoine Pitrou747e8b32010-01-16 17:55:52 +0000549 if ( !PyArg_ParseTuple(args, "s*:a2b_hqx", &pascii) )
Jack Jansen72781191995-08-07 14:34:15 +0000550 return NULL;
Antoine Pitrou747e8b32010-01-16 17:55:52 +0000551 ascii_data = pascii.buf;
552 len = pascii.len;
Jack Jansen72781191995-08-07 14:34:15 +0000553
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000554 assert(len >= 0);
555
Antoine Pitrou747e8b32010-01-16 17:55:52 +0000556 if (len > PY_SSIZE_T_MAX - 2) {
557 PyBuffer_Release(&pascii);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000558 return PyErr_NoMemory();
Antoine Pitrou747e8b32010-01-16 17:55:52 +0000559 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000560
Raymond Hettinger658717e2004-09-06 22:58:37 +0000561 /* Allocate a string that is too big (fixed later)
562 Add two to the initial length to prevent interning which
563 would preclude subsequent resizing. */
Christian Heimes72b710a2008-05-26 13:28:38 +0000564 if ( (rv=PyBytes_FromStringAndSize(NULL, len+2)) == NULL )
Antoine Pitrou747e8b32010-01-16 17:55:52 +0000565 if ( (rv=PyBytes_FromStringAndSize(NULL, len+2)) == NULL ) {
566 PyBuffer_Release(&pascii);
Jack Jansen72781191995-08-07 14:34:15 +0000567 return NULL;
Antoine Pitrou747e8b32010-01-16 17:55:52 +0000568 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000569 bin_data = (unsigned char *)PyBytes_AS_STRING(rv);
Jack Jansen72781191995-08-07 14:34:15 +0000570
571 for( ; len > 0 ; len--, ascii_data++ ) {
572 /* Get the byte and look it up */
573 this_ch = table_a2b_hqx[*ascii_data];
574 if ( this_ch == SKIP )
575 continue;
576 if ( this_ch == FAIL ) {
577 PyErr_SetString(Error, "Illegal char");
Antoine Pitrou747e8b32010-01-16 17:55:52 +0000578 PyBuffer_Release(&pascii);
Jack Jansen72781191995-08-07 14:34:15 +0000579 Py_DECREF(rv);
580 return NULL;
581 }
582 if ( this_ch == DONE ) {
583 /* The terminating colon */
584 done = 1;
585 break;
586 }
587
588 /* Shift it into the buffer and see if any bytes are ready */
589 leftchar = (leftchar << 6) | (this_ch);
590 leftbits += 6;
591 if ( leftbits >= 8 ) {
592 leftbits -= 8;
593 *bin_data++ = (leftchar >> leftbits) & 0xff;
594 leftchar &= ((1 << leftbits) - 1);
595 }
596 }
Tim Peters934c1a12002-07-02 22:24:50 +0000597
Jack Jansen72781191995-08-07 14:34:15 +0000598 if ( leftbits && !done ) {
599 PyErr_SetString(Incomplete,
600 "String has incomplete number of bytes");
Antoine Pitrou747e8b32010-01-16 17:55:52 +0000601 PyBuffer_Release(&pascii);
Jack Jansen72781191995-08-07 14:34:15 +0000602 Py_DECREF(rv);
603 return NULL;
604 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000605 if (_PyBytes_Resize(&rv,
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000606 (bin_data -
Christian Heimes72b710a2008-05-26 13:28:38 +0000607 (unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000608 Py_DECREF(rv);
609 rv = NULL;
610 }
Guido van Rossum9c6ba5e1997-01-12 20:02:04 +0000611 if (rv) {
612 PyObject *rrv = Py_BuildValue("Oi", rv, done);
Antoine Pitrou747e8b32010-01-16 17:55:52 +0000613 PyBuffer_Release(&pascii);
Guido van Rossum9c6ba5e1997-01-12 20:02:04 +0000614 Py_DECREF(rv);
615 return rrv;
616 }
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000617
Antoine Pitrou747e8b32010-01-16 17:55:52 +0000618 PyBuffer_Release(&pascii);
Jack Jansen72781191995-08-07 14:34:15 +0000619 return NULL;
620}
621
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000622PyDoc_STRVAR(doc_rlecode_hqx, "Binhex RLE-code binary data");
Jack Jansen72781191995-08-07 14:34:15 +0000623
624static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000625binascii_rlecode_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000626{
Martin v. Löwis423be952008-08-13 15:53:07 +0000627 Py_buffer pbuf;
Jack Jansen72781191995-08-07 14:34:15 +0000628 unsigned char *in_data, *out_data;
629 PyObject *rv;
630 unsigned char ch;
Thomas Woutersf98db652006-03-01 21:37:32 +0000631 Py_ssize_t in, inend, len;
Tim Peters934c1a12002-07-02 22:24:50 +0000632
Martin v. Löwis15b16a32008-12-02 06:00:15 +0000633 if ( !PyArg_ParseTuple(args, "y*:rlecode_hqx", &pbuf) )
Jack Jansen72781191995-08-07 14:34:15 +0000634 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000635 in_data = pbuf.buf;
636 len = pbuf.len;
Jack Jansen72781191995-08-07 14:34:15 +0000637
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000638 assert(len >= 0);
639
Martin v. Löwis423be952008-08-13 15:53:07 +0000640 if (len > PY_SSIZE_T_MAX / 2 - 2) {
641 PyBuffer_Release(&pbuf);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000642 return PyErr_NoMemory();
Martin v. Löwis423be952008-08-13 15:53:07 +0000643 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000644
Jack Jansen72781191995-08-07 14:34:15 +0000645 /* Worst case: output is twice as big as input (fixed later) */
Martin v. Löwis423be952008-08-13 15:53:07 +0000646 if ( (rv=PyBytes_FromStringAndSize(NULL, len*2+2)) == NULL ) {
647 PyBuffer_Release(&pbuf);
Jack Jansen72781191995-08-07 14:34:15 +0000648 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000649 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000650 out_data = (unsigned char *)PyBytes_AS_STRING(rv);
Tim Peters934c1a12002-07-02 22:24:50 +0000651
Jack Jansen72781191995-08-07 14:34:15 +0000652 for( in=0; in<len; in++) {
653 ch = in_data[in];
654 if ( ch == RUNCHAR ) {
655 /* RUNCHAR. Escape it. */
656 *out_data++ = RUNCHAR;
657 *out_data++ = 0;
658 } else {
659 /* Check how many following are the same */
660 for(inend=in+1;
661 inend<len && in_data[inend] == ch &&
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000662 inend < in+255;
Jack Jansen72781191995-08-07 14:34:15 +0000663 inend++) ;
Jack Jansen0223aa11995-08-31 13:44:23 +0000664 if ( inend - in > 3 ) {
665 /* More than 3 in a row. Output RLE. */
Jack Jansen72781191995-08-07 14:34:15 +0000666 *out_data++ = ch;
667 *out_data++ = RUNCHAR;
668 *out_data++ = inend-in;
669 in = inend-1;
670 } else {
671 /* Less than 3. Output the byte itself */
672 *out_data++ = ch;
673 }
674 }
675 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000676 if (_PyBytes_Resize(&rv,
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000677 (out_data -
Christian Heimes72b710a2008-05-26 13:28:38 +0000678 (unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000679 Py_DECREF(rv);
680 rv = NULL;
681 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000682 PyBuffer_Release(&pbuf);
Jack Jansen72781191995-08-07 14:34:15 +0000683 return rv;
684}
685
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000686PyDoc_STRVAR(doc_b2a_hqx, "Encode .hqx data");
Tim Peters934c1a12002-07-02 22:24:50 +0000687
Jack Jansen72781191995-08-07 14:34:15 +0000688static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000689binascii_b2a_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000690{
Martin v. Löwis423be952008-08-13 15:53:07 +0000691 Py_buffer pbin;
Jack Jansen72781191995-08-07 14:34:15 +0000692 unsigned char *ascii_data, *bin_data;
693 int leftbits = 0;
694 unsigned char this_ch;
Jack Janseneaeb1c81995-08-14 12:17:57 +0000695 unsigned int leftchar = 0;
Jack Jansen72781191995-08-07 14:34:15 +0000696 PyObject *rv;
Thomas Woutersf98db652006-03-01 21:37:32 +0000697 Py_ssize_t len;
Tim Peters934c1a12002-07-02 22:24:50 +0000698
Martin v. Löwis15b16a32008-12-02 06:00:15 +0000699 if ( !PyArg_ParseTuple(args, "y*:b2a_hqx", &pbin) )
Jack Jansen72781191995-08-07 14:34:15 +0000700 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000701 bin_data = pbin.buf;
702 len = pbin.len;
Jack Jansen72781191995-08-07 14:34:15 +0000703
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000704 assert(len >= 0);
705
Martin v. Löwis423be952008-08-13 15:53:07 +0000706 if (len > PY_SSIZE_T_MAX / 2 - 2) {
707 PyBuffer_Release(&pbin);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000708 return PyErr_NoMemory();
Martin v. Löwis423be952008-08-13 15:53:07 +0000709 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000710
Jack Jansen72781191995-08-07 14:34:15 +0000711 /* Allocate a buffer that is at least large enough */
Martin v. Löwis423be952008-08-13 15:53:07 +0000712 if ( (rv=PyBytes_FromStringAndSize(NULL, len*2+2)) == NULL ) {
713 PyBuffer_Release(&pbin);
Jack Jansen72781191995-08-07 14:34:15 +0000714 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000715 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000716 ascii_data = (unsigned char *)PyBytes_AS_STRING(rv);
Tim Peters934c1a12002-07-02 22:24:50 +0000717
Jack Jansen72781191995-08-07 14:34:15 +0000718 for( ; len > 0 ; len--, bin_data++ ) {
719 /* Shift into our buffer, and output any 6bits ready */
720 leftchar = (leftchar << 8) | *bin_data;
721 leftbits += 8;
722 while ( leftbits >= 6 ) {
723 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
724 leftbits -= 6;
725 *ascii_data++ = table_b2a_hqx[this_ch];
726 }
727 }
728 /* Output a possible runt byte */
729 if ( leftbits ) {
730 leftchar <<= (6-leftbits);
731 *ascii_data++ = table_b2a_hqx[leftchar & 0x3f];
732 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000733 if (_PyBytes_Resize(&rv,
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000734 (ascii_data -
Christian Heimes72b710a2008-05-26 13:28:38 +0000735 (unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000736 Py_DECREF(rv);
737 rv = NULL;
738 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000739 PyBuffer_Release(&pbin);
Jack Jansen72781191995-08-07 14:34:15 +0000740 return rv;
741}
742
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000743PyDoc_STRVAR(doc_rledecode_hqx, "Decode hexbin RLE-coded string");
Tim Peters934c1a12002-07-02 22:24:50 +0000744
Jack Jansen72781191995-08-07 14:34:15 +0000745static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000746binascii_rledecode_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000747{
Martin v. Löwis423be952008-08-13 15:53:07 +0000748 Py_buffer pin;
Jack Jansen72781191995-08-07 14:34:15 +0000749 unsigned char *in_data, *out_data;
750 unsigned char in_byte, in_repeat;
751 PyObject *rv;
Thomas Woutersf98db652006-03-01 21:37:32 +0000752 Py_ssize_t in_len, out_len, out_len_left;
Jack Jansen72781191995-08-07 14:34:15 +0000753
Martin v. Löwis423be952008-08-13 15:53:07 +0000754 if ( !PyArg_ParseTuple(args, "s*:rledecode_hqx", &pin) )
Jack Jansen72781191995-08-07 14:34:15 +0000755 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000756 in_data = pin.buf;
757 in_len = pin.len;
Jack Jansen72781191995-08-07 14:34:15 +0000758
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000759 assert(in_len >= 0);
760
Jack Jansen72781191995-08-07 14:34:15 +0000761 /* Empty string is a special case */
Martin v. Löwis423be952008-08-13 15:53:07 +0000762 if ( in_len == 0 ) {
763 PyBuffer_Release(&pin);
Christian Heimes72b710a2008-05-26 13:28:38 +0000764 return PyBytes_FromStringAndSize("", 0);
Martin v. Löwis423be952008-08-13 15:53:07 +0000765 }
766 else if (in_len > PY_SSIZE_T_MAX / 2) {
767 PyBuffer_Release(&pin);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000768 return PyErr_NoMemory();
Martin v. Löwis423be952008-08-13 15:53:07 +0000769 }
Jack Jansen72781191995-08-07 14:34:15 +0000770
771 /* Allocate a buffer of reasonable size. Resized when needed */
772 out_len = in_len*2;
Martin v. Löwis423be952008-08-13 15:53:07 +0000773 if ( (rv=PyBytes_FromStringAndSize(NULL, out_len)) == NULL ) {
774 PyBuffer_Release(&pin);
Jack Jansen72781191995-08-07 14:34:15 +0000775 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000776 }
Jack Jansen72781191995-08-07 14:34:15 +0000777 out_len_left = out_len;
Christian Heimes72b710a2008-05-26 13:28:38 +0000778 out_data = (unsigned char *)PyBytes_AS_STRING(rv);
Jack Jansen72781191995-08-07 14:34:15 +0000779
780 /*
781 ** We need two macros here to get/put bytes and handle
782 ** end-of-buffer for input and output strings.
783 */
784#define INBYTE(b) \
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000785 do { \
786 if ( --in_len < 0 ) { \
787 PyErr_SetString(Incomplete, ""); \
788 Py_DECREF(rv); \
Martin v. Löwis423be952008-08-13 15:53:07 +0000789 PyBuffer_Release(&pin); \
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000790 return NULL; \
791 } \
792 b = *in_data++; \
793 } while(0)
Tim Peters934c1a12002-07-02 22:24:50 +0000794
Jack Jansen72781191995-08-07 14:34:15 +0000795#define OUTBYTE(b) \
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000796 do { \
797 if ( --out_len_left < 0 ) { \
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000798 if ( out_len > PY_SSIZE_T_MAX / 2) return PyErr_NoMemory(); \
Christian Heimes72b710a2008-05-26 13:28:38 +0000799 if (_PyBytes_Resize(&rv, 2*out_len) < 0) \
Martin v. Löwis423be952008-08-13 15:53:07 +0000800 { Py_DECREF(rv); PyBuffer_Release(&pin); return NULL; } \
Christian Heimes72b710a2008-05-26 13:28:38 +0000801 out_data = (unsigned char *)PyBytes_AS_STRING(rv) \
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000802 + out_len; \
803 out_len_left = out_len-1; \
804 out_len = out_len * 2; \
805 } \
806 *out_data++ = b; \
807 } while(0)
Jack Jansen72781191995-08-07 14:34:15 +0000808
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000809 /*
810 ** Handle first byte separately (since we have to get angry
811 ** in case of an orphaned RLE code).
812 */
813 INBYTE(in_byte);
Jack Jansen72781191995-08-07 14:34:15 +0000814
815 if (in_byte == RUNCHAR) {
816 INBYTE(in_repeat);
817 if (in_repeat != 0) {
818 /* Note Error, not Incomplete (which is at the end
819 ** of the string only). This is a programmer error.
820 */
821 PyErr_SetString(Error, "Orphaned RLE code at start");
Benjamin Peterson9edd2bd2008-08-27 00:31:37 +0000822 PyBuffer_Release(&pin);
Jack Jansen72781191995-08-07 14:34:15 +0000823 Py_DECREF(rv);
824 return NULL;
825 }
826 OUTBYTE(RUNCHAR);
827 } else {
828 OUTBYTE(in_byte);
829 }
Tim Peters934c1a12002-07-02 22:24:50 +0000830
Jack Jansen72781191995-08-07 14:34:15 +0000831 while( in_len > 0 ) {
832 INBYTE(in_byte);
833
834 if (in_byte == RUNCHAR) {
835 INBYTE(in_repeat);
836 if ( in_repeat == 0 ) {
837 /* Just an escaped RUNCHAR value */
838 OUTBYTE(RUNCHAR);
839 } else {
840 /* Pick up value and output a sequence of it */
841 in_byte = out_data[-1];
842 while ( --in_repeat > 0 )
843 OUTBYTE(in_byte);
844 }
845 } else {
846 /* Normal byte */
847 OUTBYTE(in_byte);
848 }
849 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000850 if (_PyBytes_Resize(&rv,
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000851 (out_data -
Christian Heimes72b710a2008-05-26 13:28:38 +0000852 (unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000853 Py_DECREF(rv);
854 rv = NULL;
855 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000856 PyBuffer_Release(&pin);
Jack Jansen72781191995-08-07 14:34:15 +0000857 return rv;
858}
859
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000860PyDoc_STRVAR(doc_crc_hqx,
861"(data, oldcrc) -> newcrc. Compute hqx CRC incrementally");
Jack Jansen72781191995-08-07 14:34:15 +0000862
863static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000864binascii_crc_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000865{
Martin v. Löwis423be952008-08-13 15:53:07 +0000866 Py_buffer pin;
Jack Jansen72781191995-08-07 14:34:15 +0000867 unsigned char *bin_data;
868 unsigned int crc;
Thomas Woutersf98db652006-03-01 21:37:32 +0000869 Py_ssize_t len;
Tim Peters934c1a12002-07-02 22:24:50 +0000870
Martin v. Löwis15b16a32008-12-02 06:00:15 +0000871 if ( !PyArg_ParseTuple(args, "y*i:crc_hqx", &pin, &crc) )
Jack Jansen72781191995-08-07 14:34:15 +0000872 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000873 bin_data = pin.buf;
874 len = pin.len;
Jack Jansen72781191995-08-07 14:34:15 +0000875
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000876 while(len-- > 0) {
Jack Jansen72781191995-08-07 14:34:15 +0000877 crc=((crc<<8)&0xff00)^crctab_hqx[((crc>>8)&0xff)^*bin_data++];
878 }
879
Martin v. Löwis423be952008-08-13 15:53:07 +0000880 PyBuffer_Release(&pin);
Jack Jansen72781191995-08-07 14:34:15 +0000881 return Py_BuildValue("i", crc);
882}
883
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000884PyDoc_STRVAR(doc_crc32,
885"(data, oldcrc = 0) -> newcrc. Compute CRC-32 incrementally");
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000886
Christian Heimes1dc54002008-03-24 02:19:29 +0000887#ifdef USE_ZLIB_CRC32
888/* This was taken from zlibmodule.c PyZlib_crc32 (but is PY_SSIZE_T_CLEAN) */
889static PyObject *
890binascii_crc32(PyObject *self, PyObject *args)
891{
Christian Heimescc47b052008-03-25 14:56:36 +0000892 unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */
Martin v. Löwis423be952008-08-13 15:53:07 +0000893 Py_buffer pbuf;
Christian Heimes1dc54002008-03-24 02:19:29 +0000894 Byte *buf;
Neal Norwitz4027bf82008-03-24 04:59:05 +0000895 Py_ssize_t len;
Christian Heimescc47b052008-03-25 14:56:36 +0000896 int signed_val;
897
Martin v. Löwis15b16a32008-12-02 06:00:15 +0000898 if (!PyArg_ParseTuple(args, "y*|I:crc32", &pbuf, &crc32val))
Christian Heimes1dc54002008-03-24 02:19:29 +0000899 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000900 buf = (Byte*)pbuf.buf;
901 len = pbuf.len;
Christian Heimescc47b052008-03-25 14:56:36 +0000902 signed_val = crc32(crc32val, buf, len);
Martin v. Löwis423be952008-08-13 15:53:07 +0000903 PyBuffer_Release(&pbuf);
Christian Heimescc47b052008-03-25 14:56:36 +0000904 return PyLong_FromUnsignedLong(signed_val & 0xffffffffU);
Christian Heimes1dc54002008-03-24 02:19:29 +0000905}
906#else /* USE_ZLIB_CRC32 */
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000907/* Crc - 32 BIT ANSI X3.66 CRC checksum files
908 Also known as: ISO 3307
909**********************************************************************|
910* *|
911* Demonstration program to compute the 32-bit CRC used as the frame *|
912* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *|
913* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *|
914* protocol). The 32-bit FCS was added via the Federal Register, *|
915* 1 June 1982, p.23798. I presume but don't know for certain that *|
916* this polynomial is or will be included in CCITT V.41, which *|
917* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *|
918* PUB 78 says that the 32-bit FCS reduces otherwise undetected *|
919* errors by a factor of 10^-5 over 16-bit FCS. *|
920* *|
921**********************************************************************|
922
923 Copyright (C) 1986 Gary S. Brown. You may use this program, or
924 code or tables extracted from it, as desired without restriction.
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000925
Tim Peters934c1a12002-07-02 22:24:50 +0000926 First, the polynomial itself and its table of feedback terms. The
927 polynomial is
928 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
929 Note that we take it "backwards" and put the highest-order term in
930 the lowest-order bit. The X^32 term is "implied"; the LSB is the
931 X^31 term, etc. The X^0 term (usually shown as "+1") results in
932 the MSB being 1.
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000933
Tim Peters934c1a12002-07-02 22:24:50 +0000934 Note that the usual hardware shift register implementation, which
935 is what we're using (we're merely optimizing it by doing eight-bit
936 chunks at a time) shifts bits into the lowest-order term. In our
937 implementation, that means shifting towards the right. Why do we
938 do it this way? Because the calculated CRC must be transmitted in
939 order from highest-order term to lowest-order term. UARTs transmit
940 characters in order from LSB to MSB. By storing the CRC this way,
941 we hand it to the UART in the order low-byte to high-byte; the UART
942 sends each low-bit to hight-bit; and the result is transmission bit
943 by bit from highest- to lowest-order term without requiring any bit
944 shuffling on our part. Reception works similarly.
945
946 The feedback terms table consists of 256, 32-bit entries. Notes:
947
948 1. The table can be generated at runtime if desired; code to do so
949 is shown later. It might not be obvious, but the feedback
950 terms simply represent the results of eight shift/xor opera-
951 tions for all combinations of data and CRC register values.
952
953 2. The CRC accumulation logic is the same for all CRC polynomials,
954 be they sixteen or thirty-two bits wide. You simply choose the
955 appropriate table. Alternatively, because the table can be
956 generated at runtime, you can start by generating the table for
957 the polynomial in question and use exactly the same "updcrc",
958 if your application needn't simultaneously handle two CRC
959 polynomials. (Note, however, that XMODEM is strange.)
960
961 3. For 16-bit CRCs, the table entries need be only 16 bits wide;
962 of course, 32-bit entries work OK if the high 16 bits are zero.
963
964 4. The values must be right-shifted by eight bits by the "updcrc"
965 logic; the shift must be unsigned (bring in zeroes). On some
966 hardware you could probably optimize the shift in assembler by
967 using byte-swap instructions.
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000968********************************************************************/
969
Gregory P. Smith3c0e4d22008-03-25 07:51:12 +0000970static unsigned int crc_32_tab[256] = {
9710x00000000U, 0x77073096U, 0xee0e612cU, 0x990951baU, 0x076dc419U,
9720x706af48fU, 0xe963a535U, 0x9e6495a3U, 0x0edb8832U, 0x79dcb8a4U,
9730xe0d5e91eU, 0x97d2d988U, 0x09b64c2bU, 0x7eb17cbdU, 0xe7b82d07U,
9740x90bf1d91U, 0x1db71064U, 0x6ab020f2U, 0xf3b97148U, 0x84be41deU,
9750x1adad47dU, 0x6ddde4ebU, 0xf4d4b551U, 0x83d385c7U, 0x136c9856U,
9760x646ba8c0U, 0xfd62f97aU, 0x8a65c9ecU, 0x14015c4fU, 0x63066cd9U,
9770xfa0f3d63U, 0x8d080df5U, 0x3b6e20c8U, 0x4c69105eU, 0xd56041e4U,
9780xa2677172U, 0x3c03e4d1U, 0x4b04d447U, 0xd20d85fdU, 0xa50ab56bU,
9790x35b5a8faU, 0x42b2986cU, 0xdbbbc9d6U, 0xacbcf940U, 0x32d86ce3U,
9800x45df5c75U, 0xdcd60dcfU, 0xabd13d59U, 0x26d930acU, 0x51de003aU,
9810xc8d75180U, 0xbfd06116U, 0x21b4f4b5U, 0x56b3c423U, 0xcfba9599U,
9820xb8bda50fU, 0x2802b89eU, 0x5f058808U, 0xc60cd9b2U, 0xb10be924U,
9830x2f6f7c87U, 0x58684c11U, 0xc1611dabU, 0xb6662d3dU, 0x76dc4190U,
9840x01db7106U, 0x98d220bcU, 0xefd5102aU, 0x71b18589U, 0x06b6b51fU,
9850x9fbfe4a5U, 0xe8b8d433U, 0x7807c9a2U, 0x0f00f934U, 0x9609a88eU,
9860xe10e9818U, 0x7f6a0dbbU, 0x086d3d2dU, 0x91646c97U, 0xe6635c01U,
9870x6b6b51f4U, 0x1c6c6162U, 0x856530d8U, 0xf262004eU, 0x6c0695edU,
9880x1b01a57bU, 0x8208f4c1U, 0xf50fc457U, 0x65b0d9c6U, 0x12b7e950U,
9890x8bbeb8eaU, 0xfcb9887cU, 0x62dd1ddfU, 0x15da2d49U, 0x8cd37cf3U,
9900xfbd44c65U, 0x4db26158U, 0x3ab551ceU, 0xa3bc0074U, 0xd4bb30e2U,
9910x4adfa541U, 0x3dd895d7U, 0xa4d1c46dU, 0xd3d6f4fbU, 0x4369e96aU,
9920x346ed9fcU, 0xad678846U, 0xda60b8d0U, 0x44042d73U, 0x33031de5U,
9930xaa0a4c5fU, 0xdd0d7cc9U, 0x5005713cU, 0x270241aaU, 0xbe0b1010U,
9940xc90c2086U, 0x5768b525U, 0x206f85b3U, 0xb966d409U, 0xce61e49fU,
9950x5edef90eU, 0x29d9c998U, 0xb0d09822U, 0xc7d7a8b4U, 0x59b33d17U,
9960x2eb40d81U, 0xb7bd5c3bU, 0xc0ba6cadU, 0xedb88320U, 0x9abfb3b6U,
9970x03b6e20cU, 0x74b1d29aU, 0xead54739U, 0x9dd277afU, 0x04db2615U,
9980x73dc1683U, 0xe3630b12U, 0x94643b84U, 0x0d6d6a3eU, 0x7a6a5aa8U,
9990xe40ecf0bU, 0x9309ff9dU, 0x0a00ae27U, 0x7d079eb1U, 0xf00f9344U,
10000x8708a3d2U, 0x1e01f268U, 0x6906c2feU, 0xf762575dU, 0x806567cbU,
10010x196c3671U, 0x6e6b06e7U, 0xfed41b76U, 0x89d32be0U, 0x10da7a5aU,
10020x67dd4accU, 0xf9b9df6fU, 0x8ebeeff9U, 0x17b7be43U, 0x60b08ed5U,
10030xd6d6a3e8U, 0xa1d1937eU, 0x38d8c2c4U, 0x4fdff252U, 0xd1bb67f1U,
10040xa6bc5767U, 0x3fb506ddU, 0x48b2364bU, 0xd80d2bdaU, 0xaf0a1b4cU,
10050x36034af6U, 0x41047a60U, 0xdf60efc3U, 0xa867df55U, 0x316e8eefU,
10060x4669be79U, 0xcb61b38cU, 0xbc66831aU, 0x256fd2a0U, 0x5268e236U,
10070xcc0c7795U, 0xbb0b4703U, 0x220216b9U, 0x5505262fU, 0xc5ba3bbeU,
10080xb2bd0b28U, 0x2bb45a92U, 0x5cb36a04U, 0xc2d7ffa7U, 0xb5d0cf31U,
10090x2cd99e8bU, 0x5bdeae1dU, 0x9b64c2b0U, 0xec63f226U, 0x756aa39cU,
10100x026d930aU, 0x9c0906a9U, 0xeb0e363fU, 0x72076785U, 0x05005713U,
10110x95bf4a82U, 0xe2b87a14U, 0x7bb12baeU, 0x0cb61b38U, 0x92d28e9bU,
10120xe5d5be0dU, 0x7cdcefb7U, 0x0bdbdf21U, 0x86d3d2d4U, 0xf1d4e242U,
10130x68ddb3f8U, 0x1fda836eU, 0x81be16cdU, 0xf6b9265bU, 0x6fb077e1U,
10140x18b74777U, 0x88085ae6U, 0xff0f6a70U, 0x66063bcaU, 0x11010b5cU,
10150x8f659effU, 0xf862ae69U, 0x616bffd3U, 0x166ccf45U, 0xa00ae278U,
10160xd70dd2eeU, 0x4e048354U, 0x3903b3c2U, 0xa7672661U, 0xd06016f7U,
10170x4969474dU, 0x3e6e77dbU, 0xaed16a4aU, 0xd9d65adcU, 0x40df0b66U,
10180x37d83bf0U, 0xa9bcae53U, 0xdebb9ec5U, 0x47b2cf7fU, 0x30b5ffe9U,
10190xbdbdf21cU, 0xcabac28aU, 0x53b39330U, 0x24b4a3a6U, 0xbad03605U,
10200xcdd70693U, 0x54de5729U, 0x23d967bfU, 0xb3667a2eU, 0xc4614ab8U,
10210x5d681b02U, 0x2a6f2b94U, 0xb40bbe37U, 0xc30c8ea1U, 0x5a05df1bU,
10220x2d02ef8dU
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001023};
1024
1025static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +00001026binascii_crc32(PyObject *self, PyObject *args)
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001027{ /* By Jim Ahlstrom; All rights transferred to CNRI */
Martin v. Löwis423be952008-08-13 15:53:07 +00001028 Py_buffer pbin;
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001029 unsigned char *bin_data;
Gregory P. Smith27275032008-03-20 06:20:09 +00001030 unsigned int crc = 0; /* initial value of CRC */
Thomas Woutersf98db652006-03-01 21:37:32 +00001031 Py_ssize_t len;
Gregory P. Smith27275032008-03-20 06:20:09 +00001032 unsigned int result;
Tim Peters934c1a12002-07-02 22:24:50 +00001033
Amaury Forgeot d'Arcbc9d4742008-12-05 01:40:43 +00001034 if ( !PyArg_ParseTuple(args, "y*|I:crc32", &pbin, &crc) )
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001035 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +00001036 bin_data = pbin.buf;
1037 len = pbin.len;
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001038
Tim Peters934c1a12002-07-02 22:24:50 +00001039 crc = ~ crc;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001040 while (len-- > 0) {
Gregory P. Smith27275032008-03-20 06:20:09 +00001041 crc = crc_32_tab[(crc ^ *bin_data++) & 0xff] ^ (crc >> 8);
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001042 /* Note: (crc >> 8) MUST zero fill on left */
Gregory P. Smith27275032008-03-20 06:20:09 +00001043 }
Tim Petersa98011c2002-07-02 20:20:08 +00001044
Gregory P. Smith27275032008-03-20 06:20:09 +00001045 result = (crc ^ 0xFFFFFFFF);
Antoine Pitrou34ed9f72008-08-15 14:51:48 +00001046 PyBuffer_Release(&pbin);
Gregory P. Smith27275032008-03-20 06:20:09 +00001047 return PyLong_FromUnsignedLong(result & 0xffffffff);
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001048}
Christian Heimes1dc54002008-03-24 02:19:29 +00001049#endif /* USE_ZLIB_CRC32 */
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001050
Barry Warsawe977c212000-08-15 06:07:13 +00001051
1052static PyObject *
1053binascii_hexlify(PyObject *self, PyObject *args)
1054{
Martin v. Löwis423be952008-08-13 15:53:07 +00001055 Py_buffer parg;
Barry Warsawe977c212000-08-15 06:07:13 +00001056 char* argbuf;
Thomas Woutersf98db652006-03-01 21:37:32 +00001057 Py_ssize_t arglen;
Barry Warsawe977c212000-08-15 06:07:13 +00001058 PyObject *retval;
1059 char* retbuf;
Thomas Woutersf98db652006-03-01 21:37:32 +00001060 Py_ssize_t i, j;
Barry Warsawe977c212000-08-15 06:07:13 +00001061
Martin v. Löwis15b16a32008-12-02 06:00:15 +00001062 if (!PyArg_ParseTuple(args, "y*:b2a_hex", &parg))
Barry Warsawe977c212000-08-15 06:07:13 +00001063 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +00001064 argbuf = parg.buf;
1065 arglen = parg.len;
Barry Warsawe977c212000-08-15 06:07:13 +00001066
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001067 assert(arglen >= 0);
Martin v. Löwis423be952008-08-13 15:53:07 +00001068 if (arglen > PY_SSIZE_T_MAX / 2) {
1069 PyBuffer_Release(&parg);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001070 return PyErr_NoMemory();
Martin v. Löwis423be952008-08-13 15:53:07 +00001071 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001072
Christian Heimes72b710a2008-05-26 13:28:38 +00001073 retval = PyBytes_FromStringAndSize(NULL, arglen*2);
Martin v. Löwis423be952008-08-13 15:53:07 +00001074 if (!retval) {
1075 PyBuffer_Release(&parg);
Barry Warsawe977c212000-08-15 06:07:13 +00001076 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +00001077 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001078 retbuf = PyBytes_AS_STRING(retval);
Barry Warsawe977c212000-08-15 06:07:13 +00001079
1080 /* make hex version of string, taken from shamodule.c */
1081 for (i=j=0; i < arglen; i++) {
1082 char c;
1083 c = (argbuf[i] >> 4) & 0xf;
1084 c = (c>9) ? c+'a'-10 : c + '0';
1085 retbuf[j++] = c;
1086 c = argbuf[i] & 0xf;
1087 c = (c>9) ? c+'a'-10 : c + '0';
1088 retbuf[j++] = c;
1089 }
Martin v. Löwis423be952008-08-13 15:53:07 +00001090 PyBuffer_Release(&parg);
Barry Warsawe977c212000-08-15 06:07:13 +00001091 return retval;
Barry Warsawe977c212000-08-15 06:07:13 +00001092}
1093
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001094PyDoc_STRVAR(doc_hexlify,
Barry Warsawe977c212000-08-15 06:07:13 +00001095"b2a_hex(data) -> s; Hexadecimal representation of binary data.\n\
1096\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001097This function is also available as \"hexlify()\".");
Barry Warsawe977c212000-08-15 06:07:13 +00001098
1099
1100static int
Tim Peters934c1a12002-07-02 22:24:50 +00001101to_int(int c)
Barry Warsawe977c212000-08-15 06:07:13 +00001102{
1103 if (isdigit(c))
1104 return c - '0';
1105 else {
1106 if (isupper(c))
1107 c = tolower(c);
1108 if (c >= 'a' && c <= 'f')
1109 return c - 'a' + 10;
1110 }
1111 return -1;
1112}
1113
1114
1115static PyObject *
1116binascii_unhexlify(PyObject *self, PyObject *args)
1117{
Martin v. Löwis423be952008-08-13 15:53:07 +00001118 Py_buffer parg;
Barry Warsawe977c212000-08-15 06:07:13 +00001119 char* argbuf;
Thomas Woutersf98db652006-03-01 21:37:32 +00001120 Py_ssize_t arglen;
Barry Warsawe977c212000-08-15 06:07:13 +00001121 PyObject *retval;
1122 char* retbuf;
Thomas Woutersf98db652006-03-01 21:37:32 +00001123 Py_ssize_t i, j;
Barry Warsawe977c212000-08-15 06:07:13 +00001124
Martin v. Löwis423be952008-08-13 15:53:07 +00001125 if (!PyArg_ParseTuple(args, "s*:a2b_hex", &parg))
Barry Warsawe977c212000-08-15 06:07:13 +00001126 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +00001127 argbuf = parg.buf;
1128 arglen = parg.len;
Barry Warsawe977c212000-08-15 06:07:13 +00001129
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001130 assert(arglen >= 0);
1131
Barry Warsaw16168472000-08-15 06:59:58 +00001132 /* XXX What should we do about strings with an odd length? Should
1133 * we add an implicit leading zero, or a trailing zero? For now,
1134 * raise an exception.
Barry Warsawe977c212000-08-15 06:07:13 +00001135 */
1136 if (arglen % 2) {
Martin v. Löwis423be952008-08-13 15:53:07 +00001137 PyBuffer_Release(&parg);
Guido van Rossum4581ae52007-05-22 21:56:47 +00001138 PyErr_SetString(Error, "Odd-length string");
Barry Warsawe977c212000-08-15 06:07:13 +00001139 return NULL;
1140 }
1141
Christian Heimes72b710a2008-05-26 13:28:38 +00001142 retval = PyBytes_FromStringAndSize(NULL, (arglen/2));
Martin v. Löwis423be952008-08-13 15:53:07 +00001143 if (!retval) {
1144 PyBuffer_Release(&parg);
Barry Warsawe977c212000-08-15 06:07:13 +00001145 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +00001146 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001147 retbuf = PyBytes_AS_STRING(retval);
Barry Warsawe977c212000-08-15 06:07:13 +00001148
1149 for (i=j=0; i < arglen; i += 2) {
1150 int top = to_int(Py_CHARMASK(argbuf[i]));
1151 int bot = to_int(Py_CHARMASK(argbuf[i+1]));
1152 if (top == -1 || bot == -1) {
Guido van Rossum4581ae52007-05-22 21:56:47 +00001153 PyErr_SetString(Error,
Barry Warsaw16168472000-08-15 06:59:58 +00001154 "Non-hexadecimal digit found");
Barry Warsawe977c212000-08-15 06:07:13 +00001155 goto finally;
1156 }
1157 retbuf[j++] = (top << 4) + bot;
1158 }
Martin v. Löwis423be952008-08-13 15:53:07 +00001159 PyBuffer_Release(&parg);
Barry Warsawe977c212000-08-15 06:07:13 +00001160 return retval;
1161
1162 finally:
Martin v. Löwis423be952008-08-13 15:53:07 +00001163 PyBuffer_Release(&parg);
Barry Warsawe977c212000-08-15 06:07:13 +00001164 Py_DECREF(retval);
1165 return NULL;
1166}
1167
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001168PyDoc_STRVAR(doc_unhexlify,
Barry Warsawe977c212000-08-15 06:07:13 +00001169"a2b_hex(hexstr) -> s; Binary data of hexadecimal representation.\n\
1170\n\
1171hexstr must contain an even number of hex digits (upper or lower case).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001172This function is also available as \"unhexlify()\"");
Barry Warsawe977c212000-08-15 06:07:13 +00001173
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001174static int table_hex[128] = {
1175 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1176 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1177 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1178 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1, -1,-1,-1,-1,
1179 -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1180 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1181 -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1182 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1
1183};
1184
1185#define hexval(c) table_hex[(unsigned int)(c)]
1186
1187#define MAXLINESIZE 76
1188
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001189PyDoc_STRVAR(doc_a2b_qp, "Decode a string of qp-encoded data");
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001190
Tim Peters934c1a12002-07-02 22:24:50 +00001191static PyObject*
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001192binascii_a2b_qp(PyObject *self, PyObject *args, PyObject *kwargs)
1193{
Thomas Wouters7087f782006-03-01 23:10:05 +00001194 Py_ssize_t in, out;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001195 char ch;
Martin v. Löwis423be952008-08-13 15:53:07 +00001196 Py_buffer pdata;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001197 unsigned char *data, *odata;
Thomas Woutersf98db652006-03-01 21:37:32 +00001198 Py_ssize_t datalen = 0;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001199 PyObject *rv;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001200 static char *kwlist[] = {"data", "header", NULL};
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001201 int header = 0;
1202
Martin v. Löwis423be952008-08-13 15:53:07 +00001203 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*|i", kwlist, &pdata,
1204 &header))
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001205 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +00001206 data = pdata.buf;
1207 datalen = pdata.len;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001208
Barry Warsaw23164a52004-05-11 02:05:11 +00001209 /* We allocate the output same size as input, this is overkill.
1210 * The previous implementation used calloc() so we'll zero out the
1211 * memory here too, since PyMem_Malloc() does not guarantee that.
1212 */
1213 odata = (unsigned char *) PyMem_Malloc(datalen);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001214 if (odata == NULL) {
Martin v. Löwis423be952008-08-13 15:53:07 +00001215 PyBuffer_Release(&pdata);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001216 PyErr_NoMemory();
1217 return NULL;
1218 }
Martin v. Löwisb600fe92004-07-27 15:03:53 +00001219 memset(odata, 0, datalen);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001220
1221 in = out = 0;
1222 while (in < datalen) {
1223 if (data[in] == '=') {
1224 in++;
1225 if (in >= datalen) break;
1226 /* Soft line breaks */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001227 if ((data[in] == '\n') || (data[in] == '\r')) {
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001228 if (data[in] != '\n') {
1229 while (in < datalen && data[in] != '\n') in++;
1230 }
1231 if (in < datalen) in++;
1232 }
1233 else if (data[in] == '=') {
1234 /* broken case from broken python qp */
1235 odata[out++] = '=';
1236 in++;
1237 }
Tim Peters934c1a12002-07-02 22:24:50 +00001238 else if (((data[in] >= 'A' && data[in] <= 'F') ||
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001239 (data[in] >= 'a' && data[in] <= 'f') ||
1240 (data[in] >= '0' && data[in] <= '9')) &&
1241 ((data[in+1] >= 'A' && data[in+1] <= 'F') ||
1242 (data[in+1] >= 'a' && data[in+1] <= 'f') ||
1243 (data[in+1] >= '0' && data[in+1] <= '9'))) {
1244 /* hexval */
1245 ch = hexval(data[in]) << 4;
1246 in++;
1247 ch |= hexval(data[in]);
1248 in++;
1249 odata[out++] = ch;
1250 }
1251 else {
1252 odata[out++] = '=';
1253 }
1254 }
1255 else if (header && data[in] == '_') {
1256 odata[out++] = ' ';
1257 in++;
1258 }
1259 else {
1260 odata[out] = data[in];
1261 in++;
1262 out++;
1263 }
1264 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001265 if ((rv = PyBytes_FromStringAndSize((char *)odata, out)) == NULL) {
Martin v. Löwis423be952008-08-13 15:53:07 +00001266 PyBuffer_Release(&pdata);
Barry Warsaw23164a52004-05-11 02:05:11 +00001267 PyMem_Free(odata);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001268 return NULL;
1269 }
Martin v. Löwis423be952008-08-13 15:53:07 +00001270 PyBuffer_Release(&pdata);
Barry Warsaw23164a52004-05-11 02:05:11 +00001271 PyMem_Free(odata);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001272 return rv;
1273}
1274
Tim Peters934c1a12002-07-02 22:24:50 +00001275static int
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001276to_hex (unsigned char ch, unsigned char *s)
1277{
1278 unsigned int uvalue = ch;
1279
1280 s[1] = "0123456789ABCDEF"[uvalue % 16];
1281 uvalue = (uvalue / 16);
1282 s[0] = "0123456789ABCDEF"[uvalue % 16];
1283 return 0;
1284}
1285
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001286PyDoc_STRVAR(doc_b2a_qp,
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001287"b2a_qp(data, quotetabs=0, istext=1, header=0) -> s; \n\
1288 Encode a string using quoted-printable encoding. \n\
1289\n\
1290On encoding, when istext is set, newlines are not encoded, and white \n\
1291space at end of lines is. When istext is not set, \\r and \\n (CR/LF) are \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001292both encoded. When quotetabs is set, space and tabs are encoded.");
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001293
1294/* XXX: This is ridiculously complicated to be backward compatible
1295 * (mostly) with the quopri module. It doesn't re-create the quopri
1296 * module bug where text ending in CRLF has the CR encoded */
Tim Peters934c1a12002-07-02 22:24:50 +00001297static PyObject*
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001298binascii_b2a_qp (PyObject *self, PyObject *args, PyObject *kwargs)
1299{
Thomas Wouters7087f782006-03-01 23:10:05 +00001300 Py_ssize_t in, out;
Martin v. Löwis423be952008-08-13 15:53:07 +00001301 Py_buffer pdata;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001302 unsigned char *data, *odata;
Thomas Woutersf98db652006-03-01 21:37:32 +00001303 Py_ssize_t datalen = 0, odatalen = 0;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001304 PyObject *rv;
1305 unsigned int linelen = 0;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001306 static char *kwlist[] = {"data", "quotetabs", "istext",
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001307 "header", NULL};
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001308 int istext = 1;
1309 int quotetabs = 0;
1310 int header = 0;
1311 unsigned char ch;
1312 int crlf = 0;
1313 unsigned char *p;
1314
Martin v. Löwis15b16a32008-12-02 06:00:15 +00001315 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*|iii", kwlist, &pdata,
Martin v. Löwis423be952008-08-13 15:53:07 +00001316 &quotetabs, &istext, &header))
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001317 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +00001318 data = pdata.buf;
1319 datalen = pdata.len;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001320
1321 /* See if this string is using CRLF line ends */
1322 /* XXX: this function has the side effect of converting all of
1323 * the end of lines to be the same depending on this detection
1324 * here */
Walter Dörwald0925e412007-05-09 18:23:50 +00001325 p = (unsigned char *) memchr(data, '\n', datalen);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001326 if ((p != NULL) && (p > data) && (*(p-1) == '\r'))
1327 crlf = 1;
1328
1329 /* First, scan to see how many characters need to be encoded */
1330 in = 0;
1331 while (in < datalen) {
Tim Peters934c1a12002-07-02 22:24:50 +00001332 if ((data[in] > 126) ||
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001333 (data[in] == '=') ||
1334 (header && data[in] == '_') ||
Guido van Rossumd8faa362007-04-27 19:54:29 +00001335 ((data[in] == '.') && (linelen == 0) &&
1336 (data[in+1] == '\n' || data[in+1] == '\r' || data[in+1] == 0)) ||
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001337 (!istext && ((data[in] == '\r') || (data[in] == '\n'))) ||
1338 ((data[in] == '\t' || data[in] == ' ') && (in + 1 == datalen)) ||
Tim Peters934c1a12002-07-02 22:24:50 +00001339 ((data[in] < 33) &&
1340 (data[in] != '\r') && (data[in] != '\n') &&
Guido van Rossumd8faa362007-04-27 19:54:29 +00001341 (quotetabs ||
1342 (!quotetabs && ((data[in] != '\t') && (data[in] != ' '))))))
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001343 {
1344 if ((linelen + 3) >= MAXLINESIZE) {
1345 linelen = 0;
1346 if (crlf)
1347 odatalen += 3;
1348 else
1349 odatalen += 2;
1350 }
1351 linelen += 3;
1352 odatalen += 3;
1353 in++;
1354 }
1355 else {
Tim Peters934c1a12002-07-02 22:24:50 +00001356 if (istext &&
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001357 ((data[in] == '\n') ||
1358 ((in+1 < datalen) && (data[in] == '\r') &&
1359 (data[in+1] == '\n'))))
1360 {
1361 linelen = 0;
1362 /* Protect against whitespace on end of line */
1363 if (in && ((data[in-1] == ' ') || (data[in-1] == '\t')))
1364 odatalen += 2;
1365 if (crlf)
1366 odatalen += 2;
1367 else
1368 odatalen += 1;
1369 if (data[in] == '\r')
1370 in += 2;
1371 else
1372 in++;
1373 }
1374 else {
Tim Peters934c1a12002-07-02 22:24:50 +00001375 if ((in + 1 != datalen) &&
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001376 (data[in+1] != '\n') &&
1377 (linelen + 1) >= MAXLINESIZE) {
1378 linelen = 0;
1379 if (crlf)
1380 odatalen += 3;
1381 else
1382 odatalen += 2;
1383 }
1384 linelen++;
1385 odatalen++;
1386 in++;
1387 }
1388 }
1389 }
1390
Barry Warsaw23164a52004-05-11 02:05:11 +00001391 /* We allocate the output same size as input, this is overkill.
1392 * The previous implementation used calloc() so we'll zero out the
1393 * memory here too, since PyMem_Malloc() does not guarantee that.
1394 */
1395 odata = (unsigned char *) PyMem_Malloc(odatalen);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001396 if (odata == NULL) {
Martin v. Löwis423be952008-08-13 15:53:07 +00001397 PyBuffer_Release(&pdata);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001398 PyErr_NoMemory();
1399 return NULL;
1400 }
Martin v. Löwisb600fe92004-07-27 15:03:53 +00001401 memset(odata, 0, odatalen);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001402
1403 in = out = linelen = 0;
1404 while (in < datalen) {
Tim Peters934c1a12002-07-02 22:24:50 +00001405 if ((data[in] > 126) ||
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001406 (data[in] == '=') ||
1407 (header && data[in] == '_') ||
Guido van Rossumd8faa362007-04-27 19:54:29 +00001408 ((data[in] == '.') && (linelen == 0) &&
1409 (data[in+1] == '\n' || data[in+1] == '\r' || data[in+1] == 0)) ||
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001410 (!istext && ((data[in] == '\r') || (data[in] == '\n'))) ||
1411 ((data[in] == '\t' || data[in] == ' ') && (in + 1 == datalen)) ||
Tim Peters934c1a12002-07-02 22:24:50 +00001412 ((data[in] < 33) &&
1413 (data[in] != '\r') && (data[in] != '\n') &&
Guido van Rossumd8faa362007-04-27 19:54:29 +00001414 (quotetabs ||
1415 (!quotetabs && ((data[in] != '\t') && (data[in] != ' '))))))
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001416 {
1417 if ((linelen + 3 )>= MAXLINESIZE) {
1418 odata[out++] = '=';
1419 if (crlf) odata[out++] = '\r';
1420 odata[out++] = '\n';
1421 linelen = 0;
1422 }
1423 odata[out++] = '=';
1424 to_hex(data[in], &odata[out]);
1425 out += 2;
1426 in++;
1427 linelen += 3;
1428 }
1429 else {
Tim Peters934c1a12002-07-02 22:24:50 +00001430 if (istext &&
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001431 ((data[in] == '\n') ||
1432 ((in+1 < datalen) && (data[in] == '\r') &&
1433 (data[in+1] == '\n'))))
1434 {
1435 linelen = 0;
1436 /* Protect against whitespace on end of line */
1437 if (out && ((odata[out-1] == ' ') || (odata[out-1] == '\t'))) {
1438 ch = odata[out-1];
1439 odata[out-1] = '=';
1440 to_hex(ch, &odata[out]);
1441 out += 2;
1442 }
Tim Peters934c1a12002-07-02 22:24:50 +00001443
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001444 if (crlf) odata[out++] = '\r';
1445 odata[out++] = '\n';
1446 if (data[in] == '\r')
1447 in += 2;
1448 else
1449 in++;
1450 }
1451 else {
Tim Peters934c1a12002-07-02 22:24:50 +00001452 if ((in + 1 != datalen) &&
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001453 (data[in+1] != '\n') &&
1454 (linelen + 1) >= MAXLINESIZE) {
1455 odata[out++] = '=';
1456 if (crlf) odata[out++] = '\r';
1457 odata[out++] = '\n';
1458 linelen = 0;
1459 }
1460 linelen++;
1461 if (header && data[in] == ' ') {
1462 odata[out++] = '_';
1463 in++;
1464 }
1465 else {
1466 odata[out++] = data[in++];
1467 }
1468 }
1469 }
1470 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001471 if ((rv = PyBytes_FromStringAndSize((char *)odata, out)) == NULL) {
Martin v. Löwis423be952008-08-13 15:53:07 +00001472 PyBuffer_Release(&pdata);
Barry Warsaw23164a52004-05-11 02:05:11 +00001473 PyMem_Free(odata);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001474 return NULL;
1475 }
Martin v. Löwis423be952008-08-13 15:53:07 +00001476 PyBuffer_Release(&pdata);
Barry Warsaw23164a52004-05-11 02:05:11 +00001477 PyMem_Free(odata);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001478 return rv;
1479}
Barry Warsawe977c212000-08-15 06:07:13 +00001480
Jack Jansen72781191995-08-07 14:34:15 +00001481/* List of functions defined in the module */
1482
1483static struct PyMethodDef binascii_module_methods[] = {
Barry Warsawe977c212000-08-15 06:07:13 +00001484 {"a2b_uu", binascii_a2b_uu, METH_VARARGS, doc_a2b_uu},
1485 {"b2a_uu", binascii_b2a_uu, METH_VARARGS, doc_b2a_uu},
1486 {"a2b_base64", binascii_a2b_base64, METH_VARARGS, doc_a2b_base64},
1487 {"b2a_base64", binascii_b2a_base64, METH_VARARGS, doc_b2a_base64},
1488 {"a2b_hqx", binascii_a2b_hqx, METH_VARARGS, doc_a2b_hqx},
1489 {"b2a_hqx", binascii_b2a_hqx, METH_VARARGS, doc_b2a_hqx},
1490 {"b2a_hex", binascii_hexlify, METH_VARARGS, doc_hexlify},
1491 {"a2b_hex", binascii_unhexlify, METH_VARARGS, doc_unhexlify},
1492 {"hexlify", binascii_hexlify, METH_VARARGS, doc_hexlify},
1493 {"unhexlify", binascii_unhexlify, METH_VARARGS, doc_unhexlify},
1494 {"rlecode_hqx", binascii_rlecode_hqx, METH_VARARGS, doc_rlecode_hqx},
1495 {"rledecode_hqx", binascii_rledecode_hqx, METH_VARARGS,
1496 doc_rledecode_hqx},
1497 {"crc_hqx", binascii_crc_hqx, METH_VARARGS, doc_crc_hqx},
1498 {"crc32", binascii_crc32, METH_VARARGS, doc_crc32},
Tim Peters934c1a12002-07-02 22:24:50 +00001499 {"a2b_qp", (PyCFunction)binascii_a2b_qp, METH_VARARGS | METH_KEYWORDS,
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001500 doc_a2b_qp},
Tim Peters934c1a12002-07-02 22:24:50 +00001501 {"b2a_qp", (PyCFunction)binascii_b2a_qp, METH_VARARGS | METH_KEYWORDS,
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001502 doc_b2a_qp},
Barry Warsawe977c212000-08-15 06:07:13 +00001503 {NULL, NULL} /* sentinel */
Jack Jansen72781191995-08-07 14:34:15 +00001504};
1505
1506
Martin v. Löwis1a214512008-06-11 05:26:20 +00001507/* Initialization function for the module (*must* be called PyInit_binascii) */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001508PyDoc_STRVAR(doc_binascii, "Conversion between binary data and ASCII");
Jack Jansen72781191995-08-07 14:34:15 +00001509
Martin v. Löwis1a214512008-06-11 05:26:20 +00001510
1511static struct PyModuleDef binasciimodule = {
1512 PyModuleDef_HEAD_INIT,
1513 "binascii",
1514 doc_binascii,
1515 -1,
1516 binascii_module_methods,
1517 NULL,
1518 NULL,
1519 NULL,
1520 NULL
1521};
1522
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001523PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001524PyInit_binascii(void)
Jack Jansen72781191995-08-07 14:34:15 +00001525{
Guido van Rossumfe096d22007-08-23 18:31:24 +00001526 PyObject *m, *d;
Jack Jansen72781191995-08-07 14:34:15 +00001527
1528 /* Create the module and add the functions */
Martin v. Löwis1a214512008-06-11 05:26:20 +00001529 m = PyModule_Create(&binasciimodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001530 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001531 return NULL;
Jack Jansen72781191995-08-07 14:34:15 +00001532
1533 d = PyModule_GetDict(m);
Jack Jansen72781191995-08-07 14:34:15 +00001534
Guido van Rossum4581ae52007-05-22 21:56:47 +00001535 Error = PyErr_NewException("binascii.Error", PyExc_ValueError, NULL);
Jack Jansen72781191995-08-07 14:34:15 +00001536 PyDict_SetItemString(d, "Error", Error);
Guido van Rossum7dbb48a1997-10-08 15:26:07 +00001537 Incomplete = PyErr_NewException("binascii.Incomplete", NULL, NULL);
Jack Jansen72781191995-08-07 14:34:15 +00001538 PyDict_SetItemString(d, "Incomplete", Incomplete);
Martin v. Löwis1a214512008-06-11 05:26:20 +00001539 if (PyErr_Occurred()) {
1540 Py_DECREF(m);
1541 m = NULL;
1542 }
1543 return m;
Jack Jansen72781191995-08-07 14:34:15 +00001544}