root/camellia/trunk/block_template.c

Revision 22, 17.2 kB (checked in by sgk, 4 years ago)

block_template.c from "pycrypto-2.0.1.tar.gz"

Line 
1
2/* -*- C -*- */
3/*
4 *  block_template.c : Generic framework for block encryption algorithms
5 *
6 * Distribute and use freely; there are no restrictions on further
7 * dissemination and usage except those imposed by the laws of your
8 * country of residence.  This software is provided "as is" without
9 * warranty of fitness for use or suitability for any purpose, express
10 * or implied. Use at your own risk or not at all.
11 *
12 */
13
14
15#ifdef HAVE_CONFIG_H
16#include "config.h"
17#endif
18
19#ifdef _HAVE_STDC_HEADERS
20#include <string.h>
21#endif
22
23#include "Python.h"
24#include "modsupport.h"
25
26/* Cipher operation modes */
27
28#define MODE_ECB 1
29#define MODE_CBC 2
30#define MODE_CFB 3
31#define MODE_PGP 4
32#define MODE_OFB 5
33#define MODE_CTR 6
34
35#define _STR(x) #x
36#define _XSTR(x) _STR(x)
37#define _PASTE(x,y) x##y
38#define _PASTE2(x,y) _PASTE(x,y)
39#define _MODULE_NAME _PASTE2(init,MODULE_NAME)
40#define _MODULE_STRING _XSTR(MODULE_NAME)
41
42typedef struct 
43{
44        PyObject_HEAD
45        int mode, count, segment_size;
46        unsigned char IV[BLOCK_SIZE], oldCipher[BLOCK_SIZE];
47        PyObject *counter;
48        block_state st;
49} ALGobject;
50
51staticforward PyTypeObject ALGtype;
52
53#define is_ALGobject(v)         ((v)->ob_type == &ALGtype)
54
55static ALGobject *
56newALGobject(void)
57{
58        ALGobject * new;
59        new = PyObject_New(ALGobject, &ALGtype);
60        new->mode = MODE_ECB;
61        new->counter = NULL;
62        return new;
63}
64
65static void
66ALGdealloc(PyObject *ptr)
67{               
68        ALGobject *self = (ALGobject *)ptr;
69
70        /* Overwrite the contents of the object */
71        Py_XDECREF(self->counter);
72        self->counter = NULL;
73        memset(self->IV, 0, BLOCK_SIZE);
74        memset(self->oldCipher, 0, BLOCK_SIZE);
75        memset((char*)&(self->st), 0, sizeof(block_state));
76        self->mode = self->count = self->segment_size = 0;
77        PyObject_Del(ptr);
78}
79
80
81static char ALGnew__doc__[] = 
82"new(key, [mode], [IV]): Return a new " _MODULE_STRING " encryption object.";
83
84static char *kwlist[] = {"key", "mode", "IV", "counter", "segment_size",
85#ifdef PCT_RC5_MODULE
86                         "version", "word_size", "rounds",
87#endif
88                         NULL};
89
90static ALGobject *
91ALGnew(PyObject *self, PyObject *args, PyObject *kwdict)
92{
93        unsigned char *key, *IV;
94        ALGobject * new=NULL;
95        int keylen, IVlen=0, mode=MODE_ECB, segment_size=0;
96        PyObject *counter = NULL;
97#ifdef PCT_RC5_MODULE
98        int version = 0x10, word_size = 32, rounds = 16; /*XXX default rounds? */
99#endif
100        /* Set default values */
101        if (!PyArg_ParseTupleAndKeywords(args, kwdict, "s#|is#Oi"
102#ifdef PCT_RC5_MODULE
103                                         "iii"
104#endif
105                                         , kwlist,
106                                         &key, &keylen, &mode, &IV, &IVlen,
107                                         &counter, &segment_size
108#ifdef PCT_RC5_MODULE
109                                         , &version, &word_size, &rounds
110#endif
111                )) 
112        {
113                return NULL;
114        }
115
116        if (KEY_SIZE!=0 && keylen!=KEY_SIZE)
117        {
118                PyErr_Format(PyExc_ValueError, 
119                             "Key must be %i bytes long, not %i",
120                             KEY_SIZE, keylen);
121                return NULL;
122        }
123        if (KEY_SIZE==0 && keylen==0)
124        {
125                PyErr_SetString(PyExc_ValueError, 
126                                "Key cannot be the null string");
127                return NULL;
128        }
129        if (IVlen != BLOCK_SIZE && IVlen != 0)
130        {
131                PyErr_Format(PyExc_ValueError, 
132                             "IV must be %i bytes long", BLOCK_SIZE);
133                return NULL;
134        }
135        if (mode<MODE_ECB || mode>MODE_CTR) 
136        {
137                PyErr_Format(PyExc_ValueError, 
138                             "Unknown cipher feedback mode %i",
139                             mode);
140                return NULL;
141        }
142
143        /* Mode-specific checks */
144        if (mode == MODE_CFB) {
145                if (segment_size == 0) segment_size = 8;
146                if (segment_size < 1 || segment_size > BLOCK_SIZE*8) {
147                        PyErr_Format(PyExc_ValueError, 
148                                     "segment_size must be multiple of 8 "
149                                     "between 1 and %i", BLOCK_SIZE);
150                }
151        }
152
153        if (mode == MODE_CTR) {
154                if (!PyCallable_Check(counter)) {
155                        PyErr_SetString(PyExc_ValueError, 
156                                        "'counter' parameter must be a callable object");
157                }
158        } else {
159                if (counter != NULL) {
160                        PyErr_SetString(PyExc_ValueError, 
161                                        "'counter' parameter only useful with CTR mode");
162                }
163        }
164
165        /* Cipher-specific checks */
166#ifdef PCT_RC5_MODULE
167        if (version!=0x10) {
168                PyErr_Format(PyExc_ValueError,
169                             "RC5: Bad RC5 algorithm version: %i",
170                             version);
171                return NULL;
172        }
173        if (word_size!=16 && word_size!=32) {
174                PyErr_Format(PyExc_ValueError,
175                             "RC5: Unsupported word size: %i",
176                             word_size);
177                return NULL;
178        }
179        if (rounds<0 || 255<rounds) {
180                PyErr_Format(PyExc_ValueError,
181                             "RC5: rounds must be between 0 and 255, not %i",
182                             rounds);
183                return NULL;
184        }
185#endif
186
187        /* Copy parameters into object */
188        new = newALGobject();
189        new->segment_size = segment_size;
190        new->counter = counter;
191        Py_XINCREF(counter);
192#ifdef PCT_RC5_MODULE
193        new->st.version = version;
194        new->st.word_size = word_size;
195        new->st.rounds = rounds;
196#endif
197
198        block_init(&(new->st), key, keylen);
199        if (PyErr_Occurred())
200        {
201                Py_DECREF(new);
202                return NULL;
203        }
204        memset(new->IV, 0, BLOCK_SIZE);
205        memset(new->oldCipher, 0, BLOCK_SIZE);
206        memcpy(new->IV, IV, IVlen);
207        new->mode = mode;
208        new->count=8;
209        return new;
210}
211
212static char ALG_Encrypt__doc__[] =
213"Encrypt the provided string of binary data.";
214
215static PyObject *
216ALG_Encrypt(ALGobject *self, PyObject *args)
217{
218        unsigned char *buffer, *str;
219        unsigned char temp[BLOCK_SIZE];
220        int i, j, len;
221        PyObject *result;
222 
223        if (!PyArg_Parse(args, "s#", &str, &len))
224                return NULL;
225        if (len==0)                     /* Handle empty string */
226        {
227                return PyString_FromStringAndSize(NULL, 0);
228        }
229        if ( (len % BLOCK_SIZE) !=0 && 
230             (self->mode!=MODE_CFB) && (self->mode!=MODE_PGP))
231        {
232                PyErr_Format(PyExc_ValueError, 
233                             "Input strings must be "
234                             "a multiple of %i in length",
235                             BLOCK_SIZE);
236                return NULL;
237        }
238        if (self->mode == MODE_CFB && 
239            (len % (self->segment_size/8) !=0)) {
240                PyErr_Format(PyExc_ValueError, 
241                             "Input strings must be a multiple of "
242                             "the segment size %i in length",
243                             self->segment_size/8);
244                return NULL;
245        }
246
247        buffer=malloc(len);
248        if (buffer==NULL) 
249        {
250                PyErr_SetString(PyExc_MemoryError, 
251                                "No memory available in "
252                                _MODULE_STRING " encrypt");
253                return NULL;
254        }
255        switch(self->mode)
256        {
257        case(MODE_ECB):     
258                for(i=0; i<len; i+=BLOCK_SIZE) 
259                {
260                        block_encrypt(&(self->st), str+i, buffer+i);
261                }
262                break;
263
264        case(MODE_CBC):     
265                for(i=0; i<len; i+=BLOCK_SIZE) 
266                {
267                        for(j=0; j<BLOCK_SIZE; j++)
268                        {
269                                temp[j]=str[i+j]^self->IV[j];
270                        }
271                        block_encrypt(&(self->st), temp, buffer+i);
272                        memcpy(self->IV, buffer+i, BLOCK_SIZE);
273                }
274                break;
275
276        case(MODE_CFB):     
277                for(i=0; i<len; i+=self->segment_size/8) 
278                {
279                        block_encrypt(&(self->st), self->IV, temp);
280                        for (j=0; j<self->segment_size/8; j++) {
281                                buffer[i+j] = str[i+j] ^ temp[j];
282                        }
283                        if (self->segment_size == BLOCK_SIZE * 8) {
284                                /* s == b: segment size is identical to
285                                   the algorithm block size */
286                                memcpy(self->IV, buffer + i, BLOCK_SIZE);
287                        }
288                        else if ((self->segment_size % 8) == 0) {
289                                int sz = self->segment_size/8;
290                                memmove(self->IV, self->IV + sz, 
291                                        BLOCK_SIZE-sz);
292                                memcpy(self->IV + BLOCK_SIZE - sz, buffer + i,
293                                       sz);
294                        }
295                        else {
296                                /* segment_size is not a multiple of 8;
297                                   currently this can't happen */
298                        }
299                }
300                break;
301
302        case(MODE_PGP):
303                if (len<=BLOCK_SIZE-self->count) 
304                {                       
305                        /* If less than one block, XOR it in */
306                        for(i=0; i<len; i++) 
307                                buffer[i] = self->IV[self->count+i] ^= str[i];
308                        self->count += len;
309                }
310                else 
311                {
312                        int j;
313                        for(i=0; i<BLOCK_SIZE-self->count; i++) 
314                                buffer[i] = self->IV[self->count+i] ^= str[i];
315                        self->count=0;
316                        for(; i<len-BLOCK_SIZE; i+=BLOCK_SIZE) 
317                        {
318                                block_encrypt(&(self->st), self->oldCipher, 
319                                              self->IV);
320                                for(j=0; j<BLOCK_SIZE; j++)
321                                        buffer[i+j] = self->IV[j] ^= str[i+j];
322                        }
323                        /* Do the remaining 1 to BLOCK_SIZE bytes */
324                        block_encrypt(&(self->st), self->oldCipher, self->IV);
325                        self->count=len-i;
326                        for(j=0; j<len-i; j++) 
327                        {
328                                buffer[i+j] = self->IV[j] ^= str[i+j];
329                        }
330                }
331                break;
332
333        case(MODE_OFB):
334                for(i=0; i<len; i+=BLOCK_SIZE) 
335                {
336                        block_encrypt(&(self->st), self->IV, temp);
337                        memcpy(self->IV, temp, BLOCK_SIZE);
338                        for(j=0; j<BLOCK_SIZE; j++)
339                        {
340                                buffer[i+j] = str[i+j] ^ temp[j];
341                        }
342                }     
343                break;
344
345        case(MODE_CTR):
346                for(i=0; i<len; i+=BLOCK_SIZE) 
347                {
348                        PyObject *ctr = PyObject_CallObject(self->counter, NULL);
349                        if (ctr == NULL) {
350                                free(buffer);
351                                return NULL;
352                        }
353                        if (!PyString_Check(ctr))
354                        {
355                                PyErr_SetString(PyExc_TypeError, 
356                                                "CTR counter function didn't return a string");
357                                Py_DECREF(ctr);
358                                free(buffer);
359                                return NULL;
360                        }
361                        if (PyString_Size(ctr) != BLOCK_SIZE) {
362                                PyErr_Format(PyExc_TypeError, 
363                                             "CTR counter function returned "
364                                             "string not of length %i",
365                                             BLOCK_SIZE);
366                                Py_DECREF(ctr);
367                                free(buffer);
368                                return NULL;
369                        }
370                        block_encrypt(&(self->st), PyString_AsString(ctr), 
371                                      temp);
372                        Py_DECREF(ctr);
373                        for(j=0; j<BLOCK_SIZE; j++)
374                        {
375                                buffer[i+j] = str[i+j]^temp[j];
376                        }
377                }
378                break;
379
380        default:
381                PyErr_Format(PyExc_SystemError, 
382                             "Unknown ciphertext feedback mode %i; "
383                             "this shouldn't happen",
384                             self->mode);
385                free(buffer);
386                return NULL;
387        }
388        result=PyString_FromStringAndSize(buffer, len);
389        free(buffer);
390        return(result);
391}
392
393static char ALG_Decrypt__doc__[] =
394"decrypt(string): Decrypt the provided string of binary data.";
395
396
397static PyObject *
398ALG_Decrypt(ALGobject *self, PyObject *args)
399{
400        unsigned char *buffer, *str;
401        unsigned char temp[BLOCK_SIZE];
402        int i, j, len;
403        PyObject *result;
404 
405        if (!PyArg_Parse(args, "s#", &str, &len))
406                return NULL;
407        if (len==0)                     /* Handle empty string */
408        {
409                return PyString_FromStringAndSize(NULL, 0);
410        }
411        if ( (len % BLOCK_SIZE) !=0 && 
412             (self->mode!=MODE_CFB && self->mode!=MODE_PGP))
413        {
414                PyErr_Format(PyExc_ValueError, 
415                             "Input strings must be "
416                             "a multiple of %i in length",
417                             BLOCK_SIZE);
418                return NULL;
419        }
420        if (self->mode == MODE_CFB && 
421            (len % (self->segment_size/8) !=0)) {
422                PyErr_Format(PyExc_ValueError, 
423                             "Input strings must be a multiple of "
424                             "the segment size %i in length",
425                             self->segment_size/8);
426                return NULL;
427        }
428        buffer=malloc(len);
429        if (buffer==NULL) 
430        {
431                PyErr_SetString(PyExc_MemoryError, 
432                                "No memory available in " _MODULE_STRING
433                                " decrypt");
434                return NULL;
435        }
436        switch(self->mode)
437        {
438        case(MODE_ECB):     
439                for(i=0; i<len; i+=BLOCK_SIZE) 
440                {
441                        block_decrypt(&(self->st), str+i, buffer+i);
442                }
443                break;
444
445        case(MODE_CBC):     
446                for(i=0; i<len; i+=BLOCK_SIZE) 
447                {
448                        memcpy(self->oldCipher, self->IV, BLOCK_SIZE);
449                        block_decrypt(&(self->st), str+i, temp);
450                        for(j=0; j<BLOCK_SIZE; j++) 
451                        {
452                                buffer[i+j]=temp[j]^self->IV[j];
453                                self->IV[j]=str[i+j];
454                        }
455                }
456                break;
457
458        case(MODE_CFB):     
459                for(i=0; i<len; i+=self->segment_size/8) 
460                {
461                        block_encrypt(&(self->st), self->IV, temp);
462                        for (j=0; j<self->segment_size/8; j++) {
463                                buffer[i+j] = str[i+j]^temp[j];
464                        }
465                        if (self->segment_size == BLOCK_SIZE * 8) {
466                                /* s == b: segment size is identical to
467                                   the algorithm block size */
468                                memcpy(self->IV, str + i, BLOCK_SIZE);
469                        }
470                        else if ((self->segment_size % 8) == 0) {
471                                int sz = self->segment_size/8;
472                                memmove(self->IV, self->IV + sz, 
473                                        BLOCK_SIZE-sz);
474                                memcpy(self->IV + BLOCK_SIZE - sz, str + i, 
475                                       sz);
476                        }
477                        else {
478                                /* segment_size is not a multiple of 8;
479                                   currently this can't happen */
480                        }
481                }
482                break;
483
484        case(MODE_PGP):
485                if (len<=BLOCK_SIZE-self->count) 
486                {                       
487                        /* If less than one block, XOR it in */
488                        unsigned char t;
489                        for(i=0; i<len; i++)
490                        {
491                                t=self->IV[self->count+i];
492                                buffer[i] = t ^ (self->IV[self->count+i] = str[i]);
493                        }
494                        self->count += len;
495                }
496                else 
497                {
498                        int j;
499                        unsigned char t;
500                        for(i=0; i<BLOCK_SIZE-self->count; i++) 
501                        {
502                                t=self->IV[self->count+i];
503                                buffer[i] = t ^ (self->IV[self->count+i] = str[i]);
504                        }
505                        self->count=0;
506                        for(; i<len-BLOCK_SIZE; i+=BLOCK_SIZE) 
507                        {
508                                block_encrypt(&(self->st), self->oldCipher, self->IV);
509                                for(j=0; j<BLOCK_SIZE; j++)
510                                {
511                                        t=self->IV[j];
512                                        buffer[i+j] = t ^ (self->IV[j] = str[i+j]);
513                                }
514                        }
515                        /* Do the remaining 1 to BLOCK_SIZE bytes */
516                        block_encrypt(&(self->st), self->oldCipher, self->IV);
517                        self->count=len-i;
518                        for(j=0; j<len-i; j++) 
519                        {
520                                t=self->IV[j];
521                                buffer[i+j] = t ^ (self->IV[j] = str[i+j]);
522                        }
523                }
524                break;
525
526        case (MODE_OFB):
527                for(i=0; i<len; i+=BLOCK_SIZE) 
528                {
529                        block_encrypt(&(self->st), self->IV, temp);
530                        memcpy(self->IV, temp, BLOCK_SIZE);
531                        for(j=0; j<BLOCK_SIZE; j++)
532                        {
533                                buffer[i+j] = str[i+j] ^ self->IV[j];
534                        }
535                }     
536                break;
537
538        case (MODE_CTR):
539                for(i=0; i<len; i+=BLOCK_SIZE) 
540                {
541                        PyObject *ctr = PyObject_CallObject(self->counter, NULL);
542                        if (ctr == NULL) {
543                                free(buffer);
544                                return NULL;
545                        }
546                        if (!PyString_Check(ctr))
547                        {
548                                PyErr_SetString(PyExc_TypeError, 
549                                                "CTR counter function didn't return a string");
550                                Py_DECREF(ctr);
551                                free(buffer);
552                                return NULL;
553                        }
554                        if (PyString_Size(ctr) != BLOCK_SIZE) {
555                                PyErr_SetString(PyExc_TypeError, 
556                                                "CTR counter function returned string of incorrect length");
557                                Py_DECREF(ctr);
558                                free(buffer);
559                                return NULL;
560                        }
561                        block_encrypt(&(self->st), PyString_AsString(ctr), temp);
562                        Py_DECREF(ctr);
563                        for(j=0; j<BLOCK_SIZE; j++)
564                        {
565                                buffer[i+j] = str[i+j]^temp[j];
566                        }
567                }
568                break;
569
570        default:
571                PyErr_Format(PyExc_SystemError, 
572                             "Unknown ciphertext feedback mode %i; "
573                             "this shouldn't happen",
574                             self->mode);
575                free(buffer);
576                return NULL;
577        }
578        result=PyString_FromStringAndSize(buffer, len);
579        free(buffer);
580        return(result);
581}
582
583static char ALG_Sync__doc__[] =
584"sync(): For objects using the PGP feedback mode, this method modifies "
585"the IV, synchronizing it with the preceding ciphertext.";
586
587static PyObject *
588ALG_Sync(ALGobject *self, PyObject *args)
589{
590        if (!PyArg_ParseTuple(args, "")) {
591                return NULL;
592        }
593
594        if (self->mode!=MODE_PGP) 
595        {
596                PyErr_SetString(PyExc_SystemError, "sync() operation not defined for "
597                                "this feedback mode");
598                return NULL;
599        }
600       
601        if (self->count!=8) 
602        {
603                memmove(self->IV+BLOCK_SIZE-self->count, self->IV, 
604                        self->count);
605                memcpy(self->IV, self->oldCipher+self->count, 
606                       BLOCK_SIZE-self->count);
607                self->count=8;
608        }
609        Py_INCREF(Py_None);
610        return Py_None;
611}
612
613#if 0
614void PrintState(self, msg)
615     ALGobject *self;
616     char * msg;
617{
618  int count;
619 
620  printf("%sing: %i IV ", msg, (int)self->count);
621  for(count=0; count<8; count++) printf("%i ", self->IV[count]);
622  printf("\noldCipher:");
623  for(count=0; count<8; count++) printf("%i ", self->oldCipher[count]);
624  printf("\n");
625}
626#endif
627
628
629/* ALG object methods */
630
631static PyMethodDef ALGmethods[] =
632{
633 {"encrypt", (PyCFunction) ALG_Encrypt, 0, ALG_Encrypt__doc__},
634 {"decrypt", (PyCFunction) ALG_Decrypt, 0, ALG_Decrypt__doc__},
635 {"sync", (PyCFunction) ALG_Sync, METH_VARARGS, ALG_Sync__doc__},
636 {NULL, NULL}                   /* sentinel */
637};
638
639
640static int
641ALGsetattr(PyObject *ptr, char *name, PyObject *v)
642{
643  ALGobject *self=(ALGobject *)ptr;
644  if (strcmp(name, "IV") != 0) 
645    {
646      PyErr_Format(PyExc_AttributeError,
647                   "non-existent block cipher object attribute '%s'",
648                   name);
649      return -1;
650    }
651  if (v==NULL)
652    {
653      PyErr_SetString(PyExc_AttributeError,
654                      "Can't delete IV attribute of block cipher object");
655      return -1;
656    }
657  if (!PyString_Check(v))
658    {
659      PyErr_SetString(PyExc_TypeError,
660                      "IV attribute of block cipher object must be string");
661      return -1;
662    }
663  if (PyString_Size(v)!=BLOCK_SIZE) 
664    {
665      PyErr_Format(PyExc_ValueError, 
666                   _MODULE_STRING " IV must be %i bytes long",
667                   BLOCK_SIZE);
668      return -1;
669    }
670  memcpy(self->IV, PyString_AsString(v), BLOCK_SIZE);
671  return 0;
672}
673
674static PyObject *
675ALGgetattr(PyObject *s, char *name)
676{
677  ALGobject *self = (ALGobject*)s;
678  if (strcmp(name, "IV") == 0) 
679    {
680      return(PyString_FromStringAndSize(self->IV, BLOCK_SIZE));
681    }
682  if (strcmp(name, "mode") == 0)
683     {
684       return(PyInt_FromLong((long)(self->mode)));
685     }
686  if (strcmp(name, "block_size") == 0)
687     {
688       return PyInt_FromLong(BLOCK_SIZE);
689     }
690  if (strcmp(name, "key_size") == 0)
691     {
692       return PyInt_FromLong(KEY_SIZE);
693     }
694 return Py_FindMethod(ALGmethods, (PyObject *) self, name);
695}
696
697/* List of functions defined in the module */
698
699static struct PyMethodDef modulemethods[] =
700{
701 {"new", (PyCFunction) ALGnew, METH_VARARGS|METH_KEYWORDS, ALGnew__doc__},
702 {NULL, NULL}                   /* sentinel */
703};
704
705static PyTypeObject ALGtype =
706{
707        PyObject_HEAD_INIT(NULL)
708        0,                              /*ob_size*/
709        _MODULE_STRING,         /*tp_name*/
710        sizeof(ALGobject),      /*tp_size*/
711        0,                              /*tp_itemsize*/
712        /* methods */
713        ALGdealloc,     /*tp_dealloc*/
714        0,                              /*tp_print*/
715        ALGgetattr,     /*tp_getattr*/
716        ALGsetattr,    /*tp_setattr*/
717        0,                      /*tp_compare*/
718        (reprfunc) 0,                   /*tp_repr*/
719        0,                              /*tp_as_number*/
720};
721
722/* Initialization function for the module */
723
724#if PYTHON_API_VERSION < 1011
725#define PyModule_AddIntConstant(m,n,v) {PyObject *o=PyInt_FromLong(v); \
726           if (o!=NULL) \
727             {PyDict_SetItemString(PyModule_GetDict(m),n,o); Py_DECREF(o);}}
728#endif
729
730void
731_MODULE_NAME (void)
732{
733        PyObject *m;
734
735        ALGtype.ob_type = &PyType_Type;
736
737        /* Create the module and add the functions */
738        m = Py_InitModule("Crypto.Cipher." _MODULE_STRING, modulemethods);
739
740        PyModule_AddIntConstant(m, "MODE_ECB", MODE_ECB);
741        PyModule_AddIntConstant(m, "MODE_CBC", MODE_CBC);
742        PyModule_AddIntConstant(m, "MODE_CFB", MODE_CFB);
743        PyModule_AddIntConstant(m, "MODE_PGP", MODE_PGP);
744        PyModule_AddIntConstant(m, "MODE_OFB", MODE_OFB);
745        PyModule_AddIntConstant(m, "MODE_CTR", MODE_CTR);
746        PyModule_AddIntConstant(m, "block_size", BLOCK_SIZE);
747        PyModule_AddIntConstant(m, "key_size", KEY_SIZE);
748
749        /* Check for errors */
750        if (PyErr_Occurred())
751                Py_FatalError("can't initialize module " _MODULE_STRING);
752}
Note: See TracBrowser for help on using the browser.