diff options
Diffstat (limited to 'pipermail/pycrypto/attachments/20080902/cff3ab97/attachment.ksh')
-rw-r--r-- | pipermail/pycrypto/attachments/20080902/cff3ab97/attachment.ksh | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/pipermail/pycrypto/attachments/20080902/cff3ab97/attachment.ksh b/pipermail/pycrypto/attachments/20080902/cff3ab97/attachment.ksh new file mode 100644 index 0000000..0e7f658 --- /dev/null +++ b/pipermail/pycrypto/attachments/20080902/cff3ab97/attachment.ksh @@ -0,0 +1,307 @@ +diff -rauN pycrypto-2.0.1/Cipher/__init__.py pycrypto-2.0.1-batt/Cipher/__init__.py +--- pycrypto-2.0.1/Cipher/__init__.py 2003-02-28 16:28:35.000000000 +0100 ++++ pycrypto-2.0.1-batt/Cipher/__init__.py 2007-05-26 13:12:52.000000000 +0200 +@@ -20,11 +20,12 @@ + Crypto.Cipher.DES3 Triple DES. + Crypto.Cipher.IDEA + Crypto.Cipher.RC5 ++Crypto.Cipher.TEA Tiny Encryption Algorithm + Crypto.Cipher.XOR The simple XOR cipher. + """ + + __all__ = ['AES', 'ARC2', 'ARC4', +- 'Blowfish', 'CAST', 'DES', 'DES3', 'IDEA', 'RC5', ++ 'Blowfish', 'CAST', 'DES', 'DES3', 'IDEA', 'RC5', 'TEA', + 'XOR' + ] + +diff -rauN pycrypto-2.0.1/Doc/pycrypt.tex pycrypto-2.0.1-batt/Doc/pycrypt.tex +--- pycrypto-2.0.1/Doc/pycrypt.tex 2005-06-14 02:23:11.000000000 +0200 ++++ pycrypto-2.0.1-batt/Doc/pycrypt.tex 2007-05-26 14:37:11.000000000 +0200 +@@ -305,6 +305,7 @@ + \lineii{DES3 (Triple DES)}{16 bytes/8 bytes} + \lineii{IDEA}{16 bytes/8 bytes} + \lineii{RC5}{Variable/8 bytes} ++\lineii{TEA}{16 bytes/8 bytes} + \end{tableii} + + In a strict formal sense, \dfn{stream ciphers} encrypt data bit-by-bit; +@@ -436,6 +437,12 @@ + balanced between speed and security. + \end{itemize} + ++TEA, Tiny Encrytion Algorithm, is a very fast and easy-to-code algorithm. ++It is famous for its simplicity and efficiency, and is often used in embedded systems, ++where hardware resources (speed and space) are very limited. ++For more information check at: ++\url{http://www.simonshepherd.supanet.com/tea.htm} ++ + + \subsection{Security Notes} + Encryption algorithms can be broken in several ways. If you have some +diff -rauN pycrypto-2.0.1/setup.py pycrypto-2.0.1-batt/setup.py +--- pycrypto-2.0.1/setup.py 2005-06-14 03:20:22.000000000 +0200 ++++ pycrypto-2.0.1-batt/setup.py 2007-05-26 13:29:30.000000000 +0200 +@@ -101,6 +101,9 @@ + Extension("Crypto.Cipher.RC5", + include_dirs=['src/'], + sources=["src/RC5.c"]), ++ Extension("Crypto.Cipher.TEA", ++ include_dirs=['src/'], ++ sources=["src/TEA.c"]), + + # Stream ciphers + Extension("Crypto.Cipher.ARC4", +diff -rauN pycrypto-2.0.1/src/TEA.c pycrypto-2.0.1-batt/src/TEA.c +--- pycrypto-2.0.1/src/TEA.c 1970-01-01 01:00:00.000000000 +0100 ++++ pycrypto-2.0.1-batt/src/TEA.c 2007-05-26 14:50:52.000000000 +0200 +@@ -0,0 +1,137 @@ ++/** ++ * ++ * The Tiny Encryption Algorithm (TEA) by David Wheeler and Roger Needham ++ * of the Cambridge Computer Laboratory ++ * ++ * Placed in the Public Domain by David Wheeler and Roger Needham. ++ * ++ * PyCrypto module implementation by Francesco Sacchi <batt@develer.com> ++ * ++ */ ++ ++#include <stdlib.h> ++#include <string.h> ++#include "Python.h" ++ ++#define MODULE_NAME TEA ++#define BLOCK_SIZE 8 ++#define KEY_SIZE 16 ++ ++#define DELTA 0x9E3779B9 //!< Magic value. (Golden number * 2^31) ++#define ROUNDS 32 //!< Number of rounds. ++ ++typedef struct { ++ uint32_t k[4]; ++} block_state; ++ ++ ++/** ++ * Macro used to get from a uint8_t *pointer a 32 bit value, little endian. ++ */ ++#define GET_LE32(p) (((uint32_t)(p)[3] << 24) \ ++ | ((uint32_t)(p)[2] << 16) \ ++ | ((uint32_t)(p)[1] << 8) \ ++ | ((uint32_t)(p)[0])) ++ ++/** ++ * Macro used to store a 32 bit value in a uint8_t *pointer, little endian. ++ */ ++#define STORE_LE32(p, x) { \ ++ (p)[3] = (uint8_t)((x) >> 24); \ ++ (p)[2] = (uint8_t)((x) >> 16); \ ++ (p)[1] = (uint8_t)((x) >> 8); \ ++ (p)[0] = (uint8_t)(x); \ ++ } ++ ++ ++/** ++ * Basic TEA rotation function. ++ */ ++static inline uint32_t tea_func(uint32_t *in, uint32_t *sum, uint32_t *k) ++{ ++ return ((*in << 4) + k[0]) ^ (*in + *sum) ^ ((*in >> 5) + k[1]); ++} ++ ++/** ++ * \brief TEA encryption function. ++ * This function encrypts <EM>v</EM> with <EM>k</EM> and returns the ++ * encrypted data in <EM>w</EM>. ++ * \param v Array of 8 bytes containing the data block. ++ * \param k Array of four long values containing the key. ++ * \param w Array of 8 bytes containing the encrypted data block. ++ */ ++void tea_enc(uint8_t *v, uint32_t *k, uint8_t *w) ++{ ++ uint32_t y, z; ++ uint32_t sum = 0; ++ uint8_t n = ROUNDS; ++ ++ y = GET_LE32(v); ++ v += 4; ++ z = GET_LE32(v); ++ ++ while(n-- > 0) ++ { ++ sum += DELTA; ++ y += tea_func(&z, &sum, &(k[0])); ++ z += tea_func(&y, &sum, &(k[2])); ++ } ++ ++ STORE_LE32(w, y); ++ w += 4; ++ STORE_LE32(w, z); ++} ++ ++/** ++ * \brief TEA decryption function. ++ * This function decrypts <EM>v</EM> with <EM>k</EM> and returns the ++ * decrypted data in <EM>w</EM>. ++ * \param v Array of 8 bytes containing the data block. ++ * \param k Array of four long values containing the key. ++ * \param w Array of 8 bytes containing the decrypted data block. ++ */ ++void tea_dec(uint8_t *v, uint32_t *k, uint8_t *w) ++{ ++ uint32_t y, z; ++ uint32_t sum = DELTA * ROUNDS; ++ uint8_t n = ROUNDS; ++ ++ y = GET_LE32(v); ++ v += 4; ++ z = GET_LE32(v); ++ ++ while(n-- > 0) ++ { ++ z -= tea_func(&y, &sum, &(k[2])); ++ y -= tea_func(&z, &sum, &(k[0])); ++ sum -= DELTA; ++ } ++ ++ STORE_LE32(w, y); ++ w += 4; ++ STORE_LE32(w, z); ++} ++ ++ ++ ++void block_init(block_state *self, unsigned char *_key, int dummy) ++{ ++ uint8_t *key = (uint8_t *)_key; ++ int i; ++ ++ for (i = 0; i < 4; i++) ++ self->k[i] = GET_LE32(key + i * 4); ++} ++ ++void block_encrypt(block_state *self, unsigned char *in, unsigned char *out) ++{ ++ tea_enc((uint8_t *)in, self->k, (uint8_t *)out); ++} ++ ++void block_decrypt(block_state *self, unsigned char *in, unsigned char *out) ++{ ++ tea_dec((uint8_t *)in, self->k, (uint8_t *)out); ++} ++ ++ ++#include "block_template.c" +diff -rauN pycrypto-2.0.1/test/testdata.py pycrypto-2.0.1-batt/test/testdata.py +--- pycrypto-2.0.1/test/testdata.py 2004-08-01 20:53:31.000000000 +0200 ++++ pycrypto-2.0.1-batt/test/testdata.py 2007-05-26 14:16:49.000000000 +0200 +@@ -423,6 +423,74 @@ + (_castkey[:10*2], _castdata, 'EB6A711A2C02271B'), + (_castkey[: 5*2], _castdata, '7AC816D16E9B302E'), + ] ++# Test vector for TEA ++ ++tea = [ ++('00000000000000000000000000000000','0000000000000000','0a3aea4140a9ba94'), ++('0000000000000000000000000a3aea41','40a9ba9400000000','29788e4ed836827d'), ++('00000000000000000a3aea4129788e4e','d836827d00000000','5ea98bc802acede7'), ++('000000000a3aea4129788e4e5ea98bc8','02acede700000000','af284eb88820b6b6'), ++('0a3aea4129788e4e5ea98bc8af284eb8','8820b6b600000000','9572a4a0b3f3ad8f'), ++('29788e4e5ea98bc8af284eb89572a4a0','b3f3ad8f0a3aea41','980665ed792b9fcf'), ++('5ea98bc8af284eb89572a4a0980665ed','792b9fcf29788e4e','a0ee24101cae2062'), ++('af284eb89572a4a0980665eda0ee2410','1cae20625ea98bc8','d975df5d8fe64c7a'), ++('9572a4a0980665eda0ee2410d975df5d','8fe64c7aaf284eb8','1e9dbef184a9d48d'), ++('980665eda0ee2410d975df5d1e9dbef1','84a9d48d9572a4a0','8c752cd3adab2d09'), ++('a0ee2410d975df5d1e9dbef18c752cd3','adab2d09980665ed','2837b4bdc03f18f7'), ++('d975df5d1e9dbef18c752cd32837b4bd','c03f18f7a0ee2410','1a80c3a94efbdcd9'), ++('1e9dbef18c752cd32837b4bd1a80c3a9','4efbdcd9d975df5d','54e6a1327c91dfa9'), ++('8c752cd32837b4bd1a80c3a954e6a132','7c91dfa91e9dbef1','b93bb608e8d30bb2'), ++('2837b4bd1a80c3a954e6a132b93bb608','e8d30bb28c752cd3','74054121c66442cc'), ++('1a80c3a954e6a132b93bb60874054121','c66442cc2837b4bd','e2d2c54e891dda5a'), ++('54e6a132b93bb60874054121e2d2c54e','891dda5a1a80c3a9','9e2446dd4b0baa28'), ++('b93bb60874054121e2d2c54e9e2446dd','4b0baa2854e6a132','badc862403df13a7'), ++('74054121e2d2c54e9e2446ddbadc8624','03df13a7b93bb608','9dafc7b7ab6ccb1a'), ++('e2d2c54e9e2446ddbadc86249dafc7b7','ab6ccb1a74054121','0a40c08cbb9fa49a'), ++('9e2446ddbadc86249dafc7b70a40c08c','bb9fa49ae2d2c54e','7618249c668cbc6c'), ++('badc86249dafc7b70a40c08c7618249c','668cbc6c9e2446dd','455d9cb5f96600a9'), ++('9dafc7b70a40c08c7618249c455d9cb5','f96600a9badc8624','b3a165b7b07eb364'), ++('0a40c08c7618249c455d9cb5b3a165b7','b07eb3649dafc7b7','ac2f177b3349abf5'), ++('7618249c455d9cb5b3a165b7ac2f177b','3349abf50a40c08c','fbf448feb104a4ad'), ++('455d9cb5b3a165b7ac2f177bfbf448fe','b104a4ad7618249c','934029c53d3ed5c1'), ++('b3a165b7ac2f177bfbf448fe934029c5','3d3ed5c1455d9cb5','e2a89c754966a977'), ++('ac2f177bfbf448fe934029c5e2a89c75','4966a977b3a165b7','0f3ec5690798973e'), ++('fbf448fe934029c5e2a89c750f3ec569','0798973eac2f177b','da8a3860e8a81fa2'), ++('934029c5e2a89c750f3ec569da8a3860','e8a81fa2fbf448fe','f5a170df07a44aac'), ++('e2a89c750f3ec569da8a3860f5a170df','07a44aac934029c5','094ecbd933626392'), ++('0f3ec569da8a3860f5a170df094ecbd9','33626392e2a89c75','576c2c7d4ddb6a7a'), ++('da8a3860f5a170df094ecbd9576c2c7d','4ddb6a7a0f3ec569','1512b7448a3625cf'), ++('f5a170df094ecbd9576c2c7d1512b744','8a3625cfda8a3860','a10501c1181a78ef'), ++('094ecbd9576c2c7d1512b744a10501c1','181a78eff5a170df','fa29dbbfb639ce9e'), ++('576c2c7d1512b744a10501c1fa29dbbf','b639ce9e094ecbd9','6d250b9b4c5704dc'), ++('1512b744a10501c1fa29dbbf6d250b9b','4c5704dc576c2c7d','425129f81127028c'), ++('a10501c1fa29dbbf6d250b9b425129f8','1127028c1512b744','1c1d3461f0f2853a'), ++('fa29dbbf6d250b9b425129f81c1d3461','f0f2853aa10501c1','0cd3a0f6090223ad'), ++('6d250b9b425129f81c1d34610cd3a0f6','090223adfa29dbbf','3f1ae23dc9f50caa'), ++('425129f81c1d34610cd3a0f63f1ae23d','c9f50caa6d250b9b','c607e3a739d952bd'), ++('1c1d34610cd3a0f63f1ae23dc607e3a7','39d952bd425129f8','a7c37b01778cfd66'), ++('0cd3a0f63f1ae23dc607e3a7a7c37b01','778cfd661c1d3461','86fcf8d861571bd0'), ++('3f1ae23dc607e3a7a7c37b0186fcf8d8','61571bd00cd3a0f6','1ac486e14d5a6e5e'), ++('c607e3a7a7c37b0186fcf8d81ac486e1','4d5a6e5e3f1ae23d','24d2684377e6b4db'), ++('a7c37b0186fcf8d81ac486e124d26843','77e6b4dbc607e3a7','1e32d09b23650984'), ++('86fcf8d81ac486e124d268431e32d09b','23650984a7c37b01','5b6dc5b76658c697'), ++('1ac486e124d268431e32d09b5b6dc5b7','6658c69786fcf8d8','acbfa163a27c5d5a'), ++('24d268431e32d09b5b6dc5b7acbfa163','a27c5d5a1ac486e1','ff6df5914f798172'), ++('1e32d09b5b6dc5b7acbfa163ff6df591','4f79817224d26843','8037c6e4f7ed9a01'), ++('5b6dc5b7acbfa163ff6df5918037c6e4','f7ed9a011e32d09b','e756fba9caaef435'), ++('acbfa163ff6df5918037c6e4e756fba9','caaef4355b6dc5b7','877153a693baf1f0'), ++('ff6df5918037c6e4e756fba9877153a6','93baf1f0acbfa163','da0e96cc8f6b4ce4'), ++('8037c6e4e756fba9877153a6da0e96cc','8f6b4ce4ff6df591','6d102fe1d052114f'), ++('e756fba9877153a6da0e96cc6d102fe1','d052114f8037c6e4','53d86a55fd9299f7'), ++('877153a6da0e96cc6d102fe153d86a55','fd9299f7e756fba9','65e2e878adf68d12'), ++('da0e96cc6d102fe153d86a5565e2e878','adf68d12877153a6','aa9238f226b98c28'), ++('6d102fe153d86a5565e2e878aa9238f2','26b98c28da0e96cc','3958111dca7f116a'), ++('53d86a5565e2e878aa9238f23958111d','ca7f116a6d102fe1','359689cf347e085b'), ++('65e2e878aa9238f23958111d359689cf','347e085b53d86a55','f2bf605cc2888de6'), ++('aa9238f23958111d359689cff2bf605c','c2888de665e2e878','1cd072700ab5febf'), ++('3958111d359689cff2bf605c1cd07270','0ab5febfaa9238f2','ebc513459eae999c'), ++('359689cff2bf605c1cd07270ebc51345','9eae999c3958111d','ab383a8fadc4d980'), ++('f2bf605c1cd07270ebc51345ab383a8f','adc4d980359689cf','b3f1b02b11ed23c0') ++] + + # Test data for XOR + +diff -rauN pycrypto-2.0.1/Util/test.py pycrypto-2.0.1-batt/Util/test.py +--- pycrypto-2.0.1/Util/test.py 2004-08-14 00:24:18.000000000 +0200 ++++ pycrypto-2.0.1-batt/Util/test.py 2007-05-26 13:25:08.000000000 +0200 +@@ -224,7 +224,7 @@ + + + def TestBlockModules(args=['aes', 'arc2', 'des', 'blowfish', 'cast', 'des3', +- 'idea', 'rc5'], ++ 'idea', 'rc5', 'tea'], + verbose=1): + import string + args=map(string.lower, args) +@@ -449,5 +449,20 @@ + if verbose: print hex(ord(i)), + if verbose: print + ++ if 'tea' in args: ++ ciph=exerciseBlockCipher('TEA', verbose) # TEA block cipher ++ if (ciph!=None): ++ if verbose: print ' Verifying against test suite...' ++ for entry in testdata.tea: ++ key,plain,cipher=entry ++ key=binascii.a2b_hex(key) ++ plain=binascii.a2b_hex(plain) ++ cipher=binascii.a2b_hex(cipher) ++ obj=ciph.new(key, ciph.MODE_ECB) ++ ciphertext=obj.encrypt(plain) ++ if (ciphertext!=cipher): ++ die('TEA failed on entry '+`entry`) ++ ++ + + + |