[Pymoul-svn] SF.net SVN: pymoul: [219] xtea/trunk
Status: Alpha
Brought to you by:
tiran
From: <ti...@us...> - 2007-03-01 16:25:42
|
Revision: 219 http://pymoul.svn.sourceforge.net/pymoul/?rev=219&view=rev Author: tiran Date: 2007-03-01 08:25:39 -0800 (Thu, 01 Mar 2007) Log Message: ----------- PEP 272 conform XTEA module with pyrex/c optimization Modified Paths: -------------- xtea/trunk/Makefile xtea/trunk/setup.py xtea/trunk/src/xtea/__init__.py xtea/trunk/src/xtea/_xtea.c xtea/trunk/src/xtea/_xtea.pyx xtea/trunk/src/xtea/xtea.py Added Paths: ----------- xtea/trunk/src/xtea/cxtea.c xtea/trunk/src/xtea/cxtea.h Modified: xtea/trunk/Makefile =================================================================== --- xtea/trunk/Makefile 2007-02-28 12:13:59 UTC (rev 218) +++ xtea/trunk/Makefile 2007-03-01 16:25:39 UTC (rev 219) @@ -9,15 +9,12 @@ all: inplace # Build in-place -inplace: pyrex +inplace: $(PYTHON) setup.py $(SETUPFLAGS) build_ext -i -build: pyrex +build: $(PYTHON) setup.py $(SETUPFLAGS) build -pyrex: - pyrexc src/xtea/_xtea.pyx - egg24: $(PYTHON24) setup.py $(SETUPFLAGS) bdist_egg Modified: xtea/trunk/setup.py =================================================================== --- xtea/trunk/setup.py 2007-02-28 12:13:59 UTC (rev 218) +++ xtea/trunk/setup.py 2007-03-01 16:25:39 UTC (rev 219) @@ -38,9 +38,10 @@ me = "Christian Heimes" email = "chr...@ch..." +cxtea = Extension('xtea._xtea', ['src/xtea/_xtea.pyx', 'src/xtea/cxtea.c']) ext_modules = [] if os.name == 'posix': - ext_modules.append(Extension('xtea._xtea', ['src/xtea/_xtea.c'])) + ext_modules.append(cxtea) setup_infos = dict( name = "xtea", Modified: xtea/trunk/src/xtea/__init__.py =================================================================== --- xtea/trunk/src/xtea/__init__.py 2007-02-28 12:13:59 UTC (rev 218) +++ xtea/trunk/src/xtea/__init__.py 2007-03-01 16:25:39 UTC (rev 219) @@ -1,6 +1,7 @@ # xtea package -from xtea import crypt -from xtea import xtea_encrypt -from xtea import xtea_encryptQuad -from xtea import xtea_decrypt -from xtea import xtea_decryptQuad +from xtea import new +from xtea import MODE_ECB +from xtea import MODE_OFB +from xtea import BIG_ENDIAN +from xtea import LITTLE_ENDIAN +from xtea import NETWORK_ENDIAN Modified: xtea/trunk/src/xtea/_xtea.c =================================================================== --- xtea/trunk/src/xtea/_xtea.c 2007-02-28 12:13:59 UTC (rev 218) +++ xtea/trunk/src/xtea/_xtea.c 2007-03-01 16:25:39 UTC (rev 219) @@ -1,4 +1,4 @@ -/* Generated by Pyrex 0.9.4.1 on Wed Feb 28 12:58:37 2007 */ +/* Generated by Pyrex 0.9.4.1 on Thu Mar 1 15:44:44 2007 */ #include "Python.h" #include "structmember.h" @@ -11,6 +11,7 @@ #define __PYX_EXTERN_C extern #endif __PYX_EXTERN_C double pow(double, double); +#include "cxtea.h" typedef struct {PyObject **p; char *s;} __Pyx_InternTabEntry; /*proto*/ @@ -47,6 +48,11 @@ /* Implementation of _xtea */ +static PyObject *__pyx_n_MODE_ECB; +static PyObject *__pyx_n_MODE_CBC; +static PyObject *__pyx_n_MODE_CFB; +static PyObject *__pyx_n_MODE_OFB; +static PyObject *__pyx_n_MODE_CTR; static PyObject *__pyx_n__c_xtea_encryptQuad; static PyObject *__pyx_n__c_xtea_decryptQuad; @@ -55,97 +61,74 @@ unsigned long __pyx_v_v0; unsigned long __pyx_v_v1; PyObject *__pyx_v_key = 0; - int __pyx_v_rounds; - int __pyx_v_i; - unsigned long __pyx_v_delta; - unsigned long __pyx_v_sum; + unsigned int __pyx_v_rounds; + unsigned long (__pyx_v_v[2]); + unsigned long (__pyx_v_k[4]); PyObject *__pyx_v_result; PyObject *__pyx_r; PyObject *__pyx_1 = 0; PyObject *__pyx_2 = 0; - PyObject *__pyx_3 = 0; + unsigned long __pyx_3; PyObject *__pyx_4 = 0; - PyObject *__pyx_5 = 0; - unsigned long __pyx_6; static char *__pyx_argnames[] = {"v0","v1","key","rounds",0}; - if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "kkOi", __pyx_argnames, &__pyx_v_v0, &__pyx_v_v1, &__pyx_v_key, &__pyx_v_rounds)) return 0; + if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "kkOI", __pyx_argnames, &__pyx_v_v0, &__pyx_v_v1, &__pyx_v_key, &__pyx_v_rounds)) return 0; Py_INCREF(__pyx_v_key); __pyx_v_result = Py_None; Py_INCREF(Py_None); - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":11 */ - __pyx_v_delta = 2654435769; + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":24 */ + (__pyx_v_v[0]) = __pyx_v_v0; - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":12 */ - __pyx_v_sum = 0; + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":24 */ + (__pyx_v_v[1]) = __pyx_v_v1; - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":13 */ - __pyx_1 = PyList_New(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; goto __pyx_L1;} - Py_DECREF(__pyx_v_result); - __pyx_v_result = __pyx_1; - __pyx_1 = 0; + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":25 */ + __pyx_1 = PyInt_FromLong(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; goto __pyx_L1;} + __pyx_2 = PyObject_GetItem(__pyx_v_key, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; goto __pyx_L1;} + Py_DECREF(__pyx_1); __pyx_1 = 0; + __pyx_3 = PyInt_AsUnsignedLongMask(__pyx_2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; goto __pyx_L1;} + Py_DECREF(__pyx_2); __pyx_2 = 0; + (__pyx_v_k[0]) = __pyx_3; - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":15 */ - for (__pyx_v_i = 0; __pyx_v_i < __pyx_v_rounds; ++__pyx_v_i) { + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":25 */ + __pyx_1 = PyInt_FromLong(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; goto __pyx_L1;} + __pyx_2 = PyObject_GetItem(__pyx_v_key, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; goto __pyx_L1;} + Py_DECREF(__pyx_1); __pyx_1 = 0; + __pyx_3 = PyInt_AsUnsignedLongMask(__pyx_2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; goto __pyx_L1;} + Py_DECREF(__pyx_2); __pyx_2 = 0; + (__pyx_v_k[1]) = __pyx_3; - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":16 */ - __pyx_1 = PyLong_FromUnsignedLong(__pyx_v_v0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; goto __pyx_L1;} - __pyx_2 = PyLong_FromUnsignedLong((((__pyx_v_v1 << 4) ^ (__pyx_v_v1 >> 5)) + __pyx_v_v1)); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; goto __pyx_L1;} - __pyx_3 = PyLong_FromUnsignedLong(__pyx_v_sum); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; goto __pyx_L1;} - __pyx_4 = PyLong_FromUnsignedLong((__pyx_v_sum & 3)); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; goto __pyx_L1;} - __pyx_5 = PyObject_GetItem(__pyx_v_key, __pyx_4); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; goto __pyx_L1;} - Py_DECREF(__pyx_4); __pyx_4 = 0; - __pyx_4 = PyNumber_Add(__pyx_3, __pyx_5); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; goto __pyx_L1;} - Py_DECREF(__pyx_3); __pyx_3 = 0; - Py_DECREF(__pyx_5); __pyx_5 = 0; - __pyx_3 = PyNumber_Xor(__pyx_2, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; goto __pyx_L1;} - Py_DECREF(__pyx_2); __pyx_2 = 0; - Py_DECREF(__pyx_4); __pyx_4 = 0; - __pyx_5 = PyNumber_Add(__pyx_1, __pyx_3); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; goto __pyx_L1;} - Py_DECREF(__pyx_1); __pyx_1 = 0; - Py_DECREF(__pyx_3); __pyx_3 = 0; - __pyx_6 = PyInt_AsUnsignedLongMask(__pyx_5); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; goto __pyx_L1;} - Py_DECREF(__pyx_5); __pyx_5 = 0; - __pyx_v_v0 = __pyx_6; + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":25 */ + __pyx_1 = PyInt_FromLong(2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; goto __pyx_L1;} + __pyx_2 = PyObject_GetItem(__pyx_v_key, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; goto __pyx_L1;} + Py_DECREF(__pyx_1); __pyx_1 = 0; + __pyx_3 = PyInt_AsUnsignedLongMask(__pyx_2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; goto __pyx_L1;} + Py_DECREF(__pyx_2); __pyx_2 = 0; + (__pyx_v_k[2]) = __pyx_3; - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":17 */ - __pyx_v_sum = (__pyx_v_sum + __pyx_v_delta); + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":25 */ + __pyx_1 = PyInt_FromLong(3); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; goto __pyx_L1;} + __pyx_2 = PyObject_GetItem(__pyx_v_key, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; goto __pyx_L1;} + Py_DECREF(__pyx_1); __pyx_1 = 0; + __pyx_3 = PyInt_AsUnsignedLongMask(__pyx_2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; goto __pyx_L1;} + Py_DECREF(__pyx_2); __pyx_2 = 0; + (__pyx_v_k[3]) = __pyx_3; - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":18 */ - __pyx_2 = PyLong_FromUnsignedLong(__pyx_v_v1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; goto __pyx_L1;} - __pyx_4 = PyLong_FromUnsignedLong((((__pyx_v_v0 << 4) ^ (__pyx_v_v0 >> 5)) + __pyx_v_v0)); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; goto __pyx_L1;} - __pyx_1 = PyLong_FromUnsignedLong(__pyx_v_sum); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; goto __pyx_L1;} - __pyx_3 = PyLong_FromUnsignedLong(((__pyx_v_sum >> 11) & 3)); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; goto __pyx_L1;} - __pyx_5 = PyObject_GetItem(__pyx_v_key, __pyx_3); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; goto __pyx_L1;} - Py_DECREF(__pyx_3); __pyx_3 = 0; - __pyx_3 = PyNumber_Add(__pyx_1, __pyx_5); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; goto __pyx_L1;} - Py_DECREF(__pyx_1); __pyx_1 = 0; - Py_DECREF(__pyx_5); __pyx_5 = 0; - __pyx_1 = PyNumber_Xor(__pyx_4, __pyx_3); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; goto __pyx_L1;} - Py_DECREF(__pyx_4); __pyx_4 = 0; - Py_DECREF(__pyx_3); __pyx_3 = 0; - __pyx_5 = PyNumber_Add(__pyx_2, __pyx_1); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; goto __pyx_L1;} - Py_DECREF(__pyx_2); __pyx_2 = 0; - Py_DECREF(__pyx_1); __pyx_1 = 0; - __pyx_6 = PyInt_AsUnsignedLongMask(__pyx_5); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; goto __pyx_L1;} - Py_DECREF(__pyx_5); __pyx_5 = 0; - __pyx_v_v1 = __pyx_6; - __pyx_L2:; - } - __pyx_L3:; + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":26 */ + encipher(__pyx_v_v,__pyx_v_k,__pyx_v_rounds); - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":20 */ - __pyx_4 = PyLong_FromUnsignedLong(__pyx_v_v0); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; goto __pyx_L1;} - __pyx_3 = PyLong_FromUnsignedLong(__pyx_v_v1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; goto __pyx_L1;} - __pyx_2 = PyList_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; goto __pyx_L1;} - PyList_SET_ITEM(__pyx_2, 0, __pyx_4); - PyList_SET_ITEM(__pyx_2, 1, __pyx_3); - __pyx_4 = 0; - __pyx_3 = 0; - Py_DECREF(__pyx_v_result); - __pyx_v_result = __pyx_2; + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":27 */ + __pyx_1 = PyLong_FromUnsignedLong((__pyx_v_v[0])); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; goto __pyx_L1;} + __pyx_2 = PyLong_FromUnsignedLong((__pyx_v_v[1])); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; goto __pyx_L1;} + __pyx_4 = PyList_New(2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; goto __pyx_L1;} + PyList_SET_ITEM(__pyx_4, 0, __pyx_1); + PyList_SET_ITEM(__pyx_4, 1, __pyx_2); + __pyx_1 = 0; __pyx_2 = 0; + Py_DECREF(__pyx_v_result); + __pyx_v_result = __pyx_4; + __pyx_4 = 0; - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":21 */ + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":28 */ Py_INCREF(__pyx_v_result); __pyx_r = __pyx_v_result; goto __pyx_L0; @@ -155,9 +138,7 @@ __pyx_L1:; Py_XDECREF(__pyx_1); Py_XDECREF(__pyx_2); - Py_XDECREF(__pyx_3); Py_XDECREF(__pyx_4); - Py_XDECREF(__pyx_5); __Pyx_AddTraceback("_xtea._c_xtea_encryptQuad"); __pyx_r = 0; __pyx_L0:; @@ -171,95 +152,72 @@ unsigned long __pyx_v_v0; unsigned long __pyx_v_v1; PyObject *__pyx_v_key = 0; - int __pyx_v_rounds; - int __pyx_v_i; - unsigned long __pyx_v_delta; - unsigned long __pyx_v_sum; + unsigned int __pyx_v_rounds; + unsigned long (__pyx_v_v[2]); + unsigned long (__pyx_v_k[4]); PyObject *__pyx_v_result; PyObject *__pyx_r; PyObject *__pyx_1 = 0; PyObject *__pyx_2 = 0; - PyObject *__pyx_3 = 0; + unsigned long __pyx_3; PyObject *__pyx_4 = 0; - PyObject *__pyx_5 = 0; - unsigned long __pyx_6; static char *__pyx_argnames[] = {"v0","v1","key","rounds",0}; - if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "kkOi", __pyx_argnames, &__pyx_v_v0, &__pyx_v_v1, &__pyx_v_key, &__pyx_v_rounds)) return 0; + if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "kkOI", __pyx_argnames, &__pyx_v_v0, &__pyx_v_v1, &__pyx_v_key, &__pyx_v_rounds)) return 0; Py_INCREF(__pyx_v_key); __pyx_v_result = Py_None; Py_INCREF(Py_None); - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":27 */ - __pyx_v_delta = 2654435769; + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":33 */ + (__pyx_v_v[0]) = __pyx_v_v0; - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":28 */ - __pyx_v_sum = (__pyx_v_delta * __pyx_v_rounds); + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":33 */ + (__pyx_v_v[1]) = __pyx_v_v1; - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":29 */ - __pyx_1 = PyList_New(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; goto __pyx_L1;} - Py_DECREF(__pyx_v_result); - __pyx_v_result = __pyx_1; - __pyx_1 = 0; + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":34 */ + __pyx_1 = PyInt_FromLong(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} + __pyx_2 = PyObject_GetItem(__pyx_v_key, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} + Py_DECREF(__pyx_1); __pyx_1 = 0; + __pyx_3 = PyInt_AsUnsignedLongMask(__pyx_2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} + Py_DECREF(__pyx_2); __pyx_2 = 0; + (__pyx_v_k[0]) = __pyx_3; - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":31 */ - for (__pyx_v_i = 0; __pyx_v_i < __pyx_v_rounds; ++__pyx_v_i) { + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":34 */ + __pyx_1 = PyInt_FromLong(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} + __pyx_2 = PyObject_GetItem(__pyx_v_key, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} + Py_DECREF(__pyx_1); __pyx_1 = 0; + __pyx_3 = PyInt_AsUnsignedLongMask(__pyx_2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} + Py_DECREF(__pyx_2); __pyx_2 = 0; + (__pyx_v_k[1]) = __pyx_3; - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":32 */ - __pyx_1 = PyLong_FromUnsignedLong(__pyx_v_v1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;} - __pyx_2 = PyLong_FromUnsignedLong((((__pyx_v_v0 << 4) ^ (__pyx_v_v0 >> 5)) + __pyx_v_v0)); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;} - __pyx_3 = PyLong_FromUnsignedLong(__pyx_v_sum); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;} - __pyx_4 = PyLong_FromUnsignedLong(((__pyx_v_sum >> 11) & 3)); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;} - __pyx_5 = PyObject_GetItem(__pyx_v_key, __pyx_4); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;} - Py_DECREF(__pyx_4); __pyx_4 = 0; - __pyx_4 = PyNumber_Add(__pyx_3, __pyx_5); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;} - Py_DECREF(__pyx_3); __pyx_3 = 0; - Py_DECREF(__pyx_5); __pyx_5 = 0; - __pyx_3 = PyNumber_Xor(__pyx_2, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;} - Py_DECREF(__pyx_2); __pyx_2 = 0; - Py_DECREF(__pyx_4); __pyx_4 = 0; - __pyx_5 = PyNumber_Subtract(__pyx_1, __pyx_3); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;} - Py_DECREF(__pyx_1); __pyx_1 = 0; - Py_DECREF(__pyx_3); __pyx_3 = 0; - __pyx_6 = PyInt_AsUnsignedLongMask(__pyx_5); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;} - Py_DECREF(__pyx_5); __pyx_5 = 0; - __pyx_v_v1 = __pyx_6; + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":34 */ + __pyx_1 = PyInt_FromLong(2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} + __pyx_2 = PyObject_GetItem(__pyx_v_key, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} + Py_DECREF(__pyx_1); __pyx_1 = 0; + __pyx_3 = PyInt_AsUnsignedLongMask(__pyx_2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} + Py_DECREF(__pyx_2); __pyx_2 = 0; + (__pyx_v_k[2]) = __pyx_3; - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":33 */ - __pyx_v_sum = (__pyx_v_sum - __pyx_v_delta); + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":34 */ + __pyx_1 = PyInt_FromLong(3); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} + __pyx_2 = PyObject_GetItem(__pyx_v_key, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} + Py_DECREF(__pyx_1); __pyx_1 = 0; + __pyx_3 = PyInt_AsUnsignedLongMask(__pyx_2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} + Py_DECREF(__pyx_2); __pyx_2 = 0; + (__pyx_v_k[3]) = __pyx_3; - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":34 */ - __pyx_2 = PyLong_FromUnsignedLong(__pyx_v_v0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} - __pyx_4 = PyLong_FromUnsignedLong((((__pyx_v_v1 << 4) ^ (__pyx_v_v1 >> 5)) + __pyx_v_v1)); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} - __pyx_1 = PyLong_FromUnsignedLong(__pyx_v_sum); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} - __pyx_3 = PyLong_FromUnsignedLong((__pyx_v_sum & 3)); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} - __pyx_5 = PyObject_GetItem(__pyx_v_key, __pyx_3); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} - Py_DECREF(__pyx_3); __pyx_3 = 0; - __pyx_3 = PyNumber_Add(__pyx_1, __pyx_5); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} - Py_DECREF(__pyx_1); __pyx_1 = 0; - Py_DECREF(__pyx_5); __pyx_5 = 0; - __pyx_1 = PyNumber_Xor(__pyx_4, __pyx_3); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} - Py_DECREF(__pyx_4); __pyx_4 = 0; - Py_DECREF(__pyx_3); __pyx_3 = 0; - __pyx_5 = PyNumber_Subtract(__pyx_2, __pyx_1); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} - Py_DECREF(__pyx_2); __pyx_2 = 0; - Py_DECREF(__pyx_1); __pyx_1 = 0; - __pyx_6 = PyInt_AsUnsignedLongMask(__pyx_5); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} - Py_DECREF(__pyx_5); __pyx_5 = 0; - __pyx_v_v0 = __pyx_6; - __pyx_L2:; - } - __pyx_L3:; + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":35 */ + decipher(__pyx_v_v,__pyx_v_k,__pyx_v_rounds); /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":36 */ - __pyx_4 = PyLong_FromUnsignedLong(__pyx_v_v0); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; goto __pyx_L1;} - __pyx_3 = PyLong_FromUnsignedLong(__pyx_v_v1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; goto __pyx_L1;} - __pyx_2 = PyList_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; goto __pyx_L1;} - PyList_SET_ITEM(__pyx_2, 0, __pyx_4); - PyList_SET_ITEM(__pyx_2, 1, __pyx_3); - __pyx_4 = 0; - __pyx_3 = 0; - Py_DECREF(__pyx_v_result); - __pyx_v_result = __pyx_2; + __pyx_1 = PyLong_FromUnsignedLong((__pyx_v_v[0])); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; goto __pyx_L1;} + __pyx_2 = PyLong_FromUnsignedLong((__pyx_v_v[1])); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; goto __pyx_L1;} + __pyx_4 = PyList_New(2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; goto __pyx_L1;} + PyList_SET_ITEM(__pyx_4, 0, __pyx_1); + PyList_SET_ITEM(__pyx_4, 1, __pyx_2); + __pyx_1 = 0; __pyx_2 = 0; + Py_DECREF(__pyx_v_result); + __pyx_v_result = __pyx_4; + __pyx_4 = 0; /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":37 */ Py_INCREF(__pyx_v_result); @@ -271,9 +229,7 @@ __pyx_L1:; Py_XDECREF(__pyx_1); Py_XDECREF(__pyx_2); - Py_XDECREF(__pyx_3); Py_XDECREF(__pyx_4); - Py_XDECREF(__pyx_5); __Pyx_AddTraceback("_xtea._c_xtea_decryptQuad"); __pyx_r = 0; __pyx_L0:; @@ -283,6 +239,11 @@ } static __Pyx_InternTabEntry __pyx_intern_tab[] = { + {&__pyx_n_MODE_CBC, "MODE_CBC"}, + {&__pyx_n_MODE_CFB, "MODE_CFB"}, + {&__pyx_n_MODE_CTR, "MODE_CTR"}, + {&__pyx_n_MODE_ECB, "MODE_ECB"}, + {&__pyx_n_MODE_OFB, "MODE_OFB"}, {&__pyx_n__c_xtea_decryptQuad, "_c_xtea_decryptQuad"}, {&__pyx_n__c_xtea_encryptQuad, "_c_xtea_encryptQuad"}, {0, 0} @@ -298,17 +259,44 @@ PyMODINIT_FUNC init_xtea(void); /*proto*/ PyMODINIT_FUNC init_xtea(void) { + PyObject *__pyx_1 = 0; __pyx_init_filenames(); __pyx_m = Py_InitModule4("_xtea", __pyx_methods, 0, 0, PYTHON_API_VERSION); - if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; goto __pyx_L1;}; + if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; goto __pyx_L1;}; __pyx_b = PyImport_AddModule("__builtin__"); - if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; goto __pyx_L1;}; - if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; goto __pyx_L1;}; - if (__Pyx_InternStrings(__pyx_intern_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; goto __pyx_L1;}; + if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; goto __pyx_L1;}; + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; goto __pyx_L1;}; + if (__Pyx_InternStrings(__pyx_intern_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; goto __pyx_L1;}; - /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":23 */ + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":15 */ + __pyx_1 = PyInt_FromLong(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; goto __pyx_L1;} + if (PyObject_SetAttr(__pyx_m, __pyx_n_MODE_ECB, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; goto __pyx_L1;} + Py_DECREF(__pyx_1); __pyx_1 = 0; + + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":16 */ + __pyx_1 = PyInt_FromLong(2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; goto __pyx_L1;} + if (PyObject_SetAttr(__pyx_m, __pyx_n_MODE_CBC, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; goto __pyx_L1;} + Py_DECREF(__pyx_1); __pyx_1 = 0; + + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":17 */ + __pyx_1 = PyInt_FromLong(4); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 17; goto __pyx_L1;} + if (PyObject_SetAttr(__pyx_m, __pyx_n_MODE_CFB, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 17; goto __pyx_L1;} + Py_DECREF(__pyx_1); __pyx_1 = 0; + + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":18 */ + __pyx_1 = PyInt_FromLong(5); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; goto __pyx_L1;} + if (PyObject_SetAttr(__pyx_m, __pyx_n_MODE_OFB, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; goto __pyx_L1;} + Py_DECREF(__pyx_1); __pyx_1 = 0; + + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":19 */ + __pyx_1 = PyInt_FromLong(6); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; goto __pyx_L1;} + if (PyObject_SetAttr(__pyx_m, __pyx_n_MODE_CTR, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; goto __pyx_L1;} + Py_DECREF(__pyx_1); __pyx_1 = 0; + + /* "/home/heimes/dev/pymoul/xtea/src/xtea/_xtea.pyx":30 */ return; __pyx_L1:; + Py_XDECREF(__pyx_1); __Pyx_AddTraceback("_xtea"); } Modified: xtea/trunk/src/xtea/_xtea.pyx =================================================================== --- xtea/trunk/src/xtea/_xtea.pyx 2007-02-28 12:13:59 UTC (rev 218) +++ xtea/trunk/src/xtea/_xtea.pyx 2007-03-01 16:25:39 UTC (rev 219) @@ -2,36 +2,36 @@ # pyrexc optimized version # License: Public Domain +# http://www.python.org/dev/peps/pep-0272/ +# http://en.wikipedia.org/wiki/XTEA + ctypedef unsigned long ULong +ctypedef unsigned int UInt -def _c_xtea_encryptQuad(ULong v0, ULong v1, key, int rounds): - cdef int i - cdef ULong delta, sum +cdef extern from "cxtea.h": + void decipher(ULong *v, ULong *k, UInt rounds) + void encipher(ULong *v, ULong *k, UInt rounds) - delta=0x9E3779B9 - sum=0 - result = [] +MODE_ECB = 1 # Electronic Code Book +MODE_CBC = 2 # Cipher Block Chaining +MODE_CFB = 4 # Cipher Feedback +MODE_OFB = 5 # Output Feedback +MODE_CTR = 6 # Counter - for i from 0 <= i < rounds: - v0 = v0 + (((v1<<4 ^ v1>>5) + v1) ^ (sum + key[sum & 3])) - sum = sum + delta - v1 = v1 + (((v0<<4 ^ v0>>5) + v0) ^ (sum + key[sum>>11 & 3])) - - result = [v0, v1] +def _c_xtea_encryptQuad(ULong v0, ULong v1, object key, UInt rounds): + cdef ULong v[2] + cdef ULong k[4] + v[0] = v0; v[1] = v1 + k[0] = key[0]; k[1] = key[1]; k[2] = key[2]; k[3] = key[3]; + encipher(v, k, rounds) + result = [v[0], v[1]] return result -def _c_xtea_decryptQuad(ULong v0, ULong v1, key, int rounds): - cdef int i - cdef ULong delta, sum - - delta=0x9E3779B9 - sum=delta*rounds - result = [] - - for i from 0 <= i < rounds: - v1 = v1 - (((v0<<4 ^ v0>>5) + v0) ^ (sum + key[sum>>11 & 3])) - sum = sum - delta - v0 = v0 - (((v1<<4 ^ v1>>5) + v1) ^ (sum + key[sum & 3])) - - result = [v0, v1] +def _c_xtea_decryptQuad(ULong v0, ULong v1, key, UInt rounds): + cdef ULong v[2] + cdef ULong k[4] + v[0] = v0; v[1] = v1 + k[0] = key[0]; k[1] = key[1]; k[2] = key[2]; k[3] = key[3]; + decipher(v, k, rounds) + result = [v[0], v[1]] return result Added: xtea/trunk/src/xtea/cxtea.c =================================================================== --- xtea/trunk/src/xtea/cxtea.c (rev 0) +++ xtea/trunk/src/xtea/cxtea.c 2007-03-01 16:25:39 UTC (rev 219) @@ -0,0 +1,32 @@ +/* Copyright (C) 2007 Christian Heimes <christian (at) cheimes (dot) de> + pyrexc optimized version + License: Public Domain + + Source: http://en.wikipedia.org/wiki/XTEA +*/ + +#include "cxtea.h" + +void decipher(ULong *const v, const ULong *const k, const UInt rounds) + { + register UInt i; + register ULong delta=0x9E3779B9; + register ULong sum=delta*rounds; + for (i=0; i < rounds; i++) { + v[1] -= ((v[0]<<4 ^ v[0]>>5) + v[0]) ^ (sum + k[sum>>11 & 3]); + sum -= delta; + v[0] -= ((v[1]<<4 ^ v[1]>>5) + v[1]) ^ (sum + k[sum & 3]); + } + } + +void encipher(ULong *const v, const ULong *const k, const UInt rounds) + { + register UInt i; + register ULong delta=0x9E3779B9; + register ULong sum=0; + for (i=0; i < rounds; i++) { + v[0] += ((v[1]<<4 ^ v[1]>>5) + v[1]) ^ (sum + k[sum & 3]); + sum += delta; + v[1] += ((v[0]<<4 ^ v[0]>>5) + v[0]) ^ (sum + k[sum>>11 & 3]); + } + } Property changes on: xtea/trunk/src/xtea/cxtea.c ___________________________________________________________________ Name: svn:eol-style + native Added: xtea/trunk/src/xtea/cxtea.h =================================================================== --- xtea/trunk/src/xtea/cxtea.h (rev 0) +++ xtea/trunk/src/xtea/cxtea.h 2007-03-01 16:25:39 UTC (rev 219) @@ -0,0 +1,19 @@ +/* Copyright (C) 2007 Christian Heimes <christian (at) cheimes (dot) de> + pyrexc optimized version + License: Public Domain + + Source: http://en.wikipedia.org/wiki/XTEA +*/ + +#define MODE_ECB 1 // Electronic Code Book +#define MODE_CBC 2 // Cipher Block Chaining +#define MODE_CFB 4 // Cipher Feedback +#define MODE_OFB 5 // Output Feedback +#define MODE_CTR 6 // Counter + +typedef unsigned long ULong; +typedef unsigned int UInt; + +void decipher(ULong *const v, const ULong *const k, const UInt rounds); +void encipher(ULong *const v, const ULong *const k, const UInt rounds); + Property changes on: xtea/trunk/src/xtea/cxtea.h ___________________________________________________________________ Name: svn:eol-style + native Modified: xtea/trunk/src/xtea/xtea.py =================================================================== --- xtea/trunk/src/xtea/xtea.py 2007-02-28 12:13:59 UTC (rev 218) +++ xtea/trunk/src/xtea/xtea.py 2007-03-01 16:25:39 UTC (rev 219) @@ -1,7 +1,7 @@ -""" -XTEA Block Encryption Algorithm +"""XTEA Block Encryption Algorithm Author: Paul Chakravarti (paul_dot_chakravarti_at_mac_dot_com) + Christian Heimes (christian (at) cheimes (dot) de) License: Public Domain This module provides a Python implementation of the XTEA block encryption @@ -27,68 +27,189 @@ IV to seed the key generator (the IV is not sensitive and does not need to be exchanged securely) +""" + +from struct import pack +from struct import unpack +import sys + +__all__ = ['new', 'MODE_ECB', 'MODE_OFB', 'BIG_ENDIAN', + 'LITTLE_ENDIAN', 'NETWORK_ENDIAN'] + +MODE_ECB = 1 # Electronic Code Book +MODE_CBC = 2 # Cipher Block Chaining +MODE_CFB = 4 # Cipher Feedback +MODE_OFB = 5 # Output Feedback +MODE_CTR = 6 # Counter +BIG_ENDIAN = 'big' +LITTLE_ENDIAN = 'little' +NETWORK_ENDIAN = LITTLE_ENDIAN +HOST_ENDIAN = sys.byteorder + +class XTEA(object): + """XTEA block cipher (PEP 272 conform implementation) + + Key: 16 chars or tuple with 4 longs (128 bit) + blocksize: 8 (64 bit) + rounds: 32 (default) + endian: little or big endian (default: host endian) + IV: initialization vector for OFB (8 chars) + mode: ECB, OFB + + ECB mode encryption and decryption + >>> xtea = new('0123456789012345', mode=MODE_ECB, endian=LITTLE_ENDIAN) + >>> z = xtea.encrypt('ABCDEFGH') + >>> z.encode('hex') + 'ea0c3d7c1c22557f' + >>> xtea.decrypt(z) + 'ABCDEFGH' + + The block must be 8 characters or a multitude of 8 long + >>> z = xtea.encrypt('ABCDEFGHABCDEFGH') + >>> z.encode('hex') + 'ea0c3d7c1c22557fea0c3d7c1c22557f' + >>> xtea.decrypt(z) + 'ABCDEFGHABCDEFGH' + + You can specify the endianes of the key and data. The default value is host endian. + >>> xtea = new('0123456789012345', mode=MODE_ECB, endian=BIG_ENDIAN) + >>> z = xtea.encrypt('ABCDEFGH') + >>> z.encode('hex') + 'b67c01662ff6964a' + >>> xtea.decrypt(z) + 'ABCDEFGH' + + In OFB mode the data block can have any size. >>> import os + >>> key = os.urandom(16) + >>> iv = os.urandom(8) + >>> data = os.urandom(10000) + >>> xtea = XTEA(key, mode=MODE_OFB, IV=iv, endian=LITTLE_ENDIAN) + >>> z = xtea.encrypt(data) + >>> xtea.decrypt(z) == data + True + + >>> key = '0123456789012345' >>> iv = 'ABCDEFGH' - >>> z = crypt('0123456789012345','Hello There',iv) + >>> xtea = XTEA(key, mode=MODE_OFB, IV=iv, endian=BIG_ENDIAN) + >>> z = xtea.encrypt('Hello There!') >>> z.encode('hex') - 'fe196d0a40d6c222b9eff3' - >>> crypt('0123456789012345',z,iv) - 'Hello There' + 'fe196d0a40d6c222b9eff3e9' + >>> xtea.decrypt(z) + 'Hello There!' + """ + @property + def key_size(self): + return 16 -""" + @property + def block_size(self): + return 8 -import struct + def __init__(self, key, mode=MODE_ECB, IV=None, rounds=32, + endian=HOST_ENDIAN, **kwargs): + if endian == BIG_ENDIAN: + self._endian = ">" + elif endian == LITTLE_ENDIAN: + self._endian = "<" + else: + raise ValueError("Unknown endian: %s" % endian) -def crypt(key, data, iv='\00\00\00\00\00\00\00\00', n=32): - """ - Encrypt/decrypt variable length string using XTEA cypher as - key generator (OFB mode) - * key = 128 bit (16 char) - * iv = 64 bit (8 char) - * data = string (any length) + if isinstance(key, tuple): + if len(key) != 4: + raise ValueError("Invalid key size") + self._key = key + elif isinstance(key, str): + if len(key) != self.key_size: + raise ValueError("Invalid key size") + self._key = unpack(self._endian+"4L", key) + else: + raise TypeError("Invalid key type") - >>> import os - >>> key = os.urandom(16) - >>> iv = os.urandom(8) - >>> data = os.urandom(10000) - >>> z = crypt(key,data,iv) - >>> crypt(key,z,iv) == data - True + if mode == MODE_ECB: + if IV is not None: + raise ValueError("IV not required for ECB") + elif mode == MODE_OFB: + if IV is None or len(IV) != self.block_size: + raise ValueError("Invalid IV") + else: + raise ValueError("Unknown or unsupported mode") - """ - def keygen(key, iv, n): + self._mode = mode + self._rounds = rounds + self._iv = IV + + def encrypt(self, block): + """Encrypt a block + + @param block: block to encrypt + @type block: str + """ + if self._mode == MODE_ECB: + return self._ecb(block, func=xtea_encryptQuad) + elif self._mode == MODE_OFB: + return self._ofb(block) + else: + raise ValueError("Unknown or unsupported mode") + + def decrypt(self, block): + """Decrypt a block + + @param block: block to decrypt + @type block: str + """ + if self._mode == MODE_ECB: + return self._ecb(block, func=xtea_decryptQuad) + elif self._mode == MODE_OFB: + return self._ofb(block) + else: + raise ValueError("Unknown or unsupported mode") + + def _ecb(self, block, func): + """Electronic Code Book encryption/decryption + + @type block: str + @param func: decrypt or encrypt function + @type func: callable(v0, v1, keys[4], rounds) + """ + l = len(block) + bs = self.block_size + key, rounds = self._key, self._rounds + fmt = self._endian+"2L" + result = [] + if l % bs != 0: + raise ValueError + for i in range(l/bs): + v0, v1 = unpack(fmt, block[i*bs:(i+1)*bs]) + w0, w1 = func(v0, v1, key, rounds) + result.append(pack(fmt, w0, w1)) + return ''.join(result) + + def _ofb_keygen(self): + """Key generator + + @return: generator function + """ + key, iv, rounds = self._key, self._iv, self._rounds + fmt = self._endian+"2L" + #v0, v1 = unpack(self._endian+"2L", iv) while True: - iv = xtea_encrypt(key, iv, n) + v0, v1 = unpack(fmt, iv) + w0, w1 = xtea_encryptQuad(v0, v1, key, rounds) + iv = pack(fmt, w0, w1) for k in iv: yield ord(k) - xor = [ chr(x^y) for (x, y) in zip(map(ord, data), keygen(key, iv, n)) ] - return "".join(xor) -def xtea_encrypt(key, block, rounds=32, endian="!"): - """ - Encrypt 64 bit data block using XTEA block cypher - * key = 128 bit (16 char) - * block = 64 bit (8 char) - * n = rounds (default 32) - * endian = byte order (see 'struct' doc - default big/network) + def _ofb(self, block): + """Output Feedback (OFB) encryption requires an IV + """ + key = pack(self._endian+"4L", *self._key) + gen = self._ofb_keygen() + xor = [chr(x^y) for (x, y) in zip(map(ord, block), gen)] + return ''.join(xor) - >>> z = xtea_encrypt('0123456789012345','ABCDEFGH') - >>> z.encode('hex') - 'b67c01662ff6964a' +new = XTEA - Only need to change byte order if sending/receiving from - alternative endian implementation - - >>> z = xtea_encrypt('0123456789012345','ABCDEFGH',endian="<") - >>> z.encode('hex') - 'ea0c3d7c1c22557f' - - """ - v0,v1 = struct.unpack(endian+"2L", block) - k = struct.unpack(endian+"4L", key) - v0, v1 = xtea_encryptQuad(v0, v1, k, rounds) - return struct.pack(endian+"2L", v0, v1) - def _py_xtea_encryptQuad(v0, v1, key, rounds=32, delta=0x9e3779b9L, mask=0xffffffffL): """Encrypt a quad @@ -111,31 +232,6 @@ v1 = (v1 + (((v0<<4 ^ v0>>5) + v0) ^ (sum + key[sum>>11 & 3]))) & mask return v0, v1 -def xtea_decrypt(key, block, rounds=32, endian="!"): - """ - Decrypt 64 bit data block using XTEA block cypher - * key = 128 bit (16 char) - * block = 64 bit (8 char) - * n = rounds (default 32) - * endian = byte order (see 'struct' doc - default big/network) - - >>> z = 'b67c01662ff6964a'.decode('hex') - >>> xtea_decrypt('0123456789012345',z) - 'ABCDEFGH' - - Only need to change byte order if sending/receiving from - alternative endian implementation - - >>> z = 'ea0c3d7c1c22557f'.decode('hex') - >>> xtea_decrypt('0123456789012345',z,endian="<") - 'ABCDEFGH' - - """ - v0, v1 = struct.unpack(endian+"2L", block) - k = struct.unpack(endian+"4L", key) - v0, v1 = xtea_decryptQuad(v0, v1, k, rounds) - return struct.pack(endian+"2L", v0, v1) - def _py_xtea_decryptQuad(v0, v1, key, rounds=32, delta=0x9e3779b9L, mask=0xffffffffL): """Decrypt a quad @@ -160,11 +256,9 @@ # Try to replace core functions with optimized versions try: - #raise ImportError from _xtea import _c_xtea_encryptQuad from _xtea import _c_xtea_decryptQuad except ImportError, msg: - print msg xtea_encryptQuad = _py_xtea_encryptQuad xtea_decryptQuad = _py_xtea_decryptQuad else: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |