[Pymoul-svn] SF.net SVN: pymoul: [225] xtea/trunk/src/xtea
Status: Alpha
Brought to you by:
tiran
From: <ti...@us...> - 2007-03-02 17:03:28
|
Revision: 225 http://pymoul.svn.sourceforge.net/pymoul/?rev=225&view=rev Author: tiran Date: 2007-03-02 09:03:21 -0800 (Fri, 02 Mar 2007) Log Message: ----------- Added implementation switch and timing function Modified Paths: -------------- xtea/trunk/src/xtea/_common.py xtea/trunk/src/xtea/tests.py xtea/trunk/src/xtea/xtea.py Modified: xtea/trunk/src/xtea/_common.py =================================================================== --- xtea/trunk/src/xtea/_common.py 2007-03-02 16:28:11 UTC (rev 224) +++ xtea/trunk/src/xtea/_common.py 2007-03-02 17:03:21 UTC (rev 225) @@ -106,6 +106,33 @@ """ return cls(key, **kwargs) + @classmethod + def setDefaultImpl(cls, impl='py'): + """Set default implementation + """ + if impl == 'py': + cls._decrypt = cls._py_decrypt + cls._encrypt = cls._py_encrypt + elif impl == 'c': + assert cls._c_decrypt is not None + cls._decrypt = cls._c_decrypt + cls._encrypt = cls._c_encrypt + else: + raise ValueError(impl) + + def setImpl(self, impl='py'): + """Set implementation for this instance + """ + if impl == 'py': + self._decrypt = self._py_decrypt + self._encrypt = self._py_encrypt + elif impl == 'c': + assert self._c_decrypt is not None + self._decrypt = self._c_decrypt + self._encrypt = self._c_encrypt + else: + raise ValueError(impl) + def encrypt(self, block): """Encrypt a block @@ -134,6 +161,10 @@ _decrypt = None _encrypt = None + _c_decrypt = None + _c_encrypt = None + _py_decrypt = None + _py_encrypt = None def _ecb(self, block, func): """Electronic Code Book encryption/decryption Modified: xtea/trunk/src/xtea/tests.py =================================================================== --- xtea/trunk/src/xtea/tests.py 2007-03-02 16:28:11 UTC (rev 224) +++ xtea/trunk/src/xtea/tests.py 2007-03-02 17:03:21 UTC (rev 225) @@ -8,7 +8,9 @@ import os import unittest from doctest import DocTestSuite +from time import time +from xtea import XTEA class CXteaTestCase(unittest.TestCase): def setUp(self): @@ -24,15 +26,29 @@ def tearDown(self): pass +def compare_timing(cls=XTEA): + key = os.urandom(16) + data = os.urandom(1024) + xtea = cls(key) + for impl in ('c', 'py'): + for size in (1, 5, 10, 50): + d = size*data + xtea.setImpl(impl) + start = time() + for i in range(5): + enc = xtea.encrypt(d) + xtea.decrypt(enc) + print "%s: 5 times %sk data: %0.4f" % (impl, size, time() - start) + def test_suite(): return unittest.TestSuite(( unittest.makeSuite(CXteaTestCase), unittest.makeSuite(PyXteaTestCase), DocTestSuite('xtea'), - DocTestSuite('xxtea'), + #DocTestSuite('xxtea'), DocTestSuite('_common'), )) if __name__ == '__main__': + #compare_timing() unittest.main(defaultTest="test_suite") - Modified: xtea/trunk/src/xtea/xtea.py =================================================================== --- xtea/trunk/src/xtea/xtea.py 2007-03-02 16:28:11 UTC (rev 224) +++ xtea/trunk/src/xtea/xtea.py 2007-03-02 17:03:21 UTC (rev 225) @@ -154,7 +154,7 @@ return ''.join(xor) @staticmethod - def _py_xtea_decrypt(v, key, n=32, delta=0x9e3779b9L, + def _py_decrypt(v, key, n=32, delta=0x9e3779b9L, mask=0xffffffffL): """Decrypt a quad @@ -175,10 +175,8 @@ v0 = (v0 - (((v1<<4 ^ v1>>5) + v1) ^ (sum + key[sum & 3]))) & mask return v0, v1 - _decrypt = _py_xtea_decrypt - @staticmethod - def _py_xtea_encrypt(v, key, n=32, delta=0x9e3779b9L, + def _py_encrypt(v, key, n=32, delta=0x9e3779b9L, mask=0xffffffffL): """Encrypt a quad @@ -199,15 +197,14 @@ v1 = (v1 + (((v0<<4 ^ v0>>5) + v0) ^ (sum + key[sum>>11 & 3]))) & mask return v0, v1 - _encrypt = _py_xtea_encrypt - # Try to replace core functions with optimized versions try: from _xtea import _c_xtea_encrypt from _xtea import _c_xtea_decrypt except ImportError, msg: - pass + XTEA.setDefaultImpl('py') #print msg else: - XTEA._encrypt = _c_xtea_encrypt - XTEA._decrypt = _c_xtea_decrypt + XTEA._c_encrypt = _c_xtea_encrypt + XTEA._c_decrypt = _c_xtea_decrypt + XTEA.setDefaultImpl('c') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |