blob: d920d2387106b0928d78f3a04a7f18009ff56da4 [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:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006** 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:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020** 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.
Jack Jansen72781191995-08-07 14:34:15 +000030**
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**
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000034** 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.
Jack Jansen72781191995-08-07 14:34:15 +000040**
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"
Gregory P. Smith9c6b9162015-04-26 00:42:13 +000059#include "pystrhex.h"
Christian Heimes1dc54002008-03-24 02:19:29 +000060#ifdef USE_ZLIB_CRC32
61#include "zlib.h"
62#endif
Jack Jansen72781191995-08-07 14:34:15 +000063
64static PyObject *Error;
65static PyObject *Incomplete;
66
67/*
68** hqx lookup table, ascii->binary.
69*/
70
71#define RUNCHAR 0x90
72
73#define DONE 0x7F
74#define SKIP 0x7E
75#define FAIL 0x7D
76
77static unsigned char table_a2b_hqx[256] = {
78/* ^@ ^A ^B ^C ^D ^E ^F ^G */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079/* 0*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
Jack Jansen72781191995-08-07 14:34:15 +000080/* \b \t \n ^K ^L \r ^N ^O */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000081/* 1*/ FAIL, FAIL, SKIP, FAIL, FAIL, SKIP, FAIL, FAIL,
Jack Jansen72781191995-08-07 14:34:15 +000082/* ^P ^Q ^R ^S ^T ^U ^V ^W */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000083/* 2*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
Jack Jansen72781191995-08-07 14:34:15 +000084/* ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000085/* 3*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
Jack Jansen72781191995-08-07 14:34:15 +000086/* ! " # $ % & ' */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087/* 4*/ FAIL, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
Jack Jansen72781191995-08-07 14:34:15 +000088/* ( ) * + , - . / */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089/* 5*/ 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, FAIL, FAIL,
Jack Jansen72781191995-08-07 14:34:15 +000090/* 0 1 2 3 4 5 6 7 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091/* 6*/ 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, FAIL,
Jack Jansen72781191995-08-07 14:34:15 +000092/* 8 9 : ; < = > ? */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093/* 7*/ 0x14, 0x15, DONE, FAIL, FAIL, FAIL, FAIL, FAIL,
Jack Jansen72781191995-08-07 14:34:15 +000094/* @ A B C D E F G */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000095/* 8*/ 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
Jack Jansen72781191995-08-07 14:34:15 +000096/* H I J K L M N O */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000097/* 9*/ 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, FAIL,
Jack Jansen72781191995-08-07 14:34:15 +000098/* P Q R S T U V W */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099/*10*/ 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, FAIL,
Jack Jansen72781191995-08-07 14:34:15 +0000100/* X Y Z [ \ ] ^ _ */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101/*11*/ 0x2C, 0x2D, 0x2E, 0x2F, FAIL, FAIL, FAIL, FAIL,
Jack Jansen72781191995-08-07 14:34:15 +0000102/* ` a b c d e f g */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103/*12*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, FAIL,
Jack Jansen72781191995-08-07 14:34:15 +0000104/* h i j k l m n o */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105/*13*/ 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, FAIL, FAIL,
Jack Jansen72781191995-08-07 14:34:15 +0000106/* p q r s t u v w */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107/*14*/ 0x3D, 0x3E, 0x3F, FAIL, FAIL, FAIL, FAIL, FAIL,
Jack Jansen72781191995-08-07 14:34:15 +0000108/* x y z { | } ~ ^? */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109/*15*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
110/*16*/ 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 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
Jack Jansen72781191995-08-07 14:34:15 +0000126};
127
128static unsigned char table_b2a_hqx[] =
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000129"!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr";
Jack Jansen72781191995-08-07 14:34:15 +0000130
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000131static char table_a2b_base64[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 -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,-1, -1,-1,-1,-1,
134 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
135 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, /* Note PAD->0 */
136 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
137 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
138 -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
139 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000140};
141
142#define BASE64_PAD '='
Guido van Rossum355bc0c2001-10-30 03:00:52 +0000143
144/* Max binary chunk size; limited only by available memory */
Guido van Rossum0e225aa2007-05-22 20:24:57 +0000145#define BASE64_MAXBIN ((PY_SSIZE_T_MAX - 3) / 2)
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000146
147static unsigned char table_b2a_base64[] =
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000148"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000149
150
151
Jack Jansen72781191995-08-07 14:34:15 +0000152static unsigned short crctab_hqx[256] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000153 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
154 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
155 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
156 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
157 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
158 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
159 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
160 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
161 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
162 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
163 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
164 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
165 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
166 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
167 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
168 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
169 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
170 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
171 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
172 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
173 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
174 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
175 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
176 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
177 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
178 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
179 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
180 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
181 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
182 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
183 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
184 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
Jack Jansen72781191995-08-07 14:34:15 +0000185};
186
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200187/*[clinic input]
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200188module binascii
189[clinic start generated code]*/
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300190/*[clinic end generated code: output=da39a3ee5e6b4b0d input=de89fb46bcaf3fec]*/
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200191
192/*[python input]
193
194class ascii_buffer_converter(CConverter):
195 type = 'Py_buffer'
196 converter = 'ascii_buffer_converter'
197 impl_by_reference = True
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500198 c_default = "{NULL, NULL}"
199
200 def cleanup(self):
201 name = self.name
202 return "".join(["if (", name, ".obj)\n PyBuffer_Release(&", name, ");\n"])
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200203
204[python start generated code]*/
Larry Hastings581ee362014-01-28 05:00:08 -0800205/*[python end generated code: output=da39a3ee5e6b4b0d input=3eb7b63610da92cd]*/
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200206
Antoine Pitrou08316762011-12-20 13:58:41 +0100207static int
208ascii_buffer_converter(PyObject *arg, Py_buffer *buf)
209{
210 if (arg == NULL) {
211 PyBuffer_Release(buf);
212 return 1;
213 }
214 if (PyUnicode_Check(arg)) {
215 if (PyUnicode_READY(arg) < 0)
216 return 0;
217 if (!PyUnicode_IS_ASCII(arg)) {
218 PyErr_SetString(PyExc_ValueError,
219 "string argument should contain only ASCII characters");
220 return 0;
221 }
222 assert(PyUnicode_KIND(arg) == PyUnicode_1BYTE_KIND);
223 buf->buf = (void *) PyUnicode_1BYTE_DATA(arg);
224 buf->len = PyUnicode_GET_LENGTH(arg);
225 buf->obj = NULL;
226 return 1;
227 }
228 if (PyObject_GetBuffer(arg, buf, PyBUF_SIMPLE) != 0) {
229 PyErr_Format(PyExc_TypeError,
230 "argument should be bytes, buffer or ASCII string, "
Berker Peksag3cd30c22015-02-15 00:31:00 +0200231 "not '%.100s'", Py_TYPE(arg)->tp_name);
Antoine Pitrou08316762011-12-20 13:58:41 +0100232 return 0;
233 }
234 if (!PyBuffer_IsContiguous(buf, 'C')) {
235 PyErr_Format(PyExc_TypeError,
236 "argument should be a contiguous buffer, "
Berker Peksag3cd30c22015-02-15 00:31:00 +0200237 "not '%.100s'", Py_TYPE(arg)->tp_name);
Antoine Pitrou08316762011-12-20 13:58:41 +0100238 PyBuffer_Release(buf);
239 return 0;
240 }
241 return Py_CLEANUP_SUPPORTED;
242}
243
Larry Hastingsf256c222014-01-25 21:30:37 -0800244#include "clinic/binascii.c.h"
Antoine Pitrou08316762011-12-20 13:58:41 +0100245
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200246/*[clinic input]
247binascii.a2b_uu
248
Serhiy Storchaka12785612014-01-25 11:49:49 +0200249 data: ascii_buffer
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200250 /
251
252Decode a line of uuencoded data.
253[clinic start generated code]*/
Jack Jansen72781191995-08-07 14:34:15 +0000254
255static PyObject *
Serhiy Storchaka12785612014-01-25 11:49:49 +0200256binascii_a2b_uu_impl(PyModuleDef *module, Py_buffer *data)
Larry Hastings581ee362014-01-28 05:00:08 -0800257/*[clinic end generated code: output=5779f39b0b48459f input=7cafeaf73df63d1c]*/
Jack Jansen72781191995-08-07 14:34:15 +0000258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 unsigned char *ascii_data, *bin_data;
260 int leftbits = 0;
261 unsigned char this_ch;
262 unsigned int leftchar = 0;
263 PyObject *rv;
264 Py_ssize_t ascii_len, bin_len;
Tim Peters934c1a12002-07-02 22:24:50 +0000265
Serhiy Storchaka12785612014-01-25 11:49:49 +0200266 ascii_data = data->buf;
267 ascii_len = data->len;
Jack Jansen72781191995-08-07 14:34:15 +0000268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 assert(ascii_len >= 0);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 /* First byte: binary data length (in bytes) */
272 bin_len = (*ascii_data++ - ' ') & 077;
273 ascii_len--;
Jack Jansen72781191995-08-07 14:34:15 +0000274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 /* Allocate the buffer */
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200276 if ( (rv=PyBytes_FromStringAndSize(NULL, bin_len)) == NULL )
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278 bin_data = (unsigned char *)PyBytes_AS_STRING(rv);
Tim Peters934c1a12002-07-02 22:24:50 +0000279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 for( ; bin_len > 0 ; ascii_len--, ascii_data++ ) {
281 /* XXX is it really best to add NULs if there's no more data */
282 this_ch = (ascii_len > 0) ? *ascii_data : 0;
283 if ( this_ch == '\n' || this_ch == '\r' || ascii_len <= 0) {
284 /*
285 ** Whitespace. Assume some spaces got eaten at
286 ** end-of-line. (We check this later)
287 */
288 this_ch = 0;
289 } else {
290 /* Check the character for legality
291 ** The 64 in stead of the expected 63 is because
292 ** there are a few uuencodes out there that use
293 ** '`' as zero instead of space.
294 */
295 if ( this_ch < ' ' || this_ch > (' ' + 64)) {
296 PyErr_SetString(Error, "Illegal char");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 Py_DECREF(rv);
298 return NULL;
299 }
300 this_ch = (this_ch - ' ') & 077;
301 }
302 /*
303 ** Shift it in on the low end, and see if there's
304 ** a byte ready for output.
305 */
306 leftchar = (leftchar << 6) | (this_ch);
307 leftbits += 6;
308 if ( leftbits >= 8 ) {
309 leftbits -= 8;
310 *bin_data++ = (leftchar >> leftbits) & 0xff;
311 leftchar &= ((1 << leftbits) - 1);
312 bin_len--;
313 }
314 }
315 /*
316 ** Finally, check that if there's anything left on the line
317 ** that it's whitespace only.
318 */
319 while( ascii_len-- > 0 ) {
320 this_ch = *ascii_data++;
321 /* Extra '`' may be written as padding in some cases */
322 if ( this_ch != ' ' && this_ch != ' '+64 &&
323 this_ch != '\n' && this_ch != '\r' ) {
324 PyErr_SetString(Error, "Trailing garbage");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 Py_DECREF(rv);
326 return NULL;
327 }
328 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 return rv;
Jack Jansen72781191995-08-07 14:34:15 +0000330}
331
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200332/*[clinic input]
333binascii.b2a_uu
334
335 data: Py_buffer
336 /
337
338Uuencode line of data.
339[clinic start generated code]*/
Tim Peters934c1a12002-07-02 22:24:50 +0000340
Jack Jansen72781191995-08-07 14:34:15 +0000341static PyObject *
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200342binascii_b2a_uu_impl(PyModuleDef *module, Py_buffer *data)
Larry Hastings581ee362014-01-28 05:00:08 -0800343/*[clinic end generated code: output=181021b69bb9a414 input=00fdf458ce8b465b]*/
Jack Jansen72781191995-08-07 14:34:15 +0000344{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 unsigned char *ascii_data, *bin_data;
346 int leftbits = 0;
347 unsigned char this_ch;
348 unsigned int leftchar = 0;
349 PyObject *rv;
350 Py_ssize_t bin_len;
Tim Peters934c1a12002-07-02 22:24:50 +0000351
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200352 bin_data = data->buf;
353 bin_len = data->len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 if ( bin_len > 45 ) {
355 /* The 45 is a limit that appears in all uuencode's */
356 PyErr_SetString(Error, "At most 45 bytes at once");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 return NULL;
358 }
Jack Jansen72781191995-08-07 14:34:15 +0000359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 /* We're lazy and allocate to much (fixed up later) */
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200361 if ( (rv=PyBytes_FromStringAndSize(NULL, 2 + (bin_len+2)/3*4)) == NULL )
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 ascii_data = (unsigned char *)PyBytes_AS_STRING(rv);
Jack Jansen72781191995-08-07 14:34:15 +0000364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 /* Store the length */
366 *ascii_data++ = ' ' + (bin_len & 077);
Tim Peters934c1a12002-07-02 22:24:50 +0000367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 for( ; bin_len > 0 || leftbits != 0 ; bin_len--, bin_data++ ) {
369 /* Shift the data (or padding) into our buffer */
370 if ( bin_len > 0 ) /* Data */
371 leftchar = (leftchar << 8) | *bin_data;
372 else /* Padding */
373 leftchar <<= 8;
374 leftbits += 8;
Jack Jansen72781191995-08-07 14:34:15 +0000375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 /* See if there are 6-bit groups ready */
377 while ( leftbits >= 6 ) {
378 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
379 leftbits -= 6;
380 *ascii_data++ = this_ch + ' ';
381 }
382 }
383 *ascii_data++ = '\n'; /* Append a courtesy newline */
Tim Peters934c1a12002-07-02 22:24:50 +0000384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 if (_PyBytes_Resize(&rv,
386 (ascii_data -
387 (unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200388 Py_CLEAR(rv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 return rv;
Jack Jansen72781191995-08-07 14:34:15 +0000391}
392
Guido van Rossum2db4f471999-10-19 19:05:14 +0000393
394static int
Thomas Woutersf98db652006-03-01 21:37:32 +0000395binascii_find_valid(unsigned char *s, Py_ssize_t slen, int num)
Guido van Rossum2db4f471999-10-19 19:05:14 +0000396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 /* Finds & returns the (num+1)th
398 ** valid character for base64, or -1 if none.
399 */
Guido van Rossum2db4f471999-10-19 19:05:14 +0000400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 int ret = -1;
402 unsigned char c, b64val;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 while ((slen > 0) && (ret == -1)) {
405 c = *s;
406 b64val = table_a2b_base64[c & 0x7f];
407 if ( ((c <= 0x7f) && (b64val != (unsigned char)-1)) ) {
408 if (num == 0)
409 ret = *s;
410 num--;
411 }
Guido van Rossum2db4f471999-10-19 19:05:14 +0000412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 s++;
414 slen--;
415 }
416 return ret;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000417}
418
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200419/*[clinic input]
420binascii.a2b_base64
421
Serhiy Storchaka12785612014-01-25 11:49:49 +0200422 data: ascii_buffer
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200423 /
424
425Decode a line of base64 data.
426[clinic start generated code]*/
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000427
428static PyObject *
Serhiy Storchaka12785612014-01-25 11:49:49 +0200429binascii_a2b_base64_impl(PyModuleDef *module, Py_buffer *data)
Larry Hastings581ee362014-01-28 05:00:08 -0800430/*[clinic end generated code: output=3e351b702bed56d2 input=5872acf6e1cac243]*/
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 unsigned char *ascii_data, *bin_data;
433 int leftbits = 0;
434 unsigned char this_ch;
435 unsigned int leftchar = 0;
436 PyObject *rv;
437 Py_ssize_t ascii_len, bin_len;
438 int quad_pos = 0;
Tim Peters934c1a12002-07-02 22:24:50 +0000439
Serhiy Storchaka12785612014-01-25 11:49:49 +0200440 ascii_data = data->buf;
441 ascii_len = data->len;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 assert(ascii_len >= 0);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000444
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200445 if (ascii_len > PY_SSIZE_T_MAX - 3)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 return PyErr_NoMemory();
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 /* Allocate the buffer */
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200451 if ( (rv=PyBytes_FromStringAndSize(NULL, bin_len)) == NULL )
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 bin_data = (unsigned char *)PyBytes_AS_STRING(rv);
454 bin_len = 0;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 for( ; ascii_len > 0; ascii_len--, ascii_data++) {
457 this_ch = *ascii_data;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 if (this_ch > 0x7f ||
460 this_ch == '\r' || this_ch == '\n' || this_ch == ' ')
461 continue;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 /* Check for pad sequences and ignore
464 ** the invalid ones.
465 */
466 if (this_ch == BASE64_PAD) {
467 if ( (quad_pos < 2) ||
468 ((quad_pos == 2) &&
469 (binascii_find_valid(ascii_data, ascii_len, 1)
470 != BASE64_PAD)) )
471 {
472 continue;
473 }
474 else {
475 /* A pad sequence means no more input.
476 ** We've already interpreted the data
477 ** from the quad at this point.
478 */
479 leftbits = 0;
480 break;
481 }
482 }
Guido van Rossum2db4f471999-10-19 19:05:14 +0000483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 this_ch = table_a2b_base64[*ascii_data];
485 if ( this_ch == (unsigned char) -1 )
486 continue;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 /*
489 ** Shift it in on the low end, and see if there's
490 ** a byte ready for output.
491 */
492 quad_pos = (quad_pos + 1) & 0x03;
493 leftchar = (leftchar << 6) | (this_ch);
494 leftbits += 6;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 if ( leftbits >= 8 ) {
497 leftbits -= 8;
498 *bin_data++ = (leftchar >> leftbits) & 0xff;
499 bin_len++;
500 leftchar &= ((1 << leftbits) - 1);
501 }
502 }
Guido van Rossum2db4f471999-10-19 19:05:14 +0000503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 if (leftbits != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 PyErr_SetString(Error, "Incorrect padding");
506 Py_DECREF(rv);
507 return NULL;
508 }
Guido van Rossum2db4f471999-10-19 19:05:14 +0000509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 /* And set string size correctly. If the result string is empty
511 ** (because the input was all invalid) return the shared empty
512 ** string instead; _PyBytes_Resize() won't do this for us.
513 */
514 if (bin_len > 0) {
515 if (_PyBytes_Resize(&rv, bin_len) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200516 Py_CLEAR(rv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 }
518 }
519 else {
520 Py_DECREF(rv);
521 rv = PyBytes_FromStringAndSize("", 0);
522 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 return rv;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000524}
525
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200526
527/*[clinic input]
528binascii.b2a_base64
529
530 data: Py_buffer
531 /
532
533Base64-code line of data.
534[clinic start generated code]*/
Tim Peters934c1a12002-07-02 22:24:50 +0000535
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000536static PyObject *
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200537binascii_b2a_base64_impl(PyModuleDef *module, Py_buffer *data)
Larry Hastings581ee362014-01-28 05:00:08 -0800538/*[clinic end generated code: output=3cd61fbee2913285 input=14ec4e47371174a9]*/
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000539{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 unsigned char *ascii_data, *bin_data;
541 int leftbits = 0;
542 unsigned char this_ch;
543 unsigned int leftchar = 0;
544 PyObject *rv;
545 Py_ssize_t bin_len;
Tim Peters934c1a12002-07-02 22:24:50 +0000546
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200547 bin_data = data->buf;
548 bin_len = data->len;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 assert(bin_len >= 0);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 if ( bin_len > BASE64_MAXBIN ) {
553 PyErr_SetString(Error, "Too much data for base64 line");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 return NULL;
555 }
Tim Peters934c1a12002-07-02 22:24:50 +0000556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 /* We're lazy and allocate too much (fixed up later).
558 "+3" leaves room for up to two pad characters and a trailing
559 newline. Note that 'b' gets encoded as 'Yg==\n' (1 in, 5 out). */
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200560 if ( (rv=PyBytes_FromStringAndSize(NULL, bin_len*2 + 3)) == NULL )
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 ascii_data = (unsigned char *)PyBytes_AS_STRING(rv);
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 for( ; bin_len > 0 ; bin_len--, bin_data++ ) {
565 /* Shift the data into our buffer */
566 leftchar = (leftchar << 8) | *bin_data;
567 leftbits += 8;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 /* See if there are 6-bit groups ready */
570 while ( leftbits >= 6 ) {
571 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
572 leftbits -= 6;
573 *ascii_data++ = table_b2a_base64[this_ch];
574 }
575 }
576 if ( leftbits == 2 ) {
577 *ascii_data++ = table_b2a_base64[(leftchar&3) << 4];
578 *ascii_data++ = BASE64_PAD;
579 *ascii_data++ = BASE64_PAD;
580 } else if ( leftbits == 4 ) {
581 *ascii_data++ = table_b2a_base64[(leftchar&0xf) << 2];
582 *ascii_data++ = BASE64_PAD;
583 }
584 *ascii_data++ = '\n'; /* Append a courtesy newline */
Tim Peters934c1a12002-07-02 22:24:50 +0000585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 if (_PyBytes_Resize(&rv,
587 (ascii_data -
588 (unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200589 Py_CLEAR(rv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 return rv;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000592}
593
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200594/*[clinic input]
595binascii.a2b_hqx
596
Serhiy Storchaka12785612014-01-25 11:49:49 +0200597 data: ascii_buffer
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200598 /
599
600Decode .hqx coding.
601[clinic start generated code]*/
Jack Jansen72781191995-08-07 14:34:15 +0000602
603static PyObject *
Serhiy Storchaka12785612014-01-25 11:49:49 +0200604binascii_a2b_hqx_impl(PyModuleDef *module, Py_buffer *data)
Larry Hastings581ee362014-01-28 05:00:08 -0800605/*[clinic end generated code: output=60bcdbbd28b105cd input=0d914c680e0eed55]*/
Jack Jansen72781191995-08-07 14:34:15 +0000606{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 unsigned char *ascii_data, *bin_data;
608 int leftbits = 0;
609 unsigned char this_ch;
610 unsigned int leftchar = 0;
611 PyObject *rv;
612 Py_ssize_t len;
613 int done = 0;
Tim Peters934c1a12002-07-02 22:24:50 +0000614
Serhiy Storchaka12785612014-01-25 11:49:49 +0200615 ascii_data = data->buf;
616 len = data->len;
Jack Jansen72781191995-08-07 14:34:15 +0000617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 assert(len >= 0);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000619
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200620 if (len > PY_SSIZE_T_MAX - 2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 return PyErr_NoMemory();
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 /* Allocate a string that is too big (fixed later)
624 Add two to the initial length to prevent interning which
625 would preclude subsequent resizing. */
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200626 if ( (rv=PyBytes_FromStringAndSize(NULL, len+2)) == NULL )
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 bin_data = (unsigned char *)PyBytes_AS_STRING(rv);
Jack Jansen72781191995-08-07 14:34:15 +0000629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 for( ; len > 0 ; len--, ascii_data++ ) {
631 /* Get the byte and look it up */
632 this_ch = table_a2b_hqx[*ascii_data];
633 if ( this_ch == SKIP )
634 continue;
635 if ( this_ch == FAIL ) {
636 PyErr_SetString(Error, "Illegal char");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 Py_DECREF(rv);
638 return NULL;
639 }
640 if ( this_ch == DONE ) {
641 /* The terminating colon */
642 done = 1;
643 break;
644 }
Jack Jansen72781191995-08-07 14:34:15 +0000645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 /* Shift it into the buffer and see if any bytes are ready */
647 leftchar = (leftchar << 6) | (this_ch);
648 leftbits += 6;
649 if ( leftbits >= 8 ) {
650 leftbits -= 8;
651 *bin_data++ = (leftchar >> leftbits) & 0xff;
652 leftchar &= ((1 << leftbits) - 1);
653 }
654 }
Tim Peters934c1a12002-07-02 22:24:50 +0000655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 if ( leftbits && !done ) {
657 PyErr_SetString(Incomplete,
658 "String has incomplete number of bytes");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 Py_DECREF(rv);
660 return NULL;
661 }
662 if (_PyBytes_Resize(&rv,
663 (bin_data -
664 (unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200665 Py_CLEAR(rv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 }
667 if (rv) {
668 PyObject *rrv = Py_BuildValue("Oi", rv, done);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 Py_DECREF(rv);
670 return rrv;
671 }
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 return NULL;
Jack Jansen72781191995-08-07 14:34:15 +0000674}
675
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200676
677/*[clinic input]
678binascii.rlecode_hqx
679
680 data: Py_buffer
681 /
682
683Binhex RLE-code binary data.
684[clinic start generated code]*/
Jack Jansen72781191995-08-07 14:34:15 +0000685
686static PyObject *
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200687binascii_rlecode_hqx_impl(PyModuleDef *module, Py_buffer *data)
Larry Hastings581ee362014-01-28 05:00:08 -0800688/*[clinic end generated code: output=0905da344dbf0648 input=e1f1712447a82b09]*/
Jack Jansen72781191995-08-07 14:34:15 +0000689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 unsigned char *in_data, *out_data;
691 PyObject *rv;
692 unsigned char ch;
693 Py_ssize_t in, inend, len;
Tim Peters934c1a12002-07-02 22:24:50 +0000694
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200695 in_data = data->buf;
696 len = data->len;
Jack Jansen72781191995-08-07 14:34:15 +0000697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 assert(len >= 0);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000699
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200700 if (len > PY_SSIZE_T_MAX / 2 - 2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 return PyErr_NoMemory();
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 /* Worst case: output is twice as big as input (fixed later) */
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200704 if ( (rv=PyBytes_FromStringAndSize(NULL, len*2+2)) == NULL )
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000705 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 out_data = (unsigned char *)PyBytes_AS_STRING(rv);
Tim Peters934c1a12002-07-02 22:24:50 +0000707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 for( in=0; in<len; in++) {
709 ch = in_data[in];
710 if ( ch == RUNCHAR ) {
711 /* RUNCHAR. Escape it. */
712 *out_data++ = RUNCHAR;
713 *out_data++ = 0;
714 } else {
715 /* Check how many following are the same */
716 for(inend=in+1;
717 inend<len && in_data[inend] == ch &&
718 inend < in+255;
719 inend++) ;
720 if ( inend - in > 3 ) {
721 /* More than 3 in a row. Output RLE. */
722 *out_data++ = ch;
723 *out_data++ = RUNCHAR;
Antoine Pitrou40455752010-08-15 18:51:10 +0000724 *out_data++ = (unsigned char) (inend-in);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 in = inend-1;
726 } else {
727 /* Less than 3. Output the byte itself */
728 *out_data++ = ch;
729 }
730 }
731 }
732 if (_PyBytes_Resize(&rv,
733 (out_data -
734 (unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200735 Py_CLEAR(rv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 return rv;
Jack Jansen72781191995-08-07 14:34:15 +0000738}
739
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200740
741/*[clinic input]
742binascii.b2a_hqx
743
744 data: Py_buffer
745 /
746
747Encode .hqx data.
748[clinic start generated code]*/
Tim Peters934c1a12002-07-02 22:24:50 +0000749
Jack Jansen72781191995-08-07 14:34:15 +0000750static PyObject *
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200751binascii_b2a_hqx_impl(PyModuleDef *module, Py_buffer *data)
Larry Hastings581ee362014-01-28 05:00:08 -0800752/*[clinic end generated code: output=5a987810d5e3cdbb input=9596ebe019fe12ba]*/
Jack Jansen72781191995-08-07 14:34:15 +0000753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 unsigned char *ascii_data, *bin_data;
755 int leftbits = 0;
756 unsigned char this_ch;
757 unsigned int leftchar = 0;
758 PyObject *rv;
759 Py_ssize_t len;
Tim Peters934c1a12002-07-02 22:24:50 +0000760
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200761 bin_data = data->buf;
762 len = data->len;
Jack Jansen72781191995-08-07 14:34:15 +0000763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 assert(len >= 0);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000765
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200766 if (len > PY_SSIZE_T_MAX / 2 - 2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 return PyErr_NoMemory();
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 /* Allocate a buffer that is at least large enough */
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200770 if ( (rv=PyBytes_FromStringAndSize(NULL, len*2+2)) == NULL )
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 ascii_data = (unsigned char *)PyBytes_AS_STRING(rv);
Tim Peters934c1a12002-07-02 22:24:50 +0000773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 for( ; len > 0 ; len--, bin_data++ ) {
775 /* Shift into our buffer, and output any 6bits ready */
776 leftchar = (leftchar << 8) | *bin_data;
777 leftbits += 8;
778 while ( leftbits >= 6 ) {
779 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
780 leftbits -= 6;
781 *ascii_data++ = table_b2a_hqx[this_ch];
782 }
783 }
784 /* Output a possible runt byte */
785 if ( leftbits ) {
786 leftchar <<= (6-leftbits);
787 *ascii_data++ = table_b2a_hqx[leftchar & 0x3f];
788 }
789 if (_PyBytes_Resize(&rv,
790 (ascii_data -
791 (unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200792 Py_CLEAR(rv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 return rv;
Jack Jansen72781191995-08-07 14:34:15 +0000795}
796
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200797
798/*[clinic input]
799binascii.rledecode_hqx
800
801 data: Py_buffer
802 /
803
804Decode hexbin RLE-coded string.
805[clinic start generated code]*/
Tim Peters934c1a12002-07-02 22:24:50 +0000806
Jack Jansen72781191995-08-07 14:34:15 +0000807static PyObject *
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200808binascii_rledecode_hqx_impl(PyModuleDef *module, Py_buffer *data)
Larry Hastings581ee362014-01-28 05:00:08 -0800809/*[clinic end generated code: output=f7afd89b789946ab input=54cdd49fc014402c]*/
Jack Jansen72781191995-08-07 14:34:15 +0000810{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 unsigned char *in_data, *out_data;
812 unsigned char in_byte, in_repeat;
813 PyObject *rv;
814 Py_ssize_t in_len, out_len, out_len_left;
Jack Jansen72781191995-08-07 14:34:15 +0000815
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200816 in_data = data->buf;
817 in_len = data->len;
Jack Jansen72781191995-08-07 14:34:15 +0000818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 assert(in_len >= 0);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 /* Empty string is a special case */
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200822 if ( in_len == 0 )
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 return PyBytes_FromStringAndSize("", 0);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200824 else if (in_len > PY_SSIZE_T_MAX / 2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 return PyErr_NoMemory();
Jack Jansen72781191995-08-07 14:34:15 +0000826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 /* Allocate a buffer of reasonable size. Resized when needed */
828 out_len = in_len*2;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200829 if ( (rv=PyBytes_FromStringAndSize(NULL, out_len)) == NULL )
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 out_len_left = out_len;
832 out_data = (unsigned char *)PyBytes_AS_STRING(rv);
Jack Jansen72781191995-08-07 14:34:15 +0000833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 /*
835 ** We need two macros here to get/put bytes and handle
836 ** end-of-buffer for input and output strings.
837 */
Jack Jansen72781191995-08-07 14:34:15 +0000838#define INBYTE(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 do { \
840 if ( --in_len < 0 ) { \
841 PyErr_SetString(Incomplete, ""); \
842 Py_DECREF(rv); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 return NULL; \
844 } \
845 b = *in_data++; \
846 } while(0)
Tim Peters934c1a12002-07-02 22:24:50 +0000847
Jack Jansen72781191995-08-07 14:34:15 +0000848#define OUTBYTE(b) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 do { \
850 if ( --out_len_left < 0 ) { \
851 if ( out_len > PY_SSIZE_T_MAX / 2) return PyErr_NoMemory(); \
852 if (_PyBytes_Resize(&rv, 2*out_len) < 0) \
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200853 { Py_XDECREF(rv); return NULL; } \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 out_data = (unsigned char *)PyBytes_AS_STRING(rv) \
855 + out_len; \
856 out_len_left = out_len-1; \
857 out_len = out_len * 2; \
858 } \
859 *out_data++ = b; \
860 } while(0)
Jack Jansen72781191995-08-07 14:34:15 +0000861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 /*
863 ** Handle first byte separately (since we have to get angry
864 ** in case of an orphaned RLE code).
865 */
866 INBYTE(in_byte);
Jack Jansen72781191995-08-07 14:34:15 +0000867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 if (in_byte == RUNCHAR) {
869 INBYTE(in_repeat);
870 if (in_repeat != 0) {
871 /* Note Error, not Incomplete (which is at the end
872 ** of the string only). This is a programmer error.
873 */
874 PyErr_SetString(Error, "Orphaned RLE code at start");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 Py_DECREF(rv);
876 return NULL;
877 }
878 OUTBYTE(RUNCHAR);
879 } else {
880 OUTBYTE(in_byte);
881 }
Tim Peters934c1a12002-07-02 22:24:50 +0000882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 while( in_len > 0 ) {
884 INBYTE(in_byte);
Jack Jansen72781191995-08-07 14:34:15 +0000885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 if (in_byte == RUNCHAR) {
887 INBYTE(in_repeat);
888 if ( in_repeat == 0 ) {
889 /* Just an escaped RUNCHAR value */
890 OUTBYTE(RUNCHAR);
891 } else {
892 /* Pick up value and output a sequence of it */
893 in_byte = out_data[-1];
894 while ( --in_repeat > 0 )
895 OUTBYTE(in_byte);
896 }
897 } else {
898 /* Normal byte */
899 OUTBYTE(in_byte);
900 }
901 }
902 if (_PyBytes_Resize(&rv,
903 (out_data -
904 (unsigned char *)PyBytes_AS_STRING(rv))) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200905 Py_CLEAR(rv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 return rv;
Jack Jansen72781191995-08-07 14:34:15 +0000908}
909
Jack Jansen72781191995-08-07 14:34:15 +0000910
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200911/*[clinic input]
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300912binascii.crc_hqx -> unsigned_int
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200913
914 data: Py_buffer
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300915 crc: unsigned_int(bitwise=True)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200916 /
917
918Compute hqx CRC incrementally.
919[clinic start generated code]*/
920
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300921static unsigned int
922binascii_crc_hqx_impl(PyModuleDef *module, Py_buffer *data, unsigned int crc)
923/*[clinic end generated code: output=167c2dac62625717 input=add8c53712ccceda]*/
Jack Jansen72781191995-08-07 14:34:15 +0000924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 unsigned char *bin_data;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 Py_ssize_t len;
Tim Peters934c1a12002-07-02 22:24:50 +0000927
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300928 crc &= 0xffff;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200929 bin_data = data->buf;
930 len = data->len;
Jack Jansen72781191995-08-07 14:34:15 +0000931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 while(len-- > 0) {
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300933 crc = ((crc<<8)&0xff00) ^ crctab_hqx[(crc>>8)^*bin_data++];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 }
Jack Jansen72781191995-08-07 14:34:15 +0000935
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300936 return crc;
Jack Jansen72781191995-08-07 14:34:15 +0000937}
938
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200939#ifndef USE_ZLIB_CRC32
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000940/* Crc - 32 BIT ANSI X3.66 CRC checksum files
941 Also known as: ISO 3307
942**********************************************************************|
943* *|
944* Demonstration program to compute the 32-bit CRC used as the frame *|
945* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *|
946* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *|
947* protocol). The 32-bit FCS was added via the Federal Register, *|
948* 1 June 1982, p.23798. I presume but don't know for certain that *|
949* this polynomial is or will be included in CCITT V.41, which *|
950* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *|
951* PUB 78 says that the 32-bit FCS reduces otherwise undetected *|
952* errors by a factor of 10^-5 over 16-bit FCS. *|
953* *|
954**********************************************************************|
955
956 Copyright (C) 1986 Gary S. Brown. You may use this program, or
957 code or tables extracted from it, as desired without restriction.
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000958
Tim Peters934c1a12002-07-02 22:24:50 +0000959 First, the polynomial itself and its table of feedback terms. The
960 polynomial is
961 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
962 Note that we take it "backwards" and put the highest-order term in
963 the lowest-order bit. The X^32 term is "implied"; the LSB is the
964 X^31 term, etc. The X^0 term (usually shown as "+1") results in
965 the MSB being 1.
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000966
Tim Peters934c1a12002-07-02 22:24:50 +0000967 Note that the usual hardware shift register implementation, which
968 is what we're using (we're merely optimizing it by doing eight-bit
969 chunks at a time) shifts bits into the lowest-order term. In our
970 implementation, that means shifting towards the right. Why do we
971 do it this way? Because the calculated CRC must be transmitted in
972 order from highest-order term to lowest-order term. UARTs transmit
973 characters in order from LSB to MSB. By storing the CRC this way,
974 we hand it to the UART in the order low-byte to high-byte; the UART
975 sends each low-bit to hight-bit; and the result is transmission bit
976 by bit from highest- to lowest-order term without requiring any bit
977 shuffling on our part. Reception works similarly.
978
979 The feedback terms table consists of 256, 32-bit entries. Notes:
980
981 1. The table can be generated at runtime if desired; code to do so
982 is shown later. It might not be obvious, but the feedback
983 terms simply represent the results of eight shift/xor opera-
984 tions for all combinations of data and CRC register values.
985
986 2. The CRC accumulation logic is the same for all CRC polynomials,
987 be they sixteen or thirty-two bits wide. You simply choose the
988 appropriate table. Alternatively, because the table can be
989 generated at runtime, you can start by generating the table for
990 the polynomial in question and use exactly the same "updcrc",
991 if your application needn't simultaneously handle two CRC
992 polynomials. (Note, however, that XMODEM is strange.)
993
994 3. For 16-bit CRCs, the table entries need be only 16 bits wide;
995 of course, 32-bit entries work OK if the high 16 bits are zero.
996
997 4. The values must be right-shifted by eight bits by the "updcrc"
998 logic; the shift must be unsigned (bring in zeroes). On some
999 hardware you could probably optimize the shift in assembler by
1000 using byte-swap instructions.
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001001********************************************************************/
1002
Gregory P. Smith3c0e4d22008-03-25 07:51:12 +00001003static unsigned int crc_32_tab[256] = {
10040x00000000U, 0x77073096U, 0xee0e612cU, 0x990951baU, 0x076dc419U,
10050x706af48fU, 0xe963a535U, 0x9e6495a3U, 0x0edb8832U, 0x79dcb8a4U,
10060xe0d5e91eU, 0x97d2d988U, 0x09b64c2bU, 0x7eb17cbdU, 0xe7b82d07U,
10070x90bf1d91U, 0x1db71064U, 0x6ab020f2U, 0xf3b97148U, 0x84be41deU,
10080x1adad47dU, 0x6ddde4ebU, 0xf4d4b551U, 0x83d385c7U, 0x136c9856U,
10090x646ba8c0U, 0xfd62f97aU, 0x8a65c9ecU, 0x14015c4fU, 0x63066cd9U,
10100xfa0f3d63U, 0x8d080df5U, 0x3b6e20c8U, 0x4c69105eU, 0xd56041e4U,
10110xa2677172U, 0x3c03e4d1U, 0x4b04d447U, 0xd20d85fdU, 0xa50ab56bU,
10120x35b5a8faU, 0x42b2986cU, 0xdbbbc9d6U, 0xacbcf940U, 0x32d86ce3U,
10130x45df5c75U, 0xdcd60dcfU, 0xabd13d59U, 0x26d930acU, 0x51de003aU,
10140xc8d75180U, 0xbfd06116U, 0x21b4f4b5U, 0x56b3c423U, 0xcfba9599U,
10150xb8bda50fU, 0x2802b89eU, 0x5f058808U, 0xc60cd9b2U, 0xb10be924U,
10160x2f6f7c87U, 0x58684c11U, 0xc1611dabU, 0xb6662d3dU, 0x76dc4190U,
10170x01db7106U, 0x98d220bcU, 0xefd5102aU, 0x71b18589U, 0x06b6b51fU,
10180x9fbfe4a5U, 0xe8b8d433U, 0x7807c9a2U, 0x0f00f934U, 0x9609a88eU,
10190xe10e9818U, 0x7f6a0dbbU, 0x086d3d2dU, 0x91646c97U, 0xe6635c01U,
10200x6b6b51f4U, 0x1c6c6162U, 0x856530d8U, 0xf262004eU, 0x6c0695edU,
10210x1b01a57bU, 0x8208f4c1U, 0xf50fc457U, 0x65b0d9c6U, 0x12b7e950U,
10220x8bbeb8eaU, 0xfcb9887cU, 0x62dd1ddfU, 0x15da2d49U, 0x8cd37cf3U,
10230xfbd44c65U, 0x4db26158U, 0x3ab551ceU, 0xa3bc0074U, 0xd4bb30e2U,
10240x4adfa541U, 0x3dd895d7U, 0xa4d1c46dU, 0xd3d6f4fbU, 0x4369e96aU,
10250x346ed9fcU, 0xad678846U, 0xda60b8d0U, 0x44042d73U, 0x33031de5U,
10260xaa0a4c5fU, 0xdd0d7cc9U, 0x5005713cU, 0x270241aaU, 0xbe0b1010U,
10270xc90c2086U, 0x5768b525U, 0x206f85b3U, 0xb966d409U, 0xce61e49fU,
10280x5edef90eU, 0x29d9c998U, 0xb0d09822U, 0xc7d7a8b4U, 0x59b33d17U,
10290x2eb40d81U, 0xb7bd5c3bU, 0xc0ba6cadU, 0xedb88320U, 0x9abfb3b6U,
10300x03b6e20cU, 0x74b1d29aU, 0xead54739U, 0x9dd277afU, 0x04db2615U,
10310x73dc1683U, 0xe3630b12U, 0x94643b84U, 0x0d6d6a3eU, 0x7a6a5aa8U,
10320xe40ecf0bU, 0x9309ff9dU, 0x0a00ae27U, 0x7d079eb1U, 0xf00f9344U,
10330x8708a3d2U, 0x1e01f268U, 0x6906c2feU, 0xf762575dU, 0x806567cbU,
10340x196c3671U, 0x6e6b06e7U, 0xfed41b76U, 0x89d32be0U, 0x10da7a5aU,
10350x67dd4accU, 0xf9b9df6fU, 0x8ebeeff9U, 0x17b7be43U, 0x60b08ed5U,
10360xd6d6a3e8U, 0xa1d1937eU, 0x38d8c2c4U, 0x4fdff252U, 0xd1bb67f1U,
10370xa6bc5767U, 0x3fb506ddU, 0x48b2364bU, 0xd80d2bdaU, 0xaf0a1b4cU,
10380x36034af6U, 0x41047a60U, 0xdf60efc3U, 0xa867df55U, 0x316e8eefU,
10390x4669be79U, 0xcb61b38cU, 0xbc66831aU, 0x256fd2a0U, 0x5268e236U,
10400xcc0c7795U, 0xbb0b4703U, 0x220216b9U, 0x5505262fU, 0xc5ba3bbeU,
10410xb2bd0b28U, 0x2bb45a92U, 0x5cb36a04U, 0xc2d7ffa7U, 0xb5d0cf31U,
10420x2cd99e8bU, 0x5bdeae1dU, 0x9b64c2b0U, 0xec63f226U, 0x756aa39cU,
10430x026d930aU, 0x9c0906a9U, 0xeb0e363fU, 0x72076785U, 0x05005713U,
10440x95bf4a82U, 0xe2b87a14U, 0x7bb12baeU, 0x0cb61b38U, 0x92d28e9bU,
10450xe5d5be0dU, 0x7cdcefb7U, 0x0bdbdf21U, 0x86d3d2d4U, 0xf1d4e242U,
10460x68ddb3f8U, 0x1fda836eU, 0x81be16cdU, 0xf6b9265bU, 0x6fb077e1U,
10470x18b74777U, 0x88085ae6U, 0xff0f6a70U, 0x66063bcaU, 0x11010b5cU,
10480x8f659effU, 0xf862ae69U, 0x616bffd3U, 0x166ccf45U, 0xa00ae278U,
10490xd70dd2eeU, 0x4e048354U, 0x3903b3c2U, 0xa7672661U, 0xd06016f7U,
10500x4969474dU, 0x3e6e77dbU, 0xaed16a4aU, 0xd9d65adcU, 0x40df0b66U,
10510x37d83bf0U, 0xa9bcae53U, 0xdebb9ec5U, 0x47b2cf7fU, 0x30b5ffe9U,
10520xbdbdf21cU, 0xcabac28aU, 0x53b39330U, 0x24b4a3a6U, 0xbad03605U,
10530xcdd70693U, 0x54de5729U, 0x23d967bfU, 0xb3667a2eU, 0xc4614ab8U,
10540x5d681b02U, 0x2a6f2b94U, 0xb40bbe37U, 0xc30c8ea1U, 0x5a05df1bU,
10550x2d02ef8dU
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001056};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001057#endif /* USE_ZLIB_CRC32 */
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001058
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001059/*[clinic input]
1060binascii.crc32 -> unsigned_int
1061
1062 data: Py_buffer
1063 crc: unsigned_int(bitwise=True) = 0
1064 /
1065
1066Compute CRC-32 incrementally.
1067[clinic start generated code]*/
1068
1069static unsigned int
1070binascii_crc32_impl(PyModuleDef *module, Py_buffer *data, unsigned int crc)
Larry Hastings581ee362014-01-28 05:00:08 -08001071/*[clinic end generated code: output=620a961643393c4f input=bbe340bc99d25aa8]*/
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001072
1073#ifdef USE_ZLIB_CRC32
1074/* This was taken from zlibmodule.c PyZlib_crc32 (but is PY_SSIZE_T_CLEAN) */
1075{
1076 Byte *buf;
1077 Py_ssize_t len;
1078 int signed_val;
1079
1080 buf = (Byte*)data->buf;
1081 len = data->len;
1082 signed_val = crc32(crc, buf, len);
1083 return (unsigned int)signed_val & 0xffffffffU;
1084}
1085#else /* USE_ZLIB_CRC32 */
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001086{ /* By Jim Ahlstrom; All rights transferred to CNRI */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 unsigned char *bin_data;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 Py_ssize_t len;
1089 unsigned int result;
Tim Peters934c1a12002-07-02 22:24:50 +00001090
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001091 bin_data = data->buf;
1092 len = data->len;
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 crc = ~ crc;
1095 while (len-- > 0) {
1096 crc = crc_32_tab[(crc ^ *bin_data++) & 0xff] ^ (crc >> 8);
1097 /* Note: (crc >> 8) MUST zero fill on left */
1098 }
Tim Petersa98011c2002-07-02 20:20:08 +00001099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 result = (crc ^ 0xFFFFFFFF);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001101 return result & 0xffffffff;
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001102}
Christian Heimes1dc54002008-03-24 02:19:29 +00001103#endif /* USE_ZLIB_CRC32 */
Guido van Rossum7d47c9e2000-02-16 21:11:52 +00001104
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001105/*[clinic input]
1106binascii.b2a_hex
1107
1108 data: Py_buffer
1109 /
1110
1111Hexadecimal representation of binary data.
1112
1113The return value is a bytes object. This function is also
1114available as "hexlify()".
1115[clinic start generated code]*/
Barry Warsawe977c212000-08-15 06:07:13 +00001116
1117static PyObject *
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001118binascii_b2a_hex_impl(PyModuleDef *module, Py_buffer *data)
Larry Hastings581ee362014-01-28 05:00:08 -08001119/*[clinic end generated code: output=179318922c2f8fda input=96423cfa299ff3b1]*/
Barry Warsawe977c212000-08-15 06:07:13 +00001120{
Gregory P. Smith9c6b9162015-04-26 00:42:13 +00001121 return _Py_strhex_bytes((const char *)data->buf, data->len);
Barry Warsawe977c212000-08-15 06:07:13 +00001122}
1123
Zachary Wareb176d402015-01-20 13:59:46 -06001124/*[clinic input]
1125binascii.hexlify = binascii.b2a_hex
1126
1127Hexadecimal representation of binary data.
1128
1129The return value is a bytes object.
1130[clinic start generated code]*/
1131
1132static PyObject *
1133binascii_hexlify_impl(PyModuleDef *module, Py_buffer *data)
1134/*[clinic end generated code: output=6098440091fb61dc input=2e3afae7f083f061]*/
1135{
Gregory P. Smith9c6b9162015-04-26 00:42:13 +00001136 return _Py_strhex_bytes((const char *)data->buf, data->len);
Zachary Wareb176d402015-01-20 13:59:46 -06001137}
Barry Warsawe977c212000-08-15 06:07:13 +00001138
1139static int
Tim Peters934c1a12002-07-02 22:24:50 +00001140to_int(int c)
Barry Warsawe977c212000-08-15 06:07:13 +00001141{
Antoine Pitrou4de74572013-02-09 23:11:27 +01001142 if (Py_ISDIGIT(c))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 return c - '0';
1144 else {
Antoine Pitroued8ba142011-10-04 13:50:21 +02001145 if (Py_ISUPPER(c))
1146 c = Py_TOLOWER(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 if (c >= 'a' && c <= 'f')
1148 return c - 'a' + 10;
1149 }
1150 return -1;
Barry Warsawe977c212000-08-15 06:07:13 +00001151}
1152
1153
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001154/*[clinic input]
1155binascii.a2b_hex
1156
1157 hexstr: ascii_buffer
1158 /
1159
1160Binary data of hexadecimal representation.
1161
1162hexstr must contain an even number of hex digits (upper or lower case).
1163This function is also available as "unhexlify()".
1164[clinic start generated code]*/
1165
Barry Warsawe977c212000-08-15 06:07:13 +00001166static PyObject *
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001167binascii_a2b_hex_impl(PyModuleDef *module, Py_buffer *hexstr)
Larry Hastings581ee362014-01-28 05:00:08 -08001168/*[clinic end generated code: output=d61da452b5c6d290 input=9e1e7f2f94db24fd]*/
Barry Warsawe977c212000-08-15 06:07:13 +00001169{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 char* argbuf;
1171 Py_ssize_t arglen;
1172 PyObject *retval;
1173 char* retbuf;
1174 Py_ssize_t i, j;
Barry Warsawe977c212000-08-15 06:07:13 +00001175
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001176 argbuf = hexstr->buf;
1177 arglen = hexstr->len;
Barry Warsawe977c212000-08-15 06:07:13 +00001178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 assert(arglen >= 0);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 /* XXX What should we do about strings with an odd length? Should
1182 * we add an implicit leading zero, or a trailing zero? For now,
1183 * raise an exception.
1184 */
1185 if (arglen % 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 PyErr_SetString(Error, "Odd-length string");
1187 return NULL;
1188 }
Barry Warsawe977c212000-08-15 06:07:13 +00001189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 retval = PyBytes_FromStringAndSize(NULL, (arglen/2));
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001191 if (!retval)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 retbuf = PyBytes_AS_STRING(retval);
Barry Warsawe977c212000-08-15 06:07:13 +00001194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 for (i=j=0; i < arglen; i += 2) {
1196 int top = to_int(Py_CHARMASK(argbuf[i]));
1197 int bot = to_int(Py_CHARMASK(argbuf[i+1]));
1198 if (top == -1 || bot == -1) {
1199 PyErr_SetString(Error,
1200 "Non-hexadecimal digit found");
1201 goto finally;
1202 }
1203 retbuf[j++] = (top << 4) + bot;
1204 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 return retval;
Barry Warsawe977c212000-08-15 06:07:13 +00001206
1207 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 Py_DECREF(retval);
1209 return NULL;
Barry Warsawe977c212000-08-15 06:07:13 +00001210}
1211
Zachary Wareb176d402015-01-20 13:59:46 -06001212/*[clinic input]
1213binascii.unhexlify = binascii.a2b_hex
1214
1215Binary data of hexadecimal representation.
1216
1217hexstr must contain an even number of hex digits (upper or lower case).
1218[clinic start generated code]*/
1219
1220static PyObject *
1221binascii_unhexlify_impl(PyModuleDef *module, Py_buffer *hexstr)
1222/*[clinic end generated code: output=17cec7544499803e input=dd8c012725f462da]*/
1223{
1224 return binascii_a2b_hex_impl(module, hexstr);
1225}
1226
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001227static int table_hex[128] = {
1228 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1229 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1230 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1231 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1, -1,-1,-1,-1,
1232 -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1233 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1234 -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1235 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1
1236};
1237
1238#define hexval(c) table_hex[(unsigned int)(c)]
1239
1240#define MAXLINESIZE 76
1241
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001242
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001243/*[clinic input]
1244binascii.a2b_qp
1245
Serhiy Storchaka12785612014-01-25 11:49:49 +02001246 data: ascii_buffer
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001247 header: int(c_default="0") = False
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001248
1249Decode a string of qp-encoded data.
1250[clinic start generated code]*/
1251
1252static PyObject *
Serhiy Storchaka12785612014-01-25 11:49:49 +02001253binascii_a2b_qp_impl(PyModuleDef *module, Py_buffer *data, int header)
Larry Hastings581ee362014-01-28 05:00:08 -08001254/*[clinic end generated code: output=a44ef88270352114 input=5187a0d3d8e54f3b]*/
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 Py_ssize_t in, out;
1257 char ch;
Serhiy Storchaka12785612014-01-25 11:49:49 +02001258 unsigned char *ascii_data, *odata;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 Py_ssize_t datalen = 0;
1260 PyObject *rv;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001261
Serhiy Storchaka12785612014-01-25 11:49:49 +02001262 ascii_data = data->buf;
1263 datalen = data->len;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 /* We allocate the output same size as input, this is overkill.
1266 * The previous implementation used calloc() so we'll zero out the
1267 * memory here too, since PyMem_Malloc() does not guarantee that.
1268 */
1269 odata = (unsigned char *) PyMem_Malloc(datalen);
1270 if (odata == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 PyErr_NoMemory();
1272 return NULL;
1273 }
1274 memset(odata, 0, datalen);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 in = out = 0;
1277 while (in < datalen) {
Serhiy Storchaka12785612014-01-25 11:49:49 +02001278 if (ascii_data[in] == '=') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 in++;
1280 if (in >= datalen) break;
1281 /* Soft line breaks */
Serhiy Storchaka12785612014-01-25 11:49:49 +02001282 if ((ascii_data[in] == '\n') || (ascii_data[in] == '\r')) {
1283 if (ascii_data[in] != '\n') {
1284 while (in < datalen && ascii_data[in] != '\n') in++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 }
1286 if (in < datalen) in++;
1287 }
Serhiy Storchaka12785612014-01-25 11:49:49 +02001288 else if (ascii_data[in] == '=') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 /* broken case from broken python qp */
1290 odata[out++] = '=';
1291 in++;
1292 }
Serhiy Storchaka12785612014-01-25 11:49:49 +02001293 else if (((ascii_data[in] >= 'A' && ascii_data[in] <= 'F') ||
1294 (ascii_data[in] >= 'a' && ascii_data[in] <= 'f') ||
1295 (ascii_data[in] >= '0' && ascii_data[in] <= '9')) &&
1296 ((ascii_data[in+1] >= 'A' && ascii_data[in+1] <= 'F') ||
1297 (ascii_data[in+1] >= 'a' && ascii_data[in+1] <= 'f') ||
1298 (ascii_data[in+1] >= '0' && ascii_data[in+1] <= '9'))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 /* hexval */
Serhiy Storchaka12785612014-01-25 11:49:49 +02001300 ch = hexval(ascii_data[in]) << 4;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 in++;
Serhiy Storchaka12785612014-01-25 11:49:49 +02001302 ch |= hexval(ascii_data[in]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 in++;
1304 odata[out++] = ch;
1305 }
1306 else {
1307 odata[out++] = '=';
1308 }
1309 }
Serhiy Storchaka12785612014-01-25 11:49:49 +02001310 else if (header && ascii_data[in] == '_') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 odata[out++] = ' ';
1312 in++;
1313 }
1314 else {
Serhiy Storchaka12785612014-01-25 11:49:49 +02001315 odata[out] = ascii_data[in];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 in++;
1317 out++;
1318 }
1319 }
1320 if ((rv = PyBytes_FromStringAndSize((char *)odata, out)) == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 PyMem_Free(odata);
1322 return NULL;
1323 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 PyMem_Free(odata);
1325 return rv;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001326}
1327
Tim Peters934c1a12002-07-02 22:24:50 +00001328static int
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001329to_hex (unsigned char ch, unsigned char *s)
1330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 unsigned int uvalue = ch;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 s[1] = "0123456789ABCDEF"[uvalue % 16];
1334 uvalue = (uvalue / 16);
1335 s[0] = "0123456789ABCDEF"[uvalue % 16];
1336 return 0;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001337}
1338
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001339/* XXX: This is ridiculously complicated to be backward compatible
1340 * (mostly) with the quopri module. It doesn't re-create the quopri
1341 * module bug where text ending in CRLF has the CR encoded */
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001342
1343/*[clinic input]
1344binascii.b2a_qp
1345
1346 data: Py_buffer
1347 quotetabs: int(c_default="0") = False
1348 istext: int(c_default="1") = True
1349 header: int(c_default="0") = False
1350
1351Encode a string using quoted-printable encoding.
1352
1353On encoding, when istext is set, newlines are not encoded, and white
1354space at end of lines is. When istext is not set, \r and \n (CR/LF)
1355are both encoded. When quotetabs is set, space and tabs are encoded.
1356[clinic start generated code]*/
1357
1358static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04001359binascii_b2a_qp_impl(PyModuleDef *module, Py_buffer *data, int quotetabs,
1360 int istext, int header)
1361/*[clinic end generated code: output=a87ca9ccb94e2a9f input=7f2a9aaa008e92b2]*/
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001362{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 Py_ssize_t in, out;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001364 unsigned char *databuf, *odata;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 Py_ssize_t datalen = 0, odatalen = 0;
1366 PyObject *rv;
1367 unsigned int linelen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 unsigned char ch;
1369 int crlf = 0;
1370 unsigned char *p;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001371
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001372 databuf = data->buf;
1373 datalen = data->len;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 /* See if this string is using CRLF line ends */
1376 /* XXX: this function has the side effect of converting all of
1377 * the end of lines to be the same depending on this detection
1378 * here */
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001379 p = (unsigned char *) memchr(databuf, '\n', datalen);
1380 if ((p != NULL) && (p > databuf) && (*(p-1) == '\r'))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 crlf = 1;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 /* First, scan to see how many characters need to be encoded */
1384 in = 0;
1385 while (in < datalen) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001386 if ((databuf[in] > 126) ||
1387 (databuf[in] == '=') ||
1388 (header && databuf[in] == '_') ||
1389 ((databuf[in] == '.') && (linelen == 0) &&
1390 (databuf[in+1] == '\n' || databuf[in+1] == '\r' || databuf[in+1] == 0)) ||
1391 (!istext && ((databuf[in] == '\r') || (databuf[in] == '\n'))) ||
1392 ((databuf[in] == '\t' || databuf[in] == ' ') && (in + 1 == datalen)) ||
1393 ((databuf[in] < 33) &&
1394 (databuf[in] != '\r') && (databuf[in] != '\n') &&
1395 (quotetabs || ((databuf[in] != '\t') && (databuf[in] != ' ')))))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 {
1397 if ((linelen + 3) >= MAXLINESIZE) {
1398 linelen = 0;
1399 if (crlf)
1400 odatalen += 3;
1401 else
1402 odatalen += 2;
1403 }
1404 linelen += 3;
1405 odatalen += 3;
1406 in++;
1407 }
1408 else {
1409 if (istext &&
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001410 ((databuf[in] == '\n') ||
1411 ((in+1 < datalen) && (databuf[in] == '\r') &&
1412 (databuf[in+1] == '\n'))))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 {
1414 linelen = 0;
1415 /* Protect against whitespace on end of line */
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001416 if (in && ((databuf[in-1] == ' ') || (databuf[in-1] == '\t')))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 odatalen += 2;
1418 if (crlf)
1419 odatalen += 2;
1420 else
1421 odatalen += 1;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001422 if (databuf[in] == '\r')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 in += 2;
1424 else
1425 in++;
1426 }
1427 else {
1428 if ((in + 1 != datalen) &&
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001429 (databuf[in+1] != '\n') &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 (linelen + 1) >= MAXLINESIZE) {
1431 linelen = 0;
1432 if (crlf)
1433 odatalen += 3;
1434 else
1435 odatalen += 2;
1436 }
1437 linelen++;
1438 odatalen++;
1439 in++;
1440 }
1441 }
1442 }
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 /* We allocate the output same size as input, this is overkill.
1445 * The previous implementation used calloc() so we'll zero out the
1446 * memory here too, since PyMem_Malloc() does not guarantee that.
1447 */
1448 odata = (unsigned char *) PyMem_Malloc(odatalen);
1449 if (odata == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 PyErr_NoMemory();
1451 return NULL;
1452 }
1453 memset(odata, 0, odatalen);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 in = out = linelen = 0;
1456 while (in < datalen) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001457 if ((databuf[in] > 126) ||
1458 (databuf[in] == '=') ||
1459 (header && databuf[in] == '_') ||
1460 ((databuf[in] == '.') && (linelen == 0) &&
1461 (databuf[in+1] == '\n' || databuf[in+1] == '\r' || databuf[in+1] == 0)) ||
1462 (!istext && ((databuf[in] == '\r') || (databuf[in] == '\n'))) ||
1463 ((databuf[in] == '\t' || databuf[in] == ' ') && (in + 1 == datalen)) ||
1464 ((databuf[in] < 33) &&
1465 (databuf[in] != '\r') && (databuf[in] != '\n') &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 (quotetabs ||
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001467 (!quotetabs && ((databuf[in] != '\t') && (databuf[in] != ' '))))))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 {
1469 if ((linelen + 3 )>= MAXLINESIZE) {
1470 odata[out++] = '=';
1471 if (crlf) odata[out++] = '\r';
1472 odata[out++] = '\n';
1473 linelen = 0;
1474 }
1475 odata[out++] = '=';
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001476 to_hex(databuf[in], &odata[out]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 out += 2;
1478 in++;
1479 linelen += 3;
1480 }
1481 else {
1482 if (istext &&
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001483 ((databuf[in] == '\n') ||
1484 ((in+1 < datalen) && (databuf[in] == '\r') &&
1485 (databuf[in+1] == '\n'))))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 {
1487 linelen = 0;
1488 /* Protect against whitespace on end of line */
1489 if (out && ((odata[out-1] == ' ') || (odata[out-1] == '\t'))) {
1490 ch = odata[out-1];
1491 odata[out-1] = '=';
1492 to_hex(ch, &odata[out]);
1493 out += 2;
1494 }
Tim Peters934c1a12002-07-02 22:24:50 +00001495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 if (crlf) odata[out++] = '\r';
1497 odata[out++] = '\n';
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001498 if (databuf[in] == '\r')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 in += 2;
1500 else
1501 in++;
1502 }
1503 else {
1504 if ((in + 1 != datalen) &&
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001505 (databuf[in+1] != '\n') &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 (linelen + 1) >= MAXLINESIZE) {
1507 odata[out++] = '=';
1508 if (crlf) odata[out++] = '\r';
1509 odata[out++] = '\n';
1510 linelen = 0;
1511 }
1512 linelen++;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001513 if (header && databuf[in] == ' ') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 odata[out++] = '_';
1515 in++;
1516 }
1517 else {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001518 odata[out++] = databuf[in++];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 }
1520 }
1521 }
1522 }
1523 if ((rv = PyBytes_FromStringAndSize((char *)odata, out)) == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 PyMem_Free(odata);
1525 return NULL;
1526 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 PyMem_Free(odata);
1528 return rv;
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001529}
Barry Warsawe977c212000-08-15 06:07:13 +00001530
Jack Jansen72781191995-08-07 14:34:15 +00001531/* List of functions defined in the module */
1532
1533static struct PyMethodDef binascii_module_methods[] = {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001534 BINASCII_A2B_UU_METHODDEF
1535 BINASCII_B2A_UU_METHODDEF
1536 BINASCII_A2B_BASE64_METHODDEF
1537 BINASCII_B2A_BASE64_METHODDEF
1538 BINASCII_A2B_HQX_METHODDEF
1539 BINASCII_B2A_HQX_METHODDEF
1540 BINASCII_A2B_HEX_METHODDEF
1541 BINASCII_B2A_HEX_METHODDEF
Zachary Wareb176d402015-01-20 13:59:46 -06001542 BINASCII_HEXLIFY_METHODDEF
1543 BINASCII_UNHEXLIFY_METHODDEF
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001544 BINASCII_RLECODE_HQX_METHODDEF
1545 BINASCII_RLEDECODE_HQX_METHODDEF
1546 BINASCII_CRC_HQX_METHODDEF
1547 BINASCII_CRC32_METHODDEF
1548 BINASCII_A2B_QP_METHODDEF
1549 BINASCII_B2A_QP_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 {NULL, NULL} /* sentinel */
Jack Jansen72781191995-08-07 14:34:15 +00001551};
1552
1553
Martin v. Löwis1a214512008-06-11 05:26:20 +00001554/* Initialization function for the module (*must* be called PyInit_binascii) */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001555PyDoc_STRVAR(doc_binascii, "Conversion between binary data and ASCII");
Jack Jansen72781191995-08-07 14:34:15 +00001556
Martin v. Löwis1a214512008-06-11 05:26:20 +00001557
1558static struct PyModuleDef binasciimodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 PyModuleDef_HEAD_INIT,
1560 "binascii",
1561 doc_binascii,
1562 -1,
1563 binascii_module_methods,
1564 NULL,
1565 NULL,
1566 NULL,
1567 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001568};
1569
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001570PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001571PyInit_binascii(void)
Jack Jansen72781191995-08-07 14:34:15 +00001572{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 PyObject *m, *d;
Jack Jansen72781191995-08-07 14:34:15 +00001574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 /* Create the module and add the functions */
1576 m = PyModule_Create(&binasciimodule);
1577 if (m == NULL)
1578 return NULL;
Jack Jansen72781191995-08-07 14:34:15 +00001579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 d = PyModule_GetDict(m);
Jack Jansen72781191995-08-07 14:34:15 +00001581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 Error = PyErr_NewException("binascii.Error", PyExc_ValueError, NULL);
1583 PyDict_SetItemString(d, "Error", Error);
1584 Incomplete = PyErr_NewException("binascii.Incomplete", NULL, NULL);
1585 PyDict_SetItemString(d, "Incomplete", Incomplete);
1586 if (PyErr_Occurred()) {
1587 Py_DECREF(m);
1588 m = NULL;
1589 }
1590 return m;
Jack Jansen72781191995-08-07 14:34:15 +00001591}