[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.
|