From 9cdfa95054a1843cd75c2da064b12cfd59571cbf Mon Sep 17 00:00:00 2001 From: Mari Wahl Date: Sat, 11 Oct 2014 01:54:02 -0400 Subject: [PATCH] some small fixes --- Cryptography/pycrypto-2.6.1/ACKS | 58 + Cryptography/pycrypto-2.6.1/COPYRIGHT | 69 + Cryptography/pycrypto-2.6.1/ChangeLog | 699 +++ Cryptography/pycrypto-2.6.1/Doc/epydoc-config | 27 + Cryptography/pycrypto-2.6.1/Doc/pycrypt.rst | 1188 ++++ Cryptography/pycrypto-2.6.1/LEGAL/00INDEX | 3 + .../LEGAL/CodeSubmissionRequirements.txt | 49 + .../pycrypto-2.6.1/LEGAL/copy/00INDEX | 4 + .../pycrypto-2.6.1/LEGAL/copy/LICENSE.libtom | 5 + .../pycrypto-2.6.1/LEGAL/copy/LICENSE.orig | 15 + .../LEGAL/copy/LICENSE.python-2.2 | 253 + .../LEGAL/copy/stmts/Andrew_M_Kuchling.mbox | 156 + .../LEGAL/copy/stmts/Barry_A_Warsaw.mbox | 135 + .../LEGAL/copy/stmts/Jeethu_Rao.mbox | 277 + .../LEGAL/copy/stmts/Joris_Bontje.mbox | 298 + .../LEGAL/copy/stmts/Mark_Moraes.mbox | 340 ++ .../LEGAL/copy/stmts/Paul_Swartz.mbox | 211 + .../LEGAL/copy/stmts/Robey_Pointer.asc | 53 + .../LEGAL/copy/stmts/Wim_Lewis.asc | 45 + .../pycrypto-2.6.1/LEGAL/tsu-notify.mbox | 130 + Cryptography/pycrypto-2.6.1/MANIFEST.in | 7 + Cryptography/pycrypto-2.6.1/PKG-INFO | 19 + Cryptography/pycrypto-2.6.1/README | 103 + Cryptography/pycrypto-2.6.1/TODO | 30 + Cryptography/pycrypto-2.6.1/configure | 4925 +++++++++++++++++ Cryptography/pycrypto-2.6.1/configure.ac | 57 + Cryptography/pycrypto-2.6.1/pct-speedtest.py | 221 + Cryptography/pycrypto-2.6.1/setup.py | 473 ++ Cryptography/pycrypto-2.6.1/src/AES.c | 1459 +++++ Cryptography/pycrypto-2.6.1/src/ARC2.c | 220 + Cryptography/pycrypto-2.6.1/src/ARC4.c | 88 + .../pycrypto-2.6.1/src/Blowfish-tables.h | 258 + Cryptography/pycrypto-2.6.1/src/Blowfish.c | 245 + Cryptography/pycrypto-2.6.1/src/CAST.c | 453 ++ Cryptography/pycrypto-2.6.1/src/DES.c | 109 + Cryptography/pycrypto-2.6.1/src/DES3.c | 26 + Cryptography/pycrypto-2.6.1/src/MD2.c | 147 + Cryptography/pycrypto-2.6.1/src/MD4.c | 221 + Cryptography/pycrypto-2.6.1/src/RIPEMD160.c | 427 ++ Cryptography/pycrypto-2.6.1/src/SHA224.c | 74 + Cryptography/pycrypto-2.6.1/src/SHA256.c | 73 + Cryptography/pycrypto-2.6.1/src/SHA384.c | 80 + Cryptography/pycrypto-2.6.1/src/SHA512.c | 80 + Cryptography/pycrypto-2.6.1/src/XOR.c | 76 + Cryptography/pycrypto-2.6.1/src/_counter.c | 584 ++ Cryptography/pycrypto-2.6.1/src/_counter.h | 50 + Cryptography/pycrypto-2.6.1/src/_fastmath.c | 2732 +++++++++ .../pycrypto-2.6.1/src/block_template.c | 821 +++ Cryptography/pycrypto-2.6.1/src/cast5.c | 437 ++ Cryptography/pycrypto-2.6.1/src/config.h.in | 141 + Cryptography/pycrypto-2.6.1/src/hash_SHA2.h | 104 + .../pycrypto-2.6.1/src/hash_SHA2_template.c | 199 + .../pycrypto-2.6.1/src/hash_template.c | 366 ++ .../pycrypto-2.6.1/src/inc-msvc/config.h | 16 + .../pycrypto-2.6.1/src/inc-msvc/stdint.h | 42 + .../pycrypto-2.6.1/src/libtom/tomcrypt.h | 87 + .../src/libtom/tomcrypt_argchk.h | 38 + .../pycrypto-2.6.1/src/libtom/tomcrypt_cfg.h | 136 + .../src/libtom/tomcrypt_cipher.h | 839 +++ .../src/libtom/tomcrypt_custom.h | 403 ++ .../pycrypto-2.6.1/src/libtom/tomcrypt_des.c | 1912 +++++++ .../pycrypto-2.6.1/src/libtom/tomcrypt_hash.h | 379 ++ .../pycrypto-2.6.1/src/libtom/tomcrypt_mac.h | 381 ++ .../src/libtom/tomcrypt_macros.h | 424 ++ .../pycrypto-2.6.1/src/libtom/tomcrypt_math.h | 500 ++ .../pycrypto-2.6.1/src/libtom/tomcrypt_misc.h | 23 + .../pycrypto-2.6.1/src/libtom/tomcrypt_pk.h | 544 ++ .../pycrypto-2.6.1/src/libtom/tomcrypt_pkcs.h | 89 + .../pycrypto-2.6.1/src/libtom/tomcrypt_prng.h | 199 + .../pycrypto-2.6.1/src/pycrypto_compat.h | 77 + .../pycrypto-2.6.1/src/stream_template.c | 364 ++ Cryptography/pycrypto-2.6.1/src/strxor.c | 257 + Cryptography/pycrypto-2.6.1/src/winrand.c | 472 ++ Cryptography/tools/xortool-master/.gitignore | 6 + Cryptography/tools/xortool-master/LICENSE | 21 + Cryptography/tools/xortool-master/README.md | 109 + Cryptography/tools/xortool-master/setup.py | 35 + .../xortool-master/test/data/binary_xored | Bin 0 -> 96324 bytes .../tools/xortool-master/test/data/ls_xored | Bin 0 -> 96324 bytes .../tools/xortool-master/test/data/text_xored | 1 + .../tools/xortool-master/test/data/tool_xored | Bin 0 -> 8674 bytes .../tools/xortool-master/xortool/__init__.py | 5 + .../tools/xortool-master/xortool/args.py | 28 + .../tools/xortool-master/xortool/colors.py | 19 + .../tools/xortool-master/xortool/libcolors.py | 80 + .../tools/xortool-master/xortool/routine.py | 98 + .../tools/xortool-master/xortool/xortool | 381 ++ .../tools/xortool-master/xortool/xortool-xor | 116 + ctf_tools_1_light_sd.png | Bin 188440 -> 0 bytes 89 files changed, 27401 insertions(+) create mode 100644 Cryptography/pycrypto-2.6.1/ACKS create mode 100644 Cryptography/pycrypto-2.6.1/COPYRIGHT create mode 100644 Cryptography/pycrypto-2.6.1/ChangeLog create mode 100644 Cryptography/pycrypto-2.6.1/Doc/epydoc-config create mode 100644 Cryptography/pycrypto-2.6.1/Doc/pycrypt.rst create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/00INDEX create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/CodeSubmissionRequirements.txt create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/copy/00INDEX create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/copy/LICENSE.libtom create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/copy/LICENSE.orig create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/copy/LICENSE.python-2.2 create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Andrew_M_Kuchling.mbox create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Barry_A_Warsaw.mbox create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Jeethu_Rao.mbox create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Joris_Bontje.mbox create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Mark_Moraes.mbox create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Paul_Swartz.mbox create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Robey_Pointer.asc create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Wim_Lewis.asc create mode 100644 Cryptography/pycrypto-2.6.1/LEGAL/tsu-notify.mbox create mode 100644 Cryptography/pycrypto-2.6.1/MANIFEST.in create mode 100644 Cryptography/pycrypto-2.6.1/PKG-INFO create mode 100644 Cryptography/pycrypto-2.6.1/README create mode 100644 Cryptography/pycrypto-2.6.1/TODO create mode 100755 Cryptography/pycrypto-2.6.1/configure create mode 100644 Cryptography/pycrypto-2.6.1/configure.ac create mode 100644 Cryptography/pycrypto-2.6.1/pct-speedtest.py create mode 100644 Cryptography/pycrypto-2.6.1/setup.py create mode 100644 Cryptography/pycrypto-2.6.1/src/AES.c create mode 100644 Cryptography/pycrypto-2.6.1/src/ARC2.c create mode 100644 Cryptography/pycrypto-2.6.1/src/ARC4.c create mode 100644 Cryptography/pycrypto-2.6.1/src/Blowfish-tables.h create mode 100644 Cryptography/pycrypto-2.6.1/src/Blowfish.c create mode 100644 Cryptography/pycrypto-2.6.1/src/CAST.c create mode 100644 Cryptography/pycrypto-2.6.1/src/DES.c create mode 100644 Cryptography/pycrypto-2.6.1/src/DES3.c create mode 100644 Cryptography/pycrypto-2.6.1/src/MD2.c create mode 100644 Cryptography/pycrypto-2.6.1/src/MD4.c create mode 100644 Cryptography/pycrypto-2.6.1/src/RIPEMD160.c create mode 100644 Cryptography/pycrypto-2.6.1/src/SHA224.c create mode 100644 Cryptography/pycrypto-2.6.1/src/SHA256.c create mode 100644 Cryptography/pycrypto-2.6.1/src/SHA384.c create mode 100644 Cryptography/pycrypto-2.6.1/src/SHA512.c create mode 100644 Cryptography/pycrypto-2.6.1/src/XOR.c create mode 100644 Cryptography/pycrypto-2.6.1/src/_counter.c create mode 100644 Cryptography/pycrypto-2.6.1/src/_counter.h create mode 100644 Cryptography/pycrypto-2.6.1/src/_fastmath.c create mode 100644 Cryptography/pycrypto-2.6.1/src/block_template.c create mode 100644 Cryptography/pycrypto-2.6.1/src/cast5.c create mode 100644 Cryptography/pycrypto-2.6.1/src/config.h.in create mode 100644 Cryptography/pycrypto-2.6.1/src/hash_SHA2.h create mode 100644 Cryptography/pycrypto-2.6.1/src/hash_SHA2_template.c create mode 100644 Cryptography/pycrypto-2.6.1/src/hash_template.c create mode 100644 Cryptography/pycrypto-2.6.1/src/inc-msvc/config.h create mode 100644 Cryptography/pycrypto-2.6.1/src/inc-msvc/stdint.h create mode 100644 Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt.h create mode 100644 Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_argchk.h create mode 100644 Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_cfg.h create mode 100644 Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_cipher.h create mode 100644 Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_custom.h create mode 100644 Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_des.c create mode 100644 Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_hash.h create mode 100644 Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_mac.h create mode 100644 Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_macros.h create mode 100644 Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_math.h create mode 100644 Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_misc.h create mode 100644 Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_pk.h create mode 100644 Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_pkcs.h create mode 100644 Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_prng.h create mode 100644 Cryptography/pycrypto-2.6.1/src/pycrypto_compat.h create mode 100644 Cryptography/pycrypto-2.6.1/src/stream_template.c create mode 100644 Cryptography/pycrypto-2.6.1/src/strxor.c create mode 100644 Cryptography/pycrypto-2.6.1/src/winrand.c create mode 100644 Cryptography/tools/xortool-master/.gitignore create mode 100644 Cryptography/tools/xortool-master/LICENSE create mode 100644 Cryptography/tools/xortool-master/README.md create mode 100644 Cryptography/tools/xortool-master/setup.py create mode 100644 Cryptography/tools/xortool-master/test/data/binary_xored create mode 100644 Cryptography/tools/xortool-master/test/data/ls_xored create mode 100644 Cryptography/tools/xortool-master/test/data/text_xored create mode 100644 Cryptography/tools/xortool-master/test/data/tool_xored create mode 100644 Cryptography/tools/xortool-master/xortool/__init__.py create mode 100644 Cryptography/tools/xortool-master/xortool/args.py create mode 100644 Cryptography/tools/xortool-master/xortool/colors.py create mode 100644 Cryptography/tools/xortool-master/xortool/libcolors.py create mode 100644 Cryptography/tools/xortool-master/xortool/routine.py create mode 100755 Cryptography/tools/xortool-master/xortool/xortool create mode 100755 Cryptography/tools/xortool-master/xortool/xortool-xor delete mode 100644 ctf_tools_1_light_sd.png diff --git a/Cryptography/pycrypto-2.6.1/ACKS b/Cryptography/pycrypto-2.6.1/ACKS new file mode 100644 index 0000000..f81ab76 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/ACKS @@ -0,0 +1,58 @@ +Acknowledgements +---------------- + +This list is sorted in alphabetical order, and is probably incomplete. +I'd like to thank everybody who contributed in any way, with code, bug +reports, and comments. + +This list should not be interpreted as an endorsement of PyCrypto by the +people on it. + +Please let me know if your name isn't here and should be! + +- Dwayne C. Litzenberger + + +Nevins Bartolomeo +Thorsten E. Behrens +Tim Berners-Lee +Frédéric Bertolus +Ian Bicking +Joris Bontje +Antoon Bosselaers +Andrea Bottoni +Jean-Paul Calderone +Sergey Chernov +Geremy Condra +Jan Dittberner +Andrew Eland +Philippe Frycia +Peter Gutmann +Hirendra Hindocha +Nikhil Jhingan +Sebastian Kayser +Ryan Kelly +Andrew M. Kuchling +Piers Lauder +Legrandin +M.-A. Lemburg +Wim Lewis +Mark Moraes +Lim Chee Siang +Bryan Olson +Wallace Owen +Colin Plumb +Robey Pointer +Lorenz Quack +Sebastian Ramacher +Jeethu Rao +James P. Rutledge +Matt Schreiner +Peter Simmons +Janne Snabb +Tom St. Denis +Anders Sundman +Paul Swartz +Kevin M. Turner +Barry A. Warsaw +Eric Young diff --git a/Cryptography/pycrypto-2.6.1/COPYRIGHT b/Cryptography/pycrypto-2.6.1/COPYRIGHT new file mode 100644 index 0000000..5ea30be --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/COPYRIGHT @@ -0,0 +1,69 @@ +Copyright and licensing of the Python Cryptography Toolkit ("PyCrypto"): +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Previously, the copyright and/or licensing status of the Python +Cryptography Toolkit ("PyCrypto") had been somewhat ambiguous. The +original intention of Andrew M. Kuchling and other contributors has +been to dedicate PyCrypto to the public domain, but that intention was +not necessarily made clear in the original disclaimer (see +LEGAL/copy/LICENSE.orig). + +Additionally, some files within PyCrypto had specified their own +licenses that differed from the PyCrypto license itself. For example, +the original RIPEMD.c module simply had a copyright statement and +warranty disclaimer, without clearly specifying any license terms. +(An updated version on the author's website came with a license that +contained a GPL-incompatible advertising clause.) + +To rectify this situation for PyCrypto 2.1, the following steps have +been taken: + + 1. Obtaining explicit permission from the original contributors to + dedicate their contributions to the public domain if they have not + already done so. (See the "LEGAL/copy/stmts" directory for + contributors' statements.) + + 2. Replacing some modules with clearly-licensed code from other + sources (e.g. the DES and DES3 modules were replaced with new ones + based on Tom St. Denis's public-domain LibTomCrypt library.) + + 3. Replacing some modules with code written from scratch (e.g. the + RIPEMD and Blowfish modules were re-implemented from their + respective algorithm specifications without reference to the old + implementations). + + 4. Removing some modules altogether without replacing them. + +To the best of our knowledge, with the exceptions noted below or +within the files themselves, the files that constitute PyCrypto are in +the public domain. Most are distributed with the following notice: + + The contents of this file are dedicated to the public domain. To + the extent that dedication to the public domain is not available, + everyone is granted a worldwide, perpetual, royalty-free, + non-exclusive license to exercise all rights associated with the + contents of this file for any purpose whatsoever. + No rights are reserved. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +Exception: + + - Portions of HMAC.py and setup.py are derived from Python 2.2, and + are therefore Copyright (c) 2001, 2002, 2003 Python Software + Foundation (All Rights Reserved). They are licensed by the PSF + under the terms of the Python 2.2 license. (See the file + LEGAL/copy/LICENSE.python-2.2 for details.) + +EXPORT RESTRICTIONS: + +Note that the export or re-export of cryptographic software and/or +source code may be subject to regulation in your jurisdiction. + diff --git a/Cryptography/pycrypto-2.6.1/ChangeLog b/Cryptography/pycrypto-2.6.1/ChangeLog new file mode 100644 index 0000000..f37948f --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/ChangeLog @@ -0,0 +1,699 @@ +2.6.1 +===== + * [CVE-2013-1445] Fix PRNG not correctly reseeded in some situations. + + In previous versions of PyCrypto, the Crypto.Random PRNG exhibits a + race condition that may cause forked processes to generate identical + sequences of 'random' numbers. + + This is a fairly obscure bug that will (hopefully) not affect many + applications, but the failure scenario is pretty bad. Here is some + sample code that illustrates the problem: + + from binascii import hexlify + import multiprocessing, pprint, time + import Crypto.Random + + def task_main(arg): + a = Crypto.Random.get_random_bytes(8) + time.sleep(0.1) + b = Crypto.Random.get_random_bytes(8) + rdy, ack = arg + rdy.set() + ack.wait() + return "%s,%s" % (hexlify(a).decode(), + hexlify(b).decode()) + + n_procs = 4 + manager = multiprocessing.Manager() + rdys = [manager.Event() for i in range(n_procs)] + acks = [manager.Event() for i in range(n_procs)] + Crypto.Random.get_random_bytes(1) + pool = multiprocessing.Pool(processes=n_procs, + initializer=Crypto.Random.atfork) + res_async = pool.map_async(task_main, zip(rdys, acks)) + pool.close() + [rdy.wait() for rdy in rdys] + [ack.set() for ack in acks] + res = res_async.get() + pprint.pprint(sorted(res)) + pool.join() + + The output should be random, but it looked like this: + + ['c607803ae01aa8c0,2e4de6457a304b34', + 'c607803ae01aa8c0,af80d08942b4c987', + 'c607803ae01aa8c0,b0e4c0853de927c4', + 'c607803ae01aa8c0,f0362585b3fceba4'] + + This release fixes the problem by resetting the rate-limiter when + Crypto.Random.atfork() is invoked. It also adds some tests and a + few related comments. + +2.6 +=== + * [CVE-2012-2417] Fix LP#985164: insecure ElGamal key generation. + (thanks: Legrandin) + + In the ElGamal schemes (for both encryption and signatures), g is + supposed to be the generator of the entire Z^*_p group. However, in + PyCrypto 2.5 and earlier, g is more simply the generator of a random + sub-group of Z^*_p. + + The result is that the signature space (when the key is used for + signing) or the public key space (when the key is used for encryption) + may be greatly reduced from its expected size of log(p) bits, possibly + down to 1 bit (the worst case if the order of g is 2). + + While it has not been confirmed, it has also been suggested that an + attacker might be able to use this fact to determine the private key. + + Anyone using ElGamal keys should generate new keys as soon as practical. + + Any additional information about this bug will be tracked at + https://bugs.launchpad.net/pycrypto/+bug/985164 + + * Huge documentation cleanup (thanks: Legrandin). + + * Added more tests, including test vectors from NIST 800-38A + (thanks: Legrandin) + + * Remove broken MODE_PGP, which never actually worked properly. + A new mode, MODE_OPENPGP, has been added for people wishing to write + OpenPGP implementations. Note that this does not implement the full + OpenPGP specification, only the "OpenPGP CFB mode" part of that + specification. + https://bugs.launchpad.net/pycrypto/+bug/996814 + + * Fix: getPrime with invalid input causes Python to abort with fatal error + https://bugs.launchpad.net/pycrypto/+bug/988431 + + * Fix: Segfaults within error-handling paths + (thanks: Paul Howarth & Dave Malcolm) + https://bugs.launchpad.net/pycrypto/+bug/934294 + + * Fix: Block ciphers allow empty string as IV + https://bugs.launchpad.net/pycrypto/+bug/997464 + + * Fix DevURandomRNG to work with Python3's new I/O stack. + (thanks: Sebastian Ramacher) + + * Remove automagic dependencies on libgmp and libmpir, let the caller + disable them using args. + + * Many other minor bug fixes and improvements (mostly thanks to Legrandin) + +2.5 +=== + * Added PKCS#1 encryption schemes (v1.5 and OAEP). We now have + a decent, easy-to-use non-textbook RSA implementation. Yay! + + * Added PKCS#1 signature schemes (v1.5 and PSS). v1.5 required some + extensive changes to Hash modules to contain the algorithm specific + ASN.1 OID. To that end, we now always have a (thin) Python module to + hide the one in pure C. + + * Added 2 standard Key Derivation Functions (PBKDF1 and PBKDF2). + + * Added export/import of RSA keys in OpenSSH and PKCS#8 formats. + + * Added password-protected export/import of RSA keys (one old method + for PKCS#8 PEM only). + + * Added ability to generate RSA key pairs with configurable public + exponent e. + + * Added ability to construct an RSA key pair even if only the private + exponent d is known, and not p and q. + + * Added SHA-2 C source code (fully from Lorenz Quack). + + * Unit tests for all the above. + + * Updates to documentation (both inline and in Doc/pycrypt.rst) + + * All of the above changes were put together by Legrandin (Thanks!) + + * Minor bug fixes (setup.py and tests). + +2.4.1 +===== + * Fix "error: Setup script exited with error: src/config.h: No such file or + directory" when installing via easy_install. (Sebastian Ramacher) + +2.4 +=== + * Python 3 support! (Thorsten E. Behrens, Anders Sundman) + PyCrypto now supports every version of Python from 2.1 through 3.2. + + * Timing-attack countermeasures in _fastmath: When built against + libgmp version 5 or later, we use mpz_powm_sec instead of mpz_powm. + This should prevent the timing attack described by Geremy Condra at + PyCon 2011: + http://blip.tv/pycon-us-videos-2009-2010-2011/pycon-2011-through-the-side-channel-timing-and-implementation-attacks-in-python-4897955 + + * New hash modules (for Python >= 2.5 only): SHA224, SHA384, and + SHA512 (Frédéric Bertolus) + + * Configuration using GNU autoconf. This should help fix a bunch of + build issues. + + * Support using MPIR as an alternative to GMP. + + * Improve the test command in setup.py, by allowing tests to be + performed on a single sub-package or module only. (Legrandin) + + You can now do something like this: + + python setup.py test -m Hash.SHA256 --skip-slow-tests + + * Fix double-decref of "counter" when Cipher object initialisation + fails (Ryan Kelly) + + * Apply patches from Debian's python-crypto 2.3-3 package (Jan + Dittberner, Sebastian Ramacher): + - fix-RSA-generate-exception.patch + - epydoc-exclude-introspect.patch + - no-usr-local.patch + + * Fix launchpad bug #702835: "Import key code is not compatible with + GMP library" (Legrandin) + + * More tests, better documentation, various bugfixes. + +2.3 +=== + * Fix NameError when attempting to use deprecated getRandomNumber() + function. + + * _slowmath: Compute RSA u parameter when it's not given to + RSA.construct. This makes _slowmath behave the same as _fastmath in + this regard. + + * Make RSA.generate raise a more user-friendly exception message when + the user tries to generate a bogus-length key. + + +2.2 +=== + + * Deprecated Crypto.Util.number.getRandomNumber(), which had confusing + semantics. It's been replaced by getRandomNBitInteger and + getRandomInteger. (Thanks: Lorenz Quack) + + * Better isPrime() and getPrime() implementations that do a real + Rabin-Miller probabilistic primality test (not the phony test we did + before with fixed bases). (Thanks: Lorenz Quack) + + * getStrongPrime() implementation for generating RSA primes. + (Thanks: Lorenz Quack) + + * Support for importing and exporting RSA keys in DER and PEM format. + (Thanks: Legrandin) + + * Fix PyCrypto when floor division (python -Qnew) is enabled. + + * When building using gcc, use -std=c99 for compilation. This should + fix building on FreeBSD and NetBSD. + + +2.1.0 +===== + + * Fix building PyCrypto on Win64 using MS Visual Studio 9. + (Thanks: Nevins Bartolomeo.) + + +2.1.0beta1 +========== + + * Modified RSA.generate() to ensure that e is coprime to p-1 and q-1. + Apparently, RSA.generate was capable of generating unusable keys. + + +2.1.0alpha2 +=========== + + * Modified isPrime() to release the global interpreter lock while + performing computations. (patch from Lorenz Quack) + + * Release the GIL while encrypting, decrypting, and hashing (but not + during initialization or finalization). + + * API changes: + + - Removed RandomPoolCompat and made Crypto.Util.randpool.RandomPool + a wrapper around Crypto.Random that emits a DeprecationWarning. + This is to discourage developers from attempting to provide + backwards compatibility for systems where there are NO strong + entropy sources available. + + - Added Crypto.Random.get_random_bytes(). This should allow people + to use something like this if they want backwards-compatibility: + + try: + from Crypto.Random import get_random_bytes + except ImportError: + try: + from os import urandom as get_random_bytes + except ImportError: + get_random_bytes = open("/dev/urandom", "rb").read + + - Implemented __ne__() on pubkey, which fixes the following broken + behaviour: + >>> pk.publickey() == pk.publickey() + True + >>> pk.publickey() != pk.publickey() + True + (patch from Lorenz Quack) + + - Block ciphers created with MODE_CTR can now operate on strings of + any size, rather than just multiples of the underlying cipher's + block size. + + - Crypto.Util.Counter objects now raise OverflowError when they wrap + around to zero. You can override this new behaviour by passing + allow_wraparound=True to Counter.new() + + +2.1.0alpha1 +=========== + + * This version supports Python versions 2.1 through 2.6. + + * Clarified copyright status of much of the existing code by tracking + down Andrew M. Kuchling, Barry A. Warsaw, Jeethu Rao, Joris Bontje, + Mark Moraes, Paul Swartz, Robey Pointer, and Wim Lewis and getting + their permission to clarify the license/public-domain status of their + contributions. Many thanks to all involved! + + * Replaced the test suite with a new, comprehensive package + (Crypto.SelfTest) that includes documentation about where its test + vectors came from, or how they were derived. + + Use "python setup.py test" to run the tests after building. + + * API changes: + + - Added Crypto.version_info, which from now on will contain version + information in a format similar to Python's sys.version_info. + + - Added a new random numbers API (Crypto.Random), and deprecated the + old one (Crypto.Util.randpool.RandomPool), which was misused more + often than not. + + The new API is used by invoking Crypto.Random.new() and then just + reading from the file-like object that is returned. + + CAVEAT: To maintain the security of the PRNG, you must call + Crypto.Random.atfork() in both the parent and the child processes + whenever you use os.fork(). Otherwise, the parent and child will + share copies of the same entropy pool, causing them to return the + same results! This is a limitation of Python, which does not + provide readily-accessible hooks to os.fork(). It's also a + limitation caused by the failure of operating systems to provide + sufficiently fast, trustworthy sources of cryptographically-strong + random numbers. + + - Crypto.PublicKey now raises ValueError/TypeError/RuntimeError + instead of the various custom "error" exceptions + + - Removed the IDEA and RC5 modules due to software patents. Debian + has been doing this for a while + + - Added Crypto.Random.random, a strong version of the standard Python + 'random' module. + + - Added Crypto.Util.Counter, providing fast counter implementations + for use with CTR-mode ciphers. + + * Bug fixes: + + - Fixed padding bug in SHA256; this resulted in bad digests whenever + (the number of bytes hashed) mod 64 == 55. + + - Fixed a 32-bit limitation on the length of messages the SHA256 module + could hash. + + - AllOrNothing: Fixed padding bug in digest() + + - Fixed a bad behaviour of the XOR cipher module: It would silently + truncate all keys to 32 bytes. Now it raises ValueError when the + key is too long. + + - DSA: Added code to enforce FIPS 186-2 requirements on the size of + the prime p + + - Fixed the winrandom module, which had been omitted from the build + process, causing security problems for programs that misuse RandomPool. + + - Fixed infinite loop when attempting to generate RSA keys with an + odd number of bits in the modulus. (Not that you should do that.) + + * Clarified the documentation for Crypto.Util.number.getRandomNumber. + + Confusingly, this function does NOT return N random bits; It returns + a random N-bit number, i.e. a random number between 2**(N-1) and (2**N)-1. + + Note that getRandomNumber is for internal use only and may be + renamed or removed in future releases. + + * Replaced RIPEMD.c with a new implementation (RIPEMD160.c) to + alleviate copyright concerns. + + * Replaced the DES/DES3 modules with ones based on libtomcrypt-1.16 to + alleviate copyright concerns. + + * Replaced Blowfish.c with a new implementation to alleviate copyright + concerns. + + * Added a string-XOR implementation written in C (Crypto.Util.strxor) + and used it to speed up Crypto.Hash.HMAC + + * Converted documentation to reStructured Text. + + * Added epydoc configuration Doc/epydoc-config + + * setup.py now emits a warning when building without GMP. + + * Added pct-speedtest.py to the source tree for doing performance + testing on the new code. + + * Cleaned up the code in several places. + + +2.0.1 +===== + + * Fix SHA256 and RIPEMD on AMD64 platform. + * Deleted Demo/ directory. + * Add PublicKey to Crypto.__all__ + + +2.0 +=== + + * Added SHA256 module contributed by Jeethu Rao, with test data + from Taylor Boon. + + * Fixed AES.c compilation problems with Borland C. + (Contributed by Jeethu Rao.) + + * Fix ZeroDivisionErrors on Windows, caused by the system clock + not having enough resolution. + + * Fix 2.1/2.2-incompatible use of (key not in dict), + pointed out by Ian Bicking. + + * Fix FutureWarning in Crypto.Util.randpool, noted by James P Rutledge. + + +1.9alpha6 +========= + + * Util.number.getPrime() would inadvertently round off the bit + size; if you asked for a 129-bit prime or 135-bit prime, you + got a 128-bit prime. + + * Added Util/test/prime_speed.py to measure the speed of prime + generation, and PublicKey/test/rsa_speed.py to measure + the speed of RSA operations. + + * Merged the _rsa.c and _dsa.c files into a single accelerator + module, _fastmath.c. + + * Speed improvements: Added fast isPrime() function to _fastmath, + cutting the time to generate a 1024-bit prime by a factor of 10. + Optimized the C version of RSA decryption to use a longer series + of operations that's roughly 3x faster than a single + exponentiation. (Contributed by Joris Bontje.) + + * Added support to RSA key objects for blinding and unblinding + data. (Contributed by Joris Bontje.) + + * Simplified RSA key generation: hard-wired the encryption + exponent to 65537 instead of generating a random prime; + generate prime factors in a loop until the product + is large enough. + + * Renamed cansign(), canencrypt(), hasprivate(), to + can_sign, can_encrypt, has_private. If people shriek about + this change very loudly, I'll add aliases for the old method + names that log a warning and call the new method. + + +1.9alpha5 +========= + + * Many randpool changes. RandomPool now has a + randomize(N:int) method that can be called to get N + bytes of entropy for the pool (N defaults to 0, + which 'fills up' the pool's entropy) KeyboardRandom + overloads this method. + + * Added src/winrand.c for Crypto.Util.winrandom and + now use winrandom for _randomize if possible. + (Calls Windows CryptoAPI CryptGenRandom) + + * Several additional places for stirring the pool, + capturing inter-event entropy when reading/writing, + stirring before and after saves. + + * RandomPool.add_event now returns the number of + estimated bits of added entropy, rather than the + pool entropy itself (since the pool entropy is + capped at the number of bits in the pool) + + * Moved termios code from KeyboardRandomPool into a + KeyboardEntry class, provided a version for Windows + using msvcrt. + + * Fix randpool.py crash on machines with poor timer resolution. + (Reported by Mark Moraes and others.) + + * If the GNU GMP library is available, two C extensions will be + compiled to speed up RSA and DSA operations. (Contributed by + Paul Swartz.) + + * DES3 with a 24-byte key was broken; now fixed. + (Patch by Philippe Frycia.) + + +1.9alpha4 +========= + + * Fix compilation problem on Windows. + + * HMAC.py fixed to work with pre-2.2 Pythons + + * setup.py now dies if built with Python 1.x + + +1.9alpha3 +========= + + * Fix a ref-counting bug that caused core dumps. + (Reported by Piers Lauder and an anonymous SF poster.) + + +1.9alpha2 +========= + + * (Backwards incompatible) The old Crypto.Hash.HMAC module is + gone, replaced by a copy of hmac.py from Python 2.2's standard + library. It will display a warning on interpreter versions + older than 2.2. + + * (Backwards incompatible) Restored the Crypto.Protocol package, + and modernized and tidied up the two modules in it, + AllOrNothing.py and Chaffing.py, renaming various methods + and changing the interface. + + * (Backwards incompatible) Changed the function names in + Crypto.Util.RFC1751. + + * Restored the Crypto.PublicKey package at user request. I + think I'll leave it in the package and warn about it in the + documentation. I hope that eventually I can point to + someone else's better public-key code, and at that point I + may insert warnings and begin the process of deprecating + this code. + + * Fix use of a Python 2.2 C function, replacing it with a + 2.1-compatible equivalent. (Bug report and patch by Andrew + Eland.) + + * Fix endianness bugs that caused test case failures on Sparc, + PPC, and doubtless other platforms. + + * Fixed compilation problem on FreeBSD and MacOS X. + + * Expanded the test suite (requires Sancho, from + http://www.mems-exchange.org/software/sancho/) + + * Added lots of docstrings, so 'pydoc Crypto' now produces + helpful output. (Open question: maybe *all* of the documentation + should be moved into docstrings?) + + * Make test.py automatically add the build/* directory to sys.path. + + * Removed 'inline' declaration from C functions. Some compilers + don't support it, and Python's pyconfig.h no longer tells you whether + it's supported or not. After this change, some ciphers got slower, + but others got faster. + + * The C-level API has been changed to reduce the amount of + memory-to-memory copying. This makes the code neater, but + had ambiguous performance effects; again, some ciphers got slower + and others became faster. Probably this is due to my compiler + optimizing slightly worse or better as a result. + + * Moved C source implementations into src/ from block/, hash/, + and stream/. Having Hash/ and hash/ directories causes problems + on case-insensitive filesystems such as Mac OS. + + * Cleaned up the C code for the extensions. + + +1.9alpha1 +========= + + * Added Crypto.Cipher.AES. + + * Added the CTR mode and the variable-sized CFB mode from the + NIST standard on feedback modes. + + * Removed Diamond, HAVAL, MD5, Sapphire, SHA, and Skipjack. MD5 + and SHA are included with Python; the others are all of marginal + usefulness in the real world. + + * Renamed the module-level constants ECB, CFB, &c., to MODE_ECB, + MODE_CFB, as part of making the block encryption modules + compliant with PEP 272. (I'm not sure about this change; + if enough users complain about it, I might back it out.) + + * Made the hashing modules compliant with PEP 247 (not backward + compatible -- the major changes are that the constructor is now + MD2.new and not MD2.MD2, and the size of the digest is now + given as 'digest_size', not 'digestsize'. + + * The Crypto.PublicKey package is no longer installed; the + interfaces are all wrong, and I have no idea what the right + interfaces should be. + + +1.1alpha2 +========= + * Most importantly, the distribution has been broken into two +parts: exportable, and export-controlled. The exportable part +contains all the hashing algorithms, signature-only public key +algorithms, chaffing & winnowing, random number generation, various +utility modules, and the documentation. + + The export-controlled part contains public-key encryption +algorithms such as RSA and ElGamal, and bulk encryption algorithms +like DES, IDEA, or Skipjack. Getting this code still requires that +you go through an access control CGI script, and denies you access if +you're outside the US or Canada. + + * Added the RIPEMD hashing algorithm. (Contributed by +Hirendra Hindocha.) + + * Implemented the recently declassified Skipjack block +encryption algorithm. My implementation runs at 864 K/sec on a +PII/266, which isn't particularly fast, but you're probably better off +using another algorithm anyway. :) + + * A simple XOR cipher has been added, mostly for use by the +chaffing/winnowing code. (Contributed by Barry Warsaw.) + + * Added Protocol.Chaffing and Hash.HMAC.py. (Contributed by +Barry Warsaw.) + + Protocol.Chaffing implements chaffing and winnowing, recently +proposed by R. Rivest, which hides a message (the wheat) by adding +many noise messages to it (the chaff). The chaff can be discarded by +the receiver through a message authentication code. The neat thing +about this is that it allows secret communication without actually +having an encryption algorithm, and therefore this falls within the +exportable subset. + + * Tidied up randpool.py, and removed its use of a block +cipher; this makes it work with only the export-controlled subset +available. + + * Various renamings and reorganizations, mostly internal. + + +1.0.2 +===== + + * Changed files to work with Python 1.5; everything has been +re-arranged into a hierarchical package. (Not backward compatible.) +The package organization is: +Crypto. + Hash. + MD2, MD4, MD5, SHA, HAVAL + Cipher. + ARC2, ARC4, Blowfish, CAST, DES, DES3, Diamond, + IDEA, RC5, Sapphire + PublicKey. + DSA, ElGamal, qNEW, RSA + Util. + number, randpool, RFC1751 + + Since this is backward-incompatible anyway, I also changed +module names from all lower-case to mixed-case: diamond -> Diamond, +rc5 -> RC5, etc. That had been an annoying inconsistency for a while. + + * Added CAST5 module contributed by . + + * Added qNEW digital signature algorithm (from the digisign.py +I advertised a while back). (If anyone would like to suggest new +algorithms that should be implemented, please do; I think I've got +everything that's really useful at the moment, but...) + + * Support for keyword arguments has been added. This allowed +removing the obnoxious key handling for Diamond and RC5, where the +first few bytes of the key indicated the number of rounds to use, and +various other parameters. Now you need only do something like: + +from Crypto.Cipher import RC5 +obj = RC5.new(key, RC5.ECB, rounds=8) + +(Not backward compatible.) + + * Various function names have been changed, and parameter +names altered. None of these were part of the public interface, so it +shouldn't really matter much. + + * Various bugs fixed, the test suite has been expanded, and +the build process simplified. + + * Updated the documentation accordingly. + + +1.0.1 +===== + + * Changed files to work with Python 1.4 . + + * The DES and DES3 modules now automatically correct the +parity of their keys. + + * Added R. Rivest's DES test (see http://theory.lcs.mit.edu/~rivest/destest.txt) + + +1.0.0 +===== + + * REDOC III succumbed to differential cryptanalysis, and has +been removed. + + * The crypt and rotor modules have been dropped; they're still +available in the standard Python distribution. + + * The Ultra-Fast crypt() module has been placed in a separate +distribution. + + * Various bugs fixed. diff --git a/Cryptography/pycrypto-2.6.1/Doc/epydoc-config b/Cryptography/pycrypto-2.6.1/Doc/epydoc-config new file mode 100644 index 0000000..c71d200 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/Doc/epydoc-config @@ -0,0 +1,27 @@ +# epydoc configuration file for PyCrypto. +# See http://epydoc.sourceforge.net/configfile.html for sample configuration. + +[epydoc] +modules: Crypto +docformat: restructuredtext +output: html +target: Doc/apidoc/ +sourcecode: no + +# Do not include private variables +private: no + +# Include the complete set of inherited methods, but grouped in a special +# section +inheritance: grouped + +name: PyCrypto API Documentation +url: http://www.pycrypto.org/ + +link: PyCrypto.org + +# The documentation is usually built on a Linux machine; nt.py tries to +# import the winrandom module. +exclude-introspect: ^Crypto\.Random\.OSRNG\.nt|Crypto\.Util\.winrandom$ +exclude-introspect: ^Crypto\.Util\.osentropy\.nt$ +exclude: ^Crypto\.SelfTest diff --git a/Cryptography/pycrypto-2.6.1/Doc/pycrypt.rst b/Cryptography/pycrypto-2.6.1/Doc/pycrypt.rst new file mode 100644 index 0000000..2a4deb7 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/Doc/pycrypt.rst @@ -0,0 +1,1188 @@ +==================================== +Python Cryptography Toolkit +==================================== + +**Version 2.6.1** + +The Python Cryptography Toolkit describes a package containing various +cryptographic modules for the Python programming language. This +documentation assumes you have some basic knowledge about the Python +language, but not necessarily about cryptography. + +.. contents:: + +Introduction +------------------- + +Design Goals +=================== + +The Python cryptography toolkit is intended to provide a reliable and +stable base for writing Python programs that require cryptographic +functions. + +A central goal has been to provide a simple, consistent interface for +similar classes of algorithms. For example, all block cipher objects +have the same methods and return values, and support the same feedback +modes. Hash functions have a different interface, but it too is +consistent over all the hash functions available. Some of these +interfaces have been codified as Python Enhancement Proposal +documents, as PEP 247, "API for Cryptographic Hash Functions", and +PEP 272, "API for Block Encryption Algorithms". + +This is intended to make it easy to replace old algorithms with newer, +more secure ones. If you're given a bit of portably-written Python +code that uses the DES encryption algorithm, you should be able to use +AES instead by simply changing ``from Crypto.Cipher import DES`` to +``from Crypto.Cipher import AES``, and changing all references to +``DES.new()`` to ``AES.new()``. It's also fairly simple to +write your own modules that mimic this interface, thus letting you use +combinations or permutations of algorithms. + +Some modules are implemented in C for performance; others are written +in Python for ease of modification. Generally, low-level functions +like ciphers and hash functions are written in C, while less +speed-critical functions have been written in Python. This division +may change in future releases. When speeds are quoted in this +document, they were measured on a 500 MHz Pentium II running Linux. +The exact speeds will obviously vary with different machines, +different compilers, and the phase of the moon, but they provide a +crude basis for comparison. Currently the cryptographic +implementations are acceptably fast, but not spectacularly good. I +welcome any suggestions or patches for faster code. + +I have placed the code under no restrictions; you can redistribute the +code freely or commercially, in its original form or with any +modifications you make, subject to whatever local laws may apply in your +jurisdiction. Note that you still have to come to some agreement with +the holders of any patented algorithms you're using. If you're +intensively using these modules, please tell me about it; there's little +incentive for me to work on this package if I don't know of anyone using +it. + +I also make no guarantees as to the usefulness, correctness, or legality +of these modules, nor does their inclusion constitute an endorsement of +their effectiveness. Many cryptographic algorithms are patented; +inclusion in this package does not necessarily mean you are allowed to +incorporate them in a product and sell it. Some of these algorithms may +have been cryptanalyzed, and may no longer be secure. While I will +include commentary on the relative security of the algorithms in the +sections entitled "Security Notes", there may be more recent analyses +I'm not aware of. (Or maybe I'm just clueless.) If you're implementing +an important system, don't just grab things out of a toolbox and put +them together; do some research first. On the other hand, if you're +just interested in keeping your co-workers or your relatives out of your +files, any of the components here could be used. + +This document is very much a work in progress. If you have any +questions, comments, complaints, or suggestions, please send them to me. + +Acknowledgements +================================================== + +Much of the code that actually implements the various cryptographic +algorithms was not written by me. I'd like to thank all the people who +implemented them, and released their work under terms which allowed me +to use their code. These individuals are credited in the relevant +chapters of this documentation. Bruce Schneier's book +:title-reference:`Applied Cryptography` was also very useful in writing this toolkit; I highly +recommend it if you're interested in learning more about cryptography. + +Good luck with your cryptography hacking! + + +Crypto.Hash: Hash Functions +-------------------------------------------------- + +Hash functions take arbitrary strings as input, and produce an output +of fixed size that is dependent on the input; it should never be +possible to derive the input data given only the hash function's +output. One simple hash function consists of simply adding together +all the bytes of the input, and taking the result modulo 256. For a +hash function to be cryptographically secure, it must be very +difficult to find two messages with the same hash value, or to find a +message with a given hash value. The simple additive hash function +fails this criterion miserably and the hash functions described below +meet this criterion (as far as we know). Examples of +cryptographically secure hash functions include MD2, MD5, and SHA1. + +Hash functions can be used simply as a checksum, or, in association with a +public-key algorithm, can be used to implement digital signatures. + +The hashing algorithms currently implemented are: + +============= ============= ======== +Hash function Digest length Security +============= ============= ======== +MD2 128 bits Insecure, do not use +MD4 128 bits Insecure, do not use +MD5 128 bits Insecure, do not use +RIPEMD 160 bits Secure. This is RIPEMD-160. +SHA 160 bits SHA1 is shaky. Walk, do not run, away from SHA1. +SHA256 256 bits Secure. +============= ============= ======== + +Resources: +On SHA1 (in)security: http://www.schneier.com/blog/archives/2005/02/cryptanalysis_o.html +SHA1 phase-out by 2010: http://csrc.nist.gov/groups/ST/toolkit/documents/shs/hash_standards_comments.pdf +On MD5 insecurity: http://www.schneier.com/blog/archives/2008/12/forging_ssl_cer.html + +Crypto.Hash.HMAC implements the RFC-2104 HMAC algorithm. The HMAC module is +a copy of Python 2.2's module, and works on Python 2.1 as well. +HMAC's security depends on the cryptographic strength of the key handed to it, +and on the underlying hashing method used. HMAC-MD5 and HMAC-SHA1 are used in +IPSEC and TLS. + +All hashing modules with the exception of HMAC share the same interface. +After importing a given hashing module, call the ``new()`` function to create +a new hashing object. You can now feed arbitrary strings into the object +with the ``update()`` method, and can ask for the hash value at +any time by calling the ``digest()`` or ``hexdigest()`` +methods. The ``new()`` function can also be passed an optional +string parameter that will be immediately hashed into the object's +state. + +To create a HMAC object, call HMAC's ```new()`` function with the key (as +a string or bytes object) to be used, an optional message, and the hash +function to use. HMAC defaults to using MD5. This is not a secure default, +please use SHA256 or better instead in new implementations. + +Hash function modules define one variable: + +**digest_size**: +An integer value; the size of the digest +produced by the hashing objects. You could also obtain this value by +creating a sample object, and taking the length of the digest string +it returns, but using ``digest_size`` is faster. + +The methods for hashing objects are always the following: + +**copy()**: +Return a separate copy of this hashing object. An ``update`` to +this copy won't affect the original object. + + +**digest()**: +Return the hash value of this hashing object, as a string containing +8-bit data. The object is not altered in any way by this function; +you can continue updating the object after calling this function. +Python 3.x: digest() returns a bytes object + +**hexdigest()**: +Return the hash value of this hashing object, as a string containing +the digest data as hexadecimal digits. The resulting string will be +twice as long as that returned by ``digest()``. The object is not +altered in any way by this function; you can continue updating the +object after calling this function. + + +**update(arg)**: +Update this hashing object with the string ``arg``. +Python 3.x: The passed argument must be an object interpretable as +a buffer of bytes + + +Here's an example, using the SHA-256 algorithm:: + + >>> from Crypto.Hash import SHA256 + >>> m = SHA256.new() + >>> m.update('abc') + >>> m.digest() + '\xbax\x16\xbf\x8f\x01\xcf\xeaAA@\xde]\xae"#\xb0\x03a\xa3\x96\x17z\x9c\xb4\x10\xffa\xf2\x00\x15\xad' + >>> m.hexdigest() + 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad' + +Here's an example of using HMAC:: + + >>> from Crypto.Hash import HMAC, SHA256 + >>> m = HMAC.new('Please do not use this key in your code, with sugar on top', + '', SHA256) + >>> m.update('abc') + >>> m.digest() + 'F\xaa\x83\t\x97<\x8c\x12\xff\xe8l\xca:\x1d\xb4\xfc7\xfa\x84tK-\xb0\x00v*\xc2\x90\x19\xaa\xfaz' + >>> m.hexdigest() + '46aa8309973c8c12ffe86cca3a1db4fc37fa84744b2db000762ac29019aafa7a' + +Security Notes +========================== + +Hashing algorithms are broken by developing an algorithm to compute a +string that produces a given hash value, or to find two messages that +produce the same hash value. Consider an example where Alice and Bob +are using digital signatures to sign a contract. Alice computes the +hash value of the text of the contract and signs the hash value with +her private key. Bob could then compute a different contract that has +the same hash value, and it would appear that Alice signed that bogus +contract; she'd have no way to prove otherwise. Finding such a +message by brute force takes ``pow(2, b-1)`` operations, where the +hash function produces *b*-bit hashes. + +If Bob can only find two messages with the same hash value but can't +choose the resulting hash value, he can look for two messages with +different meanings, such as "I will mow Bob's lawn for $10" and "I owe +Bob $1,000,000", and ask Alice to sign the first, innocuous contract. +This attack is easier for Bob, since finding two such messages by brute +force will take ``pow(2, b/2)`` operations on average. However, +Alice can protect herself by changing the protocol; she can simply +append a random string to the contract before hashing and signing it; +the random string can then be kept with the signature. + +Some of the algorithms implemented here have been completely broken. +The MD2, MD4 and MD5 hash functions are widely considered insecure +hash functions, as it has been proven that meaningful hash collisions +can be generated for them, in the case of MD4 and MD5 in mere seconds. +MD2 is rather slow at 1250 K/sec. MD4 is faster at 44,500 K/sec. +MD5 is a strengthened version of MD4 with four rounds; beginning in 2004, +a series of attacks were discovered and it's now possible to create pairs +of files that result in the same MD5 hash. The MD5 +implementation is moderately well-optimized and thus faster on x86 +processors, running at 35,500 K/sec. MD5 may even be faster than MD4, +depending on the processor and compiler you use. +MD5 is still supported for compatibility with existing protocols, but +implementors should use SHA256 in new software because there are no known +attacks against SHA256. + +All the MD* algorithms produce 128-bit hashes. +SHA1 produces a 160-bit hash. Because of recent theoretical attacks against SHA1, +NIST recommended phasing out use of SHA1 by 2010. +SHA256 produces a larger 256-bit hash, and there are no known attacks against it. +It operates at 10,500 K/sec. +RIPEMD has a 160-bit output, the same output size as SHA1, and operates at 17,600 +K/sec. + +Credits +=============== + +The MD2 and MD4 implementations were written by A.M. Kuchling, and the MD5 +code was implemented by Colin Plumb. The SHA1 code was originally written by +Peter Gutmann. The RIPEMD160 code as of version 2.1.0 was written by Dwayne +Litzenberger. The SHA256 code was written by Tom St. Denis and is part of the +LibTomCrypt library (http://www.libtomcrypt.org/); it was adapted for the +toolkit by Jeethu Rao and Taylor Boon. + + + +Crypto.Cipher: Encryption Algorithms +-------------------------------------------------- + +Encryption algorithms transform their input data, or **plaintext**, +in some way that is dependent on a variable **key**, producing +**ciphertext**. This transformation can easily be reversed, if (and, +hopefully, only if) one knows the key. The key can be varied by the +user or application and chosen from some very large space of possible +keys. + +For a secure encryption algorithm, it should be very difficult to +determine the original plaintext without knowing the key; usually, no +clever attacks on the algorithm are known, so the only way of breaking +the algorithm is to try all possible keys. Since the number of possible +keys is usually of the order of 2 to the power of 56 or 128, this is not +a serious threat, although 2 to the power of 56 is now considered +insecure in the face of custom-built parallel computers and distributed +key guessing efforts. + +**Block ciphers** take multibyte inputs of a fixed size +(frequently 8 or 16 bytes long) and encrypt them. Block ciphers can +be operated in various modes. The simplest is Electronic Code Book +(or ECB) mode. In this mode, each block of plaintext is simply +encrypted to produce the ciphertext. This mode can be dangerous, +because many files will contain patterns greater than the block size; +for example, the comments in a C program may contain long strings of +asterisks intended to form a box. All these identical blocks will +encrypt to identical ciphertext; an adversary may be able to use this +structure to obtain some information about the text. + +To eliminate this weakness, there are various feedback modes in which +the plaintext is combined with the previous ciphertext before +encrypting; this eliminates any repetitive structure in the +ciphertext. + +One mode is Cipher Block Chaining (CBC mode); another is Cipher +FeedBack (CFB mode). CBC mode still encrypts in blocks, and thus is +only slightly slower than ECB mode. CFB mode encrypts on a +byte-by-byte basis, and is much slower than either of the other two +modes. The chaining feedback modes require an initialization value to +start off the encryption; this is a string of the same length as the +ciphering algorithm's block size, and is passed to the ``new()`` +function. + +The currently available block ciphers are listed in the following table, +and are in the ``Crypto.Cipher`` package: + +================= ============================ +Cipher Key Size/Block Size +================= ============================ +AES 16, 24, or 32 bytes/16 bytes +ARC2 Variable/8 bytes +Blowfish Variable/8 bytes +CAST Variable/8 bytes +DES 8 bytes/8 bytes +DES3 (Triple DES) 16 bytes/8 bytes +================= ============================ + + +In a strict formal sense, **stream ciphers** encrypt data bit-by-bit; +practically, stream ciphers work on a character-by-character basis. +Stream ciphers use exactly the same interface as block ciphers, with a block +length that will always be 1; this is how block and stream ciphers can be +distinguished. +The only feedback mode available for stream ciphers is ECB mode. + +The currently available stream ciphers are listed in the following table: + +======= ========= +Cipher Key Size +======= ========= + ARC4 Variable + XOR Variable +======= ========= + +ARC4 is short for "Alleged RC4". In September of 1994, someone posted +C code to both the Cypherpunks mailing list and to the Usenet +newsgroup ``sci.crypt``, claiming that it implemented the RC4 +algorithm. This claim turned out to be correct. Note that there's a +damaging class of weak RC4 keys; this module won't warn you about such keys. + +.. % XXX are there other analyses of RC4? + +A similar anonymous posting was made for Alleged RC2 in January, 1996. + +An example usage of the DES module:: + + >>> from Crypto.Cipher import DES + >>> obj=DES.new('abcdefgh', DES.MODE_ECB) + >>> plain="Guido van Rossum is a space alien." + >>> len(plain) + 34 + >>> obj.encrypt(plain) + Traceback (innermost last): + File "", line 1, in ? + ValueError: Strings for DES must be a multiple of 8 in length + >>> ciph=obj.encrypt(plain+'XXXXXX') + >>> ciph + '\021,\343Nq\214DY\337T\342pA\372\255\311s\210\363,\300j\330\250\312\347\342I\3215w\03561\303dgb/\006' + >>> obj.decrypt(ciph) + 'Guido van Rossum is a space alien.XXXXXX' + +All cipher algorithms share a common interface. After importing a +given module, there is exactly one function and two variables +available. + +**new(key, mode[, IV])**: +Returns a ciphering object, using ``key`` and feedback mode +``mode``. +If ``mode`` is ``MODE_CBC`` or ``MODE_CFB``, ``IV`` must be provided, + and must be a string of the same length as the block size. +Some algorithms support additional keyword arguments to this function; see +the "Algorithm-specific Notes for Encryption Algorithms" section below for the details. +Python 3.x: ```mode`` is a string object; ```key``` and ```IV``` must be +objects interpretable as a buffer of bytes. + +**block_size**: +An integer value; the size of the blocks encrypted by this module. +Strings passed to the ``encrypt`` and ``decrypt`` functions +must be a multiple of this length. For stream ciphers, +``block_size`` will be 1. + +**key_size**: +An integer value; the size of the keys required by this module. If +``key_size`` is zero, then the algorithm accepts arbitrary-length +keys. You cannot pass a key of length 0 (that is, the null string +``""`` as such a variable-length key. + +All cipher objects have at least three attributes: + +**block_size**: +An integer value equal to the size of the blocks encrypted by this object. +Identical to the module variable of the same name. + + +**IV**: +Contains the initial value which will be used to start a cipher +feedback mode. After encrypting or decrypting a string, this value +will reflect the modified feedback text; it will always be one block +in length. It is read-only, and cannot be assigned a new value. +Python 3.x: ```IV``` is a bytes object. + +**key_size**: +An integer value equal to the size of the keys used by this object. If +``key_size`` is zero, then the algorithm accepts arbitrary-length +keys. For algorithms that support variable length keys, this will be 0. +Identical to the module variable of the same name. + + +All ciphering objects have the following methods: + +**decrypt(string)**: +Decrypts ``string``, using the key-dependent data in the object, and +with the appropriate feedback mode. The string's length must be an exact +multiple of the algorithm's block size. Returns a string containing +the plaintext. +Python 3.x: decrypt() will return a bytes object. + +Note: Do not use the same cipher object for both encryption an +decryption, since both operations share the same IV buffer, so the results +will probably not be what you expect. + + +**encrypt(string)**: +Encrypts a non-null ``string``, using the key-dependent data in the +object, and with the appropriate feedback mode. The string's length +must be an exact multiple of the algorithm's block size; for stream +ciphers, the string can be of any length. Returns a string containing +the ciphertext. +Python 3.x: ```string``` must be an object interpretable as a buffer of bytes. +encrypt() will return a bytes object. + +Note: Do not use the same cipher object for both encryption an +decryption, since both operations share the same IV buffer, so the results +will probably not be what you expect. + + +Security Notes +======================= + +Encryption algorithms can be broken in several ways. If you have some +ciphertext and know (or can guess) the corresponding plaintext, you can +simply try every possible key in a **known-plaintext** attack. Or, it +might be possible to encrypt text of your choice using an unknown key; +for example, you might mail someone a message intending it to be +encrypted and forwarded to someone else. This is a +**chosen-plaintext** attack, which is particularly effective if it's +possible to choose plaintexts that reveal something about the key when +encrypted. + +Stream ciphers are only secure if any given key is never used twice. +If two (or more) messages are encrypted using the same key in a stream +cipher, the cipher can be broken fairly easily. + +DES (5100 K/sec) has a 56-bit key; this is starting to become too small +for safety. It has been shown in 2009 that a ~$10,000 machine can break +DES in under a day on average. NIST has withdrawn FIPS 46-3 in 2005. +DES3 (1830 K/sec) uses three DES encryptions for greater security and a 112-bit +or 168-bit key, but is correspondingly slower. Attacks against DES3 are +not currently feasible, and it has been estimated to be useful until 2030. +Bruce Schneier endorses DES3 for its security because of the decades of +study applied against it. It is, however, slow. + +There are no known attacks against Blowfish (9250 K/sec) or CAST (2960 K/sec), +but they're all relatively new algorithms and there hasn't been time for much +analysis to be performed; use them for serious applications only after careful +research. + +pycrypto implements CAST with up to 128 bits key length (CAST-128). This +algorithm is considered obsoleted by CAST-256. CAST is patented by Entrust +Technologies and free for non-commercial use. + +Bruce Schneier recommends his newer Twofish algorithm over Blowfish where +a fast, secure symmetric cipher is desired. Twofish was an AES candidate. It +is slightly slower than Rijndael (the chosen algorithm for AES) for 128-bit +keys, and slightly faster for 256-bit keys. + +AES, the Advanced Encryption Standard, was chosen by the US National +Institute of Standards and Technology from among 6 competitors, and is +probably your best choice. It runs at 7060 K/sec, so it's among the +faster algorithms around. + +ARC4 ("Alleged" RC4) (8830 K/sec) has been weakened. Specifically, it has been +shown that the first few bytes of the ARC4 keystream are strongly non-random, +leaking information about the key. When the long-term key and nonce are merely +concatenated to form the ARC4 key, such as is done in WEP, this weakness can be +used to discover the long-term key by observing a large number of messages +encrypted with this key. +Because of these possible related-key attacks, ARC4 should only be used with +keys generated by a strong RNG, or from a source of sufficiently uncorrelated +bits, such as the output of a hash function. +A further possible defense is to discard the initial portion of the keystream. +This altered algorithm is called RC4-drop(n). +While ARC4 is in wide-spread use in several protocols, its use in new protocols +or applications is discouraged. + +ARC2 ("Alleged" RC2) is vulnerable to a related-key attack, 2^34 chosen +plaintexts are needed. +Because of these possible related-key attacks, ARC2 should only be used with +keys generated by a strong RNG, or from a source of sufficiently uncorrelated +bits, such as the output of a hash function. + +Credits +============= + +The code for Blowfish was written from scratch by Dwayne Litzenberger, based +on a specification by Bruce Schneier, who also invented the algorithm; the +Blowfish algorithm has been placed in the public domain and can be used +freely. (See http://www.schneier.com/paper-blowfish-fse.html for more +information about Blowfish.) The CAST implementation was written by Wim Lewis. +The DES implementation uses libtomcrypt, which was written by Tom St Denis. + +The Alleged RC4 code was posted to the ``sci.crypt`` newsgroup by an +unknown party, and re-implemented by A.M. Kuchling. + + +Crypto.Protocol: Various Protocols +-------------------------------------------------- + +Crypto.Protocol.AllOrNothing +========================================== + +This module implements all-or-nothing package transformations. +An all-or-nothing package transformation is one in which some text is +transformed into message blocks, such that all blocks must be obtained before +the reverse transformation can be applied. Thus, if any blocks are corrupted +or lost, the original message cannot be reproduced. + +An all-or-nothing package transformation is not encryption, although a block +cipher algorithm is used. The encryption key is randomly generated and is +extractable from the message blocks. + +**AllOrNothing(ciphermodule, mode=None, IV=None)**: +Class implementing the All-or-Nothing package transform. + +``ciphermodule`` is a module implementing the cipher algorithm to +use. Optional arguments ``mode`` and ``IV`` are passed directly +through to the ``ciphermodule.new()`` method; they are the +feedback mode and initialization vector to use. All three arguments +must be the same for the object used to create the digest, and to +undigest'ify the message blocks. + +The module passed as ``ciphermodule`` must provide the PEP 272 +interface. An encryption key is randomly generated automatically when +needed. + + +The methods of the ``AllOrNothing`` class are: + +**digest(text)**: +Perform the All-or-Nothing package transform on the +string ``text``. Output is a list of message blocks describing the +transformed text, where each block is a string of bit length equal +to the cipher module's block_size. + + +**undigest(mblocks)**: +Perform the reverse package transformation on a list of message +blocks. Note that the cipher module used for both transformations +must be the same. ``mblocks`` is a list of strings of bit length +equal to ``ciphermodule``'s block_size. The output is a string object. + + + +Crypto.Protocol.Chaffing +================================================== + +Winnowing and chaffing is a technique for enhancing privacy without requiring +strong encryption. In short, the technique takes a set of authenticated +message blocks (the wheat) and adds a number of chaff blocks which have +randomly chosen data and MAC fields. This means that to an adversary, the +chaff blocks look as valid as the wheat blocks, and so the authentication +would have to be performed on every block. By tailoring the number of chaff +blocks added to the message, the sender can make breaking the message +computationally infeasible. There are many other interesting properties of +the winnow/chaff technique. + +For example, say Alice is sending a message to Bob. She packetizes the +message and performs an all-or-nothing transformation on the packets. Then +she authenticates each packet with a message authentication code (MAC). The +MAC is a hash of the data packet, and there is a secret key which she must +share with Bob (key distribution is an exercise left to the reader). She then +adds a serial number to each packet, and sends the packets to Bob. + +Bob receives the packets, and using the shared secret authentication key, +authenticates the MACs for each packet. Those packets that have bad MACs are +simply discarded. The remainder are sorted by serial number, and passed +through the reverse all-or-nothing transform. The transform means that an +eavesdropper (say Eve) must acquire all the packets before any of the data can +be read. If even one packet is missing, the data is useless. + +There's one twist: by adding chaff packets, Alice and Bob can make Eve's job +much harder, since Eve now has to break the shared secret key, or try every +combination of wheat and chaff packet to read any of the message. The cool +thing is that Bob doesn't need to add any additional code; the chaff packets +are already filtered out because their MACs don't match (in all likelihood -- +since the data and MACs for the chaff packets are randomly chosen it is +possible, but very unlikely that a chaff MAC will match the chaff data). And +Alice need not even be the party adding the chaff! She could be completely +unaware that a third party, say Charles, is adding chaff packets to her +messages as they are transmitted. + +**Chaff(factor=1.0, blocksper=1)**: +Class implementing the chaff adding algorithm. +``factor`` is the number of message blocks +to add chaff to, expressed as a percentage between 0.0 and 1.0; the default value is 1.0. +``blocksper`` is the number of chaff blocks to include for each block +being chaffed, and defaults to 1. The default settings +add one chaff block to every +message block. By changing the defaults, you can adjust how +computationally difficult it could be for an adversary to +brute-force crack the message. The difficulty is expressed as:: + + pow(blocksper, int(factor * number-of-blocks)) + +For ease of implementation, when ``factor`` < 1.0, only the first +``int(factor*number-of-blocks)`` message blocks are chaffed. + +``Chaff`` instances have the following methods: + +**chaff(blocks)**: +Add chaff to message blocks. ``blocks`` is a list of 3-tuples of the +form ``(serial-number, data, MAC)``. + +Chaff is created by choosing a random number of the same +byte-length as ``data``, and another random number of the same +byte-length as ``MAC``. The message block's serial number is placed +on the chaff block and all the packet's chaff blocks are randomly +interspersed with the single wheat block. This method then +returns a list of 3-tuples of the same form. Chaffed blocks will +contain multiple instances of 3-tuples with the same serial +number, but the only way to figure out which blocks are wheat and +which are chaff is to perform the MAC hash and compare values. + + + +Crypto.PublicKey: Public-Key Algorithms +-------------------------------------------------- + +So far, the encryption algorithms described have all been *private key* +ciphers. The same key is used for both encryption and decryption +so all correspondents must know it. This poses a problem: you may +want encryption to communicate sensitive data over an insecure +channel, but how can you tell your correspondent what the key is? You +can't just e-mail it to her because the channel is insecure. One +solution is to arrange the key via some other way: over the phone or +by meeting in person. + +Another solution is to use **public-key** cryptography. In a public +key system, there are two different keys: one for encryption and one for +decryption. The encryption key can be made public by listing it in a +directory or mailing it to your correspondent, while you keep the +decryption key secret. Your correspondent then sends you data encrypted +with your public key, and you use the private key to decrypt it. While +the two keys are related, it's very difficult to derive the private key +given only the public key; however, deriving the private key is always +possible given enough time and computing power. This makes it very +important to pick keys of the right size: large enough to be secure, but +small enough to be applied fairly quickly. + +Many public-key algorithms can also be used to sign messages; simply +run the message to be signed through a decryption with your private +key key. Anyone receiving the message can encrypt it with your +publicly available key and read the message. Some algorithms do only +one thing, others can both encrypt and authenticate. + +The currently available public-key algorithms are listed in the +following table: + +============= ========================================== +Algorithm Capabilities +============= ========================================== +RSA Encryption, authentication/signatures +ElGamal Encryption, authentication/signatures +DSA Authentication/signatures +============= ========================================== + +Many of these algorithms are patented. Before using any of them in a +commercial product, consult a patent attorney; you may have to arrange +a license with the patent holder. + +An example of using the RSA module to sign a message:: + + >>> from Crypto.Hash import MD5 + >>> from Crypto.PublicKey import RSA + >>> from Crypto import Random + >>> rng = Random.new().read + >>> RSAkey = RSA.generate(2048, rng) # This will take a while... + >>> hash = MD5.new(plaintext).digest() + >>> signature = RSAkey.sign(hash, rng) + >>> signature # Print what an RSA sig looks like--you don't really care. + ('\021\317\313\336\264\315' ...,) + >>> RSAkey.verify(hash, signature) # This sig will check out + 1 + >>> RSAkey.verify(hash[:-1], signature)# This sig will fail + 0 + +Public-key modules make the following functions available: + +**construct(tuple)**: +Constructs a key object from a tuple of data. This is +algorithm-specific; look at the source code for the details. (To be +documented later.) + +**generate(size, randfunc, progress_func=None, e=65537)**: +Generate a fresh public/private key pair. ``size`` is a +algorithm-dependent size parameter, usually measured in bits; the +larger it is, the more difficult it will be to break the key. Safe +key sizes vary from algorithm to algorithm; you'll have to research +the question and decide on a suitable key size for your application. +An N-bit keys can encrypt messages up to N-1 bits long. + +``randfunc`` is a random number generation function; it should +accept a single integer ``N`` and return a string of random data +``N`` bytes long. You should always use a cryptographically secure +random number generator, such as the one defined in the +``Crypto.Random`` module; **don't** just use the +current time and the ``random`` module. + +``progress_func`` is an optional function that will be called with a short +string containing the key parameter currently being generated; it's +useful for interactive applications where a user is waiting for a key +to be generated. + +``e`` is the public RSA exponent, and must be an odd positive integer. +It is typically a small number with very few ones in its binary representation. +The default value 65537 (=0b10000000000000001) is a safe choice: other +common values are 5, 7, 17, and 257. Exponent 3 is also widely used, +but it requires very special care when padding the message. + +If you want to interface with some other program, you will have to know +the details of the algorithm being used; this isn't a big loss. If you +don't care about working with non-Python software, simply use the +``pickle`` module when you need to write a key or a signature to a +file. It's portable across all the architectures that Python supports, +and it's simple to use. + +In case interoperability were important, RSA key objects can be exported +and imported in two standard formats: the DER binary encoding specified in +PKCS#1 (see RFC3447) or the ASCII textual encoding specified by the +old Privacy Enhanced Mail services (PEM, see RFC1421). + + +The RSA module makes the following function available for importing keys: + +**importKey(externKey)**: +Import an RSA key (pubic or private) encoded as a string ``externKey``. +The key can follow either the PKCS#1/DER format (binary) or the PEM format +(7-bit ASCII). + +For instance: + >>> from Crypto.PublicKey import RSA + >>> f = open("mykey.pem") + >>> RSAkey = RSA.importKey(f.read()) + >>> if RSAkey.has_private(): print "Private key" + +Every RSA object supports the following method to export itself: + +**exportKey(format='PEM')**: +Return the key encoded as a string, according to the specified ``format``: +``'PEM'`` (default) or ``'DER'`` (also known as PKCS#1). + +For instance: + >>> from Crypto.PublicKey import RSA + >>> from Crypto import Random + >>> rng = Random.new().read + >>> RSAkey = RSA.generate(1024, rng) + >>> f = open("keyPrivate.der","w+") + >>> f.write(RSAkey.exportKey("DER")) + >>> f.close() + >>> f = open("keyPublic.pem","w+") + >>> f.write(RSAkey.publickey().exportKey("PEM")) + >>> f.close() + +Public-key objects always support the following methods. Some of them +may raise exceptions if their functionality is not supported by the +algorithm. + + +**can_blind()**: +Returns true if the algorithm is capable of blinding data; +returns false otherwise. + + +**can_encrypt()**: +Returns true if the algorithm is capable of encrypting and decrypting +data; returns false otherwise. To test if a given key object can encrypt +data, use ``key.can_encrypt() and key.has_private()``. + + +**can_sign()**: +Returns true if the algorithm is capable of signing data; returns false +otherwise. To test if a given key object can sign data, use +``key.can_sign() and key.has_private()``. + + +**decrypt(tuple)**: +Decrypts ``tuple`` with the private key, returning another string. +This requires the private key to be present, and will raise an exception +if it isn't present. It will also raise an exception if ``string`` is +too long. + + +**encrypt(string, K)**: +Encrypts ``string`` with the private key, returning a tuple of +strings; the length of the tuple varies from algorithm to algorithm. +``K`` should be a string of random data that is as long as +possible. Encryption does not require the private key to be present +inside the key object. It will raise an exception if ``string`` is +too long. For ElGamal objects, the value of ``K`` expressed as a +big-endian integer must be relatively prime to ``self.p-1``; an +exception is raised if it is not. +Python 3.x: ```string``` must be an object interpretable as a buffer of bytes. + + +**has_private()**: +Returns true if the key object contains the private key data, which +will allow decrypting data and generating signatures. +Otherwise this returns false. + + +**publickey()**: +Returns a new public key object that doesn't contain the private key +data. + + +**sign(string, K)**: +Sign ``string``, returning a signature, which is just a tuple; in +theory the signature may be made up of any Python objects at all; in +practice they'll be either strings or numbers. ``K`` should be a +string of random data that is as long as possible. Different algorithms +will return tuples of different sizes. ``sign()`` raises an +exception if ``string`` is too long. For ElGamal objects, the value +of ``K`` expressed as a big-endian integer must be relatively prime to +``self.p-1``; an exception is raised if it is not. +Python 3.x: ```string``` must be an object interpretable as a buffer of bytes. + + +**size()**: +Returns the maximum size of a string that can be encrypted or signed, +measured in bits. String data is treated in big-endian format; the most +significant byte comes first. (This seems to be a **de facto** standard +for cryptographical software.) If the size is not a multiple of 8, then +some of the high order bits of the first byte must be zero. Usually +it's simplest to just divide the size by 8 and round down. + + +**verify(string, signature)**: +Returns true if the signature is valid, and false otherwise. +``string`` is not processed in any way; ``verify`` does +not run a hash function over the data, but you can easily do that yourself. +Python 3.x: ```string``` must be an object interpretable as a buffer of bytes. + + +The ElGamal and DSA algorithms +================================================== + +For RSA, the ``K`` parameters are unused; if you like, you can just +pass empty strings. The ElGamal and DSA algorithms require a real +``K`` value for technical reasons; see Schneier's book for a detailed +explanation of the respective algorithms. This presents a possible +hazard that can inadvertently reveal the private key. Without going into the +mathematical details, the danger is as follows. ``K`` is never derived +or needed by others; theoretically, it can be thrown away once the +encryption or signing operation is performed. However, revealing +``K`` for a given message would enable others to derive the secret key +data; worse, reusing the same value of ``K`` for two different +messages would also enable someone to derive the secret key data. An +adversary could intercept and store every message, and then try deriving +the secret key from each pair of messages. + +This places implementors on the horns of a dilemma. On the one hand, +you want to store the ``K`` values to avoid reusing one; on the other +hand, storing them means they could fall into the hands of an adversary. +One can randomly generate ``K`` values of a suitable length such as +128 or 144 bits, and then trust that the random number generator +probably won't produce a duplicate anytime soon. This is an +implementation decision that depends on the desired level of security +and the expected usage lifetime of a private key. I can't choose and +enforce one policy for this, so I've added the ``K`` parameter to the +``encrypt`` and ``sign`` methods. You must choose ``K`` by +generating a string of random data; for ElGamal, when interpreted as a +big-endian number (with the most significant byte being the first byte +of the string), ``K`` must be relatively prime to ``self.p-1``; any +size will do, but brute force searches would probably start with small +primes, so it's probably good to choose fairly large numbers. It might be +simplest to generate a prime number of a suitable length using the +``Crypto.Util.number`` module. + + +Security Notes for Public-key Algorithms +================================================== + +Any of these algorithms can be trivially broken; for example, RSA can be +broken by factoring the modulus *n* into its two prime factors. +This is easily done by the following code:: + + for i in range(2, n): + if (n%i)==0: + print i, 'is a factor' + break + +However, ``n`` is usually a few hundred bits long, so this simple +program wouldn't find a solution before the universe comes to an end. +Smarter algorithms can factor numbers more quickly, but it's still +possible to choose keys so large that they can't be broken in a +reasonable amount of time. For ElGamal and DSA, discrete logarithms are +used instead of factoring, but the principle is the same. + +Safe key sizes depend on the current state of number theory and +computer technology. At the moment, one can roughly define three +levels of security: low-security commercial, high-security commercial, +and military-grade. For RSA, these three levels correspond roughly to +768, 1024, and 2048-bit keys. + +When exporting private keys you should always carefully ensure that the +chosen storage location cannot be accessed by adversaries. + +Crypto.Util: Odds and Ends +-------------------------------------------------- + +This chapter contains all the modules that don't fit into any of the +other chapters. + + +Crypto.Util.number +========================== + +This module contains various number-theoretic functions. + +**GCD(x,y)**: +Return the greatest common divisor of ``x`` and ``y``. + +**getPrime(N, randfunc)**: +Return an ``N``-bit random prime number, using random data obtained +from the function ``randfunc``. ``randfunc`` must take a single +integer argument, and return a string of random data of the +corresponding length; the ``get_bytes()`` method of a +``RandomPool`` object will serve the purpose nicely, as will the +``read()`` method of an opened file such as ``/dev/random``. + +**getStrongPrime(N, e=0, false_positive_prob=1e-6, randfunc=None)**: +Return a random strong ``N``-bit prime number. +In this context p is a strong prime if p-1 and p+1 have at +least one large prime factor. +``N`` should be a multiple of 128 and > 512. + +If ``e`` is provided the returned prime p-1 will be coprime to ``e`` +and thus suitable for RSA where e is the public exponent. + +The optional ``false_positive_prob`` is the statistical probability +that true is returned even though it is not (pseudo-prime). +It defaults to 1e-6 (less than 1:1000000). +Note that the real probability of a false-positive is far less. This is +just the mathematically provable limit. + +``randfunc`` should take a single int parameter and return that +many random bytes as a string. +If randfunc is omitted, then ``Random.new().read`` is used. + +**getRandomNBitInteger(N, randfunc)**: +Return an ``N``-bit random number, using random data obtained from the +function ``randfunc``. As usual, ``randfunc`` must take a single +integer argument and return a string of random data of the +corresponding length. + +**getRandomNBitInteger(N, randfunc)**: +Return an ``N``-bit random number, using random data obtained from the +function ``randfunc``. As usual, ``randfunc`` must take a single +integer argument and return a string of random data of the +corresponding length. + +**inverse(u, v)**: +Return the inverse of ``u`` modulo ``v``. + +**isPrime(N)**: +Returns true if the number ``N`` is prime, as determined by a +Rabin-Miller test. + + +Crypto.Random +================================================== + +For cryptographic purposes, ordinary random number generators are +frequently insufficient, because if some of their output is known, it +is frequently possible to derive the generator's future (or past) +output. Given the generator's state at some point in time, someone +could try to derive any keys generated using it. The solution is to +use strong encryption or hashing algorithms to generate successive +data; this makes breaking the generator as difficult as breaking the +algorithms used. + +Understanding the concept of **entropy** is important for using the +random number generator properly. In the sense we'll be using it, +entropy measures the amount of randomness; the usual unit is in bits. +So, a single random bit has an entropy of 1 bit; a random byte has an +entropy of 8 bits. Now consider a one-byte field in a database containing a +person's sex, represented as a single character ``'M'`` or ``'F'``. +What's the entropy of this field? Since there are only two possible +values, it's not 8 bits, but one; if you were trying to guess the value, +you wouldn't have to bother trying ``'Q'`` or ``'@'``. + +Now imagine running that single byte field through a hash function that +produces 128 bits of output. Is the entropy of the resulting hash value +128 bits? No, it's still just 1 bit. The entropy is a measure of how many +possible states of the data exist. For English +text, the entropy of a five-character string is not 40 bits; it's +somewhat less, because not all combinations would be seen. ``'Guido'`` +is a possible string, as is ``'In th'``; ``'zJwvb'`` is not. + +The relevance to random number generation? We want enough bits of +entropy to avoid making an attack on our generator possible. An +example: One computer system had a mechanism which generated nonsense +passwords for its users. This is a good idea, since it would prevent +people from choosing their own name or some other easily guessed string. +Unfortunately, the random number generator used only had 65536 states, +which meant only 65536 different passwords would ever be generated, and +it was easy to compute all the possible passwords and try them. The +entropy of the random passwords was far too low. By the same token, if +you generate an RSA key with only 32 bits of entropy available, there +are only about 4.2 billion keys you could have generated, and an +adversary could compute them all to find your private key. See +RFC 1750, +"Randomness Recommendations for Security", for an interesting discussion +of the issues related to random number generation. + +The ``Random`` module builds strong random number generators that look +like generic files a user can read data from. The internal state consists +of entropy accumulators based on the best randomness sources the underlying +operating is capable to provide. + +The ``Random`` module defines the following methods: + +**new()**: +Builds a file-like object that outputs cryptographically random bytes. + +**atfork()**: +This methods has to be called whenever os.fork() is invoked. Forking +undermines the security of any random generator based on the operating +system, as it duplicates all structures a program has. In order to +thwart possible attacks, this method shoud be called soon after forking, +and before any cryptographic operation. + +**get_random_bytes(num)**: +Returns a string containing ``num`` bytes of random data. + +Objects created by the ``Random`` module define the following variables and methods: + +**read(num)**: +Returns a string containing ``num`` bytes of random data. + +**close()**: +**flush()**: +Do nothing. Provided for consistency. + +Crypto.Util.RFC1751 +================================================== + +The keys for private-key algorithms should be arbitrary binary data. +Many systems err by asking the user to enter a password, and then +using the password as the key. This limits the space of possible +keys, as each key byte is constrained within the range of possible +ASCII characters, 32-127, instead of the whole 0-255 range possible +with ASCII. Unfortunately, it's difficult for humans to remember 16 +or 32 hex digits. + +One solution is to request a lengthy passphrase from the user, and +then run it through a hash function such as SHA or MD5. Another +solution is discussed in RFC 1751, "A Convention for Human-Readable +128-bit Keys", by Daniel L. McDonald. Binary keys are transformed +into a list of short English words that should be easier to remember. +For example, the hex key EB33F77EE73D4053 is transformed to "TIDE ITCH +SLOW REIN RULE MOT". + +**key_to_english(key)**: +Accepts a string of arbitrary data ``key``, and returns a string +containing uppercase English words separated by spaces. ``key``'s +length must be a multiple of 8. + +**english_to_key(string)**: +Accepts ``string`` containing English words, and returns a string of +binary data representing the key. Words must be separated by +whitespace, and can be any mixture of uppercase and lowercase +characters. 6 words are required for 8 bytes of key data, so +the number of words in ``string`` must be a multiple of 6. + + +Extending the Toolkit +-------------------------------------------------- + +Preserving a common interface for cryptographic routines is a good +idea. This chapter explains how to write new modules for the Toolkit. + +The basic process is as follows: + +1. Add a new ``.c`` file containing an implementation of the new +algorithm. +This file must define 3 or 4 standard functions, +a few constants, and a C ``struct`` encapsulating the state +variables required by the algorithm. + +2. Add the new algorithm to ``setup.py``. + +3. Send a copy of the code to me, if you like; code for new +algorithms will be gratefully accepted. + + +Adding Hash Algorithms +================================================== + +The required constant definitions are as follows:: + + #define MODULE_NAME MD2 /* Name of algorithm */ + #define DIGEST_SIZE 16 /* Size of resulting digest in bytes */ + +The C structure must be named ``hash_state``:: + + typedef struct { + ... whatever state variables you need ... + } hash_state; + +There are four functions that need to be written: to initialize the +algorithm's state, to hash a string into the algorithm's state, to get +a digest from the current state, and to copy a state. + +* ``void hash_init(hash_state *self);`` +* ``void hash_update(hash_state *self, unsigned char *buffer, int length);`` +* ``PyObject *hash_digest(hash_state *self);`` +* ``void hash_copy(hash_state *source, hash_state *dest);`` + +Put ``#include "hash_template.c"`` at the end of the file to +include the actual implementation of the module. + + +Adding Block Encryption Algorithms +================================================== + +The required constant definitions are as follows:: + +#define MODULE_NAME AES /* Name of algorithm */ +#define BLOCK_SIZE 16 /* Size of encryption block */ +#define KEY_SIZE 0 /* Size of key in bytes (0 if not fixed size) */ + +The C structure must be named ``block_state``:: + + typedef struct { + ... whatever state variables you need ... + } block_state; + +There are three functions that need to be written: to initialize the +algorithm's state, and to encrypt and decrypt a single block. + +* ``void block_init(block_state *self, unsigned char *key, int keylen);`` +* ``void block_encrypt(block_state *self, unsigned char *in, unsigned char *out);`` +* ``void block_decrypt(block_state *self, unsigned char *in, unsigned char *out);`` + +Put ``#include "block_template.c"`` at the end of the file to +include the actual implementation of the module. + + +Adding Stream Encryption Algorithms +================================================== + +The required constant definitions are as follows:: + + #define MODULE_NAME ARC4 /* Name of algorithm */ + #define BLOCK_SIZE 1 /* Will always be 1 for a stream cipher */ + #define KEY_SIZE 0 /* Size of key in bytes (0 if not fixed size) */ + +The C structure must be named ``stream_state``:: + + typedef struct { + ... whatever state variables you need ... + } stream_state; + +There are three functions that need to be written: to initialize the +algorithm's state, and to encrypt and decrypt a single block. + +* ``void stream_init(stream_state *self, unsigned char *key, int keylen);`` +* ``void stream_encrypt(stream_state *self, unsigned char *block, int length);`` +* ``void stream_decrypt(stream_state *self, unsigned char *block, int length);`` + +Put ``#include "stream_template.c"`` at the end of the file to +include the actual implementation of the module. diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/00INDEX b/Cryptography/pycrypto-2.6.1/LEGAL/00INDEX new file mode 100644 index 0000000..ae237d7 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/00INDEX @@ -0,0 +1,3 @@ +00INDEX - This file +tsu-notify.mbox - Notification sent per U.S. export regulations +copy/ - Copyright info & public-domain dedications diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/CodeSubmissionRequirements.txt b/Cryptography/pycrypto-2.6.1/LEGAL/CodeSubmissionRequirements.txt new file mode 100644 index 0000000..e86ad61 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/CodeSubmissionRequirements.txt @@ -0,0 +1,49 @@ +PyCrypto Code Submission Requirements - Rev. C + +Last updated: 2009-02-28 + +In an effort to further clarify PyCrypto's licensing terms, anyone submitting +code to PyCrypto must be able to certify the following (taken from the Linux +kernel's SubmittingPatches file): + + Developer's Certificate of Origin 1.1 + + By making a contribution to this project, I certify that: + + (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + + (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + + (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + + (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +In addition, the code's author must not be a national, citizen, or resident of +the United States of America. + +In addition, the code must not be of U.S. origin. + +In addition, all new code contributed to PyCrypto must be dedicated to the +public domain as follows: + + The contents of this file are dedicated to the public domain. To the extent + that dedication to the public domain is not available, everyone is granted a + worldwide, perpetual, royalty-free, non-exclusive license to exercise all + rights associated with the contents of this file for any purpose whatsoever. + No rights are reserved. + +=== EOF === diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/copy/00INDEX b/Cryptography/pycrypto-2.6.1/LEGAL/copy/00INDEX new file mode 100644 index 0000000..fbdca18 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/copy/00INDEX @@ -0,0 +1,4 @@ +00INDEX This file +LICENSE.orig Original (deprecated) license for the Python Cryptography Toolkit +LICENSE.libtom LICENSE file from LibTomCrypt +stmts/ Statements by contributors diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/copy/LICENSE.libtom b/Cryptography/pycrypto-2.6.1/LEGAL/copy/LICENSE.libtom new file mode 100644 index 0000000..5d678c5 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/copy/LICENSE.libtom @@ -0,0 +1,5 @@ +LibTomCrypt is public domain. As should all quality software be. + +Tom St Denis + + diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/copy/LICENSE.orig b/Cryptography/pycrypto-2.6.1/LEGAL/copy/LICENSE.orig new file mode 100644 index 0000000..ad3ae41 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/copy/LICENSE.orig @@ -0,0 +1,15 @@ +=================================================================== +Distribute and use freely; there are no restrictions on further +dissemination and usage except those imposed by the laws of your +country of residence. This software is provided "as is" without +warranty of fitness for use or suitability for any purpose, express +or implied. Use at your own risk or not at all. +=================================================================== + +Incorporating the code into commercial products is permitted; you do +not have to make source available or contribute your changes back +(though that would be nice). + +--amk (www.amk.ca) + + diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/copy/LICENSE.python-2.2 b/Cryptography/pycrypto-2.6.1/LEGAL/copy/LICENSE.python-2.2 new file mode 100644 index 0000000..ca4d98e --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/copy/LICENSE.python-2.2 @@ -0,0 +1,253 @@ +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations (now Zope +Corporation, see http://www.zope.com). In 2001, the Python Software +Foundation (PSF, see http://www.python.org/psf/) was formed, a +non-profit organization created specifically to own Python-related +Intellectual Property. Zope Corporation is a sponsoring member of +the PSF. + +All Python releases are Open Source (see http://www.opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI no + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.2 2.1.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2.1 2.2 2002 PSF yes + 2.2.2 2.2.1 2002 PSF yes + 2.2.3 2.2.2 2003 PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +PSF LICENSE AGREEMENT FOR PYTHON 2.2.3 +-------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using Python 2.2.3 software in source or binary form and its +associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 2.2.3 +alone or in any derivative version, provided, however, that PSF's +License Agreement and PSF's notice of copyright, i.e., "Copyright (c) +2001, 2002, 2003 Python Software Foundation; All Rights Reserved" are +retained in Python 2.2.3 alone or in any derivative version prepared +by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 2.2.3 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 2.2.3. + +4. PSF is making Python 2.2.3 available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.2.3 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +2.2.3 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.2.3, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python 2.2.3, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the Internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the Internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Andrew_M_Kuchling.mbox b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Andrew_M_Kuchling.mbox new file mode 100644 index 0000000..a0dcb78 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Andrew_M_Kuchling.mbox @@ -0,0 +1,156 @@ +From dlitz@dlitz.net Sun Nov 23 00:17:22 2008 +Date: Sun, 23 Nov 2008 00:17:22 -0500 +From: "Dwayne C. Litzenberger" +To: "A. M. Kuchling" +Subject: PyCrypto license clarification +Message-ID: <20081123051722.GA29253@rivest.dlitz.net> +MIME-Version: 1.0 +Content-Type: multipart/signed; micalg=pgp-sha1; + protocol="application/pgp-signature"; boundary="YiEDa0DAkWCtVeE4" +Content-Disposition: inline +X-Primary-Address: dlitz@dlitz.net +X-Homepage: http://www.dlitz.net/ +X-OpenPGP: url=http://www.dlitz.net/go/gpgkey/; + id=19E11FE8B3CFF273ED174A24928CEC1339C25CF7 (only for key signing); + preference=unprotected +X-OpenPGP: url=http://www.dlitz.net/go/gpgkey/; + id=4B2AFD82FC7D9E3838D9179F1C11B877E7804B45 (2008); + preference=signencrypt +User-Agent: Mutt/1.5.16 (2007-06-11) +Status: RO +Content-Length: 3461 +Lines: 78 + + +--YiEDa0DAkWCtVeE4 +Content-Type: text/plain; charset=us-ascii; format=flowed +Content-Disposition: inline +Content-Transfer-Encoding: quoted-printable + +Hi Andrew, + +People often ask me what license PyCrypto is covered by, if it's=20 +GPL-compatible, etc. Right now, I'm not really sure what to tell them. =20 +The text in the current LICENSE file (quoted below) is not entirely clear= +=20 +on the point of whether distributing modified versions is allowed. (It=20 +says "distribute and use", but not "modify".) + + =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + Distribute and use freely; there are no restrictions on further + dissemination and usage except those imposed by the laws of your + country of residence. This software is provided "as is" without + warranty of fitness for use or suitability for any purpose, express + or implied. Use at your own risk or not at all. + =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + + Incorporating the code into commercial products is permitted; you do + not have to make source available or contribute your changes back + (though that would be nice). + + --amk (www.amk.ca) + +For the next PyCrypto release, I'd like to take steps to move toward a=20 +clearer licensing regime. I'm asking as many copyright holders as I can=20 +find, starting with you, if I can release PyCrypto under something clearer= +=20 +and more standard. Below, I have quoted a public domain dedication that=20 +was recommended in _Intellectual Property and Open Source: A Practical=20 +Guide to Protecting Code_, by Van Lindberg. + +May I, on your behalf, dedicate to the public domain your considerable=20 +contributions to PyCrypto, with the following notice? + + =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + The contents of this file are dedicated to the public domain. To the + extent that dedication to the public domain is not available, everyone + is granted a worldwide, perpetual, royalty-free, non-exclusive license + to exercise all rights associated with the contents of this file for + any purpose whatsoever. No rights are reserved. + =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Regards, + - Dwayne + +--=20 +Dwayne C. Litzenberger + Key-signing key - 19E1 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 + Annual key (2008) - 4B2A FD82 FC7D 9E38 38D9 179F 1C11 B877 E780 4B45 + +--YiEDa0DAkWCtVeE4 +Content-Type: application/pgp-signature; name="signature.asc" +Content-Description: Digital signature +Content-Disposition: inline + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.5 (GNU/Linux) + +iEYEARECAAYFAkko52IACgkQHBG4d+eAS0XPPQCfcyQ2DdAXKg9N7Z+jeSFFD5EZ +yloAn33a3ZjkteyJaTbzEqImOEW8JGpf +=aBEW +-----END PGP SIGNATURE----- + +--YiEDa0DAkWCtVeE4-- + +From amk@amk.ca Sun Nov 23 07:51:59 2008 +X-Maildir-Dup-Checked: Yes +Return-Path: +X-Original-To: dwon@rivest.dlitz.net +Delivered-To: dwon@rivest.dlitz.net +Received: from goedel.dlitz.net (unknown [10.159.255.6]) + by rivest.dlitz.net (Postfix) with ESMTP id 5C2C75047D + for ; Sun, 23 Nov 2008 07:51:59 -0500 (EST) +Received: from localhost (localhost [127.0.0.1]) + by goedel.dlitz.net (Postfix) with QMQP id D632D10111 + for ; Sun, 23 Nov 2008 06:51:58 -0600 (CST) +Received: (vmailmgr-postfix 12026 invoked by uid 1003); 23 Nov 2008 06:51:58 -0600 +Delivered-To: m-dlitz-dlitz@dlitz.net +Received-SPF: none (goedel.dlitz.net: domain of amk@amk.ca does not designate permitted sender hosts) +Received: from mail5.sea5.speakeasy.net (mail5.sea5.speakeasy.net [69.17.117.7]) + by goedel.dlitz.net (Postfix) with ESMTP id 97DC710105 + for ; Sun, 23 Nov 2008 06:51:58 -0600 (CST) +Received: (qmail 3992 invoked from network); 23 Nov 2008 12:51:52 -0000 +Received: from dsl092-163-165.wdc2.dsl.speakeasy.net (HELO localhost) (akuchling@[66.92.163.165]) + (envelope-sender ) + by mail5.sea5.speakeasy.net (qmail-ldap-1.03) with AES256-SHA encrypted SMTP + for ; 23 Nov 2008 12:51:52 -0000 +Date: Sun, 23 Nov 2008 07:51:34 -0500 +From: "A.M. Kuchling" +To: "Dwayne C. Litzenberger" +Subject: Re: PyCrypto license clarification +Message-ID: <20081123125134.GA21239@amk.local> +Reply-To: amk@amk.ca +References: <20081123051722.GA29253@rivest.dlitz.net> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Disposition: inline +In-Reply-To: <20081123051722.GA29253@rivest.dlitz.net> +User-Agent: Mutt/1.5.13 (2006-08-11) +Status: RO +Content-Length: 537 +Lines: 15 + +> People often ask me what license PyCrypto is covered by, if it's +> GPL-compatible, etc. Right now, I'm not really sure what to tell them. +> The text in the current LICENSE file (quoted below) is not entirely clear +> on the point of whether distributing modified versions is allowed. (It +> says "distribute and use", but not "modify".) + +The intention is that it be public domain. + +> May I, on your behalf, dedicate to the public domain your considerable +> contributions to PyCrypto, with the following notice? + +You may. + +--amk + + diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Barry_A_Warsaw.mbox b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Barry_A_Warsaw.mbox new file mode 100644 index 0000000..ed03b6d --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Barry_A_Warsaw.mbox @@ -0,0 +1,135 @@ +From dlitz@dlitz.net Sat Feb 28 21:45:09 2009 +Date: Sat, 28 Feb 2009 21:45:09 -0500 +From: "Dwayne C. Litzenberger" +To: Barry A Warsaw +Subject: PyCrypto license clarification +Message-ID: <20090301024509.GA13195@rivest.dlitz.net> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii; format=flowed +Content-Disposition: inline +User-Agent: Mutt/1.5.16 (2007-06-11) +Status: RO +Content-Length: 2535 + +Hi Barry, + +I am the new maintainer of the Python Cryptography Toolkit, and I am +working on a new release at http://www.pycrypto.org/. + +People often ask me what license PyCrypto is covered by, if it's +GPL-compatible, etc. Right now, I'm not really sure what to tell them. +The text in the current LICENSE file (quoted below) is not entirely clear +on the point of whether distributing modified versions is allowed. (It +says "distribute and use", but not "modify".) + + =================================================================== + Distribute and use freely; there are no restrictions on further + dissemination and usage except those imposed by the laws of your + country of residence. This software is provided "as is" without + warranty of fitness for use or suitability for any purpose, express + or implied. Use at your own risk or not at all. + =================================================================== + + Incorporating the code into commercial products is permitted; you do + not have to make source available or contribute your changes back + (though that would be nice). + + --amk (www.amk.ca) + +For the next PyCrypto release, I would like to take steps to move toward a +clearer licensing regime. I am asking as many copyright holders as I can +find if I can release PyCrypto under something clearer and more standard. +Below, I have quoted a public domain dedication that was recommended in +_Intellectual Property and Open Source: A Practical Guide to Protecting +Code_, by Van Lindberg. I have already contacted A. M. Kuchling, Robey +Pointer, and Wim Lewis, and they have all approved the following dedication +for their contributions. + +I understand that you have made contributions to PyCrypto. May I, on your +behalf, dedicate to the public domain all your contributions to PyCrypto, +with the following notice? + + ======================================================================= + The contents of this file are dedicated to the public domain. To the + extent that dedication to the public domain is not available, everyone + is granted a worldwide, perpetual, royalty-free, non-exclusive license + to exercise all rights associated with the contents of this file for + any purpose whatsoever. No rights are reserved. + ======================================================================= + +Regards, + - Dwayne + +-- +Dwayne C. Litzenberger + Key-signing key - 19E1 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 + +From barry@python.org Mon Mar 2 11:29:39 2009 +X-Maildir-Dup-Checked: Yes +Return-Path: +X-Original-To: dwon@rivest.dlitz.net +Delivered-To: dwon@rivest.dlitz.net +Received: from goedel.dlitz.net (unknown [10.159.255.6]) + by rivest.dlitz.net (Postfix) with ESMTP id 6E01AC6640B + for ; Mon, 2 Mar 2009 11:29:39 -0500 (EST) +Received: from localhost (localhost [127.0.0.1]) + by goedel.dlitz.net (Postfix) with QMQP id 0644E1007A + for ; Mon, 2 Mar 2009 10:29:39 -0600 (CST) +Received: (vmailmgr-postfix 8668 invoked by uid 1003); 2 Mar 2009 10:29:39 -0600 +Delivered-To: m-dlitz-dlitz@dlitz.net +Received-SPF: none (python.org: No applicable sender policy available) receiver=goedel.dlitz.net; identity=mfrom; envelope-from="barry@python.org"; helo=mail.wooz.org; client-ip=216.15.33.230 +Received: from mail.wooz.org (216-15-33-230.c3-0.slvr-ubr2.lnh-slvr.md.static.cable.rcn.com [216.15.33.230]) + by goedel.dlitz.net (Postfix) with ESMTP id CCEA110073 + for ; Mon, 2 Mar 2009 10:29:38 -0600 (CST) +Received: from snowdog.wooz.org (snowdog.wooz.org [192.168.11.202]) + by mail.wooz.org (Postfix) with ESMTPSA id ACE30E3C9F + for ; Mon, 2 Mar 2009 11:29:35 -0500 (EST) +Message-Id: <09BF1A39-B015-4820-97A3-8642490C8254@python.org> +From: Barry Warsaw +To: Dwayne C. Litzenberger +In-Reply-To: <20090301024509.GA13195@rivest.dlitz.net> +Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes +Content-Transfer-Encoding: quoted-printable +Mime-Version: 1.0 (Apple Message framework v930.3) +Subject: Re: PyCrypto license clarification +Date: Mon, 2 Mar 2009 11:29:34 -0500 +References: <20090301024509.GA13195@rivest.dlitz.net> +X-Pgp-Agent: GPGMail d55 (v55, Leopard) +X-Mailer: Apple Mail (2.930.3) +Status: RO +Content-Length: 869 + +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + +On Feb 28, 2009, at 9:45 PM, Dwayne C. Litzenberger wrote: + +> I am the new maintainer of the Python Cryptography Toolkit, and I am =20= + +> working on a new release at http://www.pycrypto.org/. + +Great! I'm glad to see someone taking up the mantle of this important =20= + +Python library. + +> I understand that you have made contributions to PyCrypto. May I, =20 +> on your behalf, dedicate to the public domain all your contributions =20= + +> to PyCrypto, with the following notice? + +Absolutely yes. + +Cheers, +Barry + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.9 (Darwin) + +iQCVAwUBSawJbnEjvBPtnXfVAQLZjgP/ecG+JdZwNvPJRfsa6rhY6+MHLDHI6agk +evkJnSJQAcVHlZnVlVeR5IXgvDUMakZjU4SOV7MqkhsKA9lIet7PaD9VSYgn3ra5 +gElwI2DQDoOy5GExXMm74gqrrb1PCCbCRmpaYNo+DZohwHkeFBjbwDRA3wItOrH7 +SK4w9VBJtfY=3D +=3DQduY +-----END PGP SIGNATURE----- + + diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Jeethu_Rao.mbox b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Jeethu_Rao.mbox new file mode 100644 index 0000000..6147bee --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Jeethu_Rao.mbox @@ -0,0 +1,277 @@ +From dlitz@dlitz.net Sat Feb 28 23:24:14 2009 +Date: Sat, 28 Feb 2009 23:24:14 -0500 +From: "Dwayne C. Litzenberger" +To: Jeethu Rao +Subject: PyCrypto license clarification +Message-ID: <20090301042414.GA15122@rivest.dlitz.net> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii; format=flowed +Content-Disposition: inline +User-Agent: Mutt/1.5.16 (2007-06-11) +Status: RO +Content-Length: 2513 + +Hi Jeethu, + +I am the new maintainer of the Python Cryptography Toolkit, and I am +working on a new release at http://www.pycrypto.org/. + +People often ask me what license PyCrypto is covered by, if it's +GPL-compatible, etc. Right now, I'm not really sure what to tell them. +The text in the current LICENSE file (quoted below) is not entirely clear +on the point of whether distributing modified versions is allowed. (It +says "distribute and use", but not "modify".) + + =================================================================== + Distribute and use freely; there are no restrictions on further + dissemination and usage except those imposed by the laws of your + country of residence. This software is provided "as is" without + warranty of fitness for use or suitability for any purpose, express + or implied. Use at your own risk or not at all. + =================================================================== + + Incorporating the code into commercial products is permitted; you do + not have to make source available or contribute your changes back + (though that would be nice). + + --amk (www.amk.ca) + +For the next PyCrypto release, I would like to take steps to move toward a +clearer licensing regime. I am asking as many copyright holders as I can +find if I can release PyCrypto under something clearer and more standard. +Below, I have quoted a public domain dedication that was recommended in +_Intellectual Property and Open Source: A Practical Guide to Protecting +Code_, by Van Lindberg. I have already contacted A. M. Kuchling, Robey +Pointer, and Wim Lewis, and they have all approved the following text for +their contributions. + +I understand that you have made contributions to PyCrypto. May I, on your +behalf, dedicate to the public domain all your contributions to PyCrypto, +with the following notice? + + ======================================================================= + The contents of this file are dedicated to the public domain. To the + extent that dedication to the public domain is not available, everyone + is granted a worldwide, perpetual, royalty-free, non-exclusive license + to exercise all rights associated with the contents of this file for + any purpose whatsoever. No rights are reserved. + ======================================================================= + +Regards, + - Dwayne + +-- +Dwayne C. Litzenberger + Key-signing key - 19E1 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 + +From jeethurao@gmail.com Sun Mar 8 17:28:16 2009 +X-Maildir-Dup-Checked: Yes +Return-Path: +X-Original-To: dwon@rivest.dlitz.net +Delivered-To: dwon@rivest.dlitz.net +Received: from goedel.dlitz.net (unknown [10.159.255.6]) + by rivest.dlitz.net (Postfix) with ESMTP id 0CC83515D9 + for ; Sun, 8 Mar 2009 17:28:16 -0400 (EDT) +Received: from localhost (localhost [127.0.0.1]) + by goedel.dlitz.net (Postfix) with QMQP id 4E58F450CB + for ; Sun, 8 Mar 2009 15:28:15 -0600 (CST) +Received: (vmailmgr-postfix 5011 invoked by uid 1003); 8 Mar 2009 15:28:15 -0600 +Delivered-To: m-dlitz-dlitz@dlitz.net +Received-SPF: pass (gmail.com ... _spf.google.com: 209.85.198.249 is authorized to use 'jeethurao@gmail.com' in 'mfrom' identity (mechanism 'ip4:209.85.128.0/17' matched)) receiver=goedel.dlitz.net; identity=mfrom; envelope-from="jeethurao@gmail.com"; helo=rv-out-0708.google.com; client-ip=209.85.198.249 +Received: from rv-out-0708.google.com (unknown [209.85.198.249]) + by goedel.dlitz.net (Postfix) with ESMTP id 3C097449E7 + for ; Sun, 8 Mar 2009 15:28:12 -0600 (CST) +Received: by rv-out-0708.google.com with SMTP id k29so1252333rvb.26 + for ; Sun, 08 Mar 2009 14:27:56 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=gamma; + h=domainkey-signature:mime-version:received:in-reply-to:references + :date:message-id:subject:from:to:content-type; + bh=YWy9U32WCU/ksRqukHwaOZyJQBUs4Yvt5mI20U6mI/g=; + b=oMjI22lIxYiJKge2zNJW3rRiUi9LqFXmey5Wp0pLItuNF+X3duyfhopTuBAKw7MwVY + B5E6VQuGVEyzBbNsctyVgq6DhQiQtouCLZymSViobmuDmKn5DtUKoxpDk0xCxQmHYaas + L9/A6D3/J66kKrNBgX9mc0GPcZTviVFYkPR0Q= +DomainKey-Signature: a=rsa-sha1; c=nofws; + d=gmail.com; s=gamma; + h=mime-version:in-reply-to:references:date:message-id:subject:from:to + :content-type; + b=Ym7CStuDEfJKay1AJyWZkZmJA1lnTcwCG6akBHAXLld8ht6PFcmlsffzZG8hJCIVJ8 + vljqcT+G6cywVTBw1pyGX7ECYzr0+vhGvgdpACGrs24zikHfpSSd5GFogzXaLVvGVH8p + bqSHpfWKKtEP4gAQkiNeIq1GNtR2j8U3fnRyg= +MIME-Version: 1.0 +Received: by 10.141.176.13 with SMTP id d13mr2656028rvp.231.1236547674677; + Sun, 08 Mar 2009 14:27:54 -0700 (PDT) +In-Reply-To: <20090301042414.GA15122@rivest.dlitz.net> +References: <20090301042414.GA15122@rivest.dlitz.net> +Date: Mon, 9 Mar 2009 02:57:54 +0530 +Message-ID: +Subject: Re: PyCrypto license clarification +From: Jeethu Rao +To: "Dwayne C. Litzenberger" +Content-Type: multipart/alternative; boundary=000e0cd209d0e5a3d40464a23054 +Status: RO +Content-Length: 7668 + +--000e0cd209d0e5a3d40464a23054 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 7bit + +Hi Dwayne,My contribution to pycrypto are very very minimal (The sha256 +module, IIRC). +I'd be fine with the public domain license for PyCrypto. + +Jeethu Rao +PS: Apologies for the delay in my response. +I don't really check this email address all that often, +please direct any further correspondence to jeethu@jeethurao.com + +On Sun, Mar 1, 2009 at 9:54 AM, Dwayne C. Litzenberger wrote: + +> Hi Jeethu, +> +> I am the new maintainer of the Python Cryptography Toolkit, and I am +> working on a new release at http://www.pycrypto.org/. +> +> People often ask me what license PyCrypto is covered by, if it's +> GPL-compatible, etc. Right now, I'm not really sure what to tell them. The +> text in the current LICENSE file (quoted below) is not entirely clear on the +> point of whether distributing modified versions is allowed. (It says +> "distribute and use", but not "modify".) +> +> =================================================================== +> Distribute and use freely; there are no restrictions on further +> dissemination and usage except those imposed by the laws of your +> country of residence. This software is provided "as is" without +> warranty of fitness for use or suitability for any purpose, express +> or implied. Use at your own risk or not at all. +> =================================================================== +> +> Incorporating the code into commercial products is permitted; you do +> not have to make source available or contribute your changes back +> (though that would be nice). +> +> --amk (www.amk.ca) +> +> For the next PyCrypto release, I would like to take steps to move toward a +> clearer licensing regime. I am asking as many copyright holders as I can +> find if I can release PyCrypto under something clearer and more standard. +> Below, I have quoted a public domain dedication that was recommended in +> _Intellectual Property and Open Source: A Practical Guide to Protecting +> Code_, by Van Lindberg. I have already contacted A. M. Kuchling, Robey +> Pointer, and Wim Lewis, and they have all approved the following text for +> their contributions. +> +> I understand that you have made contributions to PyCrypto. May I, on your +> behalf, dedicate to the public domain all your contributions to PyCrypto, +> with the following notice? +> +> ======================================================================= +> The contents of this file are dedicated to the public domain. To the +> extent that dedication to the public domain is not available, everyone +> is granted a worldwide, perpetual, royalty-free, non-exclusive license +> to exercise all rights associated with the contents of this file for +> any purpose whatsoever. No rights are reserved. +> ======================================================================= +> +> Regards, +> - Dwayne +> +> -- +> Dwayne C. Litzenberger +> Key-signing key - 19E1 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 +> + + + +-- +Jeethu Rao + +--000e0cd209d0e5a3d40464a23054 +Content-Type: text/html; charset=ISO-8859-1 +Content-Transfer-Encoding: quoted-printable + +Hi Dwayne,
My contribution to pycrypto are very very minimal (The sha25= +6 module, IIRC).
I'd be fine with the public domain license f= +or PyCrypto.

Jeethu Rao
PS: Apologies fo= +r the delay in my response.=A0
+
I don't really check this email address all that often,
= +please direct any further correspondence to jeethu@jeethurao.com

On= + Sun, Mar 1, 2009 at 9:54 AM, Dwayne C. Litzenberger <= +dlitz@dlitz.net> wrote: +
Hi Jeethu,
+
+I am the new maintainer of the Python Cryptography Toolkit, and I am workin= +g on a new release at http://www.pycrypto.org/.
+
+People often ask me what license PyCrypto is covered by, if it's GPL-co= +mpatible, etc. =A0Right now, I'm not really sure what to tell them. =A0= +The text in the current LICENSE file (quoted below) is not entirely clear o= +n the point of whether distributing modified versions is allowed. =A0(It sa= +ys "distribute and use", but not "modify".)
+ +
+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
+Distribute and use freely; there are no restrictions on further
+dissemination and usage except those imposed by the laws of your
+country of residence. =A0This software is provided "as is" withou= +t
+warranty of fitness for use or suitability for any purpose, express
+or implied. Use at your own risk or not at all.
+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
+
+Incorporating the code into commercial products is permitted; you do
+not have to make source available or contribute your changes back
+(though that would be nice).
+
+--amk =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0(www.amk.ca)
+
+For the next PyCrypto release, I would like to take steps to move toward a = +clearer licensing regime. =A0I am asking as many copyright holders as I can= + find if I can release PyCrypto under something clearer and more standard. = +=A0Below, I have quoted a public domain dedication that was recommended in = +_Intellectual Property and Open Source: A Practical Guide to Protecting Cod= +e_, by Van Lindberg. =A0I have already contacted A. M. Kuchling, Robey Poin= +ter, and Wim Lewis, and they have all approved the following text for their= + contributions.
+ +
+I understand that you have made contributions to PyCrypto. =A0May I, on you= +r behalf, dedicate to the public domain all your contributions to PyCrypto,= + with the following notice?
+
+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
+The contents of this file are dedicated to the public domain. =A0To the
+extent that dedication to the public domain is not available, everyone
+is granted a worldwide, perpetual, royalty-free, non-exclusive license
+to exercise all rights associated with the contents of this file for
+any purpose whatsoever. =A0No rights are reserved.
+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
+
+Regards,
+- Dwayne
+
+--
+Dwayne C. Litzenberger <dlitz@dlitz.net>
+ =A0 =A0 =A0Key-signing key =A0 - 19E1 1FE8 B3CF F273 ED17 =A04A24 928C EC1= +3 39C2 5CF7
+



--
Jeethu Rao
+
+ +--000e0cd209d0e5a3d40464a23054-- + + diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Joris_Bontje.mbox b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Joris_Bontje.mbox new file mode 100644 index 0000000..b60dba5 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Joris_Bontje.mbox @@ -0,0 +1,298 @@ +From dlitz@dlitz.net Mon May 4 22:49:14 2009 +Date: Mon, 4 May 2009 22:49:14 -0400 +From: "Dwayne C. Litzenberger" +To: Joris Bontje +Subject: PyCrypto license clarification +Message-ID: <20090505024914.GA9219@rivest.dlitz.net> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii; format=flowed +Content-Disposition: inline +User-Agent: Mutt/1.5.16 (2007-06-11) +Status: RO +Content-Length: 2553 + +Hi Joris, + +I am the new maintainer of the Python Cryptography Toolkit, and I am +working on a new release at http://www.pycrypto.org/. + +People often ask me what license PyCrypto is covered by, if it's +GPL-compatible, etc. Right now, I'm not really sure what to tell them. +The text in the current LICENSE file (quoted below) is not entirely clear +on the point of whether distributing modified versions is allowed. (It +says "distribute and use", but not "modify".) + + =================================================================== + Distribute and use freely; there are no restrictions on further + dissemination and usage except those imposed by the laws of your + country of residence. This software is provided "as is" without + warranty of fitness for use or suitability for any purpose, express + or implied. Use at your own risk or not at all. + =================================================================== + + Incorporating the code into commercial products is permitted; you do + not have to make source available or contribute your changes back + (though that would be nice). + + --amk (www.amk.ca) + +For the next PyCrypto release, I would like to take steps to move toward a +clearer licensing regime. I am asking as many copyright holders as I can +find if I can release PyCrypto under something clearer and more standard. +Below, I have quoted a public domain dedication that was recommended in +_Intellectual Property and Open Source: A Practical Guide to Protecting +Code_, by Van Lindberg. I have already contacted A. M. Kuchling, Robey +Pointer, Barry Warsaw, Wim Lewis, Jeethu Rao, and Mark Moraes, and they +have all approved the following dedication for their contributions. + +I understand that you have made contributions to PyCrypto. May I, on your +behalf, dedicate to the public domain all your contributions to PyCrypto, +with the following notice? + + ======================================================================= + The contents of this file are dedicated to the public domain. To the + extent that dedication to the public domain is not available, everyone + is granted a worldwide, perpetual, royalty-free, non-exclusive license + to exercise all rights associated with the contents of this file for + any purpose whatsoever. No rights are reserved. + ======================================================================= + +Regards, + - Dwayne + +-- +Dwayne C. Litzenberger + Key-signing key - 19E1 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 + +From joris@bontje.nl Tue May 5 03:08:32 2009 +X-Maildir-Dup-Checked: Yes +Return-Path: +X-Original-To: dwon@rivest.dlitz.net +Delivered-To: dwon@rivest.dlitz.net +Received: from goedel.dlitz.net (unknown [10.159.255.6]) + by rivest.dlitz.net (Postfix) with ESMTP id 7AA4B9E5078 + for ; Tue, 5 May 2009 03:08:32 -0400 (EDT) +Received: from localhost (localhost [127.0.0.1]) + by goedel.dlitz.net (Postfix) with QMQP id 2315B40583 + for ; Tue, 5 May 2009 01:08:32 -0600 (CST) +Received: (vmailmgr-postfix 16890 invoked by uid 1003); 5 May 2009 01:08:32 -0600 +Delivered-To: m-dlitz-dlitz@dlitz.net +Received-SPF: none (bontje.nl: No applicable sender policy available) receiver=goedel.dlitz.net; identity=mfrom; envelope-from="joris@bontje.nl"; helo=smtp6.versatel.nl; client-ip=62.58.50.97 +Received: from smtp6.versatel.nl (smtp6.versatel.nl [62.58.50.97]) + by goedel.dlitz.net (Postfix) with ESMTP id 2D76A4052C + for ; Tue, 5 May 2009 01:08:30 -0600 (CST) +Received: (qmail 4224 invoked by uid 0); 5 May 2009 07:08:25 -0000 +Received: from qmail06.zonnet.nl (HELO dell062.admin.zonnet.nl) ([10.170.1.123]) + (envelope-sender ) + by 10.170.1.96 (qmail-ldap-1.03) with SMTP + for < >; 5 May 2009 07:08:25 -0000 +Received: by dell062.admin.zonnet.nl (Postfix, from userid 33) + id 9BE9B15759B; Tue, 5 May 2009 09:08:25 +0200 (CEST) +Received: from firewall66.interaccess.nl (firewall66.interaccess.nl + [193.173.35.66]) by www.webmail.vuurwerk.nl (Horde MIME library) with HTTP; + Tue, 05 May 2009 09:08:25 +0200 +Message-ID: <20090505090825.gsq1ps7hg08wwwok@www.webmail.vuurwerk.nl> +Date: Tue, 05 May 2009 09:08:25 +0200 +From: joris@bontje.nl +To: "Dwayne C. Litzenberger" +Subject: Re: PyCrypto license clarification +References: <20090505024914.GA9219@rivest.dlitz.net> +In-Reply-To: <20090505024914.GA9219@rivest.dlitz.net> +MIME-Version: 1.0 +Content-Type: text/plain; + charset=ISO-8859-1; + format="flowed" +Content-Disposition: inline +Content-Transfer-Encoding: 7bit +User-Agent: Internet Messaging Program (IMP) H3 (4.1.3) +Status: RO +X-Status: A +Content-Length: 3488 + +Hi Dwayne, + +Thanks for taking over the PyCrypto library and putting in the required +effort to keep this going. +I was very excited to read that it is now one of the installed +libraries for Google AppsEngine! + +You have my full permission to dedicate all my contributions to +PyCrypto to the public domain with your suggested notice: +======================================================================= +The contents of this file are dedicated to the public domain. To the +extent that dedication to the public domain is not available, everyone +is granted a worldwide, perpetual, royalty-free, non-exclusive license +to exercise all rights associated with the contents of this file for +any purpose whatsoever. No rights are reserved. +======================================================================= + + +Regards, +Joris + +Citeren "Dwayne C. Litzenberger" : + +> Hi Joris, +> +> I am the new maintainer of the Python Cryptography Toolkit, and I am +> working on a new release at http://www.pycrypto.org/. +> +> People often ask me what license PyCrypto is covered by, if it's +> GPL-compatible, etc. Right now, I'm not really sure what to tell them. +> The text in the current LICENSE file (quoted below) is not entirely clear +> on the point of whether distributing modified versions is allowed. (It +> says "distribute and use", but not "modify".) +> +> =================================================================== +> Distribute and use freely; there are no restrictions on further +> dissemination and usage except those imposed by the laws of your +> country of residence. This software is provided "as is" without +> warranty of fitness for use or suitability for any purpose, express +> or implied. Use at your own risk or not at all. +> =================================================================== +> +> Incorporating the code into commercial products is permitted; you do +> not have to make source available or contribute your changes back +> (though that would be nice). +> +> --amk (www.amk.ca) +> +> For the next PyCrypto release, I would like to take steps to move toward a +> clearer licensing regime. I am asking as many copyright holders as I can +> find if I can release PyCrypto under something clearer and more standard. +> Below, I have quoted a public domain dedication that was recommended in +> _Intellectual Property and Open Source: A Practical Guide to Protecting +> Code_, by Van Lindberg. I have already contacted A. M. Kuchling, Robey +> Pointer, Barry Warsaw, Wim Lewis, Jeethu Rao, and Mark Moraes, and they +> have all approved the following dedication for their contributions. +> +> I understand that you have made contributions to PyCrypto. May I, on your +> behalf, dedicate to the public domain all your contributions to PyCrypto, +> with the following notice? +> +> ======================================================================= +> The contents of this file are dedicated to the public domain. To the +> extent that dedication to the public domain is not available, everyone +> is granted a worldwide, perpetual, royalty-free, non-exclusive license +> to exercise all rights associated with the contents of this file for +> any purpose whatsoever. No rights are reserved. +> ======================================================================= +> +> Regards, +> - Dwayne +> +> -- +> Dwayne C. Litzenberger +> Key-signing key - 19E1 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 + + + +From dlitz@dlitz.net Tue May 5 17:53:47 2009 +Date: Tue, 5 May 2009 17:53:47 -0400 +From: "Dwayne C. Litzenberger" +To: joris@bontje.nl +Subject: Re: PyCrypto license clarification +Message-ID: <20090505215347.GB9933@rivest.dlitz.net> +References: <20090505024914.GA9219@rivest.dlitz.net> <20090505090825.gsq1ps7hg08wwwok@www.webmail.vuurwerk.nl> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii; format=flowed +Content-Disposition: inline +In-Reply-To: <20090505090825.gsq1ps7hg08wwwok@www.webmail.vuurwerk.nl> +X-Primary-Address: dlitz@dlitz.net +X-Homepage: http://www.dlitz.net/ +X-OpenPGP: url=http://www.dlitz.net/go/gpgkey/; + id=19E11FE8B3CFF273ED174A24928CEC1339C25CF7 (only for key signing); + preference=unprotected +X-OpenPGP: url=http://www.dlitz.net/go/gpgkey/; + id=4B2AFD82FC7D9E3838D9179F1C11B877E7804B45 (2008); + preference=signencrypt +User-Agent: Mutt/1.5.16 (2007-06-11) +Status: RO +Content-Length: 3863 + +Excellent! Thank you! + +On Tue, May 05, 2009 at 09:08:25AM +0200, joris@bontje.nl wrote: +> Hi Dwayne, +> +> Thanks for taking over the PyCrypto library and putting in the required +> effort to keep this going. +> I was very excited to read that it is now one of the installed libraries +> for Google AppsEngine! +> +> You have my full permission to dedicate all my contributions to PyCrypto to +> the public domain with your suggested notice: +> ======================================================================= +> The contents of this file are dedicated to the public domain. To the +> extent that dedication to the public domain is not available, everyone +> is granted a worldwide, perpetual, royalty-free, non-exclusive license +> to exercise all rights associated with the contents of this file for +> any purpose whatsoever. No rights are reserved. +> ======================================================================= +> +> +> Regards, +> Joris +> +> Citeren "Dwayne C. Litzenberger" : +> +>> Hi Joris, +>> +>> I am the new maintainer of the Python Cryptography Toolkit, and I am +>> working on a new release at http://www.pycrypto.org/. +>> +>> People often ask me what license PyCrypto is covered by, if it's +>> GPL-compatible, etc. Right now, I'm not really sure what to tell them. +>> The text in the current LICENSE file (quoted below) is not entirely clear +>> on the point of whether distributing modified versions is allowed. (It +>> says "distribute and use", but not "modify".) +>> +>> =================================================================== +>> Distribute and use freely; there are no restrictions on further +>> dissemination and usage except those imposed by the laws of your +>> country of residence. This software is provided "as is" without +>> warranty of fitness for use or suitability for any purpose, express +>> or implied. Use at your own risk or not at all. +>> =================================================================== +>> +>> Incorporating the code into commercial products is permitted; you do +>> not have to make source available or contribute your changes back +>> (though that would be nice). +>> +>> --amk (www.amk.ca) +>> +>> For the next PyCrypto release, I would like to take steps to move toward a +>> clearer licensing regime. I am asking as many copyright holders as I can +>> find if I can release PyCrypto under something clearer and more standard. +>> Below, I have quoted a public domain dedication that was recommended in +>> _Intellectual Property and Open Source: A Practical Guide to Protecting +>> Code_, by Van Lindberg. I have already contacted A. M. Kuchling, Robey +>> Pointer, Barry Warsaw, Wim Lewis, Jeethu Rao, and Mark Moraes, and they +>> have all approved the following dedication for their contributions. +>> +>> I understand that you have made contributions to PyCrypto. May I, on your +>> behalf, dedicate to the public domain all your contributions to PyCrypto, +>> with the following notice? +>> +>> ======================================================================= +>> The contents of this file are dedicated to the public domain. To the +>> extent that dedication to the public domain is not available, everyone +>> is granted a worldwide, perpetual, royalty-free, non-exclusive license +>> to exercise all rights associated with the contents of this file for +>> any purpose whatsoever. No rights are reserved. +>> ======================================================================= +>> +>> Regards, +>> - Dwayne +>> +>> -- +>> Dwayne C. Litzenberger +>> Key-signing key - 19E1 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 +> +> + +-- +Dwayne C. Litzenberger + Key-signing key - 19E1 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 + Annual key (2008) - 4B2A FD82 FC7D 9E38 38D9 179F 1C11 B877 E780 4B45 + diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Mark_Moraes.mbox b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Mark_Moraes.mbox new file mode 100644 index 0000000..11cb715 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Mark_Moraes.mbox @@ -0,0 +1,340 @@ +From dlitz@dlitz.net Sat Apr 18 09:14:20 2009 +Date: Sat, 18 Apr 2009 09:14:20 -0400 +From: "Dwayne C. Litzenberger" +To: Mark Moraes +Subject: PyCrypto license clarification +Message-ID: <20090418131419.GA14494@rivest.dlitz.net> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii; format=flowed +Content-Disposition: inline +User-Agent: Mutt/1.5.16 (2007-06-11) +Status: RO +Content-Length: 2635 + +Hi Mark, + +I am the new maintainer of the Python Cryptography Toolkit, and I am +working on a new release at http://www.pycrypto.org/. + +People often ask me what license PyCrypto is covered by, if it's +GPL-compatible, etc. Right now, I'm not really sure what to tell them. +The text in the current LICENSE file (quoted below) is not entirely clear +on the point of whether distributing modified versions is allowed. (It +says "distribute and use", but not "modify".) + + =================================================================== + Distribute and use freely; there are no restrictions on further + dissemination and usage except those imposed by the laws of your + country of residence. This software is provided "as is" without + warranty of fitness for use or suitability for any purpose, express + or implied. Use at your own risk or not at all. + =================================================================== + + Incorporating the code into commercial products is permitted; you do + not have to make source available or contribute your changes back + (though that would be nice). + + --amk (www.amk.ca) + +For the next PyCrypto release, I would like to take steps to move toward a +clearer licensing regime. I am asking as many copyright holders as I can +find if I can release PyCrypto under something clearer and more standard. +Below, I have quoted a public domain dedication that was recommended in +_Intellectual Property and Open Source: A Practical Guide to Protecting +Code_, by Van Lindberg. I have already contacted A. M. Kuchling, Robey +Pointer, Wim Lewis, Jeethu Rao, and Barry Warsaw, and they have all +approved the following dedication for their contributions. + +I understand that you have made contributions to PyCrypto. May I, on your +behalf, dedicate to the public domain all your contributions to PyCrypto, +with the following notice? + + ======================================================================= + The contents of this file are dedicated to the public domain. To the + extent that dedication to the public domain is not available, everyone + is granted a worldwide, perpetual, royalty-free, non-exclusive license + to exercise all rights associated with the contents of this file for + any purpose whatsoever. No rights are reserved. + ======================================================================= + +Regards, + - Dwayne + +-- +Dwayne C. Litzenberger + Key-signing key - 19E1 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 + +From markmoraes@yahoo.com Mon Apr 20 19:25:37 2009 +X-Maildir-Dup-Checked: Yes +Return-Path: +X-Original-To: dwon@rivest.dlitz.net +Delivered-To: dwon@rivest.dlitz.net +Received: from goedel.dlitz.net (unknown [10.159.255.6]) + by rivest.dlitz.net (Postfix) with ESMTP id 5D9AE984FDD + for ; Mon, 20 Apr 2009 19:25:37 -0400 (EDT) +Received: from localhost (localhost [127.0.0.1]) + by goedel.dlitz.net (Postfix) with QMQP id DE41F4025F + for ; Mon, 20 Apr 2009 17:25:36 -0600 (CST) +Received: (vmailmgr-postfix 7604 invoked by uid 1003); 20 Apr 2009 17:25:36 -0600 +Delivered-To: m-dlitz-dlitz@dlitz.net +Received-SPF: none (yahoo.com: No applicable sender policy available) receiver=goedel.dlitz.net; identity=mfrom; envelope-from="markmoraes@yahoo.com"; helo=web32405.mail.mud.yahoo.com; client-ip=68.142.207.198 +Received: from web32405.mail.mud.yahoo.com (web32405.mail.mud.yahoo.com [68.142.207.198]) + by goedel.dlitz.net (Postfix) with SMTP id B5EAF401EE + for ; Mon, 20 Apr 2009 17:25:36 -0600 (CST) +Received: (qmail 34697 invoked by uid 60001); 20 Apr 2009 23:25:33 -0000 +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1240269933; bh=OvxqbYnCg7R6tUN3YmlgFURM3CuHh1JeHyXhDzkaThU=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type; b=F2h2bFzpQxyKFZ8BhenniyupGw4Zvlekb9BSk91qKU+51W/TkSGBij5YZIhkLQdkQk0qLz5f4g8dT6bOME3sEY1j10hlx0K0u2UD0yoYTINBCmsdMQRoJ7ph9bmt+p/EJhRpe+FiV6aoLV0FONWiHfGDghPT1dulWXfVTqgB2aU= +DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; + s=s1024; d=yahoo.com; + h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type; + b=r6RShFF5VzQLg+9tcn1xKuo4Rs4IVvXF6fdqOpQrMyRCxeFooebhuTE35grGqlomOJLwM0+mZwRb6rGkDj763caOAlo8Ect/qlADW5izXfmVQaDchTbTqmpsJBmQnTQs9iZ+InrG+3UIwtUSGfX7fhEWmI9P/HBzxf9Wp4b3jeo=; +Message-ID: <551071.34569.qm@web32405.mail.mud.yahoo.com> +X-YMail-OSG: FrK8aWMVM1mFJtLpMGbUbCLjbUQC.i.JkIAKUHSFsFn7t9PbtewAewXJ2uhZGCOlGCX6oVnG3u.CgqzAffY4vZSnfTT8wnCkzZNZ_g6k.XUc3ipo_6e.92TXl4p8MxDGAf1tpNF5nXPwcQ7aREs7jGoWWVJYVytp50clsUFSHzf7Zbpa8P1Yoe_xSzf3OAgRSh5fCrbFCC8sHPCuwrL3YhasbtHmkWffteSS.x6gEcBaxf03oz4FeDb5mpJ54g11Xonq8h_TmzX9g84Bin9g_3fJ4WSXm6g6.tohLyfXcUxoz4j036wyWpTKPrWEzIUQaN83Sv_bj_Ghxw-- +Received: from [69.124.140.74] by web32405.mail.mud.yahoo.com via HTTP; Mon, 20 Apr 2009 16:25:32 PDT +X-Mailer: YahooMailClassic/5.2.15 YahooMailWebService/0.7.289.1 +Date: Mon, 20 Apr 2009 16:25:32 -0700 (PDT) +From: M Moraes +Reply-To: moraes@computer.org +Subject: Re: PyCrypto license clarification +To: "Dwayne C. Litzenberger" +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Status: RO +X-Status: A +Content-Length: 3222 + + +Hi Dwayne. + +Sure, the new license sounds fine for all my contributions to PyCrypto, and thanks for taking it on. My apologies for not responding to your previous e-mail. + +Regards, +Mark. + +--- On Sat, 4/18/09, Dwayne C. Litzenberger wrote: + +> From: Dwayne C. Litzenberger +> Subject: PyCrypto license clarification +> To: "Mark Moraes" +> Date: Saturday, April 18, 2009, 9:14 AM +> Hi Mark, +> +> I am the new maintainer of the Python Cryptography Toolkit, +> and I am +> working on a new release at http://www.pycrypto.org/. +> +> People often ask me what license PyCrypto is covered by, if +> it's +> GPL-compatible, etc. Right now, I'm not really sure +> what to tell them. +> The text in the current LICENSE file (quoted below) is not +> entirely clear +> on the point of whether distributing modified versions is +> allowed. (It +> says "distribute and use", but not "modify".) +> +> +> =================================================================== +> Distribute and use freely; there are +> no restrictions on further +> dissemination and usage except those +> imposed by the laws of your +> country of residence. This +> software is provided "as is" without +> warranty of fitness for use or +> suitability for any purpose, express +> or implied. Use at your own risk or +> not at all. +> +> =================================================================== +> +> Incorporating the code into commercial +> products is permitted; you do +> not have to make source available or +> contribute your changes back +> (though that would be nice). +> +> --amk +> +> +> (www.amk.ca) +> +> For the next PyCrypto release, I would like to take steps +> to move toward a +> clearer licensing regime. I am asking as many +> copyright holders as I can +> find if I can release PyCrypto under something clearer and +> more standard. +> Below, I have quoted a public domain dedication that was +> recommended in +> _Intellectual Property and Open Source: A Practical Guide +> to Protecting +> Code_, by Van Lindberg. I have already contacted A. +> M. Kuchling, Robey +> Pointer, Wim Lewis, Jeethu Rao, and Barry Warsaw, and they +> have all +> approved the following dedication for their contributions. +> +> I understand that you have made contributions to +> PyCrypto. May I, on your +> behalf, dedicate to the public domain all your +> contributions to PyCrypto, +> with the following notice? +> +> +> ======================================================================= +> The contents of this file are +> dedicated to the public domain. To the +> extent that dedication to the public +> domain is not available, everyone +> is granted a worldwide, perpetual, +> royalty-free, non-exclusive license +> to exercise all rights associated with +> the contents of this file for +> any purpose whatsoever. No +> rights are reserved. +> +> ======================================================================= +> +> Regards, +> - Dwayne +> +> -- Dwayne C. Litzenberger +> Key-signing key - 19E1 +> 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 +> + + +From dlitz@dlitz.net Mon Apr 20 20:01:37 2009 +Date: Mon, 20 Apr 2009 20:01:37 -0400 +From: "Dwayne C. Litzenberger" +To: moraes@computer.org +Subject: Re: PyCrypto license clarification +Message-ID: <20090421000137.GA29012@rivest.dlitz.net> +References: <551071.34569.qm@web32405.mail.mud.yahoo.com> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii; format=flowed +Content-Disposition: inline +In-Reply-To: <551071.34569.qm@web32405.mail.mud.yahoo.com> +X-Primary-Address: dlitz@dlitz.net +X-Homepage: http://www.dlitz.net/ +X-OpenPGP: url=http://www.dlitz.net/go/gpgkey/; + id=19E11FE8B3CFF273ED174A24928CEC1339C25CF7 (only for key signing); + preference=unprotected +X-OpenPGP: url=http://www.dlitz.net/go/gpgkey/; + id=4B2AFD82FC7D9E3838D9179F1C11B877E7804B45 (2008); + preference=signencrypt +User-Agent: Mutt/1.5.16 (2007-06-11) +Status: RO +Content-Length: 3677 + +Thanks a lot, and don't worry about not responding to previous emails. I +do that too much myself. :) + +On Mon, Apr 20, 2009 at 04:25:32PM -0700, M Moraes wrote: +> +>Hi Dwayne. +> +>Sure, the new license sounds fine for all my contributions to PyCrypto, and thanks for taking it on. My apologies for not responding to your previous e-mail. +> +>Regards, +>Mark. +> +>--- On Sat, 4/18/09, Dwayne C. Litzenberger wrote: +> +>> From: Dwayne C. Litzenberger +>> Subject: PyCrypto license clarification +>> To: "Mark Moraes" +>> Date: Saturday, April 18, 2009, 9:14 AM +>> Hi Mark, +>> +>> I am the new maintainer of the Python Cryptography Toolkit, +>> and I am +>> working on a new release at http://www.pycrypto.org/. +>> +>> People often ask me what license PyCrypto is covered by, if +>> it's +>> GPL-compatible, etc. Right now, I'm not really sure +>> what to tell them. +>> The text in the current LICENSE file (quoted below) is not +>> entirely clear +>> on the point of whether distributing modified versions is +>> allowed. (It +>> says "distribute and use", but not "modify".) +>> +>> +>> =================================================================== +>> Distribute and use freely; there are +>> no restrictions on further +>> dissemination and usage except those +>> imposed by the laws of your +>> country of residence. This +>> software is provided "as is" without +>> warranty of fitness for use or +>> suitability for any purpose, express +>> or implied. Use at your own risk or +>> not at all. +>> +>> =================================================================== +>> +>> Incorporating the code into commercial +>> products is permitted; you do +>> not have to make source available or +>> contribute your changes back +>> (though that would be nice). +>> +>> --amk +>> +>> +>> (www.amk.ca) +>> +>> For the next PyCrypto release, I would like to take steps +>> to move toward a +>> clearer licensing regime. I am asking as many +>> copyright holders as I can +>> find if I can release PyCrypto under something clearer and +>> more standard. +>> Below, I have quoted a public domain dedication that was +>> recommended in +>> _Intellectual Property and Open Source: A Practical Guide +>> to Protecting +>> Code_, by Van Lindberg. I have already contacted A. +>> M. Kuchling, Robey +>> Pointer, Wim Lewis, Jeethu Rao, and Barry Warsaw, and they +>> have all +>> approved the following dedication for their contributions. +>> +>> I understand that you have made contributions to +>> PyCrypto. May I, on your +>> behalf, dedicate to the public domain all your +>> contributions to PyCrypto, +>> with the following notice? +>> +>> +>> ======================================================================= +>> The contents of this file are +>> dedicated to the public domain. To the +>> extent that dedication to the public +>> domain is not available, everyone +>> is granted a worldwide, perpetual, +>> royalty-free, non-exclusive license +>> to exercise all rights associated with +>> the contents of this file for +>> any purpose whatsoever. No +>> rights are reserved. +>> +>> ======================================================================= +>> +>> Regards, +>> - Dwayne +>> +>> -- Dwayne C. Litzenberger +>> Key-signing key - 19E1 +>> 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 +>> +> + +-- +Dwayne C. Litzenberger + Key-signing key - 19E1 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 + Annual key (2008) - 4B2A FD82 FC7D 9E38 38D9 179F 1C11 B877 E780 4B45 + diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Paul_Swartz.mbox b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Paul_Swartz.mbox new file mode 100644 index 0000000..0c3be4b --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Paul_Swartz.mbox @@ -0,0 +1,211 @@ +From dlitz@dlitz.net Sun Aug 2 21:48:25 2009 +Date: Sun, 2 Aug 2009 21:48:25 -0400 +From: "Dwayne C. Litzenberger" +To: Paul Swartz +Subject: PyCrypto license clarification +Message-ID: <20090803014825.GA1326@rivest.dlitz.net> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii; format=flowed +Content-Disposition: inline +User-Agent: Mutt/1.5.16 (2007-06-11) +Status: RO +Content-Length: 2631 + +Hi Paul, + +I am the new maintainer of the Python Cryptography Toolkit, and I am +working on a new release at http://www.pycrypto.org/. + +People often ask me what license PyCrypto is covered by, if it's +GPL-compatible, etc. Right now, I'm not really sure what to tell them. +The text in the current LICENSE file (quoted below) is not entirely clear +on the point of whether distributing modified versions is allowed. (It +says "distribute and use", but not "modify".) + + =================================================================== + Distribute and use freely; there are no restrictions on further + dissemination and usage except those imposed by the laws of your + country of residence. This software is provided "as is" without + warranty of fitness for use or suitability for any purpose, express + or implied. Use at your own risk or not at all. + =================================================================== + + Incorporating the code into commercial products is permitted; you do + not have to make source available or contribute your changes back + (though that would be nice). + + --amk (www.amk.ca) + +For the next PyCrypto release, I would like to take steps to move toward a +clearer licensing regime. I am asking as many copyright holders as I can +find if I can release PyCrypto under something clearer and more standard. +Below, I have quoted a public domain dedication that was recommended in +_Intellectual Property and Open Source: A Practical Guide to Protecting +Code_, by Van Lindberg. I have already contacted A. M. Kuchling, Robey +Pointer, Barry Warsaw, Wim Lewis, Jeethu Rao, Joris Bontje, and Mark +Moraes, and they have all approved the following dedication for their +contributions. + +I understand that you have made contributions to PyCrypto, under nickname +"z3p" and/or other names. May I, on your behalf, dedicate to the public +domain all your contributions to PyCrypto, with the following notice? + + ======================================================================= + The contents of this file are dedicated to the public domain. To the + extent that dedication to the public domain is not available, everyone + is granted a worldwide, perpetual, royalty-free, non-exclusive license + to exercise all rights associated with the contents of this file for + any purpose whatsoever. No rights are reserved. + ======================================================================= + +Regards, + - Dwayne + +-- +Dwayne C. Litzenberger + Key-signing key - 19E1 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 + +From paulswartz@gmail.com Mon Aug 3 12:14:07 2009 +X-Maildir-Dup-Checked: Yes +Return-Path: +X-Original-To: dwon@rivest.dlitz.net +Delivered-To: dwon@rivest.dlitz.net +Received: from goedel.dlitz.net (unknown [10.159.255.6]) + by rivest.dlitz.net (Postfix) with ESMTP id 30B9D984FC4 + for ; Mon, 3 Aug 2009 12:14:07 -0400 (EDT) +Received: from localhost (localhost [127.0.0.1]) + by goedel.dlitz.net (Postfix) with QMQP id AD9AE81068 + for ; Mon, 3 Aug 2009 10:14:06 -0600 (CST) +Received: (vmailmgr-postfix 32055 invoked by uid 1003); 3 Aug 2009 10:14:06 -0600 +Delivered-To: m-dlitz-dlitz@dlitz.net +Received-SPF: pass (gmail.com ... _spf.google.com: 72.14.220.159 is authorized to use 'paulswartz@gmail.com' in 'mfrom' identity (mechanism 'ip4:72.14.192.0/18' matched)) receiver=goedel.dlitz.net; identity=mfrom; envelope-from="paulswartz@gmail.com"; helo=fg-out-1718.google.com; client-ip=72.14.220.159 +Received: from fg-out-1718.google.com (fg-out-1718.google.com [72.14.220.159]) + by goedel.dlitz.net (Postfix) with ESMTP id 4E63881066 + for ; Mon, 3 Aug 2009 10:14:05 -0600 (CST) +Received: by fg-out-1718.google.com with SMTP id d23so1076840fga.3 + for ; Mon, 03 Aug 2009 09:14:04 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=gamma; + h=domainkey-signature:mime-version:received:in-reply-to:references + :from:date:message-id:subject:to:content-type + :content-transfer-encoding; + bh=A0RHBf0TnribKS5qOHJ3WYbkZ+b0cuPeuoKAvpApWcc=; + b=gyTqkRhKlHadFKIZCBWsRbnMNVDq1PWlJbyC0EvxPskaoHr3HAR96MWQNBePu/40Ac + Vn55qlIqTdom4e9zlUEE6MwZo9kqi/Qw0L/SLib0DlQeNqo/eHYqPmuVswltaYwNAyMJ + Y9++76rPGzqYdALsfvsmwv7Q3/bEmjVTr0tQE= +DomainKey-Signature: a=rsa-sha1; c=nofws; + d=gmail.com; s=gamma; + h=mime-version:in-reply-to:references:from:date:message-id:subject:to + :content-type:content-transfer-encoding; + b=jze7KSMkUGilfVCXKXaaXMi5NAtGdMQOtVZZfRNyGSy68xOd2sxefjyyig3EfT6Nv6 + Q3opUMsT96Q6zjZND55w446kTh2uBTNz4d3NwIeEWJnG3xcliRQu/mXPFp8AzPI3CefL + 1ornJLM1eQ2XyuZA73jem+SJtfdHUcSD1UhgI= +MIME-Version: 1.0 +Received: by 10.239.157.147 with SMTP id q19mr601802hbc.61.1249316043185; Mon, + 03 Aug 2009 09:14:03 -0700 (PDT) +In-Reply-To: <20090803014825.GA1326@rivest.dlitz.net> +References: <20090803014825.GA1326@rivest.dlitz.net> +From: Paul Swartz +Date: Mon, 3 Aug 2009 12:13:43 -0400 +Message-ID: <324cfb540908030913x71d331f0kb069052f74e5ae6b@mail.gmail.com> +Subject: Re: PyCrypto license clarification +To: "Dwayne C. Litzenberger" +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: quoted-printable +Status: RO +X-Status: A +Content-Length: 1450 + +On Sun, Aug 2, 2009 at 9:48 PM, Dwayne C. Litzenberger wro= +te: +> Hi Paul, +> +> I am the new maintainer of the Python Cryptography Toolkit, and I am +> working on a new release at http://www.pycrypto.org/. + +That's great! + +> I understand that you have made contributions to PyCrypto, under nickname +> "z3p" and/or other names. =C2=A0May I, on your behalf, dedicate to the pu= +blic +> domain all your contributions to PyCrypto, with the following notice? +> +> =C2=A0=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +> =C2=A0The contents of this file are dedicated to the public domain. =C2= +=A0To the +> =C2=A0extent that dedication to the public domain is not available, every= +one +> =C2=A0is granted a worldwide, perpetual, royalty-free, non-exclusive lice= +nse +> =C2=A0to exercise all rights associated with the contents of this file fo= +r +> =C2=A0any purpose whatsoever. =C2=A0No rights are reserved. +> =C2=A0=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Yes, that's fine. Good luck with the new release! + +-p +--=20 +Paul Swartz +paulswartz at gmail dot com +http://paulswartz.net/ +AIM: z3penguin + + +From dlitz@dlitz.net Mon Aug 3 14:35:01 2009 +Date: Mon, 3 Aug 2009 14:35:01 -0400 +From: "Dwayne C. Litzenberger" +To: Paul Swartz +Subject: Re: PyCrypto license clarification +Message-ID: <20090803183501.GA17472@rivest.dlitz.net> +References: <20090803014825.GA1326@rivest.dlitz.net> <324cfb540908030913x71d331f0kb069052f74e5ae6b@mail.gmail.com> +MIME-Version: 1.0 +Content-Type: text/plain; charset=iso-8859-1; format=flowed +Content-Disposition: inline +Content-Transfer-Encoding: 8bit +In-Reply-To: <324cfb540908030913x71d331f0kb069052f74e5ae6b@mail.gmail.com> +X-Primary-Address: dlitz@dlitz.net +X-Homepage: http://www.dlitz.net/ +X-OpenPGP: url=http://www.dlitz.net/go/gpgkey/; + id=19E11FE8B3CFF273ED174A24928CEC1339C25CF7 (only for key signing); + preference=unprotected +X-OpenPGP: url=http://www.dlitz.net/go/gpgkey/; + id=4B2AFD82FC7D9E3838D9179F1C11B877E7804B45 (2008); + preference=signencrypt +User-Agent: Mutt/1.5.16 (2007-06-11) +Status: RO +Content-Length: 1250 + +On Mon, Aug 03, 2009 at 12:13:43PM -0400, Paul Swartz wrote: +>On Sun, Aug 2, 2009 at 9:48 PM, Dwayne C. Litzenberger wrote: +>> Hi Paul, +>> +>> I am the new maintainer of the Python Cryptography Toolkit, and I am +>> working on a new release at http://www.pycrypto.org/. +> +>That's great! +> +>> I understand that you have made contributions to PyCrypto, under nickname +>> "z3p" and/or other names. May I, on your behalf, dedicate to the public +>> domain all your contributions to PyCrypto, with the following notice? +>> +>> ======================================================================= +>> The contents of this file are dedicated to the public domain. To the +>> extent that dedication to the public domain is not available, everyone +>> is granted a worldwide, perpetual, royalty-free, non-exclusive license +>> to exercise all rights associated with the contents of this file for +>> any purpose whatsoever. No rights are reserved. +>> ======================================================================= +> +>Yes, that's fine. Good luck with the new release! + +Perfect! Thanks for the quick response! + +-- +Dwayne C. Litzenberger + Key-signing key - 19E1 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 + diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Robey_Pointer.asc b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Robey_Pointer.asc new file mode 100644 index 0000000..fa49e5a --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Robey_Pointer.asc @@ -0,0 +1,53 @@ +Date: Mon, 16 Feb 2009 12:58:00 -0800 +From: Robey Pointer +Subject: Re: PyCrypto license clarification +To: "Dwayne C. Litzenberger" +Received-SPF: pass (goedel.dlitz.net: domain of robey@lag.net designates 69.61.78.186 as permitted sender) +Message-Id: + +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + +On 23 Nov 2008, at 07:42, Dwayne C. Litzenberger wrote: + +> For the next PyCrypto release, I would like to take steps to move +> toward a clearer licensing regime. I am asking as many copyright +> holders as I can find if I can release PyCrypto under something +> clearer and more standard. Below, I have quoted a public domain +> dedication that was recommended in _Intellectual Property and Open +> Source: A Practical Guide to Protecting Code_, by Van Lindberg. I +> have already contacted A. M. Kuchling, and he has approved the +> following dedication for his contributions. +> +> May I, on your behalf, dedicate to the public domain all your +> contributions to PyCrypto, with the following notice? +> +> +> = +> ====================================================================== +> The contents of this file are dedicated to the public domain. To +> the +> extent that dedication to the public domain is not available, +> everyone +> is granted a worldwide, perpetual, royalty-free, non-exclusive +> license +> to exercise all rights associated with the contents of this file +> for +> any purpose whatsoever. No rights are reserved. +> +> = +> ====================================================================== +> + +In case I haven't replied to this yet: Yes, this is fine with me. + +robey + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.8 (Darwin) + +iEYEARECAAYFAkmZ01gACgkQQQDkKvyJ6cOLvQCfQmYYuVODvIlyLg0hgCI9LAbQ +SH8AoLJgaq1lIi7/ZYDc+/Cd8VO0xLbr +=Mv6g +-----END PGP SIGNATURE----- + diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Wim_Lewis.asc b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Wim_Lewis.asc new file mode 100644 index 0000000..3969994 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/copy/stmts/Wim_Lewis.asc @@ -0,0 +1,45 @@ +Date: Sun, 23 Nov 2008 15:54:35 -0800 +From: Wim Lewis +Subject: Re: PyCrypto license clarification +To: "Dwayne C. Litzenberger" +Cc: Wim Lewis +Message-Id: <9D5C3135-7414-47D7-9D41-0AC6C3A84D97@hhhh.org> + +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + +On November 23, 2008, you wrote: +>Hi Wim, +> +>I am the new maintainer of the Python Cryptography Toolkit, and I am +>working on a new release at http://www.pycrypto.org/. +> +>I understand that you have made contributions to PyCrypto. May I, on +>your behalf, dedicate to the public domain all your contributions to +>PyCrypto, with the following notice? +> +> ======================================================================= +> The contents of this file are dedicated to the public domain. To the +> extent that dedication to the public domain is not available, everyone +> is granted a worldwide, perpetual, royalty-free, non-exclusive license +> to exercise all rights associated with the contents of this file for +> any purpose whatsoever. No rights are reserved. +> ======================================================================= + +Certainly! I think the only code of mine in PyCrypto is the CAST-5 / CAST-128 +implementation, which already has a public-domain notice at the top of +the file. But I am happy to have that, any any other code of mine that +might have wandered in there under an unclear open sourcish license, +distributed under the public-domain dedication you quote. + +Wim. + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.6 (Darwin) + +iQCVAwUBSSnnAl8UnN8n93LBAQLp/gQAhr7x8Av1mstc2kxEJDWTm26PTAZxMz4B +FektbDOzkxgc5580MGGeeX/MVn8aw+1BHg0YD85gsntlDzkcQtb+BR/xAvJ5zKyA +J/Mn/I+I6ekJQ3juh8IPHLAduOXM9Rtguas/yR+Doaq0xOPKoBx+/5+t1lLJtBcZ +wrPEa9Oui9s= +=zSY9 +-----END PGP SIGNATURE----- diff --git a/Cryptography/pycrypto-2.6.1/LEGAL/tsu-notify.mbox b/Cryptography/pycrypto-2.6.1/LEGAL/tsu-notify.mbox new file mode 100644 index 0000000..c9fcfb2 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/LEGAL/tsu-notify.mbox @@ -0,0 +1,130 @@ +From dlitz@dlitz.net Wed Aug 27 20:54:38 EDT 2008 +X-Maildir-Dup-Checked: Yes +Return-Path: +X-Original-To: dwon@rivest.dlitz.net +Delivered-To: dwon@rivest.dlitz.net +Received: from goedel.dlitz.net (unknown [10.159.255.6]) + by rivest.dlitz.net (Postfix) with ESMTP id ECFDFC6641D + for ; Wed, 27 Aug 2008 20:45:06 -0400 (EDT) +Received: from localhost (localhost [127.0.0.1]) + by goedel.dlitz.net (Postfix) with QMQP id 99A9D100AA + for ; Wed, 27 Aug 2008 18:45:05 -0600 (CST) +Received: (vmailmgr-postfix 3270 invoked by uid 1003); 27 Aug 2008 18:45:05 -0600 +Delivered-To: m-dlitz-dlitz@dlitz.net +Received-SPF: pass (goedel.dlitz.net: domain of dlitz@dlitz.net designates 193.201.42.13 as permitted sender) +Received: from m14.itconsult.net (m14.itconsult.net [193.201.42.13]) + by goedel.dlitz.net (Postfix) with ESMTP id 1D3B510088 + for ; Wed, 27 Aug 2008 18:45:04 -0600 (CST) +Received: from stamper.itconsult.co.uk (stamper.itconsult.co.uk + [193.201.42.31]) by m14.stamper.itconsult.co.uk (GMS + 15.01.3664/NT8923.00.54dca388) with SMTP id jfxsjqaa for dlitz@dlitz.net; + Thu, 28 Aug 2008 01:45:02 +0100 +To: crypt@bis.doc.gov, + enc@nsa.gov, + web_site@bis.doc.gov, + pycrypto@lists.dlitz.net, + PYTHON-CRYPTO@NIC.SURFNET.NL, + dlitz@dlitz.net +Received-SPF: Pass (m14.stamper.itconsult.co.uk: domain of dlitz@dlitz.net + designates 64.5.53.201 as permitted sender) identity=mailfrom; + client-ip=64.5.53.201; receiver=m14.stamper.itconsult.co.uk; + helo=goedel.dlitz.net; mechanism=-all; envelope-from=dlitz@dlitz.net; +Received: from goedel.dlitz.net (goedel.dlitz.net [64.5.53.201]) by + m14.stamper.itconsult.co.uk (GMS 15.01.3664/NT8923.00.54dca388) with ESMTP id + taxsjqaa for post@stamper.itconsult.co.uk; Thu, 28 Aug 2008 01:42:58 +0100 +Received: from rivest.dlitz.net (rivest.dlitz.net [IPv6:2002:4c0a:9133:1104::1]) + by goedel.dlitz.net (Postfix) with ESMTP id 667C7100B1 + for ; Wed, 27 Aug 2008 18:42:56 -0600 (CST) +Received: by rivest.dlitz.net (Postfix, from userid 1000) + id B92F8C66420; Wed, 27 Aug 2008 20:42:55 -0400 (EDT) +Received: by rivest.dlitz.net (tmda-sendmail, from uid 1000); + Wed, 27 Aug 2008 20:42:54 -0400 +Date: Wed, 27 Aug 2008 20:42:54 -0400 +Cc: post@stamper.itconsult.co.uk +Subject: PyCrypto TSU NOTIFICATION +Message-ID: <20080828004254.GA31214@rivest.dlitz.net> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii; format=flowed +Content-Disposition: inline +X-Primary-Address: dlitz@dlitz.net +X-Homepage: http://www.dlitz.net/ +X-OpenPGP: url=http://www.dlitz.net/go/gpgkey/; + id=19E11FE8B3CFF273ED174A24928CEC1339C25CF7 (only for key signing); + preference=unprotected +X-OpenPGP: url=http://www.dlitz.net/go/gpgkey/; + id=4B2AFD82FC7D9E3838D9179F1C11B877E7804B45 (2008); + preference=signencrypt +User-Agent: Mutt/1.5.16 (2007-06-11) +X-Delivery-Agent: TMDA/1.1.9 (Jura) +From: "Dwayne C. Litzenberger" +X-DNSBL: 0 +Status: O +Content-Length: 2182 +Lines: 65 + +-----BEGIN PGP SIGNED MESSAGE----- + +######################################################## +# +# This is a proof of posting certificate from +# stamper.itconsult.co.uk certifying that a user +# claiming to be:- +# dlitz@dlitz.net +# requested that this message be sent to:- +# crypt@bis.doc.gov +# enc@nsa.gov +# web_site@bis.doc.gov +# pycrypto@lists.dlitz.net +# PYTHON-CRYPTO@NIC.SURFNET.NL +# dlitz@dlitz.net +# +# This certificate was issued at 00:45 (GMT) +# on Thursday 28 August 2008 with reference 0520978 +# +# CAUTION: while the message may well be from the sender +# indicated in the "From:" header, the sender +# has NOT been authenticated by this service +# +# For information about the Stamper service see +# http://www.itconsult.co.uk/stamper.htm +# +######################################################## + +SUBMISSION TYPE: TSU +SUBMITTED BY: Dwayne C. Litzenberger +SUBMITTED FOR: Dwayne C. Litzenberger +POINT OF CONTACT: Dwayne C. Litzenberger +PHONE and/or FAX: +1-613-693-1296 +MANUFACTURER: n/a +PRODUCT NAME/MODEL #: The Python Cryptography Toolkit ("PyCrypto") +ECCN: 5D002 + +NOTIFICATION: http://www.pycrypto.org/ + +Note: I am a Canadian citizen posting software to my website located in +Canada. I am not certain whether PyCrypto contains enough US-origin +cryptography to be covered by U.S. export controls, but I am submitting +this anyway. + +(Sorry for spamming the lists, but I want there to be a record of this.) + +- -- +Dwayne C. Litzenberger + Key-signing key - 19E1 1FE8 B3CF F273 ED17 4A24 928C EC13 39C2 5CF7 + Annual key (2008) - 4B2A FD82 FC7D 9E38 38D9 179F 1C11 B877 E780 4B45 + + +-----BEGIN PGP SIGNATURE----- +Version: 2.6.3i +Charset: noconv +Comment: Stamper Reference Id: 0520978 + +iQEVAgUBSLX1DYGVnbVwth+BAQEcuwf9EWnXLqSO5bPzR9K9QnTPcsKbTljKjPxr +d+q0E7eE8VtnvvijUcTAR9o27yvzOPxdFT864MQA7OTSbPK39aGAgA4fgAgvYH9t +UNjJ/kv8QLz/aq2fi/HNjyrwnqFnUl0uqwpOrQGbz8Y+SGpVh1gKqy1Ju45L+doq +sxbzCOpjgRv2zDdNR/2SnFmDWQXv8dSeonwIHpQDft8/LVA/gHiTDmteQlOhJQ6o +XYhY+HbRjsD741/GSpOt9IlN5ln0UgshFoLIndnNSAvWf4aPyh5KCN7ho+/BC0v/ +W/pqSSlPkwmbhlPHoOltTkNc0qKLAHXqMGJNhO8AkrYZOyJksb0HsA== +=3oIX +-----END PGP SIGNATURE----- + diff --git a/Cryptography/pycrypto-2.6.1/MANIFEST.in b/Cryptography/pycrypto-2.6.1/MANIFEST.in new file mode 100644 index 0000000..4a456fe --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/MANIFEST.in @@ -0,0 +1,7 @@ +include MANIFEST.in +include ACKS ChangeLog COPYRIGHT Doc/* TODO +graft LEGAL +recursive-include src *.h *.c +include src/config.h.in +include *.py +include configure configure.ac diff --git a/Cryptography/pycrypto-2.6.1/PKG-INFO b/Cryptography/pycrypto-2.6.1/PKG-INFO new file mode 100644 index 0000000..48ae376 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/PKG-INFO @@ -0,0 +1,19 @@ +Metadata-Version: 1.1 +Name: pycrypto +Version: 2.6.1 +Summary: Cryptographic modules for Python. +Home-page: http://www.pycrypto.org/ +Author: Dwayne C. Litzenberger +Author-email: dlitz@dlitz.net +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: Public Domain +Classifier: Intended Audience :: Developers +Classifier: Operating System :: Unix +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Topic :: Security :: Cryptography +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 3 diff --git a/Cryptography/pycrypto-2.6.1/README b/Cryptography/pycrypto-2.6.1/README new file mode 100644 index 0000000..7f310f0 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/README @@ -0,0 +1,103 @@ +Python Cryptography Toolkit (pycrypto) +====================================== + +This is a collection of both secure hash functions (such as SHA256 and +RIPEMD160), and various encryption algorithms (AES, DES, RSA, ElGamal, +etc.). The package is structured to make adding new modules easy. +This section is essentially complete, and the software interface will +almost certainly not change in an incompatible way in the future; all +that remains to be done is to fix any bugs that show up. If you +encounter a bug, please report it in the Launchpad bug tracker at + + https://launchpad.net/products/pycrypto/+bugs + +An example usage of the SHA256 module is: +>>> from Crypto.Hash import SHA256 +>>> hash = SHA256.new() +>>> hash.update('message') +>>> hash.digest() +'\xabS\n\x13\xe4Y\x14\x98+y\xf9\xb7\xe3\xfb\xa9\x94\xcf\xd1\xf3\xfb"\xf7\x1c\xea\x1a\xfb\xf0+F\x0cm\x1d' + +An example usage of an encryption algorithm (AES, in this case) is: + +>>> from Crypto.Cipher import AES +>>> obj = AES.new('This is a key456', AES.MODE_ECB) +>>> message = "The answer is no" +>>> ciphertext = obj.encrypt(message) +>>> ciphertext +'o\x1aq_{P+\xd0\x07\xce\x89\xd1=M\x989' +>>> obj2 = AES.new('This is a key456', AES.MODE_ECB) +>>> obj2.decrypt(ciphertext) +'The answer is no' + +One possible application of the modules is writing secure +administration tools. Another application is in writing daemons and +servers. Clients and servers can encrypt the data being exchanged and +mutually authenticate themselves; daemons can encrypt private data for +added security. Python also provides a pleasant framework for +prototyping and experimentation with cryptographic algorithms; thanks +to its arbitrary-length integers, public key algorithms are easily +implemented. + +As of PyCrypto 2.1.0, PyCrypto provides an easy-to-use random number +generator: + +>>> from Crypto import Random +>>> rndfile = Random.new() +>>> rndfile.read(16) +'\xf7.\x838{\x85\xa0\xd3>#}\xc6\xc2jJU' + +A stronger version of Python's standard "random" module is also +provided: + +>>> from Crypto.Random import random +>>> random.choice(['dogs', 'cats', 'bears']) +'bears' + +Caveat: For the random number generator to work correctly, you must +call Random.atfork() in both the parent and child processes after +using os.fork() + + +Installation +============ + +PyCrypto is written and tested using Python version 2.1 through 3.2. Python +1.5.2 is not supported. + +The modules are packaged using the Distutils, so you can simply run +"python setup.py build" to build the package, and "python setup.py +install" to install it. + +If the setup.py script crashes with a DistutilsPlatformError +complaining that the file /usr/lib/python2.2/config/Makefile doesn't +exist, this means that the files needed for compiling new Python +modules aren't installed on your system. Red Hat users often run into +this because they don't have the python2-devel RPM installed. The fix +is to simply install the requisite RPM. On Debian/Ubuntu, you need the +python-dev package. + +To verify that everything is in order, run "python setup.py test". It +will test all the cryptographic modules, skipping ones that aren't +available. If the test script reports an error on your machine, +please report the bug using the bug tracker (URL given above). If +possible, track down the bug and include a patch that fixes it, +provided that you are able to meet the eligibility requirements at +http://www.pycrypto.org/submission-requirements/. + +It is possible to test a single sub-package or a single module only, for instance +when you investigate why certain tests fail and don't want to run the whole +suite each time. Use "python setup.py test --module=name", where 'name' +is either a sub-package (Cipher, PublicKey, etc) or a module (Cipher.DES, +PublicKey.RSA, etc). +To further cut test coverage, pass also the option "--skip-slow-tests". + +To install the package under the site-packages directory of +your Python installation, run "python setup.py install". + +If you have any comments, corrections, or improvements for this +package, please report them to our mailing list, accessible via the +PyCrypto website: + + http://www.pycrypto.org/ + diff --git a/Cryptography/pycrypto-2.6.1/TODO b/Cryptography/pycrypto-2.6.1/TODO new file mode 100644 index 0000000..9116700 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/TODO @@ -0,0 +1,30 @@ +- Clean up and stabilize the Crypto.PublicKey API. The previous attempt to + unify fundamentally different algorithms, such as RSA and DSA, should be + avoided, since it simply adds confusion. + +- Add algorithms: + - Camellia + - SHA512 + - Diffie-Hellmen key agreement + - Authenticated Diffie-Hellmen key agreement + - RSA PKCS#1 v1.5 + - RSA PKCS#1 v2 (OAEP) + +- Add a *complete* DSA implementation. (The current implementation doesn't do + the necessary hashing, for example.) + +- Coverage testing + +- Run lint on the C code + +- Separate the exported API from the internal implementation details. + +- Provide drop-in support for extensions/drivers like amkCrypto/mxCrypto. + There should be some way to register these drivers in your package, e.g. by + defining a certain subdirectory to be a place where pycrypto looks for these + drivers at startup time. + +- Merge Crypto.Cipher.XOR and Crypto.Util.strxor somehow + +- Document our experiences with RandomPool and why it was bad. + diff --git a/Cryptography/pycrypto-2.6.1/configure b/Cryptography/pycrypto-2.6.1/configure new file mode 100755 index 0000000..9f3694f --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/configure @@ -0,0 +1,4925 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.68 for FULL-PACKAGE-NAME VERSION. +# +# Report bugs to . +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + # Preserve -v and -x to the replacement shell. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; + esac + exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and BUG-REPORT-ADDRESS +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='FULL-PACKAGE-NAME' +PACKAGE_TARNAME='full-package-name' +PACKAGE_VERSION='VERSION' +PACKAGE_STRING='FULL-PACKAGE-NAME VERSION' +PACKAGE_BUGREPORT='BUG-REPORT-ADDRESS' +PACKAGE_URL='' + +ac_unique_file="src/pycrypto_compat.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +EGREP +GREP +CPP +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +with_gmp +with_mpir +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures FULL-PACKAGE-NAME VERSION to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root + [DATAROOTDIR/doc/full-package-name] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of FULL-PACKAGE-NAME VERSION:";; + esac + cat <<\_ACEOF + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --without-gmp Build without gmp library (default: test) + --without-mpir Build without mpir library (default: test) + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +FULL-PACKAGE-NAME configure VERSION +generated by GNU Autoconf 2.68 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_decl + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## --------------------------------- ## +## Report this to BUG-REPORT-ADDRESS ## +## --------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_find_intX_t LINENO BITS VAR +# ----------------------------------- +# Finds a signed integer type with width BITS, setting cache variable VAR +# accordingly. +ac_fn_c_find_intX_t () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 +$as_echo_n "checking for int$2_t... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + # Order is important - never check a type that is potentially smaller + # than half of the expected target width. + for ac_type in int$2_t 'int' 'long int' \ + 'long long int' 'short int' 'signed char'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default + enum { N = $2 / 2 - 1 }; +int +main () +{ +static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default + enum { N = $2 / 2 - 1 }; +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) + < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + case $ac_type in #( + int$2_t) : + eval "$3=yes" ;; #( + *) : + eval "$3=\$ac_type" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no"; then : + +else + break +fi + done +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_find_intX_t + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_find_uintX_t LINENO BITS VAR +# ------------------------------------ +# Finds an unsigned integer type with width BITS, setting cache variable VAR +# accordingly. +ac_fn_c_find_uintX_t () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 +$as_echo_n "checking for uint$2_t... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + # Order is important - never check a type that is potentially smaller + # than half of the expected target width. + for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + case $ac_type in #( + uint$2_t) : + eval "$3=yes" ;; #( + *) : + eval "$3=\$ac_type" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no"; then : + +else + break +fi + done +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_find_uintX_t + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by FULL-PACKAGE-NAME $as_me VERSION, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_config_headers="$ac_config_headers src/config.h" + + +# Checks for programs. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Checks for libraries. + +# Check whether --with-gmp was given. +if test "${with_gmp+set}" = set; then : + withval=$with_gmp; +fi + + +if test "x$with_gmp" != "xno"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init in -lgmp" >&5 +$as_echo_n "checking for __gmpz_init in -lgmp... " >&6; } +if ${ac_cv_lib_gmp___gmpz_init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgmp $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char __gmpz_init (); +int +main () +{ +return __gmpz_init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gmp___gmpz_init=yes +else + ac_cv_lib_gmp___gmpz_init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_init" >&5 +$as_echo "$ac_cv_lib_gmp___gmpz_init" >&6; } +if test "x$ac_cv_lib_gmp___gmpz_init" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBGMP 1 +_ACEOF + + LIBS="-lgmp $LIBS" + +fi + + +fi + + +# Check whether --with-mpir was given. +if test "${with_mpir+set}" = set; then : + withval=$with_mpir; +fi + +if test "x$with_mpir" != "xno"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init in -lmpir" >&5 +$as_echo_n "checking for __gmpz_init in -lmpir... " >&6; } +if ${ac_cv_lib_mpir___gmpz_init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmpir $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char __gmpz_init (); +int +main () +{ +return __gmpz_init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_mpir___gmpz_init=yes +else + ac_cv_lib_mpir___gmpz_init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpir___gmpz_init" >&5 +$as_echo "$ac_cv_lib_mpir___gmpz_init" >&6; } +if test "x$ac_cv_lib_mpir___gmpz_init" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBMPIR 1 +_ACEOF + + LIBS="-lmpir $LIBS" + +fi + + +fi + +ac_fn_c_check_decl "$LINENO" "mpz_powm" "ac_cv_have_decl_mpz_powm" " +#if HAVE_LIBGMP +# include +#elif HAVE_LIBMPIR +# include +#endif + +" +if test "x$ac_cv_have_decl_mpz_powm" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_MPZ_POWM $ac_have_decl +_ACEOF + +ac_fn_c_check_decl "$LINENO" "mpz_powm_sec" "ac_cv_have_decl_mpz_powm_sec" " +#if HAVE_LIBGMP +# include +#elif HAVE_LIBMPIR +# include +#endif + +" +if test "x$ac_cv_have_decl_mpz_powm_sec" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_MPZ_POWM_SEC $ac_have_decl +_ACEOF + + +# Checks for header files. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in inttypes.h limits.h stddef.h stdint.h stdlib.h string.h wchar.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# Checks for typedefs, structures, and compiler characteristics. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +ac_fn_c_find_intX_t "$LINENO" "16" "ac_cv_c_int16_t" +case $ac_cv_c_int16_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int16_t $ac_cv_c_int16_t +_ACEOF +;; +esac + +ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t" +case $ac_cv_c_int32_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int32_t $ac_cv_c_int32_t +_ACEOF +;; +esac + +ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t" +case $ac_cv_c_int64_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int64_t $ac_cv_c_int64_t +_ACEOF +;; +esac + +ac_fn_c_find_intX_t "$LINENO" "8" "ac_cv_c_int8_t" +case $ac_cv_c_int8_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int8_t $ac_cv_c_int8_t +_ACEOF +;; +esac + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t" +case $ac_cv_c_uint16_t in #( + no|yes) ;; #( + *) + + +cat >>confdefs.h <<_ACEOF +#define uint16_t $ac_cv_c_uint16_t +_ACEOF +;; + esac + +ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" +case $ac_cv_c_uint32_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT32_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint32_t $ac_cv_c_uint32_t +_ACEOF +;; + esac + +ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" +case $ac_cv_c_uint64_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT64_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint64_t $ac_cv_c_uint64_t +_ACEOF +;; + esac + +ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t" +case $ac_cv_c_uint8_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT8_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint8_t $ac_cv_c_uint8_t +_ACEOF +;; + esac + + +# Checks for library functions. +for ac_header in stdlib.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" +if test "x$ac_cv_header_stdlib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STDLIB_H 1 +_ACEOF + +fi + +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 +$as_echo_n "checking for GNU libc compatible malloc... " >&6; } +if ${ac_cv_func_malloc_0_nonnull+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_malloc_0_nonnull=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined STDC_HEADERS || defined HAVE_STDLIB_H +# include +#else +char *malloc (); +#endif + +int +main () +{ +return ! malloc (0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_malloc_0_nonnull=yes +else + ac_cv_func_malloc_0_nonnull=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 +$as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } +if test $ac_cv_func_malloc_0_nonnull = yes; then : + +$as_echo "#define HAVE_MALLOC 1" >>confdefs.h + +else + $as_echo "#define HAVE_MALLOC 0" >>confdefs.h + + case " $LIBOBJS " in + *" malloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS malloc.$ac_objext" + ;; +esac + + +$as_echo "#define malloc rpl_malloc" >>confdefs.h + +fi + + +for ac_func in memmove memset +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by FULL-PACKAGE-NAME $as_me VERSION, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_headers="$ac_config_headers" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration headers: +$config_headers + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +FULL-PACKAGE-NAME config.status VERSION +configured by $0, generated by GNU Autoconf 2.68, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :H $CONFIG_HEADERS " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi + ;; + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/Cryptography/pycrypto-2.6.1/configure.ac b/Cryptography/pycrypto-2.6.1/configure.ac new file mode 100644 index 0000000..b45655d --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/configure.ac @@ -0,0 +1,57 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.67]) +AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) +AC_CONFIG_SRCDIR([src/pycrypto_compat.h]) +AC_CONFIG_HEADERS([src/config.h]) + +# Checks for programs. +AC_PROG_CC + +# Checks for libraries. +AC_ARG_WITH([gmp], AS_HELP_STRING([--without-gmp], [Build without gmp library (default: test)])) +AS_IF([test "x$with_gmp" != "xno"], [ + AC_CHECK_LIB([gmp], [__gmpz_init]) +]) + +AC_ARG_WITH([mpir], AS_HELP_STRING([--without-mpir], [Build without mpir library (default: test)])) +AS_IF([test "x$with_mpir" != "xno"], [ + AC_CHECK_LIB([mpir], [__gmpz_init]) +]) + +AC_CHECK_DECLS([mpz_powm], [], [], [ +[#if HAVE_LIBGMP +# include +#elif HAVE_LIBMPIR +# include +#endif +]]) +AC_CHECK_DECLS([mpz_powm_sec], [], [], [ +[#if HAVE_LIBGMP +# include +#elif HAVE_LIBMPIR +# include +#endif +]]) + +# Checks for header files. +AC_CHECK_HEADERS([inttypes.h limits.h stddef.h stdint.h stdlib.h string.h wchar.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_INLINE +AC_TYPE_INT16_T +AC_TYPE_INT32_T +AC_TYPE_INT64_T +AC_TYPE_INT8_T +AC_TYPE_SIZE_T +AC_TYPE_UINT16_T +AC_TYPE_UINT32_T +AC_TYPE_UINT64_T +AC_TYPE_UINT8_T + +# Checks for library functions. +AC_FUNC_MALLOC +AC_CHECK_FUNCS([memmove memset]) + +AC_OUTPUT diff --git a/Cryptography/pycrypto-2.6.1/pct-speedtest.py b/Cryptography/pycrypto-2.6.1/pct-speedtest.py new file mode 100644 index 0000000..daed105 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/pct-speedtest.py @@ -0,0 +1,221 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# pct-speedtest.py: Speed test for the Python Cryptography Toolkit +# +# Written in 2009 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +import time +import os +import sys + +from Crypto.PublicKey import RSA +from Crypto.Cipher import AES, ARC2, ARC4, Blowfish, CAST, DES3, DES, XOR +from Crypto.Hash import MD2, MD4, MD5, SHA256, SHA +try: + from Crypto.Hash import RIPEMD +except ImportError: # Some builds of PyCrypto don't have the RIPEMD module + RIPEMD = None + +class Benchmark: + + def __init__(self): + self.__random_data = None + + def random_keys(self, bytes): + """Return random keys of the specified number of bytes. + + If this function has been called before with the same number of bytes, + cached keys are used instead of randomly generating new ones. + """ + return self.random_blocks(bytes, 10**5) # 100k + + def random_blocks(self, bytes_per_block, blocks): + bytes = bytes_per_block * blocks + data = self.random_data(bytes) + retval = [] + for i in xrange(blocks): + p = i * bytes_per_block + retval.append(data[p:p+bytes_per_block]) + return retval + + def random_data(self, bytes): + if self.__random_data is None: + self.__random_data = self._random_bytes(bytes) + return self.__random_data + elif bytes == len(self.__random_data): + return self.__random_data + elif bytes < len(self.__random_data): + return self.__random_data[:bytes] + else: + self.__random_data += self._random_bytes(bytes - len(self.__random_data)) + return self.__random_data + + def _random_bytes(self, b): + return os.urandom(b) + + def announce_start(self, test_name): + sys.stdout.write("%s: " % (test_name,)) + sys.stdout.flush() + + def announce_result(self, value, units): + sys.stdout.write("%.2f %s\n" % (value, units)) + sys.stdout.flush() + + def test_pubkey_setup(self, pubkey_name, module, key_bytes): + self.announce_start("%s pubkey setup" % (pubkey_name,)) + keys = self.random_keys(key_bytes)[:5] + + t0 = time.time() + for k in keys: + module.generate(key_bytes*8) + t = time.time() + pubkey_setups_per_second = len(keys) / (t - t0) + self.announce_result(pubkey_setups_per_second, "Keys/sec") + + def test_key_setup(self, cipher_name, module, key_bytes, mode): + self.announce_start("%s key setup" % (cipher_name,)) + + # Generate random keys for use with the tests + keys = self.random_keys(key_bytes) + + # Perform key setups + if mode is None: + t0 = time.time() + for k in keys: + module.new(k) + t = time.time() + else: + t0 = time.time() + for k in keys: + module.new(k, module.MODE_ECB) + t = time.time() + + key_setups_per_second = len(keys) / (t - t0) + self.announce_result(key_setups_per_second/1000, "kKeys/sec") + + def test_encryption(self, cipher_name, module, key_bytes, mode): + self.announce_start("%s encryption" % (cipher_name,)) + + # Generate random keys for use with the tests + rand = self.random_data(key_bytes + module.block_size) + key, iv = rand[:key_bytes], rand[key_bytes:] + blocks = self.random_blocks(16384, 1000) + if mode is None: + cipher = module.new(key) + else: + cipher = module.new(key, mode, iv) + + # Perform encryption + t0 = time.time() + for b in blocks: + cipher.encrypt(b) + t = time.time() + + encryption_speed = (len(blocks) * len(blocks[0])) / (t - t0) + self.announce_result(encryption_speed / 10**6, "MBps") + + def test_hash_small(self, hash_name, module): + self.announce_start("%s (%d-byte inputs)" % (hash_name, module.digest_size)) + + blocks = self.random_blocks(module.digest_size, 10000) + + # Initialize hashes + t0 = time.time() + for b in blocks: + module.new(b).digest() + t = time.time() + + hashes_per_second = len(blocks) / (t - t0) + self.announce_result(hashes_per_second / 1000, "kHashes/sec") + + def test_hash_large(self, hash_name, module): + self.announce_start("%s (single large input)" % (hash_name,)) + + blocks = self.random_blocks(16384, 10000) + + # Perform hashing + t0 = time.time() + h = module.new() + for b in blocks: + h.update(b) + h.digest() + t = time.time() + + hash_speed = len(blocks) * len(blocks[0]) / (t - t0) + self.announce_result(hash_speed / 10**6, "MBps") + + def run(self): + pubkey_specs = [ + ("RSA(1024)", RSA, 1024/8), + ("RSA(2048)", RSA, 2048/8), + ("RSA(4096)", RSA, 4096/8), + ] + block_specs = [ + ("DES", DES, 8), + ("DES3", DES3, 24), + ("AES128", AES, 16), + ("AES192", AES, 24), + ("AES256", AES, 32), + ("Blowfish(256)", Blowfish, 32), + ("CAST(40)", CAST, 5), + ("CAST(80)", CAST, 10), + ("CAST(128)", CAST, 16), + ] + stream_specs = [ + ("ARC2(128)", ARC2, 16), + ("ARC4(128)", ARC4, 16), + ("XOR(24)", XOR, 3), + ("XOR(256)", XOR, 32), + ] + hash_specs = [ + ("MD2", MD2), + ("MD4", MD4), + ("MD5", MD5), + ("SHA", SHA), + ("SHA256", SHA256), + ] + if RIPEMD is not None: + hash_specs += [("RIPEMD", RIPEMD)] + + for pubkey_name, module, key_bytes in pubkey_specs: + self.test_pubkey_setup(pubkey_name, module, key_bytes) + + for cipher_name, module, key_bytes in block_specs: + self.test_key_setup(cipher_name, module, key_bytes, module.MODE_CBC) + self.test_encryption("%s-CBC" % (cipher_name,), module, key_bytes, module.MODE_CBC) + self.test_encryption("%s-CFB-8" % (cipher_name,), module, key_bytes, module.MODE_CFB) + self.test_encryption("%s-OFB" % (cipher_name,), module, key_bytes, module.MODE_OFB) + self.test_encryption("%s-ECB" % (cipher_name,), module, key_bytes, module.MODE_ECB) + self.test_encryption("%s-OPENPGP" % (cipher_name,), module, key_bytes, module.MODE_OPENPGP) + + for cipher_name, module, key_bytes in stream_specs: + self.test_key_setup(cipher_name, module, key_bytes, None) + self.test_encryption(cipher_name, module, key_bytes, None) + + for hash_name, module in hash_specs: + self.test_hash_small(hash_name, module) + self.test_hash_large(hash_name, module) + +if __name__ == '__main__': + Benchmark().run() + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/Cryptography/pycrypto-2.6.1/setup.py b/Cryptography/pycrypto-2.6.1/setup.py new file mode 100644 index 0000000..2dca4fb --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/setup.py @@ -0,0 +1,473 @@ +#! /usr/bin/env python +# +# setup.py : Distutils setup script +# +# Part of the Python Cryptography Toolkit +# +# =================================================================== +# Portions Copyright (c) 2001, 2002, 2003 Python Software Foundation; +# All Rights Reserved +# +# This file contains code from the Python 2.2 setup.py module (the +# "Original Code"), with modifications made after it was incorporated +# into PyCrypto (the "Modifications"). +# +# To the best of our knowledge, the Python Software Foundation is the +# copyright holder of the Original Code, and has licensed it under the +# Python 2.2 license. See the file LEGAL/copy/LICENSE.python-2.2 for +# details. +# +# The Modifications to this file are dedicated to the public domain. +# To the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. No rights are +# reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +__revision__ = "$Id$" + +from distutils import core +from distutils.ccompiler import new_compiler +from distutils.core import Extension, Command +from distutils.command.build import build +from distutils.command.build_ext import build_ext +import os, sys, re +import struct + +if sys.version[0:1] == '1': + raise RuntimeError ("The Python Cryptography Toolkit requires " + "Python 2.x or 3.x to build.") + +if sys.platform == 'win32': + HTONS_LIBS = ['ws2_32'] + plat_ext = [ + Extension("Crypto.Random.OSRNG.winrandom", + libraries = HTONS_LIBS + ['advapi32'], + include_dirs=['src/'], + sources=["src/winrand.c"]) + ] +else: + HTONS_LIBS = [] + plat_ext = [] + +# For test development: Set this to 1 to build with gcov support. +# Use "gcov -p -o build/temp.*/src build/temp.*/src/*.gcda" to build the +# .gcov files +USE_GCOV = 0 + + +try: + # Python 3 + from distutils.command.build_py import build_py_2to3 as build_py +except ImportError: + # Python 2 + from distutils.command.build_py import build_py + +# List of pure Python modules that will be excluded from the binary packages. +# The list consists of (package, module_name) tuples +if sys.version_info[0] == 2: + EXCLUDE_PY = [] +else: + EXCLUDE_PY = [ + # We don't want Py3k to choke on the 2.x compat code + ('Crypto.Util', 'py21compat'), + ] + if sys.platform != "win32": # Avoid nt.py, as 2to3 can't fix it w/o winrandom + EXCLUDE_PY += [('Crypto.Random.OSRNG','nt')] + +# Work around the print / print() issue with Python 2.x and 3.x. We only need +# to print at one point of the code, which makes this easy + +def PrintErr(*args, **kwd): + fout = kwd.get("file", sys.stderr) + w = fout.write + if args: + w(str(args[0])) + sep = kwd.get("sep", " ") + for a in args[1:]: + w(sep) + w(str(a)) + w(kwd.get("end", "\n")) + +def endianness_macro(): + s = struct.pack("@I", 0x33221100) + if s == "\x00\x11\x22\x33".encode(): # little endian + return ('PCT_LITTLE_ENDIAN', 1) + elif s == "\x33\x22\x11\x00".encode(): # big endian + return ('PCT_BIG_ENDIAN', 1) + raise AssertionError("Machine is neither little-endian nor big-endian") + +class PCTBuildExt (build_ext): + def build_extensions(self): + # Detect which modules should be compiled + self.detect_modules() + + # Tweak compiler options + if self.compiler.compiler_type in ('unix', 'cygwin', 'mingw32'): + # Tell GCC to compile using the C99 standard. + self.__add_compiler_option("-std=c99") + + # ... but don't tell that to the aCC compiler on HP-UX + if self.compiler.compiler_so[0] == 'cc' and sys.platform.startswith('hp-ux'): + self.__remove_compiler_option("-std=c99") + + # Make assert() statements always work + self.__remove_compiler_option("-DNDEBUG") + + # Choose our own optimization options + for opt in ["-O", "-O0", "-O1", "-O2", "-O3", "-Os"]: + self.__remove_compiler_option(opt) + if self.debug: + # Basic optimization is still needed when debugging to compile + # the libtomcrypt code. + self.__add_compiler_option("-O") + else: + # Speed up execution by tweaking compiler options. This + # especially helps the DES modules. + self.__add_compiler_option("-O3") + self.__add_compiler_option("-fomit-frame-pointer") + # Don't include debug symbols unless debugging + self.__remove_compiler_option("-g") + # Don't include profiling information (incompatible with + # -fomit-frame-pointer) + self.__remove_compiler_option("-pg") + if USE_GCOV: + self.__add_compiler_option("-fprofile-arcs") + self.__add_compiler_option("-ftest-coverage") + self.compiler.libraries += ['gcov'] + + # Call the superclass's build_extensions method + build_ext.build_extensions(self) + + def detect_modules (self): + # Read the config.h file (usually generated by autoconf) + if self.compiler.compiler_type == 'msvc': + # Add special include directory for MSVC (because MSVC is special) + self.compiler.include_dirs.insert(0, "src/inc-msvc/") + ac = self.__read_autoconf("src/inc-msvc/config.h") + else: + ac = self.__read_autoconf("src/config.h") + + # Detect libgmp or libmpir and don't build _fastmath if both are missing. + if ac.get("HAVE_LIBGMP"): + # Default; no changes needed + pass + elif ac.get("HAVE_LIBMPIR"): + # Change library to libmpir if libgmp is missing + self.__change_extension_lib(["Crypto.PublicKey._fastmath"], + ['mpir']) + # And if this is MSVC, we need to add a linker option + # to make a static libmpir link well into a dynamic _fastmath + if self.compiler.compiler_type == 'msvc': + self.__add_extension_link_option(["Crypto.PublicKey._fastmath"], + ["/NODEFAULTLIB:LIBCMT"]) + else: + # No MP library; use _slowmath. + PrintErr ("warning: GMP or MPIR library not found; Not building "+ + "Crypto.PublicKey._fastmath.") + self.__remove_extensions(["Crypto.PublicKey._fastmath"]) + + def __add_extension_link_option(self, names, options): + """Add linker options for the specified extension(s)""" + i = 0 + while i < len(self.extensions): + if self.extensions[i].name in names: + self.extensions[i].extra_link_args = options + i += 1 + + def __change_extension_lib(self, names, libs): + """Change the libraries to be used for the specified extension(s)""" + i = 0 + while i < len(self.extensions): + if self.extensions[i].name in names: + self.extensions[i].libraries = libs + i += 1 + + def __remove_extensions(self, names): + """Remove the specified extension(s) from the list of extensions + to build""" + i = 0 + while i < len(self.extensions): + if self.extensions[i].name in names: + del self.extensions[i] + continue + i += 1 + + def __remove_compiler_option(self, option): + """Remove the specified compiler option. + + Return true if the option was found. Return false otherwise. + """ + found = 0 + for attrname in ('compiler', 'compiler_so'): + compiler = getattr(self.compiler, attrname, None) + if compiler is not None: + while option in compiler: + compiler.remove(option) + found += 1 + return found + + def __add_compiler_option(self, option): + for attrname in ('compiler', 'compiler_so'): + compiler = getattr(self.compiler, attrname, None) + if compiler is not None: + compiler.append(option) + + def __read_autoconf(self, filename): + rx_define = re.compile(r"""^#define (\S+) (?:(\d+)|(".*"))$""") + + result = {} + f = open(filename, "r") + try: + config_lines = f.read().replace("\r\n", "\n").split("\n") + for line in config_lines: + m = rx_define.search(line) + if not m: continue + sym = m.group(1) + n = m.group(2) + s = m.group(3) + if n: + result[sym] = int(n) + elif s: + result[sym] = eval(s) # XXX - hack to unescape C-style string + else: + continue + finally: + f.close() + return result + + def run(self): + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + build_ext.run(self) + + def has_configure(self): + compiler = new_compiler(compiler=self.compiler) + return compiler.compiler_type != 'msvc' + + sub_commands = [ ('build_configure', has_configure) ] + build_ext.sub_commands + +class PCTBuildConfigure(Command): + description = "Generate config.h using ./configure (autoconf)" + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + if not os.path.exists("config.status"): + if os.system("chmod 0755 configure") != 0: + raise RuntimeError("chmod error") + cmd = "sh configure" # we use "sh" here so that it'll work on mingw32 with standard python.org binaries + if self.verbose < 1: + cmd += " -q" + if os.system(cmd) != 0: + raise RuntimeError("autoconf error") + +class PCTBuildPy(build_py): + def find_package_modules(self, package, package_dir, *args, **kwargs): + modules = build_py.find_package_modules(self, package, package_dir, + *args, **kwargs) + + # Exclude certain modules + retval = [] + for item in modules: + pkg, module = item[:2] + if (pkg, module) in EXCLUDE_PY: + continue + retval.append(item) + return retval + + +class TestCommand(Command): + + description = "Run self-test" + + # Long option name, short option name, description + user_options = [ + ('skip-slow-tests', None, + 'Skip slow tests'), + ('module=', 'm', 'Test a single module (e.g. Cipher, PublicKey)') + ] + + def initialize_options(self): + self.build_dir = None + self.skip_slow_tests = None + self.module = None + + def finalize_options(self): + self.set_undefined_options('install', ('build_lib', 'build_dir')) + self.config = {'slow_tests': not self.skip_slow_tests} + + def run(self): + # Run SelfTest + self.announce("running self-tests") + old_path = sys.path[:] + try: + sys.path.insert(0, self.build_dir) + from Crypto import SelfTest + moduleObj = None + if self.module: + if self.module.count('.')==0: + # Test a whole a sub-package + full_module = "Crypto.SelfTest." + self.module + module_name = self.module + else: + # Test only a module + # Assume only one dot is present + comps = self.module.split('.') + module_name = "test_" + comps[1] + full_module = "Crypto.SelfTest." + comps[0] + "." + module_name + # Import sub-package or module + moduleObj = __import__( full_module, globals(), locals(), module_name ) + SelfTest.run(module=moduleObj, verbosity=self.verbose, stream=sys.stdout, config=self.config) + finally: + # Restore sys.path + sys.path[:] = old_path + + # Run slower self-tests + self.announce("running extended self-tests") + +kw = {'name':"pycrypto", + 'version':"2.6.1", # See also: lib/Crypto/__init__.py + 'description':"Cryptographic modules for Python.", + 'author':"Dwayne C. Litzenberger", + 'author_email':"dlitz@dlitz.net", + 'url':"http://www.pycrypto.org/", + + 'cmdclass' : {'build_configure': PCTBuildConfigure, 'build_ext': PCTBuildExt, 'build_py': PCTBuildPy, 'test': TestCommand }, + 'packages' : ["Crypto", "Crypto.Hash", "Crypto.Cipher", "Crypto.Util", + "Crypto.Random", + "Crypto.Random.Fortuna", + "Crypto.Random.OSRNG", + "Crypto.SelfTest", + "Crypto.SelfTest.Cipher", + "Crypto.SelfTest.Hash", + "Crypto.SelfTest.Protocol", + "Crypto.SelfTest.PublicKey", + "Crypto.SelfTest.Random", + "Crypto.SelfTest.Random.Fortuna", + "Crypto.SelfTest.Random.OSRNG", + "Crypto.SelfTest.Util", + "Crypto.SelfTest.Signature", + "Crypto.Protocol", + "Crypto.PublicKey", + "Crypto.Signature"], + 'package_dir' : { "Crypto": "lib/Crypto" }, + 'ext_modules': plat_ext + [ + # _fastmath (uses GNU mp library) + Extension("Crypto.PublicKey._fastmath", + include_dirs=['src/','/usr/include/'], + libraries=['gmp'], + sources=["src/_fastmath.c"]), + + # Hash functions + Extension("Crypto.Hash._MD2", + include_dirs=['src/'], + sources=["src/MD2.c"]), + Extension("Crypto.Hash._MD4", + include_dirs=['src/'], + sources=["src/MD4.c"]), + Extension("Crypto.Hash._SHA256", + include_dirs=['src/'], + sources=["src/SHA256.c"]), + Extension("Crypto.Hash._SHA224", + include_dirs=['src/'], + sources=["src/SHA224.c"]), + Extension("Crypto.Hash._SHA384", + include_dirs=['src/'], + sources=["src/SHA384.c"]), + Extension("Crypto.Hash._SHA512", + include_dirs=['src/'], + sources=["src/SHA512.c"]), + Extension("Crypto.Hash._RIPEMD160", + include_dirs=['src/'], + sources=["src/RIPEMD160.c"], + define_macros=[endianness_macro()]), + + # Block encryption algorithms + Extension("Crypto.Cipher._AES", + include_dirs=['src/'], + sources=["src/AES.c"]), + Extension("Crypto.Cipher._ARC2", + include_dirs=['src/'], + sources=["src/ARC2.c"]), + Extension("Crypto.Cipher._Blowfish", + include_dirs=['src/'], + sources=["src/Blowfish.c"]), + Extension("Crypto.Cipher._CAST", + include_dirs=['src/'], + sources=["src/CAST.c"]), + Extension("Crypto.Cipher._DES", + include_dirs=['src/', 'src/libtom/'], + sources=["src/DES.c"]), + Extension("Crypto.Cipher._DES3", + include_dirs=['src/', 'src/libtom/'], + sources=["src/DES3.c"]), + + # Stream ciphers + Extension("Crypto.Cipher._ARC4", + include_dirs=['src/'], + sources=["src/ARC4.c"]), + Extension("Crypto.Cipher._XOR", + include_dirs=['src/'], + sources=["src/XOR.c"]), + + # Utility modules + Extension("Crypto.Util.strxor", + include_dirs=['src/'], + sources=['src/strxor.c']), + + # Counter modules + Extension("Crypto.Util._counter", + include_dirs=['src/'], + sources=['src/_counter.c']), + ] +} + +# If we're running Python 2.3, add extra information +if hasattr(core, 'setup_keywords'): + if 'classifiers' in core.setup_keywords: + kw['classifiers'] = [ + 'Development Status :: 5 - Production/Stable', + 'License :: Public Domain', + 'Intended Audience :: Developers', + 'Operating System :: Unix', + 'Operating System :: Microsoft :: Windows', + 'Operating System :: MacOS :: MacOS X', + 'Topic :: Security :: Cryptography', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 3', + ] + +core.setup(**kw) + +def touch(path): + import os, time + now = time.time() + try: + # assume it's there + os.utime(path, (now, now)) + except os.error: + PrintErr("Failed to update timestamp of "+path) + +# PY3K: Workaround for winrandom.pyd not existing during the first pass. +# It needs to be there for 2to3 to fix the import in nt.py +if (sys.platform == 'win32' and sys.version_info[0] == 3 and + 'build' in sys.argv[1:]): + PrintErr("\nSecond pass to allow 2to3 to fix nt.py. No cause for alarm.\n") + touch("./lib/Crypto/Random/OSRNG/nt.py") + core.setup(**kw) diff --git a/Cryptography/pycrypto-2.6.1/src/AES.c b/Cryptography/pycrypto-2.6.1/src/AES.c new file mode 100644 index 0000000..0aeaeda --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/AES.c @@ -0,0 +1,1459 @@ +/** + * rijndael-alg-fst.c + * + * @version 3.0 (December 2000) + * + * Optimised ANSI C code for the Rijndael cipher (now AES) + * + * @author Vincent Rijmen + * @author Antoon Bosselaers + * @author Paulo Barreto + * + * This code is hereby placed in the public domain. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include "Python.h" + +#define MODULE_NAME _AES +#define BLOCK_SIZE 16 +#define KEY_SIZE 0 + +#define MAXKC (256/32) +#define MAXKB (256/8) +#define MAXNR 14 + +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; + +typedef struct { + u32 ek[ 4*(MAXNR+1) ]; + u32 dk[ 4*(MAXNR+1) ]; + int rounds; +} block_state; + +static void rijndaelEncrypt(u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]); +static void rijndaelDecrypt(u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]); + +#ifdef INTERMEDIATE_VALUE_KAT +static void rijndaelEncryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds); +static void rijndaelDecryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds); +#endif /* INTERMEDIATE_VALUE_KAT */ + +/* +Te0[x] = S [x].[02, 01, 01, 03]; +Te1[x] = S [x].[03, 02, 01, 01]; +Te2[x] = S [x].[01, 03, 02, 01]; +Te3[x] = S [x].[01, 01, 03, 02]; +Te4[x] = S [x].[01, 01, 01, 01]; + +Td0[x] = Si[x].[0e, 09, 0d, 0b]; +Td1[x] = Si[x].[0b, 0e, 09, 0d]; +Td2[x] = Si[x].[0d, 0b, 0e, 09]; +Td3[x] = Si[x].[09, 0d, 0b, 0e]; +Td4[x] = Si[x].[01, 01, 01, 01]; +*/ + +static const u32 Te0[256] = { + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, +}; +static const u32 Te1[256] = { + 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, + 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, + 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, + 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, + 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, + 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, + 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, + 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, + 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, + 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, + 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, + 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, + 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, + 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, + 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, + 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, + 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, + 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, + 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, + 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, + 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, + 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, + 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, + 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, + 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, + 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, + 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, + 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, + 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, + 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, + 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, + 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, + 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, + 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, + 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, + 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, + 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, + 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, + 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, + 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, + 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, + 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, + 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, + 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, + 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, + 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, + 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, + 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, + 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, + 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, + 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, + 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, + 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, + 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, + 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, + 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, + 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, + 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, + 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, + 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, + 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, + 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, + 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, + 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, +}; +static const u32 Te2[256] = { + 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, + 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, + 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, + 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, + 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, + 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, + 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, + 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, + 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, + 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, + 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, + 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, + 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, + 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, + 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, + 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, + 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, + 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, + 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, + 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, + 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, + 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, + 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, + 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, + 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, + 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, + 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, + 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, + 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, + 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, + 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, + 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, + 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, + 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, + 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, + 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, + 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, + 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, + 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, + 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, + 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, + 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, + 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, + 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, + 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, + 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, + 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, + 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, + 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, + 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, + 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, + 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, + 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, + 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, + 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, + 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, + 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, + 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, + 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, + 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, + 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, + 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, + 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, + 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, +}; +static const u32 Te3[256] = { + + 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, + 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, + 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, + 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, + 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, + 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, + 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, + 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, + 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, + 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, + 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, + 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, + 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, + 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, + 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, + 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, + 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, + 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, + 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, + 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, + 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, + 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, + 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, + 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, + 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, + 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, + 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, + 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, + 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, + 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, + 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, + 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, + 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, + 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, + 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, + 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, + 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, + 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, + 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, + 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, + 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, + 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, + 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, + 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, + 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, + 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, + 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, + 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, + 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, + 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, + 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, + 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, + 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, + 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, + 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, + 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, + 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, + 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, + 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, + 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, + 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, + 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, + 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, + 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, +}; +static const u32 Te4[256] = { + 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, + 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, + 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, + 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, + 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, + 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, + 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, + 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, + 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, + 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, + 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, + 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, + 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, + 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, + 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, + 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, + 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, + 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, + 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, + 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, + 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, + 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, + 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, + 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, + 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, + 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, + 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, + 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, + 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, + 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, + 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, + 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, + 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, + 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, + 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, + 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, + 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, + 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, + 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, + 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, + 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, + 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, + 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, + 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, + 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, + 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, + 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, + 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, + 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, + 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, + 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, + 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, + 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, + 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, + 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, + 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, + 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, + 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, + 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, + 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, + 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, + 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, + 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, + 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, +}; +static const u32 Td0[256] = { + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, +}; +static const u32 Td1[256] = { + 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, + 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, + 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, + 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, + 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, + 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, + 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, + 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, + 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, + 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, + 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, + 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, + 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, + 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, + 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, + 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, + 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, + 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, + 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, + 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, + 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, + 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, + 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, + 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, + 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, + 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, + 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, + 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, + 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, + 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, + 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, + 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, + 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, + 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, + 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, + 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, + 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, + 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, + 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, + 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, + 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, + 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, + 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, + 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, + 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, + 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, + 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, + 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, + 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, + 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, + 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, + 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, + 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, + 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, + 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, + 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, + 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, + 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, + 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, + 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, + 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, + 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, + 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, + 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, +}; +static const u32 Td2[256] = { + 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, + 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, + 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, + 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, + 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, + 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, + 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, + 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, + 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, + 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, + 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, + 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, + 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, + 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, + 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, + 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, + 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, + 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, + 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, + 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, + + 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, + 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, + 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, + 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, + 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, + 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, + 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, + 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, + 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, + 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, + 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, + 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, + 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, + 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, + 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, + 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, + 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, + 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, + 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, + 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, + 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, + 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, + 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, + 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, + 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, + 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, + 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, + 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, + 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, + 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, + 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, + 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, + 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, + 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, + 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, + 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, + 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, + 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, + 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, + 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, + 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, + 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, + 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, + 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, +}; +static const u32 Td3[256] = { + 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, + 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, + 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, + 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, + 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, + 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, + 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, + 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, + 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, + 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, + 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, + 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, + 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, + 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, + 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, + 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, + 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, + 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, + 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, + 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, + 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, + 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, + 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, + 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, + 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, + 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, + 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, + 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, + 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, + 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, + 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, + 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, + 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, + 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, + 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, + 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, + 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, + 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, + 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, + 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, + 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, + 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, + 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, + 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, + 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, + 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, + 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, + 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, + 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, + 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, + 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, + 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, + 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, + 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, + 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, + 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, + 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, + 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, + 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, + 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, + 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, + 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, + 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, + 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, +}; +static const u32 Td4[256] = { + 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, + 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U, + 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU, + 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU, + 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, + 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, + 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U, + 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU, + 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U, + 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, + 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, + 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, + 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U, + 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U, + 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, + 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, + 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, + 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U, + 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU, + 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, + 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, + 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, + 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U, + 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U, + 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, + 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, + 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U, + 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U, + 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU, + 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, + 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, + 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, + 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U, + 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU, + 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, + 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, + 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U, + 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U, + 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U, + 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, + 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, + 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U, + 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU, + 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU, + 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, + 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, + 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, + 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U, + 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U, + 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, + 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, + 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU, + 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U, + 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU, + 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, + 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, + 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, + 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U, + 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU, + 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, + 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, + 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U, + 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U, + 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU, +}; +static const u32 rcon[] = { + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ +}; + +#define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00) + +#ifdef _MSC_VER +#define GETU32(p) SWAP(*((u32 *)(p))) +#define PUTU32(ct, st) { *((u32 *)(ct)) = SWAP((st)); } +#else +#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) +#define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } +#endif + +/** + * Expand the cipher key into the encryption key schedule. + * + * @return the number of rounds for the given cipher key size. + */ + +static int rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) { + int i = 0; + u32 temp; + + rk[0] = GETU32(cipherKey ); + rk[1] = GETU32(cipherKey + 4); + rk[2] = GETU32(cipherKey + 8); + rk[3] = GETU32(cipherKey + 12); + if (keyBits == 128) { + for (;;) { + temp = rk[3]; + rk[4] = rk[0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[5] = rk[1] ^ rk[4]; + rk[6] = rk[2] ^ rk[5]; + rk[7] = rk[3] ^ rk[6]; + if (++i == 10) { + return 10; + } + rk += 4; + } + } + rk[4] = GETU32(cipherKey + 16); + rk[5] = GETU32(cipherKey + 20); + if (keyBits == 192) { + for (;;) { + temp = rk[ 5]; + rk[ 6] = rk[ 0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[ 7] = rk[ 1] ^ rk[ 6]; + rk[ 8] = rk[ 2] ^ rk[ 7]; + rk[ 9] = rk[ 3] ^ rk[ 8]; + if (++i == 8) { + return 12; + } + rk[10] = rk[ 4] ^ rk[ 9]; + rk[11] = rk[ 5] ^ rk[10]; + rk += 6; + } + } + rk[6] = GETU32(cipherKey + 24); + rk[7] = GETU32(cipherKey + 28); + if (keyBits == 256) { + for (;;) { + temp = rk[ 7]; + rk[ 8] = rk[ 0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[ 9] = rk[ 1] ^ rk[ 8]; + rk[10] = rk[ 2] ^ rk[ 9]; + rk[11] = rk[ 3] ^ rk[10]; + if (++i == 7) { + return 14; + } + temp = rk[11]; + rk[12] = rk[ 4] ^ + (Te4[(temp >> 24) ] & 0xff000000) ^ + (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(temp ) & 0xff] & 0x000000ff); + rk[13] = rk[ 5] ^ rk[12]; + rk[14] = rk[ 6] ^ rk[13]; + rk[15] = rk[ 7] ^ rk[14]; + + rk += 8; + } + } + return 0; +} + +/** + * Expand the cipher key into the decryption key schedule. + * + * @return the number of rounds for the given cipher key size. + */ +static int rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) { + int Nr, i, j; + u32 temp; + + /* expand the cipher key: */ + Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits); + /* invert the order of the round keys: */ + for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) { + temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; + temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; + temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; + temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; + } + /* apply the inverse MixColumn transform to all round keys but the first and the last: */ + for (i = 1; i < Nr; i++) { + rk += 4; + rk[0] = + Td0[Te4[(rk[0] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[0] ) & 0xff] & 0xff]; + rk[1] = + Td0[Te4[(rk[1] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[1] ) & 0xff] & 0xff]; + rk[2] = + Td0[Te4[(rk[2] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[2] ) & 0xff] & 0xff]; + rk[3] = + Td0[Te4[(rk[3] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[3] ) & 0xff] & 0xff]; + } + return Nr; +} + +static void rijndaelEncrypt(u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]) { + u32 s0, s1, s2, s3, t0, t1, t2, t3; +#ifndef FULL_UNROLL + int r; +#endif /* ?FULL_UNROLL */ + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(pt ) ^ rk[0]; + s1 = GETU32(pt + 4) ^ rk[1]; + s2 = GETU32(pt + 8) ^ rk[2]; + s3 = GETU32(pt + 12) ^ rk[3]; +#ifdef FULL_UNROLL + /* round 1: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; + /* round 2: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; + /* round 3: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; + /* round 4: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; + /* round 5: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; + /* round 6: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; + /* round 7: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; + /* round 8: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; + /* round 9: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; + if (Nr > 10) { + /* round 10: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; + /* round 11: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; + if (Nr > 12) { + /* round 12: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; + /* round 13: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; + } + } + rk += Nr << 2; +#else /* !FULL_UNROLL */ + /* + * Nr - 1 full rounds: + */ + r = Nr >> 1; + for (;;) { + t0 = + Te0[(s0 >> 24) ] ^ + Te1[(s1 >> 16) & 0xff] ^ + Te2[(s2 >> 8) & 0xff] ^ + Te3[(s3 ) & 0xff] ^ + rk[4]; + t1 = + Te0[(s1 >> 24) ] ^ + Te1[(s2 >> 16) & 0xff] ^ + Te2[(s3 >> 8) & 0xff] ^ + Te3[(s0 ) & 0xff] ^ + rk[5]; + t2 = + Te0[(s2 >> 24) ] ^ + Te1[(s3 >> 16) & 0xff] ^ + Te2[(s0 >> 8) & 0xff] ^ + Te3[(s1 ) & 0xff] ^ + rk[6]; + t3 = + Te0[(s3 >> 24) ] ^ + Te1[(s0 >> 16) & 0xff] ^ + Te2[(s1 >> 8) & 0xff] ^ + Te3[(s2 ) & 0xff] ^ + rk[7]; + + rk += 8; + if (--r == 0) { + break; + } + + s0 = + Te0[(t0 >> 24) ] ^ + Te1[(t1 >> 16) & 0xff] ^ + Te2[(t2 >> 8) & 0xff] ^ + Te3[(t3 ) & 0xff] ^ + rk[0]; + s1 = + Te0[(t1 >> 24) ] ^ + Te1[(t2 >> 16) & 0xff] ^ + Te2[(t3 >> 8) & 0xff] ^ + Te3[(t0 ) & 0xff] ^ + rk[1]; + s2 = + Te0[(t2 >> 24) ] ^ + Te1[(t3 >> 16) & 0xff] ^ + Te2[(t0 >> 8) & 0xff] ^ + Te3[(t1 ) & 0xff] ^ + rk[2]; + s3 = + Te0[(t3 >> 24) ] ^ + Te1[(t0 >> 16) & 0xff] ^ + Te2[(t1 >> 8) & 0xff] ^ + Te3[(t2 ) & 0xff] ^ + rk[3]; + } +#endif /* ?FULL_UNROLL */ + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = + (Te4[(t0 >> 24) ] & 0xff000000) ^ + (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t3 ) & 0xff] & 0x000000ff) ^ + rk[0]; + PUTU32(ct , s0); + s1 = + (Te4[(t1 >> 24) ] & 0xff000000) ^ + (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t0 ) & 0xff] & 0x000000ff) ^ + rk[1]; + PUTU32(ct + 4, s1); + s2 = + (Te4[(t2 >> 24) ] & 0xff000000) ^ + (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t1 ) & 0xff] & 0x000000ff) ^ + rk[2]; + PUTU32(ct + 8, s2); + s3 = + (Te4[(t3 >> 24) ] & 0xff000000) ^ + (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t2 ) & 0xff] & 0x000000ff) ^ + rk[3]; + PUTU32(ct + 12, s3); +} + +static void rijndaelDecrypt(u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]) { + u32 s0, s1, s2, s3, t0, t1, t2, t3; +#ifndef FULL_UNROLL + int r; +#endif /* ?FULL_UNROLL */ + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(ct ) ^ rk[0]; + s1 = GETU32(ct + 4) ^ rk[1]; + s2 = GETU32(ct + 8) ^ rk[2]; + s3 = GETU32(ct + 12) ^ rk[3]; +#ifdef FULL_UNROLL + /* round 1: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7]; + /* round 2: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11]; + /* round 3: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15]; + /* round 4: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19]; + /* round 5: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; + /* round 6: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27]; + /* round 7: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31]; + /* round 8: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35]; + /* round 9: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; + if (Nr > 10) { + /* round 10: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; + /* round 11: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; + if (Nr > 12) { + /* round 12: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; + /* round 13: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; + } + } + rk += Nr << 2; +#else /* !FULL_UNROLL */ + /* + * Nr - 1 full rounds: + */ + r = Nr >> 1; + for (;;) { + t0 = + Td0[(s0 >> 24) ] ^ + Td1[(s3 >> 16) & 0xff] ^ + Td2[(s2 >> 8) & 0xff] ^ + Td3[(s1 ) & 0xff] ^ + rk[4]; + t1 = + Td0[(s1 >> 24) ] ^ + Td1[(s0 >> 16) & 0xff] ^ + Td2[(s3 >> 8) & 0xff] ^ + Td3[(s2 ) & 0xff] ^ + rk[5]; + t2 = + Td0[(s2 >> 24) ] ^ + Td1[(s1 >> 16) & 0xff] ^ + Td2[(s0 >> 8) & 0xff] ^ + Td3[(s3 ) & 0xff] ^ + rk[6]; + t3 = + Td0[(s3 >> 24) ] ^ + Td1[(s2 >> 16) & 0xff] ^ + Td2[(s1 >> 8) & 0xff] ^ + Td3[(s0 ) & 0xff] ^ + rk[7]; + + rk += 8; + if (--r == 0) { + break; + } + + s0 = + Td0[(t0 >> 24) ] ^ + Td1[(t3 >> 16) & 0xff] ^ + Td2[(t2 >> 8) & 0xff] ^ + Td3[(t1 ) & 0xff] ^ + rk[0]; + s1 = + Td0[(t1 >> 24) ] ^ + Td1[(t0 >> 16) & 0xff] ^ + Td2[(t3 >> 8) & 0xff] ^ + Td3[(t2 ) & 0xff] ^ + rk[1]; + s2 = + Td0[(t2 >> 24) ] ^ + Td1[(t1 >> 16) & 0xff] ^ + Td2[(t0 >> 8) & 0xff] ^ + Td3[(t3 ) & 0xff] ^ + rk[2]; + s3 = + Td0[(t3 >> 24) ] ^ + Td1[(t2 >> 16) & 0xff] ^ + Td2[(t1 >> 8) & 0xff] ^ + Td3[(t0 ) & 0xff] ^ + rk[3]; + } +#endif /* ?FULL_UNROLL */ + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = + (Td4[(t0 >> 24) ] & 0xff000000) ^ + (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t1 ) & 0xff] & 0x000000ff) ^ + rk[0]; + PUTU32(pt , s0); + s1 = + (Td4[(t1 >> 24) ] & 0xff000000) ^ + (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t2 ) & 0xff] & 0x000000ff) ^ + rk[1]; + PUTU32(pt + 4, s1); + s2 = + (Td4[(t2 >> 24) ] & 0xff000000) ^ + (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t3 ) & 0xff] & 0x000000ff) ^ + rk[2]; + PUTU32(pt + 8, s2); + s3 = + (Td4[(t3 >> 24) ] & 0xff000000) ^ + (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t0 ) & 0xff] & 0x000000ff) ^ + rk[3]; + PUTU32(pt + 12, s3); +} + +#ifdef INTERMEDIATE_VALUE_KAT + +static void rijndaelEncryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds) { + int r; + u32 s0, s1, s2, s3, t0, t1, t2, t3; + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(block ) ^ rk[0]; + s1 = GETU32(block + 4) ^ rk[1]; + s2 = GETU32(block + 8) ^ rk[2]; + s3 = GETU32(block + 12) ^ rk[3]; + rk += 4; + + /* + * Nr - 1 full rounds: + */ + for (r = (rounds < Nr ? rounds : Nr - 1); r > 0; r--) { + t0 = + Te0[(s0 >> 24) ] ^ + Te1[(s1 >> 16) & 0xff] ^ + Te2[(s2 >> 8) & 0xff] ^ + Te3[(s3 ) & 0xff] ^ + rk[0]; + t1 = + Te0[(s1 >> 24) ] ^ + Te1[(s2 >> 16) & 0xff] ^ + Te2[(s3 >> 8) & 0xff] ^ + Te3[(s0 ) & 0xff] ^ + rk[1]; + t2 = + Te0[(s2 >> 24) ] ^ + Te1[(s3 >> 16) & 0xff] ^ + Te2[(s0 >> 8) & 0xff] ^ + Te3[(s1 ) & 0xff] ^ + rk[2]; + t3 = + Te0[(s3 >> 24) ] ^ + Te1[(s0 >> 16) & 0xff] ^ + Te2[(s1 >> 8) & 0xff] ^ + Te3[(s2 ) & 0xff] ^ + rk[3]; + + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + rk += 4; + + } + + /* + * apply last round and + * map cipher state to byte array block: + */ + if (rounds == Nr) { + t0 = + (Te4[(s0 >> 24) ] & 0xff000000) ^ + (Te4[(s1 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(s2 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(s3 ) & 0xff] & 0x000000ff) ^ + rk[0]; + t1 = + (Te4[(s1 >> 24) ] & 0xff000000) ^ + (Te4[(s2 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(s3 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(s0 ) & 0xff] & 0x000000ff) ^ + rk[1]; + t2 = + (Te4[(s2 >> 24) ] & 0xff000000) ^ + (Te4[(s3 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(s0 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(s1 ) & 0xff] & 0x000000ff) ^ + rk[2]; + t3 = + (Te4[(s3 >> 24) ] & 0xff000000) ^ + (Te4[(s0 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(s1 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(s2 ) & 0xff] & 0x000000ff) ^ + rk[3]; + + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + } + + PUTU32(block , s0); + PUTU32(block + 4, s1); + PUTU32(block + 8, s2); + PUTU32(block + 12, s3); +} + +static void rijndaelDecryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds) { + int r; + u32 s0, s1, s2, s3, t0, t1, t2, t3; + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(block ) ^ rk[0]; + s1 = GETU32(block + 4) ^ rk[1]; + s2 = GETU32(block + 8) ^ rk[2]; + s3 = GETU32(block + 12) ^ rk[3]; + rk += 4; + + /* + * Nr - 1 full rounds: + */ + for (r = (rounds < Nr ? rounds : Nr) - 1; r > 0; r--) { + t0 = + Td0[(s0 >> 24) ] ^ + Td1[(s3 >> 16) & 0xff] ^ + Td2[(s2 >> 8) & 0xff] ^ + Td3[(s1 ) & 0xff] ^ + rk[0]; + t1 = + Td0[(s1 >> 24) ] ^ + Td1[(s0 >> 16) & 0xff] ^ + Td2[(s3 >> 8) & 0xff] ^ + Td3[(s2 ) & 0xff] ^ + rk[1]; + t2 = + Td0[(s2 >> 24) ] ^ + Td1[(s1 >> 16) & 0xff] ^ + Td2[(s0 >> 8) & 0xff] ^ + Td3[(s3 ) & 0xff] ^ + rk[2]; + t3 = + Td0[(s3 >> 24) ] ^ + Td1[(s2 >> 16) & 0xff] ^ + Td2[(s1 >> 8) & 0xff] ^ + Td3[(s0 ) & 0xff] ^ + rk[3]; + + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + rk += 4; + + } + + /* + * complete the last round and + * map cipher state to byte array block: + */ + t0 = + (Td4[(s0 >> 24) ] & 0xff000000) ^ + (Td4[(s3 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(s2 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(s1 ) & 0xff] & 0x000000ff); + t1 = + (Td4[(s1 >> 24) ] & 0xff000000) ^ + (Td4[(s0 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(s3 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(s2 ) & 0xff] & 0x000000ff); + t2 = + (Td4[(s2 >> 24) ] & 0xff000000) ^ + (Td4[(s1 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(s0 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(s3 ) & 0xff] & 0x000000ff); + t3 = + (Td4[(s3 >> 24) ] & 0xff000000) ^ + (Td4[(s2 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(s1 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(s0 ) & 0xff] & 0x000000ff); + + if (rounds == Nr) { + t0 ^= rk[0]; + t1 ^= rk[1]; + t2 ^= rk[2]; + t3 ^= rk[3]; + } + + PUTU32(block , t0); + PUTU32(block + 4, t1); + PUTU32(block + 8, t2); + PUTU32(block + 12, t3); +} + +#endif /* INTERMEDIATE_VALUE_KAT */ + +static void block_init(block_state *state, unsigned char *key, + int keylen) +{ + int Nr = 0; + + if (keylen != 16 && keylen != 24 && keylen != 32) { + PyErr_SetString(PyExc_ValueError, + "AES key must be either 16, 24, or 32 bytes long"); + return; + } + switch (keylen) { + case(16): Nr = 10; break; + case(24): Nr = 12; break; + case(32): Nr = 14; break; + } + state->rounds = Nr; + rijndaelKeySetupEnc(state->ek, key, keylen*8); + rijndaelKeySetupDec(state->dk, key, keylen*8); +} + +static void block_encrypt(block_state *self, u8 *in, u8 *out) +{ + rijndaelEncrypt(self->ek, self->rounds, in, out); +} + +static void block_decrypt(block_state *self, u8 *in, u8 *out) +{ + rijndaelDecrypt(self->dk, self->rounds, in, out); +} + +#include "block_template.c" diff --git a/Cryptography/pycrypto-2.6.1/src/ARC2.c b/Cryptography/pycrypto-2.6.1/src/ARC2.c new file mode 100644 index 0000000..49b5daf --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/ARC2.c @@ -0,0 +1,220 @@ +/* + * rc2.c : Source code for the RC2 block cipher + * + * Part of the Python Cryptography Toolkit + * + * =================================================================== + * This file appears to contain code from the ARC2 implementation + * "rc2.c" implementation (the "Original Code"), with modifications made + * after it was incorporated into PyCrypto (the "Modifications"). + * + * To the best of our knowledge, the Original Code was placed into the + * public domain by its (anonymous) author: + * + * ********************************************************************** + * * To commemorate the 1996 RSA Data Security Conference, the following * + * * code is released into the public domain by its author. Prost! * + * * * + * * This cipher uses 16-bit words and little-endian byte ordering. * + * * I wonder which processor it was optimized for? * + * * * + * * Thanks to CodeView, SoftIce, and D86 for helping bring this code to * + * * the public. * + * ********************************************************************** + * + * The Modifications to this file are dedicated to the public domain. + * To the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. No rights are + * reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + * + */ + +#include +#include "Python.h" + +#define MODULE_NAME _ARC2 +#define BLOCK_SIZE 8 +#define KEY_SIZE 0 +#define PCT_ARC2_MODULE /* Defined to get ARC2's additional keyword arguments */ + +typedef unsigned int U32; +typedef unsigned short U16; +typedef unsigned char U8; + +typedef struct +{ + U16 xkey[64]; + int effective_keylen; +} block_state; + +static void +block_encrypt(block_state *self, U8 *in, U8 *out) +{ + U16 x76, x54, x32, x10; + int i; + + x76 = (in[7] << 8) + in[6]; + x54 = (in[5] << 8) + in[4]; + x32 = (in[3] << 8) + in[2]; + x10 = (in[1] << 8) + in[0]; + + for (i = 0; i < 16; i++) + { + x10 += (x32 & ~x76) + (x54 & x76) + self->xkey[4*i+0]; + x10 = (x10 << 1) + (x10 >> 15 & 1); + + x32 += (x54 & ~x10) + (x76 & x10) + self->xkey[4*i+1]; + x32 = (x32 << 2) + (x32 >> 14 & 3); + + x54 += (x76 & ~x32) + (x10 & x32) + self->xkey[4*i+2]; + x54 = (x54 << 3) + (x54 >> 13 & 7); + + x76 += (x10 & ~x54) + (x32 & x54) + self->xkey[4*i+3]; + x76 = (x76 << 5) + (x76 >> 11 & 31); + + if (i == 4 || i == 10) { + x10 += self->xkey[x76 & 63]; + x32 += self->xkey[x10 & 63]; + x54 += self->xkey[x32 & 63]; + x76 += self->xkey[x54 & 63]; + } + } + + out[0] = (U8)x10; + out[1] = (U8)(x10 >> 8); + out[2] = (U8)x32; + out[3] = (U8)(x32 >> 8); + out[4] = (U8)x54; + out[5] = (U8)(x54 >> 8); + out[6] = (U8)x76; + out[7] = (U8)(x76 >> 8); +} + + +static void +block_decrypt(block_state *self, U8 *in, U8 *out) +{ + U16 x76, x54, x32, x10; + int i; + + x76 = (in[7] << 8) + in[6]; + x54 = (in[5] << 8) + in[4]; + x32 = (in[3] << 8) + in[2]; + x10 = (in[1] << 8) + in[0]; + + i = 15; + do { + x76 &= 65535; + x76 = (x76 << 11) + (x76 >> 5); + x76 -= (x10 & ~x54) + (x32 & x54) + self->xkey[4*i+3]; + + x54 &= 65535; + x54 = (x54 << 13) + (x54 >> 3); + x54 -= (x76 & ~x32) + (x10 & x32) + self->xkey[4*i+2]; + + x32 &= 65535; + x32 = (x32 << 14) + (x32 >> 2); + x32 -= (x54 & ~x10) + (x76 & x10) + self->xkey[4*i+1]; + + x10 &= 65535; + x10 = (x10 << 15) + (x10 >> 1); + x10 -= (x32 & ~x76) + (x54 & x76) + self->xkey[4*i+0]; + + if (i == 5 || i == 11) { + x76 -= self->xkey[x54 & 63]; + x54 -= self->xkey[x32 & 63]; + x32 -= self->xkey[x10 & 63]; + x10 -= self->xkey[x76 & 63]; + } + } while (i--); + + out[0] = (U8)x10; + out[1] = (U8)(x10 >> 8); + out[2] = (U8)x32; + out[3] = (U8)(x32 >> 8); + out[4] = (U8)x54; + out[5] = (U8)(x54 >> 8); + out[6] = (U8)x76; + out[7] = (U8)(x76 >> 8); +} + + +static void +block_init(block_state *self, U8 *key, int keylength) +{ + U8 x; + U16 i; + /* 256-entry permutation table, probably derived somehow from pi */ + static const U8 permute[256] = { + 217,120,249,196, 25,221,181,237, 40,233,253,121, 74,160,216,157, + 198,126, 55,131, 43,118, 83,142, 98, 76,100,136, 68,139,251,162, + 23,154, 89,245,135,179, 79, 19, 97, 69,109,141, 9,129,125, 50, + 189,143, 64,235,134,183,123, 11,240,149, 33, 34, 92,107, 78,130, + 84,214,101,147,206, 96,178, 28,115, 86,192, 20,167,140,241,220, + 18,117,202, 31, 59,190,228,209, 66, 61,212, 48,163, 60,182, 38, + 111,191, 14,218, 70,105, 7, 87, 39,242, 29,155,188,148, 67, 3, + 248, 17,199,246,144,239, 62,231, 6,195,213, 47,200,102, 30,215, + 8,232,234,222,128, 82,238,247,132,170,114,172, 53, 77,106, 42, + 150, 26,210,113, 90, 21, 73,116, 75,159,208, 94, 4, 24,164,236, + 194,224, 65,110, 15, 81,203,204, 36,145,175, 80,161,244,112, 57, + 153,124, 58,133, 35,184,180,122,252, 2, 54, 91, 37, 85,151, 49, + 45, 93,250,152,227,138,146,174, 5,223, 41, 16,103,108,186,201, + 211, 0,230,207,225,158,168, 44, 99, 22, 1, 63, 88,226,137,169, + 13, 56, 52, 27,171, 51,255,176,187, 72, 12, 95,185,177,205, 46, + 197,243,219, 71,229,165,156,119, 10,166, 32,104,254,127,193,173 + }; + + if ((U32)keylength > sizeof(self->xkey)) { + PyErr_SetString(PyExc_ValueError, + "ARC2 key length must be less than 128 bytes"); + return; + } + + memcpy(self->xkey, key, keylength); + + /* Phase 1: Expand input key to 128 bytes */ + if (keylength < 128) { + i = 0; + x = ((U8 *)self->xkey)[keylength-1]; + do { + x = permute[(x + ((U8 *)self->xkey)[i++]) & 255]; + ((U8 *)self->xkey)[keylength++] = x; + } while (keylength < 128); + } + + /* Phase 2 - reduce effective key size to "effective_keylen" */ + keylength = (self->effective_keylen+7) >> 3; + i = 128-keylength; + x = permute[((U8 *)self->xkey)[i] & (255 >> + (7 & + ((self->effective_keylen %8 ) ? 8-(self->effective_keylen%8): 0)) + )]; + ((U8 *)self->xkey)[i] = x; + + while (i--) { + x = permute[ x ^ ((U8 *)self->xkey)[i+keylength] ]; + ((U8 *)self->xkey)[i] = x; + } + + /* Phase 3 - copy to self->xkey in little-endian order */ + i = 63; + do { + self->xkey[i] = ((U8 *)self->xkey)[2*i] + + (((U8 *)self->xkey)[2*i+1] << 8); + } while (i--); +} + + +#include "block_template.c" diff --git a/Cryptography/pycrypto-2.6.1/src/ARC4.c b/Cryptography/pycrypto-2.6.1/src/ARC4.c new file mode 100644 index 0000000..28dc4a3 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/ARC4.c @@ -0,0 +1,88 @@ + +/* + * arc4.c : Implementation for the Alleged-RC4 stream cipher + * + * Part of the Python Cryptography Toolkit + * + * Originally written by: A.M. Kuchling + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + * + */ + +#define MODULE_NAME _ARC4 +#define BLOCK_SIZE 1 +#define KEY_SIZE 0 + +typedef struct +{ + unsigned char state[256]; + unsigned char x,y; +} stream_state; + +/* Encryption and decryption are symmetric */ +#define stream_decrypt stream_encrypt + +static void stream_encrypt(stream_state *self, unsigned char *block, + int len) +{ + register int i, x=self->x, y=self->y; + + for (i=0; istate[x]) % 256; + { + register int t; /* Exchange state[x] and state[y] */ + t = self->state[x]; + self->state[x] = self->state[y]; + self->state[y] = t; + } + { + register int xorIndex; /* XOR the data with the stream data */ + xorIndex=(self->state[x]+self->state[y]) % 256; + block[i] ^= self->state[xorIndex]; + } + } + self->x=x; + self->y=y; +} + + +static void stream_init(stream_state *self, unsigned char *key, int keylen) +{ + register int i, index1, index2; + + for(i=0; i<256; i++) self->state[i]=i; + self->x=0; self->y=0; + index1=0; index2=0; + for(i=0; i<256; i++) + { + register int t; + index2 = ( key[index1] + self->state[i] + index2) % 256; + t = self->state[i]; + self->state[i] = self->state[index2]; + self->state[index2] = t; + index1 = (index1 + 1) % keylen; + } +} + +#include "stream_template.c" + + diff --git a/Cryptography/pycrypto-2.6.1/src/Blowfish-tables.h b/Cryptography/pycrypto-2.6.1/src/Blowfish-tables.h new file mode 100644 index 0000000..b152cb2 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/Blowfish-tables.h @@ -0,0 +1,258 @@ +/* + * + * Blowfish-tables.h : Initial-value tables for Blowfish + * + * Written in 2008 by Dwayne C. Litzenberger + * + * ======================================================================= + * The contents of this file are dedicated to the public domain. To the extent + * that dedication to the public domain is not available, everyone is granted a + * worldwide, perpetual, royalty-free, non-exclusive license to exercise all + * rights associated with the contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * ======================================================================= + * + * Country of origin: Canada + */ +#ifndef BLOWFISH_TABLES_H +#define BLOWFISH_TABLES_H + +/* The hexadecimal digits of pi, less 3. */ + +static const uint32_t initial_P[18] = { + 0x243f6a88u, 0x85a308d3u, 0x13198a2eu, 0x03707344u, 0xa4093822u, + 0x299f31d0u, 0x082efa98u, 0xec4e6c89u, 0x452821e6u, 0x38d01377u, + 0xbe5466cfu, 0x34e90c6cu, 0xc0ac29b7u, 0xc97c50ddu, 0x3f84d5b5u, + 0xb5470917u, 0x9216d5d9u, 0x8979fb1bu +}; + +static const uint32_t initial_S1[256] = { + 0xd1310ba6u, 0x98dfb5acu, 0x2ffd72dbu, 0xd01adfb7u, 0xb8e1afedu, + 0x6a267e96u, 0xba7c9045u, 0xf12c7f99u, 0x24a19947u, 0xb3916cf7u, + 0x0801f2e2u, 0x858efc16u, 0x636920d8u, 0x71574e69u, 0xa458fea3u, + 0xf4933d7eu, 0x0d95748fu, 0x728eb658u, 0x718bcd58u, 0x82154aeeu, + 0x7b54a41du, 0xc25a59b5u, 0x9c30d539u, 0x2af26013u, 0xc5d1b023u, + 0x286085f0u, 0xca417918u, 0xb8db38efu, 0x8e79dcb0u, 0x603a180eu, + 0x6c9e0e8bu, 0xb01e8a3eu, 0xd71577c1u, 0xbd314b27u, 0x78af2fdau, + 0x55605c60u, 0xe65525f3u, 0xaa55ab94u, 0x57489862u, 0x63e81440u, + 0x55ca396au, 0x2aab10b6u, 0xb4cc5c34u, 0x1141e8ceu, 0xa15486afu, + 0x7c72e993u, 0xb3ee1411u, 0x636fbc2au, 0x2ba9c55du, 0x741831f6u, + 0xce5c3e16u, 0x9b87931eu, 0xafd6ba33u, 0x6c24cf5cu, 0x7a325381u, + 0x28958677u, 0x3b8f4898u, 0x6b4bb9afu, 0xc4bfe81bu, 0x66282193u, + 0x61d809ccu, 0xfb21a991u, 0x487cac60u, 0x5dec8032u, 0xef845d5du, + 0xe98575b1u, 0xdc262302u, 0xeb651b88u, 0x23893e81u, 0xd396acc5u, + 0x0f6d6ff3u, 0x83f44239u, 0x2e0b4482u, 0xa4842004u, 0x69c8f04au, + 0x9e1f9b5eu, 0x21c66842u, 0xf6e96c9au, 0x670c9c61u, 0xabd388f0u, + 0x6a51a0d2u, 0xd8542f68u, 0x960fa728u, 0xab5133a3u, 0x6eef0b6cu, + 0x137a3be4u, 0xba3bf050u, 0x7efb2a98u, 0xa1f1651du, 0x39af0176u, + 0x66ca593eu, 0x82430e88u, 0x8cee8619u, 0x456f9fb4u, 0x7d84a5c3u, + 0x3b8b5ebeu, 0xe06f75d8u, 0x85c12073u, 0x401a449fu, 0x56c16aa6u, + 0x4ed3aa62u, 0x363f7706u, 0x1bfedf72u, 0x429b023du, 0x37d0d724u, + 0xd00a1248u, 0xdb0fead3u, 0x49f1c09bu, 0x075372c9u, 0x80991b7bu, + 0x25d479d8u, 0xf6e8def7u, 0xe3fe501au, 0xb6794c3bu, 0x976ce0bdu, + 0x04c006bau, 0xc1a94fb6u, 0x409f60c4u, 0x5e5c9ec2u, 0x196a2463u, + 0x68fb6fafu, 0x3e6c53b5u, 0x1339b2ebu, 0x3b52ec6fu, 0x6dfc511fu, + 0x9b30952cu, 0xcc814544u, 0xaf5ebd09u, 0xbee3d004u, 0xde334afdu, + 0x660f2807u, 0x192e4bb3u, 0xc0cba857u, 0x45c8740fu, 0xd20b5f39u, + 0xb9d3fbdbu, 0x5579c0bdu, 0x1a60320au, 0xd6a100c6u, 0x402c7279u, + 0x679f25feu, 0xfb1fa3ccu, 0x8ea5e9f8u, 0xdb3222f8u, 0x3c7516dfu, + 0xfd616b15u, 0x2f501ec8u, 0xad0552abu, 0x323db5fau, 0xfd238760u, + 0x53317b48u, 0x3e00df82u, 0x9e5c57bbu, 0xca6f8ca0u, 0x1a87562eu, + 0xdf1769dbu, 0xd542a8f6u, 0x287effc3u, 0xac6732c6u, 0x8c4f5573u, + 0x695b27b0u, 0xbbca58c8u, 0xe1ffa35du, 0xb8f011a0u, 0x10fa3d98u, + 0xfd2183b8u, 0x4afcb56cu, 0x2dd1d35bu, 0x9a53e479u, 0xb6f84565u, + 0xd28e49bcu, 0x4bfb9790u, 0xe1ddf2dau, 0xa4cb7e33u, 0x62fb1341u, + 0xcee4c6e8u, 0xef20cadau, 0x36774c01u, 0xd07e9efeu, 0x2bf11fb4u, + 0x95dbda4du, 0xae909198u, 0xeaad8e71u, 0x6b93d5a0u, 0xd08ed1d0u, + 0xafc725e0u, 0x8e3c5b2fu, 0x8e7594b7u, 0x8ff6e2fbu, 0xf2122b64u, + 0x8888b812u, 0x900df01cu, 0x4fad5ea0u, 0x688fc31cu, 0xd1cff191u, + 0xb3a8c1adu, 0x2f2f2218u, 0xbe0e1777u, 0xea752dfeu, 0x8b021fa1u, + 0xe5a0cc0fu, 0xb56f74e8u, 0x18acf3d6u, 0xce89e299u, 0xb4a84fe0u, + 0xfd13e0b7u, 0x7cc43b81u, 0xd2ada8d9u, 0x165fa266u, 0x80957705u, + 0x93cc7314u, 0x211a1477u, 0xe6ad2065u, 0x77b5fa86u, 0xc75442f5u, + 0xfb9d35cfu, 0xebcdaf0cu, 0x7b3e89a0u, 0xd6411bd3u, 0xae1e7e49u, + 0x00250e2du, 0x2071b35eu, 0x226800bbu, 0x57b8e0afu, 0x2464369bu, + 0xf009b91eu, 0x5563911du, 0x59dfa6aau, 0x78c14389u, 0xd95a537fu, + 0x207d5ba2u, 0x02e5b9c5u, 0x83260376u, 0x6295cfa9u, 0x11c81968u, + 0x4e734a41u, 0xb3472dcau, 0x7b14a94au, 0x1b510052u, 0x9a532915u, + 0xd60f573fu, 0xbc9bc6e4u, 0x2b60a476u, 0x81e67400u, 0x08ba6fb5u, + 0x571be91fu, 0xf296ec6bu, 0x2a0dd915u, 0xb6636521u, 0xe7b9f9b6u, + 0xff34052eu, 0xc5855664u, 0x53b02d5du, 0xa99f8fa1u, 0x08ba4799u, + 0x6e85076au +}; + +static const uint32_t initial_S2[256] = { + 0x4b7a70e9u, 0xb5b32944u, 0xdb75092eu, 0xc4192623u, 0xad6ea6b0u, + 0x49a7df7du, 0x9cee60b8u, 0x8fedb266u, 0xecaa8c71u, 0x699a17ffu, + 0x5664526cu, 0xc2b19ee1u, 0x193602a5u, 0x75094c29u, 0xa0591340u, + 0xe4183a3eu, 0x3f54989au, 0x5b429d65u, 0x6b8fe4d6u, 0x99f73fd6u, + 0xa1d29c07u, 0xefe830f5u, 0x4d2d38e6u, 0xf0255dc1u, 0x4cdd2086u, + 0x8470eb26u, 0x6382e9c6u, 0x021ecc5eu, 0x09686b3fu, 0x3ebaefc9u, + 0x3c971814u, 0x6b6a70a1u, 0x687f3584u, 0x52a0e286u, 0xb79c5305u, + 0xaa500737u, 0x3e07841cu, 0x7fdeae5cu, 0x8e7d44ecu, 0x5716f2b8u, + 0xb03ada37u, 0xf0500c0du, 0xf01c1f04u, 0x0200b3ffu, 0xae0cf51au, + 0x3cb574b2u, 0x25837a58u, 0xdc0921bdu, 0xd19113f9u, 0x7ca92ff6u, + 0x94324773u, 0x22f54701u, 0x3ae5e581u, 0x37c2dadcu, 0xc8b57634u, + 0x9af3dda7u, 0xa9446146u, 0x0fd0030eu, 0xecc8c73eu, 0xa4751e41u, + 0xe238cd99u, 0x3bea0e2fu, 0x3280bba1u, 0x183eb331u, 0x4e548b38u, + 0x4f6db908u, 0x6f420d03u, 0xf60a04bfu, 0x2cb81290u, 0x24977c79u, + 0x5679b072u, 0xbcaf89afu, 0xde9a771fu, 0xd9930810u, 0xb38bae12u, + 0xdccf3f2eu, 0x5512721fu, 0x2e6b7124u, 0x501adde6u, 0x9f84cd87u, + 0x7a584718u, 0x7408da17u, 0xbc9f9abcu, 0xe94b7d8cu, 0xec7aec3au, + 0xdb851dfau, 0x63094366u, 0xc464c3d2u, 0xef1c1847u, 0x3215d908u, + 0xdd433b37u, 0x24c2ba16u, 0x12a14d43u, 0x2a65c451u, 0x50940002u, + 0x133ae4ddu, 0x71dff89eu, 0x10314e55u, 0x81ac77d6u, 0x5f11199bu, + 0x043556f1u, 0xd7a3c76bu, 0x3c11183bu, 0x5924a509u, 0xf28fe6edu, + 0x97f1fbfau, 0x9ebabf2cu, 0x1e153c6eu, 0x86e34570u, 0xeae96fb1u, + 0x860e5e0au, 0x5a3e2ab3u, 0x771fe71cu, 0x4e3d06fau, 0x2965dcb9u, + 0x99e71d0fu, 0x803e89d6u, 0x5266c825u, 0x2e4cc978u, 0x9c10b36au, + 0xc6150ebau, 0x94e2ea78u, 0xa5fc3c53u, 0x1e0a2df4u, 0xf2f74ea7u, + 0x361d2b3du, 0x1939260fu, 0x19c27960u, 0x5223a708u, 0xf71312b6u, + 0xebadfe6eu, 0xeac31f66u, 0xe3bc4595u, 0xa67bc883u, 0xb17f37d1u, + 0x018cff28u, 0xc332ddefu, 0xbe6c5aa5u, 0x65582185u, 0x68ab9802u, + 0xeecea50fu, 0xdb2f953bu, 0x2aef7dadu, 0x5b6e2f84u, 0x1521b628u, + 0x29076170u, 0xecdd4775u, 0x619f1510u, 0x13cca830u, 0xeb61bd96u, + 0x0334fe1eu, 0xaa0363cfu, 0xb5735c90u, 0x4c70a239u, 0xd59e9e0bu, + 0xcbaade14u, 0xeecc86bcu, 0x60622ca7u, 0x9cab5cabu, 0xb2f3846eu, + 0x648b1eafu, 0x19bdf0cau, 0xa02369b9u, 0x655abb50u, 0x40685a32u, + 0x3c2ab4b3u, 0x319ee9d5u, 0xc021b8f7u, 0x9b540b19u, 0x875fa099u, + 0x95f7997eu, 0x623d7da8u, 0xf837889au, 0x97e32d77u, 0x11ed935fu, + 0x16681281u, 0x0e358829u, 0xc7e61fd6u, 0x96dedfa1u, 0x7858ba99u, + 0x57f584a5u, 0x1b227263u, 0x9b83c3ffu, 0x1ac24696u, 0xcdb30aebu, + 0x532e3054u, 0x8fd948e4u, 0x6dbc3128u, 0x58ebf2efu, 0x34c6ffeau, + 0xfe28ed61u, 0xee7c3c73u, 0x5d4a14d9u, 0xe864b7e3u, 0x42105d14u, + 0x203e13e0u, 0x45eee2b6u, 0xa3aaabeau, 0xdb6c4f15u, 0xfacb4fd0u, + 0xc742f442u, 0xef6abbb5u, 0x654f3b1du, 0x41cd2105u, 0xd81e799eu, + 0x86854dc7u, 0xe44b476au, 0x3d816250u, 0xcf62a1f2u, 0x5b8d2646u, + 0xfc8883a0u, 0xc1c7b6a3u, 0x7f1524c3u, 0x69cb7492u, 0x47848a0bu, + 0x5692b285u, 0x095bbf00u, 0xad19489du, 0x1462b174u, 0x23820e00u, + 0x58428d2au, 0x0c55f5eau, 0x1dadf43eu, 0x233f7061u, 0x3372f092u, + 0x8d937e41u, 0xd65fecf1u, 0x6c223bdbu, 0x7cde3759u, 0xcbee7460u, + 0x4085f2a7u, 0xce77326eu, 0xa6078084u, 0x19f8509eu, 0xe8efd855u, + 0x61d99735u, 0xa969a7aau, 0xc50c06c2u, 0x5a04abfcu, 0x800bcadcu, + 0x9e447a2eu, 0xc3453484u, 0xfdd56705u, 0x0e1e9ec9u, 0xdb73dbd3u, + 0x105588cdu, 0x675fda79u, 0xe3674340u, 0xc5c43465u, 0x713e38d8u, + 0x3d28f89eu, 0xf16dff20u, 0x153e21e7u, 0x8fb03d4au, 0xe6e39f2bu, + 0xdb83adf7u +}; + +static const uint32_t initial_S3[256] = { + 0xe93d5a68u, 0x948140f7u, 0xf64c261cu, 0x94692934u, 0x411520f7u, + 0x7602d4f7u, 0xbcf46b2eu, 0xd4a20068u, 0xd4082471u, 0x3320f46au, + 0x43b7d4b7u, 0x500061afu, 0x1e39f62eu, 0x97244546u, 0x14214f74u, + 0xbf8b8840u, 0x4d95fc1du, 0x96b591afu, 0x70f4ddd3u, 0x66a02f45u, + 0xbfbc09ecu, 0x03bd9785u, 0x7fac6dd0u, 0x31cb8504u, 0x96eb27b3u, + 0x55fd3941u, 0xda2547e6u, 0xabca0a9au, 0x28507825u, 0x530429f4u, + 0x0a2c86dau, 0xe9b66dfbu, 0x68dc1462u, 0xd7486900u, 0x680ec0a4u, + 0x27a18deeu, 0x4f3ffea2u, 0xe887ad8cu, 0xb58ce006u, 0x7af4d6b6u, + 0xaace1e7cu, 0xd3375fecu, 0xce78a399u, 0x406b2a42u, 0x20fe9e35u, + 0xd9f385b9u, 0xee39d7abu, 0x3b124e8bu, 0x1dc9faf7u, 0x4b6d1856u, + 0x26a36631u, 0xeae397b2u, 0x3a6efa74u, 0xdd5b4332u, 0x6841e7f7u, + 0xca7820fbu, 0xfb0af54eu, 0xd8feb397u, 0x454056acu, 0xba489527u, + 0x55533a3au, 0x20838d87u, 0xfe6ba9b7u, 0xd096954bu, 0x55a867bcu, + 0xa1159a58u, 0xcca92963u, 0x99e1db33u, 0xa62a4a56u, 0x3f3125f9u, + 0x5ef47e1cu, 0x9029317cu, 0xfdf8e802u, 0x04272f70u, 0x80bb155cu, + 0x05282ce3u, 0x95c11548u, 0xe4c66d22u, 0x48c1133fu, 0xc70f86dcu, + 0x07f9c9eeu, 0x41041f0fu, 0x404779a4u, 0x5d886e17u, 0x325f51ebu, + 0xd59bc0d1u, 0xf2bcc18fu, 0x41113564u, 0x257b7834u, 0x602a9c60u, + 0xdff8e8a3u, 0x1f636c1bu, 0x0e12b4c2u, 0x02e1329eu, 0xaf664fd1u, + 0xcad18115u, 0x6b2395e0u, 0x333e92e1u, 0x3b240b62u, 0xeebeb922u, + 0x85b2a20eu, 0xe6ba0d99u, 0xde720c8cu, 0x2da2f728u, 0xd0127845u, + 0x95b794fdu, 0x647d0862u, 0xe7ccf5f0u, 0x5449a36fu, 0x877d48fau, + 0xc39dfd27u, 0xf33e8d1eu, 0x0a476341u, 0x992eff74u, 0x3a6f6eabu, + 0xf4f8fd37u, 0xa812dc60u, 0xa1ebddf8u, 0x991be14cu, 0xdb6e6b0du, + 0xc67b5510u, 0x6d672c37u, 0x2765d43bu, 0xdcd0e804u, 0xf1290dc7u, + 0xcc00ffa3u, 0xb5390f92u, 0x690fed0bu, 0x667b9ffbu, 0xcedb7d9cu, + 0xa091cf0bu, 0xd9155ea3u, 0xbb132f88u, 0x515bad24u, 0x7b9479bfu, + 0x763bd6ebu, 0x37392eb3u, 0xcc115979u, 0x8026e297u, 0xf42e312du, + 0x6842ada7u, 0xc66a2b3bu, 0x12754cccu, 0x782ef11cu, 0x6a124237u, + 0xb79251e7u, 0x06a1bbe6u, 0x4bfb6350u, 0x1a6b1018u, 0x11caedfau, + 0x3d25bdd8u, 0xe2e1c3c9u, 0x44421659u, 0x0a121386u, 0xd90cec6eu, + 0xd5abea2au, 0x64af674eu, 0xda86a85fu, 0xbebfe988u, 0x64e4c3feu, + 0x9dbc8057u, 0xf0f7c086u, 0x60787bf8u, 0x6003604du, 0xd1fd8346u, + 0xf6381fb0u, 0x7745ae04u, 0xd736fcccu, 0x83426b33u, 0xf01eab71u, + 0xb0804187u, 0x3c005e5fu, 0x77a057beu, 0xbde8ae24u, 0x55464299u, + 0xbf582e61u, 0x4e58f48fu, 0xf2ddfda2u, 0xf474ef38u, 0x8789bdc2u, + 0x5366f9c3u, 0xc8b38e74u, 0xb475f255u, 0x46fcd9b9u, 0x7aeb2661u, + 0x8b1ddf84u, 0x846a0e79u, 0x915f95e2u, 0x466e598eu, 0x20b45770u, + 0x8cd55591u, 0xc902de4cu, 0xb90bace1u, 0xbb8205d0u, 0x11a86248u, + 0x7574a99eu, 0xb77f19b6u, 0xe0a9dc09u, 0x662d09a1u, 0xc4324633u, + 0xe85a1f02u, 0x09f0be8cu, 0x4a99a025u, 0x1d6efe10u, 0x1ab93d1du, + 0x0ba5a4dfu, 0xa186f20fu, 0x2868f169u, 0xdcb7da83u, 0x573906feu, + 0xa1e2ce9bu, 0x4fcd7f52u, 0x50115e01u, 0xa70683fau, 0xa002b5c4u, + 0x0de6d027u, 0x9af88c27u, 0x773f8641u, 0xc3604c06u, 0x61a806b5u, + 0xf0177a28u, 0xc0f586e0u, 0x006058aau, 0x30dc7d62u, 0x11e69ed7u, + 0x2338ea63u, 0x53c2dd94u, 0xc2c21634u, 0xbbcbee56u, 0x90bcb6deu, + 0xebfc7da1u, 0xce591d76u, 0x6f05e409u, 0x4b7c0188u, 0x39720a3du, + 0x7c927c24u, 0x86e3725fu, 0x724d9db9u, 0x1ac15bb4u, 0xd39eb8fcu, + 0xed545578u, 0x08fca5b5u, 0xd83d7cd3u, 0x4dad0fc4u, 0x1e50ef5eu, + 0xb161e6f8u, 0xa28514d9u, 0x6c51133cu, 0x6fd5c7e7u, 0x56e14ec4u, + 0x362abfceu, 0xddc6c837u, 0xd79a3234u, 0x92638212u, 0x670efa8eu, + 0x406000e0u +}; + +static const uint32_t initial_S4[256] = { + 0x3a39ce37u, 0xd3faf5cfu, 0xabc27737u, 0x5ac52d1bu, 0x5cb0679eu, + 0x4fa33742u, 0xd3822740u, 0x99bc9bbeu, 0xd5118e9du, 0xbf0f7315u, + 0xd62d1c7eu, 0xc700c47bu, 0xb78c1b6bu, 0x21a19045u, 0xb26eb1beu, + 0x6a366eb4u, 0x5748ab2fu, 0xbc946e79u, 0xc6a376d2u, 0x6549c2c8u, + 0x530ff8eeu, 0x468dde7du, 0xd5730a1du, 0x4cd04dc6u, 0x2939bbdbu, + 0xa9ba4650u, 0xac9526e8u, 0xbe5ee304u, 0xa1fad5f0u, 0x6a2d519au, + 0x63ef8ce2u, 0x9a86ee22u, 0xc089c2b8u, 0x43242ef6u, 0xa51e03aau, + 0x9cf2d0a4u, 0x83c061bau, 0x9be96a4du, 0x8fe51550u, 0xba645bd6u, + 0x2826a2f9u, 0xa73a3ae1u, 0x4ba99586u, 0xef5562e9u, 0xc72fefd3u, + 0xf752f7dau, 0x3f046f69u, 0x77fa0a59u, 0x80e4a915u, 0x87b08601u, + 0x9b09e6adu, 0x3b3ee593u, 0xe990fd5au, 0x9e34d797u, 0x2cf0b7d9u, + 0x022b8b51u, 0x96d5ac3au, 0x017da67du, 0xd1cf3ed6u, 0x7c7d2d28u, + 0x1f9f25cfu, 0xadf2b89bu, 0x5ad6b472u, 0x5a88f54cu, 0xe029ac71u, + 0xe019a5e6u, 0x47b0acfdu, 0xed93fa9bu, 0xe8d3c48du, 0x283b57ccu, + 0xf8d56629u, 0x79132e28u, 0x785f0191u, 0xed756055u, 0xf7960e44u, + 0xe3d35e8cu, 0x15056dd4u, 0x88f46dbau, 0x03a16125u, 0x0564f0bdu, + 0xc3eb9e15u, 0x3c9057a2u, 0x97271aecu, 0xa93a072au, 0x1b3f6d9bu, + 0x1e6321f5u, 0xf59c66fbu, 0x26dcf319u, 0x7533d928u, 0xb155fdf5u, + 0x03563482u, 0x8aba3cbbu, 0x28517711u, 0xc20ad9f8u, 0xabcc5167u, + 0xccad925fu, 0x4de81751u, 0x3830dc8eu, 0x379d5862u, 0x9320f991u, + 0xea7a90c2u, 0xfb3e7bceu, 0x5121ce64u, 0x774fbe32u, 0xa8b6e37eu, + 0xc3293d46u, 0x48de5369u, 0x6413e680u, 0xa2ae0810u, 0xdd6db224u, + 0x69852dfdu, 0x09072166u, 0xb39a460au, 0x6445c0ddu, 0x586cdecfu, + 0x1c20c8aeu, 0x5bbef7ddu, 0x1b588d40u, 0xccd2017fu, 0x6bb4e3bbu, + 0xdda26a7eu, 0x3a59ff45u, 0x3e350a44u, 0xbcb4cdd5u, 0x72eacea8u, + 0xfa6484bbu, 0x8d6612aeu, 0xbf3c6f47u, 0xd29be463u, 0x542f5d9eu, + 0xaec2771bu, 0xf64e6370u, 0x740e0d8du, 0xe75b1357u, 0xf8721671u, + 0xaf537d5du, 0x4040cb08u, 0x4eb4e2ccu, 0x34d2466au, 0x0115af84u, + 0xe1b00428u, 0x95983a1du, 0x06b89fb4u, 0xce6ea048u, 0x6f3f3b82u, + 0x3520ab82u, 0x011a1d4bu, 0x277227f8u, 0x611560b1u, 0xe7933fdcu, + 0xbb3a792bu, 0x344525bdu, 0xa08839e1u, 0x51ce794bu, 0x2f32c9b7u, + 0xa01fbac9u, 0xe01cc87eu, 0xbcc7d1f6u, 0xcf0111c3u, 0xa1e8aac7u, + 0x1a908749u, 0xd44fbd9au, 0xd0dadecbu, 0xd50ada38u, 0x0339c32au, + 0xc6913667u, 0x8df9317cu, 0xe0b12b4fu, 0xf79e59b7u, 0x43f5bb3au, + 0xf2d519ffu, 0x27d9459cu, 0xbf97222cu, 0x15e6fc2au, 0x0f91fc71u, + 0x9b941525u, 0xfae59361u, 0xceb69cebu, 0xc2a86459u, 0x12baa8d1u, + 0xb6c1075eu, 0xe3056a0cu, 0x10d25065u, 0xcb03a442u, 0xe0ec6e0eu, + 0x1698db3bu, 0x4c98a0beu, 0x3278e964u, 0x9f1f9532u, 0xe0d392dfu, + 0xd3a0342bu, 0x8971f21eu, 0x1b0a7441u, 0x4ba3348cu, 0xc5be7120u, + 0xc37632d8u, 0xdf359f8du, 0x9b992f2eu, 0xe60b6f47u, 0x0fe3f11du, + 0xe54cda54u, 0x1edad891u, 0xce6279cfu, 0xcd3e7e6fu, 0x1618b166u, + 0xfd2c1d05u, 0x848fd2c5u, 0xf6fb2299u, 0xf523f357u, 0xa6327623u, + 0x93a83531u, 0x56cccd02u, 0xacf08162u, 0x5a75ebb5u, 0x6e163697u, + 0x88d273ccu, 0xde966292u, 0x81b949d0u, 0x4c50901bu, 0x71c65614u, + 0xe6c6c7bdu, 0x327a140au, 0x45e1d006u, 0xc3f27b9au, 0xc9aa53fdu, + 0x62a80f00u, 0xbb25bfe2u, 0x35bdd2f6u, 0x71126905u, 0xb2040222u, + 0xb6cbcf7cu, 0xcd769c2bu, 0x53113ec0u, 0x1640e3d3u, 0x38abbd60u, + 0x2547adf0u, 0xba38209cu, 0xf746ce76u, 0x77afa1c5u, 0x20756060u, + 0x85cbfe4eu, 0x8ae88dd8u, 0x7aaaf9b0u, 0x4cf9aa7eu, 0x1948c25cu, + 0x02fb8a8cu, 0x01c36ae4u, 0xd6ebe1f9u, 0x90d4f869u, 0xa65cdea0u, + 0x3f09252du, 0xc208e69fu, 0xb74e6132u, 0xce77e25bu, 0x578fdfe3u, + 0x3ac372e6u +}; + +#endif /* BLOWFISH_TABLES_H */ +/* vim:set ts=4 sw=4 sts=4 expandtab: */ diff --git a/Cryptography/pycrypto-2.6.1/src/Blowfish.c b/Cryptography/pycrypto-2.6.1/src/Blowfish.c new file mode 100644 index 0000000..94562bb --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/Blowfish.c @@ -0,0 +1,245 @@ +/* + * + * Blowfish.c : Blowfish implementation + * + * Written in 2008 by Dwayne C. Litzenberger + * + * ======================================================================= + * The contents of this file are dedicated to the public domain. To the extent + * that dedication to the public domain is not available, everyone is granted a + * worldwide, perpetual, royalty-free, non-exclusive license to exercise all + * rights associated with the contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * ======================================================================= + * + * Country of origin: Canada + * + * The Blowfish algorithm is documented at + * http://www.schneier.com/paper-blowfish-fse.html + */ + +#include "config.h" +#if HAVE_STDINT_H +# include +#elif defined(__sun) || defined(__sun__) +# include +#else +# error "stdint.h not found" +#endif +#include +#include +#include "Python.h" + +#include "Blowfish-tables.h" + +#define MODULE_NAME _Blowfish +#define BLOCK_SIZE 8 /* 64-bit block size */ +#define KEY_SIZE 0 /* variable key size */ + +#define BLOWFISH_MAGIC 0xf9d565deu +typedef struct { + uint32_t magic; + + /* P permutation */ + uint32_t P[18]; + + /* Subkeys (S-boxes) */ + uint32_t S1[256]; + uint32_t S2[256]; + uint32_t S3[256]; + uint32_t S4[256]; +} Blowfish_state; + +/* The Blowfish round function F. Everything is taken modulo 2**32 */ +#define F(a, b, c, d) (((a) + (b)) ^ (c)) + (d) + +static inline uint32_t bytes_to_word(const unsigned char *in) +{ + /* big endian */ + return (in[0] << 24) | (in[1] << 16) | (in[2] << 8) | in[3]; +} + +static inline void word_to_bytes(uint32_t w, unsigned char *out) +{ + /* big endian */ + out[0] = (w >> 24) & 0xff; + out[1] = (w >> 16) & 0xff; + out[2] = (w >> 8) & 0xff; + out[3] = w & 0xff; +} + +static inline void inline_encrypt(Blowfish_state *self, uint32_t *pxL, uint32_t *pxR) +{ + int i; + uint32_t xL = *pxL; + uint32_t xR = *pxR; + uint32_t tmp; + + for (i = 0; i < 16; i++) { + xL ^= self->P[i]; + + /* a || b || c || d = xL (big endian) */ + xR ^= F(self->S1[(xL >> 24) & 0xff], /* S1[a] */ + self->S2[(xL >> 16) & 0xff], /* S2[b] */ + self->S3[(xL >> 8) & 0xff], /* S3[c] */ + self->S4[xL & 0xff]); /* S4[d] */ + + /* Swap xL, xR */ + tmp = xL; xL = xR; xR = tmp; + } + + /* Swap xL, xR */ + tmp = xL; xL = xR; xR = tmp; + + xR ^= self->P[16]; + xL ^= self->P[17]; + + *pxL = xL; + *pxR = xR; +} + +static inline void inline_decrypt(Blowfish_state *self, uint32_t *pxL, uint32_t *pxR) +{ + int i; + uint32_t xL = *pxL; + uint32_t xR = *pxR; + uint32_t tmp; + + xL ^= self->P[17]; + xR ^= self->P[16]; + + /* Swap xL, xR */ + tmp = xL; xL = xR; xR = tmp; + + for (i = 15; i >= 0; i--) { + /* Swap xL, xR */ + tmp = xL; xL = xR; xR = tmp; + + /* a || b || c || d = xL (big endian) */ + xR ^= F(self->S1[(xL >> 24) & 0xff], /* S1[a] */ + self->S2[(xL >> 16) & 0xff], /* S2[b] */ + self->S3[(xL >> 8) & 0xff], /* S3[c] */ + self->S4[xL & 0xff]); /* S4[d] */ + + xL ^= self->P[i]; + } + + *pxL = xL; + *pxR = xR; +} + +static void Blowfish_encrypt(Blowfish_state *self, const unsigned char *in, unsigned char *out) +{ + uint32_t xL, xR; + + /* Make sure the object is initialized */ + assert(self->magic == BLOWFISH_MAGIC); + + /* big endian */ + xL = bytes_to_word(in); + xR = bytes_to_word(in+4); + + inline_encrypt(self, &xL, &xR); + + /* big endian */ + word_to_bytes(xL, out); + word_to_bytes(xR, out+4); +} + +static void Blowfish_decrypt(Blowfish_state *self, const unsigned char *in, unsigned char *out) +{ + uint32_t xL, xR; + + /* Make sure the object is initialized */ + assert(self->magic == BLOWFISH_MAGIC); + + /* big endian */ + xL = bytes_to_word(in); + xR = bytes_to_word(in+4); + + inline_decrypt(self, &xL, &xR); + + /* big endian */ + word_to_bytes(xL, out); + word_to_bytes(xR, out+4); +} + +static void Blowfish_init(Blowfish_state *self, const unsigned char *key, int keylen) +{ + uint32_t word; + int i; + uint32_t xL, xR; + + self->magic = 0; + + if (keylen < 1) { + PyErr_SetString(PyExc_ValueError, "Key cannot be empty"); + return; + } else if (keylen > 56) { + PyErr_SetString(PyExc_ValueError, "Maximum key size is 448 bits"); + return; + } + + /* Initialize the P-array with the digits of Pi, and XOR it with the key */ + word = 0; + for (i = 0; i < 18*4; i++) { + word = (word << 8) | key[i % keylen]; + if ((i & 3) == 3) { + self->P[i >> 2] = initial_P[i >> 2] ^ word; + word = 0; + } + } + + /* Initialize the S-boxes with more digits of Pi */ + memcpy(self->S1, initial_S1, 256*sizeof(uint32_t)); + memcpy(self->S2, initial_S2, 256*sizeof(uint32_t)); + memcpy(self->S3, initial_S3, 256*sizeof(uint32_t)); + memcpy(self->S4, initial_S4, 256*sizeof(uint32_t)); + + /* Stir the subkeys */ + xL = xR = 0; + for (i = 0; i < 18; i += 2) { + inline_encrypt(self, &xL, &xR); + self->P[i] = xL; + self->P[i+1] = xR; + } + for (i = 0; i < 256; i += 2) { + inline_encrypt(self, &xL, &xR); + self->S1[i] = xL; + self->S1[i+1] = xR; + } + for (i = 0; i < 256; i += 2) { + inline_encrypt(self, &xL, &xR); + self->S2[i] = xL; + self->S2[i+1] = xR; + } + for (i = 0; i < 256; i += 2) { + inline_encrypt(self, &xL, &xR); + self->S3[i] = xL; + self->S3[i+1] = xR; + } + for (i = 0; i < 256; i += 2) { + inline_encrypt(self, &xL, &xR); + self->S4[i] = xL; + self->S4[i+1] = xR; + } + + self->magic = BLOWFISH_MAGIC; +} + +#define block_state Blowfish_state +#define block_init Blowfish_init +#define block_encrypt Blowfish_encrypt +#define block_decrypt Blowfish_decrypt + +#include "block_template.c" + +/* vim:set ts=4 sw=4 sts=4 expandtab: */ diff --git a/Cryptography/pycrypto-2.6.1/src/CAST.c b/Cryptography/pycrypto-2.6.1/src/CAST.c new file mode 100644 index 0000000..9ff9862 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/CAST.c @@ -0,0 +1,453 @@ +/* + cast.c -- implementation of CAST-128 (aka CAST5) as described in RFC2144 + + Written in 1997 by Wim Lewis based entirely on RFC2144. + Minor modifications made in 2002 by Andrew M. Kuchling . + + =================================================================== + The contents of this file are dedicated to the public domain. To + the extent that dedication to the public domain is not available, + everyone is granted a worldwide, perpetual, royalty-free, + non-exclusive license to exercise all rights associated with the + contents of this file for any purpose whatsoever. + No rights are reserved. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + =================================================================== + + Consult your local laws for possible restrictions on use, distribution, and + import/export. RFC2144 states that this algorithm "is available worldwide + on a royalty-free basis for commercial and non-commercial uses". + + This code is a pretty straightforward transliteration of the RFC into C. + It has not been optimized much at all: byte-order-independent arithmetic + operations are used where order-dependent pointer ops or unions might be + faster; the code could be rearranged to give the optimizer a better + chance to speed things up; etc. + + This code requires a vaguely ANSI-ish compiler. + + compile -DTEST to include main() which performs the tests + specified in RFC2144 + + Tested with gcc 2.5.8 on i486, i586, i686, hp pa-risc, mc68040, sparc; + also with gcc 2.7.2 and (with minor changes) native Sun compiler on sparc + +*/ + +#include "Python.h" + +#define MODULE_NAME _CAST +#define BLOCK_SIZE 8 +#define KEY_SIZE 0 + +/* adjust these according to your compiler/platform. On some machines + uint32 will have to be a long. It's OK if uint32 is more than 32 bits. */ +typedef unsigned int uint32; +typedef unsigned char uint8; + +/* this struct probably belongs in cast.h */ +typedef struct { + /* masking and rotate keys */ + uint32 Km[16]; + uint8 Kr[16]; + /* number of rounds (depends on original unpadded keylength) */ + int rounds; +} block_state; + +/* these are the eight 32*256 S-boxes */ +#include "cast5.c" + +/* fetch a uint32 from an array of uint8s (with a given offset) */ +#define fetch(ptr, base) (((((( ptr[base]<< 8 ) | ptr[base+1] )<< 8 ) | ptr[base+2] )<< 8 ) | ptr[base+3]) + +/* this is the round function f(D, Km, Kr) */ +static uint32 castfunc(uint32 D, uint32 Kmi, uint8 Kri, int type) +{ + uint32 I, f; + short Ia, Ib, Ic, Id; + + switch(type) { + case 0: + I = (Kmi + D) ; + break; + case 1: + I = (Kmi ^ D) ; + break; + default: + case 2: + I = (Kmi - D) ; + break; + } + + I &= 0xFFFFFFFF; + I = ( I << Kri ) | ( I >> ( 32-Kri ) ); + Ia = ( I >> 24 ) & 0xFF; + Ib = ( I >> 16 ) & 0xFF; + Ic = ( I >> 8 ) & 0xFF; + Id = ( I ) & 0xFF; + + switch(type) { + case 0: + f = ((S1[Ia] ^ S2[Ib]) - S3[Ic]) + S4[Id]; + break; + case 1: + f = ((S1[Ia] - S2[Ib]) + S3[Ic]) ^ S4[Id]; + break; + default: + case 2: + f = ((S1[Ia] + S2[Ib]) ^ S3[Ic]) - S4[Id]; + break; + } + + return f; +} + +/* encrypts/decrypts one block of data according to the key schedule + pointed to by `key'. Encrypts if decrypt=0, otherwise decrypts. */ +static void castcrypt(block_state *key, uint8 *block, int decrypt) +{ + uint32 L, R, tmp, f; + uint32 Kmi; + uint8 Kri; + short functype, round; + + L = fetch(block, 0); + R = fetch(block, 4); + +/* printf("L0 = %08x R0 = %08x\n", L, R); */ + + for(round = 0; round < key->rounds; round ++) { + + if (!decrypt) { + Kmi = key->Km[round]; + Kri = key->Kr[round]; + functype = round % 3; + } else { + Kmi = key->Km[(key->rounds) - round - 1]; + Kri = key->Kr[(key->rounds) - round - 1]; + functype = (((key->rounds) - round - 1) % 3); + } + + f = castfunc(R, Kmi, Kri, functype); + + tmp = L; + L = R; + R = tmp ^ f; + +/* printf("L%d = %08x R%d = %08x\n", round+1, L, round+1, R); */ + } + + block[0] = ( R & 0xFF000000 ) >> 24; + block[1] = ( R & 0x00FF0000 ) >> 16; + block[2] = ( R & 0x0000FF00 ) >> 8; + block[3] = ( R & 0x000000FF ); + block[4] = ( L & 0xFF000000 ) >> 24; + block[5] = ( L & 0x00FF0000 ) >> 16; + block[6] = ( L & 0x0000FF00 ) >> 8; + block[7] = ( L & 0x000000FF ); +} + +/* fetch a uint8 from an array of uint32s */ +#define b(a,n) (((a)[n/4] >> (24-((n&3)*8))) & 0xFF) + +/* key schedule round functions */ + +#define XZRound(T, F, ki1, ki2, ki3, ki4, \ + si11, si12, si13, si14, si15,\ + si25,\ + si35,\ + si45 ) \ + T[0] = F[ki1] ^ S5[si11 ] ^ S6[si12 ] ^ S7[si13 ] ^ S8[si14 ] ^ S7[si15];\ + T[1] = F[ki2] ^ S5[b(T, 0)] ^ S6[b(T,2)] ^ S7[b(T, 1)] ^ S8[b(T,3)] ^ S8[si25];\ + T[2] = F[ki3] ^ S5[b(T, 7)] ^ S6[b(T,6)] ^ S7[b(T, 5)] ^ S8[b(T,4)] ^ S5[si35];\ + T[3] = F[ki4] ^ S5[b(T,10)] ^ S6[b(T,9)] ^ S7[b(T,11)] ^ S8[b(T,8)] ^ S6[si45]; + +#define zxround() XZRound(z, x, 0, 2, 3, 1, \ + b(x,13), b(x,15), b(x,12), b(x,14),\ + b(x, 8), b(x,10), b(x, 9), b(x,11)) + +#define xzround() XZRound(x, z, 2, 0, 1, 3, \ + b(z,5), b(z,7), b(z,4), b(z,6), \ + b(z,0), b(z,2), b(z,1), b(z,3)) + +#define Kround(T, base, F,\ + i11, i12, i13, i14, i15,\ + i21, i22, i23, i24, i25,\ + i31, i32, i33, i34, i35,\ + i41, i42, i43, i44, i45)\ + T[base+0] = S5[b(F,i11)] ^ S6[b(F,i12)] ^ S7[b(F,i13)] ^ S8[b(F,i14)] ^ S5[b(F,i15)];\ + T[base+1] = S5[b(F,i21)] ^ S6[b(F,i22)] ^ S7[b(F,i23)] ^ S8[b(F,i24)] ^ S6[b(F,i25)];\ + T[base+2] = S5[b(F,i31)] ^ S6[b(F,i32)] ^ S7[b(F,i33)] ^ S8[b(F,i34)] ^ S7[b(F,i35)];\ + T[base+3] = S5[b(F,i41)] ^ S6[b(F,i42)] ^ S7[b(F,i43)] ^ S8[b(F,i44)] ^ S8[b(F,i45)]; + +/* generates sixteen 32-bit subkeys based on a 4x32-bit input key; + modifies the input key *in as well. */ +static void schedulekeys_half(uint32 *in, uint32 *keys) +{ + uint32 x[4], z[4]; + + x[0] = in[0]; + x[1] = in[1]; + x[2] = in[2]; + x[3] = in[3]; + + zxround(); + Kround(keys, 0, z, + 8, 9, 7, 6, 2, + 10, 11, 5, 4, 6, + 12, 13, 3, 2, 9, + 14, 15, 1, 0, 12); + xzround(); + Kround(keys, 4, x, + 3, 2, 12, 13, 8, + 1, 0, 14, 15, 13, + 7, 6, 8, 9, 3, + 5, 4, 10, 11, 7); + zxround(); + Kround(keys, 8, z, + 3, 2, 12, 13, 9, + 1, 0, 14, 15, 12, + 7, 6, 8, 9, 2, + 5, 4, 10, 11, 6); + xzround(); + Kround(keys, 12, x, + 8, 9, 7, 6, 3, + 10, 11, 5, 4, 7, + 12, 13, 3, 2, 8, + 14, 15, 1, 0, 13); + + in[0] = x[0]; + in[1] = x[1]; + in[2] = x[2]; + in[3] = x[3]; +} + +/* generates a key schedule from an input key */ +static void castschedulekeys(block_state *schedule, uint8 *key, int keybytes) +{ + uint32 x[4]; + uint8 paddedkey[16]; + uint32 Kr_wide[16]; + int i; + + for(i = 0; i < keybytes; i++) + paddedkey[i] = key[i]; + for( ; i < 16 ; i++) + paddedkey[i] = 0; + + if (keybytes <= 10) + schedule->rounds = 12; + else + schedule->rounds = 16; + + x[0] = fetch(paddedkey, 0); + x[1] = fetch(paddedkey, 4); + x[2] = fetch(paddedkey, 8); + x[3] = fetch(paddedkey, 12); + + schedulekeys_half(x, schedule->Km); + schedulekeys_half(x, Kr_wide); + + for(i = 0; i < 16; i ++) { + /* The Kr[] subkeys are used for 32-bit circular shifts, + so we only need to keep them modulo 32 */ + schedule->Kr[i] = (uint8)(Kr_wide[i] & 0x1F); + } +} + +#ifdef TEST + +/* This performs a variety of encryptions and verifies that the results + match those specified in RFC2144 appendix B. Also verifies that + decryption restores the original data. */ + +#include + +static block_state sched; + +void encrypt(key, keylen, in, out) + uint8 *key; + int keylen; + uint8 *in, *out; +{ + int i; + uint8 k[16]; + + castschedulekeys(&sched, key, keylen); + + for(i = 0; i < 8; i++) + out[i] = in[i]; + castcrypt(&sched, out, 0); +} + +void tst(key, keylen, data, result) + uint8 *key; + int keylen; + uint8 *data, *result; +{ + uint8 d[8]; + int i; + + encrypt(key, keylen, data, d); + + for(i = 0; i < 8; i++) + if (d[i] != result[i]) + break; + + if (i == 8) { + printf("-- test ok (encrypt)\n"); + } else { + for(i = 0; i < 8; i++) + printf(" %02x", d[i]); + printf(" (computed)\n"); + for(i = 0; i < 8; i++) + printf(" %02x", result[i]); + printf(" (expected)\n"); + } + + /* uses key schedule already set up */ + castcrypt(&sched, d, 1); + if (bcmp(d, data, 8)) + printf(" test FAILED (decrypt)\n"); + else + printf(" test ok (decrypt)\n"); + +} + +uint8 key[16] = { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, + 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A }; +uint8 data[8] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }; + +/* expected results of encrypting the above with 128, 80, and 40 + bits of key length */ +uint8 out1[8] = { 0x23, 0x8B, 0x4F, 0xE5, 0x84, 0x7E, 0x44, 0xB2 }; +uint8 out2[8] = { 0xEB, 0x6A, 0x71, 0x1A, 0x2C, 0x02, 0x27, 0x1B }; +uint8 out3[8] = { 0x7A, 0xC8, 0x16, 0xD1, 0x6E, 0x9B, 0x30, 0x2E }; + +/* expected results of the "full maintenance test" */ +uint8 afinal[16] = { 0xEE, 0xA9, 0xD0, 0xA2, 0x49, 0xFD, 0x3B, 0xA6, + 0xB3, 0x43, 0x6F, 0xB8, 0x9D, 0x6D, 0xCA, 0x92 }; +uint8 bfinal[16] = { 0xB2, 0xC9, 0x5E, 0xB0, 0x0C, 0x31, 0xAD, 0x71, + 0x80, 0xAC, 0x05, 0xB8, 0xE8, 0x3D, 0x69, 0x6E }; + +main() +{ + /* Appendix B.1 : Single Plaintext-Key-Ciphertext Sets */ + tst(key, 16, data, out1); + tst(key, 10, data, out2); + tst(key, 5, data, out3); + + /* Appendix B.2 : Full Maintenance Test */ + { + uint8 abuf[16]; + uint8 bbuf[16]; + int i; + + bcopy(key, abuf, 16); + bcopy(key, bbuf, 16); + + printf("\nrunning full maintenance test...\n"); + + for(i = 0; i < 1000000; i++) { + castschedulekeys(&sched, bbuf, 16); + castcrypt(&sched, abuf, 0); + castcrypt(&sched, abuf+8, 0); + + castschedulekeys(&sched, abuf, 16); + castcrypt(&sched, bbuf, 0); + castcrypt(&sched, bbuf+8, 0); + + if (!(i % 10000)) { + fprintf(stdout, "\r%d%% ", i / 10000); + fflush(stdout); + } + } + + printf("\r \r"); + + for(i = 0; i < 16; i ++) + if (abuf[i] != afinal[i] || bbuf[i] != bfinal[i]) + break; + + if(i == 16) { + printf("-- full maintenance test ok\n"); + } else { + for(i = 0; i < 16; i++) + printf(" %02x", abuf[i]); + printf("\n"); + for(i = 0; i < 16; i++) + printf(" %02x", bbuf[i]); + printf("\n"); + } + + printf("running maintenance test in reverse...\n"); + for(i = 0; i < 1000000; i++) { + castschedulekeys(&sched, abuf, 16); + castcrypt(&sched, bbuf+8, 1); + castcrypt(&sched, bbuf, 1); + + castschedulekeys(&sched, bbuf, 16); + castcrypt(&sched, abuf+8, 1); + castcrypt(&sched, abuf, 1); + + if (!(i % 10000)) { + fprintf(stdout, "\r%d%% ", i / 10000); + fflush(stdout); + } + } + + printf("\r \r"); + if (bcmp(abuf, key, 16) || bcmp(bbuf, key, 16)) + printf("-- reverse maintenance test FAILED\n"); + else + printf("-- reverse maintenance test ok\n"); + } +} + +#endif + +static void +block_init(block_state *self, unsigned char *key, int keylength) +{ + /* presumably this will optimize out */ + if (sizeof(uint32) < 4 || sizeof(uint8) != 1) { + PyErr_SetString(PyExc_SystemError, + "CAST module compiled with bad typedefs!"); + } + + /* make sure the key length is within bounds */ + if (keylength < 5 || keylength > 16) { + PyErr_SetString(PyExc_ValueError, "CAST key must be " + "at least 5 bytes and no more than 16 bytes long"); + return; + } + + /* do the actual key schedule setup */ + castschedulekeys(self, key, keylength); +} + +static void +block_encrypt(block_state *self, unsigned char *in, + unsigned char *out) +{ + memcpy(out, in, 8); + castcrypt(self, out, 0); +} + +static void block_decrypt(block_state *self, + unsigned char *in, + unsigned char *out) +{ + memcpy(out, in, 8); + castcrypt(self, out, 1); +} + +#include "block_template.c" diff --git a/Cryptography/pycrypto-2.6.1/src/DES.c b/Cryptography/pycrypto-2.6.1/src/DES.c new file mode 100644 index 0000000..96a9335 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/DES.c @@ -0,0 +1,109 @@ +/* + * DES.c: DES/3DES support for PyCrypto using LibTomCrypt + * + * Written in 2009 by Dwayne C. Litzenberger + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + * + * Country of origin: Canada + */ + +/* Setting this will cause LibTomCrypt to return CRYPT_INVALID_ARG when its + * assert-like LTC_ARGCHK macro fails. */ +#define ARGTYPE 4 + +/* Include the actial DES implementation */ +#include "libtom/tomcrypt_des.c" + +#undef DES /* this is needed because tomcrypt_custom.h defines DES to an empty string */ + +#include +#include "Python.h" + +typedef struct { + symmetric_key sk; +} block_state; + +static void ltcseterr(int rc) +{ + /* error */ + switch (rc) { + case CRYPT_INVALID_ARG: + PyErr_SetString(PyExc_AssertionError, "CRYPT_INVALID_ARG"); + break; + + case CRYPT_INVALID_KEYSIZE: + PyErr_SetString(PyExc_ValueError, "Invalid key size (must be either 16 or 24 bytes long)"); + break; + + case CRYPT_INVALID_ROUNDS: + PyErr_SetString(PyExc_ValueError, "Invalid number of rounds specified"); + break; + + default: + PyErr_Format(PyExc_RuntimeError, + "unexpected run-time error (LTC#%d)", rc); + } +} + +static void block_init(block_state *self, unsigned char *key, int keylen) +{ + int rc; +#ifdef PCT_DES3_MODULE + rc = des3_setup(key, keylen, 0, &self->sk); +#else + rc = des_setup(key, keylen, 0, &self->sk); +#endif + if (rc != CRYPT_OK) { + ltcseterr(rc); + } +} + +static void block_encrypt(block_state *self, unsigned char *in, unsigned char *out) +{ + int rc; +#ifdef PCT_DES3_MODULE + rc = des3_ecb_encrypt(in, out, &self->sk); +#else + rc = des_ecb_encrypt(in, out, &self->sk); +#endif + assert(rc == CRYPT_OK); +} + +static void block_decrypt(block_state *self, unsigned char *in, unsigned char *out) +{ + int rc; +#ifdef PCT_DES3_MODULE + rc = des3_ecb_decrypt(in, out, &self->sk); +#else + rc = des_ecb_decrypt(in, out, &self->sk); +#endif + assert(rc == CRYPT_OK); +} + +#ifdef PCT_DES3_MODULE +# define MODULE_NAME _DES3 /* triple DES */ +# define BLOCK_SIZE 8 /* 64-bit block size */ +# define KEY_SIZE 0 /* variable key size (can be 128 or 192 bits (including parity) */ +#else +# define MODULE_NAME _DES /* single DES */ +# define BLOCK_SIZE 8 /* 64-bit block size */ +# define KEY_SIZE 8 /* 64-bit keys (including parity) */ +#endif +#include "block_template.c" diff --git a/Cryptography/pycrypto-2.6.1/src/DES3.c b/Cryptography/pycrypto-2.6.1/src/DES3.c new file mode 100644 index 0000000..c23de1a --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/DES3.c @@ -0,0 +1,26 @@ +/* + * DES3.c: 3DES support for PyCrypto using LibTomCrypt + * + * Written in 2009 by Dwayne C. Litzenberger + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + * + */ +#define PCT_DES3_MODULE +#include "DES.c" diff --git a/Cryptography/pycrypto-2.6.1/src/MD2.c b/Cryptography/pycrypto-2.6.1/src/MD2.c new file mode 100644 index 0000000..3054fb2 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/MD2.c @@ -0,0 +1,147 @@ + +/* + * md2.c : MD2 hash algorithm. + * + * Part of the Python Cryptography Toolkit + * + * Originally written by: A.M. Kuchling + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + * + */ + + +#include +#include "Python.h" +#include "pycrypto_compat.h" + +#define MODULE_NAME _MD2 +#define DIGEST_SIZE 16 +#define BLOCK_SIZE 64 + +/** + * id-md2 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) rsadsi(113549) + * digestAlgorithm(2) 2 + * } + */ +static const char md2_oid[] = { 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x02 }; + +#define DER_OID ((void*)&md2_oid) +#define DER_OID_SIZE (sizeof md2_oid) + +typedef unsigned char U8; +typedef unsigned int U32; + +typedef struct { + U8 C[16], X[48]; + int count; + U8 buf[16]; +} hash_state; + +static void hash_init (hash_state *ptr) +{ + memset(ptr->X, 0, 48); + memset(ptr->C, 0, 16); + ptr->count=0; +} + +static U8 S[256] = { + 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, + 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, + 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, + 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, + 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, + 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, + 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, + 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, + 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, + 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, + 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, + 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, + 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, + 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, + 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, + 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, + 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, + 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 +}; + +static void +hash_copy(hash_state *src, hash_state *dest) +{ + dest->count=src->count; + memcpy(dest->buf, src->buf, dest->count); + memcpy(dest->X, src->X, 48); + memcpy(dest->C, src->C, 16); +} + + +static void hash_update (hash_state *self, const U8 *buf, U32 len) +{ + U32 L; + while (len) + { + L=(16-self->count) < len ? (16-self->count) : len; + memcpy(self->buf+self->count, buf, L); + self->count+=L; + buf+=L; + len-=L; + if (self->count==16) + { + U8 t; + int i,j; + + self->count=0; + memcpy(self->X+16, self->buf, 16); + t=self->C[15]; + for(i=0; i<16; i++) + { + self->X[32+i]=self->X[16+i]^self->X[i]; + t=self->C[i]^=S[self->buf[i]^t]; + } + + t=0; + for(i=0; i<18; i++) + { + for(j=0; j<48; j++) + t=self->X[j]^=S[t]; + t=(t+i) & 0xFF; + } + } + } +} + +static PyObject * +hash_digest (const hash_state *self) +{ + U8 padding[16]; + U32 padlen; + hash_state temp; + int i; + + memcpy(&temp, self, sizeof(hash_state)); + padlen= 16-self->count; + for(i=0; i +#include "Python.h" +#include "pycrypto_compat.h" + +#define MODULE_NAME _MD4 +#define DIGEST_SIZE 16 +#define BLOCK_SIZE 64 + +typedef unsigned int U32; +typedef unsigned char U8; +#define U32_MAX (U32)4294967295 + +typedef struct { + U32 A,B,C,D, count; + U32 len1, len2; + U8 buf[64]; +} hash_state; + +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) + +/* ROTATE_LEFT rotates x left n bits */ +#define ROL(x, n) (((x) << n) | ((x) >> (32-n) )) + +static void +hash_init (hash_state *ptr) +{ + ptr->A=(U32)0x67452301; + ptr->B=(U32)0xefcdab89; + ptr->C=(U32)0x98badcfe; + ptr->D=(U32)0x10325476; + ptr->count=ptr->len1=ptr->len2=0; +} + +static void +hash_copy(hash_state *src, hash_state *dest) +{ + dest->len1=src->len1; + dest->len2=src->len2; + dest->A=src->A; + dest->B=src->B; + dest->C=src->C; + dest->D=src->D; + dest->count=src->count; + memcpy(dest->buf, src->buf, dest->count); +} + +static void +hash_update (hash_state *self, const U8 *buf, U32 len) +{ + U32 L; + + if ((self->len1+(len<<3))len1) + { + self->len2++; + } + self->len1+=len<< 3; + self->len2+=len>>29; + while (len>0) + { + L=(64-self->count) < len ? (64-self->count) : len; + memcpy(self->buf+self->count, buf, L); + self->count+=L; + buf+=L; + len-=L; + if (self->count==64) + { + U32 X[16], A, B, C, D; + int i,j; + self->count=0; + for(i=j=0; j<16; i+=4, j++) + X[j]=((U32)self->buf[i] + ((U32)self->buf[i+1]<<8) + + ((U32)self->buf[i+2]<<16) + ((U32)self->buf[i+3]<<24)); + + + A=self->A; B=self->B; C=self->C; D=self->D; + +#define function(a,b,c,d,k,s) a=ROL(a+F(b,c,d)+X[k],s); + function(A,B,C,D, 0, 3); + function(D,A,B,C, 1, 7); + function(C,D,A,B, 2,11); + function(B,C,D,A, 3,19); + function(A,B,C,D, 4, 3); + function(D,A,B,C, 5, 7); + function(C,D,A,B, 6,11); + function(B,C,D,A, 7,19); + function(A,B,C,D, 8, 3); + function(D,A,B,C, 9, 7); + function(C,D,A,B,10,11); + function(B,C,D,A,11,19); + function(A,B,C,D,12, 3); + function(D,A,B,C,13, 7); + function(C,D,A,B,14,11); + function(B,C,D,A,15,19); + +#undef function +#define function(a,b,c,d,k,s) a=ROL(a+G(b,c,d)+X[k]+(U32)0x5a827999,s); + function(A,B,C,D, 0, 3); + function(D,A,B,C, 4, 5); + function(C,D,A,B, 8, 9); + function(B,C,D,A,12,13); + function(A,B,C,D, 1, 3); + function(D,A,B,C, 5, 5); + function(C,D,A,B, 9, 9); + function(B,C,D,A,13,13); + function(A,B,C,D, 2, 3); + function(D,A,B,C, 6, 5); + function(C,D,A,B,10, 9); + function(B,C,D,A,14,13); + function(A,B,C,D, 3, 3); + function(D,A,B,C, 7, 5); + function(C,D,A,B,11, 9); + function(B,C,D,A,15,13); + +#undef function +#define function(a,b,c,d,k,s) a=ROL(a+H(b,c,d)+X[k]+(U32)0x6ed9eba1,s); + function(A,B,C,D, 0, 3); + function(D,A,B,C, 8, 9); + function(C,D,A,B, 4,11); + function(B,C,D,A,12,15); + function(A,B,C,D, 2, 3); + function(D,A,B,C,10, 9); + function(C,D,A,B, 6,11); + function(B,C,D,A,14,15); + function(A,B,C,D, 1, 3); + function(D,A,B,C, 9, 9); + function(C,D,A,B, 5,11); + function(B,C,D,A,13,15); + function(A,B,C,D, 3, 3); + function(D,A,B,C,11, 9); + function(C,D,A,B, 7,11); + function(B,C,D,A,15,15); + + self->A+=A; self->B+=B; self->C+=C; self->D+=D; + } + } +} + +static PyObject * +hash_digest (const hash_state *self) +{ + U8 digest[16]; + static U8 s[8]; + U32 padlen, oldlen1, oldlen2; + hash_state temp; + static U8 padding[64] = { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + memcpy(&temp, self, sizeof(hash_state)); + oldlen1=temp.len1; oldlen2=temp.len2; /* Save current length */ + padlen= (56<=self->count) ? 56-self->count+64: 56-self->count; + hash_update(&temp, padding, padlen); + s[0]= oldlen1 & 255; + s[1]=(oldlen1 >> 8) & 255; + s[2]=(oldlen1 >> 16) & 255; + s[3]=(oldlen1 >> 24) & 255; + s[4]= oldlen2 & 255; + s[5]=(oldlen2 >> 8) & 255; + s[6]=(oldlen2 >> 16) & 255; + s[7]=(oldlen2 >> 24) & 255; + hash_update(&temp, s, 8); + + digest[ 0]= temp.A & 255; + digest[ 1]=(temp.A >> 8) & 255; + digest[ 2]=(temp.A >> 16) & 255; + digest[ 3]=(temp.A >> 24) & 255; + digest[ 4]= temp.B & 255; + digest[ 5]=(temp.B >> 8) & 255; + digest[ 6]=(temp.B >> 16) & 255; + digest[ 7]=(temp.B >> 24) & 255; + digest[ 8]= temp.C & 255; + digest[ 9]=(temp.C >> 8) & 255; + digest[10]=(temp.C >> 16) & 255; + digest[11]=(temp.C >> 24) & 255; + digest[12]= temp.D & 255; + digest[13]=(temp.D >> 8) & 255; + digest[14]=(temp.D >> 16) & 255; + digest[15]=(temp.D >> 24) & 255; + + return PyBytes_FromStringAndSize((char *) digest, 16); +} + +#include "hash_template.c" diff --git a/Cryptography/pycrypto-2.6.1/src/RIPEMD160.c b/Cryptography/pycrypto-2.6.1/src/RIPEMD160.c new file mode 100644 index 0000000..9786af8 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/RIPEMD160.c @@ -0,0 +1,427 @@ +/* + * + * RIPEMD160.c : RIPEMD-160 implementation + * + * Written in 2008 by Dwayne C. Litzenberger + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + * + * Country of origin: Canada + * + * This implementation (written in C) is based on an implementation the author + * wrote in Python. + * + * This implementation was written with reference to the RIPEMD-160 + * specification, which is available at: + * http://homes.esat.kuleuven.be/~cosicart/pdf/AB-9601/ + * + * It is also documented in the _Handbook of Applied Cryptography_, as + * Algorithm 9.55. It's on page 30 of the following PDF file: + * http://www.cacr.math.uwaterloo.ca/hac/about/chap9.pdf + * + * The RIPEMD-160 specification doesn't really tell us how to do padding, but + * since RIPEMD-160 is inspired by MD4, you can use the padding algorithm from + * RFC 1320. + * + * According to http://www.users.zetnet.co.uk/hopwood/crypto/scan/md.html: + * "RIPEMD-160 is big-bit-endian, little-byte-endian, and left-justified." + */ + +#include "config.h" +#if HAVE_STDINT_H +# include +#elif defined(__sun) || defined(__sun__) +# include +#else +# error "stdint.h not found" +#endif + +#include +#include +#include "Python.h" +#include "pycrypto_compat.h" + +#define RIPEMD160_DIGEST_SIZE 20 +#define BLOCK_SIZE 64 + +#define RIPEMD160_MAGIC 0x9f19dd68u +typedef struct { + uint32_t magic; + uint32_t h[5]; /* The current hash state */ + uint64_t length; /* Total number of _bits_ (not bytes) added to the + hash. This includes bits that have been buffered + but not not fed through the compression function yet. */ + union { + uint32_t w[16]; + uint8_t b[64]; + } buf; + uint8_t bufpos; /* number of bytes currently in the buffer */ +} ripemd160_state; + + +/* cyclic left-shift the 32-bit word n left by s bits */ +#define ROL(s, n) (((n) << (s)) | ((n) >> (32-(s)))) + +/* Initial values for the chaining variables. + * This is just 0123456789ABCDEFFEDCBA9876543210F0E1D2C3 in little-endian. */ +static const uint32_t initial_h[5] = { 0x67452301u, 0xEFCDAB89u, 0x98BADCFEu, 0x10325476u, 0xC3D2E1F0u }; + +/* Ordering of message words. Based on the permutations rho(i) and pi(i), defined as follows: + * + * rho(i) := { 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8 }[i] 0 <= i <= 15 + * + * pi(i) := 9*i + 5 (mod 16) + * + * Line | Round 1 | Round 2 | Round 3 | Round 4 | Round 5 + * -------+-----------+-----------+-----------+-----------+----------- + * left | id | rho | rho^2 | rho^3 | rho^4 + * right | pi | rho pi | rho^2 pi | rho^3 pi | rho^4 pi + */ + +/* Left line */ +static const uint8_t RL[5][16] = { + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, /* Round 1: id */ + { 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8 }, /* Round 2: rho */ + { 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12 }, /* Round 3: rho^2 */ + { 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2 }, /* Round 4: rho^3 */ + { 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 } /* Round 5: rho^4 */ +}; + +/* Right line */ +static const uint8_t RR[5][16] = { + { 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12 }, /* Round 1: pi */ + { 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2 }, /* Round 2: rho pi */ + { 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13 }, /* Round 3: rho^2 pi */ + { 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14 }, /* Round 4: rho^3 pi */ + { 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 } /* Round 5: rho^4 pi */ +}; + +/* + * Shifts - Since we don't actually re-order the message words according to + * the permutations above (we could, but it would be slower), these tables + * come with the permutations pre-applied. + */ + +/* Shifts, left line */ +static const uint8_t SL[5][16] = { + { 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8 }, /* Round 1 */ + { 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12 }, /* Round 2 */ + { 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5 }, /* Round 3 */ + { 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12 }, /* Round 4 */ + { 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 } /* Round 5 */ +}; + +/* Shifts, right line */ +static const uint8_t SR[5][16] = { + { 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6 }, /* Round 1 */ + { 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11 }, /* Round 2 */ + { 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5 }, /* Round 3 */ + { 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8 }, /* Round 4 */ + { 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 } /* Round 5 */ +}; + +/* Boolean functions */ + +#define F1(x, y, z) ((x) ^ (y) ^ (z)) +#define F2(x, y, z) (((x) & (y)) | (~(x) & (z))) +#define F3(x, y, z) (((x) | ~(y)) ^ (z)) +#define F4(x, y, z) (((x) & (z)) | ((y) & ~(z))) +#define F5(x, y, z) ((x) ^ ((y) | ~(z))) + +/* Round constants, left line */ +static const uint32_t KL[5] = { + 0x00000000u, /* Round 1: 0 */ + 0x5A827999u, /* Round 2: floor(2**30 * sqrt(2)) */ + 0x6ED9EBA1u, /* Round 3: floor(2**30 * sqrt(3)) */ + 0x8F1BBCDCu, /* Round 4: floor(2**30 * sqrt(5)) */ + 0xA953FD4Eu /* Round 5: floor(2**30 * sqrt(7)) */ +}; + +/* Round constants, right line */ +static const uint32_t KR[5] = { + 0x50A28BE6u, /* Round 1: floor(2**30 * cubert(2)) */ + 0x5C4DD124u, /* Round 2: floor(2**30 * cubert(3)) */ + 0x6D703EF3u, /* Round 3: floor(2**30 * cubert(5)) */ + 0x7A6D76E9u, /* Round 4: floor(2**30 * cubert(7)) */ + 0x00000000u /* Round 5: 0 */ +}; + +static void ripemd160_init(ripemd160_state *self) +{ + + memcpy(self->h, initial_h, RIPEMD160_DIGEST_SIZE); + memset(&self->buf, 0, sizeof(self->buf)); + self->length = 0; + self->bufpos = 0; + self->magic = RIPEMD160_MAGIC; +} + +/* NB: This is not currently called in the hash object's destructor. */ +static void ripemd160_wipe(ripemd160_state *self) +{ + memset(self, 0, sizeof(ripemd160_state)); + self->magic = 0; +} + +static inline void byteswap32(uint32_t *v) +{ + union { uint32_t w; uint8_t b[4]; } x, y; + + x.w = *v; + y.b[0] = x.b[3]; + y.b[1] = x.b[2]; + y.b[2] = x.b[1]; + y.b[3] = x.b[0]; + *v = y.w; + + /* Wipe temporary variables */ + x.w = y.w = 0; +} + +static inline void byteswap_digest(uint32_t *p) +{ + unsigned int i; + + for (i = 0; i < 4; i++) { + byteswap32(p++); + byteswap32(p++); + byteswap32(p++); + byteswap32(p++); + } +} + +/* The RIPEMD160 compression function. Operates on self->buf */ +static void ripemd160_compress(ripemd160_state *self) +{ + uint8_t w, round; + uint32_t T; + uint32_t AL, BL, CL, DL, EL; /* left line */ + uint32_t AR, BR, CR, DR, ER; /* right line */ + + /* Sanity check */ + assert(self->magic == RIPEMD160_MAGIC); + assert(self->bufpos == 64); + if (self->magic != RIPEMD160_MAGIC || self->bufpos != 64) { + ripemd160_wipe(self); + return; /* error */ + } + + /* Byte-swap the buffer if we're on a big-endian machine */ +#ifdef PCT_BIG_ENDIAN + byteswap_digest(self->buf.w); +#endif + + /* Load the left and right lines with the initial state */ + AL = AR = self->h[0]; + BL = BR = self->h[1]; + CL = CR = self->h[2]; + DL = DR = self->h[3]; + EL = ER = self->h[4]; + + /* Round 1 */ + round = 0; + for (w = 0; w < 16; w++) { /* left line */ + T = ROL(SL[round][w], AL + F1(BL, CL, DL) + self->buf.w[RL[round][w]] + KL[round]) + EL; + AL = EL; EL = DL; DL = ROL(10, CL); CL = BL; BL = T; + } + for (w = 0; w < 16; w++) { /* right line */ + T = ROL(SR[round][w], AR + F5(BR, CR, DR) + self->buf.w[RR[round][w]] + KR[round]) + ER; + AR = ER; ER = DR; DR = ROL(10, CR); CR = BR; BR = T; + } + + /* Round 2 */ + round++; + for (w = 0; w < 16; w++) { /* left line */ + T = ROL(SL[round][w], AL + F2(BL, CL, DL) + self->buf.w[RL[round][w]] + KL[round]) + EL; + AL = EL; EL = DL; DL = ROL(10, CL); CL = BL; BL = T; + } + for (w = 0; w < 16; w++) { /* right line */ + T = ROL(SR[round][w], AR + F4(BR, CR, DR) + self->buf.w[RR[round][w]] + KR[round]) + ER; + AR = ER; ER = DR; DR = ROL(10, CR); CR = BR; BR = T; + } + + /* Round 3 */ + round++; + for (w = 0; w < 16; w++) { /* left line */ + T = ROL(SL[round][w], AL + F3(BL, CL, DL) + self->buf.w[RL[round][w]] + KL[round]) + EL; + AL = EL; EL = DL; DL = ROL(10, CL); CL = BL; BL = T; + } + for (w = 0; w < 16; w++) { /* right line */ + T = ROL(SR[round][w], AR + F3(BR, CR, DR) + self->buf.w[RR[round][w]] + KR[round]) + ER; + AR = ER; ER = DR; DR = ROL(10, CR); CR = BR; BR = T; + } + + /* Round 4 */ + round++; + for (w = 0; w < 16; w++) { /* left line */ + T = ROL(SL[round][w], AL + F4(BL, CL, DL) + self->buf.w[RL[round][w]] + KL[round]) + EL; + AL = EL; EL = DL; DL = ROL(10, CL); CL = BL; BL = T; + } + for (w = 0; w < 16; w++) { /* right line */ + T = ROL(SR[round][w], AR + F2(BR, CR, DR) + self->buf.w[RR[round][w]] + KR[round]) + ER; + AR = ER; ER = DR; DR = ROL(10, CR); CR = BR; BR = T; + } + + /* Round 5 */ + round++; + for (w = 0; w < 16; w++) { /* left line */ + T = ROL(SL[round][w], AL + F5(BL, CL, DL) + self->buf.w[RL[round][w]] + KL[round]) + EL; + AL = EL; EL = DL; DL = ROL(10, CL); CL = BL; BL = T; + } + for (w = 0; w < 16; w++) { /* right line */ + T = ROL(SR[round][w], AR + F1(BR, CR, DR) + self->buf.w[RR[round][w]] + KR[round]) + ER; + AR = ER; ER = DR; DR = ROL(10, CR); CR = BR; BR = T; + } + + /* Final mixing stage */ + T = self->h[1] + CL + DR; + self->h[1] = self->h[2] + DL + ER; + self->h[2] = self->h[3] + EL + AR; + self->h[3] = self->h[4] + AL + BR; + self->h[4] = self->h[0] + BL + CR; + self->h[0] = T; + + /* Clear the buffer and wipe the temporary variables */ + T = AL = BL = CL = DL = EL = AR = BR = CR = DR = ER = 0; + memset(&self->buf, 0, sizeof(self->buf)); + self->bufpos = 0; +} + +static void ripemd160_update(ripemd160_state *self, const unsigned char *p, int length) +{ + unsigned int bytes_needed; + + /* Some assertions */ + assert(self->magic == RIPEMD160_MAGIC); + assert(p != NULL && length >= 0); + + /* NDEBUG is probably defined, so check for invalid inputs explicitly. */ + if (self->magic != RIPEMD160_MAGIC || p == NULL || length < 0) { + /* error */ + ripemd160_wipe(self); + return; + } + + /* We never leave a full buffer */ + assert(self->bufpos < 64); + + while (length > 0) { + /* Figure out how many bytes we need to fill the internal buffer. */ + bytes_needed = 64 - self->bufpos; + + if ((unsigned int) length >= bytes_needed) { + /* We have enough bytes, so copy them into the internal buffer and run + * the compression function. */ + memcpy(&self->buf.b[self->bufpos], p, bytes_needed); + self->bufpos += bytes_needed; + self->length += bytes_needed << 3; /* length is in bits */ + p += bytes_needed; + ripemd160_compress(self); + length -= bytes_needed; + continue; + } + + /* We do not have enough bytes to fill the internal buffer. + * Copy what's there and return. */ + memcpy(&self->buf.b[self->bufpos], p, length); + self->bufpos += length; + self->length += length << 3; /* length is in bits */ + return; + } +} + +static void ripemd160_copy(const ripemd160_state *source, ripemd160_state *dest) +{ + memcpy(dest, source, sizeof(ripemd160_state)); +} + +static int ripemd160_digest(const ripemd160_state *self, unsigned char *out) +{ + ripemd160_state tmp; + + assert(self->magic == RIPEMD160_MAGIC); + assert(out != NULL); + if (self->magic != RIPEMD160_MAGIC || out == NULL) { + return 0; + } + + ripemd160_copy(self, &tmp); + + /* Append the padding */ + tmp.buf.b[tmp.bufpos++] = 0x80; + + if (tmp.bufpos > 56) { + tmp.bufpos = 64; + ripemd160_compress(&tmp); + } + + /* Append the length */ + tmp.buf.w[14] = (uint32_t) (tmp.length & 0xFFFFffffu); + tmp.buf.w[15] = (uint32_t) ((tmp.length >> 32) & 0xFFFFffffu); +#ifdef PCT_BIG_ENDIAN + byteswap32(&tmp.buf.w[14]); + byteswap32(&tmp.buf.w[15]); +#endif + tmp.bufpos = 64; + ripemd160_compress(&tmp); + + /* Copy the final state into the output buffer */ +#ifdef PCT_BIG_ENDIAN + byteswap_digest(tmp.h); +#endif + memcpy(out, &tmp.h, RIPEMD160_DIGEST_SIZE); + + if (tmp.magic == RIPEMD160_MAGIC) { + /* success */ + ripemd160_wipe(&tmp); + return 1; + } else { + /* error */ + ripemd160_wipe(&tmp); + memset(out, 0, RIPEMD160_DIGEST_SIZE); + return 0; + } +} + +/* Template definitions */ +#define MODULE_NAME _RIPEMD160 +#define DIGEST_SIZE RIPEMD160_DIGEST_SIZE +#define hash_state ripemd160_state +#define hash_init ripemd160_init +#define hash_update ripemd160_update +#define hash_copy ripemd160_copy +static PyObject *hash_digest(hash_state *self) +{ + char buf[DIGEST_SIZE]; + PyObject *retval; + + if (ripemd160_digest(self, (unsigned char *) buf)) { + retval = PyBytes_FromStringAndSize(buf, DIGEST_SIZE); + } else { + PyErr_SetString(PyExc_RuntimeError, "Internal error occurred while executing ripemd160_digest"); + retval = NULL; + } + + memset(buf, 0, DIGEST_SIZE); + return retval; +} + +#include "hash_template.c" + +/* vim:set ts=4 sw=4 sts=4 expandtab: */ diff --git a/Cryptography/pycrypto-2.6.1/src/SHA224.c b/Cryptography/pycrypto-2.6.1/src/SHA224.c new file mode 100644 index 0000000..ca70fbd --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/SHA224.c @@ -0,0 +1,74 @@ +/* + * An implementation of the SHA-224 hash function. + * + * The Federal Information Processing Standards (FIPS) Specification + * can be found here (FIPS 180-3): + * http://csrc.nist.gov/publications/PubsFIPS.html + * + * Written in 2010 by Lorenz Quack + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + * + */ + +#define MODULE_NAME _SHA224 +#define DIGEST_SIZE (224/8) +#define BLOCK_SIZE (512/8) +#define WORD_SIZE 4 +#define SCHEDULE_SIZE 64 + +#include "hash_SHA2.h" + +/* Initial Values H */ +static const sha2_word_t H[8] = { + 0xc1059ed8, + 0x367cd507, + 0x3070dd17, + 0xf70e5939, + 0xffc00b31, + 0x68581511, + 0x64f98fa7, + 0xbefa4fa4 +}; + +/* the Constants K */ +static const sha2_word_t K[SCHEDULE_SIZE] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, + 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, + 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, + 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, + 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, + 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, + 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, + 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, + 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, + 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + +/* SHA-224 specific functions */ +#define Sigma0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) +#define Sigma1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) +#define Gamma0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) +#define Gamma1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) + +#include "hash_SHA2_template.c" + diff --git a/Cryptography/pycrypto-2.6.1/src/SHA256.c b/Cryptography/pycrypto-2.6.1/src/SHA256.c new file mode 100644 index 0000000..61a2d74 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/SHA256.c @@ -0,0 +1,73 @@ +/* + * An implementation of the SHA-256 hash function. + * + * The Federal Information Processing Standards (FIPS) Specification + * can be found here (FIPS 180-3): + * http://csrc.nist.gov/publications/PubsFIPS.html + * + * Written in 2010 by Lorenz Quack + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + * + */ +#define MODULE_NAME _SHA256 +#define DIGEST_SIZE (256/8) +#define BLOCK_SIZE (512/8) +#define WORD_SIZE 4 +#define SCHEDULE_SIZE 64 + +#include "hash_SHA2.h" + +/* Initial Values H */ +static const sha2_word_t H[8] = { + 0x6a09e667, + 0xbb67ae85, + 0x3c6ef372, + 0xa54ff53a, + 0x510e527f, + 0x9b05688c, + 0x1f83d9ab, + 0x5be0cd19 +}; + +/* the Constants K */ +static const sha2_word_t K[SCHEDULE_SIZE] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, + 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, + 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, + 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, + 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, + 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, + 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, + 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, + 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, + 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + +/* SHA-256 specific functions */ +#define Sigma0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) +#define Sigma1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) +#define Gamma0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) +#define Gamma1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) + +#include "hash_SHA2_template.c" + diff --git a/Cryptography/pycrypto-2.6.1/src/SHA384.c b/Cryptography/pycrypto-2.6.1/src/SHA384.c new file mode 100644 index 0000000..05dfe25 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/SHA384.c @@ -0,0 +1,80 @@ +/* + * An implementation of the SHA-384 hash function. + * + * The Federal Information Processing Standards (FIPS) Specification + * can be found here (FIPS 180-3): + * http://csrc.nist.gov/publications/PubsFIPS.html + * + * Written in 2010 by Lorenz Quack + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + * + */ + +#define MODULE_NAME _SHA384 +#define DIGEST_SIZE (384/8) +#define BLOCK_SIZE (1024/8) +#define WORD_SIZE 8 +#define SCHEDULE_SIZE 80 + +#include "hash_SHA2.h" + +/* Initial Values H */ +static const sha2_word_t H[8] = { + 0xcbbb9d5dc1059ed8, + 0x629a292a367cd507, + 0x9159015a3070dd17, + 0x152fecd8f70e5939, + 0x67332667ffc00b31, + 0x8eb44a8768581511, + 0xdb0c2e0d64f98fa7, + 0x47b5481dbefa4fa4 +}; + +/* the Constants K */ +static const sha2_word_t K[SCHEDULE_SIZE] = { + 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, + 0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, + 0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, + 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694, + 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, + 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, + 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, + 0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70, + 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, + 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b, + 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, + 0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, + 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, + 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, + 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, + 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, + 0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, + 0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, + 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c, + 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817 +}; + +/* SHA-384 specific functions */ +#define Sigma0(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39)) +#define Sigma1(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41)) +#define Gamma0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7)) +#define Gamma1(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6)) + +#include "hash_SHA2_template.c" diff --git a/Cryptography/pycrypto-2.6.1/src/SHA512.c b/Cryptography/pycrypto-2.6.1/src/SHA512.c new file mode 100644 index 0000000..3370e8e --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/SHA512.c @@ -0,0 +1,80 @@ +/* + * An implementation of the SHA-512 hash function. + * + * The Federal Information Processing Standards (FIPS) Specification + * can be found here (FIPS 180-3): + * http://csrc.nist.gov/publications/PubsFIPS.html + * + * Written in 2010 by Lorenz Quack + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + * + */ + +#define MODULE_NAME _SHA512 +#define DIGEST_SIZE (512/8) +#define BLOCK_SIZE (1024/8) +#define WORD_SIZE 8 +#define SCHEDULE_SIZE 80 + +#include "hash_SHA2.h" + +/* Initial Values H */ +static const sha2_word_t H[8] = { + 0x6a09e667f3bcc908, + 0xbb67ae8584caa73b, + 0x3c6ef372fe94f82b, + 0xa54ff53a5f1d36f1, + 0x510e527fade682d1, + 0x9b05688c2b3e6c1f, + 0x1f83d9abfb41bd6b, + 0x5be0cd19137e2179 +}; + +/* the Constants K */ +static const sha2_word_t K[SCHEDULE_SIZE] = { + 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, + 0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, + 0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, + 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694, + 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, + 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, + 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, + 0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70, + 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, + 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b, + 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, + 0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, + 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, + 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, + 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, + 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, + 0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, + 0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, + 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c, + 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817 +}; + +/* SHA-512 specific functions */ +#define Sigma0(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39)) +#define Sigma1(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41)) +#define Gamma0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7)) +#define Gamma1(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6)) + +#include "hash_SHA2_template.c" diff --git a/Cryptography/pycrypto-2.6.1/src/XOR.c b/Cryptography/pycrypto-2.6.1/src/XOR.c new file mode 100644 index 0000000..985e94f --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/XOR.c @@ -0,0 +1,76 @@ +/* + * xor.c : Source for the trivial cipher which XORs the message with the key. + * The key can be up to 32 bytes long. + * + * Part of the Python Cryptography Toolkit + * + * Contributed by Barry Warsaw and others. + * + * ======================================================================= + * The contents of this file are dedicated to the public domain. To the + * extent that dedication to the public domain is not available, everyone + * is granted a worldwide, perpetual, royalty-free, non-exclusive license + * to exercise all rights associated with the contents of this file for + * any purpose whatsoever. No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * ======================================================================= + */ + +#include "Python.h" + +#define MODULE_NAME _XOR +#define BLOCK_SIZE 1 +#define KEY_SIZE 0 + +#define MAX_KEY_SIZE 32 + +typedef struct +{ + unsigned char key[MAX_KEY_SIZE]; + int keylen, last_pos; +} stream_state; + +static void +stream_init(stream_state *self, unsigned char *key, int len) +{ + int i; + + if (len > MAX_KEY_SIZE) + { + PyErr_Format(PyExc_ValueError, + "XOR key must be no longer than %d bytes", + MAX_KEY_SIZE); + return; + } + self->keylen = len; + self->last_pos = 0; + + for(i=0; ikey[i] = key[i]; + } +} + +/* Encryption and decryption are symmetric */ +#define stream_decrypt stream_encrypt + +static void stream_encrypt(stream_state *self, unsigned char *block, + int len) +{ + int i, j = self->last_pos; + for(i=0; ikeylen) + { + block[i] ^= self->key[j]; + } + self->last_pos = j; +} + +#include "stream_template.c" diff --git a/Cryptography/pycrypto-2.6.1/src/_counter.c b/Cryptography/pycrypto-2.6.1/src/_counter.c new file mode 100644 index 0000000..9b396e4 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/_counter.c @@ -0,0 +1,584 @@ +/* + * _counter.c: Fast counter for use with CTR-mode ciphers + * + * Written in 2008 by Dwayne C. Litzenberger + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + */ + +#include +#include +#include +#include "Python.h" +#include "pycrypto_compat.h" +#include "_counter.h" + +#ifndef IS_PY3K +#define PyLong_FromLong PyInt_FromLong +#endif + +/* NB: This can be called multiple times for a given object, via the __init__ method. Be careful. */ +static int +CounterObject_init(PCT_CounterObject *self, PyObject *args, PyObject *kwargs) +{ +#ifdef IS_PY3K + PyBytesObject *prefix=NULL, *suffix=NULL, *initval=NULL; +#else + PyStringObject *prefix=NULL, *suffix=NULL, *initval=NULL; +#endif + int allow_wraparound = 0; + int disable_shortcut = 0; + Py_ssize_t size; + + static char *kwlist[] = {"prefix", "suffix", "initval", "allow_wraparound", "disable_shortcut", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "SSS|ii", kwlist, &prefix, &suffix, &initval, &allow_wraparound, &disable_shortcut)) + return -1; + + /* Check string size and set nbytes */ + size = PyBytes_GET_SIZE(initval); + if (size < 1) { + PyErr_SetString(PyExc_ValueError, "initval length too small (must be >= 1 byte)"); + return -1; + } else if (size > 0xffff) { + PyErr_SetString(PyExc_ValueError, "initval length too large (must be <= 65535 bytes)"); + return -1; + } + self->nbytes = (uint16_t) size; + + /* Check prefix length */ + size = PyBytes_GET_SIZE(prefix); + assert(size >= 0); + if (size > 0xffff) { + PyErr_SetString(PyExc_ValueError, "prefix length too large (must be <= 65535 bytes)"); + return -1; + } + + /* Check suffix length */ + size = PyBytes_GET_SIZE(suffix); + assert(size >= 0); + if (size > 0xffff) { + PyErr_SetString(PyExc_ValueError, "suffix length too large (must be <= 65535 bytes)"); + return -1; + } + + /* Set prefix, being careful to properly discard any old reference */ + Py_CLEAR(self->prefix); + Py_INCREF(prefix); + self->prefix = prefix; + + /* Set prefix, being careful to properly discard any old reference */ + Py_CLEAR(self->suffix); + Py_INCREF(suffix); + self->suffix = suffix; + + /* Free old buffer (if any) */ + if (self->val) { + PyMem_Free(self->val); + self->val = self->p = NULL; + self->buf_size = 0; + } + + /* Allocate new buffer */ + /* buf_size won't overflow because the length of each string will always be <= 0xffff */ + self->buf_size = PyBytes_GET_SIZE(prefix) + PyBytes_GET_SIZE(suffix) + self->nbytes; + self->val = self->p = PyMem_Malloc(self->buf_size); + if (self->val == NULL) { + self->buf_size = 0; + return -1; + } + self->p = self->val + PyBytes_GET_SIZE(prefix); + + /* Sanity-check pointers */ + assert(self->val <= self->p); + assert(self->p + self->nbytes <= self->val + self->buf_size); + assert(self->val + PyBytes_GET_SIZE(self->prefix) == self->p); + assert(PyBytes_GET_SIZE(self->prefix) + self->nbytes + PyBytes_GET_SIZE(self->suffix) == self->buf_size); + + /* Copy the prefix, suffix, and initial value into the buffer. */ + memcpy(self->val, PyBytes_AS_STRING(prefix), PyBytes_GET_SIZE(prefix)); + memcpy(self->p, PyBytes_AS_STRING(initval), self->nbytes); + memcpy(self->p + self->nbytes, PyBytes_AS_STRING(suffix), PyBytes_GET_SIZE(suffix)); + + /* Set shortcut_disabled and allow_wraparound */ + self->shortcut_disabled = disable_shortcut; + self->allow_wraparound = allow_wraparound; + + /* Clear the carry flag */ + self->carry = 0; + + return 0; +} + +static void +CounterObject_dealloc(PCT_CounterObject *self) +{ + /* Free the buffer */ + if (self->val) { + memset(self->val, 0, self->buf_size); /* wipe the buffer before freeing it */ + PyMem_Free(self->val); + self->val = self->p = NULL; + self->buf_size = 0; + } + + /* Deallocate the prefix and suffix, if they are present. */ + Py_CLEAR(self->prefix); + Py_CLEAR(self->suffix); + + /* Free this object */ + PyObject_Del(self); +} + +static inline PyObject * +_CounterObject_next_value(PCT_CounterObject *self, int little_endian) +{ + unsigned int i; + int increment; + uint8_t *p; + PyObject *eight = NULL; + PyObject *ch = NULL; + PyObject *y = NULL; + PyObject *x = NULL; + + if (self->carry && !self->allow_wraparound) { + PyErr_SetString(PyExc_OverflowError, + "counter wrapped without allow_wraparound"); + goto err_out; + } + + eight = PyLong_FromLong(8); + if (!eight) + goto err_out; + + /* Make a new Python long integer */ + x = PyLong_FromUnsignedLong(0); + if (!x) + goto err_out; + + if (little_endian) { + /* little endian */ + p = self->p + self->nbytes - 1; + increment = -1; + } else { + /* big endian */ + p = self->p; + increment = 1; + } + for (i = 0; i < self->nbytes; i++, p += increment) { + /* Sanity check pointer */ + assert(self->p <= p); + assert(p < self->p + self->nbytes); + + /* ch = ord(p) */ + Py_CLEAR(ch); /* delete old ch */ + ch = PyLong_FromLong((long) *p); + if (!ch) + goto err_out; + + /* y = x << 8 */ + Py_CLEAR(y); /* delete old y */ + y = PyNumber_Lshift(x, eight); + if (!y) + goto err_out; + + /* x = y | ch */ + Py_CLEAR(x); /* delete old x */ + x = PyNumber_Or(y, ch); + } + + Py_CLEAR(eight); + Py_CLEAR(ch); + Py_CLEAR(y); + return x; + +err_out: + Py_CLEAR(eight); + Py_CLEAR(ch); + Py_CLEAR(y); + Py_CLEAR(x); + return NULL; +} + +static PyObject * +CounterLEObject_next_value(PCT_CounterObject *self, PyObject *args) +{ + return _CounterObject_next_value(self, 1); +} + +static PyObject * +CounterBEObject_next_value(PCT_CounterObject *self, PyObject *args) +{ + return _CounterObject_next_value(self, 0); +} + +static void +CounterLEObject_increment(PCT_CounterObject *self) +{ + unsigned int i, tmp, carry; + uint8_t *p; + + assert(sizeof(i) >= sizeof(self->nbytes)); + + carry = 1; + p = self->p; + for (i = 0; i < self->nbytes; i++, p++) { + /* Sanity check pointer */ + assert(self->p <= p); + assert(p < self->p + self->nbytes); + + tmp = *p + carry; + carry = tmp >> 8; /* This will only ever be 0 or 1 */ + *p = tmp & 0xff; + } + self->carry = carry; +} + +static void +CounterBEObject_increment(PCT_CounterObject *self) +{ + unsigned int i, tmp, carry; + uint8_t *p; + + assert(sizeof(i) >= sizeof(self->nbytes)); + + carry = 1; + p = self->p + self->nbytes-1; + for (i = 0; i < self->nbytes; i++, p--) { + /* Sanity check pointer */ + assert(self->p <= p); + assert(p < self->p + self->nbytes); + + tmp = *p + carry; + carry = tmp >> 8; /* This will only ever be 0 or 1 */ + *p = tmp & 0xff; + } + self->carry = carry; +} + +static PyObject * +CounterObject_call(PCT_CounterObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *retval; + + if (self->carry && !self->allow_wraparound) { + PyErr_SetString(PyExc_OverflowError, + "counter wrapped without allow_wraparound"); + return NULL; + } + + retval = (PyObject *)PyBytes_FromStringAndSize((const char *)self->val, self->buf_size); + + self->inc_func(self); + + return retval; +} + +static PyMethodDef CounterLEObject_methods[] = { + {"next_value", (PyCFunction)CounterLEObject_next_value, METH_VARARGS, + "Get the numerical value of next value of the counter."}, + + {NULL} /* sentinel */ +}; + +static PyMethodDef CounterBEObject_methods[] = { + {"next_value", (PyCFunction)CounterBEObject_next_value, METH_VARARGS, + "Get the numerical value of next value of the counter."}, + + {NULL} /* sentinel */ +}; + +/* Python 2.1 doesn't allow us to assign methods or attributes to an object, + * so we hack it here. */ + +static PyObject * +#ifdef IS_PY3K +CounterLEObject_getattro(PyObject *s, PyObject *attr) +#else +CounterLEObject_getattr(PyObject *s, char *name) +#endif +{ + PCT_CounterObject *self = (PCT_CounterObject *)s; +#ifdef IS_PY3K + if (!PyUnicode_Check(attr)) + goto generic; + + if (PyUnicode_CompareWithASCIIString(attr, "carry") == 0) { +#else + if (strcmp(name, "carry") == 0) { +#endif + return PyLong_FromLong((long)self->carry); +#ifdef IS_PY3K + } else if (!self->shortcut_disabled && PyUnicode_CompareWithASCIIString(attr, "__PCT_CTR_SHORTCUT__") == 0) { +#else + } else if (!self->shortcut_disabled && strcmp(name, "__PCT_CTR_SHORTCUT__") == 0) { +#endif + /* Shortcut hack - See block_template.c */ + Py_INCREF(Py_True); + return Py_True; + } +#ifdef IS_PY3K + generic: + return PyObject_GenericGetAttr(s, attr); +#else + return Py_FindMethod(CounterLEObject_methods, (PyObject *)self, name); +#endif +} + +static PyObject * +#ifdef IS_PY3K +CounterBEObject_getattro(PyObject *s, PyObject *attr) +#else +CounterBEObject_getattr(PyObject *s, char *name) +#endif +{ + PCT_CounterObject *self = (PCT_CounterObject *)s; +#ifdef IS_PY3K + if (!PyUnicode_Check(attr)) + goto generic; + + if (PyUnicode_CompareWithASCIIString(attr, "carry") == 0) { +#else + if (strcmp(name, "carry") == 0) { +#endif + return PyLong_FromLong((long)self->carry); +#ifdef IS_PY3K + } else if (!self->shortcut_disabled && PyUnicode_CompareWithASCIIString(attr, "__PCT_CTR_SHORTCUT__") == 0) { +#else + } else if (!self->shortcut_disabled && strcmp(name, "__PCT_CTR_SHORTCUT__") == 0) { +#endif + /* Shortcut hack - See block_template.c */ + Py_INCREF(Py_True); + return Py_True; + } +#ifdef IS_PY3K + generic: + return PyObject_GenericGetAttr(s, attr); +#else + return Py_FindMethod(CounterBEObject_methods, (PyObject *)self, name); +#endif +} + +static PyTypeObject +my_CounterLEType = { +#ifdef IS_PY3K + PyVarObject_HEAD_INIT(NULL, 0) /* deferred type init for compilation on Windows, type will be filled in at runtime */ +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + "_counter.CounterLE", /* tp_name */ + sizeof(PCT_CounterObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + /* methods */ + (destructor)CounterObject_dealloc, /* tp_dealloc */ + 0, /* tp_print */ +#ifdef IS_PY3K + 0, /* tp_getattr */ +#else + CounterLEObject_getattr, /* tp_getattr */ +#endif + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + (ternaryfunc)CounterObject_call, /* tp_call */ + 0, /* tp_str */ +#ifdef IS_PY3K + CounterLEObject_getattro, /* tp_getattro */ +#else + 0, /* tp_getattro */ +#endif + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + "Counter (little endian)", /* tp_doc */ +#ifdef IS_PY3K + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + CounterLEObject_methods, /*tp_methods*/ +#endif +}; + +static PyTypeObject +my_CounterBEType = { +#ifdef IS_PY3K + PyVarObject_HEAD_INIT(NULL, 0) /* deferred type init for compilation on Windows, type will be filled in at runtime */ +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + "_counter.CounterBE", /* tp_name */ + sizeof(PCT_CounterObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)CounterObject_dealloc, /* tp_dealloc */ + 0, /* tp_print */ +#ifdef IS_PY3K + 0, /* tp_getattr */ +#else + CounterBEObject_getattr, /* tp_getattr */ +#endif + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + (ternaryfunc)CounterObject_call, /* tp_call */ + 0, /* tp_str */ +#ifdef IS_PY3K + CounterBEObject_getattro, /* tp_getattro */ +#else + 0, /* tp_getattro */ +#endif + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + "Counter (big endian)", /* tp_doc */ +#ifdef IS_PY3K + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + CounterBEObject_methods, /*tp_methods*/ +#endif +}; + +/* + * Python 2.1 doesn't seem to allow a C equivalent of the __init__ method, so + * we use the module-level functions newLE and newBE here. + */ +static PyObject * +CounterLE_new(PyObject *self, PyObject *args, PyObject *kwargs) +{ + PCT_CounterObject *obj = NULL; + + /* Create the new object */ + obj = PyObject_New(PCT_CounterObject, &my_CounterLEType); + if (obj == NULL) { + return NULL; + } + + /* Zero the custom portion of the structure */ + memset(&obj->prefix, 0, sizeof(PCT_CounterObject) - offsetof(PCT_CounterObject, prefix)); + + /* Call the object's initializer. Delete the object if this fails. */ + if (CounterObject_init(obj, args, kwargs) != 0) { + return NULL; + } + + /* Set the inc_func pointer */ + obj->inc_func = (void (*)(void *))CounterLEObject_increment; + + /* Return the object */ + return (PyObject *)obj; +} + +static PyObject * +CounterBE_new(PyObject *self, PyObject *args, PyObject *kwargs) +{ + PCT_CounterObject *obj = NULL; + + /* Create the new object */ + obj = PyObject_New(PCT_CounterObject, &my_CounterBEType); + if (obj == NULL) { + return NULL; + } + + /* Zero the custom portion of the structure */ + memset(&obj->prefix, 0, sizeof(PCT_CounterObject) - offsetof(PCT_CounterObject, prefix)); + + /* Call the object's initializer. Delete the object if this fails. */ + if (CounterObject_init(obj, args, kwargs) != 0) { + return NULL; + } + + /* Set the inc_func pointer */ + obj->inc_func = (void (*)(void *))CounterBEObject_increment; + + /* Return the object */ + return (PyObject *)obj; +} + +/* + * Module-level method table and module initialization function + */ + +static PyMethodDef module_methods[] = { + {"_newLE", (PyCFunction) CounterLE_new, METH_VARARGS|METH_KEYWORDS, NULL}, + {"_newBE", (PyCFunction) CounterBE_new, METH_VARARGS|METH_KEYWORDS, NULL}, + {NULL, NULL, 0, NULL} /* end-of-list sentinel value */ +}; + +#ifdef IS_PY3K +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "_counter", + NULL, + -1, + module_methods, + NULL, + NULL, + NULL, + NULL +}; +#endif + +PyMODINIT_FUNC +#ifdef IS_PY3K +PyInit__counter(void) +#else +init_counter(void) +#endif +{ + PyObject *m; + + /* TODO - Is the error handling here correct? */ +#ifdef IS_PY3K + /* PyType_Ready automatically fills in ob_type with &PyType_Type if it's not already set */ + if (PyType_Ready(&my_CounterLEType) < 0) + return NULL; + if (PyType_Ready(&my_CounterBEType) < 0) + return NULL; + + /* Initialize the module */ + m = PyModule_Create(&moduledef); + if (m == NULL) + return NULL; + + return m; +#else + m = Py_InitModule("_counter", module_methods); + if (m == NULL) + return; + + my_CounterLEType.ob_type = &PyType_Type; + my_CounterBEType.ob_type = &PyType_Type; +#endif +} + +/* vim:set ts=4 sw=4 sts=4 expandtab: */ diff --git a/Cryptography/pycrypto-2.6.1/src/_counter.h b/Cryptography/pycrypto-2.6.1/src/_counter.h new file mode 100644 index 0000000..fc3e24e --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/_counter.h @@ -0,0 +1,50 @@ +/* + * _counter.h: Fast counter for use with CTR-mode ciphers + * + * Written in 2008 by Dwayne C. Litzenberger + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + */ +#ifndef PCT__COUNTER_H +#define PCT__COUNTER_H + +#include "config.h" +#if HAVE_STDINT_H +# include +#elif defined(__sun) || defined(__sun__) +# include +#else +# error "stdint.h not found" +#endif + +typedef struct { + PyObject_HEAD + PyBytesObject *prefix; /* Prefix (useful for a nonce) */ + PyBytesObject *suffix; /* Suffix (useful for a nonce) */ + uint8_t *val; /* Buffer for our output string */ + uint32_t buf_size; /* Size of the buffer */ + uint8_t *p; /* Pointer to the part of the buffer that we're allowed to update */ + uint16_t nbytes; /* The number of bytes that from .p that are part of the counter */ + void (*inc_func)(void *); /* Pointer to the counter increment function */ + int shortcut_disabled; /* This gets set to a non-zero value when the shortcut mechanism is disabled */ + int carry; /* This gets set by Counter*Object_increment when the counter wraps around */ + int allow_wraparound; /* When this is false, we raise OverflowError on next_value() or __call__() when the counter wraps around */ +} PCT_CounterObject; + +#endif /* PCT__COUNTER_H */ diff --git a/Cryptography/pycrypto-2.6.1/src/_fastmath.c b/Cryptography/pycrypto-2.6.1/src/_fastmath.c new file mode 100644 index 0000000..b8b24b6 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/_fastmath.c @@ -0,0 +1,2732 @@ +/* + * _fastmath.c: Accelerator module that uses GMP for faster numerics. + * + * Part of the Python Cryptography Toolkit + * + * Written by Paul Swartz, Andrew Kuchling, Joris Bontje, and others + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + * + * $Id$ + */ + +#include +#include +#include "Python.h" +#include "pycrypto_compat.h" +#include /* for conversions */ +#include "config.h" +#if HAVE_LIBGMP +# include +#elif HAVE_LIBMPIR +# include +#else +# error "Neither HAVE_LIBGMP nor HAVE_LIBMPIR are set. Can't build." +#endif + +/* If available, use mpz_powm_sec to avoid timing attacks. + * See the talk by Geremy Condra - + * "PyCon 2011: Through the Side Channel: Timing and Implementation Attacks in Python" + * http://blip.tv/pycon-us-videos-2009-2010-2011/pycon-2011-through-the-side-channel-timing-and-implementation-attacks-in-python-4897955 + */ +#if HAVE_DECL_MPZ_POWM_SEC +#define MPZ_POWM mpz_powm_sec +#else +#define MPZ_POWM mpz_powm +#endif + +#define SIEVE_BASE_SIZE (sizeof (sieve_base) / sizeof (sieve_base[0])) + +#ifdef _MSC_VER +#define INLINE __inline +#else +#define INLINE inline +#endif + +static unsigned int sieve_base[10000]; +static int rabinMillerTest (mpz_t n, int rounds, PyObject *randfunc); + +static void +longObjToMPZ (mpz_t m, PyLongObject * p) +{ + int size, i; + long negative; + mpz_t temp, temp2; + mpz_init (temp); + mpz_init (temp2); +#ifdef IS_PY3K + if (p->ob_base.ob_size > 0) { + size = p->ob_base.ob_size; + negative = 1; + } else { + size = -p->ob_base.ob_size; + negative = -1; + } +#else + if (p->ob_size > 0) { + size = p->ob_size; + negative = 1; + } else { + size = -p->ob_size; + negative = -1; + } +#endif + mpz_set_ui (m, 0); + for (i = 0; i < size; i++) + { + mpz_set_ui (temp, p->ob_digit[i]); +#ifdef IS_PY3K + mpz_mul_2exp (temp2, temp, PyLong_SHIFT * i); +#else + mpz_mul_2exp (temp2, temp, SHIFT * i); +#endif + mpz_add (m, m, temp2); + } + mpz_mul_si(m, m, negative); + mpz_clear (temp); + mpz_clear (temp2); +} + +static PyObject * +mpzToLongObj (mpz_t m) +{ + /* borrowed from gmpy */ +#ifdef IS_PY3K + int size = (mpz_sizeinbase (m, 2) + PyLong_SHIFT - 1) / PyLong_SHIFT; +#else + int size = (mpz_sizeinbase (m, 2) + SHIFT - 1) / SHIFT; +#endif + int sgn; + int i; + mpz_t temp; + PyLongObject *l = _PyLong_New (size); + if (!l) + return NULL; + sgn = mpz_sgn(m); + mpz_init(temp); + mpz_mul_si(temp, m, sgn); + for (i = 0; i < size; i++) + { +#ifdef IS_PY3K + l->ob_digit[i] = (digit) (mpz_get_ui (temp) & PyLong_MASK); + mpz_fdiv_q_2exp (temp, temp, PyLong_SHIFT); +#else + l->ob_digit[i] = (digit) (mpz_get_ui (temp) & MASK); + mpz_fdiv_q_2exp (temp, temp, SHIFT); +#endif + } + i = size; + while ((i > 0) && (l->ob_digit[i - 1] == 0)) + i--; +#ifdef IS_PY3K + l->ob_base.ob_size = i * sgn; +#else + l->ob_size = i * sgn; +#endif + mpz_clear (temp); + return (PyObject *) l; +} + +typedef struct +{ + PyObject_HEAD mpz_t y; + mpz_t g; + mpz_t p; + mpz_t q; + mpz_t x; +} +dsaKey; + +typedef struct +{ + PyObject_HEAD mpz_t n; + mpz_t e; + mpz_t d; + mpz_t p; + mpz_t q; + mpz_t u; +} +rsaKey; + +static PyObject *rsaKey_new (PyObject *, PyObject *); +static PyObject *dsaKey_new (PyObject *, PyObject *); + +static void dsaKey_dealloc (dsaKey *); +#ifdef IS_PY3K +static PyObject *dsaKey_getattro (dsaKey *, PyObject *); +#else +static PyObject *dsaKey_getattr (dsaKey *, char *); +#endif +static PyObject *dsaKey__sign (dsaKey *, PyObject *); +static PyObject *dsaKey__verify (dsaKey *, PyObject *); +static PyObject *dsaKey_size (dsaKey *, PyObject *); +static PyObject *dsaKey_has_private (dsaKey *, PyObject *); + +static void rsaKey_dealloc (rsaKey *); +#ifdef IS_PY3K +static PyObject *rsaKey_getattro (rsaKey *, PyObject *); +#else +static PyObject *rsaKey_getattr (rsaKey *, char *); +#endif +static PyObject *rsaKey__encrypt (rsaKey *, PyObject *); +static PyObject *rsaKey__decrypt (rsaKey *, PyObject *); +static PyObject *rsaKey__verify (rsaKey *, PyObject *); +static PyObject *rsaKey__blind (rsaKey *, PyObject *); +static PyObject *rsaKey__unblind (rsaKey *, PyObject *); +static PyObject *rsaKey_size (rsaKey *, PyObject *); +static PyObject *rsaKey_has_private (rsaKey *, PyObject *); + +static int +dsaSign (dsaKey * key, mpz_t m, mpz_t k, mpz_t r, mpz_t s) +{ + mpz_t temp; + if (mpz_cmp_ui (k, 2) < 0 || mpz_cmp (k, key->q) >= 0) + { + return 1; + } + mpz_init (temp); + MPZ_POWM (r, key->g, k, key->p); + mpz_mod (r, r, key->q); + mpz_invert (s, k, key->q); + mpz_mul (temp, key->x, r); + mpz_add (temp, m, temp); + mpz_mul (s, s, temp); + mpz_mod (s, s, key->q); + mpz_clear (temp); + return 0; +} + +static int +dsaVerify (dsaKey * key, mpz_t m, mpz_t r, mpz_t s) +{ + int result; + mpz_t u1, u2, v1, v2, w; + if (mpz_cmp_ui (r, 0) <= 0 || mpz_cmp (r, key->q) >= 0 || + mpz_cmp_ui (s, 0) <= 0 || mpz_cmp (s, key->q) >= 0) + return 0; + mpz_init (u1); + mpz_init (u2); + mpz_init (v1); + mpz_init (v2); + mpz_init (w); + mpz_invert (w, s, key->q); + mpz_mul (u1, m, w); + mpz_mod (u1, u1, key->q); + mpz_mul (u2, r, w); + mpz_mod (u2, u2, key->q); + MPZ_POWM (v1, key->g, u1, key->p); + MPZ_POWM (v2, key->y, u2, key->p); + mpz_mul (w, v1, v2); + mpz_mod (w, w, key->p); + mpz_mod (w, w, key->q); + if (mpz_cmp (r, w) == 0) + result = 1; + else + result = 0; + mpz_clear (u1); + mpz_clear (u2); + mpz_clear (v1); + mpz_clear (v2); + mpz_clear (w); + return result; +} + + +static int +rsaEncrypt (rsaKey * key, mpz_t v) +{ + if (mpz_cmp (v, key->n) >= 0) + { + return 1; + } + MPZ_POWM (v, v, key->e, key->n); + return 0; +} + +static int +rsaDecrypt (rsaKey * key, mpz_t v) +{ + mpz_t m1, m2, h; + if (mpz_cmp (v, key->n) >= 0) + { + return 1; + } + if (mpz_size (key->d) == 0) + { + return 2; + } + + if ((mpz_size (key->p) != 0) && (mpz_size (key->q) != 0) && + (mpz_size (key->u) != 0)) + { + /* fast path */ + mpz_init(m1); + mpz_init(m2); + mpz_init(h); + + /* m1 = c ^ (d mod (p-1)) mod p */ + mpz_sub_ui(h, key->p, 1); + mpz_fdiv_r(h, key->d, h); + MPZ_POWM(m1, v, h, key->p); + /* m2 = c ^ (d mod (q-1)) mod q */ + mpz_sub_ui(h, key->q, 1); + mpz_fdiv_r(h, key->d, h); + MPZ_POWM(m2, v, h, key->q); + /* h = u * ( m2 - m1 + q) mod q */ + mpz_sub(h, m2, m1); + if (mpz_sgn(h)==-1) + mpz_add(h, h, key->q); + mpz_mul(h, key->u, h); + mpz_mod(h, h, key->q); + /* m = m1 + h * p */ + mpz_mul(h, h, key->p); + mpz_add(v, m1, h); + /* ready */ + + mpz_clear(m1); + mpz_clear(m2); + mpz_clear(h); + return 0; + } + + /* slow */ + MPZ_POWM (v, v, key->d, key->n); + return 0; +} + +static int +rsaBlind (rsaKey * key, mpz_t v, mpz_t b) +{ + if (mpz_cmp (v, key->n) >= 0) + { + return 1; + } + if (mpz_cmp (b, key->n) >= 0) + { + return 2; + } + MPZ_POWM (b, b, key->e, key->n); + mpz_mul (v, v, b); + mpz_mod (v, v, key->n); + return 0; +} + +static int +rsaUnBlind (rsaKey * key, mpz_t v, mpz_t b) +{ + if (mpz_cmp (v, key->n) >= 0) + { + return 1; + } + if (mpz_cmp (b, key->n) >= 0) + { + return 2; + } + if (!mpz_invert (b, b, key->n)) + { + return 3; + } + mpz_mul (v, v, b); + mpz_mod (v, v, key->n); + return 0; +} + +static PyMethodDef dsaKey__methods__[] = { + {"_sign", (PyCFunction) dsaKey__sign, METH_VARARGS, + "Sign the given long."}, + {"_verify", (PyCFunction) dsaKey__verify, METH_VARARGS, + "Verify that the signature is valid."}, + {"size", (PyCFunction) dsaKey_size, METH_VARARGS, + "Return the number of bits that this key can handle."}, + {"has_private", (PyCFunction) dsaKey_has_private, METH_VARARGS, + "Return 1 or 0 if this key does/doesn't have a private key."}, + {NULL, NULL, 0, NULL} +}; + +static PyMethodDef rsaKey__methods__[] = { + {"_encrypt", (PyCFunction) rsaKey__encrypt, METH_VARARGS, + "Encrypt the given long."}, + {"_decrypt", (PyCFunction) rsaKey__decrypt, METH_VARARGS, + "Decrypt the given long."}, + {"_sign", (PyCFunction) rsaKey__decrypt, METH_VARARGS, + "Sign the given long."}, + {"_verify", (PyCFunction) rsaKey__verify, METH_VARARGS, + "Verify that the signature is valid."}, + {"_blind", (PyCFunction) rsaKey__blind, METH_VARARGS, + "Blind the given long."}, + {"_unblind", (PyCFunction) rsaKey__unblind, METH_VARARGS, + "Unblind the given long."}, + {"size", (PyCFunction) rsaKey_size, METH_VARARGS, + "Return the number of bits that this key can handle."}, + {"has_private", (PyCFunction) rsaKey_has_private, METH_VARARGS, + "Return 1 or 0 if this key does/doesn't have a private key."}, + {NULL, NULL, 0, NULL} +}; + +static PyObject *fastmathError; /* raised on errors */ + +static PyTypeObject dsaKeyType = { +#ifdef IS_PY3K + PyVarObject_HEAD_INIT (NULL, 0) /* deferred type init for compilation on Windows, type will be filled in at runtime */ +#else + PyObject_HEAD_INIT (NULL) + 0, /*ob_size*/ +#endif + "dsaKey", + sizeof (dsaKey), + 0, + (destructor) dsaKey_dealloc, /* dealloc */ + 0, /* print */ +#ifdef IS_PY3K + 0, /* getattr */ +#else + (getattrfunc) dsaKey_getattr, /* getattr */ +#endif + 0, /* setattr */ + 0, /* compare */ + 0, /* repr */ + 0, /* as_number */ + 0, /* as_sequence */ + 0, /* as_mapping */ + 0, /* hash */ + 0, /* call */ +#ifdef IS_PY3K + 0, /*tp_str*/ + (getattrofunc) dsaKey_getattro, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + dsaKey__methods__, /*tp_methods*/ +#endif +}; + +static PyTypeObject rsaKeyType = { +#ifdef IS_PY3K + PyVarObject_HEAD_INIT (NULL, 0) /* deferred type init for compilation on Windows, type will be filled in at runtime */ +#else + PyObject_HEAD_INIT (NULL) + 0, /*ob_size*/ +#endif + "rsaKey", /*tp_name*/ + sizeof (rsaKey), /*tp_size*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor) rsaKey_dealloc, /* dealloc */ + 0, /* print */ +#ifdef IS_PY3K + 0, /* getattr */ +#else + (getattrfunc) rsaKey_getattr, /* getattr */ +#endif + 0, /* setattr */ + 0, /* compare */ + 0, /* repr */ + 0, /* as_number */ + 0, /* as_sequence */ + 0, /* as_mapping */ + 0, /* hash */ + 0, /* call */ +#ifdef IS_PY3K + 0, /*tp_str*/ + (getattrofunc) rsaKey_getattro, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + rsaKey__methods__, /*tp_methods*/ +#endif +}; + +static PyObject * +dsaKey_new (PyObject * self, PyObject * args) +{ + PyLongObject *y = NULL, *g = NULL, *p = NULL, *q = NULL, *x = NULL; + dsaKey *key; + if (!PyArg_ParseTuple(args, "O!O!O!O!|O!", &PyLong_Type, &y, + &PyLong_Type, &g, &PyLong_Type, &p, + &PyLong_Type, &q, &PyLong_Type, &x)) + return NULL; + + key = PyObject_New (dsaKey, &dsaKeyType); + if (key == NULL) + return NULL; + mpz_init (key->y); + mpz_init (key->g); + mpz_init (key->p); + mpz_init (key->q); + mpz_init (key->x); + longObjToMPZ (key->y, y); + longObjToMPZ (key->g, g); + longObjToMPZ (key->p, p); + longObjToMPZ (key->q, q); + if (x) + { + longObjToMPZ (key->x, x); + } + return (PyObject *) key; +} + +static void +dsaKey_dealloc (dsaKey * key) +{ + mpz_clear (key->y); + mpz_clear (key->g); + mpz_clear (key->p); + mpz_clear (key->q); + mpz_clear (key->x); + PyObject_Del (key); +} + +static PyObject * +#ifdef IS_PY3K +dsaKey_getattro (dsaKey * key, PyObject *attr) +#else +dsaKey_getattr (dsaKey * key, char *attr) +#endif +{ +#ifdef IS_PY3K + if (!PyUnicode_Check(attr)) + goto generic; + if (PyUnicode_CompareWithASCIIString(attr,"y") == 0) +#else + if (strcmp (attr, "y") == 0) +#endif + return mpzToLongObj (key->y); +#ifdef IS_PY3K + else if (PyUnicode_CompareWithASCIIString(attr, "g") == 0) +#else + else if (strcmp (attr, "g") == 0) +#endif + return mpzToLongObj (key->g); +#ifdef IS_PY3K + else if (PyUnicode_CompareWithASCIIString(attr, "p") == 0) +#else + else if (strcmp (attr, "p") == 0) +#endif + return mpzToLongObj (key->p); +#ifdef IS_PY3K + else if (PyUnicode_CompareWithASCIIString(attr, "q") == 0) +#else + else if (strcmp (attr, "q") == 0) +#endif + return mpzToLongObj (key->q); +#ifdef IS_PY3K + else if (PyUnicode_CompareWithASCIIString(attr, "x") == 0) +#else + else if (strcmp (attr, "x") == 0) +#endif + { + if (mpz_size (key->x) == 0) + { + PyErr_SetString (PyExc_AttributeError, + "dsaKey instance has no attribute 'x'"); + return NULL; + } + return mpzToLongObj (key->x); + } + else +#ifdef IS_PY3K + generic: + return PyObject_GenericGetAttr((PyObject *) key, attr); +#else + return Py_FindMethod (dsaKey__methods__, (PyObject *) key, attr); +#endif +} + +static PyObject * +dsaKey__sign (dsaKey * key, PyObject * args) +{ + PyObject *lm, *lk, *lr, *ls, *retval; + mpz_t m, k, r, s; + int result; + if (!PyArg_ParseTuple (args, "O!O!", &PyLong_Type, &lm, + &PyLong_Type, &lk)) + { + return NULL; + } + mpz_init (m); + mpz_init (k); + mpz_init (r); + mpz_init (s); + longObjToMPZ (m, (PyLongObject *) lm); + longObjToMPZ (k, (PyLongObject *) lk); + result = dsaSign (key, m, k, r, s); + if (result == 1) + { + PyErr_SetString (PyExc_ValueError, "K not between 2 and q"); + return NULL; + } + lr = mpzToLongObj (r); + ls = mpzToLongObj (s); + if (lr == NULL || ls == NULL) goto errout; + mpz_clear (m); + mpz_clear (k); + mpz_clear (r); + mpz_clear (s); + retval = Py_BuildValue ("(NN)", lr, ls); + if (retval == NULL) goto errout; + return retval; + +errout: + Py_XDECREF(lr); + Py_XDECREF(ls); + return NULL; +} + +static PyObject * +dsaKey__verify (dsaKey * key, PyObject * args) +{ + PyObject *lm, *lr, *ls; + mpz_t m, r, s; + int result; + if (!PyArg_ParseTuple (args, "O!O!O!", &PyLong_Type, &lm, + &PyLong_Type, &lr, &PyLong_Type, &ls)) + { + return NULL; + } + mpz_init (m); + mpz_init (r); + mpz_init (s); + longObjToMPZ (m, (PyLongObject *) lm); + longObjToMPZ (r, (PyLongObject *) lr); + longObjToMPZ (s, (PyLongObject *) ls); + result = dsaVerify (key, m, r, s); + mpz_clear (m); + mpz_clear (r); + mpz_clear (s); + if (result) { + Py_INCREF(Py_True); + return Py_True; + } else { + Py_INCREF(Py_False); + return Py_False; + } +} + +static PyObject * +dsaKey_size (dsaKey * key, PyObject * args) +{ + if (!PyArg_ParseTuple (args, "")) + return NULL; + return Py_BuildValue ("i", mpz_sizeinbase (key->p, 2) - 1); +} + +static PyObject * +dsaKey_has_private (dsaKey * key, PyObject * args) +{ + if (!PyArg_ParseTuple (args, "")) + return NULL; + if (mpz_size (key->x) == 0) { + Py_INCREF(Py_False); + return Py_False; + } else { + Py_INCREF(Py_True); + return Py_True; + } +} + +/** + * Compute key->p and key->q from the key with private exponent only. + * Return 0 if factoring was succesful, 1 otherwise. + */ +static int factorize_N_from_D(rsaKey *key) +{ + mpz_t ktot, t, a, k, cand, nminus1, cand2; + unsigned long cnt; + int spotted; + + mpz_init(ktot); + mpz_init(t); + mpz_init(a); + mpz_init(k); + mpz_init(cand); + mpz_init(nminus1); + mpz_init(cand2); + + mpz_sub_ui(nminus1, key->n, 1); + + /** See _slowmath.py **/ + mpz_mul(ktot, key->e, key->d); + mpz_sub_ui(ktot, ktot, 1); + mpz_set(t, ktot); + cnt = mpz_scan1(t, 0); + mpz_fdiv_q_2exp(t,t,cnt); + mpz_set_ui(a, 2); + for (spotted=0; (!spotted) && (mpz_cmp_ui(a,100)<0); mpz_add_ui(a,a,2)) { + mpz_set(k, t); + for (; (mpz_cmp(k,ktot)<0); mpz_mul_ui(k,k,2)) { + mpz_powm(cand,a,k,key->n); + if ((mpz_cmp_ui(cand,1)==0) || (mpz_cmp(cand,nminus1)==0)) + continue; + mpz_powm_ui(cand2,cand,2,key->n); + if (mpz_cmp_ui(cand2,1)==0) { + mpz_add_ui(cand,cand,1); + mpz_gcd(key->p, cand, key->n); + spotted=1; + break; + } + } + } + if (spotted) + mpz_divexact(key->q, key->n, key->p); + + mpz_clear(ktot); + mpz_clear(t); + mpz_clear(a); + mpz_clear(k); + mpz_clear(cand); + mpz_clear(nminus1); + mpz_clear(cand2); + + return (spotted?0:1); +} + +static PyObject * +rsaKey_new (PyObject * self, PyObject * args) +{ + PyLongObject *n = NULL, *e = NULL, *d = NULL, *p = NULL, *q = NULL, + *u = NULL; + rsaKey *key; + + if (!PyArg_ParseTuple(args, "O!O!|O!O!O!O!", &PyLong_Type, &n, + &PyLong_Type, &e, &PyLong_Type, &d, + &PyLong_Type, &p, &PyLong_Type, &q, + &PyLong_Type, &u)) + return NULL; + + key = PyObject_New (rsaKey, &rsaKeyType); + if (key == NULL) + return NULL; + mpz_init (key->n); + mpz_init (key->e); + mpz_init (key->d); + mpz_init (key->p); + mpz_init (key->q); + mpz_init (key->u); + longObjToMPZ (key->n, n); + longObjToMPZ (key->e, e); + if (!d) + { + return (PyObject *) key; + } + longObjToMPZ (key->d, d); + if (p && q) + { + longObjToMPZ (key->p, p); + longObjToMPZ (key->q, q); + } else { + if (factorize_N_from_D(key)) + { + PyErr_SetString(PyExc_ValueError, + "Unable to compute factors p and q from exponent d."); + return NULL; + } + } + if (u) { + longObjToMPZ (key->u, u); + } else { + mpz_invert (key->u, key->p, key->q); + } + return (PyObject *) key; +} + +static void +rsaKey_dealloc (rsaKey * key) +{ + mpz_clear (key->n); + mpz_clear (key->e); + mpz_clear (key->d); + mpz_clear (key->p); + mpz_clear (key->q); + mpz_clear (key->u); + PyObject_Del (key); +} + +static PyObject * +#ifdef IS_PY3K +rsaKey_getattro (rsaKey * key, PyObject *attr) +#else +rsaKey_getattr (rsaKey * key, char *attr) +#endif +{ +#ifdef IS_PY3K + if (!PyUnicode_Check(attr)) + goto generic; + if (PyUnicode_CompareWithASCIIString(attr, "n") == 0) +#else + if (strcmp (attr, "n") == 0) +#endif + return mpzToLongObj (key->n); +#ifdef IS_PY3K + else if (PyUnicode_CompareWithASCIIString(attr, "e") == 0) +#else + else if (strcmp (attr, "e") == 0) +#endif + return mpzToLongObj (key->e); +#ifdef IS_PY3K + else if (PyUnicode_CompareWithASCIIString(attr, "d") == 0) +#else + else if (strcmp (attr, "d") == 0) +#endif + { + if (mpz_size (key->d) == 0) + { + PyErr_SetString(PyExc_AttributeError, + "rsaKey instance has no attribute 'd'"); + return NULL; + } + return mpzToLongObj (key->d); + } +#ifdef IS_PY3K + else if (PyUnicode_CompareWithASCIIString(attr, "p") == 0) +#else + else if (strcmp (attr, "p") == 0) +#endif + { + if (mpz_size (key->p) == 0) + { + PyErr_SetString(PyExc_AttributeError, + "rsaKey instance has no attribute 'p'"); + return NULL; + } + return mpzToLongObj (key->p); + } +#ifdef IS_PY3K + else if (PyUnicode_CompareWithASCIIString(attr, "q") == 0) +#else + else if (strcmp (attr, "q") == 0) +#endif + { + if (mpz_size (key->q) == 0) + { + PyErr_SetString(PyExc_AttributeError, + "rsaKey instance has no attribute 'q'"); + return NULL; + } + return mpzToLongObj (key->q); + } +#ifdef IS_PY3K + else if (PyUnicode_CompareWithASCIIString(attr, "u") == 0) +#else + else if (strcmp (attr, "u") == 0) +#endif + { + if (mpz_size (key->u) == 0) + { + PyErr_SetString(PyExc_AttributeError, + "rsaKey instance has no attribute 'u'"); + return NULL; + } + return mpzToLongObj (key->u); + } + else +#ifdef IS_PY3K + generic: + return PyObject_GenericGetAttr((PyObject *) key, attr); +#else + return Py_FindMethod (rsaKey__methods__, + (PyObject *) key, attr); +#endif +} + +static PyObject * +rsaKey__encrypt (rsaKey * key, PyObject * args) +{ + PyObject *l, *r, *retval; + mpz_t v; + int result; + if (!PyArg_ParseTuple (args, "O!", &PyLong_Type, &l)) + { + return NULL; + } + mpz_init (v); + longObjToMPZ (v, (PyLongObject *) l); + result = rsaEncrypt (key, v); + if (result == 1) + { + PyErr_SetString (PyExc_ValueError, "Plaintext too large"); + return NULL; + } + r = (PyObject *) mpzToLongObj (v); + if (r == NULL) return NULL; + mpz_clear (v); + retval = Py_BuildValue ("N", r); + if (retval == NULL) { + Py_DECREF(r); + return NULL; + } + return retval; +} + +static PyObject * +rsaKey__decrypt (rsaKey * key, PyObject * args) +{ + PyObject *l, *r, *retval; + mpz_t v; + int result; + if (!PyArg_ParseTuple (args, "O!", &PyLong_Type, &l)) + { + return NULL; + } + mpz_init (v); + longObjToMPZ (v, (PyLongObject *) l); + result = rsaDecrypt (key, v); + if (result == 1) + { + PyErr_SetString (PyExc_ValueError, + "Ciphertext too large"); + return NULL; + } + else if (result == 2) + { + PyErr_SetString (PyExc_TypeError, + "Private key not available in this object"); + return NULL; + } + r = mpzToLongObj (v); + if (r == NULL) return NULL; + mpz_clear (v); + retval = Py_BuildValue ("N", r); + if (retval == NULL) { + Py_DECREF(r); + return NULL; + } + return retval; +} + +static PyObject * +rsaKey__verify (rsaKey * key, PyObject * args) +{ + PyObject *l, *lsig; + mpz_t v, vsig; + if (!PyArg_ParseTuple(args, "O!O!", + &PyLong_Type, &l, &PyLong_Type, &lsig)) + { + return NULL; + } + mpz_init (v); + mpz_init (vsig); + longObjToMPZ (v, (PyLongObject *) l); + longObjToMPZ (vsig, (PyLongObject *) lsig); + rsaEncrypt (key, vsig); + if (mpz_cmp (v, vsig) == 0) { + Py_INCREF(Py_True); + return Py_True; + } + else { + Py_INCREF(Py_False); + return Py_False; + } +} + +static PyObject * +rsaKey__blind (rsaKey * key, PyObject * args) +{ + PyObject *l, *lblind, *r, *retval; + mpz_t v, vblind; + int result; + if (!PyArg_ParseTuple (args, "O!O!", &PyLong_Type, &l, + &PyLong_Type, &lblind)) + { + return NULL; + } + mpz_init (v); + mpz_init (vblind); + longObjToMPZ (v, (PyLongObject *) l); + longObjToMPZ (vblind, (PyLongObject *) lblind); + result = rsaBlind (key, v, vblind); + if (result == 1) + { + PyErr_SetString (PyExc_ValueError, "Message too large"); + return NULL; + } + else if (result == 2) + { + PyErr_SetString (PyExc_ValueError, "Blinding factor too large"); + return NULL; + } + r = (PyObject *) mpzToLongObj (v); + if (r == NULL) + return NULL; + mpz_clear (v); + mpz_clear (vblind); + retval = Py_BuildValue ("N", r); + if (retval == NULL) { + Py_DECREF(r); + return NULL; + } + return retval; +} + +static PyObject * +rsaKey__unblind (rsaKey * key, PyObject * args) +{ + PyObject *l, *lblind, *r, *retval; + mpz_t v, vblind; + int result; + if (!PyArg_ParseTuple (args, "O!O!", &PyLong_Type, &l, + &PyLong_Type, &lblind)) + { + return NULL; + } + mpz_init (v); + mpz_init (vblind); + longObjToMPZ (v, (PyLongObject *) l); + longObjToMPZ (vblind, (PyLongObject *) lblind); + result = rsaUnBlind (key, v, vblind); + if (result == 1) + { + PyErr_SetString (PyExc_ValueError, "Message too large"); + return NULL; + } + else if (result == 2) + { + PyErr_SetString (PyExc_ValueError, "Blinding factor too large"); + return NULL; + } + else if (result == 3) + { + PyErr_SetString (PyExc_ValueError, "Inverse doesn't exist"); + return NULL; + } + r = (PyObject *) mpzToLongObj (v); + if (r == NULL) return NULL; + mpz_clear (v); + mpz_clear (vblind); + retval = Py_BuildValue ("N", r); + if (retval == NULL) { + Py_DECREF(r); + return NULL; + } + return retval; +} + +static PyObject * +rsaKey_size (rsaKey * key, PyObject * args) +{ + if (!PyArg_ParseTuple (args, "")) + return NULL; + return Py_BuildValue ("i", mpz_sizeinbase (key->n, 2) - 1); +} + +static PyObject * +rsaKey_has_private (rsaKey * key, PyObject * args) +{ + if (!PyArg_ParseTuple (args, "")) + return NULL; + if (mpz_size (key->d) == 0) { + Py_INCREF(Py_False); + return Py_False; + } else { + Py_INCREF(Py_True); + return Py_True; + } +} + + +static PyObject * +isPrime (PyObject * self, PyObject * args, PyObject * kwargs) +{ + unsigned int i, rounds; + double false_positive_prob=1e-6; + PyObject *l, *randfunc=NULL; + mpz_t n; + int result; + static char *kwlist[] = {"N", "false_positive_prob", "randfunc", NULL}; + + if (!PyArg_ParseTupleAndKeywords (args, kwargs, "O!|dO:isPrime", kwlist, + &PyLong_Type, &l, &false_positive_prob, + &randfunc)) + { + return NULL; + } + mpz_init (n); + longObjToMPZ (n, (PyLongObject *) l); + + Py_BEGIN_ALLOW_THREADS; + /* first check if n is known to be prime and do some trial division */ + for (i = 0; i < SIEVE_BASE_SIZE; ++i) + { + if (mpz_cmp_ui (n, sieve_base[i]) == 0) + { + result = 2; + goto cleanup; + } + if (mpz_divisible_ui_p (n, sieve_base[i])) + { + result = 0; + goto cleanup; + } + } + /* do some rounds of Rabin-Miller-Tests */ + rounds = (unsigned int)ceil (-log (false_positive_prob) / log (4)); + Py_BLOCK_THREADS; + result = rabinMillerTest(n, rounds, randfunc); + Py_UNBLOCK_THREADS; + +cleanup: + mpz_clear (n); + Py_END_ALLOW_THREADS; + + if (result == 0) + { + Py_INCREF(Py_False); + return Py_False; + } else { + Py_INCREF(Py_True); + return Py_True; + } +} + + + +INLINE size_t size (mpz_t n) +{ + return mpz_sizeinbase (n, 2); +} + +void bytes_to_mpz (mpz_t result, const unsigned char *bytes, size_t size) +{ + unsigned long int i; + mpz_t tmp; + mpz_init (tmp); + Py_BEGIN_ALLOW_THREADS; + mpz_set_ui (result, 0); + for (i = 0; i < size; ++i) + { + /* get current byte */ + mpz_set_ui (tmp, (unsigned long int)bytes[i]); + /* left shift and add */ + mpz_mul_2exp (tmp, tmp, 8 * i); + mpz_add (result, result, tmp); + } + mpz_clear (tmp); + Py_END_ALLOW_THREADS; +} + + +/* Returns a new reference to a rng from the Crypto.Random module. */ +static PyObject * +getRNG (void) +{ + /* PyModule_GetDict, PyDict_GetItemString return a borrowed ref */ + PyObject *module, *module_dict, *new_func, *rng; + + module = PyImport_ImportModule ("Crypto.Random"); + if (!module) + return NULL; + module_dict = PyModule_GetDict (module); + Py_DECREF (module); + new_func = PyDict_GetItemString (module_dict, "new"); + if (new_func == NULL) { + PyErr_SetString (PyExc_RuntimeError, + "Crypto.Random.new is missing."); + return NULL; + } + if (!PyCallable_Check (new_func)) + { + PyErr_SetString (PyExc_RuntimeError, + "Crypto.Random.new is not callable."); + return NULL; + } + rng = PyObject_CallObject (new_func, NULL); + return rng; +} + + +/* Sets n to a rangom number with at most `bits` bits . + * If randfunc is provided it should be a callable which takes a single int + * parameter and return as many random bytes as a python string. + * Returns 1 on success + * Returns 0 on error (most likly a python error) + * The thread should be holding the GIL. The function does nothing to check + * this. (PyGILState_Ensure() was only introduced in python2.3 and we want to + * support 2.1) + */ +static int +getRandomInteger (mpz_t n, unsigned long int bits, PyObject *randfunc_) +{ + PyObject *arglist, *randfunc=NULL, *rng=NULL, *rand_bytes=NULL; + int return_val = 1; + unsigned long int bytes = bits / 8; + unsigned long int odd_bits = bits % 8; + /* generate 1 to 8 bits too many. + we will remove them later by right-shifting */ + bytes++; + /* we need to handle the cases where randfunc is NULL or None */ + if ((randfunc_ == NULL) || (randfunc_ == Py_None)) + { + rng = getRNG(); + if (!rng) + { + return_val = 0; + goto cleanup; + } + randfunc = PyObject_GetAttrString (rng, "read"); + } + else + { + randfunc = randfunc_; + } + + if (!PyCallable_Check (randfunc)) + { + PyErr_SetString (PyExc_TypeError, "randfunc must be callable"); + return_val = 0; + goto cleanup; + } + + arglist = Py_BuildValue ("(l)", (long int)bytes); + if (arglist == NULL) { + return_val = 0; + goto cleanup; + } + rand_bytes = PyObject_CallObject (randfunc, arglist); + if (rand_bytes == NULL) { + return_val = 0; + goto cleanup; + } + Py_DECREF (arglist); + if (!PyBytes_Check (rand_bytes)) + { + PyErr_SetString (PyExc_TypeError, + "randfunc must return a string of random bytes"); + return_val = 0; + goto cleanup; + } + + bytes_to_mpz (n, (unsigned char *)PyBytes_AsString(rand_bytes), bytes); + /* remove superflous bits by right-shifting */ + mpz_fdiv_q_2exp (n, n, 8 - odd_bits); + +cleanup: + Py_XDECREF (rand_bytes); + if (rng) + { + Py_XDECREF (randfunc); + Py_DECREF (rng); + } + return return_val; +} + + +/* Sets n to a rangom number with exactly `bits` random bits. + * randfunc should be either NULL, PyNone or a callable which takes a single + * integer parameter and return as many random bytes as a python string. + * Returns 1 on success + * Returns 0 on error (most likly a python error) + * The thread should be holding the GIL. The function does nothing to check + * this. (PyGILState_Ensure() was only introduced in python2.3 and we want to + * support 2.1) + */ +static int +getRandomNBitInteger (mpz_t n, unsigned long int bits, PyObject *randfunc) +{ + if (!getRandomInteger (n, bits, randfunc)) + return 0; + /* set the MSB to ensure n really has the correct number of bits. */ + mpz_setbit (n, bits); + return 1; +} + + +/* Sets n to a rangom number so that lower_bound <= n < upper_bound . + * If randfunc is provided it should be a callable which takes a single int + * parameter and return as many random bytes as a python string. + * Returns 1 on success + * Returns 0 on error (most likly a python error) + * The thread should be holding the GIL. The function does nothing to check + * this. (PyGILState_Ensure() was only introduced in python2.3 and we want to + * support 2.1) + */ +static int +getRandomRange (mpz_t n, mpz_t lower_bound, mpz_t upper_bound, + PyObject *randfunc) +{ + size_t bits; + mpz_t range; + mpz_init (range); + mpz_sub (range, upper_bound, lower_bound); + mpz_sub_ui (range, range, 1); + bits = size (range); + + do + { + if (!getRandomInteger (n, bits, randfunc)) + { + mpz_clear (range); + return 0; + } + } while (mpz_cmp (n, range) > 0); + + mpz_clear (range); + mpz_add (n, n, lower_bound); + return 1; +} + + + +static void +sieve_field (char *field, unsigned long int field_size, mpz_t start) +{ + mpz_t mpz_offset; + unsigned int offset; + unsigned int i, j; + + mpz_init (mpz_offset); + + for (i = 0; i < SIEVE_BASE_SIZE; ++i) + { + mpz_mod_ui (mpz_offset, start, sieve_base[i]); + offset = mpz_get_ui (mpz_offset); + for (j = (sieve_base[i] - offset) % sieve_base[i]; j < field_size; j += sieve_base[i]) + { + field[j] = 1; + } + } + + mpz_clear (mpz_offset); +} + + +#define MAX_RABIN_MILLER_ROUNDS 255 + +/* Tests if n is prime. + * Returns 0 when n is definitly composite. + * Returns 1 when n is probably prime. + * every round reduces the chance of a false positive be at least 1/4. + * + * If randfunc is omitted, then the python version Random.new().read is used. + * + * The thread should be holding the GIL. The function does nothing to check + * this. (PyGILState_Ensure() was only introduced in python2.3 and we want to + * support 2.1) + */ +static int +rabinMillerTest (mpz_t n, int rounds, PyObject *randfunc) +{ + int base_was_tested; + unsigned long int i, j, b, composite, return_val=1; + mpz_t a, m, z, n_1, tmp; + mpz_t tested[MAX_RABIN_MILLER_ROUNDS]; + + if (rounds > MAX_RABIN_MILLER_ROUNDS) + { + /* PyErr_Warn is deprecated, but we use it for backward + * compatibility with Python < 2.5. Eventually, it will need + * to be replaced with PyErr_WarnEx with the stacklevel + * argument set to 1 */ + PyErr_Warn(PyExc_RuntimeWarning, + "rounds to Rabin-Miller-Test exceeds maximum. " + "rounds will be set to the maximum.\n" + "Go complain to the devs about it if you like."); + rounds = MAX_RABIN_MILLER_ROUNDS; + } + + Py_BEGIN_ALLOW_THREADS; + /* check special cases (n==2, n even, n < 2) */ + if ((mpz_tstbit (n, 0) == 0) || (mpz_cmp_ui (n, 3) < 0)) { + return_val = (mpz_cmp_ui (n, 2) == 0); + Py_BLOCK_THREADS; + return return_val; + } + + mpz_init (tmp); + mpz_init (n_1); + mpz_init (a); + mpz_init (m); + mpz_init (z); + mpz_sub_ui (n_1, n, 1); + b = mpz_scan1 (n_1, 0); + mpz_fdiv_q_2exp (m, n_1, b); + + if (mpz_fits_ulong_p (n) && (mpz_get_ui (n) - 2 < rounds)) + rounds = mpz_get_ui (n) - 2; + for (i = 0; i < rounds; ++i) + { + mpz_set_ui (tmp, 2); + do + { + base_was_tested = 0; + Py_BLOCK_THREADS; + if (!getRandomRange (a, tmp, n, randfunc)) + { + return_val = -1; + Py_UNBLOCK_THREADS; + goto cleanup; + } + Py_UNBLOCK_THREADS; + for (j = 0; j < i; j++) + { + if (mpz_cmp (a, tested[j]) == 0) + { + base_was_tested = 1; + break; + } + } + } while (base_was_tested); + mpz_init_set (tested[i], a); + MPZ_POWM (z, a, m, n); + if ((mpz_cmp_ui (z, 1) == 0) || (mpz_cmp (z, n_1) == 0)) + continue; + composite = 1; + for (j = 0; j < b; ++j) + { + /* z = (z * z) % n */ + mpz_mul (z, z, z); + mpz_mod (z, z, n); + if (mpz_cmp_ui (z, 1) == 0) + { + return_val = 0; + goto cleanup; + } + else if (mpz_cmp (z, n_1) == 0) + { + composite = 0; + break; + } + } + + if (composite) + { + return_val = 0; + goto cleanup; + } + } + +cleanup: + mpz_clear (tmp); + mpz_clear (n_1); + mpz_clear (a); + mpz_clear (m); + mpz_clear (z); + Py_END_ALLOW_THREADS; + return return_val; +} + + +/* getStrongPrime() generates a number p which is with a high probability a + * prime for which the following is true: + * p+1 has at least one large prime factor + * p-1 has at least one large prime factor + * This functions was implemented following the instructions found in the paper + * "FAST GENERATION OF RANDOM, STRONG RSA PRIMES" + * by Robert D. Silverman + * RSA Laboratories + * May 17, 1997 + * which by the time of writing could be obtained here: + * http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.17.2713&rep=rep1&type=pdf + */ +static PyObject * +getStrongPrime (PyObject *self, PyObject *args, PyObject *kwargs) +{ + unsigned long int i, j, result, bits, x, e=0; + mpz_t p[2], y[2], R, X; + mpz_t tmp[2], lower_bound, upper_bound, range, increment; + mpf_t tmp_bound; + char *field; + double false_positive_prob; + int rabin_miller_rounds, is_possible_prime, error = 0; + PyObject *prime, *randfunc=NULL; + static char *kwlist[] = {"N", "e", "false_positive_prob", "randfunc", NULL}; + unsigned long int base_size = SIEVE_BASE_SIZE; + unsigned long int field_size = 5 * base_size; + int res; + + if (!PyArg_ParseTupleAndKeywords (args, kwargs, "l|ldO:getStrongPrime", + kwlist, &bits, &e, &false_positive_prob, + &randfunc)) + { + return NULL; + } + + if ((bits < 512) || ((bits % 128) != 0)) + { + PyErr_SetString (PyExc_ValueError, + "bits must be multiple of 128 and > 512"); + return NULL; + } + + Py_BEGIN_ALLOW_THREADS; + rabin_miller_rounds = (int)ceil (-log (false_positive_prob) / log (4)); + /* The variable names y, p, X and R correspond to + * the names in the paper mentioned above + */ + mpz_init2 (y[0], 101); + mpz_init2 (y[1], 101); + mpz_init2 (p[0], 121); + mpz_init2 (p[1], 121); + mpz_init2 (X, bits); + mpz_init2 (R, bits); + mpz_init2 (increment, 242); + mpz_init (tmp[0]); + mpz_init (tmp[1]); + mpz_init2 (lower_bound, bits); + mpz_init2 (upper_bound, bits); + mpf_init (tmp_bound); + mpz_init (range); + + /* calculate range for X + * lower_bound = sqrt(2) * 2^{511 + 128*x} + * upper_bound = 2^{512 + 128*x} - 1 + */ + x = (bits - 512) / 128; + mpf_sqrt_ui (tmp_bound, 2); + mpf_mul_2exp (tmp_bound, tmp_bound, 511 + 128 * x); + mpf_ceil (tmp_bound, tmp_bound); + mpz_set_f (lower_bound, tmp_bound); + mpz_set_ui (upper_bound, 1); + mpz_mul_2exp (upper_bound, upper_bound, 512 + 128 * x); + mpz_sub_ui (upper_bound, upper_bound, 1); + mpz_sub (range, upper_bound, lower_bound); + + /* Randomly choose X, y[0] and y[1] */ + Py_BLOCK_THREADS; + res = 1; + res &= getRandomRange (X, lower_bound, upper_bound, randfunc); + res &= getRandomNBitInteger (y[0], 101, randfunc); + res &= getRandomNBitInteger (y[1], 101, randfunc); + Py_UNBLOCK_THREADS; + if (!res) + { + error = 1; + goto cleanup; + } + + /* generate p1 and p2 */ + for (i = 0; i < 2; ++i) + { + /* generate p[i] */ + /* initialize the field for sieving */ + field = (char*)calloc (field_size, 1); + sieve_field (field, field_size, y[i]); + + result = 0; + for (j = 0; j < field_size; ++j) + { + /* look for next canidate */ + if (field[j]) + continue; + mpz_add_ui (tmp[0], y[i], j); + Py_BLOCK_THREADS; + result = rabinMillerTest(tmp[0], rabin_miller_rounds, randfunc); + Py_UNBLOCK_THREADS; + if (result > 0) + break; + else if (result < 0) + { + error = 1; + goto cleanup; + } + } + free (field); + if (!result) + { + error = 1; + Py_BLOCK_THREADS; + PyErr_SetString (PyExc_RuntimeError, + "Couln't find prime in field. " + "Developer: Increase field_size"); + /* unblock threads because we acquire the GIL after cleanup */ + Py_UNBLOCK_THREADS; + goto cleanup; + } + mpz_set (p[i], tmp[0]); + } + + /* Calculate R + * R = (p2^{-1} mod p1) * p2 - (p1^{-1} mod p2) * p1 + */ + mpz_invert (tmp[0], p[1], p[0]); /* p2^-1 mod p1 */ + mpz_invert (tmp[1], p[0], p[1]); /* p1^-1 mod p2 */ + mpz_mul (tmp[0], tmp[0], p[1]); /* (p2^-1 mod p1)*p2 */ + mpz_mul (tmp[1], tmp[1], p[0]); /* (p1^-1 mod p2)*p1 */ + mpz_sub (R, tmp[0], tmp[1]); /* (p2^-1 mod p1)*p2 - (p1^-1 mod p2)*p1 */ + + /* search for final prime number starting by Y0 + * Y0 = X + (R - X mod p1p2) + */ + mpz_mul (increment, p[0], p[1]); /* p1 * p2 */ + mpz_mod (tmp[0], X, increment); /* X mod (p1*p2) */ + mpz_sub (tmp[1], R, tmp[0]); /* R - X mod (p1*p2) */ + mpz_add (X, X, tmp[1]); /* X + (R - X mod (p1*p2)) */ + while (1) + { + is_possible_prime = 1; + /* first check canidate against sieve_base */ + for (j = 0; j < base_size; ++j) + { + if (mpz_divisible_ui_p (X, sieve_base[j])) + { + is_possible_prime = 0; + break; + } + } + /* if e is given check for some more constrains */ + if (e && is_possible_prime) + { + /* if e is odd make sure that e and X-1 are coprime */ + if (e & 1) + { + mpz_sub_ui (tmp[0], X, 1); + if (mpz_gcd_ui (NULL, tmp[0], e) != 1) + is_possible_prime = 0; + } + /* if e is even make sure that e and (X-1)/2 are coprime. */ + else + { + mpz_sub_ui (tmp[0], X, 1); + mpz_divexact_ui (tmp[0], tmp[0], 2); + if (mpz_gcd_ui (NULL, tmp[0], e) != 1) + is_possible_prime = 0; + } + } + /* let gmp do some Rabin-Miller-Tests */ + if (is_possible_prime) + { + Py_BLOCK_THREADS; + result = rabinMillerTest(X, rabin_miller_rounds, randfunc); + Py_UNBLOCK_THREADS; + if (result > 0) + break; + else if (result < 0) + { + error = 1; + goto cleanup; + } + } + mpz_add (X, X, increment); + /* abort when X is larger than upper_bound */ + /* TODO: maybe we shouldn't abort but rather start over. + * X probably was an unfortunate choice. */ + if (mpz_cmp (X, upper_bound) >= 0) + { + error = 1; + Py_BLOCK_THREADS; + PyErr_SetString (PyExc_RuntimeError, + "Couln't find prime in field. " + "Developer: Increase field_size"); + /* unblock threads because we acquire the GIL after cleanup */ + Py_UNBLOCK_THREADS; + goto cleanup; + } + } + +cleanup: + mpz_clear (range); + mpz_clear (increment); + mpz_clear (upper_bound); + mpz_clear (lower_bound); + mpz_clear (R); + mpz_clear (tmp[1]); + mpz_clear (tmp[0]); + mpz_clear (p[1]); + mpz_clear (p[0]); + mpz_clear (y[1]); + mpz_clear (y[0]); + /* mpzToLongObj uses Python API so we must acquire the GIL */ + Py_END_ALLOW_THREADS; + if (error) + prime = NULL; + else + prime = mpzToLongObj (X); + mpz_clear (X); + return prime; +} + + + +static PyMethodDef _fastmath__methods__[] = { + {"dsa_construct", dsaKey_new, METH_VARARGS}, + {"rsa_construct", rsaKey_new, METH_VARARGS}, + {"isPrime", (PyCFunction)isPrime, METH_VARARGS | METH_KEYWORDS}, + {"getStrongPrime", (PyCFunction)getStrongPrime, METH_VARARGS | METH_KEYWORDS}, + {NULL, NULL} +}; + +#ifdef IS_PY3K +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "_fastmath", + NULL, + -1, + _fastmath__methods__, + NULL, + NULL, + NULL, + NULL +}; +#endif + +#ifdef IS_PY3K +PyMODINIT_FUNC +PyInit__fastmath (void) +#else +void +init_fastmath (void) +#endif +{ + PyObject *_fastmath_module; + PyObject *_fastmath_dict; + +#ifdef IS_PY3K + /* PyType_Ready automatically fills in ob_type with &PyType_Type if it's not already set */ + if (PyType_Ready(&rsaKeyType) < 0) + return NULL; + if (PyType_Ready(&dsaKeyType) < 0) + return NULL; + + _fastmath_module = PyModule_Create(&moduledef); + if (_fastmath_module == NULL) + return NULL; +#else + rsaKeyType.ob_type = &PyType_Type; + dsaKeyType.ob_type = &PyType_Type; + _fastmath_module = Py_InitModule ("_fastmath", _fastmath__methods__); +#endif + _fastmath_dict = PyModule_GetDict (_fastmath_module); + fastmathError = PyErr_NewException ("_fastmath.error", NULL, NULL); +#ifdef IS_PY3K + if (fastmathError == NULL) return NULL; +#endif + PyDict_SetItemString (_fastmath_dict, "error", fastmathError); + + PyModule_AddIntConstant(_fastmath_module, "HAVE_DECL_MPZ_POWM_SEC", HAVE_DECL_MPZ_POWM_SEC); + +#ifdef IS_PY3K + return _fastmath_module; +#endif +} + +/* The first 10000 primes to be used as a base for sieving */ +static unsigned int sieve_base[10000] = { + 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, + 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, + 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, + 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, + 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, + 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, + 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, + 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, + 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, + 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, + 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, + 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, + 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, + 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, + 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, + 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, + 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, + 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, + 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, + 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, + 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, + 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, + 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, + 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, + 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, + 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, + 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, + 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, + 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, + 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, + 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, + 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, + 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, + 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, + 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, + 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, + 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, + 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, + 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, + 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, + 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, + 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, + 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, + 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, + 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, + 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, + 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, + 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, + 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, + 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, + 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, + 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, + 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, + 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, + 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, + 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, + 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, + 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, + 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, + 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, + 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, + 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, + 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, + 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, + 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, + 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, + 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, + 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, + 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, + 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, + 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, + 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, + 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, + 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, + 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, + 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, + 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, + 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, + 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, + 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, + 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, + 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, + 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, + 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, + 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, + 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, + 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, + 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, + 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, + 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, + 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, + 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, + 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, + 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, + 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, + 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, + 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, + 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, + 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, + 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, + 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, + 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, + 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, + 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, + 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, + 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, + 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, + 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, + 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, + 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, + 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, + 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, + 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, + 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, + 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, + 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, + 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, + 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, + 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, + 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, + 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, + 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, + 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, + 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, + 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, + 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271, + 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343, + 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, + 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, + 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, + 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, + 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, + 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, + 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, + 11069, 11071, 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, + 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251, + 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317, 11321, 11329, + 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443, + 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, + 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, + 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, + 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, + 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933, + 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, + 12037, 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, + 12113, 12119, 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, + 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289, + 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391, 12401, + 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487, + 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, + 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, + 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, + 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, + 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923, + 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, + 13009, 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, + 13121, 13127, 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, + 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, + 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411, + 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499, + 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, + 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, + 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, + 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, + 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967, + 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, + 14083, 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, + 14207, 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, + 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419, + 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519, + 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593, + 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, + 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, + 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, + 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, + 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, + 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, + 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, + 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, + 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401, + 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497, + 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607, + 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, + 15683, 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, + 15787, 15791, 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, + 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, + 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069, + 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, + 16187, 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, + 16273, 16301, 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, + 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481, + 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603, + 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691, + 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, + 16823, 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, + 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, + 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093, + 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191, + 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, + 17321, 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, + 17393, 17401, 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, + 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573, + 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, + 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, + 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891, + 17903, 17909, 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971, + 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, + 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143, + 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233, + 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, + 18329, 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, + 18433, 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, + 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, + 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749, + 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899, + 18911, 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009, + 19013, 19031, 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121, + 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, + 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319, + 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423, + 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, + 19483, 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, + 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, + 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793, + 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, + 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, + 19993, 19997, 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071, + 20089, 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149, + 20161, 20173, 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261, + 20269, 20287, 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357, + 20359, 20369, 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443, + 20477, 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, 20551, + 20563, 20593, 20599, 20611, 20627, 20639, 20641, 20663, 20681, 20693, + 20707, 20717, 20719, 20731, 20743, 20747, 20749, 20753, 20759, 20771, + 20773, 20789, 20807, 20809, 20849, 20857, 20873, 20879, 20887, 20897, + 20899, 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981, 20983, + 21001, 21011, 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067, + 21089, 21101, 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169, + 21179, 21187, 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, + 21283, 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, + 21391, 21397, 21401, 21407, 21419, 21433, 21467, 21481, 21487, 21491, + 21493, 21499, 21503, 21517, 21521, 21523, 21529, 21557, 21559, 21563, + 21569, 21577, 21587, 21589, 21599, 21601, 21611, 21613, 21617, 21647, + 21649, 21661, 21673, 21683, 21701, 21713, 21727, 21737, 21739, 21751, + 21757, 21767, 21773, 21787, 21799, 21803, 21817, 21821, 21839, 21841, + 21851, 21859, 21863, 21871, 21881, 21893, 21911, 21929, 21937, 21943, + 21961, 21977, 21991, 21997, 22003, 22013, 22027, 22031, 22037, 22039, + 22051, 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123, + 22129, 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, + 22247, 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307, + 22343, 22349, 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441, + 22447, 22453, 22469, 22481, 22483, 22501, 22511, 22531, 22541, 22543, + 22549, 22567, 22571, 22573, 22613, 22619, 22621, 22637, 22639, 22643, + 22651, 22669, 22679, 22691, 22697, 22699, 22709, 22717, 22721, 22727, + 22739, 22741, 22751, 22769, 22777, 22783, 22787, 22807, 22811, 22817, + 22853, 22859, 22861, 22871, 22877, 22901, 22907, 22921, 22937, 22943, + 22961, 22963, 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029, + 23039, 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099, + 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203, + 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321, + 23327, 23333, 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447, + 23459, 23473, 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561, + 23563, 23567, 23581, 23593, 23599, 23603, 23609, 23623, 23627, 23629, + 23633, 23663, 23669, 23671, 23677, 23687, 23689, 23719, 23741, 23743, + 23747, 23753, 23761, 23767, 23773, 23789, 23801, 23813, 23819, 23827, + 23831, 23833, 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909, + 23911, 23917, 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007, + 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, 24091, + 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, 24151, 24169, + 24179, 24181, 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281, + 24317, 24329, 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413, + 24419, 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517, + 24527, 24533, 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659, + 24671, 24677, 24683, 24691, 24697, 24709, 24733, 24749, 24763, 24767, + 24781, 24793, 24799, 24809, 24821, 24841, 24847, 24851, 24859, 24877, + 24889, 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977, + 24979, 24989, 25013, 25031, 25033, 25037, 25057, 25073, 25087, 25097, + 25111, 25117, 25121, 25127, 25147, 25153, 25163, 25169, 25171, 25183, + 25189, 25219, 25229, 25237, 25243, 25247, 25253, 25261, 25301, 25303, + 25307, 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373, 25391, + 25409, 25411, 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471, + 25523, 25537, 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603, + 25609, 25621, 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693, + 25703, 25717, 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, + 25801, 25819, 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913, + 25919, 25931, 25933, 25939, 25943, 25951, 25969, 25981, 25997, 25999, + 26003, 26017, 26021, 26029, 26041, 26053, 26083, 26099, 26107, 26111, + 26113, 26119, 26141, 26153, 26161, 26171, 26177, 26183, 26189, 26203, + 26209, 26227, 26237, 26249, 26251, 26261, 26263, 26267, 26293, 26297, + 26309, 26317, 26321, 26339, 26347, 26357, 26371, 26387, 26393, 26399, + 26407, 26417, 26423, 26431, 26437, 26449, 26459, 26479, 26489, 26497, + 26501, 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633, + 26641, 26647, 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, + 26713, 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, + 26813, 26821, 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891, + 26893, 26903, 26921, 26927, 26947, 26951, 26953, 26959, 26981, 26987, + 26993, 27011, 27017, 27031, 27043, 27059, 27061, 27067, 27073, 27077, + 27091, 27103, 27107, 27109, 27127, 27143, 27179, 27191, 27197, 27211, + 27239, 27241, 27253, 27259, 27271, 27277, 27281, 27283, 27299, 27329, + 27337, 27361, 27367, 27397, 27407, 27409, 27427, 27431, 27437, 27449, + 27457, 27479, 27481, 27487, 27509, 27527, 27529, 27539, 27541, 27551, + 27581, 27583, 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691, + 27697, 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767, + 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827, + 27847, 27851, 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947, + 27953, 27961, 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051, + 28057, 28069, 28081, 28087, 28097, 28099, 28109, 28111, 28123, 28151, + 28163, 28181, 28183, 28201, 28211, 28219, 28229, 28277, 28279, 28283, + 28289, 28297, 28307, 28309, 28319, 28349, 28351, 28387, 28393, 28403, + 28409, 28411, 28429, 28433, 28439, 28447, 28463, 28477, 28493, 28499, + 28513, 28517, 28537, 28541, 28547, 28549, 28559, 28571, 28573, 28579, + 28591, 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649, + 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723, 28729, + 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837, + 28843, 28859, 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933, + 28949, 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059, + 29063, 29077, 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167, + 29173, 29179, 29191, 29201, 29207, 29209, 29221, 29231, 29243, 29251, + 29269, 29287, 29297, 29303, 29311, 29327, 29333, 29339, 29347, 29363, + 29383, 29387, 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443, + 29453, 29473, 29483, 29501, 29527, 29531, 29537, 29567, 29569, 29573, + 29581, 29587, 29599, 29611, 29629, 29633, 29641, 29663, 29669, 29671, + 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789, 29803, 29819, + 29833, 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917, 29921, + 29927, 29947, 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059, + 30071, 30089, 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137, + 30139, 30161, 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241, + 30253, 30259, 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341, + 30347, 30367, 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469, + 30491, 30493, 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559, + 30577, 30593, 30631, 30637, 30643, 30649, 30661, 30671, 30677, 30689, + 30697, 30703, 30707, 30713, 30727, 30757, 30763, 30773, 30781, 30803, + 30809, 30817, 30829, 30839, 30841, 30851, 30853, 30859, 30869, 30871, + 30881, 30893, 30911, 30931, 30937, 30941, 30949, 30971, 30977, 30983, + 31013, 31019, 31033, 31039, 31051, 31063, 31069, 31079, 31081, 31091, + 31121, 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183, + 31189, 31193, 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259, + 31267, 31271, 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, + 31379, 31387, 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, + 31513, 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, 31601, + 31607, 31627, 31643, 31649, 31657, 31663, 31667, 31687, 31699, 31721, + 31723, 31727, 31729, 31741, 31751, 31769, 31771, 31793, 31799, 31817, + 31847, 31849, 31859, 31873, 31883, 31891, 31907, 31957, 31963, 31973, + 31981, 31991, 32003, 32009, 32027, 32029, 32051, 32057, 32059, 32063, + 32069, 32077, 32083, 32089, 32099, 32117, 32119, 32141, 32143, 32159, + 32173, 32183, 32189, 32191, 32203, 32213, 32233, 32237, 32251, 32257, + 32261, 32297, 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353, + 32359, 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, + 32429, 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531, + 32533, 32537, 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609, + 32611, 32621, 32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717, + 32719, 32749, 32771, 32779, 32783, 32789, 32797, 32801, 32803, 32831, + 32833, 32839, 32843, 32869, 32887, 32909, 32911, 32917, 32933, 32939, + 32941, 32957, 32969, 32971, 32983, 32987, 32993, 32999, 33013, 33023, + 33029, 33037, 33049, 33053, 33071, 33073, 33083, 33091, 33107, 33113, + 33119, 33149, 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211, + 33223, 33247, 33287, 33289, 33301, 33311, 33317, 33329, 33331, 33343, + 33347, 33349, 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427, + 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533, + 33547, 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613, + 33617, 33619, 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713, + 33721, 33739, 33749, 33751, 33757, 33767, 33769, 33773, 33791, 33797, + 33809, 33811, 33827, 33829, 33851, 33857, 33863, 33871, 33889, 33893, + 33911, 33923, 33931, 33937, 33941, 33961, 33967, 33997, 34019, 34031, + 34033, 34039, 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157, + 34159, 34171, 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261, + 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319, 34327, 34337, + 34351, 34361, 34367, 34369, 34381, 34403, 34421, 34429, 34439, 34457, + 34469, 34471, 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537, + 34543, 34549, 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649, + 34651, 34667, 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739, + 34747, 34757, 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847, + 34849, 34871, 34877, 34883, 34897, 34913, 34919, 34939, 34949, 34961, + 34963, 34981, 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083, + 35089, 35099, 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159, + 35171, 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, 35291, + 35311, 35317, 35323, 35327, 35339, 35353, 35363, 35381, 35393, 35401, + 35407, 35419, 35423, 35437, 35447, 35449, 35461, 35491, 35507, 35509, + 35521, 35527, 35531, 35533, 35537, 35543, 35569, 35573, 35591, 35593, + 35597, 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759, + 35771, 35797, 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863, + 35869, 35879, 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969, + 35977, 35983, 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, + 36067, 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161, + 36187, 36191, 36209, 36217, 36229, 36241, 36251, 36263, 36269, 36277, + 36293, 36299, 36307, 36313, 36319, 36341, 36343, 36353, 36373, 36383, + 36389, 36433, 36451, 36457, 36467, 36469, 36473, 36479, 36493, 36497, + 36523, 36527, 36529, 36541, 36551, 36559, 36563, 36571, 36583, 36587, + 36599, 36607, 36629, 36637, 36643, 36653, 36671, 36677, 36683, 36691, + 36697, 36709, 36713, 36721, 36739, 36749, 36761, 36767, 36779, 36781, + 36787, 36791, 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877, + 36887, 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, + 36973, 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, + 37061, 37087, 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189, + 37199, 37201, 37217, 37223, 37243, 37253, 37273, 37277, 37307, 37309, + 37313, 37321, 37337, 37339, 37357, 37361, 37363, 37369, 37379, 37397, + 37409, 37423, 37441, 37447, 37463, 37483, 37489, 37493, 37501, 37507, + 37511, 37517, 37529, 37537, 37547, 37549, 37561, 37567, 37571, 37573, + 37579, 37589, 37591, 37607, 37619, 37633, 37643, 37649, 37657, 37663, + 37691, 37693, 37699, 37717, 37747, 37781, 37783, 37799, 37811, 37813, + 37831, 37847, 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951, + 37957, 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047, + 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183, + 38189, 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281, + 38287, 38299, 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371, + 38377, 38393, 38431, 38447, 38449, 38453, 38459, 38461, 38501, 38543, + 38557, 38561, 38567, 38569, 38593, 38603, 38609, 38611, 38629, 38639, + 38651, 38653, 38669, 38671, 38677, 38693, 38699, 38707, 38711, 38713, + 38723, 38729, 38737, 38747, 38749, 38767, 38783, 38791, 38803, 38821, + 38833, 38839, 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921, + 38923, 38933, 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041, + 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, 39133, + 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227, + 39229, 39233, 39239, 39241, 39251, 39293, 39301, 39313, 39317, 39323, + 39341, 39343, 39359, 39367, 39371, 39373, 39383, 39397, 39409, 39419, + 39439, 39443, 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541, + 39551, 39563, 39569, 39581, 39607, 39619, 39623, 39631, 39659, 39667, + 39671, 39679, 39703, 39709, 39719, 39727, 39733, 39749, 39761, 39769, + 39779, 39791, 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857, + 39863, 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971, + 39979, 39983, 39989, 40009, 40013, 40031, 40037, 40039, 40063, 40087, + 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153, 40163, 40169, + 40177, 40189, 40193, 40213, 40231, 40237, 40241, 40253, 40277, 40283, + 40289, 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433, + 40459, 40471, 40483, 40487, 40493, 40499, 40507, 40519, 40529, 40531, + 40543, 40559, 40577, 40583, 40591, 40597, 40609, 40627, 40637, 40639, + 40693, 40697, 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787, + 40801, 40813, 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867, + 40879, 40883, 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973, + 40993, 41011, 41017, 41023, 41039, 41047, 41051, 41057, 41077, 41081, + 41113, 41117, 41131, 41141, 41143, 41149, 41161, 41177, 41179, 41183, + 41189, 41201, 41203, 41213, 41221, 41227, 41231, 41233, 41243, 41257, + 41263, 41269, 41281, 41299, 41333, 41341, 41351, 41357, 41381, 41387, + 41389, 41399, 41411, 41413, 41443, 41453, 41467, 41479, 41491, 41507, + 41513, 41519, 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603, + 41609, 41611, 41617, 41621, 41627, 41641, 41647, 41651, 41659, 41669, + 41681, 41687, 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801, + 41809, 41813, 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, + 41903, 41911, 41927, 41941, 41947, 41953, 41957, 41959, 41969, 41981, + 41983, 41999, 42013, 42017, 42019, 42023, 42043, 42061, 42071, 42073, + 42083, 42089, 42101, 42131, 42139, 42157, 42169, 42179, 42181, 42187, + 42193, 42197, 42209, 42221, 42223, 42227, 42239, 42257, 42281, 42283, + 42293, 42299, 42307, 42323, 42331, 42337, 42349, 42359, 42373, 42379, + 42391, 42397, 42403, 42407, 42409, 42433, 42437, 42443, 42451, 42457, + 42461, 42463, 42467, 42473, 42487, 42491, 42499, 42509, 42533, 42557, + 42569, 42571, 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677, + 42683, 42689, 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743, + 42751, 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841, + 42853, 42859, 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953, + 42961, 42967, 42979, 42989, 43003, 43013, 43019, 43037, 43049, 43051, + 43063, 43067, 43093, 43103, 43117, 43133, 43151, 43159, 43177, 43189, + 43201, 43207, 43223, 43237, 43261, 43271, 43283, 43291, 43313, 43319, + 43321, 43331, 43391, 43397, 43399, 43403, 43411, 43427, 43441, 43451, + 43457, 43481, 43487, 43499, 43517, 43541, 43543, 43573, 43577, 43579, + 43591, 43597, 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661, + 43669, 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783, + 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933, + 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017, + 44021, 44027, 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101, + 44111, 44119, 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201, + 44203, 44207, 44221, 44249, 44257, 44263, 44267, 44269, 44273, 44279, + 44281, 44293, 44351, 44357, 44371, 44381, 44383, 44389, 44417, 44449, + 44453, 44483, 44491, 44497, 44501, 44507, 44519, 44531, 44533, 44537, + 44543, 44549, 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641, + 44647, 44651, 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741, + 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819, 44839, 44843, + 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, 44939, 44953, + 44959, 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077, + 45083, 45119, 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181, + 45191, 45197, 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307, + 45317, 45319, 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403, + 45413, 45427, 45433, 45439, 45481, 45491, 45497, 45503, 45523, 45533, + 45541, 45553, 45557, 45569, 45587, 45589, 45599, 45613, 45631, 45641, + 45659, 45667, 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757, + 45763, 45767, 45779, 45817, 45821, 45823, 45827, 45833, 45841, 45853, + 45863, 45869, 45887, 45893, 45943, 45949, 45953, 45959, 45971, 45979, + 45989, 46021, 46027, 46049, 46051, 46061, 46073, 46091, 46093, 46099, + 46103, 46133, 46141, 46147, 46153, 46171, 46181, 46183, 46187, 46199, + 46219, 46229, 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309, + 46327, 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447, + 46451, 46457, 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549, + 46559, 46567, 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, + 46649, 46663, 46679, 46681, 46687, 46691, 46703, 46723, 46727, 46747, + 46751, 46757, 46769, 46771, 46807, 46811, 46817, 46819, 46829, 46831, + 46853, 46861, 46867, 46877, 46889, 46901, 46919, 46933, 46957, 46993, + 46997, 47017, 47041, 47051, 47057, 47059, 47087, 47093, 47111, 47119, + 47123, 47129, 47137, 47143, 47147, 47149, 47161, 47189, 47207, 47221, + 47237, 47251, 47269, 47279, 47287, 47293, 47297, 47303, 47309, 47317, + 47339, 47351, 47353, 47363, 47381, 47387, 47389, 47407, 47417, 47419, + 47431, 47441, 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527, + 47533, 47543, 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, + 47639, 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, + 47737, 47741, 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47819, + 47837, 47843, 47857, 47869, 47881, 47903, 47911, 47917, 47933, 47939, + 47947, 47951, 47963, 47969, 47977, 47981, 48017, 48023, 48029, 48049, + 48073, 48079, 48091, 48109, 48119, 48121, 48131, 48157, 48163, 48179, + 48187, 48193, 48197, 48221, 48239, 48247, 48259, 48271, 48281, 48299, + 48311, 48313, 48337, 48341, 48353, 48371, 48383, 48397, 48407, 48409, + 48413, 48437, 48449, 48463, 48473, 48479, 48481, 48487, 48491, 48497, + 48523, 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611, + 48619, 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733, + 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817, + 48821, 48823, 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907, + 48947, 48953, 48973, 48989, 48991, 49003, 49009, 49019, 49031, 49033, + 49037, 49043, 49057, 49069, 49081, 49103, 49109, 49117, 49121, 49123, + 49139, 49157, 49169, 49171, 49177, 49193, 49199, 49201, 49207, 49211, + 49223, 49253, 49261, 49277, 49279, 49297, 49307, 49331, 49333, 49339, + 49363, 49367, 49369, 49391, 49393, 49409, 49411, 49417, 49429, 49433, + 49451, 49459, 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537, + 49547, 49549, 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663, + 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747, 49757, + 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853, + 49871, 49877, 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957, + 49991, 49993, 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069, + 50077, 50087, 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147, + 50153, 50159, 50177, 50207, 50221, 50227, 50231, 50261, 50263, 50273, + 50287, 50291, 50311, 50321, 50329, 50333, 50341, 50359, 50363, 50377, + 50383, 50387, 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503, + 50513, 50527, 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593, + 50599, 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, 50753, + 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849, 50857, 50867, + 50873, 50891, 50893, 50909, 50923, 50929, 50951, 50957, 50969, 50971, + 50989, 50993, 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109, + 51131, 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203, + 51217, 51229, 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329, + 51341, 51343, 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421, + 51427, 51431, 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487, + 51503, 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593, + 51599, 51607, 51613, 51631, 51637, 51647, 51659, 51673, 51679, 51683, + 51691, 51713, 51719, 51721, 51749, 51767, 51769, 51787, 51797, 51803, + 51817, 51827, 51829, 51839, 51853, 51859, 51869, 51871, 51893, 51899, + 51907, 51913, 51929, 51941, 51949, 51971, 51973, 51977, 51991, 52009, + 52021, 52027, 52051, 52057, 52067, 52069, 52081, 52103, 52121, 52127, + 52147, 52153, 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237, + 52249, 52253, 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361, + 52363, 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, + 52511, 52517, 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, + 52583, 52609, 52627, 52631, 52639, 52667, 52673, 52691, 52697, 52709, + 52711, 52721, 52727, 52733, 52747, 52757, 52769, 52783, 52807, 52813, + 52817, 52837, 52859, 52861, 52879, 52883, 52889, 52901, 52903, 52919, + 52937, 52951, 52957, 52963, 52967, 52973, 52981, 52999, 53003, 53017, + 53047, 53051, 53069, 53077, 53087, 53089, 53093, 53101, 53113, 53117, + 53129, 53147, 53149, 53161, 53171, 53173, 53189, 53197, 53201, 53231, + 53233, 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323, 53327, + 53353, 53359, 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441, + 53453, 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, + 53597, 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657, + 53681, 53693, 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783, + 53791, 53813, 53819, 53831, 53849, 53857, 53861, 53881, 53887, 53891, + 53897, 53899, 53917, 53923, 53927, 53939, 53951, 53959, 53987, 53993, + 54001, 54011, 54013, 54037, 54049, 54059, 54083, 54091, 54101, 54121, + 54133, 54139, 54151, 54163, 54167, 54181, 54193, 54217, 54251, 54269, + 54277, 54287, 54293, 54311, 54319, 54323, 54331, 54347, 54361, 54367, + 54371, 54377, 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443, + 54449, 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541, + 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629, + 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751, + 54767, 54773, 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877, + 54881, 54907, 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983, + 55001, 55009, 55021, 55049, 55051, 55057, 55061, 55073, 55079, 55103, + 55109, 55117, 55127, 55147, 55163, 55171, 55201, 55207, 55213, 55217, + 55219, 55229, 55243, 55249, 55259, 55291, 55313, 55331, 55333, 55337, + 55339, 55343, 55351, 55373, 55381, 55399, 55411, 55439, 55441, 55457, + 55469, 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603, + 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663, 55667, 55673, + 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, 55787, 55793, + 55799, 55807, 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849, + 55871, 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949, + 55967, 55987, 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087, + 56093, 56099, 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179, + 56197, 56207, 56209, 56237, 56239, 56249, 56263, 56267, 56269, 56299, + 56311, 56333, 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431, + 56437, 56443, 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503, + 56509, 56519, 56527, 56531, 56533, 56543, 56569, 56591, 56597, 56599, + 56611, 56629, 56633, 56659, 56663, 56671, 56681, 56687, 56701, 56711, + 56713, 56731, 56737, 56747, 56767, 56773, 56779, 56783, 56807, 56809, + 56813, 56821, 56827, 56843, 56857, 56873, 56891, 56893, 56897, 56909, + 56911, 56921, 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989, + 56993, 56999, 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097, + 57107, 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191, + 57193, 57203, 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, + 57287, 57301, 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389, + 57397, 57413, 57427, 57457, 57467, 57487, 57493, 57503, 57527, 57529, + 57557, 57559, 57571, 57587, 57593, 57601, 57637, 57641, 57649, 57653, + 57667, 57679, 57689, 57697, 57709, 57713, 57719, 57727, 57731, 57737, + 57751, 57773, 57781, 57787, 57791, 57793, 57803, 57809, 57829, 57839, + 57847, 57853, 57859, 57881, 57899, 57901, 57917, 57923, 57943, 57947, + 57973, 57977, 57991, 58013, 58027, 58031, 58043, 58049, 58057, 58061, + 58067, 58073, 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169, + 58171, 58189, 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, + 58243, 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, + 58391, 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453, + 58477, 58481, 58511, 58537, 58543, 58549, 58567, 58573, 58579, 58601, + 58603, 58613, 58631, 58657, 58661, 58679, 58687, 58693, 58699, 58711, + 58727, 58733, 58741, 58757, 58763, 58771, 58787, 58789, 58831, 58889, + 58897, 58901, 58907, 58909, 58913, 58921, 58937, 58943, 58963, 58967, + 58979, 58991, 58997, 59009, 59011, 59021, 59023, 59029, 59051, 59053, + 59063, 59069, 59077, 59083, 59093, 59107, 59113, 59119, 59123, 59141, + 59149, 59159, 59167, 59183, 59197, 59207, 59209, 59219, 59221, 59233, + 59239, 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359, + 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443, + 59447, 59453, 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557, + 59561, 59567, 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659, + 59663, 59669, 59671, 59693, 59699, 59707, 59723, 59729, 59743, 59747, + 59753, 59771, 59779, 59791, 59797, 59809, 59833, 59863, 59879, 59887, + 59921, 59929, 59951, 59957, 59971, 59981, 59999, 60013, 60017, 60029, + 60037, 60041, 60077, 60083, 60089, 60091, 60101, 60103, 60107, 60127, + 60133, 60139, 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251, + 60257, 60259, 60271, 60289, 60293, 60317, 60331, 60337, 60343, 60353, + 60373, 60383, 60397, 60413, 60427, 60443, 60449, 60457, 60493, 60497, + 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623, + 60631, 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719, + 60727, 60733, 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811, + 60821, 60859, 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919, + 60923, 60937, 60943, 60953, 60961, 61001, 61007, 61027, 61031, 61043, + 61051, 61057, 61091, 61099, 61121, 61129, 61141, 61151, 61153, 61169, + 61211, 61223, 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333, + 61339, 61343, 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441, + 61463, 61469, 61471, 61483, 61487, 61493, 61507, 61511, 61519, 61543, + 61547, 61553, 61559, 61561, 61583, 61603, 61609, 61613, 61627, 61631, + 61637, 61643, 61651, 61657, 61667, 61673, 61681, 61687, 61703, 61717, + 61723, 61729, 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861, + 61871, 61879, 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981, + 61987, 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071, + 62081, 62099, 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189, + 62191, 62201, 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303, + 62311, 62323, 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459, + 62467, 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, 62549, + 62563, 62581, 62591, 62597, 62603, 62617, 62627, 62633, 62639, 62653, + 62659, 62683, 62687, 62701, 62723, 62731, 62743, 62753, 62761, 62773, + 62791, 62801, 62819, 62827, 62851, 62861, 62869, 62873, 62897, 62903, + 62921, 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987, 62989, + 63029, 63031, 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127, + 63131, 63149, 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281, + 63299, 63311, 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, + 63377, 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, + 63467, 63473, 63487, 63493, 63499, 63521, 63527, 63533, 63541, 63559, + 63577, 63587, 63589, 63599, 63601, 63607, 63611, 63617, 63629, 63647, + 63649, 63659, 63667, 63671, 63689, 63691, 63697, 63703, 63709, 63719, + 63727, 63737, 63743, 63761, 63773, 63781, 63793, 63799, 63803, 63809, + 63823, 63839, 63841, 63853, 63857, 63863, 63901, 63907, 63913, 63929, + 63949, 63977, 63997, 64007, 64013, 64019, 64033, 64037, 64063, 64067, + 64081, 64091, 64109, 64123, 64151, 64153, 64157, 64171, 64187, 64189, + 64217, 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319, + 64327, 64333, 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453, + 64483, 64489, 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601, + 64609, 64613, 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693, + 64709, 64717, 64747, 64763, 64781, 64783, 64793, 64811, 64817, 64849, + 64853, 64871, 64877, 64879, 64891, 64901, 64919, 64921, 64927, 64937, + 64951, 64969, 64997, 65003, 65011, 65027, 65029, 65033, 65053, 65063, + 65071, 65089, 65099, 65101, 65111, 65119, 65123, 65129, 65141, 65147, + 65167, 65171, 65173, 65179, 65183, 65203, 65213, 65239, 65257, 65267, + 65269, 65287, 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381, + 65393, 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497, + 65519, 65521, 65537, 65539, 65543, 65551, 65557, 65563, 65579, 65581, + 65587, 65599, 65609, 65617, 65629, 65633, 65647, 65651, 65657, 65677, + 65687, 65699, 65701, 65707, 65713, 65717, 65719, 65729, 65731, 65761, + 65777, 65789, 65809, 65827, 65831, 65837, 65839, 65843, 65851, 65867, + 65881, 65899, 65921, 65927, 65929, 65951, 65957, 65963, 65981, 65983, + 65993, 66029, 66037, 66041, 66047, 66067, 66071, 66083, 66089, 66103, + 66107, 66109, 66137, 66161, 66169, 66173, 66179, 66191, 66221, 66239, + 66271, 66293, 66301, 66337, 66343, 66347, 66359, 66361, 66373, 66377, + 66383, 66403, 66413, 66431, 66449, 66457, 66463, 66467, 66491, 66499, + 66509, 66523, 66529, 66533, 66541, 66553, 66569, 66571, 66587, 66593, + 66601, 66617, 66629, 66643, 66653, 66683, 66697, 66701, 66713, 66721, + 66733, 66739, 66749, 66751, 66763, 66791, 66797, 66809, 66821, 66841, + 66851, 66853, 66863, 66877, 66883, 66889, 66919, 66923, 66931, 66943, + 66947, 66949, 66959, 66973, 66977, 67003, 67021, 67033, 67043, 67049, + 67057, 67061, 67073, 67079, 67103, 67121, 67129, 67139, 67141, 67153, + 67157, 67169, 67181, 67187, 67189, 67211, 67213, 67217, 67219, 67231, + 67247, 67261, 67271, 67273, 67289, 67307, 67339, 67343, 67349, 67369, + 67391, 67399, 67409, 67411, 67421, 67427, 67429, 67433, 67447, 67453, + 67477, 67481, 67489, 67493, 67499, 67511, 67523, 67531, 67537, 67547, + 67559, 67567, 67577, 67579, 67589, 67601, 67607, 67619, 67631, 67651, + 67679, 67699, 67709, 67723, 67733, 67741, 67751, 67757, 67759, 67763, + 67777, 67783, 67789, 67801, 67807, 67819, 67829, 67843, 67853, 67867, + 67883, 67891, 67901, 67927, 67931, 67933, 67939, 67943, 67957, 67961, + 67967, 67979, 67987, 67993, 68023, 68041, 68053, 68059, 68071, 68087, + 68099, 68111, 68113, 68141, 68147, 68161, 68171, 68207, 68209, 68213, + 68219, 68227, 68239, 68261, 68279, 68281, 68311, 68329, 68351, 68371, + 68389, 68399, 68437, 68443, 68447, 68449, 68473, 68477, 68483, 68489, + 68491, 68501, 68507, 68521, 68531, 68539, 68543, 68567, 68581, 68597, + 68611, 68633, 68639, 68659, 68669, 68683, 68687, 68699, 68711, 68713, + 68729, 68737, 68743, 68749, 68767, 68771, 68777, 68791, 68813, 68819, + 68821, 68863, 68879, 68881, 68891, 68897, 68899, 68903, 68909, 68917, + 68927, 68947, 68963, 68993, 69001, 69011, 69019, 69029, 69031, 69061, + 69067, 69073, 69109, 69119, 69127, 69143, 69149, 69151, 69163, 69191, + 69193, 69197, 69203, 69221, 69233, 69239, 69247, 69257, 69259, 69263, + 69313, 69317, 69337, 69341, 69371, 69379, 69383, 69389, 69401, 69403, + 69427, 69431, 69439, 69457, 69463, 69467, 69473, 69481, 69491, 69493, + 69497, 69499, 69539, 69557, 69593, 69623, 69653, 69661, 69677, 69691, + 69697, 69709, 69737, 69739, 69761, 69763, 69767, 69779, 69809, 69821, + 69827, 69829, 69833, 69847, 69857, 69859, 69877, 69899, 69911, 69929, + 69931, 69941, 69959, 69991, 69997, 70001, 70003, 70009, 70019, 70039, + 70051, 70061, 70067, 70079, 70099, 70111, 70117, 70121, 70123, 70139, + 70141, 70157, 70163, 70177, 70181, 70183, 70199, 70201, 70207, 70223, + 70229, 70237, 70241, 70249, 70271, 70289, 70297, 70309, 70313, 70321, + 70327, 70351, 70373, 70379, 70381, 70393, 70423, 70429, 70439, 70451, + 70457, 70459, 70481, 70487, 70489, 70501, 70507, 70529, 70537, 70549, + 70571, 70573, 70583, 70589, 70607, 70619, 70621, 70627, 70639, 70657, + 70663, 70667, 70687, 70709, 70717, 70729, 70753, 70769, 70783, 70793, + 70823, 70841, 70843, 70849, 70853, 70867, 70877, 70879, 70891, 70901, + 70913, 70919, 70921, 70937, 70949, 70951, 70957, 70969, 70979, 70981, + 70991, 70997, 70999, 71011, 71023, 71039, 71059, 71069, 71081, 71089, + 71119, 71129, 71143, 71147, 71153, 71161, 71167, 71171, 71191, 71209, + 71233, 71237, 71249, 71257, 71261, 71263, 71287, 71293, 71317, 71327, + 71329, 71333, 71339, 71341, 71347, 71353, 71359, 71363, 71387, 71389, + 71399, 71411, 71413, 71419, 71429, 71437, 71443, 71453, 71471, 71473, + 71479, 71483, 71503, 71527, 71537, 71549, 71551, 71563, 71569, 71593, + 71597, 71633, 71647, 71663, 71671, 71693, 71699, 71707, 71711, 71713, + 71719, 71741, 71761, 71777, 71789, 71807, 71809, 71821, 71837, 71843, + 71849, 71861, 71867, 71879, 71881, 71887, 71899, 71909, 71917, 71933, + 71941, 71947, 71963, 71971, 71983, 71987, 71993, 71999, 72019, 72031, + 72043, 72047, 72053, 72073, 72077, 72089, 72091, 72101, 72103, 72109, + 72139, 72161, 72167, 72169, 72173, 72211, 72221, 72223, 72227, 72229, + 72251, 72253, 72269, 72271, 72277, 72287, 72307, 72313, 72337, 72341, + 72353, 72367, 72379, 72383, 72421, 72431, 72461, 72467, 72469, 72481, + 72493, 72497, 72503, 72533, 72547, 72551, 72559, 72577, 72613, 72617, + 72623, 72643, 72647, 72649, 72661, 72671, 72673, 72679, 72689, 72701, + 72707, 72719, 72727, 72733, 72739, 72763, 72767, 72797, 72817, 72823, + 72859, 72869, 72871, 72883, 72889, 72893, 72901, 72907, 72911, 72923, + 72931, 72937, 72949, 72953, 72959, 72973, 72977, 72997, 73009, 73013, + 73019, 73037, 73039, 73043, 73061, 73063, 73079, 73091, 73121, 73127, + 73133, 73141, 73181, 73189, 73237, 73243, 73259, 73277, 73291, 73303, + 73309, 73327, 73331, 73351, 73361, 73363, 73369, 73379, 73387, 73417, + 73421, 73433, 73453, 73459, 73471, 73477, 73483, 73517, 73523, 73529, + 73547, 73553, 73561, 73571, 73583, 73589, 73597, 73607, 73609, 73613, + 73637, 73643, 73651, 73673, 73679, 73681, 73693, 73699, 73709, 73721, + 73727, 73751, 73757, 73771, 73783, 73819, 73823, 73847, 73849, 73859, + 73867, 73877, 73883, 73897, 73907, 73939, 73943, 73951, 73961, 73973, + 73999, 74017, 74021, 74027, 74047, 74051, 74071, 74077, 74093, 74099, + 74101, 74131, 74143, 74149, 74159, 74161, 74167, 74177, 74189, 74197, + 74201, 74203, 74209, 74219, 74231, 74257, 74279, 74287, 74293, 74297, + 74311, 74317, 74323, 74353, 74357, 74363, 74377, 74381, 74383, 74411, + 74413, 74419, 74441, 74449, 74453, 74471, 74489, 74507, 74509, 74521, + 74527, 74531, 74551, 74561, 74567, 74573, 74587, 74597, 74609, 74611, + 74623, 74653, 74687, 74699, 74707, 74713, 74717, 74719, 74729, 74731, + 74747, 74759, 74761, 74771, 74779, 74797, 74821, 74827, 74831, 74843, + 74857, 74861, 74869, 74873, 74887, 74891, 74897, 74903, 74923, 74929, + 74933, 74941, 74959, 75011, 75013, 75017, 75029, 75037, 75041, 75079, + 75083, 75109, 75133, 75149, 75161, 75167, 75169, 75181, 75193, 75209, + 75211, 75217, 75223, 75227, 75239, 75253, 75269, 75277, 75289, 75307, + 75323, 75329, 75337, 75347, 75353, 75367, 75377, 75389, 75391, 75401, + 75403, 75407, 75431, 75437, 75479, 75503, 75511, 75521, 75527, 75533, + 75539, 75541, 75553, 75557, 75571, 75577, 75583, 75611, 75617, 75619, + 75629, 75641, 75653, 75659, 75679, 75683, 75689, 75703, 75707, 75709, + 75721, 75731, 75743, 75767, 75773, 75781, 75787, 75793, 75797, 75821, + 75833, 75853, 75869, 75883, 75913, 75931, 75937, 75941, 75967, 75979, + 75983, 75989, 75991, 75997, 76001, 76003, 76031, 76039, 76079, 76081, + 76091, 76099, 76103, 76123, 76129, 76147, 76157, 76159, 76163, 76207, + 76213, 76231, 76243, 76249, 76253, 76259, 76261, 76283, 76289, 76303, + 76333, 76343, 76367, 76369, 76379, 76387, 76403, 76421, 76423, 76441, + 76463, 76471, 76481, 76487, 76493, 76507, 76511, 76519, 76537, 76541, + 76543, 76561, 76579, 76597, 76603, 76607, 76631, 76649, 76651, 76667, + 76673, 76679, 76697, 76717, 76733, 76753, 76757, 76771, 76777, 76781, + 76801, 76819, 76829, 76831, 76837, 76847, 76871, 76873, 76883, 76907, + 76913, 76919, 76943, 76949, 76961, 76963, 76991, 77003, 77017, 77023, + 77029, 77041, 77047, 77069, 77081, 77093, 77101, 77137, 77141, 77153, + 77167, 77171, 77191, 77201, 77213, 77237, 77239, 77243, 77249, 77261, + 77263, 77267, 77269, 77279, 77291, 77317, 77323, 77339, 77347, 77351, + 77359, 77369, 77377, 77383, 77417, 77419, 77431, 77447, 77471, 77477, + 77479, 77489, 77491, 77509, 77513, 77521, 77527, 77543, 77549, 77551, + 77557, 77563, 77569, 77573, 77587, 77591, 77611, 77617, 77621, 77641, + 77647, 77659, 77681, 77687, 77689, 77699, 77711, 77713, 77719, 77723, + 77731, 77743, 77747, 77761, 77773, 77783, 77797, 77801, 77813, 77839, + 77849, 77863, 77867, 77893, 77899, 77929, 77933, 77951, 77969, 77977, + 77983, 77999, 78007, 78017, 78031, 78041, 78049, 78059, 78079, 78101, + 78121, 78137, 78139, 78157, 78163, 78167, 78173, 78179, 78191, 78193, + 78203, 78229, 78233, 78241, 78259, 78277, 78283, 78301, 78307, 78311, + 78317, 78341, 78347, 78367, 78401, 78427, 78437, 78439, 78467, 78479, + 78487, 78497, 78509, 78511, 78517, 78539, 78541, 78553, 78569, 78571, + 78577, 78583, 78593, 78607, 78623, 78643, 78649, 78653, 78691, 78697, + 78707, 78713, 78721, 78737, 78779, 78781, 78787, 78791, 78797, 78803, + 78809, 78823, 78839, 78853, 78857, 78877, 78887, 78889, 78893, 78901, + 78919, 78929, 78941, 78977, 78979, 78989, 79031, 79039, 79043, 79063, + 79087, 79103, 79111, 79133, 79139, 79147, 79151, 79153, 79159, 79181, + 79187, 79193, 79201, 79229, 79231, 79241, 79259, 79273, 79279, 79283, + 79301, 79309, 79319, 79333, 79337, 79349, 79357, 79367, 79379, 79393, + 79397, 79399, 79411, 79423, 79427, 79433, 79451, 79481, 79493, 79531, + 79537, 79549, 79559, 79561, 79579, 79589, 79601, 79609, 79613, 79621, + 79627, 79631, 79633, 79657, 79669, 79687, 79691, 79693, 79697, 79699, + 79757, 79769, 79777, 79801, 79811, 79813, 79817, 79823, 79829, 79841, + 79843, 79847, 79861, 79867, 79873, 79889, 79901, 79903, 79907, 79939, + 79943, 79967, 79973, 79979, 79987, 79997, 79999, 80021, 80039, 80051, + 80071, 80077, 80107, 80111, 80141, 80147, 80149, 80153, 80167, 80173, + 80177, 80191, 80207, 80209, 80221, 80231, 80233, 80239, 80251, 80263, + 80273, 80279, 80287, 80309, 80317, 80329, 80341, 80347, 80363, 80369, + 80387, 80407, 80429, 80447, 80449, 80471, 80473, 80489, 80491, 80513, + 80527, 80537, 80557, 80567, 80599, 80603, 80611, 80621, 80627, 80629, + 80651, 80657, 80669, 80671, 80677, 80681, 80683, 80687, 80701, 80713, + 80737, 80747, 80749, 80761, 80777, 80779, 80783, 80789, 80803, 80809, + 80819, 80831, 80833, 80849, 80863, 80897, 80909, 80911, 80917, 80923, + 80929, 80933, 80953, 80963, 80989, 81001, 81013, 81017, 81019, 81023, + 81031, 81041, 81043, 81047, 81049, 81071, 81077, 81083, 81097, 81101, + 81119, 81131, 81157, 81163, 81173, 81181, 81197, 81199, 81203, 81223, + 81233, 81239, 81281, 81283, 81293, 81299, 81307, 81331, 81343, 81349, + 81353, 81359, 81371, 81373, 81401, 81409, 81421, 81439, 81457, 81463, + 81509, 81517, 81527, 81533, 81547, 81551, 81553, 81559, 81563, 81569, + 81611, 81619, 81629, 81637, 81647, 81649, 81667, 81671, 81677, 81689, + 81701, 81703, 81707, 81727, 81737, 81749, 81761, 81769, 81773, 81799, + 81817, 81839, 81847, 81853, 81869, 81883, 81899, 81901, 81919, 81929, + 81931, 81937, 81943, 81953, 81967, 81971, 81973, 82003, 82007, 82009, + 82013, 82021, 82031, 82037, 82039, 82051, 82067, 82073, 82129, 82139, + 82141, 82153, 82163, 82171, 82183, 82189, 82193, 82207, 82217, 82219, + 82223, 82231, 82237, 82241, 82261, 82267, 82279, 82301, 82307, 82339, + 82349, 82351, 82361, 82373, 82387, 82393, 82421, 82457, 82463, 82469, + 82471, 82483, 82487, 82493, 82499, 82507, 82529, 82531, 82549, 82559, + 82561, 82567, 82571, 82591, 82601, 82609, 82613, 82619, 82633, 82651, + 82657, 82699, 82721, 82723, 82727, 82729, 82757, 82759, 82763, 82781, + 82787, 82793, 82799, 82811, 82813, 82837, 82847, 82883, 82889, 82891, + 82903, 82913, 82939, 82963, 82981, 82997, 83003, 83009, 83023, 83047, + 83059, 83063, 83071, 83077, 83089, 83093, 83101, 83117, 83137, 83177, + 83203, 83207, 83219, 83221, 83227, 83231, 83233, 83243, 83257, 83267, + 83269, 83273, 83299, 83311, 83339, 83341, 83357, 83383, 83389, 83399, + 83401, 83407, 83417, 83423, 83431, 83437, 83443, 83449, 83459, 83471, + 83477, 83497, 83537, 83557, 83561, 83563, 83579, 83591, 83597, 83609, + 83617, 83621, 83639, 83641, 83653, 83663, 83689, 83701, 83717, 83719, + 83737, 83761, 83773, 83777, 83791, 83813, 83833, 83843, 83857, 83869, + 83873, 83891, 83903, 83911, 83921, 83933, 83939, 83969, 83983, 83987, + 84011, 84017, 84047, 84053, 84059, 84061, 84067, 84089, 84121, 84127, + 84131, 84137, 84143, 84163, 84179, 84181, 84191, 84199, 84211, 84221, + 84223, 84229, 84239, 84247, 84263, 84299, 84307, 84313, 84317, 84319, + 84347, 84349, 84377, 84389, 84391, 84401, 84407, 84421, 84431, 84437, + 84443, 84449, 84457, 84463, 84467, 84481, 84499, 84503, 84509, 84521, + 84523, 84533, 84551, 84559, 84589, 84629, 84631, 84649, 84653, 84659, + 84673, 84691, 84697, 84701, 84713, 84719, 84731, 84737, 84751, 84761, + 84787, 84793, 84809, 84811, 84827, 84857, 84859, 84869, 84871, 84913, + 84919, 84947, 84961, 84967, 84977, 84979, 84991, 85009, 85021, 85027, + 85037, 85049, 85061, 85081, 85087, 85091, 85093, 85103, 85109, 85121, + 85133, 85147, 85159, 85193, 85199, 85201, 85213, 85223, 85229, 85237, + 85243, 85247, 85259, 85297, 85303, 85313, 85331, 85333, 85361, 85363, + 85369, 85381, 85411, 85427, 85429, 85439, 85447, 85451, 85453, 85469, + 85487, 85513, 85517, 85523, 85531, 85549, 85571, 85577, 85597, 85601, + 85607, 85619, 85621, 85627, 85639, 85643, 85661, 85667, 85669, 85691, + 85703, 85711, 85717, 85733, 85751, 85781, 85793, 85817, 85819, 85829, + 85831, 85837, 85843, 85847, 85853, 85889, 85903, 85909, 85931, 85933, + 85991, 85999, 86011, 86017, 86027, 86029, 86069, 86077, 86083, 86111, + 86113, 86117, 86131, 86137, 86143, 86161, 86171, 86179, 86183, 86197, + 86201, 86209, 86239, 86243, 86249, 86257, 86263, 86269, 86287, 86291, + 86293, 86297, 86311, 86323, 86341, 86351, 86353, 86357, 86369, 86371, + 86381, 86389, 86399, 86413, 86423, 86441, 86453, 86461, 86467, 86477, + 86491, 86501, 86509, 86531, 86533, 86539, 86561, 86573, 86579, 86587, + 86599, 86627, 86629, 86677, 86689, 86693, 86711, 86719, 86729, 86743, + 86753, 86767, 86771, 86783, 86813, 86837, 86843, 86851, 86857, 86861, + 86869, 86923, 86927, 86929, 86939, 86951, 86959, 86969, 86981, 86993, + 87011, 87013, 87037, 87041, 87049, 87071, 87083, 87103, 87107, 87119, + 87121, 87133, 87149, 87151, 87179, 87181, 87187, 87211, 87221, 87223, + 87251, 87253, 87257, 87277, 87281, 87293, 87299, 87313, 87317, 87323, + 87337, 87359, 87383, 87403, 87407, 87421, 87427, 87433, 87443, 87473, + 87481, 87491, 87509, 87511, 87517, 87523, 87539, 87541, 87547, 87553, + 87557, 87559, 87583, 87587, 87589, 87613, 87623, 87629, 87631, 87641, + 87643, 87649, 87671, 87679, 87683, 87691, 87697, 87701, 87719, 87721, + 87739, 87743, 87751, 87767, 87793, 87797, 87803, 87811, 87833, 87853, + 87869, 87877, 87881, 87887, 87911, 87917, 87931, 87943, 87959, 87961, + 87973, 87977, 87991, 88001, 88003, 88007, 88019, 88037, 88069, 88079, + 88093, 88117, 88129, 88169, 88177, 88211, 88223, 88237, 88241, 88259, + 88261, 88289, 88301, 88321, 88327, 88337, 88339, 88379, 88397, 88411, + 88423, 88427, 88463, 88469, 88471, 88493, 88499, 88513, 88523, 88547, + 88589, 88591, 88607, 88609, 88643, 88651, 88657, 88661, 88663, 88667, + 88681, 88721, 88729, 88741, 88747, 88771, 88789, 88793, 88799, 88801, + 88807, 88811, 88813, 88817, 88819, 88843, 88853, 88861, 88867, 88873, + 88883, 88897, 88903, 88919, 88937, 88951, 88969, 88993, 88997, 89003, + 89009, 89017, 89021, 89041, 89051, 89057, 89069, 89071, 89083, 89087, + 89101, 89107, 89113, 89119, 89123, 89137, 89153, 89189, 89203, 89209, + 89213, 89227, 89231, 89237, 89261, 89269, 89273, 89293, 89303, 89317, + 89329, 89363, 89371, 89381, 89387, 89393, 89399, 89413, 89417, 89431, + 89443, 89449, 89459, 89477, 89491, 89501, 89513, 89519, 89521, 89527, + 89533, 89561, 89563, 89567, 89591, 89597, 89599, 89603, 89611, 89627, + 89633, 89653, 89657, 89659, 89669, 89671, 89681, 89689, 89753, 89759, + 89767, 89779, 89783, 89797, 89809, 89819, 89821, 89833, 89839, 89849, + 89867, 89891, 89897, 89899, 89909, 89917, 89923, 89939, 89959, 89963, + 89977, 89983, 89989, 90001, 90007, 90011, 90017, 90019, 90023, 90031, + 90053, 90059, 90067, 90071, 90073, 90089, 90107, 90121, 90127, 90149, + 90163, 90173, 90187, 90191, 90197, 90199, 90203, 90217, 90227, 90239, + 90247, 90263, 90271, 90281, 90289, 90313, 90353, 90359, 90371, 90373, + 90379, 90397, 90401, 90403, 90407, 90437, 90439, 90469, 90473, 90481, + 90499, 90511, 90523, 90527, 90529, 90533, 90547, 90583, 90599, 90617, + 90619, 90631, 90641, 90647, 90659, 90677, 90679, 90697, 90703, 90709, + 90731, 90749, 90787, 90793, 90803, 90821, 90823, 90833, 90841, 90847, + 90863, 90887, 90901, 90907, 90911, 90917, 90931, 90947, 90971, 90977, + 90989, 90997, 91009, 91019, 91033, 91079, 91081, 91097, 91099, 91121, + 91127, 91129, 91139, 91141, 91151, 91153, 91159, 91163, 91183, 91193, + 91199, 91229, 91237, 91243, 91249, 91253, 91283, 91291, 91297, 91303, + 91309, 91331, 91367, 91369, 91373, 91381, 91387, 91393, 91397, 91411, + 91423, 91433, 91453, 91457, 91459, 91463, 91493, 91499, 91513, 91529, + 91541, 91571, 91573, 91577, 91583, 91591, 91621, 91631, 91639, 91673, + 91691, 91703, 91711, 91733, 91753, 91757, 91771, 91781, 91801, 91807, + 91811, 91813, 91823, 91837, 91841, 91867, 91873, 91909, 91921, 91939, + 91943, 91951, 91957, 91961, 91967, 91969, 91997, 92003, 92009, 92033, + 92041, 92051, 92077, 92083, 92107, 92111, 92119, 92143, 92153, 92173, + 92177, 92179, 92189, 92203, 92219, 92221, 92227, 92233, 92237, 92243, + 92251, 92269, 92297, 92311, 92317, 92333, 92347, 92353, 92357, 92363, + 92369, 92377, 92381, 92383, 92387, 92399, 92401, 92413, 92419, 92431, + 92459, 92461, 92467, 92479, 92489, 92503, 92507, 92551, 92557, 92567, + 92569, 92581, 92593, 92623, 92627, 92639, 92641, 92647, 92657, 92669, + 92671, 92681, 92683, 92693, 92699, 92707, 92717, 92723, 92737, 92753, + 92761, 92767, 92779, 92789, 92791, 92801, 92809, 92821, 92831, 92849, + 92857, 92861, 92863, 92867, 92893, 92899, 92921, 92927, 92941, 92951, + 92957, 92959, 92987, 92993, 93001, 93047, 93053, 93059, 93077, 93083, + 93089, 93097, 93103, 93113, 93131, 93133, 93139, 93151, 93169, 93179, + 93187, 93199, 93229, 93239, 93241, 93251, 93253, 93257, 93263, 93281, + 93283, 93287, 93307, 93319, 93323, 93329, 93337, 93371, 93377, 93383, + 93407, 93419, 93427, 93463, 93479, 93481, 93487, 93491, 93493, 93497, + 93503, 93523, 93529, 93553, 93557, 93559, 93563, 93581, 93601, 93607, + 93629, 93637, 93683, 93701, 93703, 93719, 93739, 93761, 93763, 93787, + 93809, 93811, 93827, 93851, 93871, 93887, 93889, 93893, 93901, 93911, + 93913, 93923, 93937, 93941, 93949, 93967, 93971, 93979, 93983, 93997, + 94007, 94009, 94033, 94049, 94057, 94063, 94079, 94099, 94109, 94111, + 94117, 94121, 94151, 94153, 94169, 94201, 94207, 94219, 94229, 94253, + 94261, 94273, 94291, 94307, 94309, 94321, 94327, 94331, 94343, 94349, + 94351, 94379, 94397, 94399, 94421, 94427, 94433, 94439, 94441, 94447, + 94463, 94477, 94483, 94513, 94529, 94531, 94541, 94543, 94547, 94559, + 94561, 94573, 94583, 94597, 94603, 94613, 94621, 94649, 94651, 94687, + 94693, 94709, 94723, 94727, 94747, 94771, 94777, 94781, 94789, 94793, + 94811, 94819, 94823, 94837, 94841, 94847, 94849, 94873, 94889, 94903, + 94907, 94933, 94949, 94951, 94961, 94993, 94999, 95003, 95009, 95021, + 95027, 95063, 95071, 95083, 95087, 95089, 95093, 95101, 95107, 95111, + 95131, 95143, 95153, 95177, 95189, 95191, 95203, 95213, 95219, 95231, + 95233, 95239, 95257, 95261, 95267, 95273, 95279, 95287, 95311, 95317, + 95327, 95339, 95369, 95383, 95393, 95401, 95413, 95419, 95429, 95441, + 95443, 95461, 95467, 95471, 95479, 95483, 95507, 95527, 95531, 95539, + 95549, 95561, 95569, 95581, 95597, 95603, 95617, 95621, 95629, 95633, + 95651, 95701, 95707, 95713, 95717, 95723, 95731, 95737, 95747, 95773, + 95783, 95789, 95791, 95801, 95803, 95813, 95819, 95857, 95869, 95873, + 95881, 95891, 95911, 95917, 95923, 95929, 95947, 95957, 95959, 95971, + 95987, 95989, 96001, 96013, 96017, 96043, 96053, 96059, 96079, 96097, + 96137, 96149, 96157, 96167, 96179, 96181, 96199, 96211, 96221, 96223, + 96233, 96259, 96263, 96269, 96281, 96289, 96293, 96323, 96329, 96331, + 96337, 96353, 96377, 96401, 96419, 96431, 96443, 96451, 96457, 96461, + 96469, 96479, 96487, 96493, 96497, 96517, 96527, 96553, 96557, 96581, + 96587, 96589, 96601, 96643, 96661, 96667, 96671, 96697, 96703, 96731, + 96737, 96739, 96749, 96757, 96763, 96769, 96779, 96787, 96797, 96799, + 96821, 96823, 96827, 96847, 96851, 96857, 96893, 96907, 96911, 96931, + 96953, 96959, 96973, 96979, 96989, 96997, 97001, 97003, 97007, 97021, + 97039, 97073, 97081, 97103, 97117, 97127, 97151, 97157, 97159, 97169, + 97171, 97177, 97187, 97213, 97231, 97241, 97259, 97283, 97301, 97303, + 97327, 97367, 97369, 97373, 97379, 97381, 97387, 97397, 97423, 97429, + 97441, 97453, 97459, 97463, 97499, 97501, 97511, 97523, 97547, 97549, + 97553, 97561, 97571, 97577, 97579, 97583, 97607, 97609, 97613, 97649, + 97651, 97673, 97687, 97711, 97729, 97771, 97777, 97787, 97789, 97813, + 97829, 97841, 97843, 97847, 97849, 97859, 97861, 97871, 97879, 97883, + 97919, 97927, 97931, 97943, 97961, 97967, 97973, 97987, 98009, 98011, + 98017, 98041, 98047, 98057, 98081, 98101, 98123, 98129, 98143, 98179, + 98207, 98213, 98221, 98227, 98251, 98257, 98269, 98297, 98299, 98317, + 98321, 98323, 98327, 98347, 98369, 98377, 98387, 98389, 98407, 98411, + 98419, 98429, 98443, 98453, 98459, 98467, 98473, 98479, 98491, 98507, + 98519, 98533, 98543, 98561, 98563, 98573, 98597, 98621, 98627, 98639, + 98641, 98663, 98669, 98689, 98711, 98713, 98717, 98729, 98731, 98737, + 98773, 98779, 98801, 98807, 98809, 98837, 98849, 98867, 98869, 98873, + 98887, 98893, 98897, 98899, 98909, 98911, 98927, 98929, 98939, 98947, + 98953, 98963, 98981, 98993, 98999, 99013, 99017, 99023, 99041, 99053, + 99079, 99083, 99089, 99103, 99109, 99119, 99131, 99133, 99137, 99139, + 99149, 99173, 99181, 99191, 99223, 99233, 99241, 99251, 99257, 99259, + 99277, 99289, 99317, 99347, 99349, 99367, 99371, 99377, 99391, 99397, + 99401, 99409, 99431, 99439, 99469, 99487, 99497, 99523, 99527, 99529, + 99551, 99559, 99563, 99571, 99577, 99581, 99607, 99611, 99623, 99643, + 99661, 99667, 99679, 99689, 99707, 99709, 99713, 99719, 99721, 99733, + 99761, 99767, 99787, 99793, 99809, 99817, 99823, 99829, 99833, 99839, + 99859, 99871, 99877, 99881, 99901, 99907, 99923, 99929, 99961, 99971, + 99989, 99991, 100003, 100019, 100043, 100049, 100057, 100069, 100103, 100109, +100129, 100151, 100153, 100169, 100183, 100189, 100193, 100207, 100213, 100237, +100267, 100271, 100279, 100291, 100297, 100313, 100333, 100343, 100357, 100361, +100363, 100379, 100391, 100393, 100403, 100411, 100417, 100447, 100459, 100469, +100483, 100493, 100501, 100511, 100517, 100519, 100523, 100537, 100547, 100549, +100559, 100591, 100609, 100613, 100621, 100649, 100669, 100673, 100693, 100699, +100703, 100733, 100741, 100747, 100769, 100787, 100799, 100801, 100811, 100823, +100829, 100847, 100853, 100907, 100913, 100927, 100931, 100937, 100943, 100957, +100981, 100987, 100999, 101009, 101021, 101027, 101051, 101063, 101081, 101089, +101107, 101111, 101113, 101117, 101119, 101141, 101149, 101159, 101161, 101173, +101183, 101197, 101203, 101207, 101209, 101221, 101267, 101273, 101279, 101281, +101287, 101293, 101323, 101333, 101341, 101347, 101359, 101363, 101377, 101383, +101399, 101411, 101419, 101429, 101449, 101467, 101477, 101483, 101489, 101501, +101503, 101513, 101527, 101531, 101533, 101537, 101561, 101573, 101581, 101599, +101603, 101611, 101627, 101641, 101653, 101663, 101681, 101693, 101701, 101719, +101723, 101737, 101741, 101747, 101749, 101771, 101789, 101797, 101807, 101833, +101837, 101839, 101863, 101869, 101873, 101879, 101891, 101917, 101921, 101929, +101939, 101957, 101963, 101977, 101987, 101999, 102001, 102013, 102019, 102023, +102031, 102043, 102059, 102061, 102071, 102077, 102079, 102101, 102103, 102107, +102121, 102139, 102149, 102161, 102181, 102191, 102197, 102199, 102203, 102217, +102229, 102233, 102241, 102251, 102253, 102259, 102293, 102299, 102301, 102317, +102329, 102337, 102359, 102367, 102397, 102407, 102409, 102433, 102437, 102451, +102461, 102481, 102497, 102499, 102503, 102523, 102533, 102539, 102547, 102551, +102559, 102563, 102587, 102593, 102607, 102611, 102643, 102647, 102653, 102667, +102673, 102677, 102679, 102701, 102761, 102763, 102769, 102793, 102797, 102811, +102829, 102841, 102859, 102871, 102877, 102881, 102911, 102913, 102929, 102931, +102953, 102967, 102983, 103001, 103007, 103043, 103049, 103067, 103069, 103079, +103087, 103091, 103093, 103099, 103123, 103141, 103171, 103177, 103183, 103217, +103231, 103237, 103289, 103291, 103307, 103319, 103333, 103349, 103357, 103387, +103391, 103393, 103399, 103409, 103421, 103423, 103451, 103457, 103471, 103483, +103511, 103529, 103549, 103553, 103561, 103567, 103573, 103577, 103583, 103591, +103613, 103619, 103643, 103651, 103657, 103669, 103681, 103687, 103699, 103703, +103723, 103769, 103787, 103801, 103811, 103813, 103837, 103841, 103843, 103867, +103889, 103903, 103913, 103919, 103951, 103963, 103967, 103969, 103979, 103981, +103991, 103993, 103997, 104003, 104009, 104021, 104033, 104047, 104053, 104059, +104087, 104089, 104107, 104113, 104119, 104123, 104147, 104149, 104161, 104173, +104179, 104183, 104207, 104231, 104233, 104239, 104243, 104281, 104287, 104297, +104309, 104311, 104323, 104327, 104347, 104369, 104381, 104383, 104393, 104399, +104417, 104459, 104471, 104473, 104479, 104491, 104513, 104527, 104537, 104543, +104549, 104551, 104561, 104579, 104593, 104597, 104623, 104639, 104651, 104659, +104677, 104681, 104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729 +}; diff --git a/Cryptography/pycrypto-2.6.1/src/block_template.c b/Cryptography/pycrypto-2.6.1/src/block_template.c new file mode 100644 index 0000000..c36b316 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/block_template.c @@ -0,0 +1,821 @@ + +/* -*- C -*- */ +/* + * block_template.c : Generic framework for block encryption algorithms + * + * Written by Andrew Kuchling and others + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef _HAVE_STDC_HEADERS +#include +#endif + +#include "Python.h" +#include "pycrypto_compat.h" +#include "modsupport.h" + +#include "_counter.h" + +/* Cipher operation modes */ + +#define MODE_ECB 1 +#define MODE_CBC 2 +#define MODE_CFB 3 +#define MODE_PGP 4 +#define MODE_OFB 5 +#define MODE_CTR 6 + +#define _STR(x) #x +#define _XSTR(x) _STR(x) +#define _PASTE(x,y) x##y +#define _PASTE2(x,y) _PASTE(x,y) +#ifdef IS_PY3K +#define _MODULE_NAME _PASTE2(PyInit_,MODULE_NAME) +#else +#define _MODULE_NAME _PASTE2(init,MODULE_NAME) +#endif +#define _MODULE_STRING _XSTR(MODULE_NAME) + +typedef struct +{ + PyObject_HEAD + int mode, count, segment_size; + unsigned char IV[BLOCK_SIZE], oldCipher[BLOCK_SIZE]; + PyObject *counter; + int counter_shortcut; + block_state st; +} ALGobject; + +/* Please see PEP3123 for a discussion of PyObject_HEAD and changes made in 3.x to make it conform to Standard C. + * These changes also dictate using Py_TYPE to check type, and PyVarObject_HEAD_INIT(NULL, 0) to initialize + */ +#ifdef IS_PY3K +static PyTypeObject ALGtype; +#define is_ALGobject(v) (Py_TYPE(v) == &ALGtype) +#else +staticforward PyTypeObject ALGtype; +#define is_ALGobject(v) ((v)->ob_type == &ALGtype) +#define PyLong_FromLong PyInt_FromLong /* For Python 2.x */ +#endif + +static ALGobject * +newALGobject(void) +{ + ALGobject * new; + new = PyObject_New(ALGobject, &ALGtype); + new->mode = MODE_ECB; + new->counter = NULL; + new->counter_shortcut = 0; + return new; +} + +static void +ALGdealloc(PyObject *ptr) +{ + ALGobject *self = (ALGobject *)ptr; + + /* Overwrite the contents of the object */ + Py_XDECREF(self->counter); + self->counter = NULL; + memset(self->IV, 0, BLOCK_SIZE); + memset(self->oldCipher, 0, BLOCK_SIZE); + memset((char*)&(self->st), 0, sizeof(block_state)); + self->mode = self->count = self->segment_size = 0; + PyObject_Del(ptr); +} + + + +static char ALGnew__doc__[] = +"new(key, [mode], [IV]): Return a new " _MODULE_STRING " encryption object."; + +static char *kwlist[] = {"key", "mode", "IV", "counter", "segment_size", +#ifdef PCT_ARC2_MODULE + "effective_keylen", +#endif + NULL}; + +static ALGobject * +ALGnew(PyObject *self, PyObject *args, PyObject *kwdict) +{ + unsigned char *key, *IV; + ALGobject * new=NULL; + int keylen, IVlen=0, mode=MODE_ECB, segment_size=0; + PyObject *counter = NULL; + int counter_shortcut = 0; +#ifdef PCT_ARC2_MODULE + int effective_keylen = 1024; /* this is a weird default, but it's compatible with old versions of PyCrypto */ +#endif + /* Set default values */ + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "s#|is#Oi" +#ifdef PCT_ARC2_MODULE + "i" +#endif + , kwlist, + &key, &keylen, &mode, &IV, &IVlen, + &counter, &segment_size +#ifdef PCT_ARC2_MODULE + , &effective_keylen +#endif + )) + { + return NULL; + } + + if (modeMODE_CTR) + { + PyErr_Format(PyExc_ValueError, + "Unknown cipher feedback mode %i", + mode); + return NULL; + } + if (mode == MODE_PGP) { + PyErr_Format(PyExc_ValueError, + "MODE_PGP is not supported anymore"); + return NULL; + } + if (KEY_SIZE!=0 && keylen!=KEY_SIZE) + { + PyErr_Format(PyExc_ValueError, + "Key must be %i bytes long, not %i", + KEY_SIZE, keylen); + return NULL; + } + if (KEY_SIZE==0 && keylen==0) + { + PyErr_SetString(PyExc_ValueError, + "Key cannot be the null string"); + return NULL; + } + if (IVlen != BLOCK_SIZE && mode != MODE_ECB && mode != MODE_CTR) + { + PyErr_Format(PyExc_ValueError, + "IV must be %i bytes long", BLOCK_SIZE); + return NULL; + } + + /* Mode-specific checks */ + if (mode == MODE_CFB) { + if (segment_size == 0) segment_size = 8; + if (segment_size < 1 || segment_size > BLOCK_SIZE*8 || ((segment_size & 7) != 0)) { + PyErr_Format(PyExc_ValueError, + "segment_size must be multiple of 8 (bits) " + "between 1 and %i", BLOCK_SIZE*8); + return NULL; + } + } + if (mode == MODE_CTR) { + if (counter == NULL) { + PyErr_SetString(PyExc_TypeError, + "'counter' keyword parameter is required with CTR mode"); + return NULL; +#ifdef IS_PY3K + } else if (PyObject_HasAttr(counter, PyUnicode_FromString("__PCT_CTR_SHORTCUT__"))) { +#else + } else if (PyObject_HasAttrString(counter, "__PCT_CTR_SHORTCUT__")) { +#endif + counter_shortcut = 1; + } else if (!PyCallable_Check(counter)) { + PyErr_SetString(PyExc_ValueError, + "'counter' parameter must be a callable object"); + return NULL; + } + } else { + if (counter != NULL) { + PyErr_SetString(PyExc_ValueError, + "'counter' parameter only useful with CTR mode"); + return NULL; + } + } + + /* Cipher-specific checks */ +#ifdef PCT_ARC2_MODULE + if (effective_keylen<0 || effective_keylen>1024) { + PyErr_Format(PyExc_ValueError, + "RC2: effective_keylen must be between 0 and 1024, not %i", + effective_keylen); + return NULL; + } +#endif + + /* Copy parameters into object */ + new = newALGobject(); + new->segment_size = segment_size; + new->counter = counter; + Py_XINCREF(counter); + new->counter_shortcut = counter_shortcut; +#ifdef PCT_ARC2_MODULE + new->st.effective_keylen = effective_keylen; +#endif + + block_init(&(new->st), key, keylen); + if (PyErr_Occurred()) + { + Py_DECREF(new); + return NULL; + } + memset(new->IV, 0, BLOCK_SIZE); + memset(new->oldCipher, 0, BLOCK_SIZE); + memcpy(new->IV, IV, IVlen); + new->mode = mode; + new->count=BLOCK_SIZE; /* stores how many bytes in new->oldCipher have been used */ + return new; +} + +static char ALG_Encrypt__doc__[] = +"Encrypt the provided string of binary data."; + +static PyObject * +ALG_Encrypt(ALGobject *self, PyObject *args) +{ + unsigned char *buffer, *str; + unsigned char temp[BLOCK_SIZE]; + int i, j, len; + PyObject *result; + + if (!PyArg_Parse(args, "s#", &str, &len)) + return NULL; + if (len==0) /* Handle empty string */ + { + return PyBytes_FromStringAndSize(NULL, 0); + } + if ( (len % BLOCK_SIZE) !=0 && + (self->mode!=MODE_CFB) && + (self->mode!=MODE_CTR)) + { + PyErr_Format(PyExc_ValueError, + "Input strings must be " + "a multiple of %i in length", + BLOCK_SIZE); + return NULL; + } + if (self->mode == MODE_CFB && + (len % (self->segment_size/8) !=0)) { + PyErr_Format(PyExc_ValueError, + "Input strings must be a multiple of " + "the segment size %i in length", + self->segment_size/8); + return NULL; + } + + buffer=malloc(len); + if (buffer==NULL) + { + PyErr_SetString(PyExc_MemoryError, + "No memory available in " + _MODULE_STRING " encrypt"); + return NULL; + } + Py_BEGIN_ALLOW_THREADS; + switch(self->mode) + { + case(MODE_ECB): + for(i=0; ist), str+i, buffer+i); + } + break; + + case(MODE_CBC): + for(i=0; iIV[j]; + } + block_encrypt(&(self->st), temp, buffer+i); + memcpy(self->IV, buffer+i, BLOCK_SIZE); + } + break; + + case(MODE_CFB): + for(i=0; isegment_size/8) + { + block_encrypt(&(self->st), self->IV, temp); + for (j=0; jsegment_size/8; j++) { + buffer[i+j] = str[i+j] ^ temp[j]; + } + if (self->segment_size == BLOCK_SIZE * 8) { + /* s == b: segment size is identical to + the algorithm block size */ + memcpy(self->IV, buffer + i, BLOCK_SIZE); + } + else if ((self->segment_size % 8) == 0) { + int sz = self->segment_size/8; + memmove(self->IV, self->IV + sz, + BLOCK_SIZE-sz); + memcpy(self->IV + BLOCK_SIZE - sz, buffer + i, + sz); + } + else { + /* segment_size is not a multiple of 8; + currently this can't happen */ + } + } + break; + + case(MODE_OFB): + for(i=0; ist), self->IV, temp); + memcpy(self->IV, temp, BLOCK_SIZE); + for(j=0; jcounter points to the Counter callable, which is + * responsible for generating keystream blocks + * - self->count indicates the current offset within the current keystream block + * - self->IV stores the current keystream block + * - str stores the input string + * - buffer stores the output string + * - len indicates the length if the input and output strings + * - i indicates the current offset within the input and output strings + * - (len-i) is the number of bytes remaining to encrypt + * - (BLOCK_SIZE-self->count) is the number of bytes remaining in the current keystream block + */ + i = 0; + while (i < len) { + /* If we don't need more than what remains of the current keystream block, then just XOR it in */ + if (len-i <= BLOCK_SIZE-self->count) { /* remaining_bytes_to_encrypt <= remaining_bytes_in_IV */ + /* XOR until the input is used up */ + for(j=0; j<(len-i); j++) { + assert(i+j < len); + assert(self->count+j < BLOCK_SIZE); + buffer[i+j] = (self->IV[self->count+j] ^= str[i+j]); + } + self->count += len-i; + i = len; + continue; + } + + /* Use up the current keystream block */ + for(j=0; jcount; j++) { + assert(i+j < len); + assert(self->count+j < BLOCK_SIZE); + buffer[i+j] = (self->IV[self->count+j] ^= str[i+j]); + } + i += BLOCK_SIZE-self->count; + self->count = BLOCK_SIZE; + + /* Generate a new keystream block */ + if (self->counter_shortcut) { + /* CTR mode shortcut: If we're using Util.Counter, + * bypass the normal Python function call mechanism + * and manipulate the counter directly. */ + + PCT_CounterObject *ctr = (PCT_CounterObject *)(self->counter); + if (ctr->carry && !ctr->allow_wraparound) { + Py_BLOCK_THREADS; + PyErr_SetString(PyExc_OverflowError, + "counter wrapped without allow_wraparound"); + free(buffer); + return NULL; + } + if (ctr->buf_size != BLOCK_SIZE) { + Py_BLOCK_THREADS; + PyErr_Format(PyExc_TypeError, + "CTR counter function returned " + "string not of length %i", + BLOCK_SIZE); + free(buffer); + return NULL; + } + block_encrypt(&(self->st), + (unsigned char *)ctr->val, + self->IV); + ctr->inc_func(ctr); + } else { + PyObject *ctr; + Py_BLOCK_THREADS; + ctr = PyObject_CallObject(self->counter, NULL); + if (ctr == NULL) { + free(buffer); + return NULL; + } + if (!PyBytes_Check(ctr)) + { + PyErr_SetString(PyExc_TypeError, +#ifdef IS_PY3K + "CTR counter function didn't return bytes"); +#else + "CTR counter function didn't return a string"); +#endif + Py_DECREF(ctr); + free(buffer); + return NULL; + } + if (PyBytes_Size(ctr) != BLOCK_SIZE) { + PyErr_Format(PyExc_TypeError, + "CTR counter function returned " +#ifdef IS_PY3K + "bytes not of length %i", +#else + "string not of length %i", +#endif + BLOCK_SIZE); + Py_DECREF(ctr); + free(buffer); + return NULL; + } + Py_UNBLOCK_THREADS; + block_encrypt(&(self->st), (unsigned char *)PyBytes_AsString(ctr), + self->IV); + Py_BLOCK_THREADS; + Py_DECREF(ctr); + Py_UNBLOCK_THREADS; + } + + /* Move the pointer to the start of the keystream block */ + self->count = 0; + } + break; + + default: + Py_BLOCK_THREADS; + PyErr_Format(PyExc_SystemError, + "Unknown ciphertext feedback mode %i; " + "this shouldn't happen", + self->mode); + free(buffer); + return NULL; + } + Py_END_ALLOW_THREADS; + result=PyBytes_FromStringAndSize((char *) buffer, len); + free(buffer); + return(result); +} + +static char ALG_Decrypt__doc__[] = +"decrypt(string): Decrypt the provided string of binary data."; + + + + +static PyObject * +ALG_Decrypt(ALGobject *self, PyObject *args) +{ + unsigned char *buffer, *str; + unsigned char temp[BLOCK_SIZE]; + int i, j, len; + PyObject *result; + + /* CTR mode decryption is identical to encryption */ + if (self->mode == MODE_CTR) + return ALG_Encrypt(self, args); + + if (!PyArg_Parse(args, "s#", &str, &len)) + return NULL; + if (len==0) /* Handle empty string */ + { + return PyBytes_FromStringAndSize(NULL, 0); + } + if ( (len % BLOCK_SIZE) !=0 && (self->mode!=MODE_CFB)) + { + PyErr_Format(PyExc_ValueError, + "Input strings must be " + "a multiple of %i in length", + BLOCK_SIZE); + return NULL; + } + if (self->mode == MODE_CFB && + (len % (self->segment_size/8) !=0)) { + PyErr_Format(PyExc_ValueError, + "Input strings must be a multiple of " + "the segment size %i in length", + self->segment_size/8); + return NULL; + } + buffer=malloc(len); + if (buffer==NULL) + { + PyErr_SetString(PyExc_MemoryError, + "No memory available in " _MODULE_STRING + " decrypt"); + return NULL; + } + Py_BEGIN_ALLOW_THREADS; + switch(self->mode) + { + case(MODE_ECB): + for(i=0; ist), str+i, buffer+i); + } + break; + + case(MODE_CBC): + for(i=0; ioldCipher, self->IV, BLOCK_SIZE); + block_decrypt(&(self->st), str+i, temp); + for(j=0; jIV[j]; + self->IV[j]=str[i+j]; + } + } + break; + + case(MODE_CFB): + for(i=0; isegment_size/8) + { + block_encrypt(&(self->st), self->IV, temp); + for (j=0; jsegment_size/8; j++) { + buffer[i+j] = str[i+j]^temp[j]; + } + if (self->segment_size == BLOCK_SIZE * 8) { + /* s == b: segment size is identical to + the algorithm block size */ + memcpy(self->IV, str + i, BLOCK_SIZE); + } + else if ((self->segment_size % 8) == 0) { + int sz = self->segment_size/8; + memmove(self->IV, self->IV + sz, + BLOCK_SIZE-sz); + memcpy(self->IV + BLOCK_SIZE - sz, str + i, + sz); + } + else { + /* segment_size is not a multiple of 8; + currently this can't happen */ + } + } + break; + + case (MODE_OFB): + for(i=0; ist), self->IV, temp); + memcpy(self->IV, temp, BLOCK_SIZE); + for(j=0; jIV[j]; + } + } + break; + + default: + Py_BLOCK_THREADS; + PyErr_Format(PyExc_SystemError, + "Unknown ciphertext feedback mode %i; " + "this shouldn't happen", + self->mode); + free(buffer); + return NULL; + } + Py_END_ALLOW_THREADS; + result=PyBytes_FromStringAndSize((char *) buffer, len); + free(buffer); + return(result); +} + +/* ALG object methods */ +static PyMethodDef ALGmethods[] = +{ +#ifdef IS_PY3K + {"encrypt", (PyCFunction) ALG_Encrypt, METH_O, ALG_Encrypt__doc__}, + {"decrypt", (PyCFunction) ALG_Decrypt, METH_O, ALG_Decrypt__doc__}, +#else + {"encrypt", (PyCFunction) ALG_Encrypt, 0, ALG_Encrypt__doc__}, + {"decrypt", (PyCFunction) ALG_Decrypt, 0, ALG_Decrypt__doc__}, +#endif + {NULL, NULL} /* sentinel */ +}; + +static int +ALGsetattr(PyObject *ptr, char *name, PyObject *v) +{ + ALGobject *self=(ALGobject *)ptr; + if (strcmp(name, "IV") != 0) + { + PyErr_Format(PyExc_AttributeError, + "non-existent block cipher object attribute '%s'", + name); + return -1; + } + if (v==NULL) + { + PyErr_SetString(PyExc_AttributeError, + "Can't delete IV attribute of block cipher object"); + return -1; + } + if (!PyBytes_Check(v)) + { + PyErr_SetString(PyExc_TypeError, +#ifdef IS_PY3K + "IV attribute of block cipher object must be bytes"); +#else + "IV attribute of block cipher object must be string"); +#endif + return -1; + } + if (PyBytes_Size(v)!=BLOCK_SIZE) + { + PyErr_Format(PyExc_ValueError, + _MODULE_STRING " IV must be %i bytes long", + BLOCK_SIZE); + return -1; + } + memcpy(self->IV, PyBytes_AsString(v), BLOCK_SIZE); + return 0; +} + +static PyObject * +#ifdef IS_PY3K +ALGgetattro(PyObject *s, PyObject *attr) +#else +ALGgetattr(PyObject *s, char *name) +#endif +{ + ALGobject *self = (ALGobject*)s; + +#ifdef IS_PY3K + if (!PyUnicode_Check(attr)) + goto generic; + + if (PyUnicode_CompareWithASCIIString(attr, "IV") == 0) +#else + if (strcmp(name, "IV") == 0) +#endif + { + return(PyBytes_FromStringAndSize((char *) self->IV, BLOCK_SIZE)); + } +#ifdef IS_PY3K + if (PyUnicode_CompareWithASCIIString(attr, "mode") == 0) +#else + if (strcmp(name, "mode") == 0) +#endif + { + return(PyLong_FromLong((long)(self->mode))); + } +#ifdef IS_PY3K + if (PyUnicode_CompareWithASCIIString(attr, "block_size") == 0) +#else + if (strcmp(name, "block_size") == 0) +#endif + { + return PyLong_FromLong(BLOCK_SIZE); + } +#ifdef IS_PY3K + if (PyUnicode_CompareWithASCIIString(attr, "key_size") == 0) +#else + if (strcmp(name, "key_size") == 0) +#endif + { + return PyLong_FromLong(KEY_SIZE); + } +#ifdef IS_PY3K + generic: + return PyObject_GenericGetAttr(s, attr); +#else + return Py_FindMethod(ALGmethods, (PyObject *) self, name); +#endif +} + +/* List of functions defined in the module */ + +static struct PyMethodDef modulemethods[] = +{ + {"new", (PyCFunction) ALGnew, METH_VARARGS|METH_KEYWORDS, ALGnew__doc__}, + {NULL, NULL} /* sentinel */ +}; + +static PyTypeObject ALGtype = +{ +#ifdef IS_PY3K + PyVarObject_HEAD_INIT(NULL, 0) /* deferred type init for compilation on Windows, type will be filled in at runtime */ +#else + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ +#endif + _MODULE_STRING, /*tp_name*/ + sizeof(ALGobject), /*tp_size*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor) ALGdealloc, /*tp_dealloc*/ + 0, /*tp_print*/ +#ifdef IS_PY3K + 0, /*tp_getattr*/ +#else + ALGgetattr, /*tp_getattr*/ +#endif + ALGsetattr, /*tp_setattr*/ + 0, /*tp_compare*/ + (reprfunc) 0, /*tp_repr*/ + 0, /*tp_as_number*/ +#ifdef IS_PY3K + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + ALGgetattro, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + ALGmethods, /*tp_methods*/ +#endif +}; + +#ifdef IS_PY3K +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "Crypto.Cipher." _MODULE_STRING, + NULL, + -1, + modulemethods, + NULL, + NULL, + NULL, + NULL +}; +#endif + +/* Initialization function for the module */ + +/* Deal with old API in Python 2.1 */ +#if PYTHON_API_VERSION < 1011 +#define PyModule_AddIntConstant(m,n,v) {PyObject *o=PyInt_FromLong(v); \ + if (o!=NULL) \ + {PyDict_SetItemString(PyModule_GetDict(m),n,o); Py_DECREF(o);}} +#endif + + +#ifdef IS_PY3K +PyMODINIT_FUNC +#else +void +#endif +_MODULE_NAME (void) +{ + PyObject *m; + +#ifdef IS_PY3K + /* PyType_Ready automatically fills in ob_type with &PyType_Type if it's not already set */ + if (PyType_Ready(&ALGtype) < 0) + return NULL; + + /* Create the module and add the functions */ + m = PyModule_Create(&moduledef); + if (m == NULL) + return NULL; +#else + ALGtype.ob_type = &PyType_Type; + /* Create the module and add the functions */ + m = Py_InitModule("Crypto.Cipher." _MODULE_STRING, modulemethods); +#endif + + PyModule_AddIntConstant(m, "MODE_ECB", MODE_ECB); + PyModule_AddIntConstant(m, "MODE_CBC", MODE_CBC); + PyModule_AddIntConstant(m, "MODE_CFB", MODE_CFB); + PyModule_AddIntConstant(m, "MODE_PGP", MODE_PGP); /** Vestigial **/ + PyModule_AddIntConstant(m, "MODE_OFB", MODE_OFB); + PyModule_AddIntConstant(m, "MODE_CTR", MODE_CTR); + PyModule_AddIntConstant(m, "block_size", BLOCK_SIZE); + PyModule_AddIntConstant(m, "key_size", KEY_SIZE); + + /* Check for errors */ + if (PyErr_Occurred()) + Py_FatalError("can't initialize module " _MODULE_STRING); + +#ifdef IS_PY3K + return m; +#endif +} +/* vim:set ts=4 sw=4 sts=0 noexpandtab: */ diff --git a/Cryptography/pycrypto-2.6.1/src/cast5.c b/Cryptography/pycrypto-2.6.1/src/cast5.c new file mode 100644 index 0000000..0843b98 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/cast5.c @@ -0,0 +1,437 @@ +/* + These are the S-boxes for CAST5 as given in RFC 2144. +*/ + + +static const uint32 S1[256] = { +0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, +0x9c004dd3, 0x6003e540, 0xcf9fc949, 0xbfd4af27, 0x88bbbdb5, +0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, +0x22d4ff8e, 0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, +0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d, 0xa1c9e0d6, +0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b, +0x22568e3a, 0xa2d341d0, 0x66db40c8, 0xa784392f, 0x004dff2f, +0x2db9d2de, 0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7, +0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, +0x90ecf52e, 0x22b0c054, 0xbc8e5935, 0x4b6d2f7f, 0x50bb64a2, +0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f, 0xb48ee411, +0x4bff345d, 0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, +0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50, 0x882240f2, +0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, +0xb949e354, 0xb04669fe, 0xb1b6ab8a, 0xc71358dd, 0x6385c545, +0x110f935d, 0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3, +0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, +0xf61b1891, 0xbb72275e, 0xaa508167, 0x38901091, 0xc6b505eb, +0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, +0xaa56d291, 0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, +0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779, 0x64459eab, +0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, 0x89fe78e6, +0x3fab0950, 0x325ff6c2, 0x81383f05, 0x6963c5c8, 0x76cb5ad6, +0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511, +0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, +0x051ef495, 0xaa573b04, 0x4a805d8d, 0x548300d0, 0x00322a3c, +0xbf64cddf, 0xba57a68e, 0x75c6372b, 0x50afd341, 0xa7c13275, +0x915a0bf5, 0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, +0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324, 0xcfa4bd3f, +0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, +0xe31231b2, 0x2ad5ad6c, 0x954329de, 0xadbe4528, 0xd8710f69, +0xaa51c90f, 0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc, +0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, +0x032268d4, 0xc9600acc, 0xce387e6d, 0xbf6bb16c, 0x6a70fb78, +0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464, 0x5ad328d8, +0xb347cc96, 0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, +0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a, 0x3f04442f, +0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, +0x2ad37c96, 0x0175cb9d, 0xc69dff09, 0xc75b65f0, 0xd9db40d8, +0xec0e7779, 0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd, +0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, +0x51c85f4d, 0x56907596, 0xa5bb15e6, 0x580304f0, 0xca042cf1, +0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, +0xbc306ed9, 0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, +0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872, 0xaf1fbda7, +0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, 0x0cd0ede7, +0x26470db8, 0xf881814c, 0x474d6ad7, 0x7c0c5e5c, 0xd1231959, +0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e, +0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, +0xe1e696ff, 0xb141ab08, 0x7cca89b9, 0x1a69e783, 0x02cc4843, +0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, +0x5c8165bf }; + +static const uint32 S2[256] = { +0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, +0xeec5207a, 0x55889c94, 0x72fc0651, 0xada7ef79, 0x4e1d7235, +0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, +0xa1d6eff3, 0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, +0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb, 0xd1da4181, +0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b, +0x25a1ff41, 0xe180f806, 0x1fc41080, 0x179bee7a, 0xd37ac6a9, +0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b, +0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, +0x0d554b63, 0x5d681121, 0xc866c359, 0x3d63cf73, 0xcee234c0, +0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084, +0xe4eb573b, 0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, +0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c, 0x10843094, +0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, +0xd9e0a227, 0x4ec73a34, 0xfc884f69, 0x3e4de8df, 0xef0e0088, +0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb, +0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, +0x27e19ba5, 0xd5a6c252, 0xe49754bd, 0xc5d655dd, 0xeb667064, +0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, +0xe5d05860, 0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, +0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b, 0xeccf01db, +0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6, +0x5ee22b95, 0x5f0e5304, 0x81ed6f61, 0x20e74364, 0xb45e1378, +0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b, +0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, +0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf, 0xa20c3005, 0x8871df63, +0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835, +0x9f63293c, 0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, +0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13, 0x73f98417, +0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741, +0x7cbad9a2, 0x2180036f, 0x50d99c08, 0xcb3f4861, 0xc26bd765, +0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6, +0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, +0x846a3bae, 0x8ff77888, 0xee5d60f6, 0x7af75673, 0x2fdd5cdb, +0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc, +0xd152de58, 0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, +0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906, 0xb8da230c, +0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, +0x61a3c9e8, 0xbca8f54d, 0xc72feffa, 0x22822e99, 0x82c570b4, +0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6, +0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, +0xf7e19798, 0x7619b72f, 0x8f1c9ba4, 0xdc8637a0, 0x16a7d3b1, +0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, +0x520365d6, 0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, +0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f, 0x5483697b, +0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9, +0x6c387e8a, 0x0ae6d249, 0xb284600c, 0xd835731d, 0xdcb1c647, +0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa, +0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, +0xa345415e, 0x5c038323, 0x3e5d3bb9, 0x43d79572, 0x7e6dd07c, +0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, +0x4523ecf1 }; + +static const uint32 S3[256] = { +0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, +0x369fe44b, 0x8c1fc644, 0xaececa90, 0xbeb1f9bf, 0xeefbcaea, +0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, +0x927010d5, 0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, +0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e, 0x553fb2c0, +0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd, +0x9255c5ed, 0x1257a240, 0x4e1a8302, 0xbae07fff, 0x528246e7, +0x8e57140e, 0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5, +0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, +0x1fb78dfc, 0x8e6bd2c1, 0x437be59b, 0x99b03dbf, 0xb5dbc64b, +0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e, 0xc5884a28, +0xccc36f71, 0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, +0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04, 0xa747d2d0, +0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, +0x0a0fb402, 0x0f7fef82, 0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, +0x50da88b8, 0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15, +0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, +0xe83ec305, 0x4f91751a, 0x925669c2, 0x23efe941, 0xa903f12e, +0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, +0x02778176, 0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, +0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148, 0xef303cab, +0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, 0x8437aa88, +0x7d29dc96, 0x2756d3dc, 0x8b907cee, 0xb51fd240, 0xe7c07ce3, +0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341, +0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, +0xbda8229c, 0x127dadaa, 0x438a074e, 0x1f97c090, 0x081bdb8a, +0x93a07ebe, 0xb938ca15, 0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, +0x64380e51, 0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, +0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f, 0x4b39fffa, +0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa, +0x27627545, 0x825cf47a, 0x61bd8ba0, 0xd11e42d1, 0xcead04f4, +0x127ea392, 0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b, +0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, +0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b, 0x1f081fab, 0x108618ae, +0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae, 0x12deca4d, +0x2c3f8cc5, 0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, +0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45, 0x3a609437, +0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, +0x02717ef6, 0x4feb5536, 0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, +0x50b4ef6d, 0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc, +0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, +0xabcc4f33, 0x7688c55d, 0x7b00a6b0, 0x947b0001, 0x570075d2, +0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, +0xee971b69, 0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, +0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2, 0x67214cb8, +0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, 0x0ff0443d, +0x606e6dc6, 0x60543a49, 0x5727c148, 0x2be98a1d, 0x8ab41738, +0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d, +0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, +0x9c305a00, 0x52bce688, 0x1b03588a, 0xf7baefd5, 0x4142ed9c, +0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, +0xee353783 }; + +static const uint32 S4[256] = { +0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, +0x64ad8c57, 0x85510443, 0xfa020ed1, 0x7e287aff, 0xe60fb663, +0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, +0x241e4adf, 0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, +0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15, 0xee4d111a, +0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe, +0x081b08ca, 0x05170121, 0x80530100, 0xe83e5efe, 0xac9af4f8, +0x7fe72701, 0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25, +0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, +0x547eebe6, 0x446d4ca0, 0x6cf3d6f5, 0x2649abdf, 0xaea0c7f5, +0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1, 0x72500e03, +0xf80eb2bb, 0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, +0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5, 0x4d351805, +0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, +0x9f46222f, 0x3991467d, 0xa5bf6d8e, 0x1143c44f, 0x43958302, +0xd0214eeb, 0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6, +0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, +0x79098b02, 0xe4eabb81, 0x28123b23, 0x69dead38, 0x1574ca16, +0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, +0x09114003, 0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, +0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6, 0xe756bdff, +0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, 0x56c8c391, +0x6b65811c, 0x5e146119, 0x6e85cb75, 0xbe07c002, 0xc2325577, +0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24, +0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, +0xeca1d7c7, 0x041afa32, 0x1d16625a, 0x6701902c, 0x9b757a54, +0x31d477f7, 0x9126b031, 0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, +0x56e55a79, 0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, +0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df, 0xb7747f9d, +0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035, +0x213d42f6, 0x2c1c7c26, 0x61c2f50f, 0x6552daf9, 0xd2c231f8, +0x25130f69, 0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab, +0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, +0x311170a7, 0x3e9b640c, 0xcc3e10d7, 0xd5cad3b6, 0x0caec388, +0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, +0xc1de8417, 0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, +0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2, 0x6f7de532, +0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, +0x001d7b95, 0x82e5e7d2, 0x109873f6, 0x00613096, 0xc32d9521, +0xada121ff, 0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a, +0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, +0x0ce454a9, 0xd60acd86, 0x015f1919, 0x77079103, 0xdea03af6, +0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, +0xb8a5c3ef, 0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, +0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876, 0x39e4460c, +0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, 0x296b299e, +0x492fc295, 0x9266beab, 0xb5676e69, 0x9bd3ddda, 0xdf7e052f, +0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04, +0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, +0x932bcdf6, 0xb657c34d, 0x4edfd282, 0x7ae5290c, 0x3cb9536b, +0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, +0x0aef7ed2 }; + +static const uint32 S5[256] = { +0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, +0x1dd358f5, 0x44dd9d44, 0x1731167f, 0x08fbf1fa, 0xe7f511cc, +0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, +0x69befd7a, 0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, +0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff, 0x5f480a01, +0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb, +0x8dba1cfe, 0x41a99b02, 0x1a550a04, 0xba8f65cb, 0x7251f4e7, +0x95a51725, 0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a, +0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, +0x8709e6b0, 0xd7e07156, 0x4e29fea7, 0x6366e52d, 0x02d1c000, +0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2, 0x2261be02, +0xd642a0c9, 0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, +0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981, 0x5c1ff900, +0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, +0x90c79505, 0xb0a8a774, 0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, +0xe66a4263, 0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655, +0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, +0x524755f4, 0x03b63cc9, 0x0cc844b2, 0xbcf3f0aa, 0x87ac36e9, +0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, +0x01c94910, 0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, +0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1, 0x136e05db, +0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, 0x3063fcdf, +0xb6f589de, 0xec2941da, 0x26e46695, 0xb7566419, 0xf654efc5, +0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049, +0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, +0x9e0885f9, 0x68cb3e47, 0x086c010f, 0xa21de820, 0xd18b69de, +0xf3f65777, 0xfa02c3f6, 0x407edac3, 0xcbb3d550, 0x1793084d, +0xb0d70eba, 0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, +0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be, 0x580a249f, +0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715, +0x646c6bd7, 0x44904db3, 0x66b4f0a3, 0xc0f1648a, 0x697ed5af, +0x49e92ff6, 0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840, +0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, +0xc1092910, 0x8bc95fc6, 0x7d869cf4, 0x134f616f, 0x2e77118d, +0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba, 0x9cad9010, +0xaf462ba2, 0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, +0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7, 0x445f7382, +0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, +0x20936079, 0x459b80a5, 0xbe60e2db, 0xa9c23101, 0xeba5315c, +0x224e42f2, 0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e, +0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, +0x75922283, 0x784d6b17, 0x58ebb16e, 0x44094f85, 0x3f481d87, +0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, +0x2b092801, 0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, +0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad, 0x6cf6e479, +0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, 0x0ff6f8f3, +0xa09c7f70, 0x5346aba0, 0x5ce96c28, 0xe176eda3, 0x6bac307f, +0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20, +0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, +0xeeb9491d, 0x34010718, 0xbb30cab8, 0xe822fe15, 0x88570983, +0x750e6249, 0xda627e55, 0x5e76ffa8, 0xb1534546, 0x6d47de08, +0xefe9e7d4 }; + +static const uint32 S6[256] = { +0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, +0x016843b4, 0xeced5cbc, 0x325553ac, 0xbf9f0960, 0xdfa1e2ed, +0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, +0x8989b138, 0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, +0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367, 0xa3149619, +0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f, +0xa888614a, 0x2900af98, 0x01665991, 0xe1992863, 0xc8f30c60, +0x2e78ef3c, 0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072, +0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, +0x4c7f4448, 0xdab5d440, 0x6dba0ec3, 0x083919a7, 0x9fbaeed9, +0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941, 0x2c0e636a, +0xba7dd9cd, 0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, +0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8, 0x284caf89, +0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, +0xefe8c36e, 0xf890cdd9, 0x80226dae, 0xc340a4a3, 0xdf7e9c09, +0xa694a807, 0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54, +0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, +0xcf222ebf, 0x25ac6f48, 0xa9a99387, 0x53bddb65, 0xe76ffbe7, +0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, +0xc8087dfc, 0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, +0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf, 0x5f04456d, +0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, 0x57f55ec5, +0xe2220abe, 0xd2916ebf, 0x4ec75b95, 0x24f2c3c0, 0x42d15d99, +0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f, +0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, +0x692573e4, 0xe9a9d848, 0xf3160289, 0x3a62ef1d, 0xa787e238, +0xf3a5f676, 0x74364853, 0x20951063, 0x4576698d, 0xb6fad407, +0x592af950, 0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, +0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f, 0x89dff0bb, +0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585, +0xdc049441, 0xc8098f9b, 0x7dede786, 0xc39a3373, 0x42410005, +0x6a091751, 0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be, +0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, +0x1f8fb214, 0xd372cf08, 0xcc3c4a13, 0x8cf63166, 0x061c87be, +0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, +0x3fc06976, 0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, +0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0, 0x3007cd3e, +0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, +0x8809286c, 0xf592d891, 0x08a930f6, 0x957ef305, 0xb7fbffbd, +0xc266e96f, 0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da, +0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, +0x257f0c3d, 0x9348af49, 0x361400bc, 0xe8816f4a, 0x3814f200, +0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, +0x54f4a084, 0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, +0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25, 0x653d7e6a, +0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, 0x44136c76, +0x0404a8c8, 0xb8e5a121, 0xb81a928a, 0x60ed5869, 0x97c55b96, +0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5, +0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, +0xf544edeb, 0xb0e93524, 0xbebb8fbd, 0xa2d762cf, 0x49c92f54, +0x38b5f331, 0x7128a454, 0x48392905, 0xa65b1db8, 0x851c97bd, +0xd675cf2f }; + +static const uint32 S7[256] = { +0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, +0xab9bc912, 0xde6008a1, 0x2028da1f, 0x0227bce7, 0x4d642916, +0x18fac300, 0x50f18b82, 0x2cb2cb11, 0xb232e75c, 0x4b3695f2, +0xb28707de, 0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, +0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43, 0x4d495001, +0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4, +0x1286becf, 0xb6eacb19, 0x2660c200, 0x7565bde4, 0x64241f7a, +0x8248dca9, 0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2, +0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, +0xeb12ff82, 0xe3486911, 0xd34d7516, 0x4e7b3aff, 0x5f43671b, +0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7, 0xd0d854c0, +0xcb3a6c88, 0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, +0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816, 0x0a961288, +0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, +0xcf19df58, 0xbec3f756, 0xc06eba30, 0x07211b24, 0x45c28829, +0xc95e317f, 0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a, +0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, +0xaff60ff4, 0xea2c4e6d, 0x16e39264, 0x92544a8b, 0x009b4fc3, +0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, +0xbe838688, 0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, +0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28, 0xda6d0c74, +0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, 0x1626a49f, +0xeed82b29, 0x1d382fe3, 0x0c4fb99a, 0xbb325778, 0x3ec6d97b, +0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7, +0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, +0xebd4e7be, 0xbe8b9d2d, 0x7979fb06, 0xe7225308, 0x8b75cf77, +0x11ef8da4, 0xe083c858, 0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, +0x5dda0033, 0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, +0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a, 0x2711fd60, +0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476, +0x488dcf25, 0x36c9d566, 0x28e74e41, 0xc2610aca, 0x3d49a9cf, +0xbae3b9df, 0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509, +0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, +0x2b9f4fd5, 0x625aba82, 0x6a017962, 0x2ec01b9c, 0x15488aa9, +0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a, 0x058745b9, +0x3453dc1e, 0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, +0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c, 0x66626c1c, +0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, +0x9ea294fb, 0x52cf564c, 0x9883fe66, 0x2ec40581, 0x763953c3, +0x01d6692e, 0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285, +0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, +0x3d321c5d, 0xc3f5e194, 0x4b269301, 0xc79f022f, 0x3c997e7e, +0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, +0xc61e45be, 0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, +0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767, 0x1814386b, +0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, 0x589dd390, +0x5479f8e6, 0x1cb8d647, 0x97fd61a9, 0xea7759f4, 0x2d57539d, +0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914, +0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, +0x3d40f021, 0xc3c0bdae, 0x4958c24c, 0x518f36b2, 0x84b1d370, +0x0fedce83, 0x878ddada, 0xf2a279c7, 0x94e01be8, 0x90716f4b, +0x954b8aa3 }; + +static const uint32 S8[256] = { +0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, +0xe6c1121b, 0x0e241600, 0x052ce8b5, 0x11a9cfb0, 0xe5952f11, +0xece7990a, 0x9386d174, 0x2a42931c, 0x76e38111, 0xb12def3a, +0x37ddddfc, 0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, +0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd, 0x0b15a15d, +0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7, +0x72df191b, 0x7580330d, 0x94074251, 0x5c7dcdfa, 0xabbe6d63, +0xaa402164, 0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2, +0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, +0xce949ad4, 0xb84769ad, 0x965bd862, 0x82f3d055, 0x66fb9767, +0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8, 0x57e8726e, +0x647a78fc, 0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, +0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c, 0xbbd35049, +0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, +0x58cb7e07, 0x3b74ef2e, 0x522fffb1, 0xd24708cc, 0x1c7e27cd, +0xa4eb215b, 0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039, +0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, +0xc18910b1, 0xe11dbf7b, 0x06cd1af8, 0x7170c608, 0x2d5e3354, +0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, +0x77d51b42, 0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, +0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5, 0xe6459788, +0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, 0x31842e7b, +0x24259fd7, 0xf8bef472, 0x835ffcb8, 0x6df4c1f2, 0x96f5b195, +0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225, +0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, +0xea7a6e98, 0x7cd16efc, 0x1436876c, 0xf1544107, 0xbedeee14, +0x56e9af27, 0xa04aa441, 0x3cf7c899, 0x92ecbae6, 0xdd67016d, +0x151682eb, 0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, +0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054, 0xb6f2cf3b, +0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5, +0xbae7dfdc, 0x42cbda70, 0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, +0x20cf4d8c, 0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc, +0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, +0xc5c8b37e, 0x0d809ea2, 0x398feb7c, 0x132a4f94, 0x43b7950e, +0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b, 0xc4248289, +0xacf3ebc3, 0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, +0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4, 0xe87b40e4, +0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, +0x38d7e5b2, 0x57720101, 0x730edebc, 0x5b643113, 0x94917e4f, +0x503c2fba, 0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f, +0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, +0xad1163ed, 0xea7b5965, 0x1a00726e, 0x11403092, 0x00da6d77, +0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, +0xcee7d28a, 0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, +0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c, 0xaa12e4f2, +0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, 0x0d771c2b, +0x67cdb156, 0x350d8384, 0x5938fa0f, 0x42399ef3, 0x36997b07, +0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c, +0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, +0x0d2059d1, 0xa466bb1e, 0xf8da0a82, 0x04f19130, 0xba6e4ec0, +0x99265164, 0x1ee7230d, 0x50b2ad80, 0xeaee6801, 0x8db2a283, +0xea8bf59e }; + diff --git a/Cryptography/pycrypto-2.6.1/src/config.h.in b/Cryptography/pycrypto-2.6.1/src/config.h.in new file mode 100644 index 0000000..514c060 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/config.h.in @@ -0,0 +1,141 @@ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the declaration of `mpz_powm', and to 0 if you + don't. */ +#undef HAVE_DECL_MPZ_POWM + +/* Define to 1 if you have the declaration of `mpz_powm_sec', and to 0 if you + don't. */ +#undef HAVE_DECL_MPZ_POWM_SEC + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `gmp' library (-lgmp). */ +#undef HAVE_LIBGMP + +/* Define to 1 if you have the `mpir' library (-lmpir). */ +#undef HAVE_LIBMPIR + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#undef HAVE_MALLOC + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_WCHAR_H + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define for Solaris 2.5.1 so the uint32_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT32_T + +/* Define for Solaris 2.5.1 so the uint64_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT64_T + +/* Define for Solaris 2.5.1 so the uint8_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT8_T + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to the type of a signed integer type of width exactly 16 bits if + such a type exists and the standard includes do not define it. */ +#undef int16_t + +/* Define to the type of a signed integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +#undef int32_t + +/* Define to the type of a signed integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#undef int64_t + +/* Define to the type of a signed integer type of width exactly 8 bits if such + a type exists and the standard includes do not define it. */ +#undef int8_t + +/* Define to rpl_malloc if the replacement function should be used. */ +#undef malloc + +/* Define to `unsigned int' if does not define. */ +#undef size_t + +/* Define to the type of an unsigned integer type of width exactly 16 bits if + such a type exists and the standard includes do not define it. */ +#undef uint16_t + +/* Define to the type of an unsigned integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +#undef uint32_t + +/* Define to the type of an unsigned integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#undef uint64_t + +/* Define to the type of an unsigned integer type of width exactly 8 bits if + such a type exists and the standard includes do not define it. */ +#undef uint8_t diff --git a/Cryptography/pycrypto-2.6.1/src/hash_SHA2.h b/Cryptography/pycrypto-2.6.1/src/hash_SHA2.h new file mode 100644 index 0000000..5867191 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/hash_SHA2.h @@ -0,0 +1,104 @@ +/* + * An generic header for the SHA-2 hash family. + * + * Written in 2010 by Lorenz Quack + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + * + */ + +#ifndef __HASH_SHA2_H +#define __HASH_SHA2_H + +/* check if implementation set the correct macros */ +#ifndef MODULE_NAME +#error SHA2 Implementation must define MODULE_NAME before including this header +#endif + +#ifndef DIGEST_SIZE +#error SHA2 Implementation must define DIGEST_SIZE before including this header +#else +#define DIGEST_SIZE_BITS (DIGEST_SIZE*8) +#endif + +#ifndef BLOCK_SIZE +#error SHA2 Implementation must define BLOCK_SIZE before including this header +#else +#define BLOCK_SIZE_BITS (BLOCK_SIZE*8) +#endif + +#ifndef WORD_SIZE +#error SHA2 Implementation must define WORD_SIZE before including this header +#else +#if ((WORD_SIZE != 4) && (WORD_SIZE != 8)) +#error WORD_SIZE must be either 4 or 8 +#else +#define WORD_SIZE_BITS (WORD_SIZE*8) +#endif +#endif + +#ifndef SCHEDULE_SIZE +#error SHA2 Implementation must define SCHEDULE_SIZE before including this header +#endif + +/* define some helper macros */ +#define PADDING_SIZE (2 * WORD_SIZE) +#define LAST_BLOCK_SIZE (BLOCK_SIZE - PADDING_SIZE) + +/* define generic SHA-2 family functions */ +#define Ch(x,y,z) ((x & y) ^ (~x & z)) +#define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z)) +#define ROTR(x, n) (((x)>>((n)&(WORD_SIZE_BITS-1)))|((x)<<(WORD_SIZE_BITS-((n)&(WORD_SIZE_BITS-1))))) +#define SHR(x, n) ((x)>>(n)) + +/* determine fixed size types */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +#include +typedef uint8_t U8; +typedef uint32_t U32; +typedef uint64_t U64; +#elif defined(_MSC_VER) +typedef unsigned char U8; +typedef unsigned __int64 U64; +typedef unsigned int U32; +#elif defined(__sun) || defined(__sun__) +#include +typedef uint8_t U8; +typedef uint32_t U32; +typedef uint64_t U64; +#endif + +/* typedef a sha2_word_t type of appropriate size */ +#if (WORD_SIZE_BITS == 64) +typedef U64 sha2_word_t; +#elif (WORD_SIZE_BITS == 32) +typedef U32 sha2_word_t; +#else +#error According to the FIPS Standard WORD_SIZE_BITS must be either 32 or 64 +#endif + +/* define the hash_state structure */ +typedef struct{ + sha2_word_t state[8]; + int curlen; + sha2_word_t length_upper, length_lower; + unsigned char buf[BLOCK_SIZE]; +} hash_state; + +#endif /* __HASH_SHA2_H */ diff --git a/Cryptography/pycrypto-2.6.1/src/hash_SHA2_template.c b/Cryptography/pycrypto-2.6.1/src/hash_SHA2_template.c new file mode 100644 index 0000000..81b1ea6 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/hash_SHA2_template.c @@ -0,0 +1,199 @@ +/* + * An generic implementation of the SHA-2 hash family, this is endian neutral + * so should work just about anywhere. + * + * This code works much like the MD5 code provided by RSA. You sha_init() + * a "sha_state" then sha_process() the bytes you want and sha_done() to get + * the output. + * + * Originally written by Tom St Denis -- http://tomstdenis.home.dhs.org + * Adapted for PyCrypto by Jeethu Rao, Taylor Boon, and others. + * Turned into a generic template by Lorenz Quack + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + * + */ + +#include "Python.h" +#include "pycrypto_compat.h" + +/* compress one block */ +static void sha_compress(hash_state * hs) +{ + sha2_word_t S[8], W[SCHEDULE_SIZE], T1, T2; + int i; + + /* copy state into S */ + for (i = 0; i < 8; i++) + S[i] = hs->state[i]; + + /* copy the state into W[0..15] */ + for (i = 0; i < 16; i++){ + W[i] = ( + (((sha2_word_t) hs->buf[(WORD_SIZE*i)+0]) << (WORD_SIZE_BITS- 8)) | + (((sha2_word_t) hs->buf[(WORD_SIZE*i)+1]) << (WORD_SIZE_BITS-16)) | + (((sha2_word_t) hs->buf[(WORD_SIZE*i)+2]) << (WORD_SIZE_BITS-24)) | + (((sha2_word_t) hs->buf[(WORD_SIZE*i)+3]) << (WORD_SIZE_BITS-32)) +#if (WORD_SIZE_BITS == 64) + | + (((sha2_word_t) hs->buf[(WORD_SIZE*i)+4]) << (WORD_SIZE_BITS-40)) | + (((sha2_word_t) hs->buf[(WORD_SIZE*i)+5]) << (WORD_SIZE_BITS-48)) | + (((sha2_word_t) hs->buf[(WORD_SIZE*i)+6]) << (WORD_SIZE_BITS-56)) | + (((sha2_word_t) hs->buf[(WORD_SIZE*i)+7])) +#endif + ); + } + + /* fill W[16..SCHEDULE_SIZE] */ + for (i = 16; i < SCHEDULE_SIZE; i++) + W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]; + + /* Compress */ + for (i = 0; i < SCHEDULE_SIZE; i++) { + T1 = S[7] + Sigma1(S[4]) + Ch(S[4], S[5], S[6]) + K[i] + W[i]; + T2 = Sigma0(S[0]) + Maj(S[0], S[1], S[2]); + S[7] = S[6]; + S[6] = S[5]; + S[5] = S[4]; + S[4] = S[3] + T1; + S[3] = S[2]; + S[2] = S[1]; + S[1] = S[0]; + S[0] = T1 + T2; + } + + /* feedback */ + for (i = 0; i < 8; i++) + hs->state[i] += S[i]; +} + +/* adds *inc* to the length of the hash_state *hs* + * return 1 on success + * return 0 if the length overflows + */ +int add_length(hash_state *hs, sha2_word_t inc) { + sha2_word_t overflow_detector; + overflow_detector = hs->length_lower; + hs->length_lower += inc; + if (overflow_detector > hs->length_lower) { + overflow_detector = hs->length_upper; + hs->length_upper++; + if (hs->length_upper > hs->length_upper) + return 0; + } + return 1; +} + +/* init the SHA state */ +static void sha_init(hash_state * hs) +{ + int i; + hs->curlen = hs->length_upper = hs->length_lower = 0; + for (i = 0; i < 8; ++i) + hs->state[i] = H[i]; +} + +static void sha_process(hash_state * hs, unsigned char *buf, int len) +{ + while (len--) { + /* copy byte */ + hs->buf[hs->curlen++] = *buf++; + + /* is a block full? */ + if (hs->curlen == BLOCK_SIZE) { + sha_compress(hs); + add_length(hs, BLOCK_SIZE_BITS); + hs->curlen = 0; + } + } +} + +static void sha_done(hash_state * hs, unsigned char *hash) +{ + int i; + + /* increase the length of the message */ + add_length(hs, hs->curlen * 8); + + /* append the '1' bit */ + hs->buf[hs->curlen++] = 0x80; + + /* if the length is currently above LAST_BLOCK_SIZE bytes we append + * zeros then compress. Then we can fall back to padding zeros and length + * encoding like normal. + */ + if (hs->curlen > LAST_BLOCK_SIZE) { + for (; hs->curlen < BLOCK_SIZE;) + hs->buf[hs->curlen++] = 0; + sha_compress(hs); + hs->curlen = 0; + } + + /* pad upto LAST_BLOCK_SIZE bytes of zeroes */ + for (; hs->curlen < LAST_BLOCK_SIZE;) + hs->buf[hs->curlen++] = 0; + + /* append length */ + for (i = 0; i < WORD_SIZE; i++) + hs->buf[i + LAST_BLOCK_SIZE] = + (hs->length_upper >> ((WORD_SIZE - 1 - i) * 8)) & 0xFF; + for (i = 0; i < WORD_SIZE; i++) + hs->buf[i + LAST_BLOCK_SIZE + WORD_SIZE] = + (hs->length_lower >> ((WORD_SIZE - 1 - i) * 8)) & 0xFF; + sha_compress(hs); + + /* copy output */ + for (i = 0; i < DIGEST_SIZE; i++) + hash[i] = (hs->state[i / WORD_SIZE] >> + ((WORD_SIZE - 1 - (i % WORD_SIZE)) * 8)) & 0xFF; +} + +// Done +static void hash_init (hash_state *ptr) +{ + sha_init(ptr); +} + +// Done +static void +hash_update (hash_state *self, const U8 *buf, int len) +{ + sha_process(self,(unsigned char *)buf, len); +} + +// Done +static void +hash_copy(hash_state *src, hash_state *dest) +{ + memcpy(dest,src,sizeof(hash_state)); +} + +// Done +static PyObject * +hash_digest (const hash_state *self) +{ + unsigned char digest[DIGEST_SIZE]; + hash_state temp; + + hash_copy((hash_state*)self,&temp); + sha_done(&temp,digest); + return PyBytes_FromStringAndSize((char *)digest, DIGEST_SIZE); +} + +#include "hash_template.c" diff --git a/Cryptography/pycrypto-2.6.1/src/hash_template.c b/Cryptography/pycrypto-2.6.1/src/hash_template.c new file mode 100644 index 0000000..eb27e9f --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/hash_template.c @@ -0,0 +1,366 @@ +/* + * hash_template.c : Generic framework for hash function extension modules + * + * Written by Andrew Kuchling and others + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + */ + +/* Basic object type */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifdef _HAVE_STDC_HEADERS +#include +#endif +#include "Python.h" +#include "pycrypto_compat.h" + +#define _STR(x) #x +#define _XSTR(x) _STR(x) +#define _PASTE(x,y) x##y +#define _PASTE2(x,y) _PASTE(x,y) +#ifdef IS_PY3K +#define _MODULE_NAME _PASTE2(PyInit_,MODULE_NAME) +#else +#define _MODULE_NAME _PASTE2(init,MODULE_NAME) +#endif +#define _MODULE_STRING _XSTR(MODULE_NAME) + +typedef struct { + PyObject_HEAD + hash_state st; +} ALGobject; + +/* Please see PEP3123 for a discussion of PyObject_HEAD and changes made in 3.x to make it conform to Standard C. + * These changes also dictate using Py_TYPE to check type, and PyVarObject_HEAD_INIT(NULL, 0) to initialize + */ +#ifdef IS_PY3K +static PyTypeObject ALGtype; +#define is_ALGobject(v) (Py_TYPE(v) == &ALGtype) +#else +staticforward PyTypeObject ALGtype; +#define is_ALGobject(v) ((v)->ob_type == &ALGtype) +#define PyLong_FromLong PyInt_FromLong /* For Python 2.x */ +#endif + +static ALGobject * +newALGobject(void) +{ + ALGobject *new; + + new = PyObject_New(ALGobject, &ALGtype); + return new; +} + +/* Internal methods for a hashing object */ + +static void +ALG_dealloc(PyObject *ptr) +{ + ALGobject *self = (ALGobject *)ptr; + + /* Overwrite the contents of the object */ + memset((char*)&(self->st), 0, sizeof(hash_state)); + PyObject_Del(ptr); +} + + +/* External methods for a hashing object */ + +static char ALG_copy__doc__[] = +"copy(): Return a copy of the hashing object."; + +static PyObject * +ALG_copy(ALGobject *self, PyObject *args) +{ + ALGobject *newobj; + + if (!PyArg_ParseTuple(args, "")) { + return NULL; + } + + if ( (newobj = newALGobject())==NULL) + return NULL; + + hash_copy(&(self->st), &(newobj->st)); + return((PyObject *)newobj); +} + +static char ALG_digest__doc__[] = +"digest(): Return the digest value as a string of binary data."; + +static PyObject * +ALG_digest(ALGobject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) + return NULL; + + return (PyObject *)hash_digest(&(self->st)); +} + +static char ALG_hexdigest__doc__[] = +"hexdigest(): Return the digest value as a string of hexadecimal digits."; + +static PyObject * +ALG_hexdigest(ALGobject *self, PyObject *args) +{ + PyObject *value, *retval; + unsigned char *raw_digest, *hex_digest; + int i, j, size; + + if (!PyArg_ParseTuple(args, "")) + return NULL; + + /* Get the raw (binary) digest value */ + value = (PyObject *)hash_digest(&(self->st)); + size = PyBytes_Size(value); + raw_digest = (unsigned char *) PyBytes_AsString(value); + + /* Create a new string */ + retval = PyBytes_FromStringAndSize(NULL, size * 2 ); + hex_digest = (unsigned char *) PyBytes_AsString(retval); + + /* Make hex version of the digest */ + for(i=j=0; i9) ? c+'a'-10 : c + '0'; + hex_digest[j++] = c; + c = raw_digest[i] % 16; c = (c>9) ? c+'a'-10 : c + '0'; + hex_digest[j++] = c; + } +#ifdef IS_PY3K + /* Create a text string return value */ + retval = PyUnicode_FromEncodedObject(retval,"latin-1","strict"); +#endif + + Py_DECREF(value); + return retval; +} + +static char ALG_update__doc__[] = +"update(string): Update this hashing object's state with the provided string."; + +static PyObject * +ALG_update(ALGobject *self, PyObject *args) +{ + unsigned char *cp; + int len; + + if (!PyArg_ParseTuple(args, "s#", &cp, &len)) + return NULL; + + Py_BEGIN_ALLOW_THREADS; + + hash_update(&(self->st), cp, len); + Py_END_ALLOW_THREADS; + + Py_INCREF(Py_None); + + return Py_None; +} + +/** Forward declaration for this module's new() method **/ +static char ALG_new__doc__[] = +"new([string]): Return a new " _MODULE_STRING +" hashing object. An optional string " +"argument may be provided; if present, this string will be " +"automatically hashed into the initial state of the object."; + +static PyObject *ALG_new(PyObject*, PyObject*); + +static PyMethodDef ALG_methods[] = { + {"copy", (PyCFunction)ALG_copy, METH_VARARGS, ALG_copy__doc__}, + {"digest", (PyCFunction)ALG_digest, METH_VARARGS, ALG_digest__doc__}, + {"hexdigest", (PyCFunction)ALG_hexdigest, METH_VARARGS, ALG_hexdigest__doc__}, + {"update", (PyCFunction)ALG_update, METH_VARARGS, ALG_update__doc__}, + {"new", (PyCFunction)ALG_new, METH_VARARGS, ALG_new__doc__}, + {NULL, NULL} /* sentinel */ +}; + +static PyObject * +#ifdef IS_PY3K +ALG_getattro(PyObject *self, PyObject *attr) +#else +ALG_getattr(PyObject *self, char *name) +#endif +{ +#ifdef IS_PY3K + if (!PyUnicode_Check(attr)) + goto generic; + + if (PyUnicode_CompareWithASCIIString(attr, "digest_size")==0) + return PyLong_FromLong(DIGEST_SIZE); +#else + if (strcmp(name, "digest_size")==0) + return PyInt_FromLong(DIGEST_SIZE); +#endif + +#ifdef IS_PY3K + generic: + return PyObject_GenericGetAttr(self, attr); +#else + return Py_FindMethod(ALG_methods, self, name); +#endif +} + +static PyTypeObject ALGtype = { +#ifdef IS_PY3K + PyVarObject_HEAD_INIT(NULL, 0) /* deferred type init for compilation on Windows, type will be filled in at runtime */ +#else + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ +#endif + _MODULE_STRING, /*tp_name*/ + sizeof(ALGobject), /*tp_size*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor) ALG_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ +#ifdef IS_PY3K + 0, /*tp_getattr*/ +#else + ALG_getattr, /*tp_getattr*/ +#endif + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ +#ifdef IS_PY3K + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + ALG_getattro, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + ALG_methods, /*tp_methods*/ +#endif + }; + +/* The single module-level function: new() */ + +/** This method belong to both the module and the hash object **/ +static PyObject * +ALG_new(PyObject *self, PyObject *args) +{ + ALGobject *new; + unsigned char *cp = NULL; + int len; + + if ((new = newALGobject()) == NULL) + return NULL; + + if (!PyArg_ParseTuple(args, "|s#", + &cp, &len)) { + Py_DECREF(new); + return NULL; + } + + hash_init(&(new->st)); + + if (PyErr_Occurred()) { + Py_DECREF(new); + return NULL; + } + if (cp) { + Py_BEGIN_ALLOW_THREADS; + hash_update(&(new->st), cp, len); + Py_END_ALLOW_THREADS; + } + + return (PyObject *)new; +} + +/* List of functions exported by this module */ + +static struct PyMethodDef ALG_functions[] = { + {"new", (PyCFunction)ALG_new, METH_VARARGS, ALG_new__doc__}, + {NULL, NULL} /* Sentinel */ +}; + +#ifdef IS_PY3K +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "Crypto.Hash." _MODULE_STRING, + NULL, + -1, + ALG_functions, + NULL, + NULL, + NULL, + NULL +}; +#endif + +/* Initialize this module. */ + +/* Deal with old API in Python 2.1 */ +#if PYTHON_API_VERSION < 1011 +#define PyModule_AddIntConstant(m,n,v) {PyObject *o=PyInt_FromLong(v); \ + if (o!=NULL) \ + {PyDict_SetItemString(PyModule_GetDict(m),n,o); Py_DECREF(o);}} +#endif + +#ifdef IS_PY3K +PyMODINIT_FUNC +#else +void +#endif +_MODULE_NAME (void) +{ + PyObject *m; + +#ifdef IS_PY3K + /* PyType_Ready automatically fills in ob_type with &PyType_Type if it's not already set */ + if (PyType_Ready(&ALGtype) < 0) + return NULL; + + /* Create the module and add the functions */ + m = PyModule_Create(&moduledef); + if (m == NULL) + return NULL; +#else + ALGtype.ob_type = &PyType_Type; + m = Py_InitModule("Crypto.Hash." _MODULE_STRING, ALG_functions); +#endif + + /* Add some symbolic constants to the module */ + PyModule_AddIntConstant(m, "digest_size", DIGEST_SIZE); + PyModule_AddIntConstant(m, "block_size", BLOCK_SIZE); + + /* Check for errors */ + if (PyErr_Occurred()) + Py_FatalError("can't initialize module " + _MODULE_STRING); +#ifdef IS_PY3K + return m; +#endif +} diff --git a/Cryptography/pycrypto-2.6.1/src/inc-msvc/config.h b/Cryptography/pycrypto-2.6.1/src/inc-msvc/config.h new file mode 100644 index 0000000..2b7a626 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/inc-msvc/config.h @@ -0,0 +1,16 @@ +/* Define to 1 if you have the declaration of `mpz_powm', and to 0 if you + don't. */ +#undef HAVE_DECL_MPZ_POWM + +/* Define to 1 if you have the declaration of `mpz_powm_sec', and to 0 if you + don't. */ +#undef HAVE_DECL_MPZ_POWM_SEC + +/* Define to 1 if you have the `gmp' library (-lgmp). */ +#undef HAVE_LIBGMP + +/* Define to 1 if you have the `mpir' library (-lmpir). */ +#undef HAVE_LIBMPIR + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 diff --git a/Cryptography/pycrypto-2.6.1/src/inc-msvc/stdint.h b/Cryptography/pycrypto-2.6.1/src/inc-msvc/stdint.h new file mode 100644 index 0000000..f4a8eb7 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/inc-msvc/stdint.h @@ -0,0 +1,42 @@ +/* + * inc-msvc/stdint.h: Partial stdint.h for MSVC compiler + * + * Written in 2008 by Dwayne C. Litzenberger + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + */ +#ifndef PYCRYPTO_MSVC_STDINT_H +#define PYCRYPTO_MSVC_STDINT_H + +typedef signed __int8 int8_t; +typedef signed __int16 int16_t; +typedef signed __int32 int32_t; +typedef signed __int64 int64_t; + +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; + +#ifndef inline +# define inline __inline +#endif /* inline */ + +#endif /* PYCRYPTO_MSVC_STDINT_H */ +/* vim:set ts=4 sw=4 sts=4 expandtab: */ diff --git a/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt.h b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt.h new file mode 100644 index 0000000..5e127dc --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt.h @@ -0,0 +1,87 @@ +#ifndef TOMCRYPT_H_ +#define TOMCRYPT_H_ +#include +#include +#include +#include +#include +#include +#include + +/* use configuration data */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* version */ +#define CRYPT 0x0116 +#define SCRYPT "1.16" + +/* max size of either a cipher/hash block or symmetric key [largest of the two] */ +#define MAXBLOCKSIZE 128 + +/* descriptor table size */ +#define TAB_SIZE 32 + +/* error codes [will be expanded in future releases] */ +enum { + CRYPT_OK=0, /* Result OK */ + CRYPT_ERROR, /* Generic Error */ + CRYPT_NOP, /* Not a failure but no operation was performed */ + + CRYPT_INVALID_KEYSIZE, /* Invalid key size given */ + CRYPT_INVALID_ROUNDS, /* Invalid number of rounds */ + CRYPT_FAIL_TESTVECTOR, /* Algorithm failed test vectors */ + + CRYPT_BUFFER_OVERFLOW, /* Not enough space for output */ + CRYPT_INVALID_PACKET, /* Invalid input packet given */ + + CRYPT_INVALID_PRNGSIZE, /* Invalid number of bits for a PRNG */ + CRYPT_ERROR_READPRNG, /* Could not read enough from PRNG */ + + CRYPT_INVALID_CIPHER, /* Invalid cipher specified */ + CRYPT_INVALID_HASH, /* Invalid hash specified */ + CRYPT_INVALID_PRNG, /* Invalid PRNG specified */ + + CRYPT_MEM, /* Out of memory */ + + CRYPT_PK_TYPE_MISMATCH, /* Not equivalent types of PK keys */ + CRYPT_PK_NOT_PRIVATE, /* Requires a private PK key */ + + CRYPT_INVALID_ARG, /* Generic invalid argument */ + CRYPT_FILE_NOTFOUND, /* File Not Found */ + + CRYPT_PK_INVALID_TYPE, /* Invalid type of PK key */ + CRYPT_PK_INVALID_SYSTEM,/* Invalid PK system specified */ + CRYPT_PK_DUP, /* Duplicate key already in key ring */ + CRYPT_PK_NOT_FOUND, /* Key not found in keyring */ + CRYPT_PK_INVALID_SIZE, /* Invalid size input for PK parameters */ + + CRYPT_INVALID_PRIME_SIZE,/* Invalid size of prime requested */ + CRYPT_PK_INVALID_PADDING /* Invalid padding on input */ +}; + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus + } +#endif + +#endif /* TOMCRYPT_H_ */ + + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt.h,v $ */ +/* $Revision: 1.20 $ */ +/* $Date: 2006/11/26 01:45:14 $ */ diff --git a/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_argchk.h b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_argchk.h new file mode 100644 index 0000000..cfc93ad --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_argchk.h @@ -0,0 +1,38 @@ +/* Defines the LTC_ARGCHK macro used within the library */ +/* ARGTYPE is defined in mycrypt_cfg.h */ +#if ARGTYPE == 0 + +#include + +/* this is the default LibTomCrypt macro */ +void crypt_argchk(char *v, char *s, int d); +#define LTC_ARGCHK(x) if (!(x)) { crypt_argchk(#x, __FILE__, __LINE__); } +#define LTC_ARGCHKVD(x) LTC_ARGCHK(x) + +#elif ARGTYPE == 1 + +/* fatal type of error */ +#define LTC_ARGCHK(x) assert((x)) +#define LTC_ARGCHKVD(x) LTC_ARGCHK(x) + +#elif ARGTYPE == 2 + +#define LTC_ARGCHK(x) if (!(x)) { fprintf(stderr, "\nwarning: ARGCHK failed at %s:%d\n", __FILE__, __LINE__); } +#define LTC_ARGCHKVD(x) LTC_ARGCHK(x) + +#elif ARGTYPE == 3 + +#define LTC_ARGCHK(x) +#define LTC_ARGCHKVD(x) LTC_ARGCHK(x) + +#elif ARGTYPE == 4 + +#define LTC_ARGCHK(x) if (!(x)) return CRYPT_INVALID_ARG; +#define LTC_ARGCHKVD(x) if (!(x)) return; + +#endif + + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_argchk.h,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2006/08/27 20:50:21 $ */ diff --git a/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_cfg.h b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_cfg.h new file mode 100644 index 0000000..7feae6e --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_cfg.h @@ -0,0 +1,136 @@ +/* This is the build config file. + * + * With this you can setup what to inlcude/exclude automatically during any build. Just comment + * out the line that #define's the word for the thing you want to remove. phew! + */ + +#ifndef TOMCRYPT_CFG_H +#define TOMCRYPT_CFG_H + +#if defined(_WIN32) || defined(_MSC_VER) +#define LTC_CALL __cdecl +#else +#ifndef LTC_CALL + #define LTC_CALL +#endif +#endif + +#ifndef LTC_EXPORT +#define LTC_EXPORT +#endif + +/* certain platforms use macros for these, making the prototypes broken */ +#ifndef LTC_NO_PROTOTYPES + +/* you can change how memory allocation works ... */ +LTC_EXPORT void * LTC_CALL XMALLOC(size_t n); +LTC_EXPORT void * LTC_CALL XREALLOC(void *p, size_t n); +LTC_EXPORT void * LTC_CALL XCALLOC(size_t n, size_t s); +LTC_EXPORT void LTC_CALL XFREE(void *p); + +LTC_EXPORT void LTC_CALL XQSORT(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)); + + +/* change the clock function too */ +LTC_EXPORT clock_t LTC_CALL XCLOCK(void); + +/* various other functions */ +LTC_EXPORT void * LTC_CALL XMEMCPY(void *dest, const void *src, size_t n); +LTC_EXPORT int LTC_CALL XMEMCMP(const void *s1, const void *s2, size_t n); +LTC_EXPORT void * LTC_CALL XMEMSET(void *s, int c, size_t n); + +LTC_EXPORT int LTC_CALL XSTRCMP(const char *s1, const char *s2); + +#endif + +/* type of argument checking, 0=default, 1=fatal and 2=error+continue, 3=nothing */ +#ifndef ARGTYPE + #define ARGTYPE 0 +#endif + +/* Controls endianess and size of registers. Leave uncommented to get platform neutral [slower] code + * + * Note: in order to use the optimized macros your platform must support unaligned 32 and 64 bit read/writes. + * The x86 platforms allow this but some others [ARM for instance] do not. On those platforms you **MUST** + * use the portable [slower] macros. + */ + +/* detect x86-32 machines somewhat */ +#if !defined(__STRICT_ANSI__) && (defined(INTEL_CC) || (defined(_MSC_VER) && defined(WIN32)) || (defined(__GNUC__) && (defined(__DJGPP__) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__i386__)))) + #define ENDIAN_LITTLE + #define ENDIAN_32BITWORD + #define LTC_FAST + #define LTC_FAST_TYPE unsigned long +#endif + +/* detects MIPS R5900 processors (PS2) */ +#if (defined(__R5900) || defined(R5900) || defined(__R5900__)) && (defined(_mips) || defined(__mips__) || defined(mips)) + #define ENDIAN_LITTLE + #define ENDIAN_64BITWORD +#endif + +/* detect amd64 */ +#if !defined(__STRICT_ANSI__) && defined(__x86_64__) + #define ENDIAN_LITTLE + #define ENDIAN_64BITWORD + #define LTC_FAST + #define LTC_FAST_TYPE unsigned long +#endif + +/* detect PPC32 */ +#if !defined(__STRICT_ANSI__) && defined(LTC_PPC32) + #define ENDIAN_BIG + #define ENDIAN_32BITWORD + #define LTC_FAST + #define LTC_FAST_TYPE unsigned long +#endif + +/* detect sparc and sparc64 */ +#if defined(__sparc__) + #define ENDIAN_BIG + #if defined(__arch64__) + #define ENDIAN_64BITWORD + #else + #define ENDIAN_32BITWORD + #endif +#endif + + +#ifdef LTC_NO_FAST + #ifdef LTC_FAST + #undef LTC_FAST + #endif +#endif + +/* No asm is a quick way to disable anything "not portable" */ +#ifdef LTC_NO_ASM + #undef ENDIAN_LITTLE + #undef ENDIAN_BIG + #undef ENDIAN_32BITWORD + #undef ENDIAN_64BITWORD + #undef LTC_FAST + #undef LTC_FAST_TYPE + #define LTC_NO_ROLC + #define LTC_NO_BSWAP +#endif + +/* #define ENDIAN_LITTLE */ +/* #define ENDIAN_BIG */ + +/* #define ENDIAN_32BITWORD */ +/* #define ENDIAN_64BITWORD */ + +#if (defined(ENDIAN_BIG) || defined(ENDIAN_LITTLE)) && !(defined(ENDIAN_32BITWORD) || defined(ENDIAN_64BITWORD)) + #error You must specify a word size as well as endianess in tomcrypt_cfg.h +#endif + +#if !(defined(ENDIAN_BIG) || defined(ENDIAN_LITTLE)) + #define ENDIAN_NEUTRAL +#endif + +#endif + + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_cfg.h,v $ */ +/* $Revision: 1.19 $ */ +/* $Date: 2006/12/04 02:19:48 $ */ diff --git a/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_cipher.h b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_cipher.h new file mode 100644 index 0000000..e0cf94d --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_cipher.h @@ -0,0 +1,839 @@ +/* ---- SYMMETRIC KEY STUFF ----- + * + * We put each of the ciphers scheduled keys in their own structs then we put all of + * the key formats in one union. This makes the function prototypes easier to use. + */ +#ifdef BLOWFISH +struct blowfish_key { + ulong32 S[4][256]; + ulong32 K[18]; +}; +#endif + +#ifdef RC5 +struct rc5_key { + int rounds; + ulong32 K[50]; +}; +#endif + +#ifdef RC6 +struct rc6_key { + ulong32 K[44]; +}; +#endif + +#ifdef SAFERP +struct saferp_key { + unsigned char K[33][16]; + long rounds; +}; +#endif + +#ifdef RIJNDAEL +struct rijndael_key { + ulong32 eK[60], dK[60]; + int Nr; +}; +#endif + +#ifdef KSEED +struct kseed_key { + ulong32 K[32], dK[32]; +}; +#endif + +#ifdef LTC_KASUMI +struct kasumi_key { + ulong32 KLi1[8], KLi2[8], + KOi1[8], KOi2[8], KOi3[8], + KIi1[8], KIi2[8], KIi3[8]; +}; +#endif + +#ifdef XTEA +struct xtea_key { + unsigned long A[32], B[32]; +}; +#endif + +#ifdef TWOFISH +#ifndef TWOFISH_SMALL + struct twofish_key { + ulong32 S[4][256], K[40]; + }; +#else + struct twofish_key { + ulong32 K[40]; + unsigned char S[32], start; + }; +#endif +#endif + +#ifdef SAFER +#define SAFER_K64_DEFAULT_NOF_ROUNDS 6 +#define SAFER_K128_DEFAULT_NOF_ROUNDS 10 +#define SAFER_SK64_DEFAULT_NOF_ROUNDS 8 +#define SAFER_SK128_DEFAULT_NOF_ROUNDS 10 +#define SAFER_MAX_NOF_ROUNDS 13 +#define SAFER_BLOCK_LEN 8 +#define SAFER_KEY_LEN (1 + SAFER_BLOCK_LEN * (1 + 2 * SAFER_MAX_NOF_ROUNDS)) +typedef unsigned char safer_block_t[SAFER_BLOCK_LEN]; +typedef unsigned char safer_key_t[SAFER_KEY_LEN]; +struct safer_key { safer_key_t key; }; +#endif + +#ifdef RC2 +struct rc2_key { unsigned xkey[64]; }; +#endif + +#ifdef DES +struct des_key { + ulong32 ek[32], dk[32]; +}; + +struct des3_key { + ulong32 ek[3][32], dk[3][32]; +}; +#endif + +#ifdef CAST5 +struct cast5_key { + ulong32 K[32], keylen; +}; +#endif + +#ifdef NOEKEON +struct noekeon_key { + ulong32 K[4], dK[4]; +}; +#endif + +#ifdef SKIPJACK +struct skipjack_key { + unsigned char key[10]; +}; +#endif + +#ifdef KHAZAD +struct khazad_key { + ulong64 roundKeyEnc[8 + 1]; + ulong64 roundKeyDec[8 + 1]; +}; +#endif + +#ifdef ANUBIS +struct anubis_key { + int keyBits; + int R; + ulong32 roundKeyEnc[18 + 1][4]; + ulong32 roundKeyDec[18 + 1][4]; +}; +#endif + +typedef union Symmetric_key { +#ifdef DES + struct des_key des; + struct des3_key des3; +#endif +#ifdef RC2 + struct rc2_key rc2; +#endif +#ifdef SAFER + struct safer_key safer; +#endif +#ifdef TWOFISH + struct twofish_key twofish; +#endif +#ifdef BLOWFISH + struct blowfish_key blowfish; +#endif +#ifdef RC5 + struct rc5_key rc5; +#endif +#ifdef RC6 + struct rc6_key rc6; +#endif +#ifdef SAFERP + struct saferp_key saferp; +#endif +#ifdef RIJNDAEL + struct rijndael_key rijndael; +#endif +#ifdef XTEA + struct xtea_key xtea; +#endif +#ifdef CAST5 + struct cast5_key cast5; +#endif +#ifdef NOEKEON + struct noekeon_key noekeon; +#endif +#ifdef SKIPJACK + struct skipjack_key skipjack; +#endif +#ifdef KHAZAD + struct khazad_key khazad; +#endif +#ifdef ANUBIS + struct anubis_key anubis; +#endif +#ifdef KSEED + struct kseed_key kseed; +#endif +#ifdef LTC_KASUMI + struct kasumi_key kasumi; +#endif + void *data; +} symmetric_key; + +#ifdef LTC_ECB_MODE +/** A block cipher ECB structure */ +typedef struct { + /** The index of the cipher chosen */ + int cipher, + /** The block size of the given cipher */ + blocklen; + /** The scheduled key */ + symmetric_key key; +} symmetric_ECB; +#endif + +#ifdef LTC_CFB_MODE +/** A block cipher CFB structure */ +typedef struct { + /** The index of the cipher chosen */ + int cipher, + /** The block size of the given cipher */ + blocklen, + /** The padding offset */ + padlen; + /** The current IV */ + unsigned char IV[MAXBLOCKSIZE], + /** The pad used to encrypt/decrypt */ + pad[MAXBLOCKSIZE]; + /** The scheduled key */ + symmetric_key key; +} symmetric_CFB; +#endif + +#ifdef LTC_OFB_MODE +/** A block cipher OFB structure */ +typedef struct { + /** The index of the cipher chosen */ + int cipher, + /** The block size of the given cipher */ + blocklen, + /** The padding offset */ + padlen; + /** The current IV */ + unsigned char IV[MAXBLOCKSIZE]; + /** The scheduled key */ + symmetric_key key; +} symmetric_OFB; +#endif + +#ifdef LTC_CBC_MODE +/** A block cipher CBC structure */ +typedef struct { + /** The index of the cipher chosen */ + int cipher, + /** The block size of the given cipher */ + blocklen; + /** The current IV */ + unsigned char IV[MAXBLOCKSIZE]; + /** The scheduled key */ + symmetric_key key; +} symmetric_CBC; +#endif + + +#ifdef LTC_CTR_MODE +/** A block cipher CTR structure */ +typedef struct { + /** The index of the cipher chosen */ + int cipher, + /** The block size of the given cipher */ + blocklen, + /** The padding offset */ + padlen, + /** The mode (endianess) of the CTR, 0==little, 1==big */ + mode; + /** The counter */ + unsigned char ctr[MAXBLOCKSIZE], + /** The pad used to encrypt/decrypt */ + pad[MAXBLOCKSIZE]; + /** The scheduled key */ + symmetric_key key; +} symmetric_CTR; +#endif + + +#ifdef LTC_LRW_MODE +/** A LRW structure */ +typedef struct { + /** The index of the cipher chosen (must be a 128-bit block cipher) */ + int cipher; + + /** The current IV */ + unsigned char IV[16], + + /** the tweak key */ + tweak[16], + + /** The current pad, it's the product of the first 15 bytes against the tweak key */ + pad[16]; + + /** The scheduled symmetric key */ + symmetric_key key; + +#ifdef LRW_TABLES + /** The pre-computed multiplication table */ + unsigned char PC[16][256][16]; +#endif +} symmetric_LRW; +#endif + +#ifdef LTC_F8_MODE +/** A block cipher F8 structure */ +typedef struct { + /** The index of the cipher chosen */ + int cipher, + /** The block size of the given cipher */ + blocklen, + /** The padding offset */ + padlen; + /** The current IV */ + unsigned char IV[MAXBLOCKSIZE], + MIV[MAXBLOCKSIZE]; + /** Current block count */ + ulong32 blockcnt; + /** The scheduled key */ + symmetric_key key; +} symmetric_F8; +#endif + + +/** cipher descriptor table, last entry has "name == NULL" to mark the end of table */ +extern struct ltc_cipher_descriptor { + /** name of cipher */ + char *name; + /** internal ID */ + unsigned char ID; + /** min keysize (octets) */ + int min_key_length, + /** max keysize (octets) */ + max_key_length, + /** block size (octets) */ + block_length, + /** default number of rounds */ + default_rounds; + /** Setup the cipher + @param key The input symmetric key + @param keylen The length of the input key (octets) + @param num_rounds The requested number of rounds (0==default) + @param skey [out] The destination of the scheduled key + @return CRYPT_OK if successful + */ + int (*setup)(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); + /** Encrypt a block + @param pt The plaintext + @param ct [out] The ciphertext + @param skey The scheduled key + @return CRYPT_OK if successful + */ + int (*ecb_encrypt)(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); + /** Decrypt a block + @param ct The ciphertext + @param pt [out] The plaintext + @param skey The scheduled key + @return CRYPT_OK if successful + */ + int (*ecb_decrypt)(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); + /** Test the block cipher + @return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled + */ + int (*test)(void); + + /** Terminate the context + @param skey The scheduled key + */ + void (*done)(symmetric_key *skey); + + /** Determine a key size + @param keysize [in/out] The size of the key desired and the suggested size + @return CRYPT_OK if successful + */ + int (*keysize)(int *keysize); + +/** Accelerators **/ + /** Accelerated ECB encryption + @param pt Plaintext + @param ct Ciphertext + @param blocks The number of complete blocks to process + @param skey The scheduled key context + @return CRYPT_OK if successful + */ + int (*accel_ecb_encrypt)(const unsigned char *pt, unsigned char *ct, unsigned long blocks, symmetric_key *skey); + + /** Accelerated ECB decryption + @param pt Plaintext + @param ct Ciphertext + @param blocks The number of complete blocks to process + @param skey The scheduled key context + @return CRYPT_OK if successful + */ + int (*accel_ecb_decrypt)(const unsigned char *ct, unsigned char *pt, unsigned long blocks, symmetric_key *skey); + + /** Accelerated CBC encryption + @param pt Plaintext + @param ct Ciphertext + @param blocks The number of complete blocks to process + @param IV The initial value (input/output) + @param skey The scheduled key context + @return CRYPT_OK if successful + */ + int (*accel_cbc_encrypt)(const unsigned char *pt, unsigned char *ct, unsigned long blocks, unsigned char *IV, symmetric_key *skey); + + /** Accelerated CBC decryption + @param pt Plaintext + @param ct Ciphertext + @param blocks The number of complete blocks to process + @param IV The initial value (input/output) + @param skey The scheduled key context + @return CRYPT_OK if successful + */ + int (*accel_cbc_decrypt)(const unsigned char *ct, unsigned char *pt, unsigned long blocks, unsigned char *IV, symmetric_key *skey); + + /** Accelerated CTR encryption + @param pt Plaintext + @param ct Ciphertext + @param blocks The number of complete blocks to process + @param IV The initial value (input/output) + @param mode little or big endian counter (mode=0 or mode=1) + @param skey The scheduled key context + @return CRYPT_OK if successful + */ + int (*accel_ctr_encrypt)(const unsigned char *pt, unsigned char *ct, unsigned long blocks, unsigned char *IV, int mode, symmetric_key *skey); + + /** Accelerated LRW + @param pt Plaintext + @param ct Ciphertext + @param blocks The number of complete blocks to process + @param IV The initial value (input/output) + @param tweak The LRW tweak + @param skey The scheduled key context + @return CRYPT_OK if successful + */ + int (*accel_lrw_encrypt)(const unsigned char *pt, unsigned char *ct, unsigned long blocks, unsigned char *IV, const unsigned char *tweak, symmetric_key *skey); + + /** Accelerated LRW + @param ct Ciphertext + @param pt Plaintext + @param blocks The number of complete blocks to process + @param IV The initial value (input/output) + @param tweak The LRW tweak + @param skey The scheduled key context + @return CRYPT_OK if successful + */ + int (*accel_lrw_decrypt)(const unsigned char *ct, unsigned char *pt, unsigned long blocks, unsigned char *IV, const unsigned char *tweak, symmetric_key *skey); + + /** Accelerated CCM packet (one-shot) + @param key The secret key to use + @param keylen The length of the secret key (octets) + @param uskey A previously scheduled key [optional can be NULL] + @param nonce The session nonce [use once] + @param noncelen The length of the nonce + @param header The header for the session + @param headerlen The length of the header (octets) + @param pt [out] The plaintext + @param ptlen The length of the plaintext (octets) + @param ct [out] The ciphertext + @param tag [out] The destination tag + @param taglen [in/out] The max size and resulting size of the authentication tag + @param direction Encrypt or Decrypt direction (0 or 1) + @return CRYPT_OK if successful + */ + int (*accel_ccm_memory)( + const unsigned char *key, unsigned long keylen, + symmetric_key *uskey, + const unsigned char *nonce, unsigned long noncelen, + const unsigned char *header, unsigned long headerlen, + unsigned char *pt, unsigned long ptlen, + unsigned char *ct, + unsigned char *tag, unsigned long *taglen, + int direction); + + /** Accelerated GCM packet (one shot) + @param key The secret key + @param keylen The length of the secret key + @param IV The initial vector + @param IVlen The length of the initial vector + @param adata The additional authentication data (header) + @param adatalen The length of the adata + @param pt The plaintext + @param ptlen The length of the plaintext (ciphertext length is the same) + @param ct The ciphertext + @param tag [out] The MAC tag + @param taglen [in/out] The MAC tag length + @param direction Encrypt or Decrypt mode (GCM_ENCRYPT or GCM_DECRYPT) + @return CRYPT_OK on success + */ + int (*accel_gcm_memory)( + const unsigned char *key, unsigned long keylen, + const unsigned char *IV, unsigned long IVlen, + const unsigned char *adata, unsigned long adatalen, + unsigned char *pt, unsigned long ptlen, + unsigned char *ct, + unsigned char *tag, unsigned long *taglen, + int direction); + + /** Accelerated one shot OMAC + @param key The secret key + @param keylen The key length (octets) + @param in The message + @param inlen Length of message (octets) + @param out [out] Destination for tag + @param outlen [in/out] Initial and final size of out + @return CRYPT_OK on success + */ + int (*omac_memory)( + const unsigned char *key, unsigned long keylen, + const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + + /** Accelerated one shot XCBC + @param key The secret key + @param keylen The key length (octets) + @param in The message + @param inlen Length of message (octets) + @param out [out] Destination for tag + @param outlen [in/out] Initial and final size of out + @return CRYPT_OK on success + */ + int (*xcbc_memory)( + const unsigned char *key, unsigned long keylen, + const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + + /** Accelerated one shot F9 + @param key The secret key + @param keylen The key length (octets) + @param in The message + @param inlen Length of message (octets) + @param out [out] Destination for tag + @param outlen [in/out] Initial and final size of out + @return CRYPT_OK on success + @remark Requires manual padding + */ + int (*f9_memory)( + const unsigned char *key, unsigned long keylen, + const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +} cipher_descriptor[]; + +#ifdef BLOWFISH +int blowfish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int blowfish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int blowfish_test(void); +void blowfish_done(symmetric_key *skey); +int blowfish_keysize(int *keysize); +extern const struct ltc_cipher_descriptor blowfish_desc; +#endif + +#ifdef RC5 +int rc5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int rc5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int rc5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int rc5_test(void); +void rc5_done(symmetric_key *skey); +int rc5_keysize(int *keysize); +extern const struct ltc_cipher_descriptor rc5_desc; +#endif + +#ifdef RC6 +int rc6_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int rc6_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int rc6_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int rc6_test(void); +void rc6_done(symmetric_key *skey); +int rc6_keysize(int *keysize); +extern const struct ltc_cipher_descriptor rc6_desc; +#endif + +#ifdef RC2 +int rc2_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int rc2_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int rc2_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int rc2_test(void); +void rc2_done(symmetric_key *skey); +int rc2_keysize(int *keysize); +extern const struct ltc_cipher_descriptor rc2_desc; +#endif + +#ifdef SAFERP +int saferp_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int saferp_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int saferp_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int saferp_test(void); +void saferp_done(symmetric_key *skey); +int saferp_keysize(int *keysize); +extern const struct ltc_cipher_descriptor saferp_desc; +#endif + +#ifdef SAFER +int safer_k64_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int safer_sk64_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int safer_k128_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int safer_sk128_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int safer_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key); +int safer_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *key); +int safer_k64_test(void); +int safer_sk64_test(void); +int safer_sk128_test(void); +void safer_done(symmetric_key *skey); +int safer_64_keysize(int *keysize); +int safer_128_keysize(int *keysize); +extern const struct ltc_cipher_descriptor safer_k64_desc, safer_k128_desc, safer_sk64_desc, safer_sk128_desc; +#endif + +#ifdef RIJNDAEL + +/* make aes an alias */ +#define aes_setup rijndael_setup +#define aes_ecb_encrypt rijndael_ecb_encrypt +#define aes_ecb_decrypt rijndael_ecb_decrypt +#define aes_test rijndael_test +#define aes_done rijndael_done +#define aes_keysize rijndael_keysize + +#define aes_enc_setup rijndael_enc_setup +#define aes_enc_ecb_encrypt rijndael_enc_ecb_encrypt +#define aes_enc_keysize rijndael_enc_keysize + +int rijndael_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int rijndael_test(void); +void rijndael_done(symmetric_key *skey); +int rijndael_keysize(int *keysize); +int rijndael_enc_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int rijndael_enc_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +void rijndael_enc_done(symmetric_key *skey); +int rijndael_enc_keysize(int *keysize); +extern const struct ltc_cipher_descriptor rijndael_desc, aes_desc; +extern const struct ltc_cipher_descriptor rijndael_enc_desc, aes_enc_desc; +#endif + +#ifdef XTEA +int xtea_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int xtea_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int xtea_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int xtea_test(void); +void xtea_done(symmetric_key *skey); +int xtea_keysize(int *keysize); +extern const struct ltc_cipher_descriptor xtea_desc; +#endif + +#ifdef TWOFISH +int twofish_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int twofish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int twofish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int twofish_test(void); +void twofish_done(symmetric_key *skey); +int twofish_keysize(int *keysize); +extern const struct ltc_cipher_descriptor twofish_desc; +#endif + +#ifdef DES +static int des_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +static int des_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +static int des_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +static int des_test(void); +static void des_done(symmetric_key *skey); +static int des_keysize(int *keysize); +static int des3_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +static int des3_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +static int des3_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +static int des3_test(void); +static void des3_done(symmetric_key *skey); +static int des3_keysize(int *keysize); +/* extern const struct ltc_cipher_descriptor des_desc, des3_desc; */ +#endif + +#ifdef CAST5 +int cast5_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int cast5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int cast5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int cast5_test(void); +void cast5_done(symmetric_key *skey); +int cast5_keysize(int *keysize); +extern const struct ltc_cipher_descriptor cast5_desc; +#endif + +#ifdef NOEKEON +int noekeon_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int noekeon_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int noekeon_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int noekeon_test(void); +void noekeon_done(symmetric_key *skey); +int noekeon_keysize(int *keysize); +extern const struct ltc_cipher_descriptor noekeon_desc; +#endif + +#ifdef SKIPJACK +int skipjack_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int skipjack_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int skipjack_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int skipjack_test(void); +void skipjack_done(symmetric_key *skey); +int skipjack_keysize(int *keysize); +extern const struct ltc_cipher_descriptor skipjack_desc; +#endif + +#ifdef KHAZAD +int khazad_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int khazad_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int khazad_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int khazad_test(void); +void khazad_done(symmetric_key *skey); +int khazad_keysize(int *keysize); +extern const struct ltc_cipher_descriptor khazad_desc; +#endif + +#ifdef ANUBIS +int anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int anubis_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int anubis_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int anubis_test(void); +void anubis_done(symmetric_key *skey); +int anubis_keysize(int *keysize); +extern const struct ltc_cipher_descriptor anubis_desc; +#endif + +#ifdef KSEED +int kseed_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int kseed_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int kseed_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int kseed_test(void); +void kseed_done(symmetric_key *skey); +int kseed_keysize(int *keysize); +extern const struct ltc_cipher_descriptor kseed_desc; +#endif + +#ifdef LTC_KASUMI +int kasumi_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int kasumi_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey); +int kasumi_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey); +int kasumi_test(void); +void kasumi_done(symmetric_key *skey); +int kasumi_keysize(int *keysize); +extern const struct ltc_cipher_descriptor kasumi_desc; +#endif + +#ifdef LTC_ECB_MODE +int ecb_start(int cipher, const unsigned char *key, + int keylen, int num_rounds, symmetric_ECB *ecb); +int ecb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_ECB *ecb); +int ecb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_ECB *ecb); +int ecb_done(symmetric_ECB *ecb); +#endif + +#ifdef LTC_CFB_MODE +int cfb_start(int cipher, const unsigned char *IV, const unsigned char *key, + int keylen, int num_rounds, symmetric_CFB *cfb); +int cfb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CFB *cfb); +int cfb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CFB *cfb); +int cfb_getiv(unsigned char *IV, unsigned long *len, symmetric_CFB *cfb); +int cfb_setiv(const unsigned char *IV, unsigned long len, symmetric_CFB *cfb); +int cfb_done(symmetric_CFB *cfb); +#endif + +#ifdef LTC_OFB_MODE +int ofb_start(int cipher, const unsigned char *IV, const unsigned char *key, + int keylen, int num_rounds, symmetric_OFB *ofb); +int ofb_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_OFB *ofb); +int ofb_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_OFB *ofb); +int ofb_getiv(unsigned char *IV, unsigned long *len, symmetric_OFB *ofb); +int ofb_setiv(const unsigned char *IV, unsigned long len, symmetric_OFB *ofb); +int ofb_done(symmetric_OFB *ofb); +#endif + +#ifdef LTC_CBC_MODE +int cbc_start(int cipher, const unsigned char *IV, const unsigned char *key, + int keylen, int num_rounds, symmetric_CBC *cbc); +int cbc_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CBC *cbc); +int cbc_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CBC *cbc); +int cbc_getiv(unsigned char *IV, unsigned long *len, symmetric_CBC *cbc); +int cbc_setiv(const unsigned char *IV, unsigned long len, symmetric_CBC *cbc); +int cbc_done(symmetric_CBC *cbc); +#endif + +#ifdef LTC_CTR_MODE + +#define CTR_COUNTER_LITTLE_ENDIAN 0 +#define CTR_COUNTER_BIG_ENDIAN 1 +#define LTC_CTR_RFC3686 2 + +int ctr_start( int cipher, + const unsigned char *IV, + const unsigned char *key, int keylen, + int num_rounds, int ctr_mode, + symmetric_CTR *ctr); +int ctr_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_CTR *ctr); +int ctr_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_CTR *ctr); +int ctr_getiv(unsigned char *IV, unsigned long *len, symmetric_CTR *ctr); +int ctr_setiv(const unsigned char *IV, unsigned long len, symmetric_CTR *ctr); +int ctr_done(symmetric_CTR *ctr); +int ctr_test(void); +#endif + +#ifdef LTC_LRW_MODE + +#define LRW_ENCRYPT 0 +#define LRW_DECRYPT 1 + +int lrw_start( int cipher, + const unsigned char *IV, + const unsigned char *key, int keylen, + const unsigned char *tweak, + int num_rounds, + symmetric_LRW *lrw); +int lrw_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_LRW *lrw); +int lrw_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_LRW *lrw); +int lrw_getiv(unsigned char *IV, unsigned long *len, symmetric_LRW *lrw); +int lrw_setiv(const unsigned char *IV, unsigned long len, symmetric_LRW *lrw); +int lrw_done(symmetric_LRW *lrw); +int lrw_test(void); + +/* don't call */ +int lrw_process(const unsigned char *pt, unsigned char *ct, unsigned long len, int mode, symmetric_LRW *lrw); +#endif + +#ifdef LTC_F8_MODE +int f8_start( int cipher, const unsigned char *IV, + const unsigned char *key, int keylen, + const unsigned char *salt_key, int skeylen, + int num_rounds, symmetric_F8 *f8); +int f8_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_F8 *f8); +int f8_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_F8 *f8); +int f8_getiv(unsigned char *IV, unsigned long *len, symmetric_F8 *f8); +int f8_setiv(const unsigned char *IV, unsigned long len, symmetric_F8 *f8); +int f8_done(symmetric_F8 *f8); +int f8_test_mode(void); +#endif + + +int find_cipher(const char *name); +int find_cipher_any(const char *name, int blocklen, int keylen); +int find_cipher_id(unsigned char ID); +int register_cipher(const struct ltc_cipher_descriptor *cipher); +int unregister_cipher(const struct ltc_cipher_descriptor *cipher); +int cipher_is_valid(int idx); + +LTC_MUTEX_PROTO(ltc_cipher_mutex) + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_cipher.h,v $ */ +/* $Revision: 1.46 $ */ +/* $Date: 2006/11/13 23:09:38 $ */ diff --git a/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_custom.h b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_custom.h new file mode 100644 index 0000000..e08bc92 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_custom.h @@ -0,0 +1,403 @@ +#ifndef TOMCRYPT_CUSTOM_H_ +#define TOMCRYPT_CUSTOM_H_ + +/* macros for various libc functions you can change for embedded targets */ +#ifndef XMALLOC + #ifdef malloc + #define LTC_NO_PROTOTYPES + #endif +#define XMALLOC malloc +#endif +#ifndef XREALLOC + #ifdef realloc + #define LTC_NO_PROTOTYPES + #endif +#define XREALLOC realloc +#endif +#ifndef XCALLOC + #ifdef calloc + #define LTC_NO_PROTOTYPES + #endif +#define XCALLOC calloc +#endif +#ifndef XFREE + #ifdef free + #define LTC_NO_PROTOTYPES + #endif +#define XFREE free +#endif + +#ifndef XMEMSET + #ifdef memset + #define LTC_NO_PROTOTYPES + #endif +#define XMEMSET memset +#endif +#ifndef XMEMCPY + #ifdef memcpy + #define LTC_NO_PROTOTYPES + #endif +#define XMEMCPY memcpy +#endif +#ifndef XMEMCMP + #ifdef memcmp + #define LTC_NO_PROTOTYPES + #endif +#define XMEMCMP memcmp +#endif +#ifndef XSTRCMP + #ifdef strcmp + #define LTC_NO_PROTOTYPES + #endif +#define XSTRCMP strcmp +#endif + +#ifndef XCLOCK +#define XCLOCK clock +#endif +#ifndef XCLOCKS_PER_SEC +#define XCLOCKS_PER_SEC CLOCKS_PER_SEC +#endif + +#ifndef XQSORT + #ifdef qsort + #define LTC_NO_PROTOTYPES + #endif +#define XQSORT qsort +#endif + +/* Easy button? */ +#ifdef LTC_EASY + #define LTC_NO_CIPHERS + #define RIJNDAEL + #define BLOWFISH + #define DES + #define CAST5 + + #define LTC_NO_MODES + #define LTC_ECB_MODE + #define LTC_CBC_MODE + #define LTC_CTR_MODE + + #define LTC_NO_HASHES + #define SHA1 + #define SHA512 + #define SHA384 + #define SHA256 + #define SHA224 + + #define LTC_NO_MACS + #define HMAC + #define OMAC + #define CCM_MODE + + #define LTC_NO_PRNGS + #define SPRNG + #define YARROW + #define DEVRANDOM + #define TRY_URANDOM_FIRST + + #define LTC_NO_PK + #define MRSA + #define MECC +#endif + +/* Use small code where possible */ +/* #define LTC_SMALL_CODE */ + +/* Enable self-test test vector checking */ +#ifndef LTC_NO_TEST + #define LTC_TEST +#endif + +/* clean the stack of functions which put private information on stack */ +/* #define LTC_CLEAN_STACK */ + +/* disable all file related functions */ +/* #define LTC_NO_FILE */ + +/* disable all forms of ASM */ +/* #define LTC_NO_ASM */ + +/* disable FAST mode */ +/* #define LTC_NO_FAST */ + +/* disable BSWAP on x86 */ +/* #define LTC_NO_BSWAP */ + +/* ---> Symmetric Block Ciphers <--- */ +#ifndef LTC_NO_CIPHERS + +#define BLOWFISH +#define RC2 +#define RC5 +#define RC6 +#define SAFERP +#define RIJNDAEL +#define XTEA +/* _TABLES tells it to use tables during setup, _SMALL means to use the smaller scheduled key format + * (saves 4KB of ram), _ALL_TABLES enables all tables during setup */ +#define TWOFISH +#ifndef LTC_NO_TABLES + #define TWOFISH_TABLES + /* #define TWOFISH_ALL_TABLES */ +#else + #define TWOFISH_SMALL +#endif +/* #define TWOFISH_SMALL */ +/* DES includes EDE triple-DES */ +#define DES +#define CAST5 +#define NOEKEON +#define SKIPJACK +#define SAFER +#define KHAZAD +#define ANUBIS +#define ANUBIS_TWEAK +#define KSEED +#define LTC_KASUMI + +#endif /* LTC_NO_CIPHERS */ + + +/* ---> Block Cipher Modes of Operation <--- */ +#ifndef LTC_NO_MODES + +#define LTC_CFB_MODE +#define LTC_OFB_MODE +#define LTC_ECB_MODE +#define LTC_CBC_MODE +#define LTC_CTR_MODE + +/* F8 chaining mode */ +#define LTC_F8_MODE + +/* LRW mode */ +#define LTC_LRW_MODE +#ifndef LTC_NO_TABLES + /* like GCM mode this will enable 16 8x128 tables [64KB] that make + * seeking very fast. + */ + #define LRW_TABLES +#endif + +#endif /* LTC_NO_MODES */ + +/* ---> One-Way Hash Functions <--- */ +#ifndef LTC_NO_HASHES + +#define CHC_HASH +#define WHIRLPOOL +#define SHA512 +#define SHA384 +#define SHA256 +#define SHA224 +#define TIGER +#define SHA1 +#define MD5 +#define MD4 +#define MD2 +#define RIPEMD128 +#define RIPEMD160 +#define RIPEMD256 +#define RIPEMD320 + +#endif /* LTC_NO_HASHES */ + +/* ---> MAC functions <--- */ +#ifndef LTC_NO_MACS + +#define LTC_HMAC +#define LTC_OMAC +#define LTC_PMAC +#define LTC_XCBC +#define LTC_F9_MODE +#define PELICAN + +#if defined(PELICAN) && !defined(RIJNDAEL) + #error Pelican-MAC requires RIJNDAEL +#endif + +/* ---> Encrypt + Authenticate Modes <--- */ + +#define EAX_MODE +#if defined(EAX_MODE) && !(defined(LTC_CTR_MODE) && defined(LTC_OMAC)) + #error EAX_MODE requires CTR and OMAC mode +#endif + +#define OCB_MODE +#define CCM_MODE +#define GCM_MODE + +/* Use 64KiB tables */ +#ifndef LTC_NO_TABLES + #define GCM_TABLES +#endif + +/* USE SSE2? requires GCC works on x86_32 and x86_64*/ +#ifdef GCM_TABLES +/* #define GCM_TABLES_SSE2 */ +#endif + +#endif /* LTC_NO_MACS */ + +/* Various tidbits of modern neatoness */ +#define BASE64 + +/* --> Pseudo Random Number Generators <--- */ +#ifndef LTC_NO_PRNGS + +/* Yarrow */ +#define YARROW +/* which descriptor of AES to use? */ +/* 0 = rijndael_enc 1 = aes_enc, 2 = rijndael [full], 3 = aes [full] */ +#define YARROW_AES 0 + +#if defined(YARROW) && !defined(LTC_CTR_MODE) + #error YARROW requires LTC_CTR_MODE chaining mode to be defined! +#endif + +/* a PRNG that simply reads from an available system source */ +#define SPRNG + +/* The RC4 stream cipher */ +#define RC4 + +/* Fortuna PRNG */ +#define FORTUNA +/* reseed every N calls to the read function */ +#define FORTUNA_WD 10 +/* number of pools (4..32) can save a bit of ram by lowering the count */ +#define FORTUNA_POOLS 32 + +/* Greg's SOBER128 PRNG ;-0 */ +#define SOBER128 + +/* the *nix style /dev/random device */ +#define DEVRANDOM +/* try /dev/urandom before trying /dev/random */ +#define TRY_URANDOM_FIRST + +#endif /* LTC_NO_PRNGS */ + +/* ---> math provider? <--- */ +#ifndef LTC_NO_MATH + +/* LibTomMath */ +/* #define LTM_DESC */ + +/* TomsFastMath */ +/* #define TFM_DESC */ + +#endif /* LTC_NO_MATH */ + +/* ---> Public Key Crypto <--- */ +#ifndef LTC_NO_PK + +/* Include RSA support */ +#define MRSA + +/* Include Katja (a Rabin variant like RSA) */ +/* #define MKAT */ + +/* Digital Signature Algorithm */ +#define MDSA + +/* ECC */ +#define MECC + +/* use Shamir's trick for point mul (speeds up signature verification) */ +#define LTC_ECC_SHAMIR + +#if defined(TFM_DESC) && defined(MECC) + #define MECC_ACCEL +#endif + +/* do we want fixed point ECC */ +/* #define MECC_FP */ + +/* Timing Resistant? */ +/* #define LTC_ECC_TIMING_RESISTANT */ + +#endif /* LTC_NO_PK */ + +/* PKCS #1 (RSA) and #5 (Password Handling) stuff */ +#ifndef LTC_NO_PKCS + +#define PKCS_1 +#define PKCS_5 + +/* Include ASN.1 DER (required by DSA/RSA) */ +#define LTC_DER + +#endif /* LTC_NO_PKCS */ + +/* cleanup */ + +#ifdef MECC +/* Supported ECC Key Sizes */ +#ifndef LTC_NO_CURVES + #define ECC112 + #define ECC128 + #define ECC160 + #define ECC192 + #define ECC224 + #define ECC256 + #define ECC384 + #define ECC521 +#endif +#endif + +#if defined(MECC) || defined(MRSA) || defined(MDSA) || defined(MKATJA) + /* Include the MPI functionality? (required by the PK algorithms) */ + #define MPI +#endif + +#ifdef MRSA + #define PKCS_1 +#endif + +#if defined(LTC_DER) && !defined(MPI) + #error ASN.1 DER requires MPI functionality +#endif + +#if (defined(MDSA) || defined(MRSA) || defined(MECC) || defined(MKATJA)) && !defined(LTC_DER) + #error PK requires ASN.1 DER functionality, make sure LTC_DER is enabled +#endif + +/* THREAD management */ +#ifdef LTC_PTHREAD + +#include + +#define LTC_MUTEX_GLOBAL(x) pthread_mutex_t x = PTHREAD_MUTEX_INITIALIZER; +#define LTC_MUTEX_PROTO(x) extern pthread_mutex_t x; +#define LTC_MUTEX_TYPE(x) pthread_mutex_t x; +#define LTC_MUTEX_INIT(x) pthread_mutex_init(x, NULL); +#define LTC_MUTEX_LOCK(x) pthread_mutex_lock(x); +#define LTC_MUTEX_UNLOCK(x) pthread_mutex_unlock(x); + +#else + +/* default no functions */ +#define LTC_MUTEX_GLOBAL(x) +#define LTC_MUTEX_PROTO(x) +#define LTC_MUTEX_TYPE(x) +#define LTC_MUTEX_INIT(x) +#define LTC_MUTEX_LOCK(x) +#define LTC_MUTEX_UNLOCK(x) + +#endif + +/* Debuggers */ + +/* define this if you use Valgrind, note: it CHANGES the way SOBER-128 and RC4 work (see the code) */ +/* #define LTC_VALGRIND */ + +#endif + + + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_custom.h,v $ */ +/* $Revision: 1.66 $ */ +/* $Date: 2006/12/04 02:50:11 $ */ diff --git a/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_des.c b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_des.c new file mode 100644 index 0000000..a9a4839 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_des.c @@ -0,0 +1,1912 @@ +/* LibTomCrypt, modular cryptographic library -- Tom St Denis + * + * LibTomCrypt is a library that provides various cryptographic + * algorithms in a highly modular and flexible manner. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com + */ +#include "tomcrypt.h" + +/** + @file des.c + DES code submitted by Dobes Vandermeer +*/ + +#ifdef DES + +#define EN0 0 +#define DE1 1 + +static const struct ltc_cipher_descriptor des_desc = +{ + "des", + 13, + 8, 8, 8, 16, + &des_setup, + &des_ecb_encrypt, + &des_ecb_decrypt, + &des_test, + &des_done, + &des_keysize, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; + +static const struct ltc_cipher_descriptor des3_desc = +{ + "3des", + 14, + 24, 24, 8, 16, + &des3_setup, + &des3_ecb_encrypt, + &des3_ecb_decrypt, + &des3_test, + &des3_done, + &des3_keysize, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; + +static const ulong32 bytebit[8] = +{ + 0200, 0100, 040, 020, 010, 04, 02, 01 +}; + +static const ulong32 bigbyte[24] = +{ + 0x800000UL, 0x400000UL, 0x200000UL, 0x100000UL, + 0x80000UL, 0x40000UL, 0x20000UL, 0x10000UL, + 0x8000UL, 0x4000UL, 0x2000UL, 0x1000UL, + 0x800UL, 0x400UL, 0x200UL, 0x100UL, + 0x80UL, 0x40UL, 0x20UL, 0x10UL, + 0x8UL, 0x4UL, 0x2UL, 0x1L +}; + +/* Use the key schedule specific in the standard (ANSI X3.92-1981) */ + +static const unsigned char pc1[56] = { + 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, + 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, + 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, + 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3 +}; + +static const unsigned char totrot[16] = { + 1, 2, 4, 6, + 8, 10, 12, 14, + 15, 17, 19, 21, + 23, 25, 27, 28 +}; + +static const unsigned char pc2[48] = { + 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, + 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, + 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, + 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 +}; + + +static const ulong32 SP1[64] = +{ + 0x01010400UL, 0x00000000UL, 0x00010000UL, 0x01010404UL, + 0x01010004UL, 0x00010404UL, 0x00000004UL, 0x00010000UL, + 0x00000400UL, 0x01010400UL, 0x01010404UL, 0x00000400UL, + 0x01000404UL, 0x01010004UL, 0x01000000UL, 0x00000004UL, + 0x00000404UL, 0x01000400UL, 0x01000400UL, 0x00010400UL, + 0x00010400UL, 0x01010000UL, 0x01010000UL, 0x01000404UL, + 0x00010004UL, 0x01000004UL, 0x01000004UL, 0x00010004UL, + 0x00000000UL, 0x00000404UL, 0x00010404UL, 0x01000000UL, + 0x00010000UL, 0x01010404UL, 0x00000004UL, 0x01010000UL, + 0x01010400UL, 0x01000000UL, 0x01000000UL, 0x00000400UL, + 0x01010004UL, 0x00010000UL, 0x00010400UL, 0x01000004UL, + 0x00000400UL, 0x00000004UL, 0x01000404UL, 0x00010404UL, + 0x01010404UL, 0x00010004UL, 0x01010000UL, 0x01000404UL, + 0x01000004UL, 0x00000404UL, 0x00010404UL, 0x01010400UL, + 0x00000404UL, 0x01000400UL, 0x01000400UL, 0x00000000UL, + 0x00010004UL, 0x00010400UL, 0x00000000UL, 0x01010004UL +}; + +static const ulong32 SP2[64] = +{ + 0x80108020UL, 0x80008000UL, 0x00008000UL, 0x00108020UL, + 0x00100000UL, 0x00000020UL, 0x80100020UL, 0x80008020UL, + 0x80000020UL, 0x80108020UL, 0x80108000UL, 0x80000000UL, + 0x80008000UL, 0x00100000UL, 0x00000020UL, 0x80100020UL, + 0x00108000UL, 0x00100020UL, 0x80008020UL, 0x00000000UL, + 0x80000000UL, 0x00008000UL, 0x00108020UL, 0x80100000UL, + 0x00100020UL, 0x80000020UL, 0x00000000UL, 0x00108000UL, + 0x00008020UL, 0x80108000UL, 0x80100000UL, 0x00008020UL, + 0x00000000UL, 0x00108020UL, 0x80100020UL, 0x00100000UL, + 0x80008020UL, 0x80100000UL, 0x80108000UL, 0x00008000UL, + 0x80100000UL, 0x80008000UL, 0x00000020UL, 0x80108020UL, + 0x00108020UL, 0x00000020UL, 0x00008000UL, 0x80000000UL, + 0x00008020UL, 0x80108000UL, 0x00100000UL, 0x80000020UL, + 0x00100020UL, 0x80008020UL, 0x80000020UL, 0x00100020UL, + 0x00108000UL, 0x00000000UL, 0x80008000UL, 0x00008020UL, + 0x80000000UL, 0x80100020UL, 0x80108020UL, 0x00108000UL +}; + +static const ulong32 SP3[64] = +{ + 0x00000208UL, 0x08020200UL, 0x00000000UL, 0x08020008UL, + 0x08000200UL, 0x00000000UL, 0x00020208UL, 0x08000200UL, + 0x00020008UL, 0x08000008UL, 0x08000008UL, 0x00020000UL, + 0x08020208UL, 0x00020008UL, 0x08020000UL, 0x00000208UL, + 0x08000000UL, 0x00000008UL, 0x08020200UL, 0x00000200UL, + 0x00020200UL, 0x08020000UL, 0x08020008UL, 0x00020208UL, + 0x08000208UL, 0x00020200UL, 0x00020000UL, 0x08000208UL, + 0x00000008UL, 0x08020208UL, 0x00000200UL, 0x08000000UL, + 0x08020200UL, 0x08000000UL, 0x00020008UL, 0x00000208UL, + 0x00020000UL, 0x08020200UL, 0x08000200UL, 0x00000000UL, + 0x00000200UL, 0x00020008UL, 0x08020208UL, 0x08000200UL, + 0x08000008UL, 0x00000200UL, 0x00000000UL, 0x08020008UL, + 0x08000208UL, 0x00020000UL, 0x08000000UL, 0x08020208UL, + 0x00000008UL, 0x00020208UL, 0x00020200UL, 0x08000008UL, + 0x08020000UL, 0x08000208UL, 0x00000208UL, 0x08020000UL, + 0x00020208UL, 0x00000008UL, 0x08020008UL, 0x00020200UL +}; + +static const ulong32 SP4[64] = +{ + 0x00802001UL, 0x00002081UL, 0x00002081UL, 0x00000080UL, + 0x00802080UL, 0x00800081UL, 0x00800001UL, 0x00002001UL, + 0x00000000UL, 0x00802000UL, 0x00802000UL, 0x00802081UL, + 0x00000081UL, 0x00000000UL, 0x00800080UL, 0x00800001UL, + 0x00000001UL, 0x00002000UL, 0x00800000UL, 0x00802001UL, + 0x00000080UL, 0x00800000UL, 0x00002001UL, 0x00002080UL, + 0x00800081UL, 0x00000001UL, 0x00002080UL, 0x00800080UL, + 0x00002000UL, 0x00802080UL, 0x00802081UL, 0x00000081UL, + 0x00800080UL, 0x00800001UL, 0x00802000UL, 0x00802081UL, + 0x00000081UL, 0x00000000UL, 0x00000000UL, 0x00802000UL, + 0x00002080UL, 0x00800080UL, 0x00800081UL, 0x00000001UL, + 0x00802001UL, 0x00002081UL, 0x00002081UL, 0x00000080UL, + 0x00802081UL, 0x00000081UL, 0x00000001UL, 0x00002000UL, + 0x00800001UL, 0x00002001UL, 0x00802080UL, 0x00800081UL, + 0x00002001UL, 0x00002080UL, 0x00800000UL, 0x00802001UL, + 0x00000080UL, 0x00800000UL, 0x00002000UL, 0x00802080UL +}; + +static const ulong32 SP5[64] = +{ + 0x00000100UL, 0x02080100UL, 0x02080000UL, 0x42000100UL, + 0x00080000UL, 0x00000100UL, 0x40000000UL, 0x02080000UL, + 0x40080100UL, 0x00080000UL, 0x02000100UL, 0x40080100UL, + 0x42000100UL, 0x42080000UL, 0x00080100UL, 0x40000000UL, + 0x02000000UL, 0x40080000UL, 0x40080000UL, 0x00000000UL, + 0x40000100UL, 0x42080100UL, 0x42080100UL, 0x02000100UL, + 0x42080000UL, 0x40000100UL, 0x00000000UL, 0x42000000UL, + 0x02080100UL, 0x02000000UL, 0x42000000UL, 0x00080100UL, + 0x00080000UL, 0x42000100UL, 0x00000100UL, 0x02000000UL, + 0x40000000UL, 0x02080000UL, 0x42000100UL, 0x40080100UL, + 0x02000100UL, 0x40000000UL, 0x42080000UL, 0x02080100UL, + 0x40080100UL, 0x00000100UL, 0x02000000UL, 0x42080000UL, + 0x42080100UL, 0x00080100UL, 0x42000000UL, 0x42080100UL, + 0x02080000UL, 0x00000000UL, 0x40080000UL, 0x42000000UL, + 0x00080100UL, 0x02000100UL, 0x40000100UL, 0x00080000UL, + 0x00000000UL, 0x40080000UL, 0x02080100UL, 0x40000100UL +}; + +static const ulong32 SP6[64] = +{ + 0x20000010UL, 0x20400000UL, 0x00004000UL, 0x20404010UL, + 0x20400000UL, 0x00000010UL, 0x20404010UL, 0x00400000UL, + 0x20004000UL, 0x00404010UL, 0x00400000UL, 0x20000010UL, + 0x00400010UL, 0x20004000UL, 0x20000000UL, 0x00004010UL, + 0x00000000UL, 0x00400010UL, 0x20004010UL, 0x00004000UL, + 0x00404000UL, 0x20004010UL, 0x00000010UL, 0x20400010UL, + 0x20400010UL, 0x00000000UL, 0x00404010UL, 0x20404000UL, + 0x00004010UL, 0x00404000UL, 0x20404000UL, 0x20000000UL, + 0x20004000UL, 0x00000010UL, 0x20400010UL, 0x00404000UL, + 0x20404010UL, 0x00400000UL, 0x00004010UL, 0x20000010UL, + 0x00400000UL, 0x20004000UL, 0x20000000UL, 0x00004010UL, + 0x20000010UL, 0x20404010UL, 0x00404000UL, 0x20400000UL, + 0x00404010UL, 0x20404000UL, 0x00000000UL, 0x20400010UL, + 0x00000010UL, 0x00004000UL, 0x20400000UL, 0x00404010UL, + 0x00004000UL, 0x00400010UL, 0x20004010UL, 0x00000000UL, + 0x20404000UL, 0x20000000UL, 0x00400010UL, 0x20004010UL +}; + +static const ulong32 SP7[64] = +{ + 0x00200000UL, 0x04200002UL, 0x04000802UL, 0x00000000UL, + 0x00000800UL, 0x04000802UL, 0x00200802UL, 0x04200800UL, + 0x04200802UL, 0x00200000UL, 0x00000000UL, 0x04000002UL, + 0x00000002UL, 0x04000000UL, 0x04200002UL, 0x00000802UL, + 0x04000800UL, 0x00200802UL, 0x00200002UL, 0x04000800UL, + 0x04000002UL, 0x04200000UL, 0x04200800UL, 0x00200002UL, + 0x04200000UL, 0x00000800UL, 0x00000802UL, 0x04200802UL, + 0x00200800UL, 0x00000002UL, 0x04000000UL, 0x00200800UL, + 0x04000000UL, 0x00200800UL, 0x00200000UL, 0x04000802UL, + 0x04000802UL, 0x04200002UL, 0x04200002UL, 0x00000002UL, + 0x00200002UL, 0x04000000UL, 0x04000800UL, 0x00200000UL, + 0x04200800UL, 0x00000802UL, 0x00200802UL, 0x04200800UL, + 0x00000802UL, 0x04000002UL, 0x04200802UL, 0x04200000UL, + 0x00200800UL, 0x00000000UL, 0x00000002UL, 0x04200802UL, + 0x00000000UL, 0x00200802UL, 0x04200000UL, 0x00000800UL, + 0x04000002UL, 0x04000800UL, 0x00000800UL, 0x00200002UL +}; + +static const ulong32 SP8[64] = +{ + 0x10001040UL, 0x00001000UL, 0x00040000UL, 0x10041040UL, + 0x10000000UL, 0x10001040UL, 0x00000040UL, 0x10000000UL, + 0x00040040UL, 0x10040000UL, 0x10041040UL, 0x00041000UL, + 0x10041000UL, 0x00041040UL, 0x00001000UL, 0x00000040UL, + 0x10040000UL, 0x10000040UL, 0x10001000UL, 0x00001040UL, + 0x00041000UL, 0x00040040UL, 0x10040040UL, 0x10041000UL, + 0x00001040UL, 0x00000000UL, 0x00000000UL, 0x10040040UL, + 0x10000040UL, 0x10001000UL, 0x00041040UL, 0x00040000UL, + 0x00041040UL, 0x00040000UL, 0x10041000UL, 0x00001000UL, + 0x00000040UL, 0x10040040UL, 0x00001000UL, 0x00041040UL, + 0x10001000UL, 0x00000040UL, 0x10000040UL, 0x10040000UL, + 0x10040040UL, 0x10000000UL, 0x00040000UL, 0x10001040UL, + 0x00000000UL, 0x10041040UL, 0x00040040UL, 0x10000040UL, + 0x10040000UL, 0x10001000UL, 0x10001040UL, 0x00000000UL, + 0x10041040UL, 0x00041000UL, 0x00041000UL, 0x00001040UL, + 0x00001040UL, 0x00040040UL, 0x10000000UL, 0x10041000UL +}; + +#ifndef LTC_SMALL_CODE + +static const ulong64 des_ip[8][256] = { + +{ CONST64(0x0000000000000000), CONST64(0x0000001000000000), CONST64(0x0000000000000010), CONST64(0x0000001000000010), + CONST64(0x0000100000000000), CONST64(0x0000101000000000), CONST64(0x0000100000000010), CONST64(0x0000101000000010), + CONST64(0x0000000000001000), CONST64(0x0000001000001000), CONST64(0x0000000000001010), CONST64(0x0000001000001010), + CONST64(0x0000100000001000), CONST64(0x0000101000001000), CONST64(0x0000100000001010), CONST64(0x0000101000001010), + CONST64(0x0010000000000000), CONST64(0x0010001000000000), CONST64(0x0010000000000010), CONST64(0x0010001000000010), + CONST64(0x0010100000000000), CONST64(0x0010101000000000), CONST64(0x0010100000000010), CONST64(0x0010101000000010), + CONST64(0x0010000000001000), CONST64(0x0010001000001000), CONST64(0x0010000000001010), CONST64(0x0010001000001010), + CONST64(0x0010100000001000), CONST64(0x0010101000001000), CONST64(0x0010100000001010), CONST64(0x0010101000001010), + CONST64(0x0000000000100000), CONST64(0x0000001000100000), CONST64(0x0000000000100010), CONST64(0x0000001000100010), + CONST64(0x0000100000100000), CONST64(0x0000101000100000), CONST64(0x0000100000100010), CONST64(0x0000101000100010), + CONST64(0x0000000000101000), CONST64(0x0000001000101000), CONST64(0x0000000000101010), CONST64(0x0000001000101010), + CONST64(0x0000100000101000), CONST64(0x0000101000101000), CONST64(0x0000100000101010), CONST64(0x0000101000101010), + CONST64(0x0010000000100000), CONST64(0x0010001000100000), CONST64(0x0010000000100010), CONST64(0x0010001000100010), + CONST64(0x0010100000100000), CONST64(0x0010101000100000), CONST64(0x0010100000100010), CONST64(0x0010101000100010), + CONST64(0x0010000000101000), CONST64(0x0010001000101000), CONST64(0x0010000000101010), CONST64(0x0010001000101010), + CONST64(0x0010100000101000), CONST64(0x0010101000101000), CONST64(0x0010100000101010), CONST64(0x0010101000101010), + CONST64(0x1000000000000000), CONST64(0x1000001000000000), CONST64(0x1000000000000010), CONST64(0x1000001000000010), + CONST64(0x1000100000000000), CONST64(0x1000101000000000), CONST64(0x1000100000000010), CONST64(0x1000101000000010), + CONST64(0x1000000000001000), CONST64(0x1000001000001000), CONST64(0x1000000000001010), CONST64(0x1000001000001010), + CONST64(0x1000100000001000), CONST64(0x1000101000001000), CONST64(0x1000100000001010), CONST64(0x1000101000001010), + CONST64(0x1010000000000000), CONST64(0x1010001000000000), CONST64(0x1010000000000010), CONST64(0x1010001000000010), + CONST64(0x1010100000000000), CONST64(0x1010101000000000), CONST64(0x1010100000000010), CONST64(0x1010101000000010), + CONST64(0x1010000000001000), CONST64(0x1010001000001000), CONST64(0x1010000000001010), CONST64(0x1010001000001010), + CONST64(0x1010100000001000), CONST64(0x1010101000001000), CONST64(0x1010100000001010), CONST64(0x1010101000001010), + CONST64(0x1000000000100000), CONST64(0x1000001000100000), CONST64(0x1000000000100010), CONST64(0x1000001000100010), + CONST64(0x1000100000100000), CONST64(0x1000101000100000), CONST64(0x1000100000100010), CONST64(0x1000101000100010), + CONST64(0x1000000000101000), CONST64(0x1000001000101000), CONST64(0x1000000000101010), CONST64(0x1000001000101010), + CONST64(0x1000100000101000), CONST64(0x1000101000101000), CONST64(0x1000100000101010), CONST64(0x1000101000101010), + CONST64(0x1010000000100000), CONST64(0x1010001000100000), CONST64(0x1010000000100010), CONST64(0x1010001000100010), + CONST64(0x1010100000100000), CONST64(0x1010101000100000), CONST64(0x1010100000100010), CONST64(0x1010101000100010), + CONST64(0x1010000000101000), CONST64(0x1010001000101000), CONST64(0x1010000000101010), CONST64(0x1010001000101010), + CONST64(0x1010100000101000), CONST64(0x1010101000101000), CONST64(0x1010100000101010), CONST64(0x1010101000101010), + CONST64(0x0000000010000000), CONST64(0x0000001010000000), CONST64(0x0000000010000010), CONST64(0x0000001010000010), + CONST64(0x0000100010000000), CONST64(0x0000101010000000), CONST64(0x0000100010000010), CONST64(0x0000101010000010), + CONST64(0x0000000010001000), CONST64(0x0000001010001000), CONST64(0x0000000010001010), CONST64(0x0000001010001010), + CONST64(0x0000100010001000), CONST64(0x0000101010001000), CONST64(0x0000100010001010), CONST64(0x0000101010001010), + CONST64(0x0010000010000000), CONST64(0x0010001010000000), CONST64(0x0010000010000010), CONST64(0x0010001010000010), + CONST64(0x0010100010000000), CONST64(0x0010101010000000), CONST64(0x0010100010000010), CONST64(0x0010101010000010), + CONST64(0x0010000010001000), CONST64(0x0010001010001000), CONST64(0x0010000010001010), CONST64(0x0010001010001010), + CONST64(0x0010100010001000), CONST64(0x0010101010001000), CONST64(0x0010100010001010), CONST64(0x0010101010001010), + CONST64(0x0000000010100000), CONST64(0x0000001010100000), CONST64(0x0000000010100010), CONST64(0x0000001010100010), + CONST64(0x0000100010100000), CONST64(0x0000101010100000), CONST64(0x0000100010100010), CONST64(0x0000101010100010), + CONST64(0x0000000010101000), CONST64(0x0000001010101000), CONST64(0x0000000010101010), CONST64(0x0000001010101010), + CONST64(0x0000100010101000), CONST64(0x0000101010101000), CONST64(0x0000100010101010), CONST64(0x0000101010101010), + CONST64(0x0010000010100000), CONST64(0x0010001010100000), CONST64(0x0010000010100010), CONST64(0x0010001010100010), + CONST64(0x0010100010100000), CONST64(0x0010101010100000), CONST64(0x0010100010100010), CONST64(0x0010101010100010), + CONST64(0x0010000010101000), CONST64(0x0010001010101000), CONST64(0x0010000010101010), CONST64(0x0010001010101010), + CONST64(0x0010100010101000), CONST64(0x0010101010101000), CONST64(0x0010100010101010), CONST64(0x0010101010101010), + CONST64(0x1000000010000000), CONST64(0x1000001010000000), CONST64(0x1000000010000010), CONST64(0x1000001010000010), + CONST64(0x1000100010000000), CONST64(0x1000101010000000), CONST64(0x1000100010000010), CONST64(0x1000101010000010), + CONST64(0x1000000010001000), CONST64(0x1000001010001000), CONST64(0x1000000010001010), CONST64(0x1000001010001010), + CONST64(0x1000100010001000), CONST64(0x1000101010001000), CONST64(0x1000100010001010), CONST64(0x1000101010001010), + CONST64(0x1010000010000000), CONST64(0x1010001010000000), CONST64(0x1010000010000010), CONST64(0x1010001010000010), + CONST64(0x1010100010000000), CONST64(0x1010101010000000), CONST64(0x1010100010000010), CONST64(0x1010101010000010), + CONST64(0x1010000010001000), CONST64(0x1010001010001000), CONST64(0x1010000010001010), CONST64(0x1010001010001010), + CONST64(0x1010100010001000), CONST64(0x1010101010001000), CONST64(0x1010100010001010), CONST64(0x1010101010001010), + CONST64(0x1000000010100000), CONST64(0x1000001010100000), CONST64(0x1000000010100010), CONST64(0x1000001010100010), + CONST64(0x1000100010100000), CONST64(0x1000101010100000), CONST64(0x1000100010100010), CONST64(0x1000101010100010), + CONST64(0x1000000010101000), CONST64(0x1000001010101000), CONST64(0x1000000010101010), CONST64(0x1000001010101010), + CONST64(0x1000100010101000), CONST64(0x1000101010101000), CONST64(0x1000100010101010), CONST64(0x1000101010101010), + CONST64(0x1010000010100000), CONST64(0x1010001010100000), CONST64(0x1010000010100010), CONST64(0x1010001010100010), + CONST64(0x1010100010100000), CONST64(0x1010101010100000), CONST64(0x1010100010100010), CONST64(0x1010101010100010), + CONST64(0x1010000010101000), CONST64(0x1010001010101000), CONST64(0x1010000010101010), CONST64(0x1010001010101010), + CONST64(0x1010100010101000), CONST64(0x1010101010101000), CONST64(0x1010100010101010), CONST64(0x1010101010101010) + }, +{ CONST64(0x0000000000000000), CONST64(0x0000000800000000), CONST64(0x0000000000000008), CONST64(0x0000000800000008), + CONST64(0x0000080000000000), CONST64(0x0000080800000000), CONST64(0x0000080000000008), CONST64(0x0000080800000008), + CONST64(0x0000000000000800), CONST64(0x0000000800000800), CONST64(0x0000000000000808), CONST64(0x0000000800000808), + CONST64(0x0000080000000800), CONST64(0x0000080800000800), CONST64(0x0000080000000808), CONST64(0x0000080800000808), + CONST64(0x0008000000000000), CONST64(0x0008000800000000), CONST64(0x0008000000000008), CONST64(0x0008000800000008), + CONST64(0x0008080000000000), CONST64(0x0008080800000000), CONST64(0x0008080000000008), CONST64(0x0008080800000008), + CONST64(0x0008000000000800), CONST64(0x0008000800000800), CONST64(0x0008000000000808), CONST64(0x0008000800000808), + CONST64(0x0008080000000800), CONST64(0x0008080800000800), CONST64(0x0008080000000808), CONST64(0x0008080800000808), + CONST64(0x0000000000080000), CONST64(0x0000000800080000), CONST64(0x0000000000080008), CONST64(0x0000000800080008), + CONST64(0x0000080000080000), CONST64(0x0000080800080000), CONST64(0x0000080000080008), CONST64(0x0000080800080008), + CONST64(0x0000000000080800), CONST64(0x0000000800080800), CONST64(0x0000000000080808), CONST64(0x0000000800080808), + CONST64(0x0000080000080800), CONST64(0x0000080800080800), CONST64(0x0000080000080808), CONST64(0x0000080800080808), + CONST64(0x0008000000080000), CONST64(0x0008000800080000), CONST64(0x0008000000080008), CONST64(0x0008000800080008), + CONST64(0x0008080000080000), CONST64(0x0008080800080000), CONST64(0x0008080000080008), CONST64(0x0008080800080008), + CONST64(0x0008000000080800), CONST64(0x0008000800080800), CONST64(0x0008000000080808), CONST64(0x0008000800080808), + CONST64(0x0008080000080800), CONST64(0x0008080800080800), CONST64(0x0008080000080808), CONST64(0x0008080800080808), + CONST64(0x0800000000000000), CONST64(0x0800000800000000), CONST64(0x0800000000000008), CONST64(0x0800000800000008), + CONST64(0x0800080000000000), CONST64(0x0800080800000000), CONST64(0x0800080000000008), CONST64(0x0800080800000008), + CONST64(0x0800000000000800), CONST64(0x0800000800000800), CONST64(0x0800000000000808), CONST64(0x0800000800000808), + CONST64(0x0800080000000800), CONST64(0x0800080800000800), CONST64(0x0800080000000808), CONST64(0x0800080800000808), + CONST64(0x0808000000000000), CONST64(0x0808000800000000), CONST64(0x0808000000000008), CONST64(0x0808000800000008), + CONST64(0x0808080000000000), CONST64(0x0808080800000000), CONST64(0x0808080000000008), CONST64(0x0808080800000008), + CONST64(0x0808000000000800), CONST64(0x0808000800000800), CONST64(0x0808000000000808), CONST64(0x0808000800000808), + CONST64(0x0808080000000800), CONST64(0x0808080800000800), CONST64(0x0808080000000808), CONST64(0x0808080800000808), + CONST64(0x0800000000080000), CONST64(0x0800000800080000), CONST64(0x0800000000080008), CONST64(0x0800000800080008), + CONST64(0x0800080000080000), CONST64(0x0800080800080000), CONST64(0x0800080000080008), CONST64(0x0800080800080008), + CONST64(0x0800000000080800), CONST64(0x0800000800080800), CONST64(0x0800000000080808), CONST64(0x0800000800080808), + CONST64(0x0800080000080800), CONST64(0x0800080800080800), CONST64(0x0800080000080808), CONST64(0x0800080800080808), + CONST64(0x0808000000080000), CONST64(0x0808000800080000), CONST64(0x0808000000080008), CONST64(0x0808000800080008), + CONST64(0x0808080000080000), CONST64(0x0808080800080000), CONST64(0x0808080000080008), CONST64(0x0808080800080008), + CONST64(0x0808000000080800), CONST64(0x0808000800080800), CONST64(0x0808000000080808), CONST64(0x0808000800080808), + CONST64(0x0808080000080800), CONST64(0x0808080800080800), CONST64(0x0808080000080808), CONST64(0x0808080800080808), + CONST64(0x0000000008000000), CONST64(0x0000000808000000), CONST64(0x0000000008000008), CONST64(0x0000000808000008), + CONST64(0x0000080008000000), CONST64(0x0000080808000000), CONST64(0x0000080008000008), CONST64(0x0000080808000008), + CONST64(0x0000000008000800), CONST64(0x0000000808000800), CONST64(0x0000000008000808), CONST64(0x0000000808000808), + CONST64(0x0000080008000800), CONST64(0x0000080808000800), CONST64(0x0000080008000808), CONST64(0x0000080808000808), + CONST64(0x0008000008000000), CONST64(0x0008000808000000), CONST64(0x0008000008000008), CONST64(0x0008000808000008), + CONST64(0x0008080008000000), CONST64(0x0008080808000000), CONST64(0x0008080008000008), CONST64(0x0008080808000008), + CONST64(0x0008000008000800), CONST64(0x0008000808000800), CONST64(0x0008000008000808), CONST64(0x0008000808000808), + CONST64(0x0008080008000800), CONST64(0x0008080808000800), CONST64(0x0008080008000808), CONST64(0x0008080808000808), + CONST64(0x0000000008080000), CONST64(0x0000000808080000), CONST64(0x0000000008080008), CONST64(0x0000000808080008), + CONST64(0x0000080008080000), CONST64(0x0000080808080000), CONST64(0x0000080008080008), CONST64(0x0000080808080008), + CONST64(0x0000000008080800), CONST64(0x0000000808080800), CONST64(0x0000000008080808), CONST64(0x0000000808080808), + CONST64(0x0000080008080800), CONST64(0x0000080808080800), CONST64(0x0000080008080808), CONST64(0x0000080808080808), + CONST64(0x0008000008080000), CONST64(0x0008000808080000), CONST64(0x0008000008080008), CONST64(0x0008000808080008), + CONST64(0x0008080008080000), CONST64(0x0008080808080000), CONST64(0x0008080008080008), CONST64(0x0008080808080008), + CONST64(0x0008000008080800), CONST64(0x0008000808080800), CONST64(0x0008000008080808), CONST64(0x0008000808080808), + CONST64(0x0008080008080800), CONST64(0x0008080808080800), CONST64(0x0008080008080808), CONST64(0x0008080808080808), + CONST64(0x0800000008000000), CONST64(0x0800000808000000), CONST64(0x0800000008000008), CONST64(0x0800000808000008), + CONST64(0x0800080008000000), CONST64(0x0800080808000000), CONST64(0x0800080008000008), CONST64(0x0800080808000008), + CONST64(0x0800000008000800), CONST64(0x0800000808000800), CONST64(0x0800000008000808), CONST64(0x0800000808000808), + CONST64(0x0800080008000800), CONST64(0x0800080808000800), CONST64(0x0800080008000808), CONST64(0x0800080808000808), + CONST64(0x0808000008000000), CONST64(0x0808000808000000), CONST64(0x0808000008000008), CONST64(0x0808000808000008), + CONST64(0x0808080008000000), CONST64(0x0808080808000000), CONST64(0x0808080008000008), CONST64(0x0808080808000008), + CONST64(0x0808000008000800), CONST64(0x0808000808000800), CONST64(0x0808000008000808), CONST64(0x0808000808000808), + CONST64(0x0808080008000800), CONST64(0x0808080808000800), CONST64(0x0808080008000808), CONST64(0x0808080808000808), + CONST64(0x0800000008080000), CONST64(0x0800000808080000), CONST64(0x0800000008080008), CONST64(0x0800000808080008), + CONST64(0x0800080008080000), CONST64(0x0800080808080000), CONST64(0x0800080008080008), CONST64(0x0800080808080008), + CONST64(0x0800000008080800), CONST64(0x0800000808080800), CONST64(0x0800000008080808), CONST64(0x0800000808080808), + CONST64(0x0800080008080800), CONST64(0x0800080808080800), CONST64(0x0800080008080808), CONST64(0x0800080808080808), + CONST64(0x0808000008080000), CONST64(0x0808000808080000), CONST64(0x0808000008080008), CONST64(0x0808000808080008), + CONST64(0x0808080008080000), CONST64(0x0808080808080000), CONST64(0x0808080008080008), CONST64(0x0808080808080008), + CONST64(0x0808000008080800), CONST64(0x0808000808080800), CONST64(0x0808000008080808), CONST64(0x0808000808080808), + CONST64(0x0808080008080800), CONST64(0x0808080808080800), CONST64(0x0808080008080808), CONST64(0x0808080808080808) + }, +{ CONST64(0x0000000000000000), CONST64(0x0000000400000000), CONST64(0x0000000000000004), CONST64(0x0000000400000004), + CONST64(0x0000040000000000), CONST64(0x0000040400000000), CONST64(0x0000040000000004), CONST64(0x0000040400000004), + CONST64(0x0000000000000400), CONST64(0x0000000400000400), CONST64(0x0000000000000404), CONST64(0x0000000400000404), + CONST64(0x0000040000000400), CONST64(0x0000040400000400), CONST64(0x0000040000000404), CONST64(0x0000040400000404), + CONST64(0x0004000000000000), CONST64(0x0004000400000000), CONST64(0x0004000000000004), CONST64(0x0004000400000004), + CONST64(0x0004040000000000), CONST64(0x0004040400000000), CONST64(0x0004040000000004), CONST64(0x0004040400000004), + CONST64(0x0004000000000400), CONST64(0x0004000400000400), CONST64(0x0004000000000404), CONST64(0x0004000400000404), + CONST64(0x0004040000000400), CONST64(0x0004040400000400), CONST64(0x0004040000000404), CONST64(0x0004040400000404), + CONST64(0x0000000000040000), CONST64(0x0000000400040000), CONST64(0x0000000000040004), CONST64(0x0000000400040004), + CONST64(0x0000040000040000), CONST64(0x0000040400040000), CONST64(0x0000040000040004), CONST64(0x0000040400040004), + CONST64(0x0000000000040400), CONST64(0x0000000400040400), CONST64(0x0000000000040404), CONST64(0x0000000400040404), + CONST64(0x0000040000040400), CONST64(0x0000040400040400), CONST64(0x0000040000040404), CONST64(0x0000040400040404), + CONST64(0x0004000000040000), CONST64(0x0004000400040000), CONST64(0x0004000000040004), CONST64(0x0004000400040004), + CONST64(0x0004040000040000), CONST64(0x0004040400040000), CONST64(0x0004040000040004), CONST64(0x0004040400040004), + CONST64(0x0004000000040400), CONST64(0x0004000400040400), CONST64(0x0004000000040404), CONST64(0x0004000400040404), + CONST64(0x0004040000040400), CONST64(0x0004040400040400), CONST64(0x0004040000040404), CONST64(0x0004040400040404), + CONST64(0x0400000000000000), CONST64(0x0400000400000000), CONST64(0x0400000000000004), CONST64(0x0400000400000004), + CONST64(0x0400040000000000), CONST64(0x0400040400000000), CONST64(0x0400040000000004), CONST64(0x0400040400000004), + CONST64(0x0400000000000400), CONST64(0x0400000400000400), CONST64(0x0400000000000404), CONST64(0x0400000400000404), + CONST64(0x0400040000000400), CONST64(0x0400040400000400), CONST64(0x0400040000000404), CONST64(0x0400040400000404), + CONST64(0x0404000000000000), CONST64(0x0404000400000000), CONST64(0x0404000000000004), CONST64(0x0404000400000004), + CONST64(0x0404040000000000), CONST64(0x0404040400000000), CONST64(0x0404040000000004), CONST64(0x0404040400000004), + CONST64(0x0404000000000400), CONST64(0x0404000400000400), CONST64(0x0404000000000404), CONST64(0x0404000400000404), + CONST64(0x0404040000000400), CONST64(0x0404040400000400), CONST64(0x0404040000000404), CONST64(0x0404040400000404), + CONST64(0x0400000000040000), CONST64(0x0400000400040000), CONST64(0x0400000000040004), CONST64(0x0400000400040004), + CONST64(0x0400040000040000), CONST64(0x0400040400040000), CONST64(0x0400040000040004), CONST64(0x0400040400040004), + CONST64(0x0400000000040400), CONST64(0x0400000400040400), CONST64(0x0400000000040404), CONST64(0x0400000400040404), + CONST64(0x0400040000040400), CONST64(0x0400040400040400), CONST64(0x0400040000040404), CONST64(0x0400040400040404), + CONST64(0x0404000000040000), CONST64(0x0404000400040000), CONST64(0x0404000000040004), CONST64(0x0404000400040004), + CONST64(0x0404040000040000), CONST64(0x0404040400040000), CONST64(0x0404040000040004), CONST64(0x0404040400040004), + CONST64(0x0404000000040400), CONST64(0x0404000400040400), CONST64(0x0404000000040404), CONST64(0x0404000400040404), + CONST64(0x0404040000040400), CONST64(0x0404040400040400), CONST64(0x0404040000040404), CONST64(0x0404040400040404), + CONST64(0x0000000004000000), CONST64(0x0000000404000000), CONST64(0x0000000004000004), CONST64(0x0000000404000004), + CONST64(0x0000040004000000), CONST64(0x0000040404000000), CONST64(0x0000040004000004), CONST64(0x0000040404000004), + CONST64(0x0000000004000400), CONST64(0x0000000404000400), CONST64(0x0000000004000404), CONST64(0x0000000404000404), + CONST64(0x0000040004000400), CONST64(0x0000040404000400), CONST64(0x0000040004000404), CONST64(0x0000040404000404), + CONST64(0x0004000004000000), CONST64(0x0004000404000000), CONST64(0x0004000004000004), CONST64(0x0004000404000004), + CONST64(0x0004040004000000), CONST64(0x0004040404000000), CONST64(0x0004040004000004), CONST64(0x0004040404000004), + CONST64(0x0004000004000400), CONST64(0x0004000404000400), CONST64(0x0004000004000404), CONST64(0x0004000404000404), + CONST64(0x0004040004000400), CONST64(0x0004040404000400), CONST64(0x0004040004000404), CONST64(0x0004040404000404), + CONST64(0x0000000004040000), CONST64(0x0000000404040000), CONST64(0x0000000004040004), CONST64(0x0000000404040004), + CONST64(0x0000040004040000), CONST64(0x0000040404040000), CONST64(0x0000040004040004), CONST64(0x0000040404040004), + CONST64(0x0000000004040400), CONST64(0x0000000404040400), CONST64(0x0000000004040404), CONST64(0x0000000404040404), + CONST64(0x0000040004040400), CONST64(0x0000040404040400), CONST64(0x0000040004040404), CONST64(0x0000040404040404), + CONST64(0x0004000004040000), CONST64(0x0004000404040000), CONST64(0x0004000004040004), CONST64(0x0004000404040004), + CONST64(0x0004040004040000), CONST64(0x0004040404040000), CONST64(0x0004040004040004), CONST64(0x0004040404040004), + CONST64(0x0004000004040400), CONST64(0x0004000404040400), CONST64(0x0004000004040404), CONST64(0x0004000404040404), + CONST64(0x0004040004040400), CONST64(0x0004040404040400), CONST64(0x0004040004040404), CONST64(0x0004040404040404), + CONST64(0x0400000004000000), CONST64(0x0400000404000000), CONST64(0x0400000004000004), CONST64(0x0400000404000004), + CONST64(0x0400040004000000), CONST64(0x0400040404000000), CONST64(0x0400040004000004), CONST64(0x0400040404000004), + CONST64(0x0400000004000400), CONST64(0x0400000404000400), CONST64(0x0400000004000404), CONST64(0x0400000404000404), + CONST64(0x0400040004000400), CONST64(0x0400040404000400), CONST64(0x0400040004000404), CONST64(0x0400040404000404), + CONST64(0x0404000004000000), CONST64(0x0404000404000000), CONST64(0x0404000004000004), CONST64(0x0404000404000004), + CONST64(0x0404040004000000), CONST64(0x0404040404000000), CONST64(0x0404040004000004), CONST64(0x0404040404000004), + CONST64(0x0404000004000400), CONST64(0x0404000404000400), CONST64(0x0404000004000404), CONST64(0x0404000404000404), + CONST64(0x0404040004000400), CONST64(0x0404040404000400), CONST64(0x0404040004000404), CONST64(0x0404040404000404), + CONST64(0x0400000004040000), CONST64(0x0400000404040000), CONST64(0x0400000004040004), CONST64(0x0400000404040004), + CONST64(0x0400040004040000), CONST64(0x0400040404040000), CONST64(0x0400040004040004), CONST64(0x0400040404040004), + CONST64(0x0400000004040400), CONST64(0x0400000404040400), CONST64(0x0400000004040404), CONST64(0x0400000404040404), + CONST64(0x0400040004040400), CONST64(0x0400040404040400), CONST64(0x0400040004040404), CONST64(0x0400040404040404), + CONST64(0x0404000004040000), CONST64(0x0404000404040000), CONST64(0x0404000004040004), CONST64(0x0404000404040004), + CONST64(0x0404040004040000), CONST64(0x0404040404040000), CONST64(0x0404040004040004), CONST64(0x0404040404040004), + CONST64(0x0404000004040400), CONST64(0x0404000404040400), CONST64(0x0404000004040404), CONST64(0x0404000404040404), + CONST64(0x0404040004040400), CONST64(0x0404040404040400), CONST64(0x0404040004040404), CONST64(0x0404040404040404) + }, +{ CONST64(0x0000000000000000), CONST64(0x0000000200000000), CONST64(0x0000000000000002), CONST64(0x0000000200000002), + CONST64(0x0000020000000000), CONST64(0x0000020200000000), CONST64(0x0000020000000002), CONST64(0x0000020200000002), + CONST64(0x0000000000000200), CONST64(0x0000000200000200), CONST64(0x0000000000000202), CONST64(0x0000000200000202), + CONST64(0x0000020000000200), CONST64(0x0000020200000200), CONST64(0x0000020000000202), CONST64(0x0000020200000202), + CONST64(0x0002000000000000), CONST64(0x0002000200000000), CONST64(0x0002000000000002), CONST64(0x0002000200000002), + CONST64(0x0002020000000000), CONST64(0x0002020200000000), CONST64(0x0002020000000002), CONST64(0x0002020200000002), + CONST64(0x0002000000000200), CONST64(0x0002000200000200), CONST64(0x0002000000000202), CONST64(0x0002000200000202), + CONST64(0x0002020000000200), CONST64(0x0002020200000200), CONST64(0x0002020000000202), CONST64(0x0002020200000202), + CONST64(0x0000000000020000), CONST64(0x0000000200020000), CONST64(0x0000000000020002), CONST64(0x0000000200020002), + CONST64(0x0000020000020000), CONST64(0x0000020200020000), CONST64(0x0000020000020002), CONST64(0x0000020200020002), + CONST64(0x0000000000020200), CONST64(0x0000000200020200), CONST64(0x0000000000020202), CONST64(0x0000000200020202), + CONST64(0x0000020000020200), CONST64(0x0000020200020200), CONST64(0x0000020000020202), CONST64(0x0000020200020202), + CONST64(0x0002000000020000), CONST64(0x0002000200020000), CONST64(0x0002000000020002), CONST64(0x0002000200020002), + CONST64(0x0002020000020000), CONST64(0x0002020200020000), CONST64(0x0002020000020002), CONST64(0x0002020200020002), + CONST64(0x0002000000020200), CONST64(0x0002000200020200), CONST64(0x0002000000020202), CONST64(0x0002000200020202), + CONST64(0x0002020000020200), CONST64(0x0002020200020200), CONST64(0x0002020000020202), CONST64(0x0002020200020202), + CONST64(0x0200000000000000), CONST64(0x0200000200000000), CONST64(0x0200000000000002), CONST64(0x0200000200000002), + CONST64(0x0200020000000000), CONST64(0x0200020200000000), CONST64(0x0200020000000002), CONST64(0x0200020200000002), + CONST64(0x0200000000000200), CONST64(0x0200000200000200), CONST64(0x0200000000000202), CONST64(0x0200000200000202), + CONST64(0x0200020000000200), CONST64(0x0200020200000200), CONST64(0x0200020000000202), CONST64(0x0200020200000202), + CONST64(0x0202000000000000), CONST64(0x0202000200000000), CONST64(0x0202000000000002), CONST64(0x0202000200000002), + CONST64(0x0202020000000000), CONST64(0x0202020200000000), CONST64(0x0202020000000002), CONST64(0x0202020200000002), + CONST64(0x0202000000000200), CONST64(0x0202000200000200), CONST64(0x0202000000000202), CONST64(0x0202000200000202), + CONST64(0x0202020000000200), CONST64(0x0202020200000200), CONST64(0x0202020000000202), CONST64(0x0202020200000202), + CONST64(0x0200000000020000), CONST64(0x0200000200020000), CONST64(0x0200000000020002), CONST64(0x0200000200020002), + CONST64(0x0200020000020000), CONST64(0x0200020200020000), CONST64(0x0200020000020002), CONST64(0x0200020200020002), + CONST64(0x0200000000020200), CONST64(0x0200000200020200), CONST64(0x0200000000020202), CONST64(0x0200000200020202), + CONST64(0x0200020000020200), CONST64(0x0200020200020200), CONST64(0x0200020000020202), CONST64(0x0200020200020202), + CONST64(0x0202000000020000), CONST64(0x0202000200020000), CONST64(0x0202000000020002), CONST64(0x0202000200020002), + CONST64(0x0202020000020000), CONST64(0x0202020200020000), CONST64(0x0202020000020002), CONST64(0x0202020200020002), + CONST64(0x0202000000020200), CONST64(0x0202000200020200), CONST64(0x0202000000020202), CONST64(0x0202000200020202), + CONST64(0x0202020000020200), CONST64(0x0202020200020200), CONST64(0x0202020000020202), CONST64(0x0202020200020202), + CONST64(0x0000000002000000), CONST64(0x0000000202000000), CONST64(0x0000000002000002), CONST64(0x0000000202000002), + CONST64(0x0000020002000000), CONST64(0x0000020202000000), CONST64(0x0000020002000002), CONST64(0x0000020202000002), + CONST64(0x0000000002000200), CONST64(0x0000000202000200), CONST64(0x0000000002000202), CONST64(0x0000000202000202), + CONST64(0x0000020002000200), CONST64(0x0000020202000200), CONST64(0x0000020002000202), CONST64(0x0000020202000202), + CONST64(0x0002000002000000), CONST64(0x0002000202000000), CONST64(0x0002000002000002), CONST64(0x0002000202000002), + CONST64(0x0002020002000000), CONST64(0x0002020202000000), CONST64(0x0002020002000002), CONST64(0x0002020202000002), + CONST64(0x0002000002000200), CONST64(0x0002000202000200), CONST64(0x0002000002000202), CONST64(0x0002000202000202), + CONST64(0x0002020002000200), CONST64(0x0002020202000200), CONST64(0x0002020002000202), CONST64(0x0002020202000202), + CONST64(0x0000000002020000), CONST64(0x0000000202020000), CONST64(0x0000000002020002), CONST64(0x0000000202020002), + CONST64(0x0000020002020000), CONST64(0x0000020202020000), CONST64(0x0000020002020002), CONST64(0x0000020202020002), + CONST64(0x0000000002020200), CONST64(0x0000000202020200), CONST64(0x0000000002020202), CONST64(0x0000000202020202), + CONST64(0x0000020002020200), CONST64(0x0000020202020200), CONST64(0x0000020002020202), CONST64(0x0000020202020202), + CONST64(0x0002000002020000), CONST64(0x0002000202020000), CONST64(0x0002000002020002), CONST64(0x0002000202020002), + CONST64(0x0002020002020000), CONST64(0x0002020202020000), CONST64(0x0002020002020002), CONST64(0x0002020202020002), + CONST64(0x0002000002020200), CONST64(0x0002000202020200), CONST64(0x0002000002020202), CONST64(0x0002000202020202), + CONST64(0x0002020002020200), CONST64(0x0002020202020200), CONST64(0x0002020002020202), CONST64(0x0002020202020202), + CONST64(0x0200000002000000), CONST64(0x0200000202000000), CONST64(0x0200000002000002), CONST64(0x0200000202000002), + CONST64(0x0200020002000000), CONST64(0x0200020202000000), CONST64(0x0200020002000002), CONST64(0x0200020202000002), + CONST64(0x0200000002000200), CONST64(0x0200000202000200), CONST64(0x0200000002000202), CONST64(0x0200000202000202), + CONST64(0x0200020002000200), CONST64(0x0200020202000200), CONST64(0x0200020002000202), CONST64(0x0200020202000202), + CONST64(0x0202000002000000), CONST64(0x0202000202000000), CONST64(0x0202000002000002), CONST64(0x0202000202000002), + CONST64(0x0202020002000000), CONST64(0x0202020202000000), CONST64(0x0202020002000002), CONST64(0x0202020202000002), + CONST64(0x0202000002000200), CONST64(0x0202000202000200), CONST64(0x0202000002000202), CONST64(0x0202000202000202), + CONST64(0x0202020002000200), CONST64(0x0202020202000200), CONST64(0x0202020002000202), CONST64(0x0202020202000202), + CONST64(0x0200000002020000), CONST64(0x0200000202020000), CONST64(0x0200000002020002), CONST64(0x0200000202020002), + CONST64(0x0200020002020000), CONST64(0x0200020202020000), CONST64(0x0200020002020002), CONST64(0x0200020202020002), + CONST64(0x0200000002020200), CONST64(0x0200000202020200), CONST64(0x0200000002020202), CONST64(0x0200000202020202), + CONST64(0x0200020002020200), CONST64(0x0200020202020200), CONST64(0x0200020002020202), CONST64(0x0200020202020202), + CONST64(0x0202000002020000), CONST64(0x0202000202020000), CONST64(0x0202000002020002), CONST64(0x0202000202020002), + CONST64(0x0202020002020000), CONST64(0x0202020202020000), CONST64(0x0202020002020002), CONST64(0x0202020202020002), + CONST64(0x0202000002020200), CONST64(0x0202000202020200), CONST64(0x0202000002020202), CONST64(0x0202000202020202), + CONST64(0x0202020002020200), CONST64(0x0202020202020200), CONST64(0x0202020002020202), CONST64(0x0202020202020202) + }, +{ CONST64(0x0000000000000000), CONST64(0x0000010000000000), CONST64(0x0000000000000100), CONST64(0x0000010000000100), + CONST64(0x0001000000000000), CONST64(0x0001010000000000), CONST64(0x0001000000000100), CONST64(0x0001010000000100), + CONST64(0x0000000000010000), CONST64(0x0000010000010000), CONST64(0x0000000000010100), CONST64(0x0000010000010100), + CONST64(0x0001000000010000), CONST64(0x0001010000010000), CONST64(0x0001000000010100), CONST64(0x0001010000010100), + CONST64(0x0100000000000000), CONST64(0x0100010000000000), CONST64(0x0100000000000100), CONST64(0x0100010000000100), + CONST64(0x0101000000000000), CONST64(0x0101010000000000), CONST64(0x0101000000000100), CONST64(0x0101010000000100), + CONST64(0x0100000000010000), CONST64(0x0100010000010000), CONST64(0x0100000000010100), CONST64(0x0100010000010100), + CONST64(0x0101000000010000), CONST64(0x0101010000010000), CONST64(0x0101000000010100), CONST64(0x0101010000010100), + CONST64(0x0000000001000000), CONST64(0x0000010001000000), CONST64(0x0000000001000100), CONST64(0x0000010001000100), + CONST64(0x0001000001000000), CONST64(0x0001010001000000), CONST64(0x0001000001000100), CONST64(0x0001010001000100), + CONST64(0x0000000001010000), CONST64(0x0000010001010000), CONST64(0x0000000001010100), CONST64(0x0000010001010100), + CONST64(0x0001000001010000), CONST64(0x0001010001010000), CONST64(0x0001000001010100), CONST64(0x0001010001010100), + CONST64(0x0100000001000000), CONST64(0x0100010001000000), CONST64(0x0100000001000100), CONST64(0x0100010001000100), + CONST64(0x0101000001000000), CONST64(0x0101010001000000), CONST64(0x0101000001000100), CONST64(0x0101010001000100), + CONST64(0x0100000001010000), CONST64(0x0100010001010000), CONST64(0x0100000001010100), CONST64(0x0100010001010100), + CONST64(0x0101000001010000), CONST64(0x0101010001010000), CONST64(0x0101000001010100), CONST64(0x0101010001010100), + CONST64(0x0000000100000000), CONST64(0x0000010100000000), CONST64(0x0000000100000100), CONST64(0x0000010100000100), + CONST64(0x0001000100000000), CONST64(0x0001010100000000), CONST64(0x0001000100000100), CONST64(0x0001010100000100), + CONST64(0x0000000100010000), CONST64(0x0000010100010000), CONST64(0x0000000100010100), CONST64(0x0000010100010100), + CONST64(0x0001000100010000), CONST64(0x0001010100010000), CONST64(0x0001000100010100), CONST64(0x0001010100010100), + CONST64(0x0100000100000000), CONST64(0x0100010100000000), CONST64(0x0100000100000100), CONST64(0x0100010100000100), + CONST64(0x0101000100000000), CONST64(0x0101010100000000), CONST64(0x0101000100000100), CONST64(0x0101010100000100), + CONST64(0x0100000100010000), CONST64(0x0100010100010000), CONST64(0x0100000100010100), CONST64(0x0100010100010100), + CONST64(0x0101000100010000), CONST64(0x0101010100010000), CONST64(0x0101000100010100), CONST64(0x0101010100010100), + CONST64(0x0000000101000000), CONST64(0x0000010101000000), CONST64(0x0000000101000100), CONST64(0x0000010101000100), + CONST64(0x0001000101000000), CONST64(0x0001010101000000), CONST64(0x0001000101000100), CONST64(0x0001010101000100), + CONST64(0x0000000101010000), CONST64(0x0000010101010000), CONST64(0x0000000101010100), CONST64(0x0000010101010100), + CONST64(0x0001000101010000), CONST64(0x0001010101010000), CONST64(0x0001000101010100), CONST64(0x0001010101010100), + CONST64(0x0100000101000000), CONST64(0x0100010101000000), CONST64(0x0100000101000100), CONST64(0x0100010101000100), + CONST64(0x0101000101000000), CONST64(0x0101010101000000), CONST64(0x0101000101000100), CONST64(0x0101010101000100), + CONST64(0x0100000101010000), CONST64(0x0100010101010000), CONST64(0x0100000101010100), CONST64(0x0100010101010100), + CONST64(0x0101000101010000), CONST64(0x0101010101010000), CONST64(0x0101000101010100), CONST64(0x0101010101010100), + CONST64(0x0000000000000001), CONST64(0x0000010000000001), CONST64(0x0000000000000101), CONST64(0x0000010000000101), + CONST64(0x0001000000000001), CONST64(0x0001010000000001), CONST64(0x0001000000000101), CONST64(0x0001010000000101), + CONST64(0x0000000000010001), CONST64(0x0000010000010001), CONST64(0x0000000000010101), CONST64(0x0000010000010101), + CONST64(0x0001000000010001), CONST64(0x0001010000010001), CONST64(0x0001000000010101), CONST64(0x0001010000010101), + CONST64(0x0100000000000001), CONST64(0x0100010000000001), CONST64(0x0100000000000101), CONST64(0x0100010000000101), + CONST64(0x0101000000000001), CONST64(0x0101010000000001), CONST64(0x0101000000000101), CONST64(0x0101010000000101), + CONST64(0x0100000000010001), CONST64(0x0100010000010001), CONST64(0x0100000000010101), CONST64(0x0100010000010101), + CONST64(0x0101000000010001), CONST64(0x0101010000010001), CONST64(0x0101000000010101), CONST64(0x0101010000010101), + CONST64(0x0000000001000001), CONST64(0x0000010001000001), CONST64(0x0000000001000101), CONST64(0x0000010001000101), + CONST64(0x0001000001000001), CONST64(0x0001010001000001), CONST64(0x0001000001000101), CONST64(0x0001010001000101), + CONST64(0x0000000001010001), CONST64(0x0000010001010001), CONST64(0x0000000001010101), CONST64(0x0000010001010101), + CONST64(0x0001000001010001), CONST64(0x0001010001010001), CONST64(0x0001000001010101), CONST64(0x0001010001010101), + CONST64(0x0100000001000001), CONST64(0x0100010001000001), CONST64(0x0100000001000101), CONST64(0x0100010001000101), + CONST64(0x0101000001000001), CONST64(0x0101010001000001), CONST64(0x0101000001000101), CONST64(0x0101010001000101), + CONST64(0x0100000001010001), CONST64(0x0100010001010001), CONST64(0x0100000001010101), CONST64(0x0100010001010101), + CONST64(0x0101000001010001), CONST64(0x0101010001010001), CONST64(0x0101000001010101), CONST64(0x0101010001010101), + CONST64(0x0000000100000001), CONST64(0x0000010100000001), CONST64(0x0000000100000101), CONST64(0x0000010100000101), + CONST64(0x0001000100000001), CONST64(0x0001010100000001), CONST64(0x0001000100000101), CONST64(0x0001010100000101), + CONST64(0x0000000100010001), CONST64(0x0000010100010001), CONST64(0x0000000100010101), CONST64(0x0000010100010101), + CONST64(0x0001000100010001), CONST64(0x0001010100010001), CONST64(0x0001000100010101), CONST64(0x0001010100010101), + CONST64(0x0100000100000001), CONST64(0x0100010100000001), CONST64(0x0100000100000101), CONST64(0x0100010100000101), + CONST64(0x0101000100000001), CONST64(0x0101010100000001), CONST64(0x0101000100000101), CONST64(0x0101010100000101), + CONST64(0x0100000100010001), CONST64(0x0100010100010001), CONST64(0x0100000100010101), CONST64(0x0100010100010101), + CONST64(0x0101000100010001), CONST64(0x0101010100010001), CONST64(0x0101000100010101), CONST64(0x0101010100010101), + CONST64(0x0000000101000001), CONST64(0x0000010101000001), CONST64(0x0000000101000101), CONST64(0x0000010101000101), + CONST64(0x0001000101000001), CONST64(0x0001010101000001), CONST64(0x0001000101000101), CONST64(0x0001010101000101), + CONST64(0x0000000101010001), CONST64(0x0000010101010001), CONST64(0x0000000101010101), CONST64(0x0000010101010101), + CONST64(0x0001000101010001), CONST64(0x0001010101010001), CONST64(0x0001000101010101), CONST64(0x0001010101010101), + CONST64(0x0100000101000001), CONST64(0x0100010101000001), CONST64(0x0100000101000101), CONST64(0x0100010101000101), + CONST64(0x0101000101000001), CONST64(0x0101010101000001), CONST64(0x0101000101000101), CONST64(0x0101010101000101), + CONST64(0x0100000101010001), CONST64(0x0100010101010001), CONST64(0x0100000101010101), CONST64(0x0100010101010101), + CONST64(0x0101000101010001), CONST64(0x0101010101010001), CONST64(0x0101000101010101), CONST64(0x0101010101010101) + }, +{ CONST64(0x0000000000000000), CONST64(0x0000008000000000), CONST64(0x0000000000000080), CONST64(0x0000008000000080), + CONST64(0x0000800000000000), CONST64(0x0000808000000000), CONST64(0x0000800000000080), CONST64(0x0000808000000080), + CONST64(0x0000000000008000), CONST64(0x0000008000008000), CONST64(0x0000000000008080), CONST64(0x0000008000008080), + CONST64(0x0000800000008000), CONST64(0x0000808000008000), CONST64(0x0000800000008080), CONST64(0x0000808000008080), + CONST64(0x0080000000000000), CONST64(0x0080008000000000), CONST64(0x0080000000000080), CONST64(0x0080008000000080), + CONST64(0x0080800000000000), CONST64(0x0080808000000000), CONST64(0x0080800000000080), CONST64(0x0080808000000080), + CONST64(0x0080000000008000), CONST64(0x0080008000008000), CONST64(0x0080000000008080), CONST64(0x0080008000008080), + CONST64(0x0080800000008000), CONST64(0x0080808000008000), CONST64(0x0080800000008080), CONST64(0x0080808000008080), + CONST64(0x0000000000800000), CONST64(0x0000008000800000), CONST64(0x0000000000800080), CONST64(0x0000008000800080), + CONST64(0x0000800000800000), CONST64(0x0000808000800000), CONST64(0x0000800000800080), CONST64(0x0000808000800080), + CONST64(0x0000000000808000), CONST64(0x0000008000808000), CONST64(0x0000000000808080), CONST64(0x0000008000808080), + CONST64(0x0000800000808000), CONST64(0x0000808000808000), CONST64(0x0000800000808080), CONST64(0x0000808000808080), + CONST64(0x0080000000800000), CONST64(0x0080008000800000), CONST64(0x0080000000800080), CONST64(0x0080008000800080), + CONST64(0x0080800000800000), CONST64(0x0080808000800000), CONST64(0x0080800000800080), CONST64(0x0080808000800080), + CONST64(0x0080000000808000), CONST64(0x0080008000808000), CONST64(0x0080000000808080), CONST64(0x0080008000808080), + CONST64(0x0080800000808000), CONST64(0x0080808000808000), CONST64(0x0080800000808080), CONST64(0x0080808000808080), + CONST64(0x8000000000000000), CONST64(0x8000008000000000), CONST64(0x8000000000000080), CONST64(0x8000008000000080), + CONST64(0x8000800000000000), CONST64(0x8000808000000000), CONST64(0x8000800000000080), CONST64(0x8000808000000080), + CONST64(0x8000000000008000), CONST64(0x8000008000008000), CONST64(0x8000000000008080), CONST64(0x8000008000008080), + CONST64(0x8000800000008000), CONST64(0x8000808000008000), CONST64(0x8000800000008080), CONST64(0x8000808000008080), + CONST64(0x8080000000000000), CONST64(0x8080008000000000), CONST64(0x8080000000000080), CONST64(0x8080008000000080), + CONST64(0x8080800000000000), CONST64(0x8080808000000000), CONST64(0x8080800000000080), CONST64(0x8080808000000080), + CONST64(0x8080000000008000), CONST64(0x8080008000008000), CONST64(0x8080000000008080), CONST64(0x8080008000008080), + CONST64(0x8080800000008000), CONST64(0x8080808000008000), CONST64(0x8080800000008080), CONST64(0x8080808000008080), + CONST64(0x8000000000800000), CONST64(0x8000008000800000), CONST64(0x8000000000800080), CONST64(0x8000008000800080), + CONST64(0x8000800000800000), CONST64(0x8000808000800000), CONST64(0x8000800000800080), CONST64(0x8000808000800080), + CONST64(0x8000000000808000), CONST64(0x8000008000808000), CONST64(0x8000000000808080), CONST64(0x8000008000808080), + CONST64(0x8000800000808000), CONST64(0x8000808000808000), CONST64(0x8000800000808080), CONST64(0x8000808000808080), + CONST64(0x8080000000800000), CONST64(0x8080008000800000), CONST64(0x8080000000800080), CONST64(0x8080008000800080), + CONST64(0x8080800000800000), CONST64(0x8080808000800000), CONST64(0x8080800000800080), CONST64(0x8080808000800080), + CONST64(0x8080000000808000), CONST64(0x8080008000808000), CONST64(0x8080000000808080), CONST64(0x8080008000808080), + CONST64(0x8080800000808000), CONST64(0x8080808000808000), CONST64(0x8080800000808080), CONST64(0x8080808000808080), + CONST64(0x0000000080000000), CONST64(0x0000008080000000), CONST64(0x0000000080000080), CONST64(0x0000008080000080), + CONST64(0x0000800080000000), CONST64(0x0000808080000000), CONST64(0x0000800080000080), CONST64(0x0000808080000080), + CONST64(0x0000000080008000), CONST64(0x0000008080008000), CONST64(0x0000000080008080), CONST64(0x0000008080008080), + CONST64(0x0000800080008000), CONST64(0x0000808080008000), CONST64(0x0000800080008080), CONST64(0x0000808080008080), + CONST64(0x0080000080000000), CONST64(0x0080008080000000), CONST64(0x0080000080000080), CONST64(0x0080008080000080), + CONST64(0x0080800080000000), CONST64(0x0080808080000000), CONST64(0x0080800080000080), CONST64(0x0080808080000080), + CONST64(0x0080000080008000), CONST64(0x0080008080008000), CONST64(0x0080000080008080), CONST64(0x0080008080008080), + CONST64(0x0080800080008000), CONST64(0x0080808080008000), CONST64(0x0080800080008080), CONST64(0x0080808080008080), + CONST64(0x0000000080800000), CONST64(0x0000008080800000), CONST64(0x0000000080800080), CONST64(0x0000008080800080), + CONST64(0x0000800080800000), CONST64(0x0000808080800000), CONST64(0x0000800080800080), CONST64(0x0000808080800080), + CONST64(0x0000000080808000), CONST64(0x0000008080808000), CONST64(0x0000000080808080), CONST64(0x0000008080808080), + CONST64(0x0000800080808000), CONST64(0x0000808080808000), CONST64(0x0000800080808080), CONST64(0x0000808080808080), + CONST64(0x0080000080800000), CONST64(0x0080008080800000), CONST64(0x0080000080800080), CONST64(0x0080008080800080), + CONST64(0x0080800080800000), CONST64(0x0080808080800000), CONST64(0x0080800080800080), CONST64(0x0080808080800080), + CONST64(0x0080000080808000), CONST64(0x0080008080808000), CONST64(0x0080000080808080), CONST64(0x0080008080808080), + CONST64(0x0080800080808000), CONST64(0x0080808080808000), CONST64(0x0080800080808080), CONST64(0x0080808080808080), + CONST64(0x8000000080000000), CONST64(0x8000008080000000), CONST64(0x8000000080000080), CONST64(0x8000008080000080), + CONST64(0x8000800080000000), CONST64(0x8000808080000000), CONST64(0x8000800080000080), CONST64(0x8000808080000080), + CONST64(0x8000000080008000), CONST64(0x8000008080008000), CONST64(0x8000000080008080), CONST64(0x8000008080008080), + CONST64(0x8000800080008000), CONST64(0x8000808080008000), CONST64(0x8000800080008080), CONST64(0x8000808080008080), + CONST64(0x8080000080000000), CONST64(0x8080008080000000), CONST64(0x8080000080000080), CONST64(0x8080008080000080), + CONST64(0x8080800080000000), CONST64(0x8080808080000000), CONST64(0x8080800080000080), CONST64(0x8080808080000080), + CONST64(0x8080000080008000), CONST64(0x8080008080008000), CONST64(0x8080000080008080), CONST64(0x8080008080008080), + CONST64(0x8080800080008000), CONST64(0x8080808080008000), CONST64(0x8080800080008080), CONST64(0x8080808080008080), + CONST64(0x8000000080800000), CONST64(0x8000008080800000), CONST64(0x8000000080800080), CONST64(0x8000008080800080), + CONST64(0x8000800080800000), CONST64(0x8000808080800000), CONST64(0x8000800080800080), CONST64(0x8000808080800080), + CONST64(0x8000000080808000), CONST64(0x8000008080808000), CONST64(0x8000000080808080), CONST64(0x8000008080808080), + CONST64(0x8000800080808000), CONST64(0x8000808080808000), CONST64(0x8000800080808080), CONST64(0x8000808080808080), + CONST64(0x8080000080800000), CONST64(0x8080008080800000), CONST64(0x8080000080800080), CONST64(0x8080008080800080), + CONST64(0x8080800080800000), CONST64(0x8080808080800000), CONST64(0x8080800080800080), CONST64(0x8080808080800080), + CONST64(0x8080000080808000), CONST64(0x8080008080808000), CONST64(0x8080000080808080), CONST64(0x8080008080808080), + CONST64(0x8080800080808000), CONST64(0x8080808080808000), CONST64(0x8080800080808080), CONST64(0x8080808080808080) + }, +{ CONST64(0x0000000000000000), CONST64(0x0000004000000000), CONST64(0x0000000000000040), CONST64(0x0000004000000040), + CONST64(0x0000400000000000), CONST64(0x0000404000000000), CONST64(0x0000400000000040), CONST64(0x0000404000000040), + CONST64(0x0000000000004000), CONST64(0x0000004000004000), CONST64(0x0000000000004040), CONST64(0x0000004000004040), + CONST64(0x0000400000004000), CONST64(0x0000404000004000), CONST64(0x0000400000004040), CONST64(0x0000404000004040), + CONST64(0x0040000000000000), CONST64(0x0040004000000000), CONST64(0x0040000000000040), CONST64(0x0040004000000040), + CONST64(0x0040400000000000), CONST64(0x0040404000000000), CONST64(0x0040400000000040), CONST64(0x0040404000000040), + CONST64(0x0040000000004000), CONST64(0x0040004000004000), CONST64(0x0040000000004040), CONST64(0x0040004000004040), + CONST64(0x0040400000004000), CONST64(0x0040404000004000), CONST64(0x0040400000004040), CONST64(0x0040404000004040), + CONST64(0x0000000000400000), CONST64(0x0000004000400000), CONST64(0x0000000000400040), CONST64(0x0000004000400040), + CONST64(0x0000400000400000), CONST64(0x0000404000400000), CONST64(0x0000400000400040), CONST64(0x0000404000400040), + CONST64(0x0000000000404000), CONST64(0x0000004000404000), CONST64(0x0000000000404040), CONST64(0x0000004000404040), + CONST64(0x0000400000404000), CONST64(0x0000404000404000), CONST64(0x0000400000404040), CONST64(0x0000404000404040), + CONST64(0x0040000000400000), CONST64(0x0040004000400000), CONST64(0x0040000000400040), CONST64(0x0040004000400040), + CONST64(0x0040400000400000), CONST64(0x0040404000400000), CONST64(0x0040400000400040), CONST64(0x0040404000400040), + CONST64(0x0040000000404000), CONST64(0x0040004000404000), CONST64(0x0040000000404040), CONST64(0x0040004000404040), + CONST64(0x0040400000404000), CONST64(0x0040404000404000), CONST64(0x0040400000404040), CONST64(0x0040404000404040), + CONST64(0x4000000000000000), CONST64(0x4000004000000000), CONST64(0x4000000000000040), CONST64(0x4000004000000040), + CONST64(0x4000400000000000), CONST64(0x4000404000000000), CONST64(0x4000400000000040), CONST64(0x4000404000000040), + CONST64(0x4000000000004000), CONST64(0x4000004000004000), CONST64(0x4000000000004040), CONST64(0x4000004000004040), + CONST64(0x4000400000004000), CONST64(0x4000404000004000), CONST64(0x4000400000004040), CONST64(0x4000404000004040), + CONST64(0x4040000000000000), CONST64(0x4040004000000000), CONST64(0x4040000000000040), CONST64(0x4040004000000040), + CONST64(0x4040400000000000), CONST64(0x4040404000000000), CONST64(0x4040400000000040), CONST64(0x4040404000000040), + CONST64(0x4040000000004000), CONST64(0x4040004000004000), CONST64(0x4040000000004040), CONST64(0x4040004000004040), + CONST64(0x4040400000004000), CONST64(0x4040404000004000), CONST64(0x4040400000004040), CONST64(0x4040404000004040), + CONST64(0x4000000000400000), CONST64(0x4000004000400000), CONST64(0x4000000000400040), CONST64(0x4000004000400040), + CONST64(0x4000400000400000), CONST64(0x4000404000400000), CONST64(0x4000400000400040), CONST64(0x4000404000400040), + CONST64(0x4000000000404000), CONST64(0x4000004000404000), CONST64(0x4000000000404040), CONST64(0x4000004000404040), + CONST64(0x4000400000404000), CONST64(0x4000404000404000), CONST64(0x4000400000404040), CONST64(0x4000404000404040), + CONST64(0x4040000000400000), CONST64(0x4040004000400000), CONST64(0x4040000000400040), CONST64(0x4040004000400040), + CONST64(0x4040400000400000), CONST64(0x4040404000400000), CONST64(0x4040400000400040), CONST64(0x4040404000400040), + CONST64(0x4040000000404000), CONST64(0x4040004000404000), CONST64(0x4040000000404040), CONST64(0x4040004000404040), + CONST64(0x4040400000404000), CONST64(0x4040404000404000), CONST64(0x4040400000404040), CONST64(0x4040404000404040), + CONST64(0x0000000040000000), CONST64(0x0000004040000000), CONST64(0x0000000040000040), CONST64(0x0000004040000040), + CONST64(0x0000400040000000), CONST64(0x0000404040000000), CONST64(0x0000400040000040), CONST64(0x0000404040000040), + CONST64(0x0000000040004000), CONST64(0x0000004040004000), CONST64(0x0000000040004040), CONST64(0x0000004040004040), + CONST64(0x0000400040004000), CONST64(0x0000404040004000), CONST64(0x0000400040004040), CONST64(0x0000404040004040), + CONST64(0x0040000040000000), CONST64(0x0040004040000000), CONST64(0x0040000040000040), CONST64(0x0040004040000040), + CONST64(0x0040400040000000), CONST64(0x0040404040000000), CONST64(0x0040400040000040), CONST64(0x0040404040000040), + CONST64(0x0040000040004000), CONST64(0x0040004040004000), CONST64(0x0040000040004040), CONST64(0x0040004040004040), + CONST64(0x0040400040004000), CONST64(0x0040404040004000), CONST64(0x0040400040004040), CONST64(0x0040404040004040), + CONST64(0x0000000040400000), CONST64(0x0000004040400000), CONST64(0x0000000040400040), CONST64(0x0000004040400040), + CONST64(0x0000400040400000), CONST64(0x0000404040400000), CONST64(0x0000400040400040), CONST64(0x0000404040400040), + CONST64(0x0000000040404000), CONST64(0x0000004040404000), CONST64(0x0000000040404040), CONST64(0x0000004040404040), + CONST64(0x0000400040404000), CONST64(0x0000404040404000), CONST64(0x0000400040404040), CONST64(0x0000404040404040), + CONST64(0x0040000040400000), CONST64(0x0040004040400000), CONST64(0x0040000040400040), CONST64(0x0040004040400040), + CONST64(0x0040400040400000), CONST64(0x0040404040400000), CONST64(0x0040400040400040), CONST64(0x0040404040400040), + CONST64(0x0040000040404000), CONST64(0x0040004040404000), CONST64(0x0040000040404040), CONST64(0x0040004040404040), + CONST64(0x0040400040404000), CONST64(0x0040404040404000), CONST64(0x0040400040404040), CONST64(0x0040404040404040), + CONST64(0x4000000040000000), CONST64(0x4000004040000000), CONST64(0x4000000040000040), CONST64(0x4000004040000040), + CONST64(0x4000400040000000), CONST64(0x4000404040000000), CONST64(0x4000400040000040), CONST64(0x4000404040000040), + CONST64(0x4000000040004000), CONST64(0x4000004040004000), CONST64(0x4000000040004040), CONST64(0x4000004040004040), + CONST64(0x4000400040004000), CONST64(0x4000404040004000), CONST64(0x4000400040004040), CONST64(0x4000404040004040), + CONST64(0x4040000040000000), CONST64(0x4040004040000000), CONST64(0x4040000040000040), CONST64(0x4040004040000040), + CONST64(0x4040400040000000), CONST64(0x4040404040000000), CONST64(0x4040400040000040), CONST64(0x4040404040000040), + CONST64(0x4040000040004000), CONST64(0x4040004040004000), CONST64(0x4040000040004040), CONST64(0x4040004040004040), + CONST64(0x4040400040004000), CONST64(0x4040404040004000), CONST64(0x4040400040004040), CONST64(0x4040404040004040), + CONST64(0x4000000040400000), CONST64(0x4000004040400000), CONST64(0x4000000040400040), CONST64(0x4000004040400040), + CONST64(0x4000400040400000), CONST64(0x4000404040400000), CONST64(0x4000400040400040), CONST64(0x4000404040400040), + CONST64(0x4000000040404000), CONST64(0x4000004040404000), CONST64(0x4000000040404040), CONST64(0x4000004040404040), + CONST64(0x4000400040404000), CONST64(0x4000404040404000), CONST64(0x4000400040404040), CONST64(0x4000404040404040), + CONST64(0x4040000040400000), CONST64(0x4040004040400000), CONST64(0x4040000040400040), CONST64(0x4040004040400040), + CONST64(0x4040400040400000), CONST64(0x4040404040400000), CONST64(0x4040400040400040), CONST64(0x4040404040400040), + CONST64(0x4040000040404000), CONST64(0x4040004040404000), CONST64(0x4040000040404040), CONST64(0x4040004040404040), + CONST64(0x4040400040404000), CONST64(0x4040404040404000), CONST64(0x4040400040404040), CONST64(0x4040404040404040) + }, +{ CONST64(0x0000000000000000), CONST64(0x0000002000000000), CONST64(0x0000000000000020), CONST64(0x0000002000000020), + CONST64(0x0000200000000000), CONST64(0x0000202000000000), CONST64(0x0000200000000020), CONST64(0x0000202000000020), + CONST64(0x0000000000002000), CONST64(0x0000002000002000), CONST64(0x0000000000002020), CONST64(0x0000002000002020), + CONST64(0x0000200000002000), CONST64(0x0000202000002000), CONST64(0x0000200000002020), CONST64(0x0000202000002020), + CONST64(0x0020000000000000), CONST64(0x0020002000000000), CONST64(0x0020000000000020), CONST64(0x0020002000000020), + CONST64(0x0020200000000000), CONST64(0x0020202000000000), CONST64(0x0020200000000020), CONST64(0x0020202000000020), + CONST64(0x0020000000002000), CONST64(0x0020002000002000), CONST64(0x0020000000002020), CONST64(0x0020002000002020), + CONST64(0x0020200000002000), CONST64(0x0020202000002000), CONST64(0x0020200000002020), CONST64(0x0020202000002020), + CONST64(0x0000000000200000), CONST64(0x0000002000200000), CONST64(0x0000000000200020), CONST64(0x0000002000200020), + CONST64(0x0000200000200000), CONST64(0x0000202000200000), CONST64(0x0000200000200020), CONST64(0x0000202000200020), + CONST64(0x0000000000202000), CONST64(0x0000002000202000), CONST64(0x0000000000202020), CONST64(0x0000002000202020), + CONST64(0x0000200000202000), CONST64(0x0000202000202000), CONST64(0x0000200000202020), CONST64(0x0000202000202020), + CONST64(0x0020000000200000), CONST64(0x0020002000200000), CONST64(0x0020000000200020), CONST64(0x0020002000200020), + CONST64(0x0020200000200000), CONST64(0x0020202000200000), CONST64(0x0020200000200020), CONST64(0x0020202000200020), + CONST64(0x0020000000202000), CONST64(0x0020002000202000), CONST64(0x0020000000202020), CONST64(0x0020002000202020), + CONST64(0x0020200000202000), CONST64(0x0020202000202000), CONST64(0x0020200000202020), CONST64(0x0020202000202020), + CONST64(0x2000000000000000), CONST64(0x2000002000000000), CONST64(0x2000000000000020), CONST64(0x2000002000000020), + CONST64(0x2000200000000000), CONST64(0x2000202000000000), CONST64(0x2000200000000020), CONST64(0x2000202000000020), + CONST64(0x2000000000002000), CONST64(0x2000002000002000), CONST64(0x2000000000002020), CONST64(0x2000002000002020), + CONST64(0x2000200000002000), CONST64(0x2000202000002000), CONST64(0x2000200000002020), CONST64(0x2000202000002020), + CONST64(0x2020000000000000), CONST64(0x2020002000000000), CONST64(0x2020000000000020), CONST64(0x2020002000000020), + CONST64(0x2020200000000000), CONST64(0x2020202000000000), CONST64(0x2020200000000020), CONST64(0x2020202000000020), + CONST64(0x2020000000002000), CONST64(0x2020002000002000), CONST64(0x2020000000002020), CONST64(0x2020002000002020), + CONST64(0x2020200000002000), CONST64(0x2020202000002000), CONST64(0x2020200000002020), CONST64(0x2020202000002020), + CONST64(0x2000000000200000), CONST64(0x2000002000200000), CONST64(0x2000000000200020), CONST64(0x2000002000200020), + CONST64(0x2000200000200000), CONST64(0x2000202000200000), CONST64(0x2000200000200020), CONST64(0x2000202000200020), + CONST64(0x2000000000202000), CONST64(0x2000002000202000), CONST64(0x2000000000202020), CONST64(0x2000002000202020), + CONST64(0x2000200000202000), CONST64(0x2000202000202000), CONST64(0x2000200000202020), CONST64(0x2000202000202020), + CONST64(0x2020000000200000), CONST64(0x2020002000200000), CONST64(0x2020000000200020), CONST64(0x2020002000200020), + CONST64(0x2020200000200000), CONST64(0x2020202000200000), CONST64(0x2020200000200020), CONST64(0x2020202000200020), + CONST64(0x2020000000202000), CONST64(0x2020002000202000), CONST64(0x2020000000202020), CONST64(0x2020002000202020), + CONST64(0x2020200000202000), CONST64(0x2020202000202000), CONST64(0x2020200000202020), CONST64(0x2020202000202020), + CONST64(0x0000000020000000), CONST64(0x0000002020000000), CONST64(0x0000000020000020), CONST64(0x0000002020000020), + CONST64(0x0000200020000000), CONST64(0x0000202020000000), CONST64(0x0000200020000020), CONST64(0x0000202020000020), + CONST64(0x0000000020002000), CONST64(0x0000002020002000), CONST64(0x0000000020002020), CONST64(0x0000002020002020), + CONST64(0x0000200020002000), CONST64(0x0000202020002000), CONST64(0x0000200020002020), CONST64(0x0000202020002020), + CONST64(0x0020000020000000), CONST64(0x0020002020000000), CONST64(0x0020000020000020), CONST64(0x0020002020000020), + CONST64(0x0020200020000000), CONST64(0x0020202020000000), CONST64(0x0020200020000020), CONST64(0x0020202020000020), + CONST64(0x0020000020002000), CONST64(0x0020002020002000), CONST64(0x0020000020002020), CONST64(0x0020002020002020), + CONST64(0x0020200020002000), CONST64(0x0020202020002000), CONST64(0x0020200020002020), CONST64(0x0020202020002020), + CONST64(0x0000000020200000), CONST64(0x0000002020200000), CONST64(0x0000000020200020), CONST64(0x0000002020200020), + CONST64(0x0000200020200000), CONST64(0x0000202020200000), CONST64(0x0000200020200020), CONST64(0x0000202020200020), + CONST64(0x0000000020202000), CONST64(0x0000002020202000), CONST64(0x0000000020202020), CONST64(0x0000002020202020), + CONST64(0x0000200020202000), CONST64(0x0000202020202000), CONST64(0x0000200020202020), CONST64(0x0000202020202020), + CONST64(0x0020000020200000), CONST64(0x0020002020200000), CONST64(0x0020000020200020), CONST64(0x0020002020200020), + CONST64(0x0020200020200000), CONST64(0x0020202020200000), CONST64(0x0020200020200020), CONST64(0x0020202020200020), + CONST64(0x0020000020202000), CONST64(0x0020002020202000), CONST64(0x0020000020202020), CONST64(0x0020002020202020), + CONST64(0x0020200020202000), CONST64(0x0020202020202000), CONST64(0x0020200020202020), CONST64(0x0020202020202020), + CONST64(0x2000000020000000), CONST64(0x2000002020000000), CONST64(0x2000000020000020), CONST64(0x2000002020000020), + CONST64(0x2000200020000000), CONST64(0x2000202020000000), CONST64(0x2000200020000020), CONST64(0x2000202020000020), + CONST64(0x2000000020002000), CONST64(0x2000002020002000), CONST64(0x2000000020002020), CONST64(0x2000002020002020), + CONST64(0x2000200020002000), CONST64(0x2000202020002000), CONST64(0x2000200020002020), CONST64(0x2000202020002020), + CONST64(0x2020000020000000), CONST64(0x2020002020000000), CONST64(0x2020000020000020), CONST64(0x2020002020000020), + CONST64(0x2020200020000000), CONST64(0x2020202020000000), CONST64(0x2020200020000020), CONST64(0x2020202020000020), + CONST64(0x2020000020002000), CONST64(0x2020002020002000), CONST64(0x2020000020002020), CONST64(0x2020002020002020), + CONST64(0x2020200020002000), CONST64(0x2020202020002000), CONST64(0x2020200020002020), CONST64(0x2020202020002020), + CONST64(0x2000000020200000), CONST64(0x2000002020200000), CONST64(0x2000000020200020), CONST64(0x2000002020200020), + CONST64(0x2000200020200000), CONST64(0x2000202020200000), CONST64(0x2000200020200020), CONST64(0x2000202020200020), + CONST64(0x2000000020202000), CONST64(0x2000002020202000), CONST64(0x2000000020202020), CONST64(0x2000002020202020), + CONST64(0x2000200020202000), CONST64(0x2000202020202000), CONST64(0x2000200020202020), CONST64(0x2000202020202020), + CONST64(0x2020000020200000), CONST64(0x2020002020200000), CONST64(0x2020000020200020), CONST64(0x2020002020200020), + CONST64(0x2020200020200000), CONST64(0x2020202020200000), CONST64(0x2020200020200020), CONST64(0x2020202020200020), + CONST64(0x2020000020202000), CONST64(0x2020002020202000), CONST64(0x2020000020202020), CONST64(0x2020002020202020), + CONST64(0x2020200020202000), CONST64(0x2020202020202000), CONST64(0x2020200020202020), CONST64(0x2020202020202020) + }}; + +static const ulong64 des_fp[8][256] = { + +{ CONST64(0x0000000000000000), CONST64(0x0000008000000000), CONST64(0x0000000002000000), CONST64(0x0000008002000000), + CONST64(0x0000000000020000), CONST64(0x0000008000020000), CONST64(0x0000000002020000), CONST64(0x0000008002020000), + CONST64(0x0000000000000200), CONST64(0x0000008000000200), CONST64(0x0000000002000200), CONST64(0x0000008002000200), + CONST64(0x0000000000020200), CONST64(0x0000008000020200), CONST64(0x0000000002020200), CONST64(0x0000008002020200), + CONST64(0x0000000000000002), CONST64(0x0000008000000002), CONST64(0x0000000002000002), CONST64(0x0000008002000002), + CONST64(0x0000000000020002), CONST64(0x0000008000020002), CONST64(0x0000000002020002), CONST64(0x0000008002020002), + CONST64(0x0000000000000202), CONST64(0x0000008000000202), CONST64(0x0000000002000202), CONST64(0x0000008002000202), + CONST64(0x0000000000020202), CONST64(0x0000008000020202), CONST64(0x0000000002020202), CONST64(0x0000008002020202), + CONST64(0x0200000000000000), CONST64(0x0200008000000000), CONST64(0x0200000002000000), CONST64(0x0200008002000000), + CONST64(0x0200000000020000), CONST64(0x0200008000020000), CONST64(0x0200000002020000), CONST64(0x0200008002020000), + CONST64(0x0200000000000200), CONST64(0x0200008000000200), CONST64(0x0200000002000200), CONST64(0x0200008002000200), + CONST64(0x0200000000020200), CONST64(0x0200008000020200), CONST64(0x0200000002020200), CONST64(0x0200008002020200), + CONST64(0x0200000000000002), CONST64(0x0200008000000002), CONST64(0x0200000002000002), CONST64(0x0200008002000002), + CONST64(0x0200000000020002), CONST64(0x0200008000020002), CONST64(0x0200000002020002), CONST64(0x0200008002020002), + CONST64(0x0200000000000202), CONST64(0x0200008000000202), CONST64(0x0200000002000202), CONST64(0x0200008002000202), + CONST64(0x0200000000020202), CONST64(0x0200008000020202), CONST64(0x0200000002020202), CONST64(0x0200008002020202), + CONST64(0x0002000000000000), CONST64(0x0002008000000000), CONST64(0x0002000002000000), CONST64(0x0002008002000000), + CONST64(0x0002000000020000), CONST64(0x0002008000020000), CONST64(0x0002000002020000), CONST64(0x0002008002020000), + CONST64(0x0002000000000200), CONST64(0x0002008000000200), CONST64(0x0002000002000200), CONST64(0x0002008002000200), + CONST64(0x0002000000020200), CONST64(0x0002008000020200), CONST64(0x0002000002020200), CONST64(0x0002008002020200), + CONST64(0x0002000000000002), CONST64(0x0002008000000002), CONST64(0x0002000002000002), CONST64(0x0002008002000002), + CONST64(0x0002000000020002), CONST64(0x0002008000020002), CONST64(0x0002000002020002), CONST64(0x0002008002020002), + CONST64(0x0002000000000202), CONST64(0x0002008000000202), CONST64(0x0002000002000202), CONST64(0x0002008002000202), + CONST64(0x0002000000020202), CONST64(0x0002008000020202), CONST64(0x0002000002020202), CONST64(0x0002008002020202), + CONST64(0x0202000000000000), CONST64(0x0202008000000000), CONST64(0x0202000002000000), CONST64(0x0202008002000000), + CONST64(0x0202000000020000), CONST64(0x0202008000020000), CONST64(0x0202000002020000), CONST64(0x0202008002020000), + CONST64(0x0202000000000200), CONST64(0x0202008000000200), CONST64(0x0202000002000200), CONST64(0x0202008002000200), + CONST64(0x0202000000020200), CONST64(0x0202008000020200), CONST64(0x0202000002020200), CONST64(0x0202008002020200), + CONST64(0x0202000000000002), CONST64(0x0202008000000002), CONST64(0x0202000002000002), CONST64(0x0202008002000002), + CONST64(0x0202000000020002), CONST64(0x0202008000020002), CONST64(0x0202000002020002), CONST64(0x0202008002020002), + CONST64(0x0202000000000202), CONST64(0x0202008000000202), CONST64(0x0202000002000202), CONST64(0x0202008002000202), + CONST64(0x0202000000020202), CONST64(0x0202008000020202), CONST64(0x0202000002020202), CONST64(0x0202008002020202), + CONST64(0x0000020000000000), CONST64(0x0000028000000000), CONST64(0x0000020002000000), CONST64(0x0000028002000000), + CONST64(0x0000020000020000), CONST64(0x0000028000020000), CONST64(0x0000020002020000), CONST64(0x0000028002020000), + CONST64(0x0000020000000200), CONST64(0x0000028000000200), CONST64(0x0000020002000200), CONST64(0x0000028002000200), + CONST64(0x0000020000020200), CONST64(0x0000028000020200), CONST64(0x0000020002020200), CONST64(0x0000028002020200), + CONST64(0x0000020000000002), CONST64(0x0000028000000002), CONST64(0x0000020002000002), CONST64(0x0000028002000002), + CONST64(0x0000020000020002), CONST64(0x0000028000020002), CONST64(0x0000020002020002), CONST64(0x0000028002020002), + CONST64(0x0000020000000202), CONST64(0x0000028000000202), CONST64(0x0000020002000202), CONST64(0x0000028002000202), + CONST64(0x0000020000020202), CONST64(0x0000028000020202), CONST64(0x0000020002020202), CONST64(0x0000028002020202), + CONST64(0x0200020000000000), CONST64(0x0200028000000000), CONST64(0x0200020002000000), CONST64(0x0200028002000000), + CONST64(0x0200020000020000), CONST64(0x0200028000020000), CONST64(0x0200020002020000), CONST64(0x0200028002020000), + CONST64(0x0200020000000200), CONST64(0x0200028000000200), CONST64(0x0200020002000200), CONST64(0x0200028002000200), + CONST64(0x0200020000020200), CONST64(0x0200028000020200), CONST64(0x0200020002020200), CONST64(0x0200028002020200), + CONST64(0x0200020000000002), CONST64(0x0200028000000002), CONST64(0x0200020002000002), CONST64(0x0200028002000002), + CONST64(0x0200020000020002), CONST64(0x0200028000020002), CONST64(0x0200020002020002), CONST64(0x0200028002020002), + CONST64(0x0200020000000202), CONST64(0x0200028000000202), CONST64(0x0200020002000202), CONST64(0x0200028002000202), + CONST64(0x0200020000020202), CONST64(0x0200028000020202), CONST64(0x0200020002020202), CONST64(0x0200028002020202), + CONST64(0x0002020000000000), CONST64(0x0002028000000000), CONST64(0x0002020002000000), CONST64(0x0002028002000000), + CONST64(0x0002020000020000), CONST64(0x0002028000020000), CONST64(0x0002020002020000), CONST64(0x0002028002020000), + CONST64(0x0002020000000200), CONST64(0x0002028000000200), CONST64(0x0002020002000200), CONST64(0x0002028002000200), + CONST64(0x0002020000020200), CONST64(0x0002028000020200), CONST64(0x0002020002020200), CONST64(0x0002028002020200), + CONST64(0x0002020000000002), CONST64(0x0002028000000002), CONST64(0x0002020002000002), CONST64(0x0002028002000002), + CONST64(0x0002020000020002), CONST64(0x0002028000020002), CONST64(0x0002020002020002), CONST64(0x0002028002020002), + CONST64(0x0002020000000202), CONST64(0x0002028000000202), CONST64(0x0002020002000202), CONST64(0x0002028002000202), + CONST64(0x0002020000020202), CONST64(0x0002028000020202), CONST64(0x0002020002020202), CONST64(0x0002028002020202), + CONST64(0x0202020000000000), CONST64(0x0202028000000000), CONST64(0x0202020002000000), CONST64(0x0202028002000000), + CONST64(0x0202020000020000), CONST64(0x0202028000020000), CONST64(0x0202020002020000), CONST64(0x0202028002020000), + CONST64(0x0202020000000200), CONST64(0x0202028000000200), CONST64(0x0202020002000200), CONST64(0x0202028002000200), + CONST64(0x0202020000020200), CONST64(0x0202028000020200), CONST64(0x0202020002020200), CONST64(0x0202028002020200), + CONST64(0x0202020000000002), CONST64(0x0202028000000002), CONST64(0x0202020002000002), CONST64(0x0202028002000002), + CONST64(0x0202020000020002), CONST64(0x0202028000020002), CONST64(0x0202020002020002), CONST64(0x0202028002020002), + CONST64(0x0202020000000202), CONST64(0x0202028000000202), CONST64(0x0202020002000202), CONST64(0x0202028002000202), + CONST64(0x0202020000020202), CONST64(0x0202028000020202), CONST64(0x0202020002020202), CONST64(0x0202028002020202) + }, +{ CONST64(0x0000000000000000), CONST64(0x0000000200000000), CONST64(0x0000000008000000), CONST64(0x0000000208000000), + CONST64(0x0000000000080000), CONST64(0x0000000200080000), CONST64(0x0000000008080000), CONST64(0x0000000208080000), + CONST64(0x0000000000000800), CONST64(0x0000000200000800), CONST64(0x0000000008000800), CONST64(0x0000000208000800), + CONST64(0x0000000000080800), CONST64(0x0000000200080800), CONST64(0x0000000008080800), CONST64(0x0000000208080800), + CONST64(0x0000000000000008), CONST64(0x0000000200000008), CONST64(0x0000000008000008), CONST64(0x0000000208000008), + CONST64(0x0000000000080008), CONST64(0x0000000200080008), CONST64(0x0000000008080008), CONST64(0x0000000208080008), + CONST64(0x0000000000000808), CONST64(0x0000000200000808), CONST64(0x0000000008000808), CONST64(0x0000000208000808), + CONST64(0x0000000000080808), CONST64(0x0000000200080808), CONST64(0x0000000008080808), CONST64(0x0000000208080808), + CONST64(0x0800000000000000), CONST64(0x0800000200000000), CONST64(0x0800000008000000), CONST64(0x0800000208000000), + CONST64(0x0800000000080000), CONST64(0x0800000200080000), CONST64(0x0800000008080000), CONST64(0x0800000208080000), + CONST64(0x0800000000000800), CONST64(0x0800000200000800), CONST64(0x0800000008000800), CONST64(0x0800000208000800), + CONST64(0x0800000000080800), CONST64(0x0800000200080800), CONST64(0x0800000008080800), CONST64(0x0800000208080800), + CONST64(0x0800000000000008), CONST64(0x0800000200000008), CONST64(0x0800000008000008), CONST64(0x0800000208000008), + CONST64(0x0800000000080008), CONST64(0x0800000200080008), CONST64(0x0800000008080008), CONST64(0x0800000208080008), + CONST64(0x0800000000000808), CONST64(0x0800000200000808), CONST64(0x0800000008000808), CONST64(0x0800000208000808), + CONST64(0x0800000000080808), CONST64(0x0800000200080808), CONST64(0x0800000008080808), CONST64(0x0800000208080808), + CONST64(0x0008000000000000), CONST64(0x0008000200000000), CONST64(0x0008000008000000), CONST64(0x0008000208000000), + CONST64(0x0008000000080000), CONST64(0x0008000200080000), CONST64(0x0008000008080000), CONST64(0x0008000208080000), + CONST64(0x0008000000000800), CONST64(0x0008000200000800), CONST64(0x0008000008000800), CONST64(0x0008000208000800), + CONST64(0x0008000000080800), CONST64(0x0008000200080800), CONST64(0x0008000008080800), CONST64(0x0008000208080800), + CONST64(0x0008000000000008), CONST64(0x0008000200000008), CONST64(0x0008000008000008), CONST64(0x0008000208000008), + CONST64(0x0008000000080008), CONST64(0x0008000200080008), CONST64(0x0008000008080008), CONST64(0x0008000208080008), + CONST64(0x0008000000000808), CONST64(0x0008000200000808), CONST64(0x0008000008000808), CONST64(0x0008000208000808), + CONST64(0x0008000000080808), CONST64(0x0008000200080808), CONST64(0x0008000008080808), CONST64(0x0008000208080808), + CONST64(0x0808000000000000), CONST64(0x0808000200000000), CONST64(0x0808000008000000), CONST64(0x0808000208000000), + CONST64(0x0808000000080000), CONST64(0x0808000200080000), CONST64(0x0808000008080000), CONST64(0x0808000208080000), + CONST64(0x0808000000000800), CONST64(0x0808000200000800), CONST64(0x0808000008000800), CONST64(0x0808000208000800), + CONST64(0x0808000000080800), CONST64(0x0808000200080800), CONST64(0x0808000008080800), CONST64(0x0808000208080800), + CONST64(0x0808000000000008), CONST64(0x0808000200000008), CONST64(0x0808000008000008), CONST64(0x0808000208000008), + CONST64(0x0808000000080008), CONST64(0x0808000200080008), CONST64(0x0808000008080008), CONST64(0x0808000208080008), + CONST64(0x0808000000000808), CONST64(0x0808000200000808), CONST64(0x0808000008000808), CONST64(0x0808000208000808), + CONST64(0x0808000000080808), CONST64(0x0808000200080808), CONST64(0x0808000008080808), CONST64(0x0808000208080808), + CONST64(0x0000080000000000), CONST64(0x0000080200000000), CONST64(0x0000080008000000), CONST64(0x0000080208000000), + CONST64(0x0000080000080000), CONST64(0x0000080200080000), CONST64(0x0000080008080000), CONST64(0x0000080208080000), + CONST64(0x0000080000000800), CONST64(0x0000080200000800), CONST64(0x0000080008000800), CONST64(0x0000080208000800), + CONST64(0x0000080000080800), CONST64(0x0000080200080800), CONST64(0x0000080008080800), CONST64(0x0000080208080800), + CONST64(0x0000080000000008), CONST64(0x0000080200000008), CONST64(0x0000080008000008), CONST64(0x0000080208000008), + CONST64(0x0000080000080008), CONST64(0x0000080200080008), CONST64(0x0000080008080008), CONST64(0x0000080208080008), + CONST64(0x0000080000000808), CONST64(0x0000080200000808), CONST64(0x0000080008000808), CONST64(0x0000080208000808), + CONST64(0x0000080000080808), CONST64(0x0000080200080808), CONST64(0x0000080008080808), CONST64(0x0000080208080808), + CONST64(0x0800080000000000), CONST64(0x0800080200000000), CONST64(0x0800080008000000), CONST64(0x0800080208000000), + CONST64(0x0800080000080000), CONST64(0x0800080200080000), CONST64(0x0800080008080000), CONST64(0x0800080208080000), + CONST64(0x0800080000000800), CONST64(0x0800080200000800), CONST64(0x0800080008000800), CONST64(0x0800080208000800), + CONST64(0x0800080000080800), CONST64(0x0800080200080800), CONST64(0x0800080008080800), CONST64(0x0800080208080800), + CONST64(0x0800080000000008), CONST64(0x0800080200000008), CONST64(0x0800080008000008), CONST64(0x0800080208000008), + CONST64(0x0800080000080008), CONST64(0x0800080200080008), CONST64(0x0800080008080008), CONST64(0x0800080208080008), + CONST64(0x0800080000000808), CONST64(0x0800080200000808), CONST64(0x0800080008000808), CONST64(0x0800080208000808), + CONST64(0x0800080000080808), CONST64(0x0800080200080808), CONST64(0x0800080008080808), CONST64(0x0800080208080808), + CONST64(0x0008080000000000), CONST64(0x0008080200000000), CONST64(0x0008080008000000), CONST64(0x0008080208000000), + CONST64(0x0008080000080000), CONST64(0x0008080200080000), CONST64(0x0008080008080000), CONST64(0x0008080208080000), + CONST64(0x0008080000000800), CONST64(0x0008080200000800), CONST64(0x0008080008000800), CONST64(0x0008080208000800), + CONST64(0x0008080000080800), CONST64(0x0008080200080800), CONST64(0x0008080008080800), CONST64(0x0008080208080800), + CONST64(0x0008080000000008), CONST64(0x0008080200000008), CONST64(0x0008080008000008), CONST64(0x0008080208000008), + CONST64(0x0008080000080008), CONST64(0x0008080200080008), CONST64(0x0008080008080008), CONST64(0x0008080208080008), + CONST64(0x0008080000000808), CONST64(0x0008080200000808), CONST64(0x0008080008000808), CONST64(0x0008080208000808), + CONST64(0x0008080000080808), CONST64(0x0008080200080808), CONST64(0x0008080008080808), CONST64(0x0008080208080808), + CONST64(0x0808080000000000), CONST64(0x0808080200000000), CONST64(0x0808080008000000), CONST64(0x0808080208000000), + CONST64(0x0808080000080000), CONST64(0x0808080200080000), CONST64(0x0808080008080000), CONST64(0x0808080208080000), + CONST64(0x0808080000000800), CONST64(0x0808080200000800), CONST64(0x0808080008000800), CONST64(0x0808080208000800), + CONST64(0x0808080000080800), CONST64(0x0808080200080800), CONST64(0x0808080008080800), CONST64(0x0808080208080800), + CONST64(0x0808080000000008), CONST64(0x0808080200000008), CONST64(0x0808080008000008), CONST64(0x0808080208000008), + CONST64(0x0808080000080008), CONST64(0x0808080200080008), CONST64(0x0808080008080008), CONST64(0x0808080208080008), + CONST64(0x0808080000000808), CONST64(0x0808080200000808), CONST64(0x0808080008000808), CONST64(0x0808080208000808), + CONST64(0x0808080000080808), CONST64(0x0808080200080808), CONST64(0x0808080008080808), CONST64(0x0808080208080808) + }, +{ CONST64(0x0000000000000000), CONST64(0x0000000800000000), CONST64(0x0000000020000000), CONST64(0x0000000820000000), + CONST64(0x0000000000200000), CONST64(0x0000000800200000), CONST64(0x0000000020200000), CONST64(0x0000000820200000), + CONST64(0x0000000000002000), CONST64(0x0000000800002000), CONST64(0x0000000020002000), CONST64(0x0000000820002000), + CONST64(0x0000000000202000), CONST64(0x0000000800202000), CONST64(0x0000000020202000), CONST64(0x0000000820202000), + CONST64(0x0000000000000020), CONST64(0x0000000800000020), CONST64(0x0000000020000020), CONST64(0x0000000820000020), + CONST64(0x0000000000200020), CONST64(0x0000000800200020), CONST64(0x0000000020200020), CONST64(0x0000000820200020), + CONST64(0x0000000000002020), CONST64(0x0000000800002020), CONST64(0x0000000020002020), CONST64(0x0000000820002020), + CONST64(0x0000000000202020), CONST64(0x0000000800202020), CONST64(0x0000000020202020), CONST64(0x0000000820202020), + CONST64(0x2000000000000000), CONST64(0x2000000800000000), CONST64(0x2000000020000000), CONST64(0x2000000820000000), + CONST64(0x2000000000200000), CONST64(0x2000000800200000), CONST64(0x2000000020200000), CONST64(0x2000000820200000), + CONST64(0x2000000000002000), CONST64(0x2000000800002000), CONST64(0x2000000020002000), CONST64(0x2000000820002000), + CONST64(0x2000000000202000), CONST64(0x2000000800202000), CONST64(0x2000000020202000), CONST64(0x2000000820202000), + CONST64(0x2000000000000020), CONST64(0x2000000800000020), CONST64(0x2000000020000020), CONST64(0x2000000820000020), + CONST64(0x2000000000200020), CONST64(0x2000000800200020), CONST64(0x2000000020200020), CONST64(0x2000000820200020), + CONST64(0x2000000000002020), CONST64(0x2000000800002020), CONST64(0x2000000020002020), CONST64(0x2000000820002020), + CONST64(0x2000000000202020), CONST64(0x2000000800202020), CONST64(0x2000000020202020), CONST64(0x2000000820202020), + CONST64(0x0020000000000000), CONST64(0x0020000800000000), CONST64(0x0020000020000000), CONST64(0x0020000820000000), + CONST64(0x0020000000200000), CONST64(0x0020000800200000), CONST64(0x0020000020200000), CONST64(0x0020000820200000), + CONST64(0x0020000000002000), CONST64(0x0020000800002000), CONST64(0x0020000020002000), CONST64(0x0020000820002000), + CONST64(0x0020000000202000), CONST64(0x0020000800202000), CONST64(0x0020000020202000), CONST64(0x0020000820202000), + CONST64(0x0020000000000020), CONST64(0x0020000800000020), CONST64(0x0020000020000020), CONST64(0x0020000820000020), + CONST64(0x0020000000200020), CONST64(0x0020000800200020), CONST64(0x0020000020200020), CONST64(0x0020000820200020), + CONST64(0x0020000000002020), CONST64(0x0020000800002020), CONST64(0x0020000020002020), CONST64(0x0020000820002020), + CONST64(0x0020000000202020), CONST64(0x0020000800202020), CONST64(0x0020000020202020), CONST64(0x0020000820202020), + CONST64(0x2020000000000000), CONST64(0x2020000800000000), CONST64(0x2020000020000000), CONST64(0x2020000820000000), + CONST64(0x2020000000200000), CONST64(0x2020000800200000), CONST64(0x2020000020200000), CONST64(0x2020000820200000), + CONST64(0x2020000000002000), CONST64(0x2020000800002000), CONST64(0x2020000020002000), CONST64(0x2020000820002000), + CONST64(0x2020000000202000), CONST64(0x2020000800202000), CONST64(0x2020000020202000), CONST64(0x2020000820202000), + CONST64(0x2020000000000020), CONST64(0x2020000800000020), CONST64(0x2020000020000020), CONST64(0x2020000820000020), + CONST64(0x2020000000200020), CONST64(0x2020000800200020), CONST64(0x2020000020200020), CONST64(0x2020000820200020), + CONST64(0x2020000000002020), CONST64(0x2020000800002020), CONST64(0x2020000020002020), CONST64(0x2020000820002020), + CONST64(0x2020000000202020), CONST64(0x2020000800202020), CONST64(0x2020000020202020), CONST64(0x2020000820202020), + CONST64(0x0000200000000000), CONST64(0x0000200800000000), CONST64(0x0000200020000000), CONST64(0x0000200820000000), + CONST64(0x0000200000200000), CONST64(0x0000200800200000), CONST64(0x0000200020200000), CONST64(0x0000200820200000), + CONST64(0x0000200000002000), CONST64(0x0000200800002000), CONST64(0x0000200020002000), CONST64(0x0000200820002000), + CONST64(0x0000200000202000), CONST64(0x0000200800202000), CONST64(0x0000200020202000), CONST64(0x0000200820202000), + CONST64(0x0000200000000020), CONST64(0x0000200800000020), CONST64(0x0000200020000020), CONST64(0x0000200820000020), + CONST64(0x0000200000200020), CONST64(0x0000200800200020), CONST64(0x0000200020200020), CONST64(0x0000200820200020), + CONST64(0x0000200000002020), CONST64(0x0000200800002020), CONST64(0x0000200020002020), CONST64(0x0000200820002020), + CONST64(0x0000200000202020), CONST64(0x0000200800202020), CONST64(0x0000200020202020), CONST64(0x0000200820202020), + CONST64(0x2000200000000000), CONST64(0x2000200800000000), CONST64(0x2000200020000000), CONST64(0x2000200820000000), + CONST64(0x2000200000200000), CONST64(0x2000200800200000), CONST64(0x2000200020200000), CONST64(0x2000200820200000), + CONST64(0x2000200000002000), CONST64(0x2000200800002000), CONST64(0x2000200020002000), CONST64(0x2000200820002000), + CONST64(0x2000200000202000), CONST64(0x2000200800202000), CONST64(0x2000200020202000), CONST64(0x2000200820202000), + CONST64(0x2000200000000020), CONST64(0x2000200800000020), CONST64(0x2000200020000020), CONST64(0x2000200820000020), + CONST64(0x2000200000200020), CONST64(0x2000200800200020), CONST64(0x2000200020200020), CONST64(0x2000200820200020), + CONST64(0x2000200000002020), CONST64(0x2000200800002020), CONST64(0x2000200020002020), CONST64(0x2000200820002020), + CONST64(0x2000200000202020), CONST64(0x2000200800202020), CONST64(0x2000200020202020), CONST64(0x2000200820202020), + CONST64(0x0020200000000000), CONST64(0x0020200800000000), CONST64(0x0020200020000000), CONST64(0x0020200820000000), + CONST64(0x0020200000200000), CONST64(0x0020200800200000), CONST64(0x0020200020200000), CONST64(0x0020200820200000), + CONST64(0x0020200000002000), CONST64(0x0020200800002000), CONST64(0x0020200020002000), CONST64(0x0020200820002000), + CONST64(0x0020200000202000), CONST64(0x0020200800202000), CONST64(0x0020200020202000), CONST64(0x0020200820202000), + CONST64(0x0020200000000020), CONST64(0x0020200800000020), CONST64(0x0020200020000020), CONST64(0x0020200820000020), + CONST64(0x0020200000200020), CONST64(0x0020200800200020), CONST64(0x0020200020200020), CONST64(0x0020200820200020), + CONST64(0x0020200000002020), CONST64(0x0020200800002020), CONST64(0x0020200020002020), CONST64(0x0020200820002020), + CONST64(0x0020200000202020), CONST64(0x0020200800202020), CONST64(0x0020200020202020), CONST64(0x0020200820202020), + CONST64(0x2020200000000000), CONST64(0x2020200800000000), CONST64(0x2020200020000000), CONST64(0x2020200820000000), + CONST64(0x2020200000200000), CONST64(0x2020200800200000), CONST64(0x2020200020200000), CONST64(0x2020200820200000), + CONST64(0x2020200000002000), CONST64(0x2020200800002000), CONST64(0x2020200020002000), CONST64(0x2020200820002000), + CONST64(0x2020200000202000), CONST64(0x2020200800202000), CONST64(0x2020200020202000), CONST64(0x2020200820202000), + CONST64(0x2020200000000020), CONST64(0x2020200800000020), CONST64(0x2020200020000020), CONST64(0x2020200820000020), + CONST64(0x2020200000200020), CONST64(0x2020200800200020), CONST64(0x2020200020200020), CONST64(0x2020200820200020), + CONST64(0x2020200000002020), CONST64(0x2020200800002020), CONST64(0x2020200020002020), CONST64(0x2020200820002020), + CONST64(0x2020200000202020), CONST64(0x2020200800202020), CONST64(0x2020200020202020), CONST64(0x2020200820202020) + }, +{ CONST64(0x0000000000000000), CONST64(0x0000002000000000), CONST64(0x0000000080000000), CONST64(0x0000002080000000), + CONST64(0x0000000000800000), CONST64(0x0000002000800000), CONST64(0x0000000080800000), CONST64(0x0000002080800000), + CONST64(0x0000000000008000), CONST64(0x0000002000008000), CONST64(0x0000000080008000), CONST64(0x0000002080008000), + CONST64(0x0000000000808000), CONST64(0x0000002000808000), CONST64(0x0000000080808000), CONST64(0x0000002080808000), + CONST64(0x0000000000000080), CONST64(0x0000002000000080), CONST64(0x0000000080000080), CONST64(0x0000002080000080), + CONST64(0x0000000000800080), CONST64(0x0000002000800080), CONST64(0x0000000080800080), CONST64(0x0000002080800080), + CONST64(0x0000000000008080), CONST64(0x0000002000008080), CONST64(0x0000000080008080), CONST64(0x0000002080008080), + CONST64(0x0000000000808080), CONST64(0x0000002000808080), CONST64(0x0000000080808080), CONST64(0x0000002080808080), + CONST64(0x8000000000000000), CONST64(0x8000002000000000), CONST64(0x8000000080000000), CONST64(0x8000002080000000), + CONST64(0x8000000000800000), CONST64(0x8000002000800000), CONST64(0x8000000080800000), CONST64(0x8000002080800000), + CONST64(0x8000000000008000), CONST64(0x8000002000008000), CONST64(0x8000000080008000), CONST64(0x8000002080008000), + CONST64(0x8000000000808000), CONST64(0x8000002000808000), CONST64(0x8000000080808000), CONST64(0x8000002080808000), + CONST64(0x8000000000000080), CONST64(0x8000002000000080), CONST64(0x8000000080000080), CONST64(0x8000002080000080), + CONST64(0x8000000000800080), CONST64(0x8000002000800080), CONST64(0x8000000080800080), CONST64(0x8000002080800080), + CONST64(0x8000000000008080), CONST64(0x8000002000008080), CONST64(0x8000000080008080), CONST64(0x8000002080008080), + CONST64(0x8000000000808080), CONST64(0x8000002000808080), CONST64(0x8000000080808080), CONST64(0x8000002080808080), + CONST64(0x0080000000000000), CONST64(0x0080002000000000), CONST64(0x0080000080000000), CONST64(0x0080002080000000), + CONST64(0x0080000000800000), CONST64(0x0080002000800000), CONST64(0x0080000080800000), CONST64(0x0080002080800000), + CONST64(0x0080000000008000), CONST64(0x0080002000008000), CONST64(0x0080000080008000), CONST64(0x0080002080008000), + CONST64(0x0080000000808000), CONST64(0x0080002000808000), CONST64(0x0080000080808000), CONST64(0x0080002080808000), + CONST64(0x0080000000000080), CONST64(0x0080002000000080), CONST64(0x0080000080000080), CONST64(0x0080002080000080), + CONST64(0x0080000000800080), CONST64(0x0080002000800080), CONST64(0x0080000080800080), CONST64(0x0080002080800080), + CONST64(0x0080000000008080), CONST64(0x0080002000008080), CONST64(0x0080000080008080), CONST64(0x0080002080008080), + CONST64(0x0080000000808080), CONST64(0x0080002000808080), CONST64(0x0080000080808080), CONST64(0x0080002080808080), + CONST64(0x8080000000000000), CONST64(0x8080002000000000), CONST64(0x8080000080000000), CONST64(0x8080002080000000), + CONST64(0x8080000000800000), CONST64(0x8080002000800000), CONST64(0x8080000080800000), CONST64(0x8080002080800000), + CONST64(0x8080000000008000), CONST64(0x8080002000008000), CONST64(0x8080000080008000), CONST64(0x8080002080008000), + CONST64(0x8080000000808000), CONST64(0x8080002000808000), CONST64(0x8080000080808000), CONST64(0x8080002080808000), + CONST64(0x8080000000000080), CONST64(0x8080002000000080), CONST64(0x8080000080000080), CONST64(0x8080002080000080), + CONST64(0x8080000000800080), CONST64(0x8080002000800080), CONST64(0x8080000080800080), CONST64(0x8080002080800080), + CONST64(0x8080000000008080), CONST64(0x8080002000008080), CONST64(0x8080000080008080), CONST64(0x8080002080008080), + CONST64(0x8080000000808080), CONST64(0x8080002000808080), CONST64(0x8080000080808080), CONST64(0x8080002080808080), + CONST64(0x0000800000000000), CONST64(0x0000802000000000), CONST64(0x0000800080000000), CONST64(0x0000802080000000), + CONST64(0x0000800000800000), CONST64(0x0000802000800000), CONST64(0x0000800080800000), CONST64(0x0000802080800000), + CONST64(0x0000800000008000), CONST64(0x0000802000008000), CONST64(0x0000800080008000), CONST64(0x0000802080008000), + CONST64(0x0000800000808000), CONST64(0x0000802000808000), CONST64(0x0000800080808000), CONST64(0x0000802080808000), + CONST64(0x0000800000000080), CONST64(0x0000802000000080), CONST64(0x0000800080000080), CONST64(0x0000802080000080), + CONST64(0x0000800000800080), CONST64(0x0000802000800080), CONST64(0x0000800080800080), CONST64(0x0000802080800080), + CONST64(0x0000800000008080), CONST64(0x0000802000008080), CONST64(0x0000800080008080), CONST64(0x0000802080008080), + CONST64(0x0000800000808080), CONST64(0x0000802000808080), CONST64(0x0000800080808080), CONST64(0x0000802080808080), + CONST64(0x8000800000000000), CONST64(0x8000802000000000), CONST64(0x8000800080000000), CONST64(0x8000802080000000), + CONST64(0x8000800000800000), CONST64(0x8000802000800000), CONST64(0x8000800080800000), CONST64(0x8000802080800000), + CONST64(0x8000800000008000), CONST64(0x8000802000008000), CONST64(0x8000800080008000), CONST64(0x8000802080008000), + CONST64(0x8000800000808000), CONST64(0x8000802000808000), CONST64(0x8000800080808000), CONST64(0x8000802080808000), + CONST64(0x8000800000000080), CONST64(0x8000802000000080), CONST64(0x8000800080000080), CONST64(0x8000802080000080), + CONST64(0x8000800000800080), CONST64(0x8000802000800080), CONST64(0x8000800080800080), CONST64(0x8000802080800080), + CONST64(0x8000800000008080), CONST64(0x8000802000008080), CONST64(0x8000800080008080), CONST64(0x8000802080008080), + CONST64(0x8000800000808080), CONST64(0x8000802000808080), CONST64(0x8000800080808080), CONST64(0x8000802080808080), + CONST64(0x0080800000000000), CONST64(0x0080802000000000), CONST64(0x0080800080000000), CONST64(0x0080802080000000), + CONST64(0x0080800000800000), CONST64(0x0080802000800000), CONST64(0x0080800080800000), CONST64(0x0080802080800000), + CONST64(0x0080800000008000), CONST64(0x0080802000008000), CONST64(0x0080800080008000), CONST64(0x0080802080008000), + CONST64(0x0080800000808000), CONST64(0x0080802000808000), CONST64(0x0080800080808000), CONST64(0x0080802080808000), + CONST64(0x0080800000000080), CONST64(0x0080802000000080), CONST64(0x0080800080000080), CONST64(0x0080802080000080), + CONST64(0x0080800000800080), CONST64(0x0080802000800080), CONST64(0x0080800080800080), CONST64(0x0080802080800080), + CONST64(0x0080800000008080), CONST64(0x0080802000008080), CONST64(0x0080800080008080), CONST64(0x0080802080008080), + CONST64(0x0080800000808080), CONST64(0x0080802000808080), CONST64(0x0080800080808080), CONST64(0x0080802080808080), + CONST64(0x8080800000000000), CONST64(0x8080802000000000), CONST64(0x8080800080000000), CONST64(0x8080802080000000), + CONST64(0x8080800000800000), CONST64(0x8080802000800000), CONST64(0x8080800080800000), CONST64(0x8080802080800000), + CONST64(0x8080800000008000), CONST64(0x8080802000008000), CONST64(0x8080800080008000), CONST64(0x8080802080008000), + CONST64(0x8080800000808000), CONST64(0x8080802000808000), CONST64(0x8080800080808000), CONST64(0x8080802080808000), + CONST64(0x8080800000000080), CONST64(0x8080802000000080), CONST64(0x8080800080000080), CONST64(0x8080802080000080), + CONST64(0x8080800000800080), CONST64(0x8080802000800080), CONST64(0x8080800080800080), CONST64(0x8080802080800080), + CONST64(0x8080800000008080), CONST64(0x8080802000008080), CONST64(0x8080800080008080), CONST64(0x8080802080008080), + CONST64(0x8080800000808080), CONST64(0x8080802000808080), CONST64(0x8080800080808080), CONST64(0x8080802080808080) + }, +{ CONST64(0x0000000000000000), CONST64(0x0000004000000000), CONST64(0x0000000001000000), CONST64(0x0000004001000000), + CONST64(0x0000000000010000), CONST64(0x0000004000010000), CONST64(0x0000000001010000), CONST64(0x0000004001010000), + CONST64(0x0000000000000100), CONST64(0x0000004000000100), CONST64(0x0000000001000100), CONST64(0x0000004001000100), + CONST64(0x0000000000010100), CONST64(0x0000004000010100), CONST64(0x0000000001010100), CONST64(0x0000004001010100), + CONST64(0x0000000000000001), CONST64(0x0000004000000001), CONST64(0x0000000001000001), CONST64(0x0000004001000001), + CONST64(0x0000000000010001), CONST64(0x0000004000010001), CONST64(0x0000000001010001), CONST64(0x0000004001010001), + CONST64(0x0000000000000101), CONST64(0x0000004000000101), CONST64(0x0000000001000101), CONST64(0x0000004001000101), + CONST64(0x0000000000010101), CONST64(0x0000004000010101), CONST64(0x0000000001010101), CONST64(0x0000004001010101), + CONST64(0x0100000000000000), CONST64(0x0100004000000000), CONST64(0x0100000001000000), CONST64(0x0100004001000000), + CONST64(0x0100000000010000), CONST64(0x0100004000010000), CONST64(0x0100000001010000), CONST64(0x0100004001010000), + CONST64(0x0100000000000100), CONST64(0x0100004000000100), CONST64(0x0100000001000100), CONST64(0x0100004001000100), + CONST64(0x0100000000010100), CONST64(0x0100004000010100), CONST64(0x0100000001010100), CONST64(0x0100004001010100), + CONST64(0x0100000000000001), CONST64(0x0100004000000001), CONST64(0x0100000001000001), CONST64(0x0100004001000001), + CONST64(0x0100000000010001), CONST64(0x0100004000010001), CONST64(0x0100000001010001), CONST64(0x0100004001010001), + CONST64(0x0100000000000101), CONST64(0x0100004000000101), CONST64(0x0100000001000101), CONST64(0x0100004001000101), + CONST64(0x0100000000010101), CONST64(0x0100004000010101), CONST64(0x0100000001010101), CONST64(0x0100004001010101), + CONST64(0x0001000000000000), CONST64(0x0001004000000000), CONST64(0x0001000001000000), CONST64(0x0001004001000000), + CONST64(0x0001000000010000), CONST64(0x0001004000010000), CONST64(0x0001000001010000), CONST64(0x0001004001010000), + CONST64(0x0001000000000100), CONST64(0x0001004000000100), CONST64(0x0001000001000100), CONST64(0x0001004001000100), + CONST64(0x0001000000010100), CONST64(0x0001004000010100), CONST64(0x0001000001010100), CONST64(0x0001004001010100), + CONST64(0x0001000000000001), CONST64(0x0001004000000001), CONST64(0x0001000001000001), CONST64(0x0001004001000001), + CONST64(0x0001000000010001), CONST64(0x0001004000010001), CONST64(0x0001000001010001), CONST64(0x0001004001010001), + CONST64(0x0001000000000101), CONST64(0x0001004000000101), CONST64(0x0001000001000101), CONST64(0x0001004001000101), + CONST64(0x0001000000010101), CONST64(0x0001004000010101), CONST64(0x0001000001010101), CONST64(0x0001004001010101), + CONST64(0x0101000000000000), CONST64(0x0101004000000000), CONST64(0x0101000001000000), CONST64(0x0101004001000000), + CONST64(0x0101000000010000), CONST64(0x0101004000010000), CONST64(0x0101000001010000), CONST64(0x0101004001010000), + CONST64(0x0101000000000100), CONST64(0x0101004000000100), CONST64(0x0101000001000100), CONST64(0x0101004001000100), + CONST64(0x0101000000010100), CONST64(0x0101004000010100), CONST64(0x0101000001010100), CONST64(0x0101004001010100), + CONST64(0x0101000000000001), CONST64(0x0101004000000001), CONST64(0x0101000001000001), CONST64(0x0101004001000001), + CONST64(0x0101000000010001), CONST64(0x0101004000010001), CONST64(0x0101000001010001), CONST64(0x0101004001010001), + CONST64(0x0101000000000101), CONST64(0x0101004000000101), CONST64(0x0101000001000101), CONST64(0x0101004001000101), + CONST64(0x0101000000010101), CONST64(0x0101004000010101), CONST64(0x0101000001010101), CONST64(0x0101004001010101), + CONST64(0x0000010000000000), CONST64(0x0000014000000000), CONST64(0x0000010001000000), CONST64(0x0000014001000000), + CONST64(0x0000010000010000), CONST64(0x0000014000010000), CONST64(0x0000010001010000), CONST64(0x0000014001010000), + CONST64(0x0000010000000100), CONST64(0x0000014000000100), CONST64(0x0000010001000100), CONST64(0x0000014001000100), + CONST64(0x0000010000010100), CONST64(0x0000014000010100), CONST64(0x0000010001010100), CONST64(0x0000014001010100), + CONST64(0x0000010000000001), CONST64(0x0000014000000001), CONST64(0x0000010001000001), CONST64(0x0000014001000001), + CONST64(0x0000010000010001), CONST64(0x0000014000010001), CONST64(0x0000010001010001), CONST64(0x0000014001010001), + CONST64(0x0000010000000101), CONST64(0x0000014000000101), CONST64(0x0000010001000101), CONST64(0x0000014001000101), + CONST64(0x0000010000010101), CONST64(0x0000014000010101), CONST64(0x0000010001010101), CONST64(0x0000014001010101), + CONST64(0x0100010000000000), CONST64(0x0100014000000000), CONST64(0x0100010001000000), CONST64(0x0100014001000000), + CONST64(0x0100010000010000), CONST64(0x0100014000010000), CONST64(0x0100010001010000), CONST64(0x0100014001010000), + CONST64(0x0100010000000100), CONST64(0x0100014000000100), CONST64(0x0100010001000100), CONST64(0x0100014001000100), + CONST64(0x0100010000010100), CONST64(0x0100014000010100), CONST64(0x0100010001010100), CONST64(0x0100014001010100), + CONST64(0x0100010000000001), CONST64(0x0100014000000001), CONST64(0x0100010001000001), CONST64(0x0100014001000001), + CONST64(0x0100010000010001), CONST64(0x0100014000010001), CONST64(0x0100010001010001), CONST64(0x0100014001010001), + CONST64(0x0100010000000101), CONST64(0x0100014000000101), CONST64(0x0100010001000101), CONST64(0x0100014001000101), + CONST64(0x0100010000010101), CONST64(0x0100014000010101), CONST64(0x0100010001010101), CONST64(0x0100014001010101), + CONST64(0x0001010000000000), CONST64(0x0001014000000000), CONST64(0x0001010001000000), CONST64(0x0001014001000000), + CONST64(0x0001010000010000), CONST64(0x0001014000010000), CONST64(0x0001010001010000), CONST64(0x0001014001010000), + CONST64(0x0001010000000100), CONST64(0x0001014000000100), CONST64(0x0001010001000100), CONST64(0x0001014001000100), + CONST64(0x0001010000010100), CONST64(0x0001014000010100), CONST64(0x0001010001010100), CONST64(0x0001014001010100), + CONST64(0x0001010000000001), CONST64(0x0001014000000001), CONST64(0x0001010001000001), CONST64(0x0001014001000001), + CONST64(0x0001010000010001), CONST64(0x0001014000010001), CONST64(0x0001010001010001), CONST64(0x0001014001010001), + CONST64(0x0001010000000101), CONST64(0x0001014000000101), CONST64(0x0001010001000101), CONST64(0x0001014001000101), + CONST64(0x0001010000010101), CONST64(0x0001014000010101), CONST64(0x0001010001010101), CONST64(0x0001014001010101), + CONST64(0x0101010000000000), CONST64(0x0101014000000000), CONST64(0x0101010001000000), CONST64(0x0101014001000000), + CONST64(0x0101010000010000), CONST64(0x0101014000010000), CONST64(0x0101010001010000), CONST64(0x0101014001010000), + CONST64(0x0101010000000100), CONST64(0x0101014000000100), CONST64(0x0101010001000100), CONST64(0x0101014001000100), + CONST64(0x0101010000010100), CONST64(0x0101014000010100), CONST64(0x0101010001010100), CONST64(0x0101014001010100), + CONST64(0x0101010000000001), CONST64(0x0101014000000001), CONST64(0x0101010001000001), CONST64(0x0101014001000001), + CONST64(0x0101010000010001), CONST64(0x0101014000010001), CONST64(0x0101010001010001), CONST64(0x0101014001010001), + CONST64(0x0101010000000101), CONST64(0x0101014000000101), CONST64(0x0101010001000101), CONST64(0x0101014001000101), + CONST64(0x0101010000010101), CONST64(0x0101014000010101), CONST64(0x0101010001010101), CONST64(0x0101014001010101) + }, +{ CONST64(0x0000000000000000), CONST64(0x0000000100000000), CONST64(0x0000000004000000), CONST64(0x0000000104000000), + CONST64(0x0000000000040000), CONST64(0x0000000100040000), CONST64(0x0000000004040000), CONST64(0x0000000104040000), + CONST64(0x0000000000000400), CONST64(0x0000000100000400), CONST64(0x0000000004000400), CONST64(0x0000000104000400), + CONST64(0x0000000000040400), CONST64(0x0000000100040400), CONST64(0x0000000004040400), CONST64(0x0000000104040400), + CONST64(0x0000000000000004), CONST64(0x0000000100000004), CONST64(0x0000000004000004), CONST64(0x0000000104000004), + CONST64(0x0000000000040004), CONST64(0x0000000100040004), CONST64(0x0000000004040004), CONST64(0x0000000104040004), + CONST64(0x0000000000000404), CONST64(0x0000000100000404), CONST64(0x0000000004000404), CONST64(0x0000000104000404), + CONST64(0x0000000000040404), CONST64(0x0000000100040404), CONST64(0x0000000004040404), CONST64(0x0000000104040404), + CONST64(0x0400000000000000), CONST64(0x0400000100000000), CONST64(0x0400000004000000), CONST64(0x0400000104000000), + CONST64(0x0400000000040000), CONST64(0x0400000100040000), CONST64(0x0400000004040000), CONST64(0x0400000104040000), + CONST64(0x0400000000000400), CONST64(0x0400000100000400), CONST64(0x0400000004000400), CONST64(0x0400000104000400), + CONST64(0x0400000000040400), CONST64(0x0400000100040400), CONST64(0x0400000004040400), CONST64(0x0400000104040400), + CONST64(0x0400000000000004), CONST64(0x0400000100000004), CONST64(0x0400000004000004), CONST64(0x0400000104000004), + CONST64(0x0400000000040004), CONST64(0x0400000100040004), CONST64(0x0400000004040004), CONST64(0x0400000104040004), + CONST64(0x0400000000000404), CONST64(0x0400000100000404), CONST64(0x0400000004000404), CONST64(0x0400000104000404), + CONST64(0x0400000000040404), CONST64(0x0400000100040404), CONST64(0x0400000004040404), CONST64(0x0400000104040404), + CONST64(0x0004000000000000), CONST64(0x0004000100000000), CONST64(0x0004000004000000), CONST64(0x0004000104000000), + CONST64(0x0004000000040000), CONST64(0x0004000100040000), CONST64(0x0004000004040000), CONST64(0x0004000104040000), + CONST64(0x0004000000000400), CONST64(0x0004000100000400), CONST64(0x0004000004000400), CONST64(0x0004000104000400), + CONST64(0x0004000000040400), CONST64(0x0004000100040400), CONST64(0x0004000004040400), CONST64(0x0004000104040400), + CONST64(0x0004000000000004), CONST64(0x0004000100000004), CONST64(0x0004000004000004), CONST64(0x0004000104000004), + CONST64(0x0004000000040004), CONST64(0x0004000100040004), CONST64(0x0004000004040004), CONST64(0x0004000104040004), + CONST64(0x0004000000000404), CONST64(0x0004000100000404), CONST64(0x0004000004000404), CONST64(0x0004000104000404), + CONST64(0x0004000000040404), CONST64(0x0004000100040404), CONST64(0x0004000004040404), CONST64(0x0004000104040404), + CONST64(0x0404000000000000), CONST64(0x0404000100000000), CONST64(0x0404000004000000), CONST64(0x0404000104000000), + CONST64(0x0404000000040000), CONST64(0x0404000100040000), CONST64(0x0404000004040000), CONST64(0x0404000104040000), + CONST64(0x0404000000000400), CONST64(0x0404000100000400), CONST64(0x0404000004000400), CONST64(0x0404000104000400), + CONST64(0x0404000000040400), CONST64(0x0404000100040400), CONST64(0x0404000004040400), CONST64(0x0404000104040400), + CONST64(0x0404000000000004), CONST64(0x0404000100000004), CONST64(0x0404000004000004), CONST64(0x0404000104000004), + CONST64(0x0404000000040004), CONST64(0x0404000100040004), CONST64(0x0404000004040004), CONST64(0x0404000104040004), + CONST64(0x0404000000000404), CONST64(0x0404000100000404), CONST64(0x0404000004000404), CONST64(0x0404000104000404), + CONST64(0x0404000000040404), CONST64(0x0404000100040404), CONST64(0x0404000004040404), CONST64(0x0404000104040404), + CONST64(0x0000040000000000), CONST64(0x0000040100000000), CONST64(0x0000040004000000), CONST64(0x0000040104000000), + CONST64(0x0000040000040000), CONST64(0x0000040100040000), CONST64(0x0000040004040000), CONST64(0x0000040104040000), + CONST64(0x0000040000000400), CONST64(0x0000040100000400), CONST64(0x0000040004000400), CONST64(0x0000040104000400), + CONST64(0x0000040000040400), CONST64(0x0000040100040400), CONST64(0x0000040004040400), CONST64(0x0000040104040400), + CONST64(0x0000040000000004), CONST64(0x0000040100000004), CONST64(0x0000040004000004), CONST64(0x0000040104000004), + CONST64(0x0000040000040004), CONST64(0x0000040100040004), CONST64(0x0000040004040004), CONST64(0x0000040104040004), + CONST64(0x0000040000000404), CONST64(0x0000040100000404), CONST64(0x0000040004000404), CONST64(0x0000040104000404), + CONST64(0x0000040000040404), CONST64(0x0000040100040404), CONST64(0x0000040004040404), CONST64(0x0000040104040404), + CONST64(0x0400040000000000), CONST64(0x0400040100000000), CONST64(0x0400040004000000), CONST64(0x0400040104000000), + CONST64(0x0400040000040000), CONST64(0x0400040100040000), CONST64(0x0400040004040000), CONST64(0x0400040104040000), + CONST64(0x0400040000000400), CONST64(0x0400040100000400), CONST64(0x0400040004000400), CONST64(0x0400040104000400), + CONST64(0x0400040000040400), CONST64(0x0400040100040400), CONST64(0x0400040004040400), CONST64(0x0400040104040400), + CONST64(0x0400040000000004), CONST64(0x0400040100000004), CONST64(0x0400040004000004), CONST64(0x0400040104000004), + CONST64(0x0400040000040004), CONST64(0x0400040100040004), CONST64(0x0400040004040004), CONST64(0x0400040104040004), + CONST64(0x0400040000000404), CONST64(0x0400040100000404), CONST64(0x0400040004000404), CONST64(0x0400040104000404), + CONST64(0x0400040000040404), CONST64(0x0400040100040404), CONST64(0x0400040004040404), CONST64(0x0400040104040404), + CONST64(0x0004040000000000), CONST64(0x0004040100000000), CONST64(0x0004040004000000), CONST64(0x0004040104000000), + CONST64(0x0004040000040000), CONST64(0x0004040100040000), CONST64(0x0004040004040000), CONST64(0x0004040104040000), + CONST64(0x0004040000000400), CONST64(0x0004040100000400), CONST64(0x0004040004000400), CONST64(0x0004040104000400), + CONST64(0x0004040000040400), CONST64(0x0004040100040400), CONST64(0x0004040004040400), CONST64(0x0004040104040400), + CONST64(0x0004040000000004), CONST64(0x0004040100000004), CONST64(0x0004040004000004), CONST64(0x0004040104000004), + CONST64(0x0004040000040004), CONST64(0x0004040100040004), CONST64(0x0004040004040004), CONST64(0x0004040104040004), + CONST64(0x0004040000000404), CONST64(0x0004040100000404), CONST64(0x0004040004000404), CONST64(0x0004040104000404), + CONST64(0x0004040000040404), CONST64(0x0004040100040404), CONST64(0x0004040004040404), CONST64(0x0004040104040404), + CONST64(0x0404040000000000), CONST64(0x0404040100000000), CONST64(0x0404040004000000), CONST64(0x0404040104000000), + CONST64(0x0404040000040000), CONST64(0x0404040100040000), CONST64(0x0404040004040000), CONST64(0x0404040104040000), + CONST64(0x0404040000000400), CONST64(0x0404040100000400), CONST64(0x0404040004000400), CONST64(0x0404040104000400), + CONST64(0x0404040000040400), CONST64(0x0404040100040400), CONST64(0x0404040004040400), CONST64(0x0404040104040400), + CONST64(0x0404040000000004), CONST64(0x0404040100000004), CONST64(0x0404040004000004), CONST64(0x0404040104000004), + CONST64(0x0404040000040004), CONST64(0x0404040100040004), CONST64(0x0404040004040004), CONST64(0x0404040104040004), + CONST64(0x0404040000000404), CONST64(0x0404040100000404), CONST64(0x0404040004000404), CONST64(0x0404040104000404), + CONST64(0x0404040000040404), CONST64(0x0404040100040404), CONST64(0x0404040004040404), CONST64(0x0404040104040404) + }, +{ CONST64(0x0000000000000000), CONST64(0x0000000400000000), CONST64(0x0000000010000000), CONST64(0x0000000410000000), + CONST64(0x0000000000100000), CONST64(0x0000000400100000), CONST64(0x0000000010100000), CONST64(0x0000000410100000), + CONST64(0x0000000000001000), CONST64(0x0000000400001000), CONST64(0x0000000010001000), CONST64(0x0000000410001000), + CONST64(0x0000000000101000), CONST64(0x0000000400101000), CONST64(0x0000000010101000), CONST64(0x0000000410101000), + CONST64(0x0000000000000010), CONST64(0x0000000400000010), CONST64(0x0000000010000010), CONST64(0x0000000410000010), + CONST64(0x0000000000100010), CONST64(0x0000000400100010), CONST64(0x0000000010100010), CONST64(0x0000000410100010), + CONST64(0x0000000000001010), CONST64(0x0000000400001010), CONST64(0x0000000010001010), CONST64(0x0000000410001010), + CONST64(0x0000000000101010), CONST64(0x0000000400101010), CONST64(0x0000000010101010), CONST64(0x0000000410101010), + CONST64(0x1000000000000000), CONST64(0x1000000400000000), CONST64(0x1000000010000000), CONST64(0x1000000410000000), + CONST64(0x1000000000100000), CONST64(0x1000000400100000), CONST64(0x1000000010100000), CONST64(0x1000000410100000), + CONST64(0x1000000000001000), CONST64(0x1000000400001000), CONST64(0x1000000010001000), CONST64(0x1000000410001000), + CONST64(0x1000000000101000), CONST64(0x1000000400101000), CONST64(0x1000000010101000), CONST64(0x1000000410101000), + CONST64(0x1000000000000010), CONST64(0x1000000400000010), CONST64(0x1000000010000010), CONST64(0x1000000410000010), + CONST64(0x1000000000100010), CONST64(0x1000000400100010), CONST64(0x1000000010100010), CONST64(0x1000000410100010), + CONST64(0x1000000000001010), CONST64(0x1000000400001010), CONST64(0x1000000010001010), CONST64(0x1000000410001010), + CONST64(0x1000000000101010), CONST64(0x1000000400101010), CONST64(0x1000000010101010), CONST64(0x1000000410101010), + CONST64(0x0010000000000000), CONST64(0x0010000400000000), CONST64(0x0010000010000000), CONST64(0x0010000410000000), + CONST64(0x0010000000100000), CONST64(0x0010000400100000), CONST64(0x0010000010100000), CONST64(0x0010000410100000), + CONST64(0x0010000000001000), CONST64(0x0010000400001000), CONST64(0x0010000010001000), CONST64(0x0010000410001000), + CONST64(0x0010000000101000), CONST64(0x0010000400101000), CONST64(0x0010000010101000), CONST64(0x0010000410101000), + CONST64(0x0010000000000010), CONST64(0x0010000400000010), CONST64(0x0010000010000010), CONST64(0x0010000410000010), + CONST64(0x0010000000100010), CONST64(0x0010000400100010), CONST64(0x0010000010100010), CONST64(0x0010000410100010), + CONST64(0x0010000000001010), CONST64(0x0010000400001010), CONST64(0x0010000010001010), CONST64(0x0010000410001010), + CONST64(0x0010000000101010), CONST64(0x0010000400101010), CONST64(0x0010000010101010), CONST64(0x0010000410101010), + CONST64(0x1010000000000000), CONST64(0x1010000400000000), CONST64(0x1010000010000000), CONST64(0x1010000410000000), + CONST64(0x1010000000100000), CONST64(0x1010000400100000), CONST64(0x1010000010100000), CONST64(0x1010000410100000), + CONST64(0x1010000000001000), CONST64(0x1010000400001000), CONST64(0x1010000010001000), CONST64(0x1010000410001000), + CONST64(0x1010000000101000), CONST64(0x1010000400101000), CONST64(0x1010000010101000), CONST64(0x1010000410101000), + CONST64(0x1010000000000010), CONST64(0x1010000400000010), CONST64(0x1010000010000010), CONST64(0x1010000410000010), + CONST64(0x1010000000100010), CONST64(0x1010000400100010), CONST64(0x1010000010100010), CONST64(0x1010000410100010), + CONST64(0x1010000000001010), CONST64(0x1010000400001010), CONST64(0x1010000010001010), CONST64(0x1010000410001010), + CONST64(0x1010000000101010), CONST64(0x1010000400101010), CONST64(0x1010000010101010), CONST64(0x1010000410101010), + CONST64(0x0000100000000000), CONST64(0x0000100400000000), CONST64(0x0000100010000000), CONST64(0x0000100410000000), + CONST64(0x0000100000100000), CONST64(0x0000100400100000), CONST64(0x0000100010100000), CONST64(0x0000100410100000), + CONST64(0x0000100000001000), CONST64(0x0000100400001000), CONST64(0x0000100010001000), CONST64(0x0000100410001000), + CONST64(0x0000100000101000), CONST64(0x0000100400101000), CONST64(0x0000100010101000), CONST64(0x0000100410101000), + CONST64(0x0000100000000010), CONST64(0x0000100400000010), CONST64(0x0000100010000010), CONST64(0x0000100410000010), + CONST64(0x0000100000100010), CONST64(0x0000100400100010), CONST64(0x0000100010100010), CONST64(0x0000100410100010), + CONST64(0x0000100000001010), CONST64(0x0000100400001010), CONST64(0x0000100010001010), CONST64(0x0000100410001010), + CONST64(0x0000100000101010), CONST64(0x0000100400101010), CONST64(0x0000100010101010), CONST64(0x0000100410101010), + CONST64(0x1000100000000000), CONST64(0x1000100400000000), CONST64(0x1000100010000000), CONST64(0x1000100410000000), + CONST64(0x1000100000100000), CONST64(0x1000100400100000), CONST64(0x1000100010100000), CONST64(0x1000100410100000), + CONST64(0x1000100000001000), CONST64(0x1000100400001000), CONST64(0x1000100010001000), CONST64(0x1000100410001000), + CONST64(0x1000100000101000), CONST64(0x1000100400101000), CONST64(0x1000100010101000), CONST64(0x1000100410101000), + CONST64(0x1000100000000010), CONST64(0x1000100400000010), CONST64(0x1000100010000010), CONST64(0x1000100410000010), + CONST64(0x1000100000100010), CONST64(0x1000100400100010), CONST64(0x1000100010100010), CONST64(0x1000100410100010), + CONST64(0x1000100000001010), CONST64(0x1000100400001010), CONST64(0x1000100010001010), CONST64(0x1000100410001010), + CONST64(0x1000100000101010), CONST64(0x1000100400101010), CONST64(0x1000100010101010), CONST64(0x1000100410101010), + CONST64(0x0010100000000000), CONST64(0x0010100400000000), CONST64(0x0010100010000000), CONST64(0x0010100410000000), + CONST64(0x0010100000100000), CONST64(0x0010100400100000), CONST64(0x0010100010100000), CONST64(0x0010100410100000), + CONST64(0x0010100000001000), CONST64(0x0010100400001000), CONST64(0x0010100010001000), CONST64(0x0010100410001000), + CONST64(0x0010100000101000), CONST64(0x0010100400101000), CONST64(0x0010100010101000), CONST64(0x0010100410101000), + CONST64(0x0010100000000010), CONST64(0x0010100400000010), CONST64(0x0010100010000010), CONST64(0x0010100410000010), + CONST64(0x0010100000100010), CONST64(0x0010100400100010), CONST64(0x0010100010100010), CONST64(0x0010100410100010), + CONST64(0x0010100000001010), CONST64(0x0010100400001010), CONST64(0x0010100010001010), CONST64(0x0010100410001010), + CONST64(0x0010100000101010), CONST64(0x0010100400101010), CONST64(0x0010100010101010), CONST64(0x0010100410101010), + CONST64(0x1010100000000000), CONST64(0x1010100400000000), CONST64(0x1010100010000000), CONST64(0x1010100410000000), + CONST64(0x1010100000100000), CONST64(0x1010100400100000), CONST64(0x1010100010100000), CONST64(0x1010100410100000), + CONST64(0x1010100000001000), CONST64(0x1010100400001000), CONST64(0x1010100010001000), CONST64(0x1010100410001000), + CONST64(0x1010100000101000), CONST64(0x1010100400101000), CONST64(0x1010100010101000), CONST64(0x1010100410101000), + CONST64(0x1010100000000010), CONST64(0x1010100400000010), CONST64(0x1010100010000010), CONST64(0x1010100410000010), + CONST64(0x1010100000100010), CONST64(0x1010100400100010), CONST64(0x1010100010100010), CONST64(0x1010100410100010), + CONST64(0x1010100000001010), CONST64(0x1010100400001010), CONST64(0x1010100010001010), CONST64(0x1010100410001010), + CONST64(0x1010100000101010), CONST64(0x1010100400101010), CONST64(0x1010100010101010), CONST64(0x1010100410101010) + }, +{ CONST64(0x0000000000000000), CONST64(0x0000001000000000), CONST64(0x0000000040000000), CONST64(0x0000001040000000), + CONST64(0x0000000000400000), CONST64(0x0000001000400000), CONST64(0x0000000040400000), CONST64(0x0000001040400000), + CONST64(0x0000000000004000), CONST64(0x0000001000004000), CONST64(0x0000000040004000), CONST64(0x0000001040004000), + CONST64(0x0000000000404000), CONST64(0x0000001000404000), CONST64(0x0000000040404000), CONST64(0x0000001040404000), + CONST64(0x0000000000000040), CONST64(0x0000001000000040), CONST64(0x0000000040000040), CONST64(0x0000001040000040), + CONST64(0x0000000000400040), CONST64(0x0000001000400040), CONST64(0x0000000040400040), CONST64(0x0000001040400040), + CONST64(0x0000000000004040), CONST64(0x0000001000004040), CONST64(0x0000000040004040), CONST64(0x0000001040004040), + CONST64(0x0000000000404040), CONST64(0x0000001000404040), CONST64(0x0000000040404040), CONST64(0x0000001040404040), + CONST64(0x4000000000000000), CONST64(0x4000001000000000), CONST64(0x4000000040000000), CONST64(0x4000001040000000), + CONST64(0x4000000000400000), CONST64(0x4000001000400000), CONST64(0x4000000040400000), CONST64(0x4000001040400000), + CONST64(0x4000000000004000), CONST64(0x4000001000004000), CONST64(0x4000000040004000), CONST64(0x4000001040004000), + CONST64(0x4000000000404000), CONST64(0x4000001000404000), CONST64(0x4000000040404000), CONST64(0x4000001040404000), + CONST64(0x4000000000000040), CONST64(0x4000001000000040), CONST64(0x4000000040000040), CONST64(0x4000001040000040), + CONST64(0x4000000000400040), CONST64(0x4000001000400040), CONST64(0x4000000040400040), CONST64(0x4000001040400040), + CONST64(0x4000000000004040), CONST64(0x4000001000004040), CONST64(0x4000000040004040), CONST64(0x4000001040004040), + CONST64(0x4000000000404040), CONST64(0x4000001000404040), CONST64(0x4000000040404040), CONST64(0x4000001040404040), + CONST64(0x0040000000000000), CONST64(0x0040001000000000), CONST64(0x0040000040000000), CONST64(0x0040001040000000), + CONST64(0x0040000000400000), CONST64(0x0040001000400000), CONST64(0x0040000040400000), CONST64(0x0040001040400000), + CONST64(0x0040000000004000), CONST64(0x0040001000004000), CONST64(0x0040000040004000), CONST64(0x0040001040004000), + CONST64(0x0040000000404000), CONST64(0x0040001000404000), CONST64(0x0040000040404000), CONST64(0x0040001040404000), + CONST64(0x0040000000000040), CONST64(0x0040001000000040), CONST64(0x0040000040000040), CONST64(0x0040001040000040), + CONST64(0x0040000000400040), CONST64(0x0040001000400040), CONST64(0x0040000040400040), CONST64(0x0040001040400040), + CONST64(0x0040000000004040), CONST64(0x0040001000004040), CONST64(0x0040000040004040), CONST64(0x0040001040004040), + CONST64(0x0040000000404040), CONST64(0x0040001000404040), CONST64(0x0040000040404040), CONST64(0x0040001040404040), + CONST64(0x4040000000000000), CONST64(0x4040001000000000), CONST64(0x4040000040000000), CONST64(0x4040001040000000), + CONST64(0x4040000000400000), CONST64(0x4040001000400000), CONST64(0x4040000040400000), CONST64(0x4040001040400000), + CONST64(0x4040000000004000), CONST64(0x4040001000004000), CONST64(0x4040000040004000), CONST64(0x4040001040004000), + CONST64(0x4040000000404000), CONST64(0x4040001000404000), CONST64(0x4040000040404000), CONST64(0x4040001040404000), + CONST64(0x4040000000000040), CONST64(0x4040001000000040), CONST64(0x4040000040000040), CONST64(0x4040001040000040), + CONST64(0x4040000000400040), CONST64(0x4040001000400040), CONST64(0x4040000040400040), CONST64(0x4040001040400040), + CONST64(0x4040000000004040), CONST64(0x4040001000004040), CONST64(0x4040000040004040), CONST64(0x4040001040004040), + CONST64(0x4040000000404040), CONST64(0x4040001000404040), CONST64(0x4040000040404040), CONST64(0x4040001040404040), + CONST64(0x0000400000000000), CONST64(0x0000401000000000), CONST64(0x0000400040000000), CONST64(0x0000401040000000), + CONST64(0x0000400000400000), CONST64(0x0000401000400000), CONST64(0x0000400040400000), CONST64(0x0000401040400000), + CONST64(0x0000400000004000), CONST64(0x0000401000004000), CONST64(0x0000400040004000), CONST64(0x0000401040004000), + CONST64(0x0000400000404000), CONST64(0x0000401000404000), CONST64(0x0000400040404000), CONST64(0x0000401040404000), + CONST64(0x0000400000000040), CONST64(0x0000401000000040), CONST64(0x0000400040000040), CONST64(0x0000401040000040), + CONST64(0x0000400000400040), CONST64(0x0000401000400040), CONST64(0x0000400040400040), CONST64(0x0000401040400040), + CONST64(0x0000400000004040), CONST64(0x0000401000004040), CONST64(0x0000400040004040), CONST64(0x0000401040004040), + CONST64(0x0000400000404040), CONST64(0x0000401000404040), CONST64(0x0000400040404040), CONST64(0x0000401040404040), + CONST64(0x4000400000000000), CONST64(0x4000401000000000), CONST64(0x4000400040000000), CONST64(0x4000401040000000), + CONST64(0x4000400000400000), CONST64(0x4000401000400000), CONST64(0x4000400040400000), CONST64(0x4000401040400000), + CONST64(0x4000400000004000), CONST64(0x4000401000004000), CONST64(0x4000400040004000), CONST64(0x4000401040004000), + CONST64(0x4000400000404000), CONST64(0x4000401000404000), CONST64(0x4000400040404000), CONST64(0x4000401040404000), + CONST64(0x4000400000000040), CONST64(0x4000401000000040), CONST64(0x4000400040000040), CONST64(0x4000401040000040), + CONST64(0x4000400000400040), CONST64(0x4000401000400040), CONST64(0x4000400040400040), CONST64(0x4000401040400040), + CONST64(0x4000400000004040), CONST64(0x4000401000004040), CONST64(0x4000400040004040), CONST64(0x4000401040004040), + CONST64(0x4000400000404040), CONST64(0x4000401000404040), CONST64(0x4000400040404040), CONST64(0x4000401040404040), + CONST64(0x0040400000000000), CONST64(0x0040401000000000), CONST64(0x0040400040000000), CONST64(0x0040401040000000), + CONST64(0x0040400000400000), CONST64(0x0040401000400000), CONST64(0x0040400040400000), CONST64(0x0040401040400000), + CONST64(0x0040400000004000), CONST64(0x0040401000004000), CONST64(0x0040400040004000), CONST64(0x0040401040004000), + CONST64(0x0040400000404000), CONST64(0x0040401000404000), CONST64(0x0040400040404000), CONST64(0x0040401040404000), + CONST64(0x0040400000000040), CONST64(0x0040401000000040), CONST64(0x0040400040000040), CONST64(0x0040401040000040), + CONST64(0x0040400000400040), CONST64(0x0040401000400040), CONST64(0x0040400040400040), CONST64(0x0040401040400040), + CONST64(0x0040400000004040), CONST64(0x0040401000004040), CONST64(0x0040400040004040), CONST64(0x0040401040004040), + CONST64(0x0040400000404040), CONST64(0x0040401000404040), CONST64(0x0040400040404040), CONST64(0x0040401040404040), + CONST64(0x4040400000000000), CONST64(0x4040401000000000), CONST64(0x4040400040000000), CONST64(0x4040401040000000), + CONST64(0x4040400000400000), CONST64(0x4040401000400000), CONST64(0x4040400040400000), CONST64(0x4040401040400000), + CONST64(0x4040400000004000), CONST64(0x4040401000004000), CONST64(0x4040400040004000), CONST64(0x4040401040004000), + CONST64(0x4040400000404000), CONST64(0x4040401000404000), CONST64(0x4040400040404000), CONST64(0x4040401040404000), + CONST64(0x4040400000000040), CONST64(0x4040401000000040), CONST64(0x4040400040000040), CONST64(0x4040401040000040), + CONST64(0x4040400000400040), CONST64(0x4040401000400040), CONST64(0x4040400040400040), CONST64(0x4040401040400040), + CONST64(0x4040400000004040), CONST64(0x4040401000004040), CONST64(0x4040400040004040), CONST64(0x4040401040004040), + CONST64(0x4040400000404040), CONST64(0x4040401000404040), CONST64(0x4040400040404040), CONST64(0x4040401040404040) + }}; + +#endif + + +static void cookey(const ulong32 *raw1, ulong32 *keyout); + +#ifdef LTC_CLEAN_STACK +static void _deskey(const unsigned char *key, short edf, ulong32 *keyout) +#else +static void deskey(const unsigned char *key, short edf, ulong32 *keyout) +#endif +{ + ulong32 i, j, l, m, n, kn[32]; + unsigned char pc1m[56], pcr[56]; + + for (j=0; j < 56; j++) { + l = (ulong32)pc1[j]; + m = l & 7; + pc1m[j] = (unsigned char)((key[l >> 3U] & bytebit[m]) == bytebit[m] ? 1 : 0); + } + + for (i=0; i < 16; i++) { + if (edf == DE1) { + m = (15 - i) << 1; + } else { + m = i << 1; + } + n = m + 1; + kn[m] = kn[n] = 0L; + for (j=0; j < 28; j++) { + l = j + (ulong32)totrot[i]; + if (l < 28) { + pcr[j] = pc1m[l]; + } else { + pcr[j] = pc1m[l - 28]; + } + } + for (/*j = 28*/; j < 56; j++) { + l = j + (ulong32)totrot[i]; + if (l < 56) { + pcr[j] = pc1m[l]; + } else { + pcr[j] = pc1m[l - 28]; + } + } + for (j=0; j < 24; j++) { + if ((int)pcr[(int)pc2[j]] != 0) { + kn[m] |= bigbyte[j]; + } + if ((int)pcr[(int)pc2[j+24]] != 0) { + kn[n] |= bigbyte[j]; + } + } + } + + cookey(kn, keyout); +} + +#ifdef LTC_CLEAN_STACK +static void deskey(const unsigned char *key, short edf, ulong32 *keyout) +{ + _deskey(key, edf, keyout); + burn_stack(sizeof(int)*5 + sizeof(ulong32)*32 + sizeof(unsigned char)*112); +} +#endif + +#ifdef LTC_CLEAN_STACK +static void _cookey(const ulong32 *raw1, ulong32 *keyout) +#else +static void cookey(const ulong32 *raw1, ulong32 *keyout) +#endif +{ + ulong32 *cook; + const ulong32 *raw0; + ulong32 dough[32]; + int i; + + cook = dough; + for(i=0; i < 16; i++, raw1++) + { + raw0 = raw1++; + *cook = (*raw0 & 0x00fc0000L) << 6; + *cook |= (*raw0 & 0x00000fc0L) << 10; + *cook |= (*raw1 & 0x00fc0000L) >> 10; + *cook++ |= (*raw1 & 0x00000fc0L) >> 6; + *cook = (*raw0 & 0x0003f000L) << 12; + *cook |= (*raw0 & 0x0000003fL) << 16; + *cook |= (*raw1 & 0x0003f000L) >> 4; + *cook++ |= (*raw1 & 0x0000003fL); + } + + XMEMCPY(keyout, dough, sizeof dough); +} + +#ifdef LTC_CLEAN_STACK +static void cookey(const ulong32 *raw1, ulong32 *keyout) +{ + _cookey(raw1, keyout); + burn_stack(sizeof(ulong32 *) * 2 + sizeof(ulong32)*32 + sizeof(int)); +} +#endif + +#ifndef LTC_CLEAN_STACK +static void desfunc(ulong32 *block, const ulong32 *keys) +#else +static void _desfunc(ulong32 *block, const ulong32 *keys) +#endif +{ + ulong32 work, right, leftt; + int cur_round; + + leftt = block[0]; + right = block[1]; + +#ifdef LTC_SMALL_CODE + work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL; + right ^= work; + leftt ^= (work << 4); + + work = ((leftt >> 16) ^ right) & 0x0000ffffL; + right ^= work; + leftt ^= (work << 16); + + work = ((right >> 2) ^ leftt) & 0x33333333L; + leftt ^= work; + right ^= (work << 2); + + work = ((right >> 8) ^ leftt) & 0x00ff00ffL; + leftt ^= work; + right ^= (work << 8); + + right = ROLc(right, 1); + work = (leftt ^ right) & 0xaaaaaaaaL; + + leftt ^= work; + right ^= work; + leftt = ROLc(leftt, 1); +#else + { + ulong64 tmp; + tmp = des_ip[0][byte(leftt, 0)] ^ + des_ip[1][byte(leftt, 1)] ^ + des_ip[2][byte(leftt, 2)] ^ + des_ip[3][byte(leftt, 3)] ^ + des_ip[4][byte(right, 0)] ^ + des_ip[5][byte(right, 1)] ^ + des_ip[6][byte(right, 2)] ^ + des_ip[7][byte(right, 3)]; + leftt = (ulong32)(tmp >> 32); + right = (ulong32)(tmp & 0xFFFFFFFFUL); + } +#endif + + for (cur_round = 0; cur_round < 8; cur_round++) { + work = RORc(right, 4) ^ *keys++; + leftt ^= SP7[work & 0x3fL] + ^ SP5[(work >> 8) & 0x3fL] + ^ SP3[(work >> 16) & 0x3fL] + ^ SP1[(work >> 24) & 0x3fL]; + work = right ^ *keys++; + leftt ^= SP8[ work & 0x3fL] + ^ SP6[(work >> 8) & 0x3fL] + ^ SP4[(work >> 16) & 0x3fL] + ^ SP2[(work >> 24) & 0x3fL]; + + work = RORc(leftt, 4) ^ *keys++; + right ^= SP7[ work & 0x3fL] + ^ SP5[(work >> 8) & 0x3fL] + ^ SP3[(work >> 16) & 0x3fL] + ^ SP1[(work >> 24) & 0x3fL]; + work = leftt ^ *keys++; + right ^= SP8[ work & 0x3fL] + ^ SP6[(work >> 8) & 0x3fL] + ^ SP4[(work >> 16) & 0x3fL] + ^ SP2[(work >> 24) & 0x3fL]; + } + +#ifdef LTC_SMALL_CODE + right = RORc(right, 1); + work = (leftt ^ right) & 0xaaaaaaaaL; + leftt ^= work; + right ^= work; + leftt = RORc(leftt, 1); + work = ((leftt >> 8) ^ right) & 0x00ff00ffL; + right ^= work; + leftt ^= (work << 8); + /* -- */ + work = ((leftt >> 2) ^ right) & 0x33333333L; + right ^= work; + leftt ^= (work << 2); + work = ((right >> 16) ^ leftt) & 0x0000ffffL; + leftt ^= work; + right ^= (work << 16); + work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL; + leftt ^= work; + right ^= (work << 4); +#else + { + ulong64 tmp; + tmp = des_fp[0][byte(leftt, 0)] ^ + des_fp[1][byte(leftt, 1)] ^ + des_fp[2][byte(leftt, 2)] ^ + des_fp[3][byte(leftt, 3)] ^ + des_fp[4][byte(right, 0)] ^ + des_fp[5][byte(right, 1)] ^ + des_fp[6][byte(right, 2)] ^ + des_fp[7][byte(right, 3)]; + leftt = (ulong32)(tmp >> 32); + right = (ulong32)(tmp & 0xFFFFFFFFUL); + } +#endif + + block[0] = right; + block[1] = leftt; +} + +#ifdef LTC_CLEAN_STACK +static void desfunc(ulong32 *block, const ulong32 *keys) +{ + _desfunc(block, keys); + burn_stack(sizeof(ulong32) * 4 + sizeof(int)); +} +#endif + + /** + Initialize the DES block cipher + @param key The symmetric key you wish to pass + @param keylen The key length in bytes + @param num_rounds The number of rounds desired (0 for default) + @param skey The key in as scheduled by this function. + @return CRYPT_OK if successful + */ +static int des_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey) +{ + LTC_ARGCHK(key != NULL); + LTC_ARGCHK(skey != NULL); + + if (num_rounds != 0 && num_rounds != 16) { + return CRYPT_INVALID_ROUNDS; + } + + if (keylen != 8) { + return CRYPT_INVALID_KEYSIZE; + } + + deskey(key, EN0, skey->des.ek); + deskey(key, DE1, skey->des.dk); + + return CRYPT_OK; +} + + /** + Initialize the 3DES-EDE block cipher + @param key The symmetric key you wish to pass + @param keylen The key length in bytes + @param num_rounds The number of rounds desired (0 for default) + @param skey The key in as scheduled by this function. + @return CRYPT_OK if successful + */ +static int des3_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey) +{ + LTC_ARGCHK(key != NULL); + LTC_ARGCHK(skey != NULL); + + if(num_rounds != 0 && num_rounds != 16) { + return CRYPT_INVALID_ROUNDS; + } + + if (keylen != 24 && keylen != 16) { + return CRYPT_INVALID_KEYSIZE; + } + + deskey(key, EN0, skey->des3.ek[0]); + deskey(key+8, DE1, skey->des3.ek[1]); + if (keylen == 24) { + deskey(key+16, EN0, skey->des3.ek[2]); + } else { + /* two-key 3DES: K3=K1 */ + deskey(key, EN0, skey->des3.ek[2]); + } + + deskey(key, DE1, skey->des3.dk[2]); + deskey(key+8, EN0, skey->des3.dk[1]); + if (keylen == 24) { + deskey(key+16, DE1, skey->des3.dk[0]); + } else { + /* two-key 3DES: K3=K1 */ + deskey(key, DE1, skey->des3.dk[0]); + } + + return CRYPT_OK; +} + +/** + Encrypts a block of text with DES + @param pt The input plaintext (8 bytes) + @param ct The output ciphertext (8 bytes) + @param skey The key as scheduled + @return CRYPT_OK if successful +*/ +static int des_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) +{ + ulong32 work[2]; + LTC_ARGCHK(pt != NULL); + LTC_ARGCHK(ct != NULL); + LTC_ARGCHK(skey != NULL); + LOAD32H(work[0], pt+0); + LOAD32H(work[1], pt+4); + desfunc(work, skey->des.ek); + STORE32H(work[0],ct+0); + STORE32H(work[1],ct+4); + return CRYPT_OK; +} + +/** + Decrypts a block of text with DES + @param ct The input ciphertext (8 bytes) + @param pt The output plaintext (8 bytes) + @param skey The key as scheduled + @return CRYPT_OK if successful +*/ +static int des_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) +{ + ulong32 work[2]; + LTC_ARGCHK(pt != NULL); + LTC_ARGCHK(ct != NULL); + LTC_ARGCHK(skey != NULL); + LOAD32H(work[0], ct+0); + LOAD32H(work[1], ct+4); + desfunc(work, skey->des.dk); + STORE32H(work[0],pt+0); + STORE32H(work[1],pt+4); + return CRYPT_OK; +} + +/** + Encrypts a block of text with 3DES-EDE + @param pt The input plaintext (8 bytes) + @param ct The output ciphertext (8 bytes) + @param skey The key as scheduled + @return CRYPT_OK if successful +*/ +static int des3_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) +{ + ulong32 work[2]; + + LTC_ARGCHK(pt != NULL); + LTC_ARGCHK(ct != NULL); + LTC_ARGCHK(skey != NULL); + LOAD32H(work[0], pt+0); + LOAD32H(work[1], pt+4); + desfunc(work, skey->des3.ek[0]); + desfunc(work, skey->des3.ek[1]); + desfunc(work, skey->des3.ek[2]); + STORE32H(work[0],ct+0); + STORE32H(work[1],ct+4); + return CRYPT_OK; +} + +/** + Decrypts a block of text with 3DES-EDE + @param ct The input ciphertext (8 bytes) + @param pt The output plaintext (8 bytes) + @param skey The key as scheduled + @return CRYPT_OK if successful +*/ +static int des3_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) +{ + ulong32 work[2]; + LTC_ARGCHK(pt != NULL); + LTC_ARGCHK(ct != NULL); + LTC_ARGCHK(skey != NULL); + LOAD32H(work[0], ct+0); + LOAD32H(work[1], ct+4); + desfunc(work, skey->des3.dk[0]); + desfunc(work, skey->des3.dk[1]); + desfunc(work, skey->des3.dk[2]); + STORE32H(work[0],pt+0); + STORE32H(work[1],pt+4); + return CRYPT_OK; +} + +/** + Performs a self-test of the DES block cipher + @return CRYPT_OK if functional, CRYPT_NOP if self-test has been disabled +*/ +static int des_test(void) +{ + #ifndef LTC_TEST + return CRYPT_NOP; + #else + int err; + static const struct des_test_case { + int num, mode; /* mode 1 = encrypt */ + unsigned char key[8], txt[8], out[8]; + } cases[] = { + { 1, 1, { 0x10, 0x31, 0x6E, 0x02, 0x8C, 0x8F, 0x3B, 0x4A }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x82, 0xDC, 0xBA, 0xFB, 0xDE, 0xAB, 0x66, 0x02 } }, + { 2, 1, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x95, 0xF8, 0xA5, 0xE5, 0xDD, 0x31, 0xD9, 0x00 }, + { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { 3, 1, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0xDD, 0x7F, 0x12, 0x1C, 0xA5, 0x01, 0x56, 0x19 }, + { 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { 4, 1, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x2E, 0x86, 0x53, 0x10, 0x4F, 0x38, 0x34, 0xEA }, + { 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { 5, 1, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x4B, 0xD3, 0x88, 0xFF, 0x6C, 0xD8, 0x1D, 0x4F }, + { 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { 6, 1, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x20, 0xB9, 0xE7, 0x67, 0xB2, 0xFB, 0x14, 0x56 }, + { 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { 7, 1, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x55, 0x57, 0x93, 0x80, 0xD7, 0x71, 0x38, 0xEF }, + { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { 8, 1, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x6C, 0xC5, 0xDE, 0xFA, 0xAF, 0x04, 0x51, 0x2F }, + { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { 9, 1, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x0D, 0x9F, 0x27, 0x9B, 0xA5, 0xD8, 0x72, 0x60 }, + { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + {10, 1, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0xD9, 0x03, 0x1B, 0x02, 0x71, 0xBD, 0x5A, 0x0A }, + { 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + + { 1, 0, { 0x10, 0x31, 0x6E, 0x02, 0x8C, 0x8F, 0x3B, 0x4A }, + { 0x82, 0xDC, 0xBA, 0xFB, 0xDE, 0xAB, 0x66, 0x02 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { 2, 0, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x95, 0xF8, 0xA5, 0xE5, 0xDD, 0x31, 0xD9, 0x00 } }, + { 3, 0, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0xDD, 0x7F, 0x12, 0x1C, 0xA5, 0x01, 0x56, 0x19 } }, + { 4, 0, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x2E, 0x86, 0x53, 0x10, 0x4F, 0x38, 0x34, 0xEA } }, + { 5, 0, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x4B, 0xD3, 0x88, 0xFF, 0x6C, 0xD8, 0x1D, 0x4F } }, + { 6, 0, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x20, 0xB9, 0xE7, 0x67, 0xB2, 0xFB, 0x14, 0x56 } }, + { 7, 0, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x55, 0x57, 0x93, 0x80, 0xD7, 0x71, 0x38, 0xEF } }, + { 8, 0, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x6C, 0xC5, 0xDE, 0xFA, 0xAF, 0x04, 0x51, 0x2F } }, + { 9, 0, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x0D, 0x9F, 0x27, 0x9B, 0xA5, 0xD8, 0x72, 0x60 } }, + {10, 0, { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0xD9, 0x03, 0x1B, 0x02, 0x71, 0xBD, 0x5A, 0x0A } } + + /*** more test cases you could add if you are not convinced (the above test cases aren't really too good): + + key plaintext ciphertext + 0000000000000000 0000000000000000 8CA64DE9C1B123A7 + FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF 7359B2163E4EDC58 + 3000000000000000 1000000000000001 958E6E627A05557B + 1111111111111111 1111111111111111 F40379AB9E0EC533 + 0123456789ABCDEF 1111111111111111 17668DFC7292532D + 1111111111111111 0123456789ABCDEF 8A5AE1F81AB8F2DD + 0000000000000000 0000000000000000 8CA64DE9C1B123A7 + FEDCBA9876543210 0123456789ABCDEF ED39D950FA74BCC4 + 7CA110454A1A6E57 01A1D6D039776742 690F5B0D9A26939B + 0131D9619DC1376E 5CD54CA83DEF57DA 7A389D10354BD271 + 07A1133E4A0B2686 0248D43806F67172 868EBB51CAB4599A + 3849674C2602319E 51454B582DDF440A 7178876E01F19B2A + 04B915BA43FEB5B6 42FD443059577FA2 AF37FB421F8C4095 + 0113B970FD34F2CE 059B5E0851CF143A 86A560F10EC6D85B + 0170F175468FB5E6 0756D8E0774761D2 0CD3DA020021DC09 + 43297FAD38E373FE 762514B829BF486A EA676B2CB7DB2B7A + 07A7137045DA2A16 3BDD119049372802 DFD64A815CAF1A0F + 04689104C2FD3B2F 26955F6835AF609A 5C513C9C4886C088 + 37D06BB516CB7546 164D5E404F275232 0A2AEEAE3FF4AB77 + 1F08260D1AC2465E 6B056E18759F5CCA EF1BF03E5DFA575A + 584023641ABA6176 004BD6EF09176062 88BF0DB6D70DEE56 + 025816164629B007 480D39006EE762F2 A1F9915541020B56 + 49793EBC79B3258F 437540C8698F3CFA 6FBF1CAFCFFD0556 + 4FB05E1515AB73A7 072D43A077075292 2F22E49BAB7CA1AC + 49E95D6D4CA229BF 02FE55778117F12A 5A6B612CC26CCE4A + 018310DC409B26D6 1D9D5C5018F728C2 5F4C038ED12B2E41 + 1C587F1C13924FEF 305532286D6F295A 63FAC0D034D9F793 + 0101010101010101 0123456789ABCDEF 617B3A0CE8F07100 + 1F1F1F1F0E0E0E0E 0123456789ABCDEF DB958605F8C8C606 + E0FEE0FEF1FEF1FE 0123456789ABCDEF EDBFD1C66C29CCC7 + 0000000000000000 FFFFFFFFFFFFFFFF 355550B2150E2451 + FFFFFFFFFFFFFFFF 0000000000000000 CAAAAF4DEAF1DBAE + 0123456789ABCDEF 0000000000000000 D5D44FF720683D0D + FEDCBA9876543210 FFFFFFFFFFFFFFFF 2A2BB008DF97C2F2 + + http://www.ecs.soton.ac.uk/~prw99r/ez438/vectors.txt + ***/ + }; + int i, y; + unsigned char tmp[8]; + symmetric_key des; + + for(i=0; i < (int)(sizeof(cases)/sizeof(cases[0])); i++) + { + if ((err = des_setup(cases[i].key, 8, 0, &des)) != CRYPT_OK) { + return err; + } + if (cases[i].mode != 0) { + des_ecb_encrypt(cases[i].txt, tmp, &des); + } else { + des_ecb_decrypt(cases[i].txt, tmp, &des); + } + + if (XMEMCMP(cases[i].out, tmp, sizeof(tmp)) != 0) { + return CRYPT_FAIL_TESTVECTOR; + } + + /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */ + for (y = 0; y < 8; y++) tmp[y] = 0; + for (y = 0; y < 1000; y++) des_ecb_encrypt(tmp, tmp, &des); + for (y = 0; y < 1000; y++) des_ecb_decrypt(tmp, tmp, &des); + for (y = 0; y < 8; y++) if (tmp[y] != 0) return CRYPT_FAIL_TESTVECTOR; +} + + return CRYPT_OK; + #endif +} + +static int des3_test(void) +{ + #ifndef LTC_TEST + return CRYPT_NOP; + #else + unsigned char key[24], pt[8], ct[8], tmp[8]; + symmetric_key skey; + int x, err; + + if ((err = des_test()) != CRYPT_OK) { + return err; + } + + for (x = 0; x < 8; x++) { + pt[x] = x; + } + + for (x = 0; x < 24; x++) { + key[x] = x; + } + + if ((err = des3_setup(key, 24, 0, &skey)) != CRYPT_OK) { + return err; + } + + des3_ecb_encrypt(pt, ct, &skey); + des3_ecb_decrypt(ct, tmp, &skey); + + if (XMEMCMP(pt, tmp, 8) != 0) { + return CRYPT_FAIL_TESTVECTOR; + } + + return CRYPT_OK; + #endif +} + +/** Terminate the context + @param skey The scheduled key +*/ +static void des_done(symmetric_key *skey) +{ +} + +/** Terminate the context + @param skey The scheduled key +*/ +static void des3_done(symmetric_key *skey) +{ +} + + +/** + Gets suitable key size + @param keysize [in/out] The length of the recommended key (in bytes). This function will store the suitable size back in this variable. + @return CRYPT_OK if the input key size is acceptable. +*/ +static int des_keysize(int *keysize) +{ + LTC_ARGCHK(keysize != NULL); + if(*keysize < 8) { + return CRYPT_INVALID_KEYSIZE; + } + *keysize = 8; + return CRYPT_OK; +} + +/** + Gets suitable key size + @param keysize [in/out] The length of the recommended key (in bytes). This function will store the suitable size back in this variable. + @return CRYPT_OK if the input key size is acceptable. +*/ +static int des3_keysize(int *keysize) +{ + LTC_ARGCHK(keysize != NULL); + if(*keysize < 24) { + return CRYPT_INVALID_KEYSIZE; + } + *keysize = 24; + return CRYPT_OK; +} + +#endif + + +/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/des.c,v $ */ +/* $Revision: 1.13 $ */ +/* $Date: 2006/11/08 23:01:06 $ */ diff --git a/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_hash.h b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_hash.h new file mode 100644 index 0000000..d9916ac --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_hash.h @@ -0,0 +1,379 @@ +/* ---- HASH FUNCTIONS ---- */ +#ifdef SHA512 +struct sha512_state { + ulong64 length, state[8]; + unsigned long curlen; + unsigned char buf[128]; +}; +#endif + +#ifdef SHA256 +struct sha256_state { + ulong64 length; + ulong32 state[8], curlen; + unsigned char buf[64]; +}; +#endif + +#ifdef SHA1 +struct sha1_state { + ulong64 length; + ulong32 state[5], curlen; + unsigned char buf[64]; +}; +#endif + +#ifdef MD5 +struct md5_state { + ulong64 length; + ulong32 state[4], curlen; + unsigned char buf[64]; +}; +#endif + +#ifdef MD4 +struct md4_state { + ulong64 length; + ulong32 state[4], curlen; + unsigned char buf[64]; +}; +#endif + +#ifdef TIGER +struct tiger_state { + ulong64 state[3], length; + unsigned long curlen; + unsigned char buf[64]; +}; +#endif + +#ifdef MD2 +struct md2_state { + unsigned char chksum[16], X[48], buf[16]; + unsigned long curlen; +}; +#endif + +#ifdef RIPEMD128 +struct rmd128_state { + ulong64 length; + unsigned char buf[64]; + ulong32 curlen, state[4]; +}; +#endif + +#ifdef RIPEMD160 +struct rmd160_state { + ulong64 length; + unsigned char buf[64]; + ulong32 curlen, state[5]; +}; +#endif + +#ifdef RIPEMD256 +struct rmd256_state { + ulong64 length; + unsigned char buf[64]; + ulong32 curlen, state[8]; +}; +#endif + +#ifdef RIPEMD320 +struct rmd320_state { + ulong64 length; + unsigned char buf[64]; + ulong32 curlen, state[10]; +}; +#endif + +#ifdef WHIRLPOOL +struct whirlpool_state { + ulong64 length, state[8]; + unsigned char buf[64]; + ulong32 curlen; +}; +#endif + +#ifdef CHC_HASH +struct chc_state { + ulong64 length; + unsigned char state[MAXBLOCKSIZE], buf[MAXBLOCKSIZE]; + ulong32 curlen; +}; +#endif + +typedef union Hash_state { + char dummy[1]; +#ifdef CHC_HASH + struct chc_state chc; +#endif +#ifdef WHIRLPOOL + struct whirlpool_state whirlpool; +#endif +#ifdef SHA512 + struct sha512_state sha512; +#endif +#ifdef SHA256 + struct sha256_state sha256; +#endif +#ifdef SHA1 + struct sha1_state sha1; +#endif +#ifdef MD5 + struct md5_state md5; +#endif +#ifdef MD4 + struct md4_state md4; +#endif +#ifdef MD2 + struct md2_state md2; +#endif +#ifdef TIGER + struct tiger_state tiger; +#endif +#ifdef RIPEMD128 + struct rmd128_state rmd128; +#endif +#ifdef RIPEMD160 + struct rmd160_state rmd160; +#endif +#ifdef RIPEMD256 + struct rmd256_state rmd256; +#endif +#ifdef RIPEMD320 + struct rmd320_state rmd320; +#endif + void *data; +} hash_state; + +/** hash descriptor */ +extern struct ltc_hash_descriptor { + /** name of hash */ + char *name; + /** internal ID */ + unsigned char ID; + /** Size of digest in octets */ + unsigned long hashsize; + /** Input block size in octets */ + unsigned long blocksize; + /** ASN.1 OID */ + unsigned long OID[16]; + /** Length of DER encoding */ + unsigned long OIDlen; + + /** Init a hash state + @param hash The hash to initialize + @return CRYPT_OK if successful + */ + int (*init)(hash_state *hash); + /** Process a block of data + @param hash The hash state + @param in The data to hash + @param inlen The length of the data (octets) + @return CRYPT_OK if successful + */ + int (*process)(hash_state *hash, const unsigned char *in, unsigned long inlen); + /** Produce the digest and store it + @param hash The hash state + @param out [out] The destination of the digest + @return CRYPT_OK if successful + */ + int (*done)(hash_state *hash, unsigned char *out); + /** Self-test + @return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled + */ + int (*test)(void); + + /* accelerated hmac callback: if you need to-do multiple packets just use the generic hmac_memory and provide a hash callback */ + int (*hmac_block)(const unsigned char *key, unsigned long keylen, + const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + +} hash_descriptor[]; + +#ifdef CHC_HASH +int chc_register(int cipher); +int chc_init(hash_state * md); +int chc_process(hash_state * md, const unsigned char *in, unsigned long inlen); +int chc_done(hash_state * md, unsigned char *hash); +int chc_test(void); +extern const struct ltc_hash_descriptor chc_desc; +#endif + +#ifdef WHIRLPOOL +int whirlpool_init(hash_state * md); +int whirlpool_process(hash_state * md, const unsigned char *in, unsigned long inlen); +int whirlpool_done(hash_state * md, unsigned char *hash); +int whirlpool_test(void); +extern const struct ltc_hash_descriptor whirlpool_desc; +#endif + +#ifdef SHA512 +int sha512_init(hash_state * md); +int sha512_process(hash_state * md, const unsigned char *in, unsigned long inlen); +int sha512_done(hash_state * md, unsigned char *hash); +int sha512_test(void); +extern const struct ltc_hash_descriptor sha512_desc; +#endif + +#ifdef SHA384 +#ifndef SHA512 + #error SHA512 is required for SHA384 +#endif +int sha384_init(hash_state * md); +#define sha384_process sha512_process +int sha384_done(hash_state * md, unsigned char *hash); +int sha384_test(void); +extern const struct ltc_hash_descriptor sha384_desc; +#endif + +#ifdef SHA256 +int sha256_init(hash_state * md); +int sha256_process(hash_state * md, const unsigned char *in, unsigned long inlen); +int sha256_done(hash_state * md, unsigned char *hash); +int sha256_test(void); +extern const struct ltc_hash_descriptor sha256_desc; + +#ifdef SHA224 +#ifndef SHA256 + #error SHA256 is required for SHA224 +#endif +int sha224_init(hash_state * md); +#define sha224_process sha256_process +int sha224_done(hash_state * md, unsigned char *hash); +int sha224_test(void); +extern const struct ltc_hash_descriptor sha224_desc; +#endif +#endif + +#ifdef SHA1 +int sha1_init(hash_state * md); +int sha1_process(hash_state * md, const unsigned char *in, unsigned long inlen); +int sha1_done(hash_state * md, unsigned char *hash); +int sha1_test(void); +extern const struct ltc_hash_descriptor sha1_desc; +#endif + +#ifdef MD5 +int md5_init(hash_state * md); +int md5_process(hash_state * md, const unsigned char *in, unsigned long inlen); +int md5_done(hash_state * md, unsigned char *hash); +int md5_test(void); +extern const struct ltc_hash_descriptor md5_desc; +#endif + +#ifdef MD4 +int md4_init(hash_state * md); +int md4_process(hash_state * md, const unsigned char *in, unsigned long inlen); +int md4_done(hash_state * md, unsigned char *hash); +int md4_test(void); +extern const struct ltc_hash_descriptor md4_desc; +#endif + +#ifdef MD2 +int md2_init(hash_state * md); +int md2_process(hash_state * md, const unsigned char *in, unsigned long inlen); +int md2_done(hash_state * md, unsigned char *hash); +int md2_test(void); +extern const struct ltc_hash_descriptor md2_desc; +#endif + +#ifdef TIGER +int tiger_init(hash_state * md); +int tiger_process(hash_state * md, const unsigned char *in, unsigned long inlen); +int tiger_done(hash_state * md, unsigned char *hash); +int tiger_test(void); +extern const struct ltc_hash_descriptor tiger_desc; +#endif + +#ifdef RIPEMD128 +int rmd128_init(hash_state * md); +int rmd128_process(hash_state * md, const unsigned char *in, unsigned long inlen); +int rmd128_done(hash_state * md, unsigned char *hash); +int rmd128_test(void); +extern const struct ltc_hash_descriptor rmd128_desc; +#endif + +#ifdef RIPEMD160 +int rmd160_init(hash_state * md); +int rmd160_process(hash_state * md, const unsigned char *in, unsigned long inlen); +int rmd160_done(hash_state * md, unsigned char *hash); +int rmd160_test(void); +extern const struct ltc_hash_descriptor rmd160_desc; +#endif + +#ifdef RIPEMD256 +int rmd256_init(hash_state * md); +int rmd256_process(hash_state * md, const unsigned char *in, unsigned long inlen); +int rmd256_done(hash_state * md, unsigned char *hash); +int rmd256_test(void); +extern const struct ltc_hash_descriptor rmd256_desc; +#endif + +#ifdef RIPEMD320 +int rmd320_init(hash_state * md); +int rmd320_process(hash_state * md, const unsigned char *in, unsigned long inlen); +int rmd320_done(hash_state * md, unsigned char *hash); +int rmd320_test(void); +extern const struct ltc_hash_descriptor rmd320_desc; +#endif + + +int find_hash(const char *name); +int find_hash_id(unsigned char ID); +int find_hash_oid(const unsigned long *ID, unsigned long IDlen); +int find_hash_any(const char *name, int digestlen); +int register_hash(const struct ltc_hash_descriptor *hash); +int unregister_hash(const struct ltc_hash_descriptor *hash); +int hash_is_valid(int idx); + +LTC_MUTEX_PROTO(ltc_hash_mutex) + +int hash_memory(int hash, + const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int hash_memory_multi(int hash, unsigned char *out, unsigned long *outlen, + const unsigned char *in, unsigned long inlen, ...); +int hash_filehandle(int hash, FILE *in, unsigned char *out, unsigned long *outlen); +int hash_file(int hash, const char *fname, unsigned char *out, unsigned long *outlen); + +/* a simple macro for making hash "process" functions */ +#define HASH_PROCESS(func_name, compress_name, state_var, block_size) \ +int func_name (hash_state * md, const unsigned char *in, unsigned long inlen) \ +{ \ + unsigned long n; \ + int err; \ + LTC_ARGCHK(md != NULL); \ + LTC_ARGCHK(in != NULL); \ + if (md-> state_var .curlen > sizeof(md-> state_var .buf)) { \ + return CRYPT_INVALID_ARG; \ + } \ + while (inlen > 0) { \ + if (md-> state_var .curlen == 0 && inlen >= block_size) { \ + if ((err = compress_name (md, (unsigned char *)in)) != CRYPT_OK) { \ + return err; \ + } \ + md-> state_var .length += block_size * 8; \ + in += block_size; \ + inlen -= block_size; \ + } else { \ + n = MIN(inlen, (block_size - md-> state_var .curlen)); \ + memcpy(md-> state_var .buf + md-> state_var.curlen, in, (size_t)n); \ + md-> state_var .curlen += n; \ + in += n; \ + inlen -= n; \ + if (md-> state_var .curlen == block_size) { \ + if ((err = compress_name (md, md-> state_var .buf)) != CRYPT_OK) { \ + return err; \ + } \ + md-> state_var .length += 8*block_size; \ + md-> state_var .curlen = 0; \ + } \ + } \ + } \ + return CRYPT_OK; \ +} + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_hash.h,v $ */ +/* $Revision: 1.19 $ */ +/* $Date: 2006/11/05 01:36:43 $ */ diff --git a/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_mac.h b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_mac.h new file mode 100644 index 0000000..42bf680 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_mac.h @@ -0,0 +1,381 @@ +#ifdef LTC_HMAC +typedef struct Hmac_state { + hash_state md; + int hash; + hash_state hashstate; + unsigned char *key; +} hmac_state; + +int hmac_init(hmac_state *hmac, int hash, const unsigned char *key, unsigned long keylen); +int hmac_process(hmac_state *hmac, const unsigned char *in, unsigned long inlen); +int hmac_done(hmac_state *hmac, unsigned char *out, unsigned long *outlen); +int hmac_test(void); +int hmac_memory(int hash, + const unsigned char *key, unsigned long keylen, + const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int hmac_memory_multi(int hash, + const unsigned char *key, unsigned long keylen, + unsigned char *out, unsigned long *outlen, + const unsigned char *in, unsigned long inlen, ...); +int hmac_file(int hash, const char *fname, const unsigned char *key, + unsigned long keylen, + unsigned char *dst, unsigned long *dstlen); +#endif + +#ifdef LTC_OMAC + +typedef struct { + int cipher_idx, + buflen, + blklen; + unsigned char block[MAXBLOCKSIZE], + prev[MAXBLOCKSIZE], + Lu[2][MAXBLOCKSIZE]; + symmetric_key key; +} omac_state; + +int omac_init(omac_state *omac, int cipher, const unsigned char *key, unsigned long keylen); +int omac_process(omac_state *omac, const unsigned char *in, unsigned long inlen); +int omac_done(omac_state *omac, unsigned char *out, unsigned long *outlen); +int omac_memory(int cipher, + const unsigned char *key, unsigned long keylen, + const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int omac_memory_multi(int cipher, + const unsigned char *key, unsigned long keylen, + unsigned char *out, unsigned long *outlen, + const unsigned char *in, unsigned long inlen, ...); +int omac_file(int cipher, + const unsigned char *key, unsigned long keylen, + const char *filename, + unsigned char *out, unsigned long *outlen); +int omac_test(void); +#endif /* OMAC */ + +#ifdef LTC_PMAC + +typedef struct { + unsigned char Ls[32][MAXBLOCKSIZE], /* L shifted by i bits to the left */ + Li[MAXBLOCKSIZE], /* value of Li [current value, we calc from previous recall] */ + Lr[MAXBLOCKSIZE], /* L * x^-1 */ + block[MAXBLOCKSIZE], /* currently accumulated block */ + checksum[MAXBLOCKSIZE]; /* current checksum */ + + symmetric_key key; /* scheduled key for cipher */ + unsigned long block_index; /* index # for current block */ + int cipher_idx, /* cipher idx */ + block_len, /* length of block */ + buflen; /* number of bytes in the buffer */ +} pmac_state; + +int pmac_init(pmac_state *pmac, int cipher, const unsigned char *key, unsigned long keylen); +int pmac_process(pmac_state *pmac, const unsigned char *in, unsigned long inlen); +int pmac_done(pmac_state *pmac, unsigned char *out, unsigned long *outlen); + +int pmac_memory(int cipher, + const unsigned char *key, unsigned long keylen, + const unsigned char *msg, unsigned long msglen, + unsigned char *out, unsigned long *outlen); + +int pmac_memory_multi(int cipher, + const unsigned char *key, unsigned long keylen, + unsigned char *out, unsigned long *outlen, + const unsigned char *in, unsigned long inlen, ...); + +int pmac_file(int cipher, + const unsigned char *key, unsigned long keylen, + const char *filename, + unsigned char *out, unsigned long *outlen); + +int pmac_test(void); + +/* internal functions */ +int pmac_ntz(unsigned long x); +void pmac_shift_xor(pmac_state *pmac); + +#endif /* PMAC */ + +#ifdef EAX_MODE + +#if !(defined(LTC_OMAC) && defined(LTC_CTR_MODE)) + #error EAX_MODE requires OMAC and CTR +#endif + +typedef struct { + unsigned char N[MAXBLOCKSIZE]; + symmetric_CTR ctr; + omac_state headeromac, ctomac; +} eax_state; + +int eax_init(eax_state *eax, int cipher, const unsigned char *key, unsigned long keylen, + const unsigned char *nonce, unsigned long noncelen, + const unsigned char *header, unsigned long headerlen); + +int eax_encrypt(eax_state *eax, const unsigned char *pt, unsigned char *ct, unsigned long length); +int eax_decrypt(eax_state *eax, const unsigned char *ct, unsigned char *pt, unsigned long length); +int eax_addheader(eax_state *eax, const unsigned char *header, unsigned long length); +int eax_done(eax_state *eax, unsigned char *tag, unsigned long *taglen); + +int eax_encrypt_authenticate_memory(int cipher, + const unsigned char *key, unsigned long keylen, + const unsigned char *nonce, unsigned long noncelen, + const unsigned char *header, unsigned long headerlen, + const unsigned char *pt, unsigned long ptlen, + unsigned char *ct, + unsigned char *tag, unsigned long *taglen); + +int eax_decrypt_verify_memory(int cipher, + const unsigned char *key, unsigned long keylen, + const unsigned char *nonce, unsigned long noncelen, + const unsigned char *header, unsigned long headerlen, + const unsigned char *ct, unsigned long ctlen, + unsigned char *pt, + unsigned char *tag, unsigned long taglen, + int *stat); + + int eax_test(void); +#endif /* EAX MODE */ + +#ifdef OCB_MODE +typedef struct { + unsigned char L[MAXBLOCKSIZE], /* L value */ + Ls[32][MAXBLOCKSIZE], /* L shifted by i bits to the left */ + Li[MAXBLOCKSIZE], /* value of Li [current value, we calc from previous recall] */ + Lr[MAXBLOCKSIZE], /* L * x^-1 */ + R[MAXBLOCKSIZE], /* R value */ + checksum[MAXBLOCKSIZE]; /* current checksum */ + + symmetric_key key; /* scheduled key for cipher */ + unsigned long block_index; /* index # for current block */ + int cipher, /* cipher idx */ + block_len; /* length of block */ +} ocb_state; + +int ocb_init(ocb_state *ocb, int cipher, + const unsigned char *key, unsigned long keylen, const unsigned char *nonce); + +int ocb_encrypt(ocb_state *ocb, const unsigned char *pt, unsigned char *ct); +int ocb_decrypt(ocb_state *ocb, const unsigned char *ct, unsigned char *pt); + +int ocb_done_encrypt(ocb_state *ocb, + const unsigned char *pt, unsigned long ptlen, + unsigned char *ct, + unsigned char *tag, unsigned long *taglen); + +int ocb_done_decrypt(ocb_state *ocb, + const unsigned char *ct, unsigned long ctlen, + unsigned char *pt, + const unsigned char *tag, unsigned long taglen, int *stat); + +int ocb_encrypt_authenticate_memory(int cipher, + const unsigned char *key, unsigned long keylen, + const unsigned char *nonce, + const unsigned char *pt, unsigned long ptlen, + unsigned char *ct, + unsigned char *tag, unsigned long *taglen); + +int ocb_decrypt_verify_memory(int cipher, + const unsigned char *key, unsigned long keylen, + const unsigned char *nonce, + const unsigned char *ct, unsigned long ctlen, + unsigned char *pt, + const unsigned char *tag, unsigned long taglen, + int *stat); + +int ocb_test(void); + +/* internal functions */ +void ocb_shift_xor(ocb_state *ocb, unsigned char *Z); +int ocb_ntz(unsigned long x); +int s_ocb_done(ocb_state *ocb, const unsigned char *pt, unsigned long ptlen, + unsigned char *ct, unsigned char *tag, unsigned long *taglen, int mode); + +#endif /* OCB_MODE */ + +#ifdef CCM_MODE + +#define CCM_ENCRYPT 0 +#define CCM_DECRYPT 1 + +int ccm_memory(int cipher, + const unsigned char *key, unsigned long keylen, + symmetric_key *uskey, + const unsigned char *nonce, unsigned long noncelen, + const unsigned char *header, unsigned long headerlen, + unsigned char *pt, unsigned long ptlen, + unsigned char *ct, + unsigned char *tag, unsigned long *taglen, + int direction); + +int ccm_test(void); + +#endif /* CCM_MODE */ + +#if defined(LRW_MODE) || defined(GCM_MODE) +void gcm_gf_mult(const unsigned char *a, const unsigned char *b, unsigned char *c); +#endif + + +/* table shared between GCM and LRW */ +#if defined(GCM_TABLES) || defined(LRW_TABLES) || ((defined(GCM_MODE) || defined(GCM_MODE)) && defined(LTC_FAST)) +extern const unsigned char gcm_shift_table[]; +#endif + +#ifdef GCM_MODE + +#define GCM_ENCRYPT 0 +#define GCM_DECRYPT 1 + +#define GCM_MODE_IV 0 +#define GCM_MODE_AAD 1 +#define GCM_MODE_TEXT 2 + +typedef struct { + symmetric_key K; + unsigned char H[16], /* multiplier */ + X[16], /* accumulator */ + Y[16], /* counter */ + Y_0[16], /* initial counter */ + buf[16]; /* buffer for stuff */ + + int cipher, /* which cipher */ + ivmode, /* Which mode is the IV in? */ + mode, /* mode the GCM code is in */ + buflen; /* length of data in buf */ + + ulong64 totlen, /* 64-bit counter used for IV and AAD */ + pttotlen; /* 64-bit counter for the PT */ + +#ifdef GCM_TABLES + unsigned char PC[16][256][16] /* 16 tables of 8x128 */ +#ifdef GCM_TABLES_SSE2 +__attribute__ ((aligned (16))) +#endif +; +#endif +} gcm_state; + +void gcm_mult_h(gcm_state *gcm, unsigned char *I); + +int gcm_init(gcm_state *gcm, int cipher, + const unsigned char *key, int keylen); + +int gcm_reset(gcm_state *gcm); + +int gcm_add_iv(gcm_state *gcm, + const unsigned char *IV, unsigned long IVlen); + +int gcm_add_aad(gcm_state *gcm, + const unsigned char *adata, unsigned long adatalen); + +int gcm_process(gcm_state *gcm, + unsigned char *pt, unsigned long ptlen, + unsigned char *ct, + int direction); + +int gcm_done(gcm_state *gcm, + unsigned char *tag, unsigned long *taglen); + +int gcm_memory( int cipher, + const unsigned char *key, unsigned long keylen, + const unsigned char *IV, unsigned long IVlen, + const unsigned char *adata, unsigned long adatalen, + unsigned char *pt, unsigned long ptlen, + unsigned char *ct, + unsigned char *tag, unsigned long *taglen, + int direction); +int gcm_test(void); + +#endif /* GCM_MODE */ + +#ifdef PELICAN + +typedef struct pelican_state +{ + symmetric_key K; + unsigned char state[16]; + int buflen; +} pelican_state; + +int pelican_init(pelican_state *pelmac, const unsigned char *key, unsigned long keylen); +int pelican_process(pelican_state *pelmac, const unsigned char *in, unsigned long inlen); +int pelican_done(pelican_state *pelmac, unsigned char *out); +int pelican_test(void); + +int pelican_memory(const unsigned char *key, unsigned long keylen, + const unsigned char *in, unsigned long inlen, + unsigned char *out); + +#endif + +#ifdef LTC_XCBC + +typedef struct { + unsigned char K[3][MAXBLOCKSIZE], + IV[MAXBLOCKSIZE]; + + symmetric_key key; + + int cipher, + buflen, + blocksize; +} xcbc_state; + +int xcbc_init(xcbc_state *xcbc, int cipher, const unsigned char *key, unsigned long keylen); +int xcbc_process(xcbc_state *xcbc, const unsigned char *in, unsigned long inlen); +int xcbc_done(xcbc_state *xcbc, unsigned char *out, unsigned long *outlen); +int xcbc_memory(int cipher, + const unsigned char *key, unsigned long keylen, + const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int xcbc_memory_multi(int cipher, + const unsigned char *key, unsigned long keylen, + unsigned char *out, unsigned long *outlen, + const unsigned char *in, unsigned long inlen, ...); +int xcbc_file(int cipher, + const unsigned char *key, unsigned long keylen, + const char *filename, + unsigned char *out, unsigned long *outlen); +int xcbc_test(void); + +#endif + +#ifdef LTC_F9_MODE + +typedef struct { + unsigned char akey[MAXBLOCKSIZE], + ACC[MAXBLOCKSIZE], + IV[MAXBLOCKSIZE]; + + symmetric_key key; + + int cipher, + buflen, + keylen, + blocksize; +} f9_state; + +int f9_init(f9_state *f9, int cipher, const unsigned char *key, unsigned long keylen); +int f9_process(f9_state *f9, const unsigned char *in, unsigned long inlen); +int f9_done(f9_state *f9, unsigned char *out, unsigned long *outlen); +int f9_memory(int cipher, + const unsigned char *key, unsigned long keylen, + const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int f9_memory_multi(int cipher, + const unsigned char *key, unsigned long keylen, + unsigned char *out, unsigned long *outlen, + const unsigned char *in, unsigned long inlen, ...); +int f9_file(int cipher, + const unsigned char *key, unsigned long keylen, + const char *filename, + unsigned char *out, unsigned long *outlen); +int f9_test(void); + +#endif + + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_mac.h,v $ */ +/* $Revision: 1.20 $ */ +/* $Date: 2006/11/08 21:57:04 $ */ diff --git a/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_macros.h b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_macros.h new file mode 100644 index 0000000..53bda9b --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_macros.h @@ -0,0 +1,424 @@ +/* fix for MSVC ...evil! */ +#ifdef _MSC_VER + #define CONST64(n) n ## ui64 + typedef unsigned __int64 ulong64; +#else + #define CONST64(n) n ## ULL + typedef unsigned long long ulong64; +#endif + +/* this is the "32-bit at least" data type + * Re-define it to suit your platform but it must be at least 32-bits + */ +#if defined(__x86_64__) || (defined(__sparc__) && defined(__arch64__)) + typedef unsigned ulong32; +#else + typedef unsigned long ulong32; +#endif + +/* ---- HELPER MACROS ---- */ +#ifdef ENDIAN_NEUTRAL + +#define STORE32L(x, y) \ + { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \ + (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } + +#define LOAD32L(x, y) \ + { x = ((unsigned long)((y)[3] & 255)<<24) | \ + ((unsigned long)((y)[2] & 255)<<16) | \ + ((unsigned long)((y)[1] & 255)<<8) | \ + ((unsigned long)((y)[0] & 255)); } + +#define STORE64L(x, y) \ + { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \ + (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \ + (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \ + (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } + +#define LOAD64L(x, y) \ + { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \ + (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \ + (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \ + (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); } + +#define STORE32H(x, y) \ + { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \ + (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); } + +#define LOAD32H(x, y) \ + { x = ((unsigned long)((y)[0] & 255)<<24) | \ + ((unsigned long)((y)[1] & 255)<<16) | \ + ((unsigned long)((y)[2] & 255)<<8) | \ + ((unsigned long)((y)[3] & 255)); } + +#define STORE64H(x, y) \ + { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \ + (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \ + (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \ + (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } + +#define LOAD64H(x, y) \ + { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \ + (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \ + (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \ + (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); } + +#endif /* ENDIAN_NEUTRAL */ + +#ifdef ENDIAN_LITTLE + +#if !defined(LTC_NO_BSWAP) && (defined(INTEL_CC) || (defined(__GNUC__) && (defined(__DJGPP__) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__i386__) || defined(__x86_64__)))) + +#define STORE32H(x, y) \ +asm __volatile__ ( \ + "bswapl %0 \n\t" \ + "movl %0,(%1)\n\t" \ + "bswapl %0 \n\t" \ + ::"r"(x), "r"(y)); + +#define LOAD32H(x, y) \ +asm __volatile__ ( \ + "movl (%1),%0\n\t" \ + "bswapl %0\n\t" \ + :"=r"(x): "r"(y)); + +#else + +#define STORE32H(x, y) \ + { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \ + (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); } + +#define LOAD32H(x, y) \ + { x = ((unsigned long)((y)[0] & 255)<<24) | \ + ((unsigned long)((y)[1] & 255)<<16) | \ + ((unsigned long)((y)[2] & 255)<<8) | \ + ((unsigned long)((y)[3] & 255)); } + +#endif + + +/* x86_64 processor */ +#if !defined(LTC_NO_BSWAP) && (defined(__GNUC__) && defined(__x86_64__)) + +#define STORE64H(x, y) \ +asm __volatile__ ( \ + "bswapq %0 \n\t" \ + "movq %0,(%1)\n\t" \ + "bswapq %0 \n\t" \ + ::"r"(x), "r"(y)); + +#define LOAD64H(x, y) \ +asm __volatile__ ( \ + "movq (%1),%0\n\t" \ + "bswapq %0\n\t" \ + :"=r"(x): "r"(y)); + +#else + +#define STORE64H(x, y) \ + { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \ + (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \ + (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \ + (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } + +#define LOAD64H(x, y) \ + { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \ + (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \ + (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \ + (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); } + +#endif + +#ifdef ENDIAN_32BITWORD + +#define STORE32L(x, y) \ + { ulong32 __t = (x); XMEMCPY(y, &__t, 4); } + +#define LOAD32L(x, y) \ + XMEMCPY(&(x), y, 4); + +#define STORE64L(x, y) \ + { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \ + (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \ + (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \ + (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } + +#define LOAD64L(x, y) \ + { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \ + (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \ + (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \ + (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); } + +#else /* 64-bit words then */ + +#define STORE32L(x, y) \ + { ulong32 __t = (x); XMEMCPY(y, &__t, 4); } + +#define LOAD32L(x, y) \ + { XMEMCPY(&(x), y, 4); x &= 0xFFFFFFFF; } + +#define STORE64L(x, y) \ + { ulong64 __t = (x); XMEMCPY(y, &__t, 8); } + +#define LOAD64L(x, y) \ + { XMEMCPY(&(x), y, 8); } + +#endif /* ENDIAN_64BITWORD */ + +#endif /* ENDIAN_LITTLE */ + +#ifdef ENDIAN_BIG +#define STORE32L(x, y) \ + { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \ + (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } + +#define LOAD32L(x, y) \ + { x = ((unsigned long)((y)[3] & 255)<<24) | \ + ((unsigned long)((y)[2] & 255)<<16) | \ + ((unsigned long)((y)[1] & 255)<<8) | \ + ((unsigned long)((y)[0] & 255)); } + +#define STORE64L(x, y) \ + { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \ + (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \ + (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \ + (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } + +#define LOAD64L(x, y) \ + { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48) | \ + (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32) | \ + (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16) | \ + (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); } + +#ifdef ENDIAN_32BITWORD + +#define STORE32H(x, y) \ + { ulong32 __t = (x); XMEMCPY(y, &__t, 4); } + +#define LOAD32H(x, y) \ + XMEMCPY(&(x), y, 4); + +#define STORE64H(x, y) \ + { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \ + (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \ + (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \ + (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } + +#define LOAD64H(x, y) \ + { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48)| \ + (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32)| \ + (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16)| \ + (((ulong64)((y)[6] & 255))<<8)| (((ulong64)((y)[7] & 255))); } + +#else /* 64-bit words then */ + +#define STORE32H(x, y) \ + { ulong32 __t = (x); XMEMCPY(y, &__t, 4); } + +#define LOAD32H(x, y) \ + { XMEMCPY(&(x), y, 4); x &= 0xFFFFFFFF; } + +#define STORE64H(x, y) \ + { ulong64 __t = (x); XMEMCPY(y, &__t, 8); } + +#define LOAD64H(x, y) \ + { XMEMCPY(&(x), y, 8); } + +#endif /* ENDIAN_64BITWORD */ +#endif /* ENDIAN_BIG */ + +#define BSWAP(x) ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL) | \ + ((x>>8)&0x0000FF00UL) | ((x<<8)&0x00FF0000UL) ) + + +/* 32-bit Rotates */ +#if defined(_MSC_VER) + +/* instrinsic rotate */ +#include +#pragma intrinsic(_lrotr,_lrotl) +#define ROR(x,n) _lrotr(x,n) +#define ROL(x,n) _lrotl(x,n) +#define RORc(x,n) _lrotr(x,n) +#define ROLc(x,n) _lrotl(x,n) + +#elif !defined(__STRICT_ANSI__) && defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && !defined(INTEL_CC) && !defined(LTC_NO_ASM) + +static inline unsigned ROL(unsigned word, int i) +{ + asm ("roll %%cl,%0" + :"=r" (word) + :"0" (word),"c" (i)); + return word; +} + +static inline unsigned ROR(unsigned word, int i) +{ + asm ("rorl %%cl,%0" + :"=r" (word) + :"0" (word),"c" (i)); + return word; +} + +#ifndef LTC_NO_ROLC + +static inline unsigned ROLc(unsigned word, const int i) +{ + asm ("roll %2,%0" + :"=r" (word) + :"0" (word),"I" (i)); + return word; +} + +static inline unsigned RORc(unsigned word, const int i) +{ + asm ("rorl %2,%0" + :"=r" (word) + :"0" (word),"I" (i)); + return word; +} + +#else + +#define ROLc ROL +#define RORc ROR + +#endif + +#elif !defined(__STRICT_ANSI__) && defined(LTC_PPC32) + +static inline unsigned ROL(unsigned word, int i) +{ + asm ("rotlw %0,%0,%2" + :"=r" (word) + :"0" (word),"r" (i)); + return word; +} + +static inline unsigned ROR(unsigned word, int i) +{ + asm ("rotlw %0,%0,%2" + :"=r" (word) + :"0" (word),"r" (32-i)); + return word; +} + +#ifndef LTC_NO_ROLC + +static inline unsigned ROLc(unsigned word, const int i) +{ + asm ("rotlwi %0,%0,%2" + :"=r" (word) + :"0" (word),"I" (i)); + return word; +} + +static inline unsigned RORc(unsigned word, const int i) +{ + asm ("rotrwi %0,%0,%2" + :"=r" (word) + :"0" (word),"I" (i)); + return word; +} + +#else + +#define ROLc ROL +#define RORc ROR + +#endif + + +#else + +/* rotates the hard way */ +#define ROL(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) +#define ROR(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) +#define ROLc(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) +#define RORc(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) + +#endif + + +/* 64-bit Rotates */ +#if !defined(__STRICT_ANSI__) && defined(__GNUC__) && defined(__x86_64__) && !defined(LTC_NO_ASM) + +static inline unsigned long ROL64(unsigned long word, int i) +{ + asm("rolq %%cl,%0" + :"=r" (word) + :"0" (word),"c" (i)); + return word; +} + +static inline unsigned long ROR64(unsigned long word, int i) +{ + asm("rorq %%cl,%0" + :"=r" (word) + :"0" (word),"c" (i)); + return word; +} + +#ifndef LTC_NO_ROLC + +static inline unsigned long ROL64c(unsigned long word, const int i) +{ + asm("rolq %2,%0" + :"=r" (word) + :"0" (word),"J" (i)); + return word; +} + +static inline unsigned long ROR64c(unsigned long word, const int i) +{ + asm("rorq %2,%0" + :"=r" (word) + :"0" (word),"J" (i)); + return word; +} + +#else /* LTC_NO_ROLC */ + +#define ROL64c ROL64 +#define ROR64c ROR64 + +#endif + +#else /* Not x86_64 */ + +#define ROL64(x, y) \ + ( (((x)<<((ulong64)(y)&63)) | \ + (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF)) + +#define ROR64(x, y) \ + ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \ + ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF)) + +#define ROL64c(x, y) \ + ( (((x)<<((ulong64)(y)&63)) | \ + (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF)) + +#define ROR64c(x, y) \ + ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \ + ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF)) + +#endif + +#ifndef MAX + #define MAX(x, y) ( ((x)>(y))?(x):(y) ) +#endif + +#ifndef MIN + #define MIN(x, y) ( ((x)<(y))?(x):(y) ) +#endif + +/* extract a byte portably */ +#ifdef _MSC_VER + #define byte(x, n) ((unsigned char)((x) >> (8 * (n)))) +#else + #define byte(x, n) (((x) >> (8 * (n))) & 255) +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_macros.h,v $ */ +/* $Revision: 1.15 $ */ +/* $Date: 2006/11/29 23:43:57 $ */ diff --git a/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_math.h b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_math.h new file mode 100644 index 0000000..c996e41 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_math.h @@ -0,0 +1,500 @@ +/** math functions **/ + +#define LTC_MP_LT -1 +#define LTC_MP_EQ 0 +#define LTC_MP_GT 1 + +#define LTC_MP_NO 0 +#define LTC_MP_YES 1 + +#ifndef MECC + typedef void ecc_point; +#endif + +#ifndef MRSA + typedef void rsa_key; +#endif + +/** math descriptor */ +typedef struct { + /** Name of the math provider */ + char *name; + + /** Bits per digit, amount of bits must fit in an unsigned long */ + int bits_per_digit; + +/* ---- init/deinit functions ---- */ + + /** initialize a bignum + @param a The number to initialize + @return CRYPT_OK on success + */ + int (*init)(void **a); + + /** init copy + @param dst The number to initialize and write to + @param src The number to copy from + @return CRYPT_OK on success + */ + int (*init_copy)(void **dst, void *src); + + /** deinit + @param a The number to free + @return CRYPT_OK on success + */ + void (*deinit)(void *a); + +/* ---- data movement ---- */ + + /** negate + @param src The number to negate + @param dst The destination + @return CRYPT_OK on success + */ + int (*neg)(void *src, void *dst); + + /** copy + @param src The number to copy from + @param dst The number to write to + @return CRYPT_OK on success + */ + int (*copy)(void *src, void *dst); + +/* ---- trivial low level functions ---- */ + + /** set small constant + @param a Number to write to + @param n Source upto bits_per_digit (actually meant for very small constants) + @return CRYPT_OK on succcess + */ + int (*set_int)(void *a, unsigned long n); + + /** get small constant + @param a Number to read, only fetches upto bits_per_digit from the number + @return The lower bits_per_digit of the integer (unsigned) + */ + unsigned long (*get_int)(void *a); + + /** get digit n + @param a The number to read from + @param n The number of the digit to fetch + @return The bits_per_digit sized n'th digit of a + */ + unsigned long (*get_digit)(void *a, int n); + + /** Get the number of digits that represent the number + @param a The number to count + @return The number of digits used to represent the number + */ + int (*get_digit_count)(void *a); + + /** compare two integers + @param a The left side integer + @param b The right side integer + @return LTC_MP_LT if a < b, LTC_MP_GT if a > b and LTC_MP_EQ otherwise. (signed comparison) + */ + int (*compare)(void *a, void *b); + + /** compare against int + @param a The left side integer + @param b The right side integer (upto bits_per_digit) + @return LTC_MP_LT if a < b, LTC_MP_GT if a > b and LTC_MP_EQ otherwise. (signed comparison) + */ + int (*compare_d)(void *a, unsigned long n); + + /** Count the number of bits used to represent the integer + @param a The integer to count + @return The number of bits required to represent the integer + */ + int (*count_bits)(void * a); + + /** Count the number of LSB bits which are zero + @param a The integer to count + @return The number of contiguous zero LSB bits + */ + int (*count_lsb_bits)(void *a); + + /** Compute a power of two + @param a The integer to store the power in + @param n The power of two you want to store (a = 2^n) + @return CRYPT_OK on success + */ + int (*twoexpt)(void *a , int n); + +/* ---- radix conversions ---- */ + + /** read ascii string + @param a The integer to store into + @param str The string to read + @param radix The radix the integer has been represented in (2-64) + @return CRYPT_OK on success + */ + int (*read_radix)(void *a, const char *str, int radix); + + /** write number to string + @param a The integer to store + @param str The destination for the string + @param radix The radix the integer is to be represented in (2-64) + @return CRYPT_OK on success + */ + int (*write_radix)(void *a, char *str, int radix); + + /** get size as unsigned char string + @param a The integer to get the size (when stored in array of octets) + @return The length of the integer + */ + unsigned long (*unsigned_size)(void *a); + + /** store an integer as an array of octets + @param src The integer to store + @param dst The buffer to store the integer in + @return CRYPT_OK on success + */ + int (*unsigned_write)(void *src, unsigned char *dst); + + /** read an array of octets and store as integer + @param dst The integer to load + @param src The array of octets + @param len The number of octets + @return CRYPT_OK on success + */ + int (*unsigned_read)(void *dst, unsigned char *src, unsigned long len); + +/* ---- basic math ---- */ + + /** add two integers + @param a The first source integer + @param b The second source integer + @param c The destination of "a + b" + @return CRYPT_OK on success + */ + int (*add)(void *a, void *b, void *c); + + + /** add two integers + @param a The first source integer + @param b The second source integer (single digit of upto bits_per_digit in length) + @param c The destination of "a + b" + @return CRYPT_OK on success + */ + int (*addi)(void *a, unsigned long b, void *c); + + /** subtract two integers + @param a The first source integer + @param b The second source integer + @param c The destination of "a - b" + @return CRYPT_OK on success + */ + int (*sub)(void *a, void *b, void *c); + + /** subtract two integers + @param a The first source integer + @param b The second source integer (single digit of upto bits_per_digit in length) + @param c The destination of "a - b" + @return CRYPT_OK on success + */ + int (*subi)(void *a, unsigned long b, void *c); + + /** multiply two integers + @param a The first source integer + @param b The second source integer (single digit of upto bits_per_digit in length) + @param c The destination of "a * b" + @return CRYPT_OK on success + */ + int (*mul)(void *a, void *b, void *c); + + /** multiply two integers + @param a The first source integer + @param b The second source integer (single digit of upto bits_per_digit in length) + @param c The destination of "a * b" + @return CRYPT_OK on success + */ + int (*muli)(void *a, unsigned long b, void *c); + + /** Square an integer + @param a The integer to square + @param b The destination + @return CRYPT_OK on success + */ + int (*sqr)(void *a, void *b); + + /** Divide an integer + @param a The dividend + @param b The divisor + @param c The quotient (can be NULL to signify don't care) + @param d The remainder (can be NULL to signify don't care) + @return CRYPT_OK on success + */ + int (*mpdiv)(void *a, void *b, void *c, void *d); + + /** divide by two + @param a The integer to divide (shift right) + @param b The destination + @return CRYPT_OK on success + */ + int (*div_2)(void *a, void *b); + + /** Get remainder (small value) + @param a The integer to reduce + @param b The modulus (upto bits_per_digit in length) + @param c The destination for the residue + @return CRYPT_OK on success + */ + int (*modi)(void *a, unsigned long b, unsigned long *c); + + /** gcd + @param a The first integer + @param b The second integer + @param c The destination for (a, b) + @return CRYPT_OK on success + */ + int (*gcd)(void *a, void *b, void *c); + + /** lcm + @param a The first integer + @param b The second integer + @param c The destination for [a, b] + @return CRYPT_OK on success + */ + int (*lcm)(void *a, void *b, void *c); + + /** Modular multiplication + @param a The first source + @param b The second source + @param c The modulus + @param d The destination (a*b mod c) + @return CRYPT_OK on success + */ + int (*mulmod)(void *a, void *b, void *c, void *d); + + /** Modular squaring + @param a The first source + @param b The modulus + @param c The destination (a*a mod b) + @return CRYPT_OK on success + */ + int (*sqrmod)(void *a, void *b, void *c); + + /** Modular inversion + @param a The value to invert + @param b The modulus + @param c The destination (1/a mod b) + @return CRYPT_OK on success + */ + int (*invmod)(void *, void *, void *); + +/* ---- reduction ---- */ + + /** setup montgomery + @param a The modulus + @param b The destination for the reduction digit + @return CRYPT_OK on success + */ + int (*montgomery_setup)(void *a, void **b); + + /** get normalization value + @param a The destination for the normalization value + @param b The modulus + @return CRYPT_OK on success + */ + int (*montgomery_normalization)(void *a, void *b); + + /** reduce a number + @param a The number [and dest] to reduce + @param b The modulus + @param c The value "b" from montgomery_setup() + @return CRYPT_OK on success + */ + int (*montgomery_reduce)(void *a, void *b, void *c); + + /** clean up (frees memory) + @param a The value "b" from montgomery_setup() + @return CRYPT_OK on success + */ + void (*montgomery_deinit)(void *a); + +/* ---- exponentiation ---- */ + + /** Modular exponentiation + @param a The base integer + @param b The power (can be negative) integer + @param c The modulus integer + @param d The destination + @return CRYPT_OK on success + */ + int (*exptmod)(void *a, void *b, void *c, void *d); + + /** Primality testing + @param a The integer to test + @param b The destination of the result (FP_YES if prime) + @return CRYPT_OK on success + */ + int (*isprime)(void *a, int *b); + +/* ---- (optional) ecc point math ---- */ + + /** ECC GF(p) point multiplication (from the NIST curves) + @param k The integer to multiply the point by + @param G The point to multiply + @param R The destination for kG + @param modulus The modulus for the field + @param map Boolean indicated whether to map back to affine or not (can be ignored if you work in affine only) + @return CRYPT_OK on success + */ + int (*ecc_ptmul)(void *k, ecc_point *G, ecc_point *R, void *modulus, int map); + + /** ECC GF(p) point addition + @param P The first point + @param Q The second point + @param R The destination of P + Q + @param modulus The modulus + @param mp The "b" value from montgomery_setup() + @return CRYPT_OK on success + */ + int (*ecc_ptadd)(ecc_point *P, ecc_point *Q, ecc_point *R, void *modulus, void *mp); + + /** ECC GF(p) point double + @param P The first point + @param R The destination of 2P + @param modulus The modulus + @param mp The "b" value from montgomery_setup() + @return CRYPT_OK on success + */ + int (*ecc_ptdbl)(ecc_point *P, ecc_point *R, void *modulus, void *mp); + + /** ECC mapping from projective to affine, currently uses (x,y,z) => (x/z^2, y/z^3, 1) + @param P The point to map + @param modulus The modulus + @param mp The "b" value from montgomery_setup() + @return CRYPT_OK on success + @remark The mapping can be different but keep in mind a ecc_point only has three + integers (x,y,z) so if you use a different mapping you have to make it fit. + */ + int (*ecc_map)(ecc_point *P, void *modulus, void *mp); + + /** Computes kA*A + kB*B = C using Shamir's Trick + @param A First point to multiply + @param kA What to multiple A by + @param B Second point to multiply + @param kB What to multiple B by + @param C [out] Destination point (can overlap with A or B + @param modulus Modulus for curve + @return CRYPT_OK on success + */ + int (*ecc_mul2add)(ecc_point *A, void *kA, + ecc_point *B, void *kB, + ecc_point *C, + void *modulus); + +/* ---- (optional) rsa optimized math (for internal CRT) ---- */ + + /** RSA Key Generation + @param prng An active PRNG state + @param wprng The index of the PRNG desired + @param size The size of the modulus (key size) desired (octets) + @param e The "e" value (public key). e==65537 is a good choice + @param key [out] Destination of a newly created private key pair + @return CRYPT_OK if successful, upon error all allocated ram is freed + */ + int (*rsa_keygen)(prng_state *prng, int wprng, int size, long e, rsa_key *key); + + + /** RSA exponentiation + @param in The octet array representing the base + @param inlen The length of the input + @param out The destination (to be stored in an octet array format) + @param outlen The length of the output buffer and the resulting size (zero padded to the size of the modulus) + @param which PK_PUBLIC for public RSA and PK_PRIVATE for private RSA + @param key The RSA key to use + @return CRYPT_OK on success + */ + int (*rsa_me)(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, int which, + rsa_key *key); +} ltc_math_descriptor; + +extern ltc_math_descriptor ltc_mp; + +int ltc_init_multi(void **a, ...); +void ltc_deinit_multi(void *a, ...); + +#ifdef LTM_DESC +extern const ltc_math_descriptor ltm_desc; +#endif + +#ifdef TFM_DESC +extern const ltc_math_descriptor tfm_desc; +#endif + +#ifdef GMP_DESC +extern const ltc_math_descriptor gmp_desc; +#endif + +#if !defined(DESC_DEF_ONLY) && defined(LTC_SOURCE) + +#define MP_DIGIT_BIT ltc_mp.bits_per_digit + +/* some handy macros */ +#define mp_init(a) ltc_mp.init(a) +#define mp_init_multi ltc_init_multi +#define mp_clear(a) ltc_mp.deinit(a) +#define mp_clear_multi ltc_deinit_multi +#define mp_init_copy(a, b) ltc_mp.init_copy(a, b) + +#define mp_neg(a, b) ltc_mp.neg(a, b) +#define mp_copy(a, b) ltc_mp.copy(a, b) + +#define mp_set(a, b) ltc_mp.set_int(a, b) +#define mp_set_int(a, b) ltc_mp.set_int(a, b) +#define mp_get_int(a) ltc_mp.get_int(a) +#define mp_get_digit(a, n) ltc_mp.get_digit(a, n) +#define mp_get_digit_count(a) ltc_mp.get_digit_count(a) +#define mp_cmp(a, b) ltc_mp.compare(a, b) +#define mp_cmp_d(a, b) ltc_mp.compare_d(a, b) +#define mp_count_bits(a) ltc_mp.count_bits(a) +#define mp_cnt_lsb(a) ltc_mp.count_lsb_bits(a) +#define mp_2expt(a, b) ltc_mp.twoexpt(a, b) + +#define mp_read_radix(a, b, c) ltc_mp.read_radix(a, b, c) +#define mp_toradix(a, b, c) ltc_mp.write_radix(a, b, c) +#define mp_unsigned_bin_size(a) ltc_mp.unsigned_size(a) +#define mp_to_unsigned_bin(a, b) ltc_mp.unsigned_write(a, b) +#define mp_read_unsigned_bin(a, b, c) ltc_mp.unsigned_read(a, b, c) + +#define mp_add(a, b, c) ltc_mp.add(a, b, c) +#define mp_add_d(a, b, c) ltc_mp.addi(a, b, c) +#define mp_sub(a, b, c) ltc_mp.sub(a, b, c) +#define mp_sub_d(a, b, c) ltc_mp.subi(a, b, c) +#define mp_mul(a, b, c) ltc_mp.mul(a, b, c) +#define mp_mul_d(a, b, c) ltc_mp.muli(a, b, c) +#define mp_sqr(a, b) ltc_mp.sqr(a, b) +#define mp_div(a, b, c, d) ltc_mp.mpdiv(a, b, c, d) +#define mp_div_2(a, b) ltc_mp.div_2(a, b) +#define mp_mod(a, b, c) ltc_mp.mpdiv(a, b, NULL, c) +#define mp_mod_d(a, b, c) ltc_mp.modi(a, b, c) +#define mp_gcd(a, b, c) ltc_mp.gcd(a, b, c) +#define mp_lcm(a, b, c) ltc_mp.lcm(a, b, c) + +#define mp_mulmod(a, b, c, d) ltc_mp.mulmod(a, b, c, d) +#define mp_sqrmod(a, b, c) ltc_mp.sqrmod(a, b, c) +#define mp_invmod(a, b, c) ltc_mp.invmod(a, b, c) + +#define mp_montgomery_setup(a, b) ltc_mp.montgomery_setup(a, b) +#define mp_montgomery_normalization(a, b) ltc_mp.montgomery_normalization(a, b) +#define mp_montgomery_reduce(a, b, c) ltc_mp.montgomery_reduce(a, b, c) +#define mp_montgomery_free(a) ltc_mp.montgomery_deinit(a) + +#define mp_exptmod(a,b,c,d) ltc_mp.exptmod(a,b,c,d) +#define mp_prime_is_prime(a, b, c) ltc_mp.isprime(a, c) + +#define mp_iszero(a) (mp_cmp_d(a, 0) == LTC_MP_EQ ? LTC_MP_YES : LTC_MP_NO) +#define mp_isodd(a) (mp_get_digit_count(a) > 0 ? (mp_get_digit(a, 0) & 1 ? LTC_MP_YES : LTC_MP_NO) : LTC_MP_NO) +#define mp_exch(a, b) do { void *ABC__tmp = a; a = b; b = ABC__tmp; } while(0); + +#define mp_tohex(a, b) mp_toradix(a, b, 16) + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_math.h,v $ */ +/* $Revision: 1.43 $ */ +/* $Date: 2006/12/02 19:23:13 $ */ diff --git a/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_misc.h b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_misc.h new file mode 100644 index 0000000..0b444f8 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_misc.h @@ -0,0 +1,23 @@ +/* ---- BASE64 Routines ---- */ +#ifdef BASE64 +int base64_encode(const unsigned char *in, unsigned long len, + unsigned char *out, unsigned long *outlen); + +int base64_decode(const unsigned char *in, unsigned long len, + unsigned char *out, unsigned long *outlen); +#endif + +/* ---- MEM routines ---- */ +void zeromem(void *dst, size_t len); +void burn_stack(unsigned long len); + +const char *error_to_string(int err); + +extern const char *crypt_build_settings; + +/* ---- HMM ---- */ +int crypt_fsa(void *mp, ...); + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_misc.h,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/11/06 03:03:01 $ */ diff --git a/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_pk.h b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_pk.h new file mode 100644 index 0000000..3a0d7ab --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_pk.h @@ -0,0 +1,544 @@ +/* ---- NUMBER THEORY ---- */ + +enum { + PK_PUBLIC=0, + PK_PRIVATE=1 +}; + +int rand_prime(void *N, long len, prng_state *prng, int wprng); + +/* ---- RSA ---- */ +#ifdef MRSA + +/* Min and Max RSA key sizes (in bits) */ +#define MIN_RSA_SIZE 1024 +#define MAX_RSA_SIZE 4096 + +/** RSA PKCS style key */ +typedef struct Rsa_key { + /** Type of key, PK_PRIVATE or PK_PUBLIC */ + int type; + /** The public exponent */ + void *e; + /** The private exponent */ + void *d; + /** The modulus */ + void *N; + /** The p factor of N */ + void *p; + /** The q factor of N */ + void *q; + /** The 1/q mod p CRT param */ + void *qP; + /** The d mod (p - 1) CRT param */ + void *dP; + /** The d mod (q - 1) CRT param */ + void *dQ; +} rsa_key; + +int rsa_make_key(prng_state *prng, int wprng, int size, long e, rsa_key *key); + +int rsa_exptmod(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, int which, + rsa_key *key); + +void rsa_free(rsa_key *key); + +/* These use PKCS #1 v2.0 padding */ +#define rsa_encrypt_key(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _prng, _prng_idx, _hash_idx, _key) \ + rsa_encrypt_key_ex(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _prng, _prng_idx, _hash_idx, LTC_PKCS_1_OAEP, _key) + +#define rsa_decrypt_key(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _hash_idx, _stat, _key) \ + rsa_decrypt_key_ex(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _hash_idx, LTC_PKCS_1_OAEP, _stat, _key) + +#define rsa_sign_hash(_in, _inlen, _out, _outlen, _prng, _prng_idx, _hash_idx, _saltlen, _key) \ + rsa_sign_hash_ex(_in, _inlen, _out, _outlen, LTC_PKCS_1_PSS, _prng, _prng_idx, _hash_idx, _saltlen, _key) + +#define rsa_verify_hash(_sig, _siglen, _hash, _hashlen, _hash_idx, _saltlen, _stat, _key) \ + rsa_verify_hash_ex(_sig, _siglen, _hash, _hashlen, LTC_PKCS_1_PSS, _hash_idx, _saltlen, _stat, _key) + +/* These can be switched between PKCS #1 v2.x and PKCS #1 v1.5 paddings */ +int rsa_encrypt_key_ex(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, + const unsigned char *lparam, unsigned long lparamlen, + prng_state *prng, int prng_idx, int hash_idx, int padding, rsa_key *key); + +int rsa_decrypt_key_ex(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, + const unsigned char *lparam, unsigned long lparamlen, + int hash_idx, int padding, + int *stat, rsa_key *key); + +int rsa_sign_hash_ex(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, + int padding, + prng_state *prng, int prng_idx, + int hash_idx, unsigned long saltlen, + rsa_key *key); + +int rsa_verify_hash_ex(const unsigned char *sig, unsigned long siglen, + const unsigned char *hash, unsigned long hashlen, + int padding, + int hash_idx, unsigned long saltlen, + int *stat, rsa_key *key); + +/* PKCS #1 import/export */ +int rsa_export(unsigned char *out, unsigned long *outlen, int type, rsa_key *key); +int rsa_import(const unsigned char *in, unsigned long inlen, rsa_key *key); + +#endif + +/* ---- Katja ---- */ +#ifdef MKAT + +/* Min and Max KAT key sizes (in bits) */ +#define MIN_KAT_SIZE 1024 +#define MAX_KAT_SIZE 4096 + +/** Katja PKCS style key */ +typedef struct KAT_key { + /** Type of key, PK_PRIVATE or PK_PUBLIC */ + int type; + /** The private exponent */ + void *d; + /** The modulus */ + void *N; + /** The p factor of N */ + void *p; + /** The q factor of N */ + void *q; + /** The 1/q mod p CRT param */ + void *qP; + /** The d mod (p - 1) CRT param */ + void *dP; + /** The d mod (q - 1) CRT param */ + void *dQ; + /** The pq param */ + void *pq; +} katja_key; + +int katja_make_key(prng_state *prng, int wprng, int size, katja_key *key); + +int katja_exptmod(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, int which, + katja_key *key); + +void katja_free(katja_key *key); + +/* These use PKCS #1 v2.0 padding */ +int katja_encrypt_key(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, + const unsigned char *lparam, unsigned long lparamlen, + prng_state *prng, int prng_idx, int hash_idx, katja_key *key); + +int katja_decrypt_key(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, + const unsigned char *lparam, unsigned long lparamlen, + int hash_idx, int *stat, + katja_key *key); + +/* PKCS #1 import/export */ +int katja_export(unsigned char *out, unsigned long *outlen, int type, katja_key *key); +int katja_import(const unsigned char *in, unsigned long inlen, katja_key *key); + +#endif + +/* ---- ECC Routines ---- */ +#ifdef MECC + +/* size of our temp buffers for exported keys */ +#define ECC_BUF_SIZE 256 + +/* max private key size */ +#define ECC_MAXSIZE 66 + +/** Structure defines a NIST GF(p) curve */ +typedef struct { + /** The size of the curve in octets */ + int size; + + /** name of curve */ + char *name; + + /** The prime that defines the field the curve is in (encoded in hex) */ + char *prime; + + /** The fields B param (hex) */ + char *B; + + /** The order of the curve (hex) */ + char *order; + + /** The x co-ordinate of the base point on the curve (hex) */ + char *Gx; + + /** The y co-ordinate of the base point on the curve (hex) */ + char *Gy; +} ltc_ecc_set_type; + +/** A point on a ECC curve, stored in Jacbobian format such that (x,y,z) => (x/z^2, y/z^3, 1) when interpretted as affine */ +typedef struct { + /** The x co-ordinate */ + void *x; + + /** The y co-ordinate */ + void *y; + + /** The z co-ordinate */ + void *z; +} ecc_point; + +/** An ECC key */ +typedef struct { + /** Type of key, PK_PRIVATE or PK_PUBLIC */ + int type; + + /** Index into the ltc_ecc_sets[] for the parameters of this curve; if -1, then this key is using user supplied curve in dp */ + int idx; + + /** pointer to domain parameters; either points to NIST curves (identified by idx >= 0) or user supplied curve */ + const ltc_ecc_set_type *dp; + + /** The public key */ + ecc_point pubkey; + + /** The private key */ + void *k; +} ecc_key; + +/** the ECC params provided */ +extern const ltc_ecc_set_type ltc_ecc_sets[]; + +int ecc_test(void); +void ecc_sizes(int *low, int *high); +int ecc_get_size(ecc_key *key); + +int ecc_make_key(prng_state *prng, int wprng, int keysize, ecc_key *key); +int ecc_make_key_ex(prng_state *prng, int wprng, ecc_key *key, const ltc_ecc_set_type *dp); +void ecc_free(ecc_key *key); + +int ecc_export(unsigned char *out, unsigned long *outlen, int type, ecc_key *key); +int ecc_import(const unsigned char *in, unsigned long inlen, ecc_key *key); +int ecc_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, const ltc_ecc_set_type *dp); + +int ecc_ansi_x963_export(ecc_key *key, unsigned char *out, unsigned long *outlen); +int ecc_ansi_x963_import(const unsigned char *in, unsigned long inlen, ecc_key *key); +int ecc_ansi_x963_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, ltc_ecc_set_type *dp); + +int ecc_shared_secret(ecc_key *private_key, ecc_key *public_key, + unsigned char *out, unsigned long *outlen); + +int ecc_encrypt_key(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, + prng_state *prng, int wprng, int hash, + ecc_key *key); + +int ecc_decrypt_key(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, + ecc_key *key); + +int ecc_sign_hash(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, + prng_state *prng, int wprng, ecc_key *key); + +int ecc_verify_hash(const unsigned char *sig, unsigned long siglen, + const unsigned char *hash, unsigned long hashlen, + int *stat, ecc_key *key); + +/* low level functions */ +ecc_point *ltc_ecc_new_point(void); +void ltc_ecc_del_point(ecc_point *p); +int ltc_ecc_is_valid_idx(int n); + +/* point ops (mp == montgomery digit) */ +#if !defined(MECC_ACCEL) || defined(LTM_DESC) || defined(GMP_DESC) +/* R = 2P */ +int ltc_ecc_projective_dbl_point(ecc_point *P, ecc_point *R, void *modulus, void *mp); + +/* R = P + Q */ +int ltc_ecc_projective_add_point(ecc_point *P, ecc_point *Q, ecc_point *R, void *modulus, void *mp); +#endif + +#if defined(MECC_FP) +int ltc_ecc_fp_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map); +int ltc_ecc_fp_save_state(unsigned char **out, unsigned long *outlen); +int ltc_ecc_fp_restore_state(unsigned char *in, unsigned long inlen); +void ltc_ecc_fp_free(void); +#endif + +/* R = kG */ +int ltc_ecc_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map); + +#ifdef LTC_ECC_SHAMIR +/* kA*A + kB*B = C */ +int ltc_ecc_mul2add(ecc_point *A, void *kA, + ecc_point *B, void *kB, + ecc_point *C, + void *modulus); + +#ifdef MECC_FP +int ltc_ecc_fp_mul2add(ecc_point *A, void *kA, + ecc_point *B, void *kB, + ecc_point *C, void *modulus); +#endif + +#endif + + +/* map P to affine from projective */ +int ltc_ecc_map(ecc_point *P, void *modulus, void *mp); + +#endif + +#ifdef MDSA + +/* Max diff between group and modulus size in bytes */ +#define MDSA_DELTA 512 + +/* Max DSA group size in bytes (default allows 4k-bit groups) */ +#define MDSA_MAX_GROUP 512 + +/** DSA key structure */ +typedef struct { + /** The key type, PK_PRIVATE or PK_PUBLIC */ + int type; + + /** The order of the sub-group used in octets */ + int qord; + + /** The generator */ + void *g; + + /** The prime used to generate the sub-group */ + void *q; + + /** The large prime that generats the field the contains the sub-group */ + void *p; + + /** The private key */ + void *x; + + /** The public key */ + void *y; +} dsa_key; + +int dsa_make_key(prng_state *prng, int wprng, int group_size, int modulus_size, dsa_key *key); +void dsa_free(dsa_key *key); + +int dsa_sign_hash_raw(const unsigned char *in, unsigned long inlen, + void *r, void *s, + prng_state *prng, int wprng, dsa_key *key); + +int dsa_sign_hash(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, + prng_state *prng, int wprng, dsa_key *key); + +int dsa_verify_hash_raw( void *r, void *s, + const unsigned char *hash, unsigned long hashlen, + int *stat, dsa_key *key); + +int dsa_verify_hash(const unsigned char *sig, unsigned long siglen, + const unsigned char *hash, unsigned long hashlen, + int *stat, dsa_key *key); + +int dsa_encrypt_key(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, + prng_state *prng, int wprng, int hash, + dsa_key *key); + +int dsa_decrypt_key(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen, + dsa_key *key); + +int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key); +int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key); +int dsa_verify_key(dsa_key *key, int *stat); + +int dsa_shared_secret(void *private_key, void *base, + dsa_key *public_key, + unsigned char *out, unsigned long *outlen); +#endif + +#ifdef LTC_DER +/* DER handling */ + +enum { + LTC_ASN1_EOL, + LTC_ASN1_BOOLEAN, + LTC_ASN1_INTEGER, + LTC_ASN1_SHORT_INTEGER, + LTC_ASN1_BIT_STRING, + LTC_ASN1_OCTET_STRING, + LTC_ASN1_NULL, + LTC_ASN1_OBJECT_IDENTIFIER, + LTC_ASN1_IA5_STRING, + LTC_ASN1_PRINTABLE_STRING, + LTC_ASN1_UTF8_STRING, + LTC_ASN1_UTCTIME, + LTC_ASN1_CHOICE, + LTC_ASN1_SEQUENCE, + LTC_ASN1_SET, + LTC_ASN1_SETOF +}; + +/** A LTC ASN.1 list type */ +typedef struct ltc_asn1_list_ { + /** The LTC ASN.1 enumerated type identifier */ + int type; + /** The data to encode or place for decoding */ + void *data; + /** The size of the input or resulting output */ + unsigned long size; + /** The used flag, this is used by the CHOICE ASN.1 type to indicate which choice was made */ + int used; + /** prev/next entry in the list */ + struct ltc_asn1_list_ *prev, *next, *child, *parent; +} ltc_asn1_list; + +#define LTC_SET_ASN1(list, index, Type, Data, Size) \ + do { \ + int LTC_MACRO_temp = (index); \ + ltc_asn1_list *LTC_MACRO_list = (list); \ + LTC_MACRO_list[LTC_MACRO_temp].type = (Type); \ + LTC_MACRO_list[LTC_MACRO_temp].data = (void*)(Data); \ + LTC_MACRO_list[LTC_MACRO_temp].size = (Size); \ + LTC_MACRO_list[LTC_MACRO_temp].used = 0; \ + } while (0); + +/* SEQUENCE */ +int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, + unsigned char *out, unsigned long *outlen, int type_of); + +#define der_encode_sequence(list, inlen, out, outlen) der_encode_sequence_ex(list, inlen, out, outlen, LTC_ASN1_SEQUENCE) + +int der_decode_sequence_ex(const unsigned char *in, unsigned long inlen, + ltc_asn1_list *list, unsigned long outlen, int ordered); + +#define der_decode_sequence(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, 1) + +int der_length_sequence(ltc_asn1_list *list, unsigned long inlen, + unsigned long *outlen); + +/* SET */ +#define der_decode_set(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, 0) +#define der_length_set der_length_sequence +int der_encode_set(ltc_asn1_list *list, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + +int der_encode_setof(ltc_asn1_list *list, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + +/* VA list handy helpers with triplets of */ +int der_encode_sequence_multi(unsigned char *out, unsigned long *outlen, ...); +int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...); + +/* FLEXI DECODER handle unknown list decoder */ +int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc_asn1_list **out); +void der_free_sequence_flexi(ltc_asn1_list *list); +void der_sequence_free(ltc_asn1_list *in); + +/* BOOLEAN */ +int der_length_boolean(unsigned long *outlen); +int der_encode_boolean(int in, + unsigned char *out, unsigned long *outlen); +int der_decode_boolean(const unsigned char *in, unsigned long inlen, + int *out); +/* INTEGER */ +int der_encode_integer(void *num, unsigned char *out, unsigned long *outlen); +int der_decode_integer(const unsigned char *in, unsigned long inlen, void *num); +int der_length_integer(void *num, unsigned long *len); + +/* INTEGER -- handy for 0..2^32-1 values */ +int der_decode_short_integer(const unsigned char *in, unsigned long inlen, unsigned long *num); +int der_encode_short_integer(unsigned long num, unsigned char *out, unsigned long *outlen); +int der_length_short_integer(unsigned long num, unsigned long *outlen); + +/* BIT STRING */ +int der_encode_bit_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_decode_bit_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_length_bit_string(unsigned long nbits, unsigned long *outlen); + +/* OCTET STRING */ +int der_encode_octet_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_decode_octet_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_length_octet_string(unsigned long noctets, unsigned long *outlen); + +/* OBJECT IDENTIFIER */ +int der_encode_object_identifier(unsigned long *words, unsigned long nwords, + unsigned char *out, unsigned long *outlen); +int der_decode_object_identifier(const unsigned char *in, unsigned long inlen, + unsigned long *words, unsigned long *outlen); +int der_length_object_identifier(unsigned long *words, unsigned long nwords, unsigned long *outlen); +unsigned long der_object_identifier_bits(unsigned long x); + +/* IA5 STRING */ +int der_encode_ia5_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_decode_ia5_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_length_ia5_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen); + +int der_ia5_char_encode(int c); +int der_ia5_value_decode(int v); + +/* Printable STRING */ +int der_encode_printable_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_decode_printable_string(const unsigned char *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); +int der_length_printable_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen); + +int der_printable_char_encode(int c); +int der_printable_value_decode(int v); + +/* UTF-8 */ +#if (defined(SIZE_MAX) || __STDC_VERSION__ >= 199901L || defined(WCHAR_MAX) || defined(_WCHAR_T) || defined(_WCHAR_T_DEFINED)) && !defined(LTC_NO_WCHAR) +#include +#else +typedef ulong32 wchar_t; +#endif + +int der_encode_utf8_string(const wchar_t *in, unsigned long inlen, + unsigned char *out, unsigned long *outlen); + +int der_decode_utf8_string(const unsigned char *in, unsigned long inlen, + wchar_t *out, unsigned long *outlen); +unsigned long der_utf8_charsize(const wchar_t c); +int der_length_utf8_string(const wchar_t *in, unsigned long noctets, unsigned long *outlen); + + +/* CHOICE */ +int der_decode_choice(const unsigned char *in, unsigned long *inlen, + ltc_asn1_list *list, unsigned long outlen); + +/* UTCTime */ +typedef struct { + unsigned YY, /* year */ + MM, /* month */ + DD, /* day */ + hh, /* hour */ + mm, /* minute */ + ss, /* second */ + off_dir, /* timezone offset direction 0 == +, 1 == - */ + off_hh, /* timezone offset hours */ + off_mm; /* timezone offset minutes */ +} ltc_utctime; + +int der_encode_utctime(ltc_utctime *utctime, + unsigned char *out, unsigned long *outlen); + +int der_decode_utctime(const unsigned char *in, unsigned long *inlen, + ltc_utctime *out); + +int der_length_utctime(ltc_utctime *utctime, unsigned long *outlen); + + +#endif + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_pk.h,v $ */ +/* $Revision: 1.77 $ */ +/* $Date: 2006/12/03 00:39:56 $ */ diff --git a/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_pkcs.h b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_pkcs.h new file mode 100644 index 0000000..71bcdb9 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_pkcs.h @@ -0,0 +1,89 @@ +/* PKCS Header Info */ + +/* ===> PKCS #1 -- RSA Cryptography <=== */ +#ifdef PKCS_1 + +enum ltc_pkcs_1_v1_5_blocks +{ + LTC_PKCS_1_EMSA = 1, /* Block type 1 (PKCS #1 v1.5 signature padding) */ + LTC_PKCS_1_EME = 2 /* Block type 2 (PKCS #1 v1.5 encryption padding) */ +}; + +enum ltc_pkcs_1_paddings +{ + LTC_PKCS_1_V1_5 = 1, /* PKCS #1 v1.5 padding (\sa ltc_pkcs_1_v1_5_blocks) */ + LTC_PKCS_1_OAEP = 2, /* PKCS #1 v2.0 encryption padding */ + LTC_PKCS_1_PSS = 3 /* PKCS #1 v2.1 signature padding */ +}; + +int pkcs_1_mgf1( int hash_idx, + const unsigned char *seed, unsigned long seedlen, + unsigned char *mask, unsigned long masklen); + +int pkcs_1_i2osp(void *n, unsigned long modulus_len, unsigned char *out); +int pkcs_1_os2ip(void *n, unsigned char *in, unsigned long inlen); + +/* *** v1.5 padding */ +int pkcs_1_v1_5_encode(const unsigned char *msg, + unsigned long msglen, + int block_type, + unsigned long modulus_bitlen, + prng_state *prng, + int prng_idx, + unsigned char *out, + unsigned long *outlen); + +int pkcs_1_v1_5_decode(const unsigned char *msg, + unsigned long msglen, + int block_type, + unsigned long modulus_bitlen, + unsigned char *out, + unsigned long *outlen, + int *is_valid); + +/* *** v2.1 padding */ +int pkcs_1_oaep_encode(const unsigned char *msg, unsigned long msglen, + const unsigned char *lparam, unsigned long lparamlen, + unsigned long modulus_bitlen, prng_state *prng, + int prng_idx, int hash_idx, + unsigned char *out, unsigned long *outlen); + +int pkcs_1_oaep_decode(const unsigned char *msg, unsigned long msglen, + const unsigned char *lparam, unsigned long lparamlen, + unsigned long modulus_bitlen, int hash_idx, + unsigned char *out, unsigned long *outlen, + int *res); + +int pkcs_1_pss_encode(const unsigned char *msghash, unsigned long msghashlen, + unsigned long saltlen, prng_state *prng, + int prng_idx, int hash_idx, + unsigned long modulus_bitlen, + unsigned char *out, unsigned long *outlen); + +int pkcs_1_pss_decode(const unsigned char *msghash, unsigned long msghashlen, + const unsigned char *sig, unsigned long siglen, + unsigned long saltlen, int hash_idx, + unsigned long modulus_bitlen, int *res); + +#endif /* PKCS_1 */ + +/* ===> PKCS #5 -- Password Based Cryptography <=== */ +#ifdef PKCS_5 + +/* Algorithm #1 (old) */ +int pkcs_5_alg1(const unsigned char *password, unsigned long password_len, + const unsigned char *salt, + int iteration_count, int hash_idx, + unsigned char *out, unsigned long *outlen); + +/* Algorithm #2 (new) */ +int pkcs_5_alg2(const unsigned char *password, unsigned long password_len, + const unsigned char *salt, unsigned long salt_len, + int iteration_count, int hash_idx, + unsigned char *out, unsigned long *outlen); + +#endif /* PKCS_5 */ + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_pkcs.h,v $ */ +/* $Revision: 1.7 $ */ +/* $Date: 2006/11/15 12:44:59 $ */ diff --git a/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_prng.h b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_prng.h new file mode 100644 index 0000000..dd640c9 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/libtom/tomcrypt_prng.h @@ -0,0 +1,199 @@ +/* ---- PRNG Stuff ---- */ +#ifdef YARROW +struct yarrow_prng { + int cipher, hash; + unsigned char pool[MAXBLOCKSIZE]; + symmetric_CTR ctr; + LTC_MUTEX_TYPE(prng_lock) +}; +#endif + +#ifdef RC4 +struct rc4_prng { + int x, y; + unsigned char buf[256]; +}; +#endif + +#ifdef FORTUNA +struct fortuna_prng { + hash_state pool[FORTUNA_POOLS]; /* the pools */ + + symmetric_key skey; + + unsigned char K[32], /* the current key */ + IV[16]; /* IV for CTR mode */ + + unsigned long pool_idx, /* current pool we will add to */ + pool0_len, /* length of 0'th pool */ + wd; + + ulong64 reset_cnt; /* number of times we have reset */ + LTC_MUTEX_TYPE(prng_lock) +}; +#endif + +#ifdef SOBER128 +struct sober128_prng { + ulong32 R[17], /* Working storage for the shift register */ + initR[17], /* saved register contents */ + konst, /* key dependent constant */ + sbuf; /* partial word encryption buffer */ + + int nbuf, /* number of part-word stream bits buffered */ + flag, /* first add_entropy call or not? */ + set; /* did we call add_entropy to set key? */ + +}; +#endif + +typedef union Prng_state { + char dummy[1]; +#ifdef YARROW + struct yarrow_prng yarrow; +#endif +#ifdef RC4 + struct rc4_prng rc4; +#endif +#ifdef FORTUNA + struct fortuna_prng fortuna; +#endif +#ifdef SOBER128 + struct sober128_prng sober128; +#endif +} prng_state; + +/** PRNG descriptor */ +extern struct ltc_prng_descriptor { + /** Name of the PRNG */ + char *name; + /** size in bytes of exported state */ + int export_size; + /** Start a PRNG state + @param prng [out] The state to initialize + @return CRYPT_OK if successful + */ + int (*start)(prng_state *prng); + /** Add entropy to the PRNG + @param in The entropy + @param inlen Length of the entropy (octets)\ + @param prng The PRNG state + @return CRYPT_OK if successful + */ + int (*add_entropy)(const unsigned char *in, unsigned long inlen, prng_state *prng); + /** Ready a PRNG state to read from + @param prng The PRNG state to ready + @return CRYPT_OK if successful + */ + int (*ready)(prng_state *prng); + /** Read from the PRNG + @param out [out] Where to store the data + @param outlen Length of data desired (octets) + @param prng The PRNG state to read from + @return Number of octets read + */ + unsigned long (*read)(unsigned char *out, unsigned long outlen, prng_state *prng); + /** Terminate a PRNG state + @param prng The PRNG state to terminate + @return CRYPT_OK if successful + */ + int (*done)(prng_state *prng); + /** Export a PRNG state + @param out [out] The destination for the state + @param outlen [in/out] The max size and resulting size of the PRNG state + @param prng The PRNG to export + @return CRYPT_OK if successful + */ + int (*pexport)(unsigned char *out, unsigned long *outlen, prng_state *prng); + /** Import a PRNG state + @param in The data to import + @param inlen The length of the data to import (octets) + @param prng The PRNG to initialize/import + @return CRYPT_OK if successful + */ + int (*pimport)(const unsigned char *in, unsigned long inlen, prng_state *prng); + /** Self-test the PRNG + @return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled + */ + int (*test)(void); +} prng_descriptor[]; + +#ifdef YARROW +int yarrow_start(prng_state *prng); +int yarrow_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng); +int yarrow_ready(prng_state *prng); +unsigned long yarrow_read(unsigned char *out, unsigned long outlen, prng_state *prng); +int yarrow_done(prng_state *prng); +int yarrow_export(unsigned char *out, unsigned long *outlen, prng_state *prng); +int yarrow_import(const unsigned char *in, unsigned long inlen, prng_state *prng); +int yarrow_test(void); +extern const struct ltc_prng_descriptor yarrow_desc; +#endif + +#ifdef FORTUNA +int fortuna_start(prng_state *prng); +int fortuna_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng); +int fortuna_ready(prng_state *prng); +unsigned long fortuna_read(unsigned char *out, unsigned long outlen, prng_state *prng); +int fortuna_done(prng_state *prng); +int fortuna_export(unsigned char *out, unsigned long *outlen, prng_state *prng); +int fortuna_import(const unsigned char *in, unsigned long inlen, prng_state *prng); +int fortuna_test(void); +extern const struct ltc_prng_descriptor fortuna_desc; +#endif + +#ifdef RC4 +int rc4_start(prng_state *prng); +int rc4_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng); +int rc4_ready(prng_state *prng); +unsigned long rc4_read(unsigned char *out, unsigned long outlen, prng_state *prng); +int rc4_done(prng_state *prng); +int rc4_export(unsigned char *out, unsigned long *outlen, prng_state *prng); +int rc4_import(const unsigned char *in, unsigned long inlen, prng_state *prng); +int rc4_test(void); +extern const struct ltc_prng_descriptor rc4_desc; +#endif + +#ifdef SPRNG +int sprng_start(prng_state *prng); +int sprng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng); +int sprng_ready(prng_state *prng); +unsigned long sprng_read(unsigned char *out, unsigned long outlen, prng_state *prng); +int sprng_done(prng_state *prng); +int sprng_export(unsigned char *out, unsigned long *outlen, prng_state *prng); +int sprng_import(const unsigned char *in, unsigned long inlen, prng_state *prng); +int sprng_test(void); +extern const struct ltc_prng_descriptor sprng_desc; +#endif + +#ifdef SOBER128 +int sober128_start(prng_state *prng); +int sober128_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng); +int sober128_ready(prng_state *prng); +unsigned long sober128_read(unsigned char *out, unsigned long outlen, prng_state *prng); +int sober128_done(prng_state *prng); +int sober128_export(unsigned char *out, unsigned long *outlen, prng_state *prng); +int sober128_import(const unsigned char *in, unsigned long inlen, prng_state *prng); +int sober128_test(void); +extern const struct ltc_prng_descriptor sober128_desc; +#endif + +int find_prng(const char *name); +int register_prng(const struct ltc_prng_descriptor *prng); +int unregister_prng(const struct ltc_prng_descriptor *prng); +int prng_is_valid(int idx); +LTC_MUTEX_PROTO(ltc_prng_mutex) + +/* Slow RNG you **might** be able to use to seed a PRNG with. Be careful as this + * might not work on all platforms as planned + */ +unsigned long rng_get_bytes(unsigned char *out, + unsigned long outlen, + void (*callback)(void)); + +int rng_make_prng(int bits, int wprng, prng_state *prng, void (*callback)(void)); + + +/* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_prng.h,v $ */ +/* $Revision: 1.8 $ */ +/* $Date: 2006/11/05 01:36:43 $ */ diff --git a/Cryptography/pycrypto-2.6.1/src/pycrypto_compat.h b/Cryptography/pycrypto-2.6.1/src/pycrypto_compat.h new file mode 100644 index 0000000..eaaebdb --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/pycrypto_compat.h @@ -0,0 +1,77 @@ +/* + * pycrypto_compat.h: Compatibility with older versions of Python + * + * Written in 2008 by Dwayne C. Litzenberger + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + */ +#ifndef PYCRYPTO_COMPAT_H +#define PYCRYPTO_COMPAT_H +#include "Python.h" + +/* + * Python 3.x defines, for conditional compiles + */ + +#if PY_MAJOR_VERSION >= 3 +#define IS_PY3K +#else +#define PyBytes_GET_SIZE PyString_GET_SIZE +#define PyBytes_FromStringAndSize PyString_FromStringAndSize +#define PyBytes_AS_STRING PyString_AS_STRING +#define PyBytes_Check PyString_Check +#define PyBytes_Size PyString_Size +#define PyBytes_AsString PyString_AsString +#define PyBytesObject PyStringObject +#if PY_MINOR_VERSION <= 5 /* PyUnicode_FromString exists from Python 2.6 on up */ +#define PyUnicode_FromString PyString_FromString +#endif +#endif + +/* + * Py_CLEAR for Python < 2.4 + * See http://docs.python.org/api/countingRefs.html + */ +#if PY_VERSION_HEX < 0x02040000 && !defined(Py_CLEAR) +#define Py_CLEAR(obj) \ + do {\ + PyObject *tmp = (PyObject *)(obj);\ + (obj) = NULL;\ + Py_XDECREF(tmp);\ + } while(0) +#endif + +/* + * Compatibility code for Python < 2.5 (see PEP 353) + * PEP 353 has been placed into the public domain, so we can use this code + * without restriction. + */ +#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) +typedef int Py_ssize_t; +#define PY_SSIZE_T_MAX INT_MAX +#define PY_SSIZE_T_MIN INT_MIN +#endif + +/* Compatibility code for Python < 2.3 */ +#if PY_VERSION_HEX < 0x02030000 +typedef void PyMODINIT_FUNC; +#endif + +#endif /* PYCRYPTO_COMPAT_H */ +/* vim:set ts=4 sw=4 sts=4 expandtab: */ diff --git a/Cryptography/pycrypto-2.6.1/src/stream_template.c b/Cryptography/pycrypto-2.6.1/src/stream_template.c new file mode 100644 index 0000000..c3effa4 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/stream_template.c @@ -0,0 +1,364 @@ +/* -*- C -*- */ + +/* + * stream_template.c : Generic framework for stream ciphers + * + * Written by Andrew Kuchling and others + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef _HAVE_STDC_HEADERS +#include +#endif + +#include "Python.h" +#include "pycrypto_compat.h" +#include "modsupport.h" + +#define _STR(x) #x +#define _XSTR(x) _STR(x) +#define _PASTE(x,y) x##y +#define _PASTE2(x,y) _PASTE(x,y) +#ifdef IS_PY3K +#define _MODULE_NAME _PASTE2(PyInit_,MODULE_NAME) +#else +#define _MODULE_NAME _PASTE2(init,MODULE_NAME) +#endif +#define _MODULE_STRING _XSTR(MODULE_NAME) + + /* + * + * Python interface + * + */ + +typedef struct +{ + PyObject_HEAD + stream_state st; +} ALGobject; + +/* Please see PEP3123 for a discussion of PyObject_HEAD and changes made in 3.x to make it conform to Standard C. + * These changes also dictate using Py_TYPE to check type, and PyVarObject_HEAD_INIT(NULL, 0) to initialize + */ +#ifdef IS_PY3K +static PyTypeObject ALGtype; +#define is_ALGobject(v) (Py_TYPE(v) == &ALGtype) +#else +staticforward PyTypeObject ALGtype; +#define is_ALGobject(v) ((v)->ob_type == &ALGtype) +#define PyLong_FromLong PyInt_FromLong /* For Python 2.x */ +#endif + +static ALGobject * +newALGobject(void) +{ + ALGobject * new; + new = PyObject_New(ALGobject, &ALGtype); + return new; +} + +static void +ALGdealloc(PyObject *ptr) +{ + ALGobject *self = (ALGobject *)ptr; + + /* Overwrite the contents of the object */ + memset((char*)&(self->st), 0, sizeof(stream_state)); + PyObject_Del(ptr); +} + +static char ALGnew__doc__[] = +"Return a new " _MODULE_STRING " encryption object."; + +static char *kwlist[] = {"key", NULL}; + +static ALGobject * +ALGnew(PyObject *self, PyObject *args, PyObject *kwdict) +{ + unsigned char *key; + ALGobject * new; + int keylen; + + new = newALGobject(); + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "s#", kwlist, + &key, &keylen)) + { + Py_DECREF(new); + return NULL; + } + + if (KEY_SIZE!=0 && keylen != KEY_SIZE) + { + PyErr_SetString(PyExc_ValueError, + _MODULE_STRING " key must be " + "KEY_SIZE bytes long"); + return NULL; + } + if (KEY_SIZE== 0 && keylen == 0) + { + PyErr_SetString(PyExc_ValueError, + _MODULE_STRING " key cannot be " + "the null string (0 bytes long)"); + return NULL; + } + stream_init(&(new->st), key, keylen); + if (PyErr_Occurred()) + { + Py_DECREF(new); + return NULL; + } + return new; +} + +static char ALG_Encrypt__doc__[] = +"Decrypt the provided string of binary data."; + +static PyObject * +ALG_Encrypt(ALGobject *self, PyObject *args) +{ + unsigned char *buffer, *str; + int len; + PyObject *result; + + if (!PyArg_Parse(args, "s#", &str, &len)) + return NULL; + if (len == 0) /* Handle empty string */ + { + return PyBytes_FromStringAndSize(NULL, 0); + } + buffer = malloc(len); + if (buffer == NULL) + { + PyErr_SetString(PyExc_MemoryError, "No memory available in " + _MODULE_STRING " encrypt"); + return NULL; + } + Py_BEGIN_ALLOW_THREADS; + memcpy(buffer, str, len); + stream_encrypt(&(self->st), buffer, len); + Py_END_ALLOW_THREADS; + result = PyBytes_FromStringAndSize((char *)buffer, len); + free(buffer); + return (result); +} + +static char ALG_Decrypt__doc__[] = +"decrypt(string): Decrypt the provided string of binary data."; + +static PyObject * +ALG_Decrypt(ALGobject *self, PyObject *args) +{ + unsigned char *buffer, *str; + int len; + PyObject *result; + + if (!PyArg_Parse(args, "s#", &str, &len)) + return NULL; + if (len == 0) /* Handle empty string */ + { + return PyBytes_FromStringAndSize(NULL, 0); + } + buffer = malloc(len); + if (buffer == NULL) + { + PyErr_SetString(PyExc_MemoryError, "No memory available in " + _MODULE_STRING " decrypt"); + return NULL; + } + Py_BEGIN_ALLOW_THREADS; + memcpy(buffer, str, len); + stream_decrypt(&(self->st), buffer, len); + Py_END_ALLOW_THREADS; + result = PyBytes_FromStringAndSize((char *)buffer, len); + free(buffer); + return (result); +} + +/* ALGobject methods */ +static PyMethodDef ALGmethods[] = + { +#ifdef IS_PY3K + {"encrypt", (PyCFunction) ALG_Encrypt, METH_O, ALG_Encrypt__doc__}, + {"decrypt", (PyCFunction) ALG_Decrypt, METH_O, ALG_Decrypt__doc__}, +#else + {"encrypt", (PyCFunction) ALG_Encrypt, 0, ALG_Encrypt__doc__}, + {"decrypt", (PyCFunction) ALG_Decrypt, 0, ALG_Decrypt__doc__}, +#endif + {NULL, NULL} /* sentinel */ + }; + +static PyObject * +#ifdef IS_PY3K +ALGgetattro(PyObject *self, PyObject *attr) +#else +ALGgetattr(PyObject *self, char *name) +#endif +{ +#ifdef IS_PY3K + if (!PyUnicode_Check(attr)) + goto generic; + + if (PyUnicode_CompareWithASCIIString(attr, "block_size") == 0) +#else + if (strcmp(name, "block_size") == 0) +#endif + { + return PyLong_FromLong(BLOCK_SIZE); + } +#ifdef IS_PY3K + if (PyUnicode_CompareWithASCIIString(attr, "key_size") == 0) +#else + if (strcmp(name, "key_size") == 0) +#endif + { + return PyLong_FromLong(KEY_SIZE); + } +#ifdef IS_PY3K + generic: + return PyObject_GenericGetAttr(self, attr); +#else + return Py_FindMethod(ALGmethods, self, name); +#endif +} + +/* List of functions defined in the module */ + +static struct PyMethodDef modulemethods[] = +{ + {"new", (PyCFunction) ALGnew, + METH_VARARGS|METH_KEYWORDS, ALGnew__doc__}, + {NULL, NULL} /* sentinel */ +}; + +static PyTypeObject ALGtype = + { +#ifdef IS_PY3K + PyVarObject_HEAD_INIT(NULL, 0) /* deferred type init for compilation on Windows, type will be filled in at runtime */ +#else + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ +#endif + _MODULE_STRING, /*tp_name*/ + sizeof(ALGobject), /*tp_size*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor) ALGdealloc, /*tp_dealloc*/ + 0, /*tp_print*/ +#ifdef IS_PY3K + 0, /*tp_getattr*/ +#else + ALGgetattr, /*tp_getattr*/ +#endif + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ +#ifdef IS_PY3K + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + ALGgetattro, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + ALGmethods, /*tp_methods*/ +#endif + }; + +#ifdef IS_PY3K + static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "Crypto.Cipher." _MODULE_STRING, + NULL, + -1, + modulemethods, + NULL, + NULL, + NULL, + NULL +}; +#endif + +/* Initialization function for the module */ + +/* Deal with old API in Python 2.1 */ +#if PYTHON_API_VERSION < 1011 +#define PyModule_AddIntConstant(m,n,v) {PyObject *o=PyInt_FromLong(v); \ + if (o!=NULL) \ + {PyDict_SetItemString(PyModule_GetDict(m),n,o); Py_DECREF(o);}} +#endif + +#ifdef IS_PY3K +PyMODINIT_FUNC +#else +void +#endif + _MODULE_NAME (void) + { + PyObject *m, *d, *x; + +#ifdef IS_PY3K + /* PyType_Ready automatically fills in ob_type with &PyType_Type if it's not already set */ + if (PyType_Ready(&ALGtype) < 0) + return NULL; + + /* Create the module and add the functions */ + m = PyModule_Create(&moduledef); + if (m == NULL) + return NULL; +#else + ALGtype.ob_type = &PyType_Type; + /* Create the module and add the functions */ + m = Py_InitModule("Crypto.Cipher." _MODULE_STRING, modulemethods); +#endif + + /* Add some symbolic constants to the module */ + d = PyModule_GetDict(m); + x = PyUnicode_FromString(_MODULE_STRING ".error"); + PyDict_SetItemString(d, "error", x); + + PyModule_AddIntConstant(m, "block_size", BLOCK_SIZE); + PyModule_AddIntConstant(m, "key_size", KEY_SIZE); + + /* Check for errors */ + if (PyErr_Occurred()) + Py_FatalError("can't initialize module " _MODULE_STRING); + +#ifdef IS_PY3K + return m; +#endif + } + +/* vim:set ts=4 sw=4 sts=0 noexpandtab: */ diff --git a/Cryptography/pycrypto-2.6.1/src/strxor.c b/Cryptography/pycrypto-2.6.1/src/strxor.c new file mode 100644 index 0000000..7cbbc1c --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/strxor.c @@ -0,0 +1,257 @@ +/* + * strxor.c: string XOR functions + * + * Written in 2008 by Dwayne C. Litzenberger + * + * =================================================================== + * The contents of this file are dedicated to the public domain. To + * the extent that dedication to the public domain is not available, + * everyone is granted a worldwide, perpetual, royalty-free, + * non-exclusive license to exercise all rights associated with the + * contents of this file for any purpose whatsoever. + * No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * =================================================================== + */ +#include "Python.h" +#include +#include +#include + +#include "pycrypto_compat.h" + +static const char rcsid[] = "$Id$"; + +/* + * xor_strings - XOR two strings together to produce a third string + * + * dest[0..n-1] := src_a[0..n-1] ^ src_b[0..n-1] + * + */ +static void +xor_strings(char *dest, const char *src_a, const char *src_b, size_t n) +{ + size_t i; + + /* assert no pointer overflow */ + assert(src_a + n > src_a); + assert(src_b + n > src_b); + assert(dest + n > dest); + + for (i = 0; i < n; i++) { + dest[i] = src_a[i] ^ src_b[i]; + } +} + +/* + * xor_string_with_char - XOR a string with a char to produce another string + * + * dest[0..n-1] := src[0..n-1] ^ c + * + */ +static void +xor_string_with_char(char *dest, const char *src, char c, size_t n) +{ + size_t i; + + /* assert no pointer overflow */ + assert(src + n > src); + assert(dest + n > dest); + + for (i = 0; i < n; i++) { + dest[i] = src[i] ^ c; + } +} + +/* + * "Import assertions" + * + * These runtime checks are performed when this module is first initialized + * + */ + +#define IMP_ASSERT(exp) do {\ + if (!(exp)) {\ + PyErr_Format(PyExc_AssertionError, "%s:%d: assertion failure: '%s'", __FILE__, __LINE__, #exp);\ + return;\ + }\ +} while(0) + +static void +runtime_test(void) +{ + /* size_t should be able to represent the length of any size buffer */ + IMP_ASSERT(sizeof(size_t) == sizeof(void *)); + + /* we must be able to perform the assignment (Py_ssize_t) -> (size_t) + * as long as the value is non-negative. */ + IMP_ASSERT(sizeof(size_t) >= sizeof(Py_ssize_t)); + + /* char must be one octet */ + IMP_ASSERT(sizeof(char) == 1); + + /* Perform a basic test of the xor_strings function, including a test for + * an off-by-one bug. */ + { + char x[7] = "\x00hello"; /* NUL + "hello" + NUL */ + char y[7] = "\xffworld"; /* 0xff + "world" + NUL */ + char z[9] = "[ABCDEFG]"; /* "[ABCDEFG]" + NUL */ + + xor_strings(z+1, x, y, 7); + IMP_ASSERT(!memcmp(z, "[\xff\x1f\x0a\x1e\x00\x0b\x00]", 9)); + } + + /* Perform a basic test of the xor_string_with_char function, including a test for + * an off-by-one bug. */ + { + char x[7] = "\x00hello"; /* NUL + "hello" + NUL */ + char y = 170; /* 0xaa */ + char z[9] = "[ABCDEFG]"; /* "[ABCDEFG]" + NUL */ + + xor_string_with_char(z+1, x, y, 7); + IMP_ASSERT(!memcmp(z, "[\xaa\xc2\xcf\xc6\xc6\xc5\xaa]", 9)); + } +} + +/* + * The strxor Python function + */ + +static char strxor__doc__[] = +"strxor(a:str, b:str) -> str\n" +"\n" +"Return a XOR b. Both a and b must have the same length.\n"; + +static PyObject * +strxor_function(PyObject *self, PyObject *args) +{ + PyObject *a, *b, *retval; + Py_ssize_t len_a, len_b; + + if (!PyArg_ParseTuple(args, "SS", &a, &b)) + return NULL; + + len_a = PyBytes_GET_SIZE(a); + len_b = PyBytes_GET_SIZE(b); + + assert(len_a >= 0); + assert(len_b >= 0); + + if (len_a != len_b) { + PyErr_SetString(PyExc_ValueError, "length of both strings must be equal"); + return NULL; + } + + /* Create return string */ + retval = PyBytes_FromStringAndSize(NULL, len_a); + if (!retval) { + return NULL; + } + + /* retval := a ^ b */ + xor_strings(PyBytes_AS_STRING(retval), PyBytes_AS_STRING(a), PyBytes_AS_STRING(b), len_a); + + return retval; +} + +/* + * The strxor_c Python function + */ + +static char strxor_c__doc__[] = +"strxor_c(s:str, c:int) -> str\n" +"\n" +"Return s XOR chr(c). c must be in range(256).\n"; + +static PyObject * +strxor_c_function(PyObject *self, PyObject *args) +{ + PyObject *s, *retval; + int c; + Py_ssize_t length; + + if (!PyArg_ParseTuple(args, "Si", &s, &c)) + return NULL; + + if ((c < 0) || (c > 255)) { + PyErr_SetString(PyExc_ValueError, "c must be in range(256)"); + return NULL; + } + + length = PyBytes_GET_SIZE(s); + assert(length >= 0); + + /* Create return string */ + retval = PyBytes_FromStringAndSize(NULL, length); + if (!retval) { + return NULL; + } + + /* retval := a ^ chr(c)*length */ + xor_string_with_char(PyBytes_AS_STRING(retval), PyBytes_AS_STRING(s), (char) c, length); + + return retval; +} + +/* + * Module-level method table and module initialization function + */ + +static PyMethodDef strxor_methods[] = { + {"strxor", strxor_function, METH_VARARGS, strxor__doc__}, + {"strxor_c", strxor_c_function, METH_VARARGS, strxor_c__doc__}, + + {NULL, NULL, 0, NULL} /* end-of-list sentinel value */ +}; + +#ifdef IS_PY3K +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "strxor", + NULL, + -1, + strxor_methods, + NULL, + NULL, + NULL, + NULL +}; +#endif + +PyMODINIT_FUNC +#ifdef IS_PY3K +PyInit_strxor(void) +#else +initstrxor(void) +#endif +{ + PyObject *m; + + /* Initialize the module */ +#ifdef IS_PY3K + m = PyModule_Create(&moduledef); + if (m == NULL) + return NULL; +#else + m = Py_InitModule("strxor", strxor_methods); + if (m == NULL) + return; +#endif + + /* Perform runtime tests */ + runtime_test(); + +#ifdef IS_PY3K + return m; +#endif +} + +/* vim:set ts=4 sw=4 sts=4 expandtab: */ diff --git a/Cryptography/pycrypto-2.6.1/src/winrand.c b/Cryptography/pycrypto-2.6.1/src/winrand.c new file mode 100644 index 0000000..d505e54 --- /dev/null +++ b/Cryptography/pycrypto-2.6.1/src/winrand.c @@ -0,0 +1,472 @@ +/* -*- C -*- */ +/* + * Uses Windows CryptoAPI CryptGenRandom to get random bytes. + * The "new" method returns an object, whose "get_bytes" method + * can be called repeatedly to get random bytes, seeded by the + * OS. See the description in the comment at the end. + * + * If you have the Intel Security Driver header files (icsp4ms.h) + * for their hardware random number generator in the 810 and 820 chipsets, + * then define HAVE_INTEL_RNG. + * + * ======================================================================= + * The contents of this file are dedicated to the public domain. To the + * extent that dedication to the public domain is not available, everyone + * is granted a worldwide, perpetual, royalty-free, non-exclusive license + * to exercise all rights associated with the contents of this file for + * any purpose whatsoever. No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * ======================================================================= + * + */ + +/* Author: Mark Moraes */ + +#include "Python.h" +#include "pycrypto_compat.h" + +#ifdef MS_WIN32 + +#define _WIN32_WINNT 0x400 +#define WINSOCK + +#include +#include + +#ifdef HAVE_INTEL_RNG +# include "icsp4ms.h" +#else +# define PROV_INTEL_SEC 22 +# define INTEL_DEF_PROV "Intel Hardware Cryptographic Service Provider" +#endif + +/* To-Do: store provider name and type for print/repr? */ + +typedef struct +{ + PyObject_HEAD + HCRYPTPROV hcp; +} WRobject; + +/* Please see PEP3123 for a discussion of PyObject_HEAD and changes made in 3.x to make it conform to Standard C. + * These changes also dictate using Py_TYPE to check type, and PyVarObject_HEAD_INIT(NULL, 0) to initialize + */ +#ifdef IS_PY3K +static PyTypeObject WRtype; +#define is_WRobject(v) (Py_TYPE(v) == &WRtype) +#else +staticforward PyTypeObject WRtype; +#define is_WRobject(v) ((v)->ob_type == &WRtype) +#define PyLong_FromLong PyInt_FromLong /* for Python 2.x */ +#endif + +static void +WRdealloc(PyObject *ptr) +{ + WRobject *o = (WRobject *)ptr; + + if (! is_WRobject(ptr)) { + PyErr_Format(PyExc_TypeError, + "WinRandom trying to dealloc non-WinRandom object"); + return; + } + if (! CryptReleaseContext(o->hcp, 0)) { + PyErr_Format(PyExc_SystemError, + "CryptReleaseContext failed, error 0x%x", + (unsigned int) GetLastError()); + return; + } + /* Overwrite the contents of the object */ + o->hcp = 0; + PyObject_Del(ptr); +} + +static char winrandom__doc__[] = +"new([provider], [provtype]): Returns an object handle to Windows\n\ +CryptoAPI that can be used to access a cryptographically strong\n\ +pseudo-random generator that uses OS-gathered entropy.\n\ +Provider is a string that specifies the Cryptographic Service Provider\n\ +to use, default is the default OS CSP.\n\ +provtype is an integer specifying the provider type to use, default\n\ +is 1 (PROV_RSA_FULL)"; + +static char WR_get_bytes__doc__[] = +"get_bytes(nbytes, [userdata]]): Returns nbytes of random data\n\ +from Windows CryptGenRandom.\n\ +userdata is a string with any additional entropic data that the\n\ +user wishes to provide."; + +static WRobject * +winrandom_new(PyObject *self, PyObject *args, PyObject *kwdict) +{ + HCRYPTPROV hcp = 0; + WRobject *res; + char *provname = NULL; + int provtype = PROV_RSA_FULL; + static char *kwlist[] = { "provider", "provtype", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|si", kwlist, + &provname, &provtype)) { + return NULL; + } + if (! CryptAcquireContext(&hcp, NULL, (LPCTSTR) provname, + (DWORD) provtype, + CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) { + PyErr_Format(PyExc_SystemError, + "CryptAcquireContext for provider \"%s\" type %i failed, error 0x%x", + provname? provname : "(null)", provtype, + (unsigned int) GetLastError()); + return NULL; + } + res = PyObject_New(WRobject, &WRtype); + res->hcp = hcp; + return res; +} + +static PyObject * +WR_get_bytes(WRobject *self, PyObject *args) +{ + int n, nbytes, len = 0; + PyObject *res; + char *buf, *str = NULL; + + if (! is_WRobject(self)) { + PyErr_Format(PyExc_TypeError, + "WinRandom trying to get_bytes with non-WinRandom object"); + return NULL; + } + if (!PyArg_ParseTuple(args, "i|s#", &n, &str, &len)) { + return NULL; + } + if (n <= 0) { + PyErr_SetString(PyExc_ValueError, "nbytes must be positive number"); + return NULL; + } + /* Just in case char != BYTE, or userdata > desired result */ + nbytes = (((n > len) ? n : len) * sizeof(char)) / sizeof(BYTE) + 1; + if ((buf = (char *) PyMem_Malloc(nbytes)) == NULL) + return PyErr_NoMemory(); + if (len > 0) + memcpy(buf, str, len); + /* + * if userdata > desired result, we end up getting + * more bytes than we really needed to return. No + * easy way to avoid that: we prefer that + * CryptGenRandom does the distillation of userdata + * down to entropy, rather than trying to do it + * ourselves. Since the extra bytes presumably come + * from an RC4 stream, they should be relatively + * cheap. + */ + + if (! CryptGenRandom(self->hcp, (DWORD) nbytes, (BYTE *) buf)) { + PyErr_Format(PyExc_SystemError, + "CryptGenRandom failed, error 0x%x", + (unsigned int) GetLastError()); + PyMem_Free(buf); + return NULL; + } + + res = PyBytes_FromStringAndSize(buf, n); + PyMem_Free(buf); + return res; +} + +/* WinRandom object methods */ + +static PyMethodDef WRmethods[] = +{ + {"get_bytes", (PyCFunction) WR_get_bytes, METH_VARARGS, + WR_get_bytes__doc__}, + {NULL, NULL} /* sentinel */ +}; + +/* winrandom module methods */ + +static PyMethodDef WR_mod_methods[] = { + {"new", (PyCFunction) winrandom_new, METH_VARARGS|METH_KEYWORDS, + winrandom__doc__}, + {NULL, NULL} /* Sentinel */ +}; + +static PyObject * +#ifdef IS_PY3K +WRgetattro(PyObject *s, PyObject *attr) +#else +WRgetattr(PyObject *s, char *name) +#endif +{ + WRobject *self = (WRobject*)s; + if (! is_WRobject(self)) { + PyErr_Format(PyExc_TypeError, + "WinRandom trying to getattr with non-WinRandom object"); + return NULL; + } +#ifdef IS_PY3K + if (!PyUnicode_Check(attr)) + goto generic; + if (PyUnicode_CompareWithASCIIString(attr, "hcp") == 0) +#else + if (strcmp(name, "hcp") == 0) +#endif + return PyLong_FromLong((long) self->hcp); +#ifdef IS_PY3K + generic: + return PyObject_GenericGetAttr(s, attr); +#else + return Py_FindMethod(WRmethods, (PyObject *) self, name); +#endif +} + +static PyTypeObject WRtype = + { + #ifdef IS_PY3K + PyVarObject_HEAD_INIT(NULL, 0) /* deferred type init for compilation on Windows, type will be filled in at runtime */ +#else + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ +#endif + "winrandom.WinRandom", /*tp_name*/ + sizeof(WRobject), /*tp_size*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor) WRdealloc, /*tp_dealloc*/ + 0, /*tp_print*/ +#ifndef IS_PY3K + WRgetattr, /*tp_getattr*/ +#else + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number */ + 0, /*tp_as_sequence */ + 0, /*tp_as_mapping */ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + WRgetattro, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + WRmethods, /*tp_methods*/ +#endif +}; + +#ifdef IS_PY3K +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "winrandom", + NULL, + -1, + WR_mod_methods, + NULL, + NULL, + NULL, + NULL + }; +#endif + +#ifdef IS_PY3K +PyMODINIT_FUNC +PyInit_winrandom() +#else +void +initwinrandom() +#endif +{ + PyObject *m; +#ifdef IS_PY3K + /* PyType_Ready automatically fills in ob_type with &PyType_Type if it's not already set */ + if (PyType_Ready(&WRtype) < 0) + return NULL; + /* Initialize the module */ + m = PyModule_Create(&moduledef); + if (m == NULL) + return NULL; +#else + WRtype.ob_type = &PyType_Type; + m = Py_InitModule("winrandom", WR_mod_methods); +#endif + + /* define Windows CSP Provider Types */ +#ifdef PROV_RSA_FULL + PyModule_AddIntConstant(m, "PROV_RSA_FULL", PROV_RSA_FULL); +#endif +#ifdef PROV_RSA_SIG + PyModule_AddIntConstant(m, "PROV_RSA_SIG", PROV_RSA_SIG); +#endif +#ifdef PROV_DSS + PyModule_AddIntConstant(m, "PROV_DSS", PROV_DSS); +#endif +#ifdef PROV_FORTEZZA + PyModule_AddIntConstant(m, "PROV_FORTEZZA", PROV_FORTEZZA); +#endif +#ifdef PROV_MS_EXCHANGE + PyModule_AddIntConstant(m, "PROV_MS_EXCHANGE", PROV_MS_EXCHANGE); +#endif +#ifdef PROV_SSL + PyModule_AddIntConstant(m, "PROV_SSL", PROV_SSL); +#endif +#ifdef PROV_RSA_SCHANNEL + PyModule_AddIntConstant(m, "PROV_RSA_SCHANNEL", PROV_RSA_SCHANNEL); +#endif +#ifdef PROV_DSS_DH + PyModule_AddIntConstant(m, "PROV_DSS_DH", PROV_DSS_DH); +#endif +#ifdef PROV_EC_ECDSA_SIG + PyModule_AddIntConstant(m, "PROV_EC_ECDSA_SIG", PROV_EC_ECDSA_SIG); +#endif +#ifdef PROV_EC_ECNRA_SIG + PyModule_AddIntConstant(m, "PROV_EC_ECNRA_SIG", PROV_EC_ECNRA_SIG); +#endif +#ifdef PROV_EC_ECDSA_FULL + PyModule_AddIntConstant(m, "PROV_EC_ECDSA_FULL", PROV_EC_ECDSA_FULL); +#endif +#ifdef PROV_EC_ECNRA_FULL + PyModule_AddIntConstant(m, "PROV_EC_ECNRA_FULL", PROV_EC_ECNRA_FULL); +#endif +#ifdef PROV_SPYRUS_LYNKS + PyModule_AddIntConstant(m, "PROV_SPYRUS_LYNKS", PROV_SPYRUS_LYNKS); +#endif +#ifdef PROV_INTEL_SEC + PyModule_AddIntConstant(m, "PROV_INTEL_SEC", PROV_INTEL_SEC); +#endif + + /* Define Windows CSP Provider Names */ +#ifdef MS_DEF_PROV + PyModule_AddStringConstant(m, "MS_DEF_PROV", MS_DEF_PROV); +#endif +#ifdef MS_ENHANCED_PROV + PyModule_AddStringConstant(m, "MS_ENHANCED_PROV", MS_ENHANCED_PROV); +#endif +#ifdef MS_DEF_RSA_SIG_PROV + PyModule_AddStringConstant(m, "MS_DEF_RSA_SIG_PROV", + MS_DEF_RSA_SIG_PROV); +#endif +#ifdef MS_DEF_RSA_SCHANNEL_PROV + PyModule_AddStringConstant(m, "MS_DEF_RSA_SCHANNEL_PROV", + MS_DEF_RSA_SCHANNEL_PROV); +#endif +#ifdef MS_ENHANCED_RSA_SCHANNEL_PROV + PyModule_AddStringConstant(m, "MS_ENHANCED_RSA_SCHANNEL_PROV", + MS_ENHANCED_RSA_SCHANNEL_PROV); +#endif +#ifdef MS_DEF_DSS_PROV + PyModule_AddStringConstant(m, "MS_DEF_DSS_PROV", MS_DEF_DSS_PROV); +#endif +#ifdef MS_DEF_DSS_DH_PROV + PyModule_AddStringConstant(m, "MS_DEF_DSS_DH_PROV", + MS_DEF_DSS_DH_PROV); +#endif +#ifdef INTEL_DEF_PROV + PyModule_AddStringConstant(m, "INTEL_DEF_PROV", INTEL_DEF_PROV); +#endif + + if (PyErr_Occurred()) + Py_FatalError("can't initialize module winrandom"); + +#ifdef IS_PY3K + return m; +#endif +} +/* + +CryptGenRandom usage is described in +http://msdn.microsoft.com/library/en-us/security/security/cryptgenrandom.asp +and many associated pages on Windows Cryptographic Service +Providers, which say: + + With Microsoft CSPs, CryptGenRandom uses the same + random number generator used by other security + components. This allows numerous processes to + contribute to a system-wide seed. CryptoAPI stores + an intermediate random seed with every user. To form + the seed for the random number generator, a calling + application supplies bits it might havefor instance, + mouse or keyboard timing inputthat are then added to + both the stored seed and various system data and + user data such as the process ID and thread ID, the + system clock, the system time, the system counter, + memory status, free disk clusters, the hashed user + environment block. This result is SHA-1 hashed, and + the output is used to seed an RC4 stream, which is + then used as the random stream and used to update + the stored seed. + +The only other detailed description I've found of the +sources of randomness for CryptGenRandom is this excerpt +from a posting +http://www.der-keiler.de/Newsgroups/comp.security.ssh/2002-06/0169.html + +From: Jon McClelland (dowot69@hotmail.com) +Date: 06/12/02 +... + +Windows, call a function such as CryptGenRandom, which has two of +the properties of a good random number generator, unpredictability and +even value distribution. This function, declared in Wincrypt.h, is +available on just about every Windows platform, including Windows 95 +with Internet Explorer 3.02 or later, Windows 98, Windows Me, Windows +CE v3, Windows NT 4, Windows 2000, and Windows XP. + +CryptGenRandom gets its randomness, also known as entropy, from many +sources in Windows 2000, including the following: +The current process ID (GetCurrentProcessID). +The current thread ID (GetCurrentThreadID). +The ticks since boot (GetTickCount). +The current time (GetLocalTime). +Various high-precision performance counters (QueryPerformanceCounter). +A Message Digest 4 (MD4) hash of the user's environment block, which +includes username, computer name, and search path. + +High-precision internal CPU counters, such as RDTSC, RDMSR, RDPMC (x86 +only-more information about these counters is at +developer.intel.com/software/idap/resources/technical_collateral/pentiumii/RDTSCPM1.HTM +). + +Low-level system information, such as idle time, kernel time, +interrupt times, commit limit, page read count, cache read count, +nonpaged pool allocations, alignment fixup count, operating system +lookaside information. + +Such information is added to a buffer, which is hashed using MD4 and +used as the key to modify a buffer, using RC4, provided by the user. +(Refer to the CryptGenRandom documentation in the Platform SDK for +more information about the user-provided buffer.) Hence, if the user +provides additional data in the buffer, this is used as an element in +the witches brew to generate the random data. The result is a +cryptographically random number generator. +Also, note that if you plan to sell your software to the United States +federal government, you'll need to use FIPS 140-1-approved algorithms. +The default versions of CryptGenRandom in Microsoft Windows CE v3, +Windows 95, Windows 98, Windows Me, Windows 2000, and Windows XP are +FIPS-approved. Obviously FIPS-140 compliance is necessary but not +sufficient to provide a properly secure source of random data. + +*/ +/* +[Update: 2007-11-13] +CryptGenRandom does not necessarily provide forward secrecy or reverse +secrecy. See the paper by Leo Dorrendorf and Zvi Gutterman and Benny +Pinkas, _Cryptanalysis of the Random Number Generator of the Windows +Operating System_, Cryptology ePrint Archive, Report 2007/419, +http://eprint.iacr.org/2007/419 +*/ + +#endif /* MS_WIN32 */ diff --git a/Cryptography/tools/xortool-master/.gitignore b/Cryptography/tools/xortool-master/.gitignore new file mode 100644 index 0000000..7eb10d2 --- /dev/null +++ b/Cryptography/tools/xortool-master/.gitignore @@ -0,0 +1,6 @@ +*.pyc +.idea +dist +build +MANIFEST +TODO diff --git a/Cryptography/tools/xortool-master/LICENSE b/Cryptography/tools/xortool-master/LICENSE new file mode 100644 index 0000000..15dfde8 --- /dev/null +++ b/Cryptography/tools/xortool-master/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 hellman ( hellman1908@gmail.com ) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Cryptography/tools/xortool-master/README.md b/Cryptography/tools/xortool-master/README.md new file mode 100644 index 0000000..20ac31f --- /dev/null +++ b/Cryptography/tools/xortool-master/README.md @@ -0,0 +1,109 @@ +xortool.py +==================== + +A tool to do some xor analysis: + + - guess the key length (based on count of equal chars) + - guess the key (base on knowledge of most frequent char) + +Usage +--------------------- + +! *python3 is not supported, use python 2.x* + +
+  xortool [-h|--help] [OPTIONS] [<filename>]
+Options:
+  -l,--key-length       length of the key (integer)
+  -c,--char             most possible char (one char or hex code)
+  -m,--max-keylen=32    maximum key length to probe (integer)
+  -x,--hex              input is hex-encoded str
+  -b,--brute-chars      brute-force all possible characters
+  -o,--brute-printable  same as -b but will only use printable
+                        characters for keys
+
+ +Example +--------------------- + +
+# xor is tools/xor.py
+tests $ xor -f /bin/ls -s "secret_key" > binary_xored
+
+tests $ xortool binary_xored
+The most probable key lengths:
+   2:   5.0%
+   5:   8.7%
+   8:   4.9%
+  10:   15.4%
+  12:   4.8%
+  15:   8.5%
+  18:   4.8%
+  20:   15.1%
+  25:   8.4%
+  30:   14.9%
+Key-length can be 5*n
+Most possible char is needed to guess the key!
+
+# 00 is the most frequent byte in binaries
+tests $ xortool binary_xored -l 10 -c 00
+...
+1 possible key(s) of length 10:
+secret_key
+
+# decrypted ciphertexts are placed in ./xortool_out/Number_<key repr>
+# ( have no better idea )
+tests $ md5sum xortool_out/0_secret_key /bin/ls
+29942e290876703169e1b614d0b4340a  xortool_out/0_secret_key
+29942e290876703169e1b614d0b4340a  /bin/ls
+
+ +The most common use is to pass just the encrypted file and the most frequent character (usually 00 for binaries and 20 for text files) - length will be automatically chosen: + +
+tests $ xortool tool_xored -c 20
+The most probable key lengths:
+   2:   5.6%
+   5:   7.8%
+   8:   6.0%
+  10:   11.7%
+  12:   5.6%
+  15:   7.6%
+  20:   19.8%
+  25:   7.8%
+  28:   5.7%
+  30:   11.4%
+Key-length can be 5*n
+1 possible key(s) of length 20:
+an0ther s3cret \xdd key
+
+ +Here, the key is longer then default 32 limit: + +
+tests $ xortool ls_xored -c 00 -m 64
+The most probable key lengths:
+   3:   3.3%
+   6:   3.3%
+   9:   3.3%
+  11:   7.0%
+  22:   6.9%
+  24:   3.3%
+  27:   3.2%
+  33:   18.4%
+  44:   6.8%
+  55:   6.7%
+Key-length can be 3*n
+1 possible key(s) of length 33:
+really long s3cr3t k3y... PADDING
+
+ +So, if automated decryption fails, you can calibrate: + +- (-m) max length to try longer keys +- (-l) selected length to see some interesting keys +- (-c) the most frequent char to produce right plaintext + +Author: hellman ( hellman1908@gmail.com ) + +License: MIT License (opensource.org/licenses/MIT) diff --git a/Cryptography/tools/xortool-master/setup.py b/Cryptography/tools/xortool-master/setup.py new file mode 100644 index 0000000..c94dc9f --- /dev/null +++ b/Cryptography/tools/xortool-master/setup.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +#-*- coding:utf-8 -*- + +from distutils.core import setup + +import xortool + +setup(name='xortool', + version=xortool.__version__, + + author='hellman', + author_email='hellman1908@gmail.com', + license="MIT", + + url='https://github.com/hellman/xortool', + description='Tool for xor cipher analysis', + long_description=open("README.md").read(), # not in rst, but something + keywords="xor xortool analysis", + + packages=['xortool'], + provides=['xortool'], + install_requires=['docopt>=0.6.1'], + scripts=["xortool/xortool", "xortool/xortool-xor"], + + classifiers=['Development Status :: 4 - Beta', + 'Intended Audience :: Science/Research', + 'Intended Audience :: Information Technology', + 'Natural Language :: English', + 'Operating System :: OS Independent', + 'Programming Language :: Python :: 2', + 'License :: OSI Approved :: MIT License', + 'Topic :: Scientific/Engineering :: Mathematics', + 'Topic :: Security :: Cryptography', + ], + ) diff --git a/Cryptography/tools/xortool-master/test/data/binary_xored b/Cryptography/tools/xortool-master/test/data/binary_xored new file mode 100644 index 0000000000000000000000000000000000000000..7b70e97f89e49e07dbb00ceebdffbcb8774c4095 GIT binary patch literal 96324 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 QZg&FhHUs7!pS#`v2Q-wYM*si- literal 0 HcmV?d00001 diff --git a/Cryptography/tools/xortool-master/test/data/ls_xored b/Cryptography/tools/xortool-master/test/data/ls_xored new file mode 100644 index 0000000000000000000000000000000000000000..29ed4ee16179d95eda4e1e322ca94ffed75ed287 GIT binary patch literal 96324 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 z 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 fitness: # local maximum + fitnesses += [(key_length - 1, prev)] + + pprev = prev + prev = fitness + + if pprev < prev: + fitnesses += [(key_length - 1, prev)] + + return fitnesses + + +def print_fitnesses(fitnesses): + print "The most probable key lengths:" + + # top sorted by fitness, but print sorted by length + fitnesses.sort(key=itemgetter(1), reverse=True) + top10 = fitnesses[:10] + best_fitness = top10[0][1] + top10.sort(key=itemgetter(0)) + + fitness_sum = calculate_fitness_sum(top10) + + for key_length, fitness in top10: + s1 = str(key_length).rjust(4, " ") + s2 = str(round(100 * fitness * 1.0 / fitness_sum, 1)) + "%" + if fitness == best_fitness: + print (C_BEST_KEYLEN + s1 + C_RESET + ": " + + C_BEST_PROB + s2 + C_RESET) + else: + print (C_KEYLEN + s1 + C_RESET + ": " + + C_PROB + s2 + C_RESET) + return + + +def calculate_fitness_sum(fitnesses): + return sum([f[1] for f in fitnesses]) + + +def count_equals(text, key_length): + """ + count equal chars count for each offset and sum them + """ + equals_count = 0 + if key_length >= len(text): + return 0 + + for offset in range(key_length): + chars_count = chars_count_at_offset(text, key_length, offset) + equals_count += max(chars_count.values()) - 1 # why -1? don't know + return equals_count + + +def guess_and_print_divisors(fitnesses): + """ + Prints common divisors and returns the most common divisor + """ + divisors_counts = [0] * (PARAMETERS["max_key_length"] + 1) + for key_length, fitness in fitnesses: + for number in range(3, key_length + 1): + if key_length % number == 0: + divisors_counts[number] += 1 + max_divisors = max(divisors_counts) + + limit = 3 + ret = 2 + for number, divisors_count in enumerate(divisors_counts): + if divisors_count == max_divisors: + print "Key-length can be " + C_DIV + str(number) + "*n" + C_RESET + ret = number + limit -= 1 + if limit == 0: + return ret + return ret + + +def get_max_fitnessed_key_length(fitnesses): + max_fitness = 0 + max_fitnessed_key_length = 0 + for key_length, fitness in fitnesses: + if fitness > max_fitness: + max_fitness = fitness + max_fitnessed_key_length = key_length + return max_fitnessed_key_length + + +def chars_count_at_offset(text, key_length, offset): + chars_count = dict() + for pos in range(offset, len(text), key_length): + c = text[pos] + if c in chars_count: + chars_count[c] += 1 + else: + chars_count[c] = 1 + return chars_count + + +# ----------------------------------------------------------------------------- +# KEYS GUESSING SECTION +# ----------------------------------------------------------------------------- + +def guess_probable_keys_for_chars(text, try_chars): + """ + Guess keys for list of characters. + """ + probable_keys = [] + key_char_used = {} + + for c in try_chars: + keys = guess_keys(text, c) + for key in keys: + key_char_used[key] = c + if key not in probable_keys: + probable_keys.append(key) + + return probable_keys, key_char_used + + +def guess_keys(text, most_char): + """ + Generate all possible keys for key length + and the most possible char + """ + key_length = PARAMETERS["known_key_length"] + key_possible_bytes = [[] for _ in range(key_length)] + + for offset in range(key_length): # each byte of key< + chars_count = chars_count_at_offset(text, key_length, offset) + max_count = max(chars_count.values()) + for char in chars_count: + if chars_count[char] >= max_count: + key_possible_bytes[offset].append(chr(ord(char) ^ most_char)) + + return all_keys(key_possible_bytes) + + +def all_keys(key_possible_bytes, key_part="", offset=0): + """ + Produce all combinations of possible key chars + """ + keys = [] + if offset >= len(key_possible_bytes): + return [key_part] + for c in key_possible_bytes[offset]: + keys += all_keys(key_possible_bytes, key_part + c, offset + 1) + return keys + + +def print_keys(keys): + if not keys: + print "No keys guessed!" + return + + s1 = C_COUNT + str(len(keys)) + C_RESET + s2 = C_COUNT + str(len(keys[0])) + C_RESET + print "{} possible key(s) of length {}:".format(s1, s2) + for key in keys[:5]: + print C_KEY + repr(key)[1:-1] + C_RESET + if len(keys) > 10: + print "..." + + +# ----------------------------------------------------------------------------- +# RETURNS PERCENTAGE OF PRINTABLE CHARS +# ----------------------------------------------------------------------------- + +def percentage_printable(text): + x = 0.0 + for c in text: + if c in string.printable: + x += 1 + return x / len(text) + + +# ----------------------------------------------------------------------------- +# PRODUCE OUTPUT +# ----------------------------------------------------------------------------- + +def produce_plaintexts(ciphertext, keys, key_char_used): + """ + Produce plaintext variant for each possible key, + creates csv files with keys, percentage of printable + characters and used most frequent character + """ + cleanup() + mkdir(DIRNAME) + + # this is split up in two files since the + # key can contain all kinds of characters + + fn_key_mapping = "filename-key.csv" + fn_perc_mapping = "filename-char_used-perc_printable.csv" + + key_mapping = open(os.path.join(DIRNAME, fn_key_mapping), "w") + perc_mapping = open(os.path.join(DIRNAME, fn_perc_mapping), "w") + + key_mapping.write("file_name;key_repr\n") + perc_mapping.write("file_name;char_used;perc_printable\n") + + threshold_printable = 95 + count_printable = 0 + + for index, key in enumerate(keys): + key_index = str(index).rjust(len(str(len(keys) - 1)), "0") + key_repr = repr(key)[1:-1].replace("/", "\\x2f") + if not is_linux(): + key_repr = alphanum(key) + file_name = os.path.join(DIRNAME, key_index + ".out") + + dexored = dexor(ciphertext, key) + perc = round(100 * percentage_printable(dexored)) + if perc > threshold_printable: + count_printable += 1 + key_mapping.write("{};{}\n".format(file_name, key_repr)) + perc_mapping.write("{};{};{}\n".format(file_name, + repr(key_char_used[key]), + perc)) + f = open(file_name, "wb") + f.write(dexored) + f.close() + key_mapping.close() + perc_mapping.close() + + s1 = C_COUNT + str(count_printable) + C_RESET + s2 = C_COUNT + str(round(threshold_printable)) + C_RESET + + print "Found {} plaintexts with {}%+ printable characters".format(s1, s2) + print "See files {}, {}".format(fn_key_mapping, fn_perc_mapping) + return + + +def cleanup(): + if os.path.exists(DIRNAME): + rmdir(DIRNAME) + return + + +if __name__ == "__main__": + main() diff --git a/Cryptography/tools/xortool-master/xortool/xortool-xor b/Cryptography/tools/xortool-master/xortool/xortool-xor new file mode 100755 index 0000000..e8248ad --- /dev/null +++ b/Cryptography/tools/xortool-master/xortool/xortool-xor @@ -0,0 +1,116 @@ +#!/usr/bin/env python +#-*- coding:utf-8 -*- + +""" +xor strings +options: + -s - string with \\xAF escapes + -r - raw string + -h - hex-encoded string (non-letterdigit chars are stripped) + -f - read data from file (- for stdin) + -n - no newline at the end + --no-cycle / --nc - pad smaller strings with null bytes +example: xor -s lol -h 414243 -f /etc/passwd + +author: hellman ( hellman1908@gmail.com ) +""" + +import sys +import string +import getopt + + +DATA_OPTS = "s:r:h:f:" +HEXES = set("0123456789abcdefABCDEF") + + +def main(): + nocycle = False + nonewline = False + try: + opts, args = getopt.getopt(sys.argv[1:], "n" + DATA_OPTS, ["no-cycle", "nc"]) + datas = [] + for c, val in opts: + if c in ("--no-cycle", "--nc"): + nocycle = True + elif c == "-n": + nonewline = True + else: + v = arg_data(c, val) + if v is None: + raise getopt.GetoptError("unknown option %s" % c) + datas.append(v) + if not datas: + raise getopt.GetoptError("no data given") + except getopt.GetoptError as e: + print >>sys.stderr, "error:", e + print >>sys.stderr, __doc__ + quit() + + sys.stdout.write(xor(datas, nocycle=nocycle)) + if not nonewline: + sys.stdout.write("\n") + + +def xor(args, nocycle=False): + maxlen = max(map(len, args)) + res = [0] * maxlen + if nocycle: + for s in args: + for i in xrange(len(s)): + res[i] ^= ord(s[i]) + else: + for s in args: + slen = len(s) + for i in xrange(maxlen): + res[i] ^= ord(s[i % slen]) + return "".join(map(chr, res)) + + +def from_str(s): + res = "" + i = 0 + while True: + if i + 4 > len(s): + break + + if s[i+1] == "x" and s[i+2] in HEXES and s[i+3] in HEXES: + res += chr(int(s[i+2:i+4], 16)) + i += 4 + else: + res += s[i] + i += 1 + res += s[i:] + return res + + +def from_hex(s): + res = "" + for c in s: + if c in HEXES: + res += c + elif c in string.ascii_letters: + raise ValueError("Bad splitters (alphanum)") + return res.decode("hex") + + +def from_file(s): + if s == "-": + return sys.stdin.read() + return open(s, "rb").read() + + +def arg_data(opt, s): + if opt == "-s": + return from_str(s) + elif opt == "-r": + return s + elif opt == "-h": + return from_hex(s) + elif opt == "-f": + return from_file(s) + return None + + +if __name__ == '__main__': + main() diff --git a/ctf_tools_1_light_sd.png b/ctf_tools_1_light_sd.png deleted file mode 100644 index 6aea24d80c2d016dc38c0568756adf407c943b1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188440 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
%0fyY!{z8E54f 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

7nv)QetZD+1zAK5kQn3^aPD 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

Qs|u6)!gu(3(MsL6 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