pyTomCrypt.py (v0.20) --------------------- A ctypes Python wrapper for LibTomCrypt v1.17. See http://libtom.org/ Implements: - public key algorithms: RSA, DSA, ECDSA, ECDH - hash algorithms: md2, md4, md5, rmd128, rmd160, rmd256, rmd320, sha1, sha224, sha256, sha384, sha512, tiger, whirlpool - symmetric ciphers: aes, rijndael, twofish, blowfish, des, rc2, des3, cast5, kasumi, anubis, kseed, khazad, noekeon, rc5, rc6, xtea, skipjack - modes: ecb, cbc, ctr, cfb, ofb - MACs: HMAC, OMAC, PMAC, Pelican, XCBC, F9 - PRNGs: fortuna, rc4, sprng, yarrow, sober128 - libtomcrypt 1.17 - libtommath 0.41 (default) - tomsfastmath 0.12 (optional) Not [yet] supported: - symmetric cipher: safer - modes: lrw, f8 - hash: chc - EC curves other than Tom's base set - DSA encrypt/decrypt - ASN.1/DER routines - EAX, OCB, CCM, GCM Examples of use: see contents of demos and test dirs Copyright (c) 2005-2011 by Larry Bugbee, Kent, WA All Rights Reserved. pyTomCrypt IS EXPERIMENTAL SOFTWARE FOR EDUCATIONAL PURPOSES ONLY. IT IS MADE AVAILABLE "AS-IS" WITHOUT WARRANTY OR GUARANTEE OF ANY KIND. ITS USE SIGNIFIES FULL ACCEPTANCE OF ALL RISK, UNDER ALL CIRCUMSTANCES, NO EXCEPTIONS. To make your learning and experimentation less cumbersome, pyTomCrypt is free for any use. pyTomCrypt-v0.20.zip Enjoy, Larry Bugbee bugbee@seanet.com June 4, 2007 rev July 2011 ---------------------------------------------------------------- ToDo: - support for EC curves other than Tom's base set - ASN.1/DER routines - a minimalist build for NSA's Suite B - provide a mechanism to allow the packaging of LTC, LTM, TFM and application code as a single Python application without having to install the libs into /usr/lib. ...including auto detect of platform to support native code for multiple platforms. (I have a version of hotSalsa.py, an app that builds on Salsa20, that does this.) Changes for v0.20 (August 18, 2007): - added support for ELF by adding SONAME to makefile.plus (suggested by Noah and the Fedora crew) - changed default math lib back to LTM (libtommath) Changes for v0.19 (June 4, 2007): - added support for Tom's FastMath lib - to switch between LTM and TFM, change the value of USE_MATH_LIB in pyTomCrypt.py Changes for v0.18: - support libtomcrypt v1.17 by upgrading tomcrypt_plus.c to reflect new "LTC_" name changes ---------------------------------------------------------------- Installation ------------ Prerequisites (compiled and installed): - Python 2.5, or Python 2.4.x with ctypes added - LibTomCrypt 1.17 - LibTomMath 0.41 - TomsFastMath 0.12 Configuration ------------- suggested location: your Python program | pyTomCrypt.py in Python's site-packages | \ | libtomcrypt_plus.so in /usr/local/lib | / libtomcrypt.so in /usr/local/lib | libtommath.so in /usr/local/lib LibTomCrypt, LibTomMath (LTM), and TomsFastMath (TFM) ----------------------------------------------------- Follow Tom's instructions to create shared libraries just as if you were going to use them in a C program. Do NOT make them Python extensions; it won't work. See http://libtom.org/ for his build instructions. (I'm running OSX and Ubuntu and found it necessary to tweak Tom's makefiles some, so if you get stuck, I can make mine available.) LibTomCrypt_plus ---------------- LibTomCrypt_plus is a very small C module to provide some constants and struct sizes not exposed by LibTomCrypt. Perhaps a future version will include these small functions, but until then... make -f makefile.plus sudo make -f makefile.plus install Be sure to build libtomcrypt_plus.so as a shared library, NOT a Python extension. pyTomCrypt ---------- sudo python setup.py install To switch between LTM and TFM, change the value of USE_MATH_LIB in pyTomCrypt.py Installed and tested on: - G4 miniMac, MacOSX 10.4.9, gcc 4.0, Python 2.4 - G4 miniMac, Ubuntu 7.04, gcc 4.1, Python 2.5 - AMD Athlon, Mandriva 2006, gcc 3.4, Python 2.4 A few general comments about ctypes ----------------------------------- ctypes will look in various locations for shared libraries but where can vary by platform. Libraries in /usr/lib are pretty much guaranteed to be found, but that may not be the best place for your compiled libraries. Personally I prefer /usr/local/lib. Regardless of where, you may need to set and export a load library path appropriate to your platform. LD_LIBRARY_PATH Linux DYLD_LIBRARY_PATH Darwin SHLIB_PATH HP-UX LD_LIBRARY_PATH_32 32-bit Solaris LD_LIBRARY_PATH_64 64-bit Solaris Recently, some libraries did not load and the complaint was unresolved labels. Subject to additional testing, it appears ctypes does not work well in dynamic linking environments, that is, ctypes prefers libraries that are fully linked. This may require the removal of extern when the library does indeed include an implementation, and this may also require using the -l option to specify additional libraries that should be included in the link. Disabling options such as -undefined suppress may be helpful in finding unresolved labels. ---------------------------------------------------------------- ---------------------------------------------------------------- ----------------------------------------------------------------