diff -urN lin.2.2.17/Documentation/Configure.help int.2.2.17.x/Documentation/Configure.help --- lin.2.2.17/Documentation/Configure.help Thu Sep 14 18:18:20 2000 +++ int.2.2.17.x/Documentation/Configure.help Sat Oct 14 00:48:17 2000 @@ -237,13 +237,13 @@ bits of, say, a sound file). This is also safe if the file resides on a remote file server. If you want to do this, you will first have to acquire and install a kernel patch from - ftp://ftp.replay.com/pub/crypto/linux/all or - ftp://verden.pvv.org/pub/linux/kerneli/v2.1/, and then you need to - say Y to this option. + ftp://ftp.zedz.com/pub/crypto/linux/all or + ftp://ftp.kernel.org/pub/linux/kernel/crypto/v2.2/, and then you need + to say Y to this option. Note that alternative ways to use encrypted filesystems are provided by the cfs package, which can be gotten via FTP (user: anonymous) - from ftp://ftp.replay.com/pub/crypto/disk/, and the newer tcfs + from ftp://ftp.zedz.com/pub/crypto/disk/, and the newer tcfs package, available at http://tcfs.dia.unisa.it/. You do not need to say Y here if you want to use one of these. However, using cfs requires saying Y to "NFS filesystem support" below while using tcfs @@ -263,6 +263,374 @@ called loop.o. Most users will answer N here. + +Use relative block numbers as basis for transfer functions +CONFIG_BLK_DEV_LOOP_USE_REL_BLOCK + [1999-06-25] + If you don't use relative block numbers for the transfer functions, + you will not be able to restore a backup of your loop device without + restoring the file to _exactly_ the same blocks on disk as they used + to be on. This is especially bad when the transfer function is a + cipher since there will be no way to decipher the original + file-system. + +General encryption support (EXPERIMENTAL)' +CONFIG_BLK_DEV_LOOP_GEN + [1998-12-02] + If you answer yes to this option, the loop-driver will support all + crypto algorithms selected in the crypto library (see the 'Crypto' + menu entry in the main menu). + + This loop module will use the ciphers in CBC-mode which is more + secure than ECB-mode. This module will also initialize the CBC-mode + of the cipher with the block-number of the block being encrypted. + +Crypto ciphers +CONFIG_CIPHERS + Ciphers basically help us scramble data so that other people don't + get access to it. Useful applications for this include hiding hard + drive contents or network traffic from unauthorized eyes. Compare a + file encrypted with a cipher with very good safe: The document is in + it, you can carry the document with you (if the safe is not too + heavy), but others can steal it, too. However, they will not be able + to read the document if the safe is any good. + + Mathematically speaking, a cipher is a parameter-dependant function + E(K, ) that takes a fixed-length block M (usually 64 or 128 bits) + and maps it onto another (usually equal-sized) block C=E(K,M) in such + a way that, without knowledge of the "key" K, it is hard to compute + + 1. M, if C and the function E are given, + + 2. C, if M is given and the function E is known. + + M is called the 'plaintext' and C the 'ciphertext'. The above + properties are commonly described as "All the security of the cipher + lies in its key". However, there always exists the inverse function + D(K, ) of E(K, ) such that D(K,E(K,M))=M for any M. The ideal + cipher is one where it is impossible to compute M if you have C, but + not K. In this case, the easiest way to break the cipher is to use + 'brute-force', i.e. try all K in turn until you hit the right + one. With most ciphers in this library, K is a 128-bit number. Here, + brute-force attacks are infeasible since they require testing all + 2^128 possible keys K, which would take far too long on any + conceivable computer (some big multiple of the age of the universe + for example). + + Unfortunately, the ideal cipher has not been found yet, so most + ciphers in this library, or certain 'reduced-round' versions + thereof, can be broken faster than brute-force. A cipher is secure, + if it cannot be broken _much_ faster than brute-force and + brute-force is infeasible. + + If you say 'Y' or 'M' here, you are able to select a variety of + ciphers for the Cipher-API. Ciphers you select below can then be + used by cryptographic kernel modules. If you say 'N' here, those + modules will use their own implementations or even not work at all. + + If unsure, say 'N'. + + +Digest algorithms +CONFIG_DIGEST + A message digest (or 'one-way function' or 'hash') is a function H + that maps an arbitrary-length message M onto a 128-bit or 160-bit + number h=H(M) such that the following conditions are satisfied: + + 1. For a given M, it is easy to compute h=H(M). + + 2. For a given h, it is hard to find M such that h=H(M). + + 3. For a given M, it is hard to find another message M' such that + H(M')=H(M). + + 4. It is hard to find M, M' such that H(M)=H(M'). + + This makes the name 'one-way function' plausible. Hashes are widely + used by cryptographic programs. E.g. the Linux kernel uses a hash to + generate random numbers. + +# Marc Mutz : this will be the help text, once this +# functionality is in place: +# If you say 'Y' here and select the SHA-1 message digest below, +# then the drivers for /dev/random and /dev/urandom will use the +# digest api instead of their own implementation. This will not work +# if you build as modules. +# + If you say 'Y' or 'M' here, cryptographic modules are able to use + the Digest-API if they need a hash function. If you say 'N' here, + they will use their own implementations (which will probably + increase the size of the compiled kernel if there are more than one + such modules). + + If unsure, say 'N'. + +AES cipher (EXPERIMENTAL - Read Help) +CONFIG_CIPHER_AES + [2000-10-04] + DESCRIPTION: + AES (Advanced Encryption Standard) is a proposed Federal Information + Processing Standard (FIPS) of the USA. Nevertheless, it was + conceived by Joan Daemon and Vincent Rijmen, two Belgians, under the + name Rijndael and submitted to the AES selection process in 1997 + (http://www.nist.gov/aes). On Oct 2, 2000 it was announced as being + the selected algorithm for the AES. + + Rijndael is a variable-round iterated block cipher that supports + block and key sizes each ranging from 128 to 256 bits, in steps of + 64. The number of rounds is dependant on the block and key sizes and + varies from 10 for 128/128 to 14 for 256/256 block/key sizes. + + SPPED: N/A + + PATENTS and LICENSING: + Rijndeal/AES is free of patents. As beign AES, NIST will ensure that + this will stay so. + + KNOWN ATTACKS: + None of the following attacks is able to undermine the security of + AES, when used with the round numbers specified by the authors. + + The original Rijndael specification contains a truncated + differential attack on 4,5 resp. 6 round versions ("Square attack") + requiring 2^9, 2^11 resp. 2^32 plaintexts and 2^9, 2^40 resp. 2^72 + work. There is another truncated differential attack that leads to a + collision attack on 7 round 192 and 256 bit keysize Rijndael + requiring 2^32 plaintext encryptions and 2^140 work. Other authors + extend the original Square attack to 7 rounds of 192 and 256 bit + keysize, both with more that 2^184 work. Further improvements of + these techniques result in attacks against 7 and 8 round + variants. But the latter require almost all of the codebook. At + last, there is a related key attack against 9 round, 256 bit keysize + Rijndael that requires 2^77 chosen plaintexts and 2^224 work. + +AES available under the Rijndael name +CONFIG_CIPHER_RIJNDAEL + If you say 'Y' here, AES will be also accessible through its + original name Rijndael. This is mostly for backwards compatibilty. + If you use kernel modules that use Rijndael, but do not know that it + is now called AES, say 'Y' here. + + If unsure, say 'N'. + +DFC encryption (EXPERIMENTAL - Read Help) +CONFIG_CIPHER_DFC + [2000-09-13] + DESCRIPTION: + DFC (The Decorrelated Fast Cipher) from CNRS and France Telecom is a + candidate algorithm for the Advanced Encryption Standard (AES). + It didn't survive the first round of the AES selection, i.e. it is + not one of the five remaining algorithms in AES round two. + + SPEED: N/A + + PATENTS and LICENSING: + It is unknown (to me) whether DFC is covered by patents. + + KNOWN ATTACKS: + I don't know of any attacks, but the problem with this cipher is + that it was thrown out of the AES competition. This may not mean it + is a bad cipher, but it certainly means that therefore it has gotten + _much_ less attention of cryptanalysts. Hence, there may be more + flaws in it than in the AES finalists. + +MARS encryption (EXPERIMENTAL - Read Help) +CONFIG_CIPHER_MARS + [2000-09-13] + DESCRIPTION: + MARS was IBM's candidate algorithm for the Advanded Encryption + Standard (AES). It consists of 16 core rounds and eight pre-mixing + as well as eight post-mixing rounds. + + PATENTS and LICENSING: + Refer to IBM for any copyright, patent or license issues for the + MARS algorithm. (However, if this cipher is elected as AES, it has + to remain/become free for everyone to use) + NOTE: MARS is covered by patents and might be illegal to use in many + cases. + + SPEED: + MARS is a fast algorithm achieving speeds up to 66Mbit on a Pentium + Pro 200. + + KNOWN ATTACKS: + As of the Third AES Candidate Conference (Apr. 2000), the best + attack presented breaks 11 of the 16 core rounds of MARS faster than + brute-force. This does _not_ mean that MARS is insecure, but shows + it has design weaknesses. For more information and pointers see + http://www.counterpane.com/crypto-gram-0004.html#AES-News + + +RC6 encryption (EXPERIMENTAL - Read Help) +CONFIG_CIPHER_RC6 + [2000-09-13] + DESCRIPTION: + RC6 is invented by Ron Rivest and RSA Labs. It was one of the five + candidates in round two for the Advanced Encryption Standard (AES). + + PATENTS and LICENSING: + Refer to RSA Labs and Ron Rivest for any copyright, patent or + license issues for the RC6 algorithm. + NOTE: RC6 is covered by patents and might be illegal to use in many + cases. + + SPEED: + RC6 is a simple and fast algorithm achieving speeds up to 88Mbit on + a Pentium Pro 200. It makes use of multiplication and + data-dependent rotations which reduces the number of rounds + necessary and increases its speed (on processors which have fast + muliplies). + + KNOWN ATTACKS: + As of the Third AES Candidate Conference (Apr. 2000), 15 of the 20 + rounds of RC6 can be broken faster than brute-force. This does _not_ + mean that RC6 is insecure, but shows it has design weaknesses. For + more information and pointers see + http://www.counterpane.com/crypto-gram-0004.html#AES-News + +Serpent encryption +CONFIG_CIPHER_SERPENT + [1998-10-13] + DESCRIPTION: + Serpent is a 128-bit block cipher designed by Ross Anderson, Eli + Biham and Lars Knudsen as a candidate for the Advanced Encryption + Standard (AES, see http://www.nist.gov/aes). It was one of the five + finalists after round two of the AES candidate search. Serpent + provides users with the highest practical level of assurance that no + shortcut attack will be found. To achieve this, the algorithm uses + well understood mechanisms so that its security relies on the wide + experience of block cipher cryptoanalysis. The algorithm uses twice + as many rounds as are necessary to block all currently known + shortcut attacks. The algorithm is designed to have a service life + of 50 years and to continue to protect legacy data for a further 50 + years beyond that. + + SPEED: + Despite these exacting design constraints, Serpent is faster than + DES. Its design supports a very efficient bitslice implementation, + and this implementation runs at almost 25 Mbit/sec on a + 200MHz Pentium (compared with about 15 Mbit/sec for DES). However, + compared to competitors for AES left in round two, it is painfully + slow to implement in software. + + PATENTS and LICENSING: + Serpent is completely in the public domain, and no restrictions are + imposed on its use. + + KNOWN ATTACKS: + As of the Third AES Candidate Conference (Apr. 2000), 9 of the 32 + rounds of Serpent can be broken faster than brute-force. This does + _not_ mean that Serpent is insecure, but shows it has design + weaknesses. For more information and pointers see + http://www.counterpane.com/crypto-gram-0004.html#AES-News + + More information about Serpent: + http://www.cl.cam.ac.uk/~rja14/serpent.html + + More information about the implementation: + http://www.seven77.demon.co.uk/crypto_technology.htm + +CAST 128 encryption +CONFIG_BLK_DEV_LOOP_CAST + This module implements CAST-128. The algorithm + was published in RFC 2144 as a proposed Internet standard, and is + from Entrust (http://www.entrust.com/) a Canadian company. + + This loop module uses the weak ECB-mode which means that it is more + open to certain attacks than CBC-mode ciphers. + +IDEA encryption +CONFIG_CIPHER_IDEA + [2000-09-13] + DESCRIPTION: + IDEA is a 64-bit block cipher designed by Xuejia Lai and James + Massey in 1992. It uses a 128-bit key and eight rounds with a round + function that mixes three---generally incompatible---algebraic + groups: XOR, addition mod 2^16 and multiplication mod 2^16-1. + + SPEED: + IDEA should be quite fast on CPU's that have a fast multiplication + instruction (beware that the Pentium IV processor is quite poorly + equipped in this area w.r.t its predecessors). + + PATENTS and LICENSING: + The IDEA code is mostly from ASCOM (http://www.ascom.com/) and + licensed for non-commercial use. + + This module may contain algorithms which are patented, and/or + require licensing for commerical use. Please read crypto/idea.c for + details. + + KNOWN ATTACKS: + As of 1995, the most successful attack broke two of the eight rounds + of IDEA. Since then, I strongly believe in the existence of better + attacks, but you should search the literature to be sure. + +MD5 digest (EXPERIMENTAL) +CONFIG_DIGEST_MD5 + [2000-09-13] + MD5 once was the most widely used hash function, until it was shown + that MD5 is not collision-resistant, i.e., you can find messages M, + M', such that MD5(M)=MD5(M') faster than brute-force. This is called + a "birthday attack", named after the birthday paradox. Although this + is not a security problem per se, it is still something a + cryptographically strong hash function should not exhibit. + + Don't use MD5 anymore, except to support legacy applications (of + which there should not be too many, since the digest API is + relatively new) and for fingerprinting files, something that was + better done in user space. + +SHA1 digest (EXPERIMENTAL) +CONFIG_DIGEST_SHA1 + [2000-09-13] + SHA-1 is currently the most widely deployed hash function. Although + designed by the NSA it is generally believed to not contain back + doors and be the most secure message digest available today. If you + want to use a cryptographically secure hash function, use SHA-1. + +Twofish encryption (only as module) +CONFIG_BLK_DEV_LOOP_FISH2 + DESCRIPTION: + Twofish is a quite new algorithm invented by Bruce Schneier, Doug + Whiting, John Kelsey, Chris Hall and David Wagner, for more + information see http://www.counterpane.com/twofish.html. It is one of + the remaining five candidates for the Advanced Encryption + Standard (AES). Blowfish is the older algorithm and was also + invented by Bruce Schneier. + + SPEED: N/A + + PATENTS and LICENSING: + Both algorithms are free of licensing charges at the moment. Twofish + must remain so if it is elected as AES winner. + + KNOWN ATTACKS: + to be written + + This module operates twofish in CBC-mode + +Blowfish encryption (EXPERIMENTAL) +CONFIG_CIPHER_BLOWFISH + [2000-09-13] + DESCRIPTION: + Blowfish is an algorithm invented by Bruce Schneier. For more + information about the algorithm see + http://www.counterpane.com/blowfish.html or see Schneier's book + "Applied Cryptography", chapter 13.4. Twofish is the newer algorithm + and was also invented by Bruce Schneier (et al.). + + SPEED: + Blowfish is a very efficient cipher on 32-bit microprocessors. In + fact, I guess it is the fastest available for the Linux Crypto API + as of now. Definitive figures should be added here... + + PATENTS and LICENSEING: + Blowfish is free of patents and licensing charges and Schneier says + it will stay that way. + + KNOWN ATTACKS: + to be written Network Block Device support CONFIG_BLK_DEV_NBD diff -urN lin.2.2.17/Documentation/crypto/00-INDEX int.2.2.17.x/Documentation/crypto/00-INDEX --- lin.2.2.17/Documentation/crypto/00-INDEX Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/Documentation/crypto/00-INDEX Sat Oct 14 00:48:17 2000 @@ -0,0 +1,24 @@ +This directory contains patches and documentation to code in the kernel that +contains crypto + - Alexander Kjeldaas + +ENskip-patch + - Patch for ENskip-0.67 for Linux 2.1.118 and glibc. + By Bob Tracy . + +I am trying to update some of this.... + - 22.05.2000 - Hauke Johannknecht + +util-linux is at 2.10o now and can be found at: + ftp://ftp.win.tue.nl/pub/linux/utils/util-linux/ + +util-linux-2.10o.int.patch + the main diff seems to be they merged losetup and lomount ... + +util-linux-2.10m.getpass.diff + modifies losetup to accept the key on the command-line via + an added "-k" switch. + This is insecure and pure evil. [tm] + Could someone add the -pass stuff from openssl to losetup ? + + diff -urN lin.2.2.17/Documentation/crypto/ChangeLog int.2.2.17.x/Documentation/crypto/ChangeLog --- lin.2.2.17/Documentation/crypto/ChangeLog Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/Documentation/crypto/ChangeLog Mon Oct 16 18:20:54 2000 @@ -0,0 +1,675 @@ +2000-10-16 Alexander Kjeldaas + + * International kernel patch 2.2.17.10 released. + + * Changes from 2.4 kernel port by Harald Welte + merged. + + * Added AES-style testvectors "ecb_vk.txt" for all AES finalists. + + * Removed cipher_context->key - nobody was using it. Changed + cipher_context->iv from u32[] to u8[]. + + * In loop_gen.c: IV for cbc-mode initialized in little-endian + manner. NOTE: This breaks old loopback files on big-endian + machines. + + * testing: New option -s to testcip to swab32 the ciphertext + before comparisons. Compile fixes. + +2000-10-16 Alexander Kjeldaas + + * International kernel patch 2.2.17.9 released. + + * loop_gen.c fix. Do not check blocksize of a cipher to decide + whether it supports encrypting a variable-length block. It always + does. + +2000-10-14 Alexander Kjeldaas + + * International kernel patch 2.2.17.8 released. + + * Configure.help updates with the AES results. Patch from Marc + Mutz + + * Cipher list in config organized according to block-size with AES + at the top. Patch from Marc Mutz + + * The set of allowed key-sizes for a cipher is now exported as a + mask in /proc. Constants for allowed key-sizes are defined in + crypto.h. Patch from Marc Mutz + + * Ability to build cryptoapi.c as a module was missing from + Config.in. Fixed. + + * DEFINE_{DIGEST,CIPHER} et. al. removed and replaced by explicit + struct {digest,cipher}_implementation initializations making the + code more readable. + + * API change. Encryp/Decrypt now accepts any input/output byte + count. + + * gen-cbc.h changed to allow any input-size for encryption, or + output-size for decryption. When encrypting large blocks, + gen-cbc.h will now sleep (you can play music while using an + encrypted file-system). Added gen-ecb.h which implements the same + for ECB mode. All ciphers changed to use gen-ecb.h to implement + their ECB mode. + + * Removed old cruft (crypto/cipherapi.c crypto/digestapi.c) + + * crypto/cryptoapi.c implementation made simpler. + + * Crypto API functions are documented in kernel-doc style. + + * crypto/testing updates. digesttest now compiles. A lot of + duplicated functions are now available in misc.c. None of the + programs include glibc headers any more, all necessary functions + are declared in libcfuncs.h. New program "testapi" for testing + that a cipher deals with the new API. + +2000-10-03 Alexander Kjeldaas + + * International kernel patch 2.2.17.7 released. + + * speed.c cleanups. + + * The crypto API now compiles when proc support has been disabled. + + * AES cipher added. The AES cipher is implemented by the rijndael + module, but with a separate cipher id/name. + + * Updated Rijndael implementation from Brian Gladman merged. + + * ECB testvectors for rijndael from the AES submission added. + +2000-09-28 Alexander Kjeldaas + + * International kernel patch 2.2.17.6 released. + + * Twofish implementation added. Patch from Marc Mutz + . + + * loop_gen.c cleanups + plugged memory leak by Marc Mutz + . + + * Configure.help updates. Patch from Marc Mutz + + * New script crypto/testing/aes-test from Marc Mutz tests ciphers + based on the known-answer test values in NIST format. + + * crypto/testing/speed.c used weak DES-keys for speed-testing. + Fixed by patch from Gisle Sælensminde . + +2000-09-25 Alexander Kjeldaas + + * International kernel patch 2.2.17.5 released. + + * Update ChangeLog :-) + + * International kernel patch 2.2.17.4 released. + + * Configure.help updates from Marc Mutz + + * Changed ripe-md160 implementation in the util-linux patch + because of license worries. Now uses GnuPG implementation. Patch + from Marc Mutz . + + * util-linux patch can now create more than 160 bits of enthropy + for the 3des cipher by first hashing the passphrase, and then + hashing the passphrase prepended by the character "A". Patch from + Gisle Sælensminde . + + * rijndael3.c updates from Marc Mutz should get + this cipher working again. + +2000-09-19 Alexander Kjeldaas + + * International kernel patch 2.2.17.3 released. + + * Some changes were made to crypto/testing/speed.c to make it + compile again after the crypto API changes. + + * des_ede3.c updates from Gisle Sælensminde + containing updated docs on weak/semi-weak keys and how they are + handled, some code updates, and testvectors for 3des. + + * Received Configure.help updates from Marc Mutz + including the AES status of various ciphers and their best known + attacks. + +2000-09-15 Alexander Kjeldaas + + * International kernel patch 2.2.17.2 released. + + * Added 3DES (DES_EDE3) cipher from Gisle Sælensminde + . The implementation is based on the + DES-implementation already in kerneli so at this point it's not + very fast. + +2000-09-14 Alexander Kjeldaas + + * International kernel patch 2.2.17.1 released. + + * New util-linux-2.10m.getpass.diff from Hauke Johannknecht + that some might want to use. Adds a -k option + to losetup. Not for the security-conscious, but some might want + to use it. + +2000-08-04 Alexander Kjeldaas + + * International kernel patch 2.2.16.9 released. + + * Fixed gcc 2.9x compile failure of the loop_cast.c module (patch + by Sverker Wiberg ). + +2000-08-02 Alexander Kjeldaas + + * International kernel patch 2.2.16.8 released. + + * Fixed SMP compile bug. + +2000-07-17 Alexander Kjeldaas + + * International kernel patch 2.2.16.7 released. + + * Merged some bug-fixes from 2.4.0test2.1 patch. + +2000-07-10 Alexander Kjeldaas + + * International kernel patch 2.2.16.6 released. + + * Small annoyance when using "make xconfig" fixed by + Andreas Steinmetz + +2000-07-03 Alexander Kjeldaas + + * International kernel patch 2.2.16.5 released. + + * Removed {un,}lock_cipher, {un,}lock_digest functions. Use + {digest,cipher}_implementation->{un,}lock() directly instead. + + * Stopped using linux/lists.h which is depreciated. + + * Merged crypto/cipherapi.c and crypto/digestapi.c into single + interface cryptoapi.c, saving 4k. Cipher- and digest algorithms + are now subclasses of a "transform". The old interface is still + supported for the most part. + + * Changed encrypt/decrypt interfaces to use byte-pointers instead + of int32-pointers. This means that the ciphers should start being + endian-aware. + +2000-06-27 Alexander Kjeldaas + + * International kernel patch 2.2.16.4 released. + * Fixed build bug that prevented digestapi.c from being built for + kernels with modules disabled. Fix by + Andreas Steinmetz + +2000-06-19 Alexander Kjeldaas + + * International kernel patch 2.2.16.3 released. + * Changed generic_rotl and generic_rotr to be macros instead of + inline functions. Gcc uses an extra register with the inline + functions (noted by Gisle Sælensminde). + * Fixed bug in Makefile for SHA1 digest (noted by Walter Hofmann + ). + +2000-06-19 Gisle Sælensminde + + * Further serpent implementation optimization. + +2000-06-14 Alexander Kjeldaas + + * International kernel patch 2.2.16.2 released. + * Fixed bug in md5c.c:Decode for big-endian machines. Noted by + David Kuestler . + +2000-06-14 Gisle Sælensminde + + * Faster serpent implementation based on optimized pentium-sboxes + made by Dag Arne Osvik. + +2000-06-14 Hauke Johannknecht + + * Documentation updates (replay.com -> zedz.com) + * Added util-linux-2.10m.int.patch + +2000-06-14 Alexander Kjeldaas + + * International kernel patch 2.2.16.1 released. + * International kernel patch 2.2.15.1 released. + +2000-02-18 Alexander Kjeldaas + + * International kernel patch 2.2.14.1 released. + +1999-11-23 Alexander Kjeldaas + + * International kernel patch 2.2.13.3 released. + + * Minor tweak to make sure the FreeSWAN 1.1 release patches cleanly. + +1999-11-23 Andrew McDonald + + * SHA1 implementation for the digest API added (based on the + public domain code by Steve Reid and the md5glue code). + + * Added a digest algorithm test program in linux/crypto/testing/ + + * FIX: The blowfish module claimed to have a 128-bit (16 byte) + blocksize and IV. The correct number is of course 64-bit. + + * FIX: The working size for MD5 was wrong (too little memory was + allocated). + +1999-10-25 Alexander Kjeldaas + + * International kernel patch 2.2.13.2 released. + + * Compile fix for MD5 by Hermann Schichl + +1999-10-20 Alexander Kjeldaas + + * International kernel patch 2.2.13.1 released. + + * New upstream kernel release. + +1999-09-15 Alexander Kjeldaas + + * International kernel patch 2.2.12.2 released. + + * Digest API mirroring the cipher API added. Contributed by Alan + Smithee. + + * MD5 digest algorithm added. + +1999-09-08 Alexander Kjeldaas + + * International kernel patch 2.2.12.1 released. + +1999-09-06 Alexander Kjeldaas + + * Updated util-linux patch in Documentation/crypto and removed + some patches that nobody uses. + +1999-08-12 Alexander Kjeldaas + + * International kernel patch 2.2.11.2 released. + + * CIPE can only be built as a module, the make config indicated + otherwise. + + * Upgraded to CIPE 1.3.0 + + * International kernel patch 2.2.11.1 released. + + * New upstream kernel release. + +1999-06-24 Alexander Kjeldaas + + * International kernel patch 2.2.10.4 released. + + * Added new config option for using relative block numbers instead + of absolute ones when calling the loop block device's transfer + function. This should fix the #1 issue with using loopback crypto + filesystems. + + * Updated Documentation/Configure.help which had erroneous + CONFIG_XX variables listed for various ciphers [Thanks to Andrew + Pam for spotting this]. + + * Added LO_CRYPT_RIJNDAEL and LO_CRYPT_RC5 variables to + include/linux/loop.h. + + * Updated the faq to mention rijndael and rc5, as well as how to + convert from the old absolute block number stuff to the new + relative one. + +1999-06-24 Alexander Kjeldaas + + * International kernel patch 2.2.10.3 released. + +1999-06-24 Andrew Pam + + * Updated util-linux patch to cover 2.9s + +1999-06-23 Alexander Kjeldaas + + * International kernel patch 2.2.10.2 released. + * Stuff in linux/crypto/testing didn't compile. + +1999-06-19 Pekka Riikonen + + * Added RC5 cipher. + +1999-06-18 Alexander Kjeldaas + + * International kernel patch 2.2.10.1 released. + * ENskip support didn't compile. + +1999-05-21 Alexander Kjeldaas + + * International kernel patch 2.2.9.1 released. + +1998-12-18 Patrice Lacroix + + * Updates to the faq (Documentation/crypto/faq.txt) + +1999-04-15 Alexander Kjeldaas + + * International kernel patch 2.2.5.1 released. + * Merged with kernel 2.2.5 + * New documentation for loopback crypto in + Documentation/crypto/faq.txt + +1999-03-25 Alexander Kjeldaas + + * International kernel patch 2.2.4.1 released. + * Merged with kernel 2.2.4 + +1999-01-29 Alexander Kjeldaas + + * International kernel patch 2.2.1.1 released. + +1998-01-29 Patrice Lacroix + + * /proc/crypto support. + +1999-01-27 Alexander Kjeldaas + + * International kernel patch 2.2.0.2 released. + + * missing #endif in net/ipv4/ip_output.c in latest patch + fixed. Missing #include fixed in crypto.h + +1999-01-26 Alexander Kjeldaas + + * International kernel patch 2.2.0.1 released. + + * Merged Frank Bernard's latest ENskip patches. + +1999-01-18 Alexander Kjeldaas + + * International kernel patch 2.2.0-pre7.4 released. + + * Added cbc-mode to cast256 cipher. + + * Removed spam on unload from crypto modules. + + * Added updated ENskip patches from Frank Bernard's web site: + http://www.linux-firewall.de/enskip/ + + * International kernel patch 2.2.0-pre7.3 released. + + * Added missing cleanup_module to DES, Blowfish and IDEA ciphers. + + * International kernel patch 2.2.0-pre7.2 released. + + * Cleanup in drivers/block/Config.in. It was possible to create + an invalid .config file. + + * Minor crypto/api.c cleanup. + +1999-01-17 Alexander Kjeldaas + + * International kernel patch 2.2.0-pre7.1 released. + + * Added testcip.c - a general purpose cipher test program. Added + test-vector scripts for Blowfish, DES, Mars, and Serpent. + + * Naming error left users unable to compile loop_gen unless it was + compiled as a module. + + * Updated Serpent implementation. Sam Simpson has been running a + background task on a cluster of high performance servers. After a + search involving around 1000 machine hours improved sboxes were + found. + + * Updated RC6 implementation. Supposedly faster. + + * Updated MARS implementation. Fixes a bug in mars_set_key. + +1999-01-07 Alexander Kjeldaas + + * International kernel patch 2.2.0-pre5.1 released. + * Merged with vanilla 2.2.0-pre5 + +1999-01-05 Herbert Valerio Riedel + + * APX fixes. + +1999-01-04 Alexander Kjeldaas + + * International kernel patch 2.2.0-pre4.1 released. + + * Removed obsolete loop_idea.c and loop_blow.c since IDEA and + blowfish algorithms have been added to the crypto library. + + * drivers/block/ll_rw_blk.c: Added loop_gen_init. loop_gen only + worked as a module. + +1998-12-30 Alexander Kjeldaas + + * crypto/testing/speed.c: i386-specific timer-code removed. + + * crypto configuration added for all architectures (previously + only i386 was supported). However, 64-bit and endian issues needs + to be ironed out for a lot of platforms (maybe even i386). + +1998-12-29 Alexander Kjeldaas + + * International kernel patch 2.2.0-pre1.1 released. + * International kernel patch 2.1.131.8 released. + * DES/IDEA compile fixes. + +1998-12-29 Raimar Falke + + * DES cipher added. crypto/testing/speed.c fixes. + +1998-12-18 Alexander Kjeldaas + + * International kernel patch 2.1.131.7 released. + +1998-12-18 Raimar Falke + + * include-fixes for IDEA cipher. + +1998-12-18 Alexander Kjeldaas + + * International kernel patch 2.1.131.6 released. + +1998-12-18 Raimar Falke + + * IDEA cipher added. + +1998-12-18 Patrice Lacroix + + * My latest patch for modular loop encryption. I think everything + is in there. Ciphers are only requested on LOOP_SET_STATUS. Module + count is always right (for what I have tested) and unloading now + works. + +1998-12-17 Alexander Kjeldaas + + * International kernel patch 2.1.131.5 released. + +1998-12-17 Raimar Falke + + * Extracted the blowfish code from loop_blow and made a + cipher-module of it. + +1998-12-17 Alexander Kjeldaas + + * Removed loop_serpent, loop_mars, loop_dfc and loop_rc6 since + their funcionality is available through loop_gen. + +1998-12-16 Alexander Kjeldaas + + * Removed loop_idea from the configuration menus. It hasn't been + converted to the new API. + +1998-12-14 Alexander Kjeldaas + + * Fixes to the rijndael cipher. It builds, but isn't working + properly so it it disabled for the moment. The cipher is from + Dr. Brian Gladman AES + reimplementation project. More information on rijndael: + http://www.esat.kuleuven.ac.be/~rijmen/rijndael/ Rijndael is free. + +1998-12-14 Patrice Lacroix + + * More modular ciphers/loop patches. Cipher locking fixes. + Autoloading of ciphers. More loop and loop_gen integration. + +1998-12-14 Alexander Kjeldaas + + * International kernel patch 2.1.131.4 released. + + * Added util-linux-2.9e patch to Documentation/crypto that makes + all the loopback ciphers available to the losetup utility. + +1998-12-12 Alexander Kjeldaas + + * International kernel patch 2.1.131.3 released. + + * Added the popular CIPE (crypto IP encapsulation) made by + Olaf Titz + + * Previous patch wouldn't build. International kernel patch + 2.1.131.2 released. + +1998-12-11 Alexander Kjeldaas + + * International kernel patch 2.1.131.1 released. + + * Clear sensitive memory before kfree in generel loop module. New + upstream kernel. + +1998-12-11 Patrice Lacroix + + * Modular ciphers + +1998-11-30 Alexander Kjeldaas + + * International kernel patch 2.1.130.1 released. + + * loop-devices other than loop_gen updated to use new interface. + However, the block-number isn't used for anything yet. + + * loop_gen.c: Now we use the ciphers in cbc-mode only. Also, the + IV of the cipher is initialized based on block-number. + + * Added general cbc-mode that is simply #included into the + ciphers. cbc-mode thus added to serpent, mars, rc6 and dfc. + + * Added ivsize to struct cipher_implementation. + + * Added for_each_cipher function + + * Added X11-like license for the crypto-directory. The code might + be useable for other projects as well in the future. [And GPL is + arguable the wrong license for crypto]. + +1998-11-25 Alexander Kjeldaas + + * The crypto api is useable from modules. + + * Fixed a bunch of bugs in loop_gen. I think the oopses are gone. + +1998-11-23 Alexander Kjeldaas + + * International kernel patch 2.1.129.4 released. + + * Added crypto/testing/speed.c to test the speed of the different + crypto algorithms. + + * cast256, crypton, rijndael, safer, and twofish added, but they + are not yet completely ported to the crypto-library. + + * Updated implementations of MARS, DFC, RC6 and SERPENT. + +1998-11-22 Alexander Kjeldaas + + * International kernel patch 2.1.129.3 released. + + * "loop_gen" - skeleton of general loop crypto driver added + + * Made loop-modules for DFC, MARS, and RC6 + + * Added DFC, MARS, and RC6 to crypto library + + * International kernel patch 2.1.129.2 released. + + * Updated documentation to show which loopback modules are ECB + and which are CBC. + + * Kernel crypto library on its way. Serpent is the first member. + + * Changed memcpy to memset in loop_blow.c to close a possible + plaintext leak. + +1998-11-20 Alexander Kjeldaas + + * New upstream kernel release 2.1.129 + +1998-11-13 Alexander Kjeldaas + + * New upstream kernel release 2.1.128 + +1998-11-09 Alexander Kjeldaas + + * New upstream kernel release 2.1.127 + +1998-10-12 Alexander Kjeldaas + + * drivers/block/loop_serpent.c: Made wrapper-module for the + serpent cipher. + + * crypto/serpent.c crypto/serpent_f_box.h}: Added serpent + implementation from Dr. B R Gladman + AES reimplementation project. + + * drivers/block/Config.in: Loopback crypto flagged experimental + +1998-10-09 Alexander Kjeldaas + + * International kernel patch 2.1.125.1 released. + + * New upstream kernel release 2.1.125 + +1998-10-08 Alexander Kjeldaas + + * International kernel patch 2.1.124.2 released. + + * Added Andi Kleene's loop fixes. Updated twofish, blowfish and + cast128 modules to use the new lock/unlock interface. + +1998-10-07 Alexander Kjeldaas + + * Ported loop_cast.c to the new loopback API interface. + + * Blowfish and Twofish can be compiled in instead of being + modules. + + * Added cast and idea to the config-system. + + * Wrote Configure.help entries for the loop crypto patches. + +1998-10-05 Alexander Kjeldaas + + * International kernel patch 2.1.124.1 released. + + * Added cast128 and idea loopback modules from Andrew E. Mileski's + loop-13.tar.gz package. + + * Added latest ENskip patches from Bob Tracy + +1998-10-05 Ingo Rohloff + + * Fixed bug in loop.c regarding handling of calls to + loop_release_xfer() + + * Added modules for blowfish and twofish to the loopback + filesystem diff -urN lin.2.2.17/Documentation/crypto/ENskip-patch int.2.2.17.x/Documentation/crypto/ENskip-patch --- lin.2.2.17/Documentation/crypto/ENskip-patch Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/Documentation/crypto/ENskip-patch Sat Oct 14 00:48:17 2000 @@ -0,0 +1,943 @@ +--- ENskip-0.67/Makefile.orig Sun May 25 11:04:47 1997 ++++ ENskip-0.67/Makefile Thu Apr 9 16:34:17 1998 +@@ -48,7 +48,8 @@ + FLAGS_linux_KERNEL = -fomit-frame-pointer -fno-strength-reduce -O2 -DKERNEL -D__KERNEL__ -DMODULE -Wall -pipe -I`pwd`/../linux -I/usr/src/linux/include + FLAGS_linux_USER = -g -O2 -Wall -pipe -I/usr/include -I`pwd`/../skipd -I`pwd`/../linux -I/usr/src/linux/include + FLAGS_linux_CERT = $(FLAGS_linux_USER) +-LIBS_linux_USER = ++# Add -lg++ for g++-2.8.1: use of libg++ is deprecated. ++LIBS_linux_USER = -lg++ + + #if you are forced to use the SUN compiler + #DIR_solaris = solaris +--- ENskip-0.67/linux/interface.c.orig Wed Feb 5 15:37:14 1997 ++++ ENskip-0.67/linux/interface.c Tue Aug 18 19:32:44 1998 +@@ -22,13 +22,14 @@ + #include "config.h" + #define __NO_VERSION__ + #include +-#include +-#include +-#include +-#include +-#include ++#include ++#include ++#include ++#include ++#include "ip.h" /* __USE_BSD section only */ + #include + #include ++#include + #include + #include + #include +@@ -54,7 +55,7 @@ + + + /* This function copies an skb, growing it to "size" bytes. +- Mostly derived from the Linux 2.0.25 skb_copy function. */ ++ Mostly derived from the Linux 2.1.92 skb_copy function. */ + + static struct sk_buff *skb_expand_copy(struct sk_buff *skb, int size) + { +@@ -63,8 +64,6 @@ + + /* Allocate the copy buffer */ + +- IS_SKB(skb); +- + n = alloc_skb(size, GFP_ATOMIC); + if (n == NULL) + return NULL; +@@ -80,33 +79,25 @@ + + /* Copy the bytes */ + memcpy(n->head, skb->head, skb->end - skb->head); +- n->link3 = NULL; +- n->list = NULL; +- n->sk = NULL; +- n->when = skb->when; +- n->dev = skb->dev; +- n->h.raw = skb->h.raw + offset; +- n->mac.raw = skb->mac.raw + offset; +- n->ip_hdr = (struct iphdr *)(((char *)skb->ip_hdr) + offset); +- n->saddr = skb->saddr; +- n->daddr = skb->daddr; +- n->raddr = skb->raddr; +- n->seq = skb->seq; +- n->end_seq = skb->end_seq; +- n->ack_seq = skb->ack_seq; +- n->acked = skb->acked; +- memcpy(n->proto_priv, skb->proto_priv, sizeof(skb->proto_priv)); +- n->used = skb->used; +- n->free = 1; +- n->arp = skb->arp; +- n->tries = 0; +- n->lock = 0; +- n->users = 0; +- n->pkt_type= skb->pkt_type; +- n->stamp = skb->stamp; ++ n->csum = skb->csum; ++ n->list = NULL; ++ n->sk = NULL; ++ n->dev = skb->dev; ++ n->priority = skb->priority; ++ n->protocol = skb->protocol; ++ n->dst = dst_clone(skb->dst); ++ n->h.raw = skb->h.raw + offset; ++ n->nh.raw = skb->nh.raw + offset; ++ n->mac.raw = skb->mac.raw + offset; ++ memcpy(n->cb, skb->cb, sizeof(skb->cb)); ++ n->used = skb->used; ++ n->is_clone = 0; ++ atomic_set(&n->users, 1); ++ n->pkt_type = skb->pkt_type; ++ n->stamp = skb->stamp; ++ n->destructor = NULL; ++ n->security = skb->security; + +- IS_SKB(n); +- + return n; + } + +@@ -128,9 +119,9 @@ + /* first "segment descriptor" (the one and only we actually use) */ + mb->ms = ms; + /* offset == offset of IP header in data area */ +- mb->offset = (u_char *) skb->ip_hdr - skb->head; ++ mb->offset = (u_char *) skb->nh.iph - skb->head; + /* len == length of IP packet */ +- mb->len = ntohs(skb->ip_hdr->tot_len); ++ mb->len = ntohs(skb->nh.iph->tot_len); + + /* ptr == pointer to the data area in first segment descriptor */ + ms->ptr = skb->head; +@@ -180,7 +171,7 @@ + int input_packet(struct firewall_ops *this, int pf, struct device *dev, + void *phdr, void *arg, struct sk_buff **pskb) + { +- struct iphdr *ipp = (*pskb)->ip_hdr; ++ struct iphdr *ipp = (*pskb)->nh.iph; + int tot_len = ntohs(ipp->tot_len); + struct sk_buff *newm, *qskb; + int result; +@@ -222,8 +213,8 @@ + + } + +- if ((*pskb)->proto_priv[15] & RCV_SEC) +- return FW_SKIP; ++ if ((*pskb)->security & RCV_SEC) ++ return FW_SKIP; /* Already processed this packet. */ + + /* never change transparent UDP ports needed for discovery */ + if ((ipp->protocol == IPPROTO_UDP) && +@@ -247,7 +238,7 @@ + + save_flags(flags); + cli(); +- ++ + /* Clone the input skb. This operation locks the data of the input skb, + so we can queue it. Be careful not to free the skb while it is queued! */ + qskb = newm = skb_clone(*pskb, GFP_ATOMIC); +@@ -259,17 +250,24 @@ + skb2memblk(newm, &oldmb, oldms); + + +- result = skip_process(SKIP_INPUT, NULL, NULL, (void *) &newm, &oldmb, &newmb); ++ result = skip_process(SKIP_INPUT, NULL, NULL, (void **) &newm, &oldmb, &newmb); + + + if (result == SKIP_PROCESSED) { + /* nothing happened */ + +- kfree_skb(newm, FREE_WRITE); + if (newm != qskb) +- kfree_skb(qskb, FREE_WRITE); ++ kfree_skb(qskb); ++ kfree_skb(newm); + +- newm->proto_priv[15] = RCV_SEC; ++ /* ++ * Original code had "newm->security = RCV_SEC;" below. This ++ * was an artifact from the Solaris port where the new mblk_t ++ * gets put on the input queue, and is incorrect in the current ++ * context because newm is freed above: if "nothing happened", ++ * we free qskb and newm regardless of whether newm is different. ++ * Why newm would be different is puzzling. --rct ++ */ + retval = FW_SKIP; + } + else if (result > SKIP_PROCESSED) { +@@ -277,37 +275,40 @@ + + /* fix up the skb pointers */ + newm->data = BLKSTART(&newmb); +- newm->ip_hdr = (struct iphdr *) newm->data; +- newm->len = ntohs(newm->ip_hdr->tot_len); ++ newm->nh.iph = (struct iphdr *) newm->data; ++ newm->len = ntohs(newm->nh.iph->tot_len); + newm->tail = newm->data + newm->len; + newm->protocol = htons(ETH_P_IP); + newm->ip_summed = 0; +- newm->h.iph = newm->ip_hdr; ++ newm->h.ipiph = newm->nh.iph; + + /* and mark the skb as "authenticated"/"decrypted" */ +- newm->proto_priv[15] = ((result & SKIP_P_AUTH) ? RCV_AUTH : 0) +- | ((result & SKIP_P_DECRYPT) ? RCV_CRYPT : 0) +- | ((result & SKIP_P_TUNNEL) ? RCV_TUNNEL : 0) +- | RCV_SEC; ++ /* ++ * The original code statement below ended with "| RCV_SEC" which ++ * reduced the statement to "newm->security = RCV_SEC;". --rct ++ */ ++ newm->security = (((result & SKIP_P_AUTH) ? RCV_AUTH : 0) ++ | ((result & SKIP_P_DECRYPT) ? RCV_CRYPT : 0) ++ | ((result & SKIP_P_TUNNEL) ? RCV_TUNNEL : 0)) ++ & RCV_SEC; + + /* and feed the packet back into the input queue (must not switch + skbs here, because we need the defragmentor) */ + if (newm != qskb) +- kfree_skb(qskb, FREE_WRITE); +- ++ kfree_skb(qskb); + netif_rx(newm); /* frees skb for us */ + } + else if (result == SKIP_QUEUED) { + /* the skb was queued */ + + if (newm != qskb) +- kfree_skb(newm, FREE_WRITE); ++ kfree_skb(newm); + } else { + /* bad packet, policy violation, unsupported protocol, etc. */ + +- kfree_skb(newm, FREE_WRITE); + if (newm != qskb) +- kfree_skb(qskb, FREE_WRITE); ++ kfree_skb(qskb); ++ kfree_skb(newm); + } + + restore_flags(flags); +@@ -327,7 +328,7 @@ + int output_packet(struct firewall_ops *dummy1, int pf, struct device *dev, + void *dummy3, void *arg, struct sk_buff **pskb) + { +- struct iphdr *ipp = (*pskb)->ip_hdr; ++ struct iphdr *ipp = (*pskb)->nh.iph; + int tot_len = ntohs(ipp->tot_len); + struct sk_buff *newm, *qskb; + int result; +@@ -344,7 +345,7 @@ + /* Recursion happens if the datagram has been fragmented: + ip_queue_xmit -> skip -> ip_fragment -> ip_queue_xmit -> SKIP */ + +- if ((*pskb)->proto_priv[15] & SND_SEC) ++ if ((*pskb)->security & SND_SEC) + return FW_ACCEPT; + + /* this happens, too */ +@@ -388,15 +389,15 @@ + skb2memblk(newm, &oldmb, oldms); + + +- result = skip_process(SKIP_OUTPUT, NULL, NULL, (void *) &newm, &oldmb, &newmb); ++ result = skip_process(SKIP_OUTPUT, NULL, NULL, (void **) &newm, &oldmb, &newmb); + + + if (result == SKIP_PROCESSED) { + /* nothing happened - if not enskipped, we just say "OK" */ + +- kfree_skb(newm, FREE_WRITE); ++ kfree_skb(newm); + if (newm != qskb) +- kfree_skb(qskb, FREE_WRITE); ++ kfree_skb(qskb); + + /* check user level policy */ + if (!((*pskb)->sk && +@@ -404,7 +405,7 @@ + (*pskb)->sk->encryption >= IPSEC_LEVEL_USE))) { + + /* Set marker in skb + accept packet */ +- (*pskb)->proto_priv[15] |= SND_SEC; ++ (*pskb)->security |= SND_SEC; + retval = FW_SKIP; + } + } +@@ -418,27 +419,27 @@ + (!(result & SKIP_P_ENCRYPT) && + (*pskb)->sk->encryption >= IPSEC_LEVEL_USE))) { + +- kfree_skb(newm, FREE_WRITE); ++ kfree_skb(newm); + if (newm != qskb) +- kfree_skb(qskb, FREE_WRITE); ++ kfree_skb(qskb); + } + else { + /* fix up skb */ + newm->data = BLKSTART(&newmb); +- newm->ip_hdr = (struct iphdr *) newm->data; +- newm->len = ntohs(newm->ip_hdr->tot_len); ++ newm->nh.iph = (struct iphdr *) newm->data; ++ newm->len = ntohs(newm->nh.iph->tot_len); + newm->tail = newm->data + newm->len; + newm->protocol = htons(ETH_P_IP); + newm->ip_summed = 0; +- newm->h.iph = newm->ip_hdr; ++ newm->h.ipiph = newm->nh.iph; + + newm->dev = dev; + + if (newm != qskb) +- kfree_skb(qskb, FREE_WRITE); ++ kfree_skb(qskb); + + /* Set marker in skb */ +- newm->proto_priv[15] |= SND_SEC; ++ newm->security |= SND_SEC; + + interface_ship_out(newm); + +@@ -449,7 +450,7 @@ + /* queued, will be fed back to us */ + + if (newm != qskb) +- kfree_skb(newm, FREE_WRITE); ++ kfree_skb(newm); + + qskb->dev = dev; + +@@ -458,9 +459,9 @@ + else { + /* bad packet/policy/etc. */ + +- kfree_skb(newm, FREE_WRITE); ++ kfree_skb(newm); + if (newm != qskb) +- kfree_skb(qskb, FREE_WRITE); ++ kfree_skb(qskb); + } + + restore_flags(flags); +@@ -500,7 +501,7 @@ + int packet_accept(struct firewall_ops *this, int pf, struct device *dev, + void *phdr, void *arg, struct sk_buff **pskb) + { +- if ((*pskb)->proto_priv[15] & SND_SEC) ++ if ((*pskb)->security & SND_SEC) + return FW_ACCEPT; + else + return FW_SKIP; +@@ -514,10 +515,32 @@ + + static inline void interface_ship_out(struct sk_buff *skb) + { +- IS_SKB(skb); ++ /* ++ * Not sure how to do this for 2.1.X. ip_forward() will free skb ++ * before returning non-zero, so for the first attempt we'll simply ++ * call ip_forward() and be done with it. N.B.: for 2.0.X, nothing ++ * was done for the case where ip_forward() returned 0. ++ * ++ * New for 2.1.X: ip_forward() cannot be told to leave the TTL alone, ++ * so we'll increment it and recalculate the checksum before calling ++ * ip_forward(). Alan says I can pass stuff out through the routing ++ * code directly, but I'm not savvy enough to see how that might be ++ * done. --rct ++ */ ++ struct iphdr *iph; ++ unsigned short check; ++ ++ /* ++ * Hopefully, this is the inverse of ip_decrease_ttl(). ++ */ ++ iph = skb->nh.iph; ++ check = ntohs(iph->check) - 0x0100; ++ if ((check & 0xff00) == 0xff00) ++ check--; ++ iph->check = htons(check); ++ ++iph->ttl; + +- if (ip_forward(skb, skb->dev, IPFWD_NOTTLDEC, skb->h.iph->daddr)) +- kfree_skb(skb, FREE_WRITE); ++ (void)ip_forward(skb); + } + + +@@ -528,15 +551,12 @@ + unsigned long flags; + */ + +- IS_SKB(skb); +- +- + /* fix the packet for ip_forward (because ip_build_xmit might not have) */ +- skb->h.iph = skb->ip_hdr; ++ skb->h.ipiph = skb->nh.iph; + + /* check it */ +- if (output_packet(NULL, PF_IPSEC, skb->dev, NULL, NULL, &skb) < FW_ACCEPT) +- kfree_skb(skb, FREE_WRITE); ++ if (output_packet(NULL, PF_SECURITY, skb->dev, NULL, NULL, &skb) < FW_ACCEPT) ++ kfree_skb(skb); + else { + /* ...and ship it */ + /* +@@ -670,18 +690,26 @@ + int interface_attach(void *dummy, u_char *ipaddr) + { + struct device *dev; ++ struct in_device *in_dev; ++ struct in_ifaddr *ifa; + int result = -1; + +- for (dev = dev_base; dev != NULL; dev = dev->next) { +- if ((dev->family == AF_INET) && (dev->pa_addr == *((__u32 *) ipaddr)) +- && !dev_skip(dev, "attach")) { +- if (dev->mtu < 68 + maxheadergrowth) +- printk("enskip: %s: interface mtu of %d is too small\n", +- dev->name, dev->mtu); +- else { +- dev->mtu -= maxheadergrowth; +- dev_addlist(dev); +- result = 0; ++ for (dev = dev_base; dev; dev = dev->next) { ++ if ((in_dev = dev->ip_ptr) != NULL) { ++ for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { ++ if (ifa->ifa_local == *((__u32 *) ipaddr) && !dev_skip(dev, "attach")) { ++ if (dev->mtu < 68 + maxheadergrowth) ++ printk("enskip: %s: interface mtu of %d is too small\n", ++ dev->name, dev->mtu); ++ else { ++ if (dev->change_mtu) ++ (void)dev->change_mtu(dev, dev->mtu - maxheadergrowth); ++ else ++ dev->mtu -= maxheadergrowth; ++ dev_addlist(dev); ++ result = 0; ++ } ++ } + } + } + } +@@ -692,14 +720,22 @@ + int interface_detach(void *dummy, u_char *ipaddr) + { + struct device *dev; ++ struct in_device *in_dev; ++ struct in_ifaddr *ifa; + int result = -1; + +- for (dev = dev_base; dev != NULL; dev = dev->next) { +- if ((dev->family == AF_INET) && (dev->pa_addr == *((__u32 *) ipaddr)) +- && dev_skip(dev, "detach")) { +- dev_rmlist(dev); +- dev->mtu += maxheadergrowth; +- result = 0; ++ for (dev = dev_base; dev; dev = dev->next) { ++ if ((in_dev = dev->ip_ptr) != NULL) { ++ for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { ++ if (ifa->ifa_local == *((__u32 *) ipaddr) && dev_skip(dev, "detach")) { ++ dev_rmlist(dev); ++ if (dev->change_mtu) ++ (void)dev->change_mtu(dev, dev->mtu + maxheadergrowth); ++ else ++ dev->mtu += maxheadergrowth; ++ result = 0; ++ } ++ } + } + } + +@@ -715,14 +751,17 @@ + + maxheadergrowth = ipsp_maxheadergrowth(); + +- for (dev = dev_base; dev != NULL; dev = dev->next) { +- if (dev->family == AF_INET) { ++ for (dev = dev_base; dev; dev = dev->next) { ++ if (dev->ip_ptr) { + if (dev->mtu < 68 + maxheadergrowth) + printk("enskip: %s: interface mtu of %d is too small\n", + dev->name, dev->mtu); + else { + if ((dev->flags & IFF_LOOPBACK) == 0) { +- dev->mtu -= maxheadergrowth; ++ if (dev->change_mtu) ++ (void)dev->change_mtu(dev, dev->mtu - maxheadergrowth); ++ else ++ dev->mtu -= maxheadergrowth; + dev_addlist(dev); + } + } +@@ -739,10 +778,13 @@ + { + struct device *dev; + +- for (dev = dev_base; dev != NULL; dev = dev->next) { +- if ((dev->family == AF_INET) && dev_skip(dev, "exit")) { ++ for (dev = dev_base; dev; dev = dev->next) { ++ if (dev->ip_ptr && dev_skip(dev, "exit")) { + dev_rmlist(dev); +- dev->mtu += maxheadergrowth; ++ if (dev->change_mtu) ++ (void)dev->change_mtu(dev, dev->mtu + maxheadergrowth); ++ else ++ dev->mtu += maxheadergrowth; + } + } + +--- ENskip-0.67/linux/queue.c.orig Thu Feb 6 03:38:36 1997 ++++ ENskip-0.67/linux/queue.c Thu Apr 2 13:34:48 1998 +@@ -21,9 +21,18 @@ + + #include "config.h" + #include ++#ifdef KERNEL /* glibc */ ++#include ++#include ++#include ++#include ++#include "ip.h" /* __USE_BSD section only */ ++#define IP_CE IP_RF ++#else + #include + #include + #include ++#endif + #include + #include + #include +@@ -50,9 +59,9 @@ + int retval = 0; + + #ifdef DEBUG_LINUX_QUEUE +- struct iphdr *ip = ((struct sk_buff *) pkt)->ip_hdr; ++ struct iphdr *ip = ((struct sk_buff *) pkt)->nh.iph; + +- printf("queue %p: enqueue_in skb=%p ip_hdr=%p srcip=%08x dstip=%08x\n", ++ printf("queue %p: enqueue_in skb=%p nh.iph=%p srcip=%08x dstip=%08x\n", + q, pkt, ip, ip->saddr, ip->daddr); + #endif + tmp = kmalloc(sizeof (*tmp), GFP_ATOMIC); +@@ -78,7 +87,7 @@ + printf("queue overflow: free skb=%p queue=%p\n", pkt, tmp); + #endif + kfree(tmp); +- kfree_skb((struct sk_buff *) pkt, FREE_WRITE); ++ kfree_skb((struct sk_buff *) pkt); + + retval = -1; + } +@@ -98,9 +107,9 @@ + int retval = 0; + + #ifdef DEBUG_LINUX_QUEUE +- struct iphdr *ip = ((struct sk_buff *) pkt)->ip_hdr; ++ struct iphdr *ip = ((struct sk_buff *) pkt)->nh.iph; + +- printf("queue %p: enqueue_out skb=%p ip_hdr %p srcip=%08x dstip=%08x\n", ++ printf("queue %p: enqueue_out skb=%p nh.iph %p srcip=%08x dstip=%08x\n", + q, pkt, ip, ip->saddr, ip->daddr); + #endif + +@@ -127,7 +136,7 @@ + printf("queue overflow: free skb=%p queue=%p\n", pkt, tmp); + #endif + kfree(tmp); +- kfree_skb((struct sk_buff *) pkt, FREE_WRITE); ++ kfree_skb((struct sk_buff *) pkt); + + retval = -1; + } +@@ -157,7 +166,7 @@ + #ifdef DEBUG_LINUX_QUEUE + printf("queue_free: free skb=%p queue=%p\n", tmp->pskb, tmp); + #endif +- kfree_skb(tmp->pskb, FREE_WRITE); ++ kfree_skb(tmp->pskb); + kfree(tmp); + } + +@@ -171,7 +180,7 @@ + #ifdef DEBUG_LINUX_QUEUE + printf("queue_free: free skb=%p queue=%p\n", tmp->pskb, tmp); + #endif +- kfree_skb(tmp->pskb, FREE_WRITE); ++ kfree_skb(tmp->pskb); + kfree(tmp); + } + +@@ -250,9 +259,9 @@ + else + m = NULL; + +- if (m && m->ip_hdr) { +- *((__u32 *) srcip) = m->ip_hdr->saddr; +- *((__u32 *) dstip) = m->ip_hdr->daddr; ++ if (m && m->nh.iph) { ++ *((__u32 *) srcip) = m->nh.iph->saddr; ++ *((__u32 *) dstip) = m->nh.iph->daddr; + result = 0; + } + else { +--- ENskip-0.67/linux/device.c.orig Wed Jan 29 03:20:23 1997 ++++ ENskip-0.67/linux/device.c Sat Feb 14 22:41:10 1998 +@@ -38,6 +38,7 @@ + #include + #include + #include ++#include + #include "skip_defs.h" + #include "dynamic.h" + #include "memblk.h" +@@ -82,21 +83,21 @@ + if (io == NULL) + return -ENOMEM; + +- memcpy_fromfs(io, (void *) arg, sizeof(struct devioctl)); +- ++ copy_from_user(io, (void *)arg, sizeof(struct devioctl)); ++ + retval = verify_area(VERIFY_WRITE, (void *) io->ic_dp, io->ic_len); + if (retval) { + kfree(io); + return retval; + } +- ++ + req = (u_char *) kmalloc(io->ic_len, GFP_ATOMIC); + if (req == NULL) { + kfree(io); + return -ENOMEM; + } + +- memcpy_fromfs(req, io->ic_dp, io->ic_len); ++ copy_from_user(req, io->ic_dp, io->ic_len); + + #ifdef DEBUG_LINUX_IOCTL + printk("Calling ioctl request handler, request len=%i\n", io->ic_len); +@@ -111,10 +112,10 @@ + kfree(io); + return retval; + } +- memcpy_tofs((void *) io->ic_dp, req, newlen); ++ copy_to_user((void *)io->ic_dp, req, newlen); + } + io->ic_len = newlen; +- memcpy_tofs((void *) arg, io, sizeof(struct devioctl)); ++ copy_to_user((void *)arg, io, sizeof(struct devioctl)); + + kfree(req); + kfree(io); +@@ -133,8 +134,9 @@ + } + + /* close function -- called from device switching table */ +-void close_skip(struct inode *inode, struct file *file) ++int close_skip(struct inode *inode, struct file *file) + { + MOD_DEC_USE_COUNT; ++ return 0; + } + +--- ENskip-0.67/linux/device.h.orig Sun Dec 1 18:56:43 1996 ++++ ENskip-0.67/linux/device.h Wed Jan 28 11:21:10 1998 +@@ -24,7 +24,7 @@ + + extern int ioctl_skip(struct inode *, struct file *, unsigned int, unsigned long); + extern int open_skip(struct inode *, struct file *); +-extern void close_skip(struct inode *, struct file *); ++extern int close_skip(struct inode *, struct file *); + + #endif /* _ENSKIP_LINUX_DEVICE_H */ + +--- ENskip-0.67/linux/skipmod.c.orig Sun Jan 26 08:40:32 1997 ++++ ENskip-0.67/linux/skipmod.c Wed Sep 9 21:44:38 1998 +@@ -103,7 +103,7 @@ + forward_packet, + packet_nop, + output_packet, +- PF_IPSEC, ++ PF_SECURITY, + 2 /* allow other filters to hook before us */ + }; + +@@ -114,10 +114,13 @@ + NULL, /* read */ + NULL, /* write */ + NULL, /* readdir */ +- NULL, /* select */ ++ NULL, /* poll */ + ioctl_skip, /* ioctl */ + NULL, /* mmap */ + open_skip, /* open code */ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,118) ++ NULL, /* flush */ ++#endif + close_skip, /* release code */ + NULL /* fsync */ + }; +@@ -132,7 +135,7 @@ + } + + if (register_firewall(PF_INET, &skip_in) || +- register_firewall(PF_IPSEC, &skip_out)) { ++ register_firewall(PF_SECURITY, &skip_out)) { + printk("Unable to register ENskip as packet filter!\n"); + + unregister_chrdev(SKIP_DEV_MAJOR, SKIP_DEV_NAME); +@@ -156,7 +159,7 @@ + + unregister_chrdev(SKIP_DEV_MAJOR, SKIP_DEV_NAME); + +- unregister_firewall(PF_IPSEC, &skip_out); ++ unregister_firewall(PF_SECURITY, &skip_out); + unregister_firewall(PF_INET, &skip_in); + + printk(KERN_INFO "enskip: module unloaded.\n"); +--- ENskip-0.67/linux/ip.h.orig Wed Mar 11 10:21:33 1998 ++++ ENskip-0.67/linux/ip.h Mon Mar 9 13:59:35 1998 +@@ -0,0 +1,87 @@ ++#ifdef __USE_BSD ++/* ++ * Copyright (c) 1982, 1986, 1993 ++ * The Regents of the University of California. All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by the University of ++ * California, Berkeley and its contributors. ++ * 4. Neither the name of the University nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS 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. ++ * ++ * @(#)ip.h 8.1 (Berkeley) 6/10/93 ++ */ ++ ++/* ++ * Definitions for internet protocol version 4. ++ * Per RFC 791, September 1981. ++ */ ++ ++/* ++ * Structure of an internet header, naked of options. ++ */ ++struct ip ++ { ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++ u_int8_t ip_hl:4; /* header length */ ++ u_int8_t ip_v:4; /* version */ ++#endif ++#if __BYTE_ORDER == __BIG_ENDIAN ++ u_int8_t ip_v:4; /* version */ ++ u_int8_t ip_hl:4; /* header length */ ++#endif ++ u_int8_t ip_tos; /* type of service */ ++ u_short ip_len; /* total length */ ++ u_short ip_id; /* identification */ ++ u_short ip_off; /* fragment offset field */ ++#define IP_RF 0x8000 /* reserved fragment flag */ ++#define IP_DF 0x4000 /* dont fragment flag */ ++#define IP_MF 0x2000 /* more fragments flag */ ++#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ ++ u_int8_t ip_ttl; /* time to live */ ++ u_int8_t ip_p; /* protocol */ ++ u_short ip_sum; /* checksum */ ++ struct in_addr ip_src, ip_dst; /* source and dest address */ ++ }; ++ ++/* ++ * Time stamp option structure. ++ */ ++struct ip_timestamp ++ { ++ u_int8_t ipt_code; /* IPOPT_TS */ ++ u_int8_t ipt_len; /* size of structure (variable) */ ++ u_int8_t ipt_ptr; /* index of current entry */ ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++ u_int8_t ipt_flg:4; /* flags, see below */ ++ u_int8_t ipt_oflw:4; /* overflow counter */ ++#endif ++#if __BYTE_ORDER == __BIG_ENDIAN ++ u_int8_t ipt_oflw:4; /* overflow counter */ ++ u_int8_t ipt_flg:4; /* flags, see below */ ++#endif ++ u_int32_t data[9]; ++ }; ++#endif /* __USE_BSD */ +--- ENskip-0.67/linux/config.h.orig Thu Mar 13 09:35:54 1997 ++++ ENskip-0.67/linux/config.h Mon Mar 9 14:53:03 1998 +@@ -33,9 +33,11 @@ + #define __BSD_SOURCE + + #include ++#ifndef KERNEL /* glibc */ + #include + #include + #include ++#endif + + typedef __s32 int32; + typedef __u32 u_int32; +@@ -65,9 +67,11 @@ + #include + #include + #include ++#ifndef KERNEL /* glibc */ + #include + #include + #include ++#endif + #include + + #define SMALL_KERNEL_STACK +@@ -121,7 +125,7 @@ + #include + #include + #include +-#include ++#include /* glibc */ + #include + + #define KALLOC(size) malloc((size)) +--- ENskip-0.67/lib/ah.c.orig Wed Feb 5 16:37:59 1997 ++++ ENskip-0.67/lib/ah.c Thu Apr 2 13:31:19 1998 +@@ -4,9 +4,18 @@ + */ + #include "config.h" + ++#if defined(KERNEL) && defined(linux) ++#include ++#include ++#include ++#include ++#include "ip.h" /* __USE_BSD section only */ ++#define IP_CE IP_RF ++#else + #include + #include + #include ++#endif + + #include "skip_defs.h" + #include "memblk.h" +--- ENskip-0.67/lib/ipsp.c.orig Wed Feb 5 16:45:52 1997 ++++ ENskip-0.67/lib/ipsp.c Thu Apr 2 13:28:41 1998 +@@ -11,9 +11,18 @@ + #include "config.h" + + #include ++#if defined(KERNEL) && defined(linux) /* glibc */ ++#include ++#include ++#include ++#include ++#include "ip.h" /* __USE_BSD section only */ ++#define IP_CE IP_RF ++#else + #include + #include + #include ++#endif + + #include "skip_defs.h" + #include "id.h" +--- ENskip-0.67/lib/ipsum.c.orig Thu Nov 14 15:46:44 1996 ++++ ENskip-0.67/lib/ipsum.c Thu Apr 2 13:29:43 1998 +@@ -4,10 +4,20 @@ + */ + #include "config.h" + ++#if defined(KERNEL) && defined(linux) /* glibc */ ++#include ++#include ++#include ++#include ++#include ++#include "ip.h" /* __USE_BSD section only */ ++#define IP_CE IP_RF ++#else + #include + #include + #include + #include ++#endif + #include "ipsum.h" + + #ifdef __GNUC__ +--- ENskip-0.67/lib/skip.c.orig Wed Feb 19 02:46:33 1997 ++++ ENskip-0.67/lib/skip.c Thu Apr 2 13:30:45 1998 +@@ -7,10 +7,20 @@ + + #include "config.h" + #include ++#if defined(KERNEL) && defined(linux) /* glibc */ ++#include ++#include ++#include ++#include ++#include "ip.h" /* __USE_BSD section only */ ++#define IP_CE IP_RF ++#include ++#else + #include + #include + #include + #include ++#endif + + #include "skip_defs.h" + #include "memblk.h" +--- ENskip-0.67/lib/id.c.orig Fri May 9 06:20:05 1997 ++++ ENskip-0.67/lib/id.c Mon Mar 9 14:50:25 1998 +@@ -5,7 +5,9 @@ + + #include "config.h" + ++#ifndef KERNEL + #include ++#endif + #include "skip_defs.h" + + #ifndef KERNEL +--- ENskip-0.67/cert/suncert/lib/Bigint.C.orig Thu Mar 13 08:13:23 1997 ++++ ENskip-0.67/cert/suncert/lib/Bigint.C Fri Jun 5 12:31:04 1998 +@@ -46,7 +46,7 @@ + #include "Time.h" + #include "asn1_der.h" + +-#ifndef SOLARIS2 ++#if !defined(SOLARIS2) && !defined(linux) /* glibc */ + extern "C" { + void bzero(void *, int); + }; + diff -urN lin.2.2.17/Documentation/crypto/faq.txt int.2.2.17.x/Documentation/crypto/faq.txt --- lin.2.2.17/Documentation/crypto/faq.txt Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/Documentation/crypto/faq.txt Sat Oct 14 00:48:17 2000 @@ -0,0 +1,159 @@ +Questions and answers concerning crypto and looppack device +By Patrice Lacroix +Last update: 1999-05-21 + +1) What is the crypto API? + +It allow other parts of the kernel to use crypto in a generic way, +most notably the loopback device driver (loop_gen.c). + + +2) What is loop_gen? + +First, you should already be familiar with basic loopback device. See +losetup(1) for more info. + +Loop_gen is the generic encryption layer for the loopback driver. +It uses the crypto API to do encryption. It works with every ciphers +supported by the crypto API. Not all ciphers in the crypto library +support the API yet. + +Loop_gen (and the crypto api) will eventually replace all other loopback +encryption modules. + +Loop_gen use all supported ciphers in CBC mode. + + +3) What can I do with loop_gen? + +The basic loopback device driver allow you to use a file as a block +device. With loop_gen, data in the file associated with the loopback +block device can be encrypted with strong crypto. + +You can use the result as any other block device. If you create a file +system and mount it, then every file in the file system will be +automaticly encrypted. + + +4) Can I use all this as modules? + +Sure! In make menuconfig (or whatever), under Crypto options, say M to +Crypto ciphers and to the ciphers you want. Under Block Device, say M to +loopback device and to General Encryption Support. Don't select any other +encryption modules unless you can't live without them and they are +no longer suported by the crypto API. + +Build your kernel and modules, make modules_install, reboot, depmod -a + +In /etc/conf.modules, add: + +alias loop-xfer-gen-0 loop_gen +alias loop-xfer-gen-10 loop_gen +alias cipher-2 des +alias cipher-4 blowfish +alias cipher-6 idea +alias cipher-7 serp6f +alias cipher-8 mars6 +alias cipher-11 rc62 +alias cipher-15 dfc2 +alias cipher-16 rijndael +alias cipher-17 rc5 + + +5) Why all those funny numbers? + +In short, the kernel know ciphers only by number. If you really want to know +how it works, you can grep request_module in linux/crypto/api.c and +linux/drivers/block/loop.c. + + +6) I get "Unsupported encryption type" when I use losetup or mount. What's + wrong? + +You need a version of losetup and mount that understand new encryption +types. To get it, you probably have to apply the util-linux patch you can +find in linux/Documentation/crypto and rebuild mount and losetup. + + +7) Can I stack loop devices and encryption? + +Yes! + + +6) I can't access the content of my encrypted file system since I + moved the backing file to a new partition. Why? + +This is because when a block of data is encrypted with loop_gen, +its IV for CBC encryption is set to the real block where the +file is located on the block device underneath it. So when the +encrypted file system is physically moved on a block device, the +IV used for encryption and decryption change, and data can't be +decrypted correctly. + +As of patch-int-2.2.10.4, you should answer 'Y' to the question 'Use +relative block numbers as basis for transfer functions (RECOMMENDED)' +to avoid this problem. + +Another solution is to losetup your file once without using crypto and +then losetup again the first loopback block device to add +encryption. Since the encryption will always be from block 0 (inside +the first loopback device), the IV for CBC encryption will be the same +no matter where the original file is located. + +Ex: + +# losetup /dev/loop0 encfs.loop +# losetup -e blowfish /dev/loop1 /dev/loop0 +Password: (not shown) +# mount /dev/loop1 /mnt + +(here you can access the fs under /mnt...) + +(and to destroy loopback devices...) + +# umount /mnt +# losetup -d /dev/loop1 +# losetup -d /dev/loop0 + +With this solution, you can do backup of your encrypted data +(which is a good thing) but it's more complexe and it's probably +less secure (which is a bad thing). + + +7) Since patch-int-2.2.10.4 I can't access my encrypted device. + +As of patch-int-2.2.10.4, the encrypted files will be incompatible +with older files if you answer 'Y' to the question 'Use relative block +numbers as basis for transfer functions (RECOMMENDED)'. To be able to +back up your encrypted files in the future, you should convert to the +new layout [which uses relative block numbers as IV to the cipher +instead of absolute ones]. This can be accomplished by doing +something like the following: + + +# losetup -e mypreferredcipher /dev/loop0 /myfile + +# dd if=/dev/loop0 of=tmpfile +# losetup -d /dev/loop0 + + +# losetup -e mypreferredcipher /dev/loop0 /myfile + +# dd if=tmpfile of=/dev/loop0 +# dd if=/dev/zero of=tmpfile bs=1k count= +or you could download some of the special software used for wiping +magnetic media such as wipe from +http://gsu.linux.org.tr/wipe/ + +8) I made an encrypted filesystem on my hard-disk and tried to burn it + on a CD. Now I can't get the CD to work properly. + +This is a current limitation in the loop device code. The block size +(the smalles number of bytes that can be read) of a hard-disk is +smaller than the block size of a CD-ROM. This causes problems since +the block size dictates how many bytes are encrypted as a block. + +There is no solution to this problem at this time, but it isn't hard +to fix. Contact me (Alexander Kjeldaas ) if you're +willing to work on this problem. + diff -urN lin.2.2.17/Documentation/crypto/util-linux-2.10m.getpass.diff int.2.2.17.x/Documentation/crypto/util-linux-2.10m.getpass.diff --- lin.2.2.17/Documentation/crypto/util-linux-2.10m.getpass.diff Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/Documentation/crypto/util-linux-2.10m.getpass.diff Sat Oct 14 00:48:17 2000 @@ -0,0 +1,88 @@ +--- lomount.c.orig Thu Jul 13 19:41:03 2000 ++++ lomount.c Thu Jul 13 19:59:10 2000 +@@ -54,6 +54,8 @@ + { -1, NULL } + }; + ++char * clkey; ++ + static int + crypt_type (const char *name) { + int i; +@@ -170,6 +172,14 @@ + return 0; + } + ++char *getthepass ( const char * prompt ) { ++ if (clkey) { ++ return clkey; ++ } else { ++ return (getpass(prompt)); ++ } ++} ++ + int + set_loop (const char *device, const char *file, int offset, + const char *encryption, int *loopro) { +@@ -221,18 +231,18 @@ + loopinfo.lo_encrypt_key_size = 0; + break; + case LO_CRYPT_XOR: +- pass = getpass (_("Password: ")); ++ pass = getthepass(_("Password: ")); + strncpy (loopinfo.lo_encrypt_key, pass, LO_KEY_SIZE); + loopinfo.lo_encrypt_key[LO_KEY_SIZE - 1] = 0; + loopinfo.lo_encrypt_key_size = strlen(loopinfo.lo_encrypt_key); + break; + case LO_CRYPT_DES: + printf(_("WARNING: Use of DES is depreciated.\n")); +- pass = getpass (_("Password: ")); ++ pass = getthepass (_("Password: ")); + strncpy (loopinfo.lo_encrypt_key, pass, 8); + loopinfo.lo_encrypt_key[8] = 0; + loopinfo.lo_encrypt_key_size = 8; +- pass = getpass (_("Init (up to 16 hex digits): ")); ++ pass = getthepass (_("Init (up to 16 hex digits): ")); + for (i = 0; i < 16 && pass[i]; i++) + if (isxdigit (pass[i])) { + loopinfo.lo_init[i >> 3] |= (pass[i] > '9' ? +@@ -246,7 +256,7 @@ + break; + case LO_CRYPT_FISH2: + case LO_CRYPT_BLOW: +- pass = getpass("Password :"); ++ pass = getthepass("Password :"); + MDcalc((byte *)loopinfo.lo_encrypt_key,pass,strlen(pass)); + loopinfo.lo_encrypt_key_size=20; /* 160 Bit key */ + break; +@@ -256,7 +266,7 @@ + case LO_CRYPT_MARS: + case LO_CRYPT_RC6: + case LO_CRYPT_DFC: +- pass = getpass("Password :"); ++ pass = getthepass("Password :"); + MDcalc((byte *)loopinfo.lo_encrypt_key,pass,strlen(pass)); + loopinfo.lo_encrypt_key_size=16; /* 128 Bit key */ + break; +@@ -398,9 +408,9 @@ + textdomain(PACKAGE); + + delete = off = 0; +- offset = encryption = NULL; ++ offset = encryption = clkey = NULL; + progname = argv[0]; +- while ((c = getopt(argc,argv,"de:o:v")) != EOF) { ++ while ((c = getopt(argc,argv,"de:o:vk:")) != EOF) { + switch (c) { + case 'd': + delete = 1; +@@ -410,6 +420,9 @@ + break; + case 'o': + offset = optarg; ++ break; ++ case 'k': ++ clkey = optarg; + break; + case 'v': + verbose = 1; diff -urN lin.2.2.17/Documentation/crypto/util-linux-2.10o.int.patch int.2.2.17.x/Documentation/crypto/util-linux-2.10o.int.patch --- lin.2.2.17/Documentation/crypto/util-linux-2.10o.int.patch Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/Documentation/crypto/util-linux-2.10o.int.patch Sat Oct 14 00:48:17 2000 @@ -0,0 +1,785 @@ +diff -urN util-linux-2.10o/MCONFIG util-linux-2.10o.int2/MCONFIG +--- util-linux-2.10o/MCONFIG Fri Aug 11 23:21:53 2000 ++++ util-linux-2.10o.int2/MCONFIG Mon Sep 25 11:44:06 2000 +@@ -16,7 +16,7 @@ + # If HAVE_PAM is set to "yes", then login, chfn, chsh, and newgrp + # will use PAM for authentication. Additionally, passwd will not be + # installed as it is not PAM aware. +-HAVE_PAM=no ++HAVE_PAM=yes + + # If HAVE_SHADOW is set to "yes", then login, chfn, chsh, newgrp, passwd, + # and vipw will not be built or installed from the login-utils +diff -urN util-linux-2.10o/mount/Makefile util-linux-2.10o.int2/mount/Makefile +--- util-linux-2.10o/mount/Makefile Fri Aug 11 20:58:54 2000 ++++ util-linux-2.10o.int2/mount/Makefile Mon Sep 25 11:44:06 2000 +@@ -28,7 +28,7 @@ + GEN_FILES = nfsmount.h nfsmount_xdr.c nfsmount_clnt.c + + # comment these out if you are not compiling in loop support +-LO_OBJS=lomount.o ++LO_OBJS=lomount.o rmd160.o + + all: $(PROGS) + +@@ -59,7 +59,7 @@ + losetup.o: lomount.c + $(COMPILE) -DMAIN lomount.c -o $@ + +-losetup: losetup.o ++losetup: losetup.o rmd160.o + $(LINK) $^ -o $@ + + mount.o umount.o nfsmount.o losetup.o fstab.o realpath.o sundries.o: sundries.h +diff -urN util-linux-2.10o/mount/lomount.c util-linux-2.10o.int2/mount/lomount.c +--- util-linux-2.10o/mount/lomount.c Sat Aug 5 17:52:28 2000 ++++ util-linux-2.10o.int2/mount/lomount.c Mon Sep 25 11:44:34 2000 +@@ -27,6 +27,7 @@ + + #include "loop.h" + #include "lomount.h" ++#include "rmd160.h" + #include "nls.h" + + extern int verbose; +@@ -37,12 +38,22 @@ + struct crypt_type_struct { + int id; + char *name; ++ int keylength; + } crypt_type_tbl[] = { +- { LO_CRYPT_NONE, "no" }, +- { LO_CRYPT_NONE, "none" }, +- { LO_CRYPT_XOR, "xor" }, +- { LO_CRYPT_DES, "DES" }, +- { -1, NULL } ++ { LO_CRYPT_NONE, "no",0 }, ++ { LO_CRYPT_NONE, "none",0 }, ++ { LO_CRYPT_XOR, "xor",0 }, ++ { LO_CRYPT_DES, "DES",8 }, ++ { LO_CRYPT_FISH2, "twofish",20 }, ++ { LO_CRYPT_BLOW, "blowfish",20 }, ++ { LO_CRYPT_CAST128, "cast128", 16}, ++ { LO_CRYPT_SERPENT, "serpent", 16}, ++ { LO_CRYPT_MARS, "mars",16 }, ++ { LO_CRYPT_RC6, "rc6",16 }, ++ { LO_CRYPT_DES_EDE3, "DES_EDE3",24}, ++ { LO_CRYPT_DFC, "dfc",16 }, ++ { LO_CRYPT_IDEA, "idea",16}, ++ { -1, NULL,0 } + }; + + static int +@@ -167,12 +178,18 @@ + return 0; + } + ++#define HASHLENGTH 20 ++#define PASSWDBUFFLEN 130 /* getpass returns only max. 128 bytes, see man getpass */ ++ + int + set_loop (const char *device, const char *file, int offset, + const char *encryption, int *loopro) { + struct loop_info loopinfo; + int fd, ffd, mode, i; ++ int keylength; + char *pass; ++ char keybits[2*HASHLENGTH]; ++ char passwdbuff[PASSWDBUFFLEN]; + + mode = (*loopro ? O_RDONLY : O_RDWR); + if ((ffd = open (file, mode)) < 0) { +@@ -224,6 +241,7 @@ + loopinfo.lo_encrypt_key_size = strlen(loopinfo.lo_encrypt_key); + break; + case LO_CRYPT_DES: ++ printf(_("WARNING: Use of DES is depreciated.\n")); + pass = getpass (_("Password: ")); + strncpy (loopinfo.lo_encrypt_key, pass, 8); + loopinfo.lo_encrypt_key[8] = 0; +@@ -240,6 +258,30 @@ + return 1; + } + break; ++ case LO_CRYPT_FISH2: ++ case LO_CRYPT_BLOW: ++ case LO_CRYPT_IDEA: ++ case LO_CRYPT_CAST128: ++ case LO_CRYPT_SERPENT: ++ case LO_CRYPT_MARS: ++ case LO_CRYPT_RC6: ++ case LO_CRYPT_DES_EDE3: ++ case LO_CRYPT_DFC: ++ pass = getpass("Password :"); ++ strncpy(passwdbuff+1,pass,PASSWDBUFFLEN-1); ++ passwdbuff[0] = 'A'; ++ rmd160_hash_buffer(keybits,pass,strlen(pass)); ++ rmd160_hash_buffer(keybits+HASHLENGTH,passwdbuff,strlen(pass)+1); ++ memcpy((char*)loopinfo.lo_encrypt_key,keybits,2*HASHLENGTH); ++ keylength=0; ++ for(i=0; crypt_type_tbl[i].id != -1; i++){ ++ if(loopinfo.lo_encrypt_type == crypt_type_tbl[i].id){ ++ keylength = crypt_type_tbl[i].keylength; ++ break; ++ } ++ } ++ loopinfo.lo_encrypt_key_size=keylength; ++ break; + default: + fprintf (stderr, + _("Don't know how to get key for encryption system %d\n"), +@@ -324,11 +366,18 @@ + + static void + usage(void) { ++ struct crypt_type_struct *c; + fprintf(stderr, _("usage:\n\ + %s loop_device # give info\n\ + %s -d loop_device # delete\n\ + %s [ -e encryption ] [ -o offset ] loop_device file # setup\n"), + progname, progname, progname); ++ fprintf(stderr, " where encryption is one of:\n"); ++ c = &crypt_type_tbl[0]; ++ while(c->name) { ++ fprintf(stderr, " %s\n", c->name); ++ c++; ++ } + exit(1); + } + +diff -urN util-linux-2.10o/mount/losetup.8 util-linux-2.10o.int2/mount/losetup.8 +--- util-linux-2.10o/mount/losetup.8 Fri Aug 11 13:11:30 2000 ++++ util-linux-2.10o.int2/mount/losetup.8 Mon Sep 25 11:44:06 2000 +@@ -36,11 +36,47 @@ + .PD 0 + .IP \fBXOR\fP + use a simple XOR encryption. ++.IP \fBBlowfish\fP ++use Blowfish encryption. Blowfish encryption is only available if you ++are using the international kernel and Blowfish encryption has been ++enabled in the Crypto API. ++.IP \fBTwofish\fP ++use Twofish encryption. Twofish encryption is only available if you ++are using the international kernel and Twofish encryption has been ++enabled in the Crypto API. ++.IP \fBCAST\fP ++use CAST encryption. CAST encryption is only available if you ++are using the international kernel and CAST encryption has been ++enabled in the Crypto API. + .IP \fBDES\fP + use DES encryption. DES encryption is only available if the optional + DES package has been added to the kernel. DES encryption uses an additional + start value that is used to protect passwords against dictionary +-attacks. ++attacks. Use of DES is deprecated. ++.IP \fBDFC\fP ++use DFC encryption. DFC encryption is only available if you ++are using the international kernel and DFC encryption has been ++enabled in the Crypto API. ++.IP \fBIDEA\fP ++use IDEA encryption. IDEA encryption is only available if you ++are using the international kernel and IDEA encryption has been ++enabled in the Crypto API. ++.IP \fBMARS\fP ++use MARS encryption. MARS encryption is only available if you ++are using the international kernel and MARS encryption has been ++enabled in the Crypto API. ++.IP \fBRC5\fP ++use RC5 encryption. RC5 encryption is only available if you ++are using the international kernel and RC5 encryption has been ++enabled in the Crypto API. ++.IP \fBRC6\fP ++use RC6 encryption. RC6 encryption is only available if you ++are using the international kernel and RC6 encryption has been ++enabled in the Crypto API. ++.IP \fBSerpent\fP ++use Serpent encryption. Serpent encryption is only available if you ++are using the international kernel and Serpent encryption has been ++enabled in the Crypto API. + .PD + .RE + .IP "\fB\-o \fIoffset\fP" +@@ -58,6 +94,7 @@ + .SH FILES + .nf + /dev/loop0,/dev/loop1,... loop devices (major=7) ++/proc/cipher/* available ciphers + .fi + .SH EXAMPLE + If you are using the loadable module you must have the module loaded +@@ -69,9 +106,8 @@ + .nf + .IP + dd if=/dev/zero of=/file bs=1k count=100 +-losetup -e des /dev/loop0 /file +-Password: +-Init (up to 16 hex digits): ++losetup -e blowfish /dev/loop0 /file ++Password : + mkfs -t ext2 /dev/loop0 100 + mount -t ext2 /dev/loop0 /mnt + ... +@@ -85,8 +121,12 @@ + # rmmod loop + .LP + .fi +-.SH RESTRICTION +-DES encryption is painfully slow. On the other hand, XOR is terribly weak. ++.SH RESTRICTIONS ++DES encryption is painfully slow. On the other hand, XOR is terribly ++weak. Both are insecure nowadays. Some ciphers require a licence for ++you to be allowed to use them. ++.SH BUGS ++CAST, DES, RC5 and Twofish are currently broken and cannot be used. + .SH AUTHORS + .nf + Original version: Theodore Ts'o +diff -urN util-linux-2.10o/mount/rmd160.c util-linux-2.10o.int2/mount/rmd160.c +--- util-linux-2.10o/mount/rmd160.c Thu Jan 1 01:00:00 1970 ++++ util-linux-2.10o.int2/mount/rmd160.c Mon Sep 25 11:46:06 2000 +@@ -0,0 +1,532 @@ ++/* rmd160.c - RIPE-MD160 ++ * Copyright (C) 1998 Free Software Foundation, Inc. ++ */ ++ ++/* This file was part of GnuPG. Modified for use within the Linux ++ * mount utility by Marc Mutz . None of this code is ++ * by myself. I just removed everything that you don't need when all ++ * you want to do is to use rmd160_hash_buffer(). ++ * My comments are marked with (mm). */ ++ ++/* GnuPG is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * GnuPG is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ ++ ++#include /* (mm) for memcpy */ ++#include /* (mm) for BIG_ENDIAN and BYTE_ORDER */ ++#include "rmd160.h" ++ ++/* (mm) these are used by the original GnuPG file. In order to modify ++ * that file not too much, we keep the notations. maybe it would be ++ * better to include linux/types.h and typedef __u32 to u32 and __u8 ++ * to byte? */ ++typedef unsigned int u32; /* taken from e.g. util-linux's minix.h */ ++typedef unsigned char byte; ++ ++typedef struct { ++ u32 h0,h1,h2,h3,h4; ++ u32 nblocks; ++ byte buf[64]; ++ int count; ++} RMD160_CONTEXT; ++ ++/**************** ++ * Rotate a 32 bit integer by n bytes ++ */ ++#if defined(__GNUC__) && defined(__i386__) ++static inline u32 ++rol( u32 x, int n) ++{ ++ __asm__("roll %%cl,%0" ++ :"=r" (x) ++ :"0" (x),"c" (n)); ++ return x; ++} ++#else ++ #define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) ) ++#endif ++ ++/********************************* ++ * RIPEMD-160 is not patented, see (as of 25.10.97) ++ * http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html ++ * Note that the code uses Little Endian byteorder, which is good for ++ * 386 etc, but we must add some conversion when used on a big endian box. ++ * ++ * ++ * Pseudo-code for RIPEMD-160 ++ * ++ * RIPEMD-160 is an iterative hash function that operates on 32-bit words. ++ * The round function takes as input a 5-word chaining variable and a 16-word ++ * message block and maps this to a new chaining variable. All operations are ++ * defined on 32-bit words. Padding is identical to that of MD4. ++ * ++ * ++ * RIPEMD-160: definitions ++ * ++ * ++ * nonlinear functions at bit level: exor, mux, -, mux, - ++ * ++ * f(j, x, y, z) = x XOR y XOR z (0 <= j <= 15) ++ * f(j, x, y, z) = (x AND y) OR (NOT(x) AND z) (16 <= j <= 31) ++ * f(j, x, y, z) = (x OR NOT(y)) XOR z (32 <= j <= 47) ++ * f(j, x, y, z) = (x AND z) OR (y AND NOT(z)) (48 <= j <= 63) ++ * f(j, x, y, z) = x XOR (y OR NOT(z)) (64 <= j <= 79) ++ * ++ * ++ * added constants (hexadecimal) ++ * ++ * K(j) = 0x00000000 (0 <= j <= 15) ++ * K(j) = 0x5A827999 (16 <= j <= 31) int(2**30 x sqrt(2)) ++ * K(j) = 0x6ED9EBA1 (32 <= j <= 47) int(2**30 x sqrt(3)) ++ * K(j) = 0x8F1BBCDC (48 <= j <= 63) int(2**30 x sqrt(5)) ++ * K(j) = 0xA953FD4E (64 <= j <= 79) int(2**30 x sqrt(7)) ++ * K'(j) = 0x50A28BE6 (0 <= j <= 15) int(2**30 x cbrt(2)) ++ * K'(j) = 0x5C4DD124 (16 <= j <= 31) int(2**30 x cbrt(3)) ++ * K'(j) = 0x6D703EF3 (32 <= j <= 47) int(2**30 x cbrt(5)) ++ * K'(j) = 0x7A6D76E9 (48 <= j <= 63) int(2**30 x cbrt(7)) ++ * K'(j) = 0x00000000 (64 <= j <= 79) ++ * ++ * ++ * selection of message word ++ * ++ * r(j) = j (0 <= j <= 15) ++ * r(16..31) = 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8 ++ * r(32..47) = 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12 ++ * r(48..63) = 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2 ++ * r(64..79) = 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 ++ * r0(0..15) = 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12 ++ * r0(16..31)= 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2 ++ * r0(32..47)= 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13 ++ * r0(48..63)= 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14 ++ * r0(64..79)= 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 ++ * ++ * ++ * amount for rotate left (rol) ++ * ++ * s(0..15) = 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8 ++ * s(16..31) = 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12 ++ * s(32..47) = 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5 ++ * s(48..63) = 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12 ++ * s(64..79) = 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ++ * s'(0..15) = 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6 ++ * s'(16..31)= 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11 ++ * s'(32..47)= 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5 ++ * s'(48..63)= 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8 ++ * s'(64..79)= 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ++ * ++ * ++ * initial value (hexadecimal) ++ * ++ * h0 = 0x67452301; h1 = 0xEFCDAB89; h2 = 0x98BADCFE; h3 = 0x10325476; ++ * h4 = 0xC3D2E1F0; ++ * ++ * ++ * RIPEMD-160: pseudo-code ++ * ++ * It is assumed that the message after padding consists of t 16-word blocks ++ * that will be denoted with X[i][j], with 0 <= i <= t-1 and 0 <= j <= 15. ++ * The symbol [+] denotes addition modulo 2**32 and rol_s denotes cyclic left ++ * shift (rotate) over s positions. ++ * ++ * ++ * for i := 0 to t-1 { ++ * A := h0; B := h1; C := h2; D = h3; E = h4; ++ * A' := h0; B' := h1; C' := h2; D' = h3; E' = h4; ++ * for j := 0 to 79 { ++ * T := rol_s(j)(A [+] f(j, B, C, D) [+] X[i][r(j)] [+] K(j)) [+] E; ++ * A := E; E := D; D := rol_10(C); C := B; B := T; ++ * T := rol_s'(j)(A' [+] f(79-j, B', C', D') [+] X[i][r'(j)] ++ [+] K'(j)) [+] E'; ++ * A' := E'; E' := D'; D' := rol_10(C'); C' := B'; B' := T; ++ * } ++ * T := h1 [+] C [+] D'; h1 := h2 [+] D [+] E'; h2 := h3 [+] E [+] A'; ++ * h3 := h4 [+] A [+] B'; h4 := h0 [+] B [+] C'; h0 := T; ++ * } ++ */ ++ ++/* Some examples: ++ * "" 9c1185a5c5e9fc54612808977ee8f548b2258d31 ++ * "a" 0bdc9d2d256b3ee9daae347be6f4dc835a467ffe ++ * "abc" 8eb208f7e05d987a9b044a8e98c6b087f15a0bfc ++ * "message digest" 5d0689ef49d2fae572b881b123a85ffa21595f36 ++ * "a...z" f71c27109c692c1b56bbdceb5b9d2865b3708dbc ++ * "abcdbcde...nopq" 12a053384a9c0c88e405a06c27dcf49ada62eb2b ++ * "A...Za...z0...9" b0e20b6e3116640286ed3a87a5713079b21f5189 ++ * 8 times "1234567890" 9b752e45573d4b39f4dbd3323cab82bf63326bfb ++ * 1 million times "a" 52783243c1697bdbe16d37f97f68f08325dc1528 ++ */ ++ ++ ++static void ++rmd160_init( RMD160_CONTEXT *hd ) ++{ ++ hd->h0 = 0x67452301; ++ hd->h1 = 0xEFCDAB89; ++ hd->h2 = 0x98BADCFE; ++ hd->h3 = 0x10325476; ++ hd->h4 = 0xC3D2E1F0; ++ hd->nblocks = 0; ++ hd->count = 0; ++} ++ ++ ++ ++/**************** ++ * Transform the message X which consists of 16 32-bit-words ++ */ ++static void ++transform( RMD160_CONTEXT *hd, byte *data ) ++{ ++ u32 a,b,c,d,e,aa,bb,cc,dd,ee,t; ++ #if BYTE_ORDER == BIG_ENDIAN ++ u32 x[16]; ++ { int i; ++ byte *p2, *p1; ++ for(i=0, p1=data, p2=(byte*)x; i < 16; i++, p2 += 4 ) { ++ p2[3] = *p1++; ++ p2[2] = *p1++; ++ p2[1] = *p1++; ++ p2[0] = *p1++; ++ } ++ } ++ #else ++ #if 0 ++ u32 *x =(u32*)data; ++ #else ++ /* this version is better because it is always aligned; ++ * The performance penalty on a 586-100 is about 6% which ++ * is acceptable - because the data is more local it might ++ * also be possible that this is faster on some machines. ++ * This function (when compiled with -02 on gcc 2.7.2) ++ * executes on a 586-100 (39.73 bogomips) at about 1900kb/sec; ++ * [measured with a 4MB data and "gpgm --print-md rmd160"] */ ++ u32 x[16]; ++ memcpy( x, data, 64 ); ++ #endif ++ #endif ++ ++ ++#define K0 0x00000000 ++#define K1 0x5A827999 ++#define K2 0x6ED9EBA1 ++#define K3 0x8F1BBCDC ++#define K4 0xA953FD4E ++#define KK0 0x50A28BE6 ++#define KK1 0x5C4DD124 ++#define KK2 0x6D703EF3 ++#define KK3 0x7A6D76E9 ++#define KK4 0x00000000 ++#define F0(x,y,z) ( (x) ^ (y) ^ (z) ) ++#define F1(x,y,z) ( ((x) & (y)) | (~(x) & (z)) ) ++#define F2(x,y,z) ( ((x) | ~(y)) ^ (z) ) ++#define F3(x,y,z) ( ((x) & (z)) | ((y) & ~(z)) ) ++#define F4(x,y,z) ( (x) ^ ((y) | ~(z)) ) ++#define R(a,b,c,d,e,f,k,r,s) do { t = a + f(b,c,d) + k + x[r]; \ ++ a = rol(t,s) + e; \ ++ c = rol(c,10); \ ++ } while(0) ++ ++ /* left lane */ ++ a = hd->h0; ++ b = hd->h1; ++ c = hd->h2; ++ d = hd->h3; ++ e = hd->h4; ++ R( a, b, c, d, e, F0, K0, 0, 11 ); ++ R( e, a, b, c, d, F0, K0, 1, 14 ); ++ R( d, e, a, b, c, F0, K0, 2, 15 ); ++ R( c, d, e, a, b, F0, K0, 3, 12 ); ++ R( b, c, d, e, a, F0, K0, 4, 5 ); ++ R( a, b, c, d, e, F0, K0, 5, 8 ); ++ R( e, a, b, c, d, F0, K0, 6, 7 ); ++ R( d, e, a, b, c, F0, K0, 7, 9 ); ++ R( c, d, e, a, b, F0, K0, 8, 11 ); ++ R( b, c, d, e, a, F0, K0, 9, 13 ); ++ R( a, b, c, d, e, F0, K0, 10, 14 ); ++ R( e, a, b, c, d, F0, K0, 11, 15 ); ++ R( d, e, a, b, c, F0, K0, 12, 6 ); ++ R( c, d, e, a, b, F0, K0, 13, 7 ); ++ R( b, c, d, e, a, F0, K0, 14, 9 ); ++ R( a, b, c, d, e, F0, K0, 15, 8 ); ++ R( e, a, b, c, d, F1, K1, 7, 7 ); ++ R( d, e, a, b, c, F1, K1, 4, 6 ); ++ R( c, d, e, a, b, F1, K1, 13, 8 ); ++ R( b, c, d, e, a, F1, K1, 1, 13 ); ++ R( a, b, c, d, e, F1, K1, 10, 11 ); ++ R( e, a, b, c, d, F1, K1, 6, 9 ); ++ R( d, e, a, b, c, F1, K1, 15, 7 ); ++ R( c, d, e, a, b, F1, K1, 3, 15 ); ++ R( b, c, d, e, a, F1, K1, 12, 7 ); ++ R( a, b, c, d, e, F1, K1, 0, 12 ); ++ R( e, a, b, c, d, F1, K1, 9, 15 ); ++ R( d, e, a, b, c, F1, K1, 5, 9 ); ++ R( c, d, e, a, b, F1, K1, 2, 11 ); ++ R( b, c, d, e, a, F1, K1, 14, 7 ); ++ R( a, b, c, d, e, F1, K1, 11, 13 ); ++ R( e, a, b, c, d, F1, K1, 8, 12 ); ++ R( d, e, a, b, c, F2, K2, 3, 11 ); ++ R( c, d, e, a, b, F2, K2, 10, 13 ); ++ R( b, c, d, e, a, F2, K2, 14, 6 ); ++ R( a, b, c, d, e, F2, K2, 4, 7 ); ++ R( e, a, b, c, d, F2, K2, 9, 14 ); ++ R( d, e, a, b, c, F2, K2, 15, 9 ); ++ R( c, d, e, a, b, F2, K2, 8, 13 ); ++ R( b, c, d, e, a, F2, K2, 1, 15 ); ++ R( a, b, c, d, e, F2, K2, 2, 14 ); ++ R( e, a, b, c, d, F2, K2, 7, 8 ); ++ R( d, e, a, b, c, F2, K2, 0, 13 ); ++ R( c, d, e, a, b, F2, K2, 6, 6 ); ++ R( b, c, d, e, a, F2, K2, 13, 5 ); ++ R( a, b, c, d, e, F2, K2, 11, 12 ); ++ R( e, a, b, c, d, F2, K2, 5, 7 ); ++ R( d, e, a, b, c, F2, K2, 12, 5 ); ++ R( c, d, e, a, b, F3, K3, 1, 11 ); ++ R( b, c, d, e, a, F3, K3, 9, 12 ); ++ R( a, b, c, d, e, F3, K3, 11, 14 ); ++ R( e, a, b, c, d, F3, K3, 10, 15 ); ++ R( d, e, a, b, c, F3, K3, 0, 14 ); ++ R( c, d, e, a, b, F3, K3, 8, 15 ); ++ R( b, c, d, e, a, F3, K3, 12, 9 ); ++ R( a, b, c, d, e, F3, K3, 4, 8 ); ++ R( e, a, b, c, d, F3, K3, 13, 9 ); ++ R( d, e, a, b, c, F3, K3, 3, 14 ); ++ R( c, d, e, a, b, F3, K3, 7, 5 ); ++ R( b, c, d, e, a, F3, K3, 15, 6 ); ++ R( a, b, c, d, e, F3, K3, 14, 8 ); ++ R( e, a, b, c, d, F3, K3, 5, 6 ); ++ R( d, e, a, b, c, F3, K3, 6, 5 ); ++ R( c, d, e, a, b, F3, K3, 2, 12 ); ++ R( b, c, d, e, a, F4, K4, 4, 9 ); ++ R( a, b, c, d, e, F4, K4, 0, 15 ); ++ R( e, a, b, c, d, F4, K4, 5, 5 ); ++ R( d, e, a, b, c, F4, K4, 9, 11 ); ++ R( c, d, e, a, b, F4, K4, 7, 6 ); ++ R( b, c, d, e, a, F4, K4, 12, 8 ); ++ R( a, b, c, d, e, F4, K4, 2, 13 ); ++ R( e, a, b, c, d, F4, K4, 10, 12 ); ++ R( d, e, a, b, c, F4, K4, 14, 5 ); ++ R( c, d, e, a, b, F4, K4, 1, 12 ); ++ R( b, c, d, e, a, F4, K4, 3, 13 ); ++ R( a, b, c, d, e, F4, K4, 8, 14 ); ++ R( e, a, b, c, d, F4, K4, 11, 11 ); ++ R( d, e, a, b, c, F4, K4, 6, 8 ); ++ R( c, d, e, a, b, F4, K4, 15, 5 ); ++ R( b, c, d, e, a, F4, K4, 13, 6 ); ++ ++ aa = a; bb = b; cc = c; dd = d; ee = e; ++ ++ /* right lane */ ++ a = hd->h0; ++ b = hd->h1; ++ c = hd->h2; ++ d = hd->h3; ++ e = hd->h4; ++ R( a, b, c, d, e, F4, KK0, 5, 8); ++ R( e, a, b, c, d, F4, KK0, 14, 9); ++ R( d, e, a, b, c, F4, KK0, 7, 9); ++ R( c, d, e, a, b, F4, KK0, 0, 11); ++ R( b, c, d, e, a, F4, KK0, 9, 13); ++ R( a, b, c, d, e, F4, KK0, 2, 15); ++ R( e, a, b, c, d, F4, KK0, 11, 15); ++ R( d, e, a, b, c, F4, KK0, 4, 5); ++ R( c, d, e, a, b, F4, KK0, 13, 7); ++ R( b, c, d, e, a, F4, KK0, 6, 7); ++ R( a, b, c, d, e, F4, KK0, 15, 8); ++ R( e, a, b, c, d, F4, KK0, 8, 11); ++ R( d, e, a, b, c, F4, KK0, 1, 14); ++ R( c, d, e, a, b, F4, KK0, 10, 14); ++ R( b, c, d, e, a, F4, KK0, 3, 12); ++ R( a, b, c, d, e, F4, KK0, 12, 6); ++ R( e, a, b, c, d, F3, KK1, 6, 9); ++ R( d, e, a, b, c, F3, KK1, 11, 13); ++ R( c, d, e, a, b, F3, KK1, 3, 15); ++ R( b, c, d, e, a, F3, KK1, 7, 7); ++ R( a, b, c, d, e, F3, KK1, 0, 12); ++ R( e, a, b, c, d, F3, KK1, 13, 8); ++ R( d, e, a, b, c, F3, KK1, 5, 9); ++ R( c, d, e, a, b, F3, KK1, 10, 11); ++ R( b, c, d, e, a, F3, KK1, 14, 7); ++ R( a, b, c, d, e, F3, KK1, 15, 7); ++ R( e, a, b, c, d, F3, KK1, 8, 12); ++ R( d, e, a, b, c, F3, KK1, 12, 7); ++ R( c, d, e, a, b, F3, KK1, 4, 6); ++ R( b, c, d, e, a, F3, KK1, 9, 15); ++ R( a, b, c, d, e, F3, KK1, 1, 13); ++ R( e, a, b, c, d, F3, KK1, 2, 11); ++ R( d, e, a, b, c, F2, KK2, 15, 9); ++ R( c, d, e, a, b, F2, KK2, 5, 7); ++ R( b, c, d, e, a, F2, KK2, 1, 15); ++ R( a, b, c, d, e, F2, KK2, 3, 11); ++ R( e, a, b, c, d, F2, KK2, 7, 8); ++ R( d, e, a, b, c, F2, KK2, 14, 6); ++ R( c, d, e, a, b, F2, KK2, 6, 6); ++ R( b, c, d, e, a, F2, KK2, 9, 14); ++ R( a, b, c, d, e, F2, KK2, 11, 12); ++ R( e, a, b, c, d, F2, KK2, 8, 13); ++ R( d, e, a, b, c, F2, KK2, 12, 5); ++ R( c, d, e, a, b, F2, KK2, 2, 14); ++ R( b, c, d, e, a, F2, KK2, 10, 13); ++ R( a, b, c, d, e, F2, KK2, 0, 13); ++ R( e, a, b, c, d, F2, KK2, 4, 7); ++ R( d, e, a, b, c, F2, KK2, 13, 5); ++ R( c, d, e, a, b, F1, KK3, 8, 15); ++ R( b, c, d, e, a, F1, KK3, 6, 5); ++ R( a, b, c, d, e, F1, KK3, 4, 8); ++ R( e, a, b, c, d, F1, KK3, 1, 11); ++ R( d, e, a, b, c, F1, KK3, 3, 14); ++ R( c, d, e, a, b, F1, KK3, 11, 14); ++ R( b, c, d, e, a, F1, KK3, 15, 6); ++ R( a, b, c, d, e, F1, KK3, 0, 14); ++ R( e, a, b, c, d, F1, KK3, 5, 6); ++ R( d, e, a, b, c, F1, KK3, 12, 9); ++ R( c, d, e, a, b, F1, KK3, 2, 12); ++ R( b, c, d, e, a, F1, KK3, 13, 9); ++ R( a, b, c, d, e, F1, KK3, 9, 12); ++ R( e, a, b, c, d, F1, KK3, 7, 5); ++ R( d, e, a, b, c, F1, KK3, 10, 15); ++ R( c, d, e, a, b, F1, KK3, 14, 8); ++ R( b, c, d, e, a, F0, KK4, 12, 8); ++ R( a, b, c, d, e, F0, KK4, 15, 5); ++ R( e, a, b, c, d, F0, KK4, 10, 12); ++ R( d, e, a, b, c, F0, KK4, 4, 9); ++ R( c, d, e, a, b, F0, KK4, 1, 12); ++ R( b, c, d, e, a, F0, KK4, 5, 5); ++ R( a, b, c, d, e, F0, KK4, 8, 14); ++ R( e, a, b, c, d, F0, KK4, 7, 6); ++ R( d, e, a, b, c, F0, KK4, 6, 8); ++ R( c, d, e, a, b, F0, KK4, 2, 13); ++ R( b, c, d, e, a, F0, KK4, 13, 6); ++ R( a, b, c, d, e, F0, KK4, 14, 5); ++ R( e, a, b, c, d, F0, KK4, 0, 15); ++ R( d, e, a, b, c, F0, KK4, 3, 13); ++ R( c, d, e, a, b, F0, KK4, 9, 11); ++ R( b, c, d, e, a, F0, KK4, 11, 11); ++ ++ ++ t = hd->h1 + d + cc; ++ hd->h1 = hd->h2 + e + dd; ++ hd->h2 = hd->h3 + a + ee; ++ hd->h3 = hd->h4 + b + aa; ++ hd->h4 = hd->h0 + c + bb; ++ hd->h0 = t; ++} ++ ++ ++/* Update the message digest with the contents ++ * of INBUF with length INLEN. ++ */ ++static void ++rmd160_write( RMD160_CONTEXT *hd, byte *inbuf, size_t inlen) ++{ ++ if( hd->count == 64 ) { /* flush the buffer */ ++ transform( hd, hd->buf ); ++ hd->count = 0; ++ hd->nblocks++; ++ } ++ if( !inbuf ) ++ return; ++ if( hd->count ) { ++ for( ; inlen && hd->count < 64; inlen-- ) ++ hd->buf[hd->count++] = *inbuf++; ++ rmd160_write( hd, NULL, 0 ); ++ if( !inlen ) ++ return; ++ } ++ ++ while( inlen >= 64 ) { ++ transform( hd, inbuf ); ++ hd->count = 0; ++ hd->nblocks++; ++ inlen -= 64; ++ inbuf += 64; ++ } ++ for( ; inlen && hd->count < 64; inlen-- ) ++ hd->buf[hd->count++] = *inbuf++; ++} ++ ++/* The routine terminates the computation ++ */ ++ ++static void ++rmd160_final( RMD160_CONTEXT *hd ) ++{ ++ u32 t, msb, lsb; ++ byte *p; ++ ++ rmd160_write(hd, NULL, 0); /* flush */; ++ ++ msb = 0; ++ t = hd->nblocks; ++ if( (lsb = t << 6) < t ) /* multiply by 64 to make a byte count */ ++ msb++; ++ msb += t >> 26; ++ t = lsb; ++ if( (lsb = t + hd->count) < t ) /* add the count */ ++ msb++; ++ t = lsb; ++ if( (lsb = t << 3) < t ) /* multiply by 8 to make a bit count */ ++ msb++; ++ msb += t >> 29; ++ ++ if( hd->count < 56 ) { /* enough room */ ++ hd->buf[hd->count++] = 0x80; /* pad */ ++ while( hd->count < 56 ) ++ hd->buf[hd->count++] = 0; /* pad */ ++ } ++ else { /* need one extra block */ ++ hd->buf[hd->count++] = 0x80; /* pad character */ ++ while( hd->count < 64 ) ++ hd->buf[hd->count++] = 0; ++ rmd160_write(hd, NULL, 0); /* flush */; ++ memset(hd->buf, 0, 56 ); /* fill next block with zeroes */ ++ } ++ /* append the 64 bit count */ ++ hd->buf[56] = lsb ; ++ hd->buf[57] = lsb >> 8; ++ hd->buf[58] = lsb >> 16; ++ hd->buf[59] = lsb >> 24; ++ hd->buf[60] = msb ; ++ hd->buf[61] = msb >> 8; ++ hd->buf[62] = msb >> 16; ++ hd->buf[63] = msb >> 24; ++ transform( hd, hd->buf ); ++ ++ p = hd->buf; ++ #if BYTE_ORDER == BIG_ENDIAN ++ #define X(a) do { *p++ = hd->h##a ; *p++ = hd->h##a >> 8; \ ++ *p++ = hd->h##a >> 16; *p++ = hd->h##a >> 24; } while(0) ++ #else /* little endian */ ++ #define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0) ++ #endif ++ X(0); ++ X(1); ++ X(2); ++ X(3); ++ X(4); ++ #undef X ++} ++ ++/**************** ++ * Shortcut functions which puts the hash value of the supplied buffer ++ * into outbuf which must have a size of 20 bytes. ++ */ ++void ++rmd160_hash_buffer( char *outbuf, const char *buffer, size_t length ) ++{ ++ RMD160_CONTEXT hd; ++ ++ rmd160_init( &hd ); ++ rmd160_write( &hd, (byte*)buffer, length ); ++ rmd160_final( &hd ); ++ memcpy( outbuf, hd.buf, 20 ); ++} +diff -urN util-linux-2.10o/mount/rmd160.h util-linux-2.10o.int2/mount/rmd160.h +--- util-linux-2.10o/mount/rmd160.h Thu Jan 1 01:00:00 1970 ++++ util-linux-2.10o.int2/mount/rmd160.h Mon Sep 25 11:46:18 2000 +@@ -0,0 +1,9 @@ ++#ifndef RMD160_H ++#define RMD160_H ++ ++void ++rmd160_hash_buffer( char *outbuf, const char *buffer, size_t length ); ++ ++#endif /*RMD160_H*/ ++ ++ diff -urN lin.2.2.17/Documentation/crypto/utils/freeswan-import.sh int.2.2.17.x/Documentation/crypto/utils/freeswan-import.sh --- lin.2.2.17/Documentation/crypto/utils/freeswan-import.sh Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/Documentation/crypto/utils/freeswan-import.sh Sat Oct 14 00:48:17 2000 @@ -0,0 +1,63 @@ +#!/bin/bash +# +# Import updates from the somewhat excentric freeswan distribution. +# +# Freeswan patches the kernel with a "smart" patch script. This +# script cleans up after freeswan's "smart" patching. +# +# import-freeswan.sh +# +# int-kernel-dir is the full path to a directory patched with the international # kernel patch, but without the freeswan patches. freeswan-dir is where the +# freeswan distribution is located. + +INT=$1 +FREESWAN=$2 +# strip trailing slashes +INT=${INT%/} +FREESWAN=${FREESWAN%/} + +if [ ! -e $INT -o ! -e $FREESWAN ]; then + echo "Either $INT or $FREESWAN are missing!" +fi + +mkdir -p $INT.freeswan +(cd $INT.freeswan; lndir ../`basename $INT` .) + +(cd $FREESWAN; make patches KERNELSRC=$INT.freeswan) +find $INT.freeswan \( \( -name '*.ipsecmd5' \) -o \( -name '*.preipsec' \) \ + -o \( -name '*.wipsec' \) -o \( -name '*.mangled' \) \) -print | + while read a; do + echo "Removing $a ..." + rm $a; + done + + +#(cd $FREESWAN; make klink KERNELSRC=$INT.freeswan) +cp -R $FREESWAN/klips/net/ipsec $INT.freeswan/net/ipsec + + +# The kernel part of freeswan is referring to ../../../lib/freeswan.h +# which is something we have to fix. +# Also the Makefile is referring to ../../../lib/libkernel.a and +# ../../../libdes.a +# We have to move the lib directory from the freeswan distribution +# into the kernel distribution and fix the references. +cp -R $FREESWAN/lib $INT.freeswan/net/ipsec/ +find $INT.freeswan/net/ipsec -follow -iname '*.[ch]' -o -name Makefile | + while read a; do + perl -pi -e 's/\.\.\/\.\.\/\.\.\/lib/lib/' $a + done + +# Now the makefile in net/ipsec is extremely flawed. It depends on +# ../../../lib/libdes.a (now lib/libdes.a), but it has no rule to make +# that library. So we patch the Makefile somewhat. +perl -pi -e 'if (m/DESLIB=lib/) { print "$_\n\$(DESLIB):\n\t( cd lib; \$(MAKE) libdes.a )\n\n" }' $INT.freeswan/net/ipsec/Makefile + +# Fix another bug in the freeswan-1.1/lib/Makefile file. Inadequate +# quoting of the $(CC) variable. +perl -pi -e 's/\$\(CC\)/\"\$\(CC\)\"/' $INT.freeswan/net/ipsec/lib/Makefile + + +# references to ../../../lib to point to lib + +diff -urN $INT $INT.freeswan > $INT/../`basename $INT`.freeswan.patch diff -urN lin.2.2.17/MAINTAINERS int.2.2.17.x/MAINTAINERS --- lin.2.2.17/MAINTAINERS Thu Sep 14 18:18:20 2000 +++ int.2.2.17.x/MAINTAINERS Sat Oct 14 00:48:17 2000 @@ -452,6 +452,13 @@ L: linux-kernel@vger.kernel.org S: Maintained +INTERNATIONAL KERNEL PATCH (CRYPTO) +P: Alexander Kjeldaas +M: astor@fast.no +W: http://www.kerneli.org/ +L: linux-kernel@vger.rutgers.edu +S: Maintained + IP FIREWALL P: Paul Russell M: Paul.Russell@rustcorp.com.au diff -urN lin.2.2.17/Makefile int.2.2.17.x/Makefile --- lin.2.2.17/Makefile Thu Sep 14 18:18:20 2000 +++ int.2.2.17.x/Makefile Sat Oct 14 00:48:17 2000 @@ -110,11 +110,12 @@ CORE_FILES =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o FILESYSTEMS =fs/filesystems.a NETWORKS =net/network.a -DRIVERS =drivers/block/block.a \ +DRIVERS =crypto/crypto.a \ + drivers/block/block.a \ drivers/char/char.a \ drivers/misc/misc.a LIBS =$(TOPDIR)/lib/lib.a -SUBDIRS =kernel drivers mm fs net ipc lib +SUBDIRS =kernel drivers mm fs net ipc lib crypto ifdef CONFIG_NUBUS DRIVERS := $(DRIVERS) drivers/nubus/nubus.a diff -urN lin.2.2.17/arch/alpha/config.in int.2.2.17.x/arch/alpha/config.in --- lin.2.2.17/arch/alpha/config.in Thu Sep 14 18:18:20 2000 +++ int.2.2.17.x/arch/alpha/config.in Sat Oct 14 00:48:17 2000 @@ -226,6 +226,8 @@ source net/Config.in fi +source crypto/Config.in + mainmenu_option next_comment comment 'SCSI support' diff -urN lin.2.2.17/arch/arm/config.in int.2.2.17.x/arch/arm/config.in --- lin.2.2.17/arch/arm/config.in Wed Jun 7 23:26:42 2000 +++ int.2.2.17.x/arch/arm/config.in Sat Oct 14 00:48:17 2000 @@ -168,6 +168,8 @@ source net/Config.in fi +source crypto/Config.in + if [ "$CONFIG_NET" = "y" ]; then mainmenu_option next_comment comment 'Network device support' diff -urN lin.2.2.17/arch/i386/config.in int.2.2.17.x/arch/i386/config.in --- lin.2.2.17/arch/i386/config.in Thu Sep 14 18:18:20 2000 +++ int.2.2.17.x/arch/i386/config.in Sat Oct 14 00:48:17 2000 @@ -118,6 +118,8 @@ endmenu +source crypto/Config.in + source drivers/pnp/Config.in source drivers/block/Config.in diff -urN lin.2.2.17/arch/i386/defconfig int.2.2.17.x/arch/i386/defconfig --- lin.2.2.17/arch/i386/defconfig Thu May 4 02:16:30 2000 +++ int.2.2.17.x/arch/i386/defconfig Sat Oct 14 00:48:17 2000 @@ -92,6 +92,8 @@ # Additional Block Devices # # CONFIG_BLK_DEV_LOOP is not set +# CONFIG_BLK_DEV_LOOP_CAST is not set +# CONFIG_BLK_DEV_LOOP_IDEA is not set # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_MD is not set # CONFIG_BLK_DEV_RAM is not set diff -urN lin.2.2.17/arch/m68k/config.in int.2.2.17.x/arch/m68k/config.in --- lin.2.2.17/arch/m68k/config.in Wed Jun 7 23:26:42 2000 +++ int.2.2.17.x/arch/m68k/config.in Sat Oct 14 00:48:17 2000 @@ -129,6 +129,8 @@ source net/Config.in fi +source crypto/Config.in + mainmenu_option next_comment comment 'SCSI support' diff -urN lin.2.2.17/arch/mips/config.in int.2.2.17.x/arch/mips/config.in --- lin.2.2.17/arch/mips/config.in Wed Jun 7 23:26:42 2000 +++ int.2.2.17.x/arch/mips/config.in Sat Oct 14 00:48:17 2000 @@ -130,6 +130,8 @@ source net/Config.in fi +source crypto/Config.in + mainmenu_option next_comment comment 'SCSI support' diff -urN lin.2.2.17/arch/ppc/config.in int.2.2.17.x/arch/ppc/config.in --- lin.2.2.17/arch/ppc/config.in Thu Sep 14 18:18:20 2000 +++ int.2.2.17.x/arch/ppc/config.in Sat Oct 14 00:48:17 2000 @@ -134,6 +134,8 @@ source net/Config.in fi +source crypto/Config.in + mainmenu_option next_comment comment 'SCSI support' tristate 'SCSI support' CONFIG_SCSI diff -urN lin.2.2.17/arch/sparc/config.in int.2.2.17.x/arch/sparc/config.in --- lin.2.2.17/arch/sparc/config.in Wed Jun 7 23:26:42 2000 +++ int.2.2.17.x/arch/sparc/config.in Sat Oct 14 00:48:17 2000 @@ -127,6 +127,8 @@ endmenu fi +source crypto/Config.in + mainmenu_option next_comment comment 'ISDN subsystem' diff -urN lin.2.2.17/arch/sparc64/config.in int.2.2.17.x/arch/sparc64/config.in --- lin.2.2.17/arch/sparc64/config.in Thu Sep 14 18:18:20 2000 +++ int.2.2.17.x/arch/sparc64/config.in Sat Oct 14 00:48:17 2000 @@ -156,6 +156,8 @@ endmenu fi +source crypto/Config.in + mainmenu_option next_comment comment 'SCSI support' diff -urN lin.2.2.17/crypto/2fish_tables.h int.2.2.17.x/crypto/2fish_tables.h --- lin.2.2.17/crypto/2fish_tables.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/2fish_tables.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,427 @@ +/* The large precomputed tables for the Twofish cipher (twofish.c) + * Taken from the same source as twofish.c + * Marc Mutz + */ + +/* These two tables are the q0 and q1 permutations, exactly as described in + * the Twofish paper. */ + +#ifndef _2FISH_TABLES_H +#define _2FISH_TABLES_H + +#include + +static const u8 q0[256] = { + 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, 0x9A, 0x92, 0x80, 0x78, + 0xE4, 0xDD, 0xD1, 0x38, 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C, + 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, 0xF2, 0xD0, 0x8B, 0x30, + 0x84, 0x54, 0xDF, 0x23, 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82, + 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, 0xA6, 0xEB, 0xA5, 0xBE, + 0x16, 0x0C, 0xE3, 0x61, 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, + 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, 0xE1, 0xE6, 0xBD, 0x45, + 0xE2, 0xF4, 0xB6, 0x66, 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, + 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, 0xEA, 0x77, 0x39, 0xAF, + 0x33, 0xC9, 0x62, 0x71, 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, + 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, 0xA1, 0x1D, 0xAA, 0xED, + 0x06, 0x70, 0xB2, 0xD2, 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90, + 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, 0x9E, 0x9C, 0x52, 0x1B, + 0x5F, 0x93, 0x0A, 0xEF, 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B, + 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, 0x2A, 0xCE, 0xCB, 0x2F, + 0xFC, 0x97, 0x05, 0x7A, 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, + 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, 0xB8, 0xDA, 0xB0, 0x17, + 0x55, 0x1F, 0x8A, 0x7D, 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, + 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, 0x6E, 0x50, 0xDE, 0x68, + 0x65, 0xBC, 0xDB, 0xF8, 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, + 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, 0x6F, 0x9D, 0x36, 0x42, + 0x4A, 0x5E, 0xC1, 0xE0 +}; + +static const u8 q1[256] = { + 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, 0x4A, 0xD3, 0xE6, 0x6B, + 0x45, 0x7D, 0xE8, 0x4B, 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1, + 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, 0x5E, 0xBA, 0xAE, 0x5B, + 0x8A, 0x00, 0xBC, 0x9D, 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5, + 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, 0xB2, 0x73, 0x4C, 0x54, + 0x92, 0x74, 0x36, 0x51, 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, + 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, 0x13, 0x95, 0x9C, 0xC7, + 0x24, 0x46, 0x3B, 0x70, 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, + 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, 0x03, 0x6F, 0x08, 0xBF, + 0x40, 0xE7, 0x2B, 0xE2, 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, + 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, 0x66, 0x94, 0xA1, 0x1D, + 0x3D, 0xF0, 0xDE, 0xB3, 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E, + 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, 0x81, 0x88, 0xEE, 0x21, + 0xC4, 0x1A, 0xEB, 0xD9, 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01, + 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, 0x4F, 0xF2, 0x65, 0x8E, + 0x78, 0x5C, 0x58, 0x19, 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64, + 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, 0xCE, 0xE9, 0x68, 0x44, + 0xE0, 0x4D, 0x43, 0x69, 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, + 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, 0x22, 0xC9, 0xC0, 0x9B, + 0x89, 0xD4, 0xED, 0xAB, 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, + 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, 0x16, 0x25, 0x86, 0x56, + 0x55, 0x09, 0xBE, 0x91 +}; + +/* These MDS tables are actually tables of MDS composed with q0 and q1, + * because it is only ever used that way and we can save some time by + * precomputing. Of course the main saving comes from precomputing the + * GF(2^8) multiplication involved in the MDS matrix multiply; by looking + * things up in these tables we reduce the matrix multiply to four lookups + * and three XORs. Semi-formally, the definition of these tables is: + * mds[0][i] = MDS (q1[i] 0 0 0)^T mds[1][i] = MDS (0 q0[i] 0 0)^T + * mds[2][i] = MDS (0 0 q1[i] 0)^T mds[3][i] = MDS (0 0 0 q0[i])^T + * where ^T means "transpose", the matrix multiply is performed in GF(2^8) + * represented as GF(2)[x]/v(x) where v(x)=x^8+x^6+x^5+x^3+1 as described + * by Schneier et al, and I'm casually glossing over the byte/word + * conversion issues. */ + +static const u32 mds[4][256] = { + {0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, + 0xE2E22BFB, 0x9E9EFAC8, 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, + 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B, 0x3C3C57D6, 0x93938A32, + 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1, + 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, + 0xB0B0B306, 0x7575DE3F, 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, + 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D, 0xAEAE2C6D, 0x7F7FABC1, + 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5, + 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, + 0x3131272C, 0x808065A3, 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, + 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51, 0x2A2A3638, 0xC4C49CB0, + 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796, + 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, + 0x6767C027, 0xE9E9AF8C, 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, + 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70, 0x29294CCA, 0xF0F035E3, + 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8, + 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, + 0xC8C81DC3, 0x9999FFCC, 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, + 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2, 0xB5B53D79, 0x09090F0C, + 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9, + 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, + 0xEDEDD07A, 0x4343FC17, 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, + 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3, 0x5656E70B, 0xE3E3DA72, + 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E, + 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, + 0x8181942A, 0x91910149, 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, + 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9, 0x7878AEC5, 0xC5C56D39, + 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01, + 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, + 0x55559DF9, 0x7E7E5A48, 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, + 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519, 0x0606F48D, 0x404086E5, + 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64, + 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, + 0x2D2D333C, 0x3030D6A5, 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, + 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969, 0xD9D97929, 0x8686912E, + 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E, + 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, + 0xC1C112CF, 0x8585EBDC, 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, + 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB, 0xABABA212, 0x6F6F3EA2, + 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9, + 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, + 0x04047FF6, 0x272746C2, 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, + 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91}, + + {0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, + 0xA3658080, 0x76DFE4E4, 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, + 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A, 0x0D54E6E6, 0xC6432020, + 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141, + 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, + 0x94B1FBFB, 0x485A7E7E, 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, + 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060, 0x1945FDFD, 0x5BA33A3A, + 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757, + 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, + 0x9B53AAAA, 0x7C635D5D, 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, + 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7, 0xC0F09090, 0x8CAFE9E9, + 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656, + 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, + 0xB499C3C3, 0xF1975B5B, 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, + 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8, 0xCCFF9999, 0x95EA1414, + 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3, + 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, + 0xBF7E9595, 0xBA207D7D, 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, + 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB, 0x81FB0F0F, 0x793DB5B5, + 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282, + 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, + 0x86135050, 0xE730F7F7, 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, + 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B, 0x410B9F9F, 0x7B8B0202, + 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC, + 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, + 0xB1C72B2B, 0xAB6F8E8E, 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, + 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9, 0x91EF1313, 0x85FE0808, + 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272, + 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, + 0x6929A9A9, 0x647D4F4F, 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, + 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED, 0xAC87D1D1, 0x7F8E0505, + 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5, + 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, + 0x4C5F7979, 0x02B6B7B7, 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, + 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2, 0x57AC3333, 0xC718CFCF, + 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3, + 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, + 0x99E51D1D, 0x34392323, 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, + 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA, 0xC8FA9E9E, 0xA882D6D6, + 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF, + 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, + 0x0FE25151, 0x00000000, 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, + 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8}, + + {0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, + 0xE2FBE22B, 0x9EC89EFA, 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, + 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7, 0x3CD63C57, 0x9332938A, + 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783, + 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, + 0xB006B0B3, 0x753F75DE, 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, + 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0, 0xAE6DAE2C, 0x7FC17FAB, + 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA, + 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, + 0x312C3127, 0x80A38065, 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, + 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F, 0x2A382A36, 0xC4B0C49C, + 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07, + 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, + 0x672767C0, 0xE98CE9AF, 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, + 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C, 0x29CA294C, 0xF0E3F035, + 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96, + 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, + 0xC8C3C81D, 0x99CC99FF, 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, + 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E, 0xB579B53D, 0x090C090F, + 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD, + 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, + 0xED7AEDD0, 0x431743FC, 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, + 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71, 0x560B56E7, 0xE372E3DA, + 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85, + 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, + 0x812A8194, 0x91499101, 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, + 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5, 0x78C578AE, 0xC539C56D, + 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B, + 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, + 0x55F9559D, 0x7E487E5A, 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, + 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45, 0x068D06F4, 0x40E54086, + 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D, + 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, + 0x2D3C2D33, 0x30A530D6, 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, + 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929, 0xD929D979, 0x862E8691, + 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D, + 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, + 0xC1CFC112, 0x85DC85EB, 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, + 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F, 0xAB12ABA2, 0x6FA26F3E, + 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9, + 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, + 0x04F6047F, 0x27C22746, 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, + 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF}, + + {0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, + 0x6580A365, 0xDFE476DF, 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, + 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836, 0x54E60D54, 0x4320C643, + 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77, + 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, + 0xB1FB94B1, 0x5A7E485A, 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, + 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5, 0x45FD1945, 0xA33A5BA3, + 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216, + 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, + 0x53AA9B53, 0x635D7C63, 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, + 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123, 0xF090C0F0, 0xAFE98CAF, + 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7, + 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, + 0x99C3B499, 0x975BF197, 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, + 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB, 0xFF99CCFF, 0xEA1495EA, + 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C, + 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, + 0x7E95BF7E, 0x207DBA20, 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, + 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137, 0xFB0F81FB, 0x3DB5793D, + 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE, + 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, + 0x13508613, 0x30F7E730, 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, + 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252, 0x0B9F410B, 0x8B027B8B, + 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4, + 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, + 0xC72BB1C7, 0x6F8EAB6F, 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, + 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A, 0xEF1391EF, 0xFE0885FE, + 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB, + 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, + 0x29A96929, 0x7D4F647D, 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, + 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0, 0x87D1AC87, 0x8E057F8E, + 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8, + 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, + 0x5F794C5F, 0xB6B702B6, 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, + 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38, 0xAC3357AC, 0x18CFC718, + 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA, + 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, + 0xE51D99E5, 0x39233439, 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, + 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6, 0xFA9EC8FA, 0x82D6A882, + 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D, + 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, + 0xE2510FE2, 0x00000000, 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, + 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8} +}; + +/* The exp_to_poly and poly_to_exp tables are used to perform efficient + * operations in GF(2^8) represented as GF(2)[x]/w(x) where + * w(x)=x^8+x^6+x^3+x^2+1. We care about doing that because it's part of the + * definition of the RS matrix in the key schedule. Elements of that field + * are polynomials of degree not greater than 7 and all coefficients 0 or 1, + * which can be represented naturally by bytes (just substitute x=2). In that + * form, GF(2^8) addition is the same as bitwise XOR, but GF(2^8) + * multiplication is inefficient without hardware support. To multiply + * faster, I make use of the fact x is a generator for the nonzero elements, + * so that every element p of GF(2)[x]/w(x) is either 0 or equal to (x)^n for + * some n in 0..254. Note that that caret is exponentiation in GF(2^8), + * *not* polynomial notation. So if I want to compute pq where p and q are + * in GF(2^8), I can just say: + * 1. if p=0 or q=0 then pq=0 + * 2. otherwise, find m and n such that p=x^m and q=x^n + * 3. pq=(x^m)(x^n)=x^(m+n), so add m and n and find pq + * The translations in steps 2 and 3 are looked up in the tables + * poly_to_exp (for step 2) and exp_to_poly (for step 3). To see this + * in action, look at the CALC_S macro. As additional wrinkles, note that + * one of my operands is always a constant, so the poly_to_exp lookup on it + * is done in advance; I included the original values in the comments so + * readers can have some chance of recognizing that this *is* the RS matrix + * from the Twofish paper. I've only included the table entries I actually + * need; I never do a lookup on a variable input of zero and the biggest + * exponents I'll ever see are 254 (variable) and 237 (constant), so they'll + * never sum to more than 491. I'm repeating part of the exp_to_poly table + * so that I don't have to do mod-255 reduction in the exponent arithmetic. + * Since I know my constant operands are never zero, I only have to worry + * about zero values in the variable operand, and I do it with a simple + * conditional branch. I know conditionals are expensive, but I couldn't + * see a non-horrible way of avoiding them, and I did manage to group the + * statements so that each if covers four group multiplications. */ + +static const u8 poly_to_exp[255] = { + 0x00, 0x01, 0x17, 0x02, 0x2E, 0x18, 0x53, 0x03, 0x6A, 0x2F, 0x93, 0x19, + 0x34, 0x54, 0x45, 0x04, 0x5C, 0x6B, 0xB6, 0x30, 0xA6, 0x94, 0x4B, 0x1A, + 0x8C, 0x35, 0x81, 0x55, 0xAA, 0x46, 0x0D, 0x05, 0x24, 0x5D, 0x87, 0x6C, + 0x9B, 0xB7, 0xC1, 0x31, 0x2B, 0xA7, 0xA3, 0x95, 0x98, 0x4C, 0xCA, 0x1B, + 0xE6, 0x8D, 0x73, 0x36, 0xCD, 0x82, 0x12, 0x56, 0x62, 0xAB, 0xF0, 0x47, + 0x4F, 0x0E, 0xBD, 0x06, 0xD4, 0x25, 0xD2, 0x5E, 0x27, 0x88, 0x66, 0x6D, + 0xD6, 0x9C, 0x79, 0xB8, 0x08, 0xC2, 0xDF, 0x32, 0x68, 0x2C, 0xFD, 0xA8, + 0x8A, 0xA4, 0x5A, 0x96, 0x29, 0x99, 0x22, 0x4D, 0x60, 0xCB, 0xE4, 0x1C, + 0x7B, 0xE7, 0x3B, 0x8E, 0x9E, 0x74, 0xF4, 0x37, 0xD8, 0xCE, 0xF9, 0x83, + 0x6F, 0x13, 0xB2, 0x57, 0xE1, 0x63, 0xDC, 0xAC, 0xC4, 0xF1, 0xAF, 0x48, + 0x0A, 0x50, 0x42, 0x0F, 0xBA, 0xBE, 0xC7, 0x07, 0xDE, 0xD5, 0x78, 0x26, + 0x65, 0xD3, 0xD1, 0x5F, 0xE3, 0x28, 0x21, 0x89, 0x59, 0x67, 0xFC, 0x6E, + 0xB1, 0xD7, 0xF8, 0x9D, 0xF3, 0x7A, 0x3A, 0xB9, 0xC6, 0x09, 0x41, 0xC3, + 0xAE, 0xE0, 0xDB, 0x33, 0x44, 0x69, 0x92, 0x2D, 0x52, 0xFE, 0x16, 0xA9, + 0x0C, 0x8B, 0x80, 0xA5, 0x4A, 0x5B, 0xB5, 0x97, 0xC9, 0x2A, 0xA2, 0x9A, + 0xC0, 0x23, 0x86, 0x4E, 0xBC, 0x61, 0xEF, 0xCC, 0x11, 0xE5, 0x72, 0x1D, + 0x3D, 0x7C, 0xEB, 0xE8, 0xE9, 0x3C, 0xEA, 0x8F, 0x7D, 0x9F, 0xEC, 0x75, + 0x1E, 0xF5, 0x3E, 0x38, 0xF6, 0xD9, 0x3F, 0xCF, 0x76, 0xFA, 0x1F, 0x84, + 0xA0, 0x70, 0xED, 0x14, 0x90, 0xB3, 0x7E, 0x58, 0xFB, 0xE2, 0x20, 0x64, + 0xD0, 0xDD, 0x77, 0xAD, 0xDA, 0xC5, 0x40, 0xF2, 0x39, 0xB0, 0xF7, 0x49, + 0xB4, 0x0B, 0x7F, 0x51, 0x15, 0x43, 0x91, 0x10, 0x71, 0xBB, 0xEE, 0xBF, + 0x85, 0xC8, 0xA1 +}; + +static const u8 exp_to_poly[492] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x4D, 0x9A, 0x79, 0xF2, + 0xA9, 0x1F, 0x3E, 0x7C, 0xF8, 0xBD, 0x37, 0x6E, 0xDC, 0xF5, 0xA7, 0x03, + 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xCD, 0xD7, 0xE3, 0x8B, 0x5B, 0xB6, + 0x21, 0x42, 0x84, 0x45, 0x8A, 0x59, 0xB2, 0x29, 0x52, 0xA4, 0x05, 0x0A, + 0x14, 0x28, 0x50, 0xA0, 0x0D, 0x1A, 0x34, 0x68, 0xD0, 0xED, 0x97, 0x63, + 0xC6, 0xC1, 0xCF, 0xD3, 0xEB, 0x9B, 0x7B, 0xF6, 0xA1, 0x0F, 0x1E, 0x3C, + 0x78, 0xF0, 0xAD, 0x17, 0x2E, 0x5C, 0xB8, 0x3D, 0x7A, 0xF4, 0xA5, 0x07, + 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0x8D, 0x57, 0xAE, 0x11, 0x22, 0x44, 0x88, + 0x5D, 0xBA, 0x39, 0x72, 0xE4, 0x85, 0x47, 0x8E, 0x51, 0xA2, 0x09, 0x12, + 0x24, 0x48, 0x90, 0x6D, 0xDA, 0xF9, 0xBF, 0x33, 0x66, 0xCC, 0xD5, 0xE7, + 0x83, 0x4B, 0x96, 0x61, 0xC2, 0xC9, 0xDF, 0xF3, 0xAB, 0x1B, 0x36, 0x6C, + 0xD8, 0xFD, 0xB7, 0x23, 0x46, 0x8C, 0x55, 0xAA, 0x19, 0x32, 0x64, 0xC8, + 0xDD, 0xF7, 0xA3, 0x0B, 0x16, 0x2C, 0x58, 0xB0, 0x2D, 0x5A, 0xB4, 0x25, + 0x4A, 0x94, 0x65, 0xCA, 0xD9, 0xFF, 0xB3, 0x2B, 0x56, 0xAC, 0x15, 0x2A, + 0x54, 0xA8, 0x1D, 0x3A, 0x74, 0xE8, 0x9D, 0x77, 0xEE, 0x91, 0x6F, 0xDE, + 0xF1, 0xAF, 0x13, 0x26, 0x4C, 0x98, 0x7D, 0xFA, 0xB9, 0x3F, 0x7E, 0xFC, + 0xB5, 0x27, 0x4E, 0x9C, 0x75, 0xEA, 0x99, 0x7F, 0xFE, 0xB1, 0x2F, 0x5E, + 0xBC, 0x35, 0x6A, 0xD4, 0xE5, 0x87, 0x43, 0x86, 0x41, 0x82, 0x49, 0x92, + 0x69, 0xD2, 0xE9, 0x9F, 0x73, 0xE6, 0x81, 0x4F, 0x9E, 0x71, 0xE2, 0x89, + 0x5F, 0xBE, 0x31, 0x62, 0xC4, 0xC5, 0xC7, 0xC3, 0xCB, 0xDB, 0xFB, 0xBB, + 0x3B, 0x76, 0xEC, 0x95, 0x67, 0xCE, 0xD1, 0xEF, 0x93, 0x6B, 0xD6, 0xE1, + 0x8F, 0x53, 0xA6, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x4D, + 0x9A, 0x79, 0xF2, 0xA9, 0x1F, 0x3E, 0x7C, 0xF8, 0xBD, 0x37, 0x6E, 0xDC, + 0xF5, 0xA7, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xCD, 0xD7, 0xE3, + 0x8B, 0x5B, 0xB6, 0x21, 0x42, 0x84, 0x45, 0x8A, 0x59, 0xB2, 0x29, 0x52, + 0xA4, 0x05, 0x0A, 0x14, 0x28, 0x50, 0xA0, 0x0D, 0x1A, 0x34, 0x68, 0xD0, + 0xED, 0x97, 0x63, 0xC6, 0xC1, 0xCF, 0xD3, 0xEB, 0x9B, 0x7B, 0xF6, 0xA1, + 0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0xAD, 0x17, 0x2E, 0x5C, 0xB8, 0x3D, 0x7A, + 0xF4, 0xA5, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0x8D, 0x57, 0xAE, 0x11, + 0x22, 0x44, 0x88, 0x5D, 0xBA, 0x39, 0x72, 0xE4, 0x85, 0x47, 0x8E, 0x51, + 0xA2, 0x09, 0x12, 0x24, 0x48, 0x90, 0x6D, 0xDA, 0xF9, 0xBF, 0x33, 0x66, + 0xCC, 0xD5, 0xE7, 0x83, 0x4B, 0x96, 0x61, 0xC2, 0xC9, 0xDF, 0xF3, 0xAB, + 0x1B, 0x36, 0x6C, 0xD8, 0xFD, 0xB7, 0x23, 0x46, 0x8C, 0x55, 0xAA, 0x19, + 0x32, 0x64, 0xC8, 0xDD, 0xF7, 0xA3, 0x0B, 0x16, 0x2C, 0x58, 0xB0, 0x2D, + 0x5A, 0xB4, 0x25, 0x4A, 0x94, 0x65, 0xCA, 0xD9, 0xFF, 0xB3, 0x2B, 0x56, + 0xAC, 0x15, 0x2A, 0x54, 0xA8, 0x1D, 0x3A, 0x74, 0xE8, 0x9D, 0x77, 0xEE, + 0x91, 0x6F, 0xDE, 0xF1, 0xAF, 0x13, 0x26, 0x4C, 0x98, 0x7D, 0xFA, 0xB9, + 0x3F, 0x7E, 0xFC, 0xB5, 0x27, 0x4E, 0x9C, 0x75, 0xEA, 0x99, 0x7F, 0xFE, + 0xB1, 0x2F, 0x5E, 0xBC, 0x35, 0x6A, 0xD4, 0xE5, 0x87, 0x43, 0x86, 0x41, + 0x82, 0x49, 0x92, 0x69, 0xD2, 0xE9, 0x9F, 0x73, 0xE6, 0x81, 0x4F, 0x9E, + 0x71, 0xE2, 0x89, 0x5F, 0xBE, 0x31, 0x62, 0xC4, 0xC5, 0xC7, 0xC3, 0xCB +}; + + +/* The table constants are indices of + * S-box entries, preprocessed through q0 and q1. */ +static u8 calc_sb_tbl[512] = { + 0xA9, 0x75, 0x67, 0xF3, 0xB3, 0xC6, 0xE8, 0xF4, + 0x04, 0xDB, 0xFD, 0x7B, 0xA3, 0xFB, 0x76, 0xC8, + 0x9A, 0x4A, 0x92, 0xD3, 0x80, 0xE6, 0x78, 0x6B, + 0xE4, 0x45, 0xDD, 0x7D, 0xD1, 0xE8, 0x38, 0x4B, + 0x0D, 0xD6, 0xC6, 0x32, 0x35, 0xD8, 0x98, 0xFD, + 0x18, 0x37, 0xF7, 0x71, 0xEC, 0xF1, 0x6C, 0xE1, + 0x43, 0x30, 0x75, 0x0F, 0x37, 0xF8, 0x26, 0x1B, + 0xFA, 0x87, 0x13, 0xFA, 0x94, 0x06, 0x48, 0x3F, + 0xF2, 0x5E, 0xD0, 0xBA, 0x8B, 0xAE, 0x30, 0x5B, + 0x84, 0x8A, 0x54, 0x00, 0xDF, 0xBC, 0x23, 0x9D, + 0x19, 0x6D, 0x5B, 0xC1, 0x3D, 0xB1, 0x59, 0x0E, + 0xF3, 0x80, 0xAE, 0x5D, 0xA2, 0xD2, 0x82, 0xD5, + 0x63, 0xA0, 0x01, 0x84, 0x83, 0x07, 0x2E, 0x14, + 0xD9, 0xB5, 0x51, 0x90, 0x9B, 0x2C, 0x7C, 0xA3, + 0xA6, 0xB2, 0xEB, 0x73, 0xA5, 0x4C, 0xBE, 0x54, + 0x16, 0x92, 0x0C, 0x74, 0xE3, 0x36, 0x61, 0x51, + 0xC0, 0x38, 0x8C, 0xB0, 0x3A, 0xBD, 0xF5, 0x5A, + 0x73, 0xFC, 0x2C, 0x60, 0x25, 0x62, 0x0B, 0x96, + 0xBB, 0x6C, 0x4E, 0x42, 0x89, 0xF7, 0x6B, 0x10, + 0x53, 0x7C, 0x6A, 0x28, 0xB4, 0x27, 0xF1, 0x8C, + 0xE1, 0x13, 0xE6, 0x95, 0xBD, 0x9C, 0x45, 0xC7, + 0xE2, 0x24, 0xF4, 0x46, 0xB6, 0x3B, 0x66, 0x70, + 0xCC, 0xCA, 0x95, 0xE3, 0x03, 0x85, 0x56, 0xCB, + 0xD4, 0x11, 0x1C, 0xD0, 0x1E, 0x93, 0xD7, 0xB8, + 0xFB, 0xA6, 0xC3, 0x83, 0x8E, 0x20, 0xB5, 0xFF, + 0xE9, 0x9F, 0xCF, 0x77, 0xBF, 0xC3, 0xBA, 0xCC, + 0xEA, 0x03, 0x77, 0x6F, 0x39, 0x08, 0xAF, 0xBF, + 0x33, 0x40, 0xC9, 0xE7, 0x62, 0x2B, 0x71, 0xE2, + 0x81, 0x79, 0x79, 0x0C, 0x09, 0xAA, 0xAD, 0x82, + 0x24, 0x41, 0xCD, 0x3A, 0xF9, 0xEA, 0xD8, 0xB9, + 0xE5, 0xE4, 0xC5, 0x9A, 0xB9, 0xA4, 0x4D, 0x97, + 0x44, 0x7E, 0x08, 0xDA, 0x86, 0x7A, 0xE7, 0x17, + 0xA1, 0x66, 0x1D, 0x94, 0xAA, 0xA1, 0xED, 0x1D, + 0x06, 0x3D, 0x70, 0xF0, 0xB2, 0xDE, 0xD2, 0xB3, + 0x41, 0x0B, 0x7B, 0x72, 0xA0, 0xA7, 0x11, 0x1C, + 0x31, 0xEF, 0xC2, 0xD1, 0x27, 0x53, 0x90, 0x3E, + 0x20, 0x8F, 0xF6, 0x33, 0x60, 0x26, 0xFF, 0x5F, + 0x96, 0xEC, 0x5C, 0x76, 0xB1, 0x2A, 0xAB, 0x49, + 0x9E, 0x81, 0x9C, 0x88, 0x52, 0xEE, 0x1B, 0x21, + 0x5F, 0xC4, 0x93, 0x1A, 0x0A, 0xEB, 0xEF, 0xD9, + 0x91, 0xC5, 0x85, 0x39, 0x49, 0x99, 0xEE, 0xCD, + 0x2D, 0xAD, 0x4F, 0x31, 0x8F, 0x8B, 0x3B, 0x01, + 0x47, 0x18, 0x87, 0x23, 0x6D, 0xDD, 0x46, 0x1F, + 0xD6, 0x4E, 0x3E, 0x2D, 0x69, 0xF9, 0x64, 0x48, + 0x2A, 0x4F, 0xCE, 0xF2, 0xCB, 0x65, 0x2F, 0x8E, + 0xFC, 0x78, 0x97, 0x5C, 0x05, 0x58, 0x7A, 0x19, + 0xAC, 0x8D, 0x7F, 0xE5, 0xD5, 0x98, 0x1A, 0x57, + 0x4B, 0x67, 0x0E, 0x7F, 0xA7, 0x05, 0x5A, 0x64, + 0x28, 0xAF, 0x14, 0x63, 0x3F, 0xB6, 0x29, 0xFE, + 0x88, 0xF5, 0x3C, 0xB7, 0x4C, 0x3C, 0x02, 0xA5, + 0xB8, 0xCE, 0xDA, 0xE9, 0xB0, 0x68, 0x17, 0x44, + 0x55, 0xE0, 0x1F, 0x4D, 0x8A, 0x43, 0x7D, 0x69, + 0x57, 0x29, 0xC7, 0x2E, 0x8D, 0xAC, 0x74, 0x15, + 0xB7, 0x59, 0xC4, 0xA8, 0x9F, 0x0A, 0x72, 0x9E, + 0x7E, 0x6E, 0x15, 0x47, 0x22, 0xDF, 0x12, 0x34, + 0x58, 0x35, 0x07, 0x6A, 0x99, 0xCF, 0x34, 0xDC, + 0x6E, 0x22, 0x50, 0xC9, 0xDE, 0xC0, 0x68, 0x9B, + 0x65, 0x89, 0xBC, 0xD4, 0xDB, 0xED, 0xF8, 0xAB, + 0xC8, 0x12, 0xA8, 0xA2, 0x2B, 0x0D, 0x40, 0x52, + 0xDC, 0xBB, 0xFE, 0x02, 0x32, 0x2F, 0xA4, 0xA9, + 0xCA, 0xD7, 0x10, 0x61, 0x21, 0x1E, 0xF0, 0xB4, + 0xD3, 0x50, 0x5D, 0x04, 0x0F, 0xF6, 0x00, 0xC2, + 0x6F, 0x16, 0x9D, 0x25, 0x36, 0x86, 0x42, 0x56, + 0x4A, 0x55, 0x5E, 0x09, 0xC1, 0xBE, 0xE0, 0x91 +}; + +#endif /* _2FISH_TABLES_H */ diff -urN lin.2.2.17/crypto/Config.in int.2.2.17.x/crypto/Config.in --- lin.2.2.17/crypto/Config.in Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/Config.in Sat Oct 14 00:48:17 2000 @@ -0,0 +1,32 @@ +# +# Crypto Library Configuration +# +mainmenu_option next_comment +comment 'Crypto options' +tristate 'Crypto support' CONFIG_CRYPTO +dep_tristate 'Crypto ciphers' CONFIG_CIPHERS $CONFIG_CRYPTO +if [ "$CONFIG_CIPHERS" != "n" ]; then + dep_tristate 'AES cipher (EXPERIMENTAL)' CONFIG_CIPHER_AES $CONFIG_CIPHERS + if [ "$CONFIG_CIPHER_AES" != "n" ]; then + bool 'AES available under the Rijndael name' CONFIG_CIPHER_RIJNDAEL + fi + comment 'AES Finalist Ciphers (128 bit blocksize)' + dep_tristate 'Twofish cipher (EXPERIMENTAL)' CONFIG_CIPHER_TWOFISH $CONFIG_CIPHERS + dep_tristate 'MARS cipher (EXPERIMENTAL)' CONFIG_CIPHER_MARS $CONFIG_CIPHERS + dep_tristate 'RC6 cipher (EXPERIMENTAL)' CONFIG_CIPHER_RC6 $CONFIG_CIPHERS + dep_tristate 'Serpent cipher (EXPERIMENTAL)' CONFIG_CIPHER_SERPENT $CONFIG_CIPHERS + comment 'Other Ciphers submitted as AES Candidates:' + dep_tristate 'DFC cipher (EXPERIMENTAL)' CONFIG_CIPHER_DFC $CONFIG_CIPHERS + comment 'Other ciphers (64 bit blocksize)' + dep_tristate 'Blowfish cipher (EXPERIMENTAL)' CONFIG_CIPHER_BLOWFISH $CONFIG_CIPHERS + dep_tristate 'IDEA cipher (EXPERIMENTAL)' CONFIG_CIPHER_IDEA $CONFIG_CIPHERS + dep_tristate 'RC5 cipher (EXPERIMENTAL)' CONFIG_CIPHER_RC5 $CONFIG_CIPHERS + dep_tristate 'DES EDE3 cipher (3DES, EXPERIMENTAL)' CONFIG_CIPHER_DES_EDE3 $CONFIG_CIPHERS + dep_tristate 'DES cipher (DEPRECATED)' CONFIG_CIPHER_DES $CONFIG_CIPHERS +fi +dep_tristate 'Digest algorithms' CONFIG_DIGEST $CONFIG_CRYPTO +if [ "$CONFIG_DIGEST" != "n" ]; then + dep_tristate 'MD5 digest (EXPERIMENTAL)' CONFIG_DIGEST_MD5 $CONFIG_DIGEST + dep_tristate 'SHA1 digest (EXPERIMENTAL)' CONFIG_DIGEST_SHA1 $CONFIG_DIGEST +fi +endmenu diff -urN lin.2.2.17/crypto/LICENSE.crypto int.2.2.17.x/crypto/LICENSE.crypto --- lin.2.2.17/crypto/LICENSE.crypto Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/LICENSE.crypto Sat Oct 14 00:48:17 2000 @@ -0,0 +1,28 @@ + +For those files not covered by other licenses, the following license +applies + +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, dis- +tribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the fol- +lowing 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 MERCHANTABIL- +ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABIL- +ITY, 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. + +Except as contained in this notice, the name of the authors shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization from +the authors. + diff -urN lin.2.2.17/crypto/Makefile int.2.2.17.x/crypto/Makefile --- lin.2.2.17/crypto/Makefile Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/Makefile Sat Oct 14 00:48:17 2000 @@ -0,0 +1,126 @@ +# +# Makefile for the Linux kernel crypto library. +# +# Note! Dependencies are done automagically by 'make dep', which also +# removes any old dependencies. DON'T put your own dependencies here +# unless it's something special (not a .c file). +# +# Note 2! The CFLAGS definitions are now in the main makefile. + +L_TARGET := crypto.a +L_OBJS := +LX_OBJS := + +ifeq ($(CONFIG_CRYPTO),y) + LX_OBJS += cryptoapi.o +else + ifeq ($(CONFIG_CRYPTO),m) + MX_OBJS += cryptoapi.o + endif +endif + +ifeq ($(CONFIG_CIPHER_SERPENT),y) + L_OBJS += serp6f.o +else + ifeq ($(CONFIG_CIPHER_SERPENT),m) + M_OBJS += serp6f.o + endif +endif + +ifeq ($(CONFIG_CIPHER_MARS),y) + L_OBJS += mars6.o +else + ifeq ($(CONFIG_CIPHER_MARS),m) + M_OBJS += mars6.o + endif +endif + +ifeq ($(CONFIG_CIPHER_RC5),y) + L_OBJS += rc5.o +else + ifeq ($(CONFIG_CIPHER_RC5),m) + M_OBJS += rc5.o + endif +endif + +ifeq ($(CONFIG_CIPHER_RC6),y) + L_OBJS += rc62.o +else + ifeq ($(CONFIG_CIPHER_RC6),m) + M_OBJS += rc62.o + endif +endif + +ifeq ($(CONFIG_CIPHER_DFC),y) + L_OBJS += dfc2.o +else + ifeq ($(CONFIG_CIPHER_DFC),m) + M_OBJS += dfc2.o + endif +endif + +ifeq ($(CONFIG_CIPHER_AES),y) + L_OBJS += rijndael.o +else + ifeq ($(CONFIG_CIPHER_AES),m) + M_OBJS += rijndael.o + endif +endif + +ifeq ($(CONFIG_CIPHER_BLOWFISH),y) + L_OBJS += blowfish.o +else + ifeq ($(CONFIG_CIPHER_BLOWFISH),m) + M_OBJS += blowfish.o + endif +endif + +ifeq ($(CONFIG_CIPHER_TWOFISH),y) + L_OBJS += twofish.o +else + ifeq ($(CONFIG_CIPHER_TWOFISH),m) + M_OBJS += twofish.o + endif +endif + +ifeq ($(CONFIG_CIPHER_IDEA),y) + L_OBJS += idea.o +else + ifeq ($(CONFIG_CIPHER_IDEA),m) + M_OBJS += idea.o + endif +endif + +ifeq ($(CONFIG_CIPHER_DES),y) + L_OBJS += des.o +else + ifeq ($(CONFIG_CIPHER_DES),m) + M_OBJS += des.o + endif +endif + +ifeq ($(CONFIG_CIPHER_DES_EDE3),y) + L_OBJS += des_ede3.o +else + ifeq ($(CONFIG_CIPHER_DES_EDE3),m) + M_OBJS += des_ede3.o + endif +endif + +ifeq ($(CONFIG_DIGEST_MD5),y) + L_OBJS += md5glue.o +else + ifeq ($(CONFIG_DIGEST_MD5),m) + M_OBJS += md5glue.o + endif +endif + +ifeq ($(CONFIG_DIGEST_SHA1),y) + L_OBJS += sha1glue.o +else + ifeq ($(CONFIG_DIGEST_SHA1),m) + M_OBJS += sha1glue.o + endif +endif + +include $(TOPDIR)/Rules.make diff -urN lin.2.2.17/crypto/blowfish.c int.2.2.17.x/crypto/blowfish.c --- lin.2.2.17/crypto/blowfish.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/blowfish.c Mon Oct 16 13:58:41 2000 @@ -0,0 +1,514 @@ +#include +#include +#include +#include +#include + +#define Bswap(x) __le32_to_cpu(x) + +static u32 bf_pbox[16 + 2] = +{ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b, +}; + +static u32 bf_sbox[256 * 4] = +{ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6, +}; + +typedef struct blow_key +{ + u32 P[18]; + u32 S[1024]; +} +blow_key; + +/* + * Round loop unrolling macros, S is a pointer to a S-Box array + * organized in 4 unsigned longs at a row. + */ + +#define GET32_3(x) (((x) & 0xff)) +#define GET32_2(x) (((x) >> (8)) & (0xff)) +#define GET32_1(x) (((x) >> (16)) & (0xff)) +#define GET32_0(x) (((x) >> (24)) & (0xff)) + +#define bf_F(x) (((S[GET32_0(x)] + S[256 + GET32_1(x)]) ^ \ + S[512 + GET32_2(x)]) + S[768 + GET32_3(x)]) + +#define ROUND(a, b, n) b^=P[n];a ^= bf_F(b) + +/* + * The blowfish encipher, processes 64-bit blocks. + * NOTE: This function MUSTN'T respect endianess + */ + +int blowfish_encrypt(struct cipher_context *cx, + const u8 *in8, u8 *out8, int size) +{ + blow_key *key=(blow_key *)cx->keyinfo; + u32 *in_blk = (u32 *)in8; + u32 *out_blk = (u32 *)out8; + + u32 yl,yr; + + u32 *P = key->P; + u32 *S = key->S; + + for (; size >= 8; size -= 8) + { + yl = *(in_blk++); + yr = *(in_blk++); + + ROUND(yr, yl, 0); + ROUND(yl, yr, 1); + ROUND(yr, yl, 2); + ROUND(yl, yr, 3); + ROUND(yr, yl, 4); + ROUND(yl, yr, 5); + ROUND(yr, yl, 6); + ROUND(yl, yr, 7); + ROUND(yr, yl, 8); + ROUND(yl, yr, 9); + ROUND(yr, yl, 10); + ROUND(yl, yr, 11); + ROUND(yr, yl, 12); + ROUND(yl, yr, 13); + ROUND(yr, yl, 14); + ROUND(yl, yr, 15); + + /* yl and yr are switched */ + yl ^= P[16]; + yr ^= P[17]; + + *(out_blk++) = yr; + *(out_blk++) = yl; + } + return 0; +} + +int blowfish_decrypt(struct cipher_context *cx, + const u8 *in8, u8 *out8, int size) +{ + blow_key *key=(blow_key *)cx->keyinfo; + u32 *in_blk = (u32 *)in8; + u32 *out_blk = (u32 *)out8; + + u32 yl,yr; + + u32 *P = key->P; + u32 *S = key->S; + + for (; size >= 8; size -= 8) + { + yl = *(in_blk++); + yr = *(in_blk++); + + ROUND(yr, yl, 17); + ROUND(yl, yr, 16); + ROUND(yr, yl, 15); + ROUND(yl, yr, 14); + ROUND(yr, yl, 13); + ROUND(yl, yr, 12); + ROUND(yr, yl, 11); + ROUND(yl, yr, 10); + ROUND(yr, yl, 9); + ROUND(yl, yr, 8); + ROUND(yr, yl, 7); + ROUND(yl, yr, 6); + ROUND(yr, yl, 5); + ROUND(yl, yr, 4); + ROUND(yr, yl, 3); + ROUND(yl, yr, 2); + + /* yl and yr are switched */ + yl ^= P[1]; + yr ^= P[0]; + + *(out_blk++) = yr; + *(out_blk++) = yl; + } + return 0; +} + +/* Sets the blowfish S and P boxes for encryption and decryption. */ + +int blowfish_set_key(struct cipher_context *cx, + unsigned char *key, int keybytes) +{ + blow_key *key2=(blow_key *)cx->keyinfo; + short i; + short j; + short count; + u32 data[2]; + u32 temp; + u32 *P = key2->P; + u32 *S = key2->S; + + /* Copy the initialization s-boxes */ + + for (i = 0, count = 0; i < 256; i++) + for (j = 0; j < 4; j++, count++) + S[count] = bf_sbox[count]; + + /* Set the p-boxes */ + + for (i = 0; i < 16 + 2; i++) + P[i] = bf_pbox[i]; + + /* Actual subkey generation */ + + for (j = 0, i = 0; i < 16 + 2; i++) + { + temp = (((u32) key[j] << 24) | + ((u32) key[(j + 1) % keybytes] << 16) | + ((u32) key[(j + 2) % keybytes] << 8) | + ((u32) key[(j + 3) % keybytes] )); + + P[i] = P[i] ^ temp; + j = (j + 4) % keybytes; + } + + data[0] = 0x00000000; + data[1] = 0x00000000; + + for (i = 0; i < 16 + 2; i += 2) + { + blowfish_encrypt(cx, (u8 *)data, (u8 *)data, 8); + + P[i] = data[0]; + P[i + 1] = data[1]; + } + + for (i = 0; i < 4; i++) + { + for (j = 0, count = i * 256; j < 256; j += 2, count += 2) + { + blowfish_encrypt(cx, (u8 *)data, (u8 *)data, 8); + + S[count] = data[0]; + S[count + 1] = data[1]; + } + } + return 0; +} + +static void blowfish_lock(void) +{ + MOD_INC_USE_COUNT; +} + +static void blowfish_unlock(void) +{ + MOD_DEC_USE_COUNT; +} + +#define CIPHER_BITS_64 +#define CIPHER_NAME(x) blowfish##x +#include "gen-cbc.h" +#include "gen-ecb.h" + +static struct cipher_implementation blowfish = { + {{NULL,NULL},CIPHER_BLOWFISH, "blowfish"}, + blocksize: 8, + ivsize: 0, + key_schedule_size: BLOWFISH_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(blowfish_ecb), + INIT_CIPHER_OPS(blowfish) +}; + +static struct cipher_implementation blowfish_cbc = { + {{NULL,NULL},CIPHER_BLOWFISH | CIPHER_CBC, "blowfish-cbc"}, + blocksize: 8, + ivsize: 8, + key_schedule_size: BLOWFISH_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(blowfish_cbc), + INIT_CIPHER_OPS(blowfish) +}; + +#ifdef MODULE +int __init init_module(void) +#else +int __init init_blowfish(void) +#endif +{ + if (register_cipher(&blowfish)) + printk(KERN_WARNING "Couldn't register blowfish encryption\n"); + if (register_cipher(&blowfish_cbc)) + printk(KERN_WARNING "Couldn't register blowfish-cbc encryption\n"); + + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ + if (unregister_cipher(&blowfish)) + printk(KERN_WARNING "Couldn't unregister blowfish encryption\n"); + if (unregister_cipher(&blowfish_cbc)) + printk(KERN_WARNING "Couldn't unregister blowfish-cbc encryption\n"); +} +#endif diff -urN lin.2.2.17/crypto/cast0.c int.2.2.17.x/crypto/cast0.c --- lin.2.2.17/crypto/cast0.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/cast0.c Sat Oct 14 03:28:35 2000 @@ -0,0 +1,434 @@ +/* NOTE: This implementation has been changed from the original + source. See ChangeLog for more information. + Maintained by Alexander Kjeldaas + */ + +/* This is an independent implementation of the CAST-256 encryption */ +/* algorithm designed by Carlisle Adams of Entrust and offered as a */ +/* candidate algorithm for the US NIST Advanced Encryption Standard */ +/* (AES) effort. */ +/* */ +/* Copyright in this implementation is held by Dr B R Gladman but */ +/* I hereby give permission for its free direct or derivative use */ +/* subject to acknowledgment of its origin and compliance with any */ +/* conditions that the originators of CAST-256 place on its use. */ +/* */ +/* Dr Brian Gladman (gladman@seven77.demon.co.uk) 19th October 1998 */ +/* */ +/* Timing data: + +Algorithm: cast256 (cast0.c) +128 bit key: +Key Setup: 4279 cycles +Encrypt: 659 cycles = 38.9 mbits/sec +Decrypt: 667 cycles = 38.4 mbits/sec +Mean: 663 cycles = 38.6 mbits/sec +192 bit key: +Key Setup: 4337 cycles +Encrypt: 663 cycles = 38.6 mbits/sec +Decrypt: 672 cycles = 38.1 mbits/sec +Mean: 668 cycles = 38.4 mbits/sec +256 bit key: +Key Setup: 4304 cycles +Encrypt: 655 cycles = 39.1 mbits/sec +Decrypt: 663 cycles = 38.6 mbits/sec +Mean: 659 cycles = 38.8 mbits/sec + +*/ + +#include +#include +#include +#include +#include + +#if 0 +#define rotl rotl32 +#define rotr rotr32 +#else +#define rotl generic_rotl32 +#define rotr generic_rotr32 +#endif + +u4byte s_box[4][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 + }, + { + 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 + }, + { + 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 + }, + { + 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 + } +}; + +#define f1(y,x,kr,km) \ + t = rotl(km + x, kr); \ + u = s_box[0][byte(t,3)]; \ + u ^= s_box[1][byte(t,2)]; \ + u -= s_box[2][byte(t,1)]; \ + u += s_box[3][byte(t,0)]; \ + y ^= u + +#define f2(y,x,kr,km) \ + t = rotl(km ^ x, kr); \ + u = s_box[0][byte(t,3)]; \ + u -= s_box[1][byte(t,2)]; \ + u += s_box[2][byte(t,1)]; \ + u ^= s_box[3][byte(t,0)]; \ + y ^= u + +#define f3(y,x,kr,km) \ + t = rotl(km - x, kr); \ + u = s_box[0][byte(t,3)]; \ + u += s_box[1][byte(t,2)]; \ + u ^= s_box[2][byte(t,1)]; \ + u -= s_box[3][byte(t,0)]; \ + y ^= u + +#define f_rnd(x,n) \ + f1(x[2],x[3],l_key[n], l_key[n + 4]); \ + f2(x[1],x[2],l_key[n + 1],l_key[n + 5]); \ + f3(x[0],x[1],l_key[n + 2],l_key[n + 6]); \ + f1(x[3],x[0],l_key[n + 3],l_key[n + 7]) + +#define i_rnd(x, n) \ + f1(x[3],x[0],l_key[n + 3],l_key[n + 7]); \ + f3(x[0],x[1],l_key[n + 2],l_key[n + 6]); \ + f2(x[1],x[2],l_key[n + 1],l_key[n + 5]); \ + f1(x[2],x[3],l_key[n], l_key[n + 4]) + +#define k_rnd(k,tr,tm) \ + f1(k[6],k[7],tr[0],tm[0]); \ + f2(k[5],k[6],tr[1],tm[1]); \ + f3(k[4],k[5],tr[2],tm[2]); \ + f1(k[3],k[4],tr[3],tm[3]); \ + f2(k[2],k[3],tr[4],tm[4]); \ + f3(k[1],k[2],tr[5],tm[5]); \ + f1(k[0],k[1],tr[6],tm[6]); \ + f2(k[7],k[0],tr[7],tm[7]) + +/* initialise the key schedule from the user supplied key */ + +int cast256_set_key(struct cipher_context *cx, unsigned char *key, int key_len) +{ u4byte *key_blk = (u4byte *)key; + /* l_key - storage for the key schedule */ + u4byte *l_key = cx->keyinfo; + u4byte i, j, t, u, cm, cr, lk[8], tm[8], tr[8]; + key_len *= 8; + + for(i = 0; i < key_len / 32; ++i) + + lk[i] = bswap(in_key[i]); + + for(; i < 8; ++i) + + lk[i] = 0; + + cm = 0x5a827999; cr = 19; + + for(i = 0; i < 96; i += 8) + { + for(j = 0; j < 8; ++j) + { + tm[j] = cm; cm += 0x6ed9eba1; + tr[j] = cr; cr += 17; + } + + k_rnd(lk, tr, tm); + + for(j = 0; j < 8; ++j) + { + tm[j] = cm; cm += 0x6ed9eba1; + tr[j] = cr; cr += 17; + } + + k_rnd(lk, tr, tm); + + l_key[i + 0] = lk[0]; l_key[i + 1] = lk[2]; + l_key[i + 2] = lk[4]; l_key[i + 3] = lk[6]; + l_key[i + 4] = lk[7]; l_key[i + 5] = lk[5]; + l_key[i + 6] = lk[3]; l_key[i + 7] = lk[1]; + } + + return 0; +}; + +/* encrypt a block of text */ + +int cast256_encrypt(struct cipher_context *cx, const u8 *in, u8 *out, int size) +{ u4byte *l_key = cx->keyinfo; + u4byte *in_blk = (u4byte *)in; + u4byte *out_blk = (u4byte *)out; + u4byte t, u, blk[4]; + + blk[0] = bswap(in_blk[0]); blk[1] = bswap(in_blk[1]); + blk[2] = bswap(in_blk[2]); blk[3] = bswap(in_blk[3]); + + f_rnd(blk, 0); f_rnd(blk, 8); + f_rnd(blk, 16); f_rnd(blk, 24); + f_rnd(blk, 32); f_rnd(blk, 40); + i_rnd(blk, 48); i_rnd(blk, 56); + i_rnd(blk, 64); i_rnd(blk, 72); + i_rnd(blk, 80); i_rnd(blk, 88); + + out_blk[0] = bswap(blk[0]); out_blk[1] = bswap(blk[1]); + out_blk[2] = bswap(blk[2]); out_blk[3] = bswap(blk[3]); + return 0; +}; + +/* decrypt a block of text */ + +int cast256_decrypt(struct cipher_context *cx, const u8 *in, u8 *out, int size) +{ u4byte *l_key = cx->keyinfo; + u4byte *in_blk = (u4byte *)in; + u4byte *out_blk = (u4byte *)out; + u4byte t, u, blk[4]; + + blk[0] = bswap(in_blk[0]); blk[1] = bswap(in_blk[1]); + blk[2] = bswap(in_blk[2]); blk[3] = bswap(in_blk[3]); + + f_rnd(blk, 88); f_rnd(blk, 80); + f_rnd(blk, 72); f_rnd(blk, 64); + f_rnd(blk, 56); f_rnd(blk, 48); + i_rnd(blk, 40); i_rnd(blk, 32); + i_rnd(blk, 24); i_rnd(blk, 16); + i_rnd(blk, 8); i_rnd(blk, 0); + + out_blk[0] = bswap(blk[0]); out_blk[1] = bswap(blk[1]); + out_blk[2] = bswap(blk[2]); out_blk[3] = bswap(blk[3]); + return 0; +}; + +static void cast256_lock() +{ + MOD_INC_USE_COUNT; +} + +static void cast256_unlock() +{ + MOD_DEC_USE_COUNT; +} + +#define CIPHER_BITS_128 +#define CIPHER_NAME(x) cast256##x +#include "gen-cbc.h" +#include "gen-ecb.h" + +static struct cipher_implementation cast256 = { + {{NULL,NULL},CIPHER_CAST256, "cast256"}, + blocksize: 8, + ivsize: 0, + key_schedule_size: CAST256_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(cast256_ecb), + INIT_CIPHER_OPS(cast256) +}; + +static struct cipher_implementation cast256_cbc = { + {{NULL,NULL},CIPHER_CAST256 | CIPHER_CBC, "cast256-cbc"}, + blocksize: 8, + ivsize: 8, + key_schedule_size: CAST256_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(cast256_cbc), + INIT_CIPHER_OPS(cast256) +}; + + +#ifdef MODULE +int __init init_module(void) +#else +int __init init_cast256(void) +#endif +{ + if (register_cipher(&cast256)) + printk(KERN_WARNING "Couldn't register cast256 encryption\n"); + if (register_cipher(&cast256_cbc)) + printk(KERN_WARNING "Couldn't register cast256-cbc encryption\n"); + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ + if (unregister_cipher(&cast256)) + printk(KERN_WARNING "Couldn't unregister cast256 encryption\n"); + if (unregister_cipher(&cast256_cbc)) + printk(KERN_WARNING "Couldn't unregister cast256-cbc encryption\n"); +} +#endif + diff -urN lin.2.2.17/crypto/cryptoapi.c int.2.2.17.x/crypto/cryptoapi.c --- lin.2.2.17/crypto/cryptoapi.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/cryptoapi.c Mon Oct 16 17:28:18 2000 @@ -0,0 +1,389 @@ +/* + * crypto/cryptoapi.c + * + * Written by Alexander Kjeldaas 1998-11-15 + * + * 2000-10-15 Harald Welte + * - ported to Linux 2.4 + * + * This module is still using old 2.2 module_init/exit semantics for + * backwards compatibility - HW + * + * Copyright 1998 by Alexander Kjeldaas. Redistribution of this file + * is permitted under the GNU Public License. + */ + +#include + +#ifdef CONFIG_KMOD +#include +#endif + +#include +#include +#include +#include +#include + + +static struct proc_dir_entry *proc_crypto; + +#ifdef CONFIG_PROC_FS +static int cipher_read_proc(char *page, char **start, off_t off, + int count, int *eof, void *data); +static int digest_read_proc(char *page, char **start, off_t off, + int count, int *eof, void *data); +#endif + +LIST_HEAD(ciphers); +LIST_HEAD(digests); + +static struct transform_group transforms[MAX_TRANSFORM] = { + /* digest */ + { TRANSFORM_DIGEST, "digest", SPIN_LOCK_UNLOCKED, &digests, +#ifdef CONFIG_PROC_FS + NULL, &digest_read_proc +#endif + }, + /* cipher */ + { TRANSFORM_CIPHER, "cipher", SPIN_LOCK_UNLOCKED, &ciphers, +#ifdef CONFIG_PROC_FS + NULL, &cipher_read_proc +#endif + } +}; + +#ifdef CONFIG_PROC_FS +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) +/* We have to emulate the 2.4 function proc_mkdir, because it is not + * present in 2.2 - HW */ +static struct proc_dir_entry *proc_mkdir(const char *name, + struct proc_dir_entry *parent) +{ + struct proc_dir_entry *ent = NULL; + const char *fn = name; + int len; + + if (!parent) + parent = &proc_root; + len = strlen(fn); + + ent = kmalloc(sizeof(struct proc_dir_entry) + len + 1, GFP_KERNEL); + if (!ent) + goto out; + memset(ent, 0, sizeof(struct proc_dir_entry)); + memcpy(((char *) ent) + sizeof(*ent), fn, len + 1); + ent->name = ((char *) ent) + sizeof(*ent); + ent->namelen = len; + ent->ops = NULL; + ent->nlink = 2; + ent->mode = S_IFDIR | S_IRUGO | S_IXUGO; + + proc_register(parent, ent); + +out: + return ent; +} + +static struct proc_dir_entry *create_proc_read_entry(const char *name, + mode_t mode, struct proc_dir_entry *base, + read_proc_t *read_proc, void * data) +{ + struct proc_dir_entry *res=create_proc_entry(name,mode,base); + if (res) { + res->read_proc=read_proc; + res->data=data; + } + return res; +} + +#endif +#endif + +/** + * find_transform_by_id - Find transform implementation + * @id: The identifier for the transform. + * @tgroup: The identifier for the transform group the transform belongs to. + * + * Returns a ptr to the transform on success, NULL on failure. + * Valid tgroup values are: + * + * %TRANSFORM_CIPHER - When looking for ciphers + * + * %TRANSFORM_DIGEST - When looking for digests + * + * You might want to use the wrapper-functions find_cipher_by_id(int + * id), and find_digest_by_id(int id) instead of this one. + */ +struct transform_implementation * +find_transform_by_id(int id, int tgroup) +{ + struct list_head *tmp; + struct transform_group *tg; +#ifdef CONFIG_KMOD + int mod_try = 0; +retry: +#endif + if (tgroup >= MAX_TRANSFORM) + return NULL; + tg = &transforms[tgroup]; + read_lock(&tg->tg_lock); + for (tmp = tg->tg_head->next; tmp != tg->tg_head; tmp = tmp->next) { + struct transform_implementation *t; + t = list_entry(tmp, struct transform_implementation, t_list); + if (t->t_id == id) { + read_unlock(&tg->tg_lock); + return t; + } + } + read_unlock(&tg->tg_lock); +#ifdef CONFIG_KMOD + if (!mod_try) { + char module_name[50]; + mod_try = 1; + sprintf(module_name, "%s-%d", tg->tg_name, id & (~CIPHER_CBC)); + request_module(module_name); + goto retry; + } +#endif + return NULL; +} + + +/** + * find_transform_by_name - Find transform implementation + * @name: The name of the transform. + * @tgroup: The identifier for the transform group the transform belongs to. + * + * Returns a ptr to the transform on success, NULL on failure. + * Valid tgroup values are: + * + * %TRANSFORM_CIPHER - When looking for ciphers + * + * %TRANSFORM_DIGEST - When looking for digests + * + * You might want to use the wrapper-functions + * find_cipher_by_name(const char *name), and + * find_digest_by_name(const char *name) instead of this one. + */ +struct transform_implementation * +find_transform_by_name(const char *name, int tgroup) +{ + struct list_head *tmp; + struct transform_group *tg; + + if (tgroup >= MAX_TRANSFORM) + return NULL; + tg = &transforms[tgroup]; + + read_lock(&tg->tg_lock); + for (tmp = tg->tg_head->next; tmp != tg->tg_head; tmp = tmp->next) { + struct transform_implementation *t; + t = list_entry(tmp, struct transform_implementation, t_list); + if (strcmp(t->t_name, name) == 0) { + read_unlock(&tg->tg_lock); + return t; + } + } + read_unlock(&tg->tg_lock); + return NULL; +} + +/** + * register_transform - Register new transform. + * @ti: Initialized transform implementation struct. + * @tgroup: The identifier for the transform group the transform should belong to. + * + * Adds a transform from the crypto API. ti->t_group is set to point + * to the correct transform group according to tgroup, the transform + * is added to the group's transform-list, and a /proc files are + * created if CONFIG_PROC_FS=y Returns 0 on success. Valid tgroup + * values are: + * + * %TRANSFORM_CIPHER - When adding ciphers + * + * %TRANSFORM_DIGEST - When adding digests + * + */ +int register_transform(struct transform_implementation *ti, int tgroup) +{ + int err = 0; + struct transform_group *tg; + + if (tgroup >= MAX_TRANSFORM) { + return -1; + } + INIT_LIST_HEAD(&ti->t_list); + tg = ti->t_group = &transforms[tgroup]; + write_lock(&ti->t_group->tg_lock); + list_add(&ti->t_list, ti->t_group->tg_head); + write_unlock(&ti->t_group->tg_lock); + if (!err) { + MOD_INC_USE_COUNT; + printk(KERN_INFO "cryptoapi: Registered %s (%d)\n", + ti->t_name, ti->t_id); + ti->t_proc = create_proc_read_entry(ti->t_name, + S_IFREG|S_IRUGO, + tg->tg_proc_parent_dir, + tg->read_proc, (void *)ti); + } + return err; +} + +/** + * unregister_transform - Unregister new transform. + * @ti: Initialized transform implementation struct. + * + * Removes a transform from the crypto API. Returns 0 on success, + * non-zero on failure to remove /proc entry. + * + */ +int unregister_transform(struct transform_implementation *ti) +{ + int ret = 0; + + if (!list_empty(&ti->t_list)) { + write_lock(&ti->t_group->tg_lock); + list_del(&ti->t_list); + write_unlock(&ti->t_group->tg_lock); + ret = 0; + } + +#ifdef CONFIG_PROC_FS + if (ti->t_proc) { + ti->t_proc = NULL; + remove_proc_entry(ti->t_name, ti->t_group->tg_proc_parent_dir); + } +#endif + + if (!ret) + MOD_DEC_USE_COUNT; + + return ret; +} + +#ifdef CONFIG_PROC_FS +static int cipher_read_proc(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + struct cipher_implementation *ci; + int len = 0; + + ci = (struct cipher_implementation *)data; + + len = sprintf(page, "cipher_id: %d\n" + "cipher_name: %s\n" + "blocksize: %d\n" + "keysize_mask: 0x%08x\n" + "ivsize: %d\n" + "key_schedule_size: %d\n", + ci->trans.t_id, ci->trans.t_name, + ci->blocksize, ci->key_size_mask, + ci->ivsize, ci->key_schedule_size); + *eof=1; + + return len; +} + +static int digest_read_proc(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + struct digest_implementation *ci; + int len = 0; + + ci = (struct digest_implementation *)data; + + len = sprintf(page, "digest_id: %d\n" + "digest_name: %s\n" + "blocksize: %d\n" + "working_size: %d\n", + ci->trans.t_id, ci->trans.t_name, + ci->blocksize, ci->working_size); + *eof=1; + + return len; +} +#endif + + +#ifdef MODULE +int __init init_module(void) +#else +int __init cryptoapi_init(void) +#endif +{ + int i; + +#ifdef CONFIG_PROC_FS + proc_crypto = proc_mkdir("crypto", NULL); + + for (i = 0; i + */ + +/* This is an independent implementation of the CRYPTON algorithm */ +/* designed by Chae Hoon Lim of Future Systms Inc and submitted as */ +/* a candidate for the NIST AES activity. */ +/* */ +/* Copyright in this implementation is held by Dr B R Gladman but */ +/* I hereby give permission for its free direct or derivative use */ +/* subject to acknowledgment of its origin and compliance with any */ +/* conditions that the algorithm originators place on its use. */ +/* */ +/* Dr Brian Gladman (gladman@seven77.demon.co.uk) October 1998 */ +/* Timing data: + +Algorithm: crypton (crypton2.c) +128 bit key: +Key Setup: 1386 cycles +Encrypt: 472 cycles = 54.2 mbits/sec +Decrypt: 486 cycles = 52.7 mbits/sec +Mean: 479 cycles = 53.5 mbits/sec +192 bit key: +Key Setup: 1408 cycles +Encrypt: 476 cycles = 53.8 mbits/sec +Decrypt: 493 cycles = 52.0 mbits/sec +Mean: 484 cycles = 52.8 mbits/sec +256 bit key: +Key Setup: 1412 cycles +Encrypt: 468 cycles = 54.7 mbits/sec +Decrypt: 479 cycles = 53.4 mbits/sec +Mean: 474 cycles = 54.1 mbits/sec + +*/ + +#include +#include +#include +#include +#include + +#if 0 +#define rotl rotl32 +#define rotr rotr32 +#else +#define rotl generic_rotl32 +#define rotr generic_rotr32 +#endif + +#define gamma(x,p,q) \ + (x) = (((u4byte)s_box[p][byte((x),0)] ) | \ + ((u4byte)s_box[q][byte((x),1)] << 8) | \ + ((u4byte)s_box[p][byte((x),2)] << 16) | \ + ((u4byte)s_box[q][byte((x),3)] << 24)) + +#define gamma_tau(x,b,m,p,q) \ + (x) = (((u4byte)s_box[p][byte(b[0],m)] ) | \ + ((u4byte)s_box[q][byte(b[1],m)] << 8) | \ + ((u4byte)s_box[p][byte(b[2],m)] << 16) | \ + ((u4byte)s_box[q][byte(b[3],m)] << 24)) + +#define ma_0 0x3fcff3fc +#define ma_1 0xfc3fcff3 +#define ma_2 0xf3fc3fcf +#define ma_3 0xcff3fc3f + +#define mb_0 0xcffccffc +#define mb_1 0xf33ff33f +#define mb_2 0xfccffccf +#define mb_3 0x3ff33ff3 + +#define pi(b,n0,n1,n2,n3) \ + (((b)[0] & ma_##n0) ^ \ + ((b)[1] & ma_##n1) ^ \ + ((b)[2] & ma_##n2) ^ \ + ((b)[3] & ma_##n3)) + +#define phi_n(x,n0,n1,n2,n3) \ + ( (x) & mb_##n0) ^ \ + (rotl((x), 8) & mb_##n1) ^ \ + (rotl((x), 16) & mb_##n2) ^ \ + (rotl((x), 24) & mb_##n3) + +#define phi_00(x) phi_n(x,0,1,2,3) +#define phi_01(x) phi_n(x,3,0,1,2) +#define phi_02(x) phi_n(x,2,3,0,1) +#define phi_03(x) phi_n(x,1,2,3,0) + +#define phi_10(x) phi_n(x,3,0,1,2) +#define phi_11(x) phi_n(x,2,3,0,1) +#define phi_12(x) phi_n(x,1,2,3,0) +#define phi_13(x) phi_n(x,0,1,2,3) + +#define phi0(x,y) \ + (y)[0] = phi_00((x)[0]); \ + (y)[1] = phi_01((x)[1]); \ + (y)[2] = phi_02((x)[2]); \ + (y)[3] = phi_03((x)[3]) + +#define phi1(x,y) \ + (y)[0] = phi_10((x)[0]); \ + (y)[1] = phi_11((x)[1]); \ + (y)[2] = phi_12((x)[2]); \ + (y)[3] = phi_13((x)[3]) + +u1byte p_box[3][16] = +{ { 15, 9, 6, 8, 9, 9, 4, 12, 6, 2, 6, 10, 1, 3, 5, 15 }, + { 10, 15, 4, 7, 5, 2, 14, 6, 9, 3, 12, 8, 13, 1, 11, 0 }, + { 0, 4, 8, 4, 2, 15, 8, 13, 1, 1, 15, 7, 2, 11, 14, 15 } +}; + +u4byte tab_gen = 0; +u1byte s_box[2][256]; +u4byte s_tab[4][256]; + +u4byte l_key[104]; +u4byte *e_key = l_key + 52; +u4byte *d_key = l_key; + +void gen_tab(void) +{ u4byte i, xl, xr, yl, yr; + + for(i = 0; i < 256; ++i) + { + xl = (i & 0xf0) >> 4; xr = i & 15; + + yr = xr ^ p_box[1][xl ^ p_box[0][xr]]; + yl = xl ^ p_box[0][xr] ^ p_box[2][yr]; + + yr |= (yl << 4); s_box[0][i] = yr; s_box[1][yr] = i; + + xr = yr * 0x01010101; xl = i * 0x01010101; + + s_tab[0][ i] = xr & 0x3fcff3fc; + s_tab[1][yr] = xl & 0xfc3fcff3; + s_tab[2][ i] = xr & 0xf3fc3fcf; + s_tab[3][yr] = xl & 0xcff3fc3f; + } +}; + +/* initialise the key schedule from the user supplied key */ + +u4byte kp[4] = { 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f }; +u4byte kq[4] = { 0x9b05688c, 0x1f83d9ab, 0x5be0cd19, 0xcbbb9d5d }; + +#define h0_block(n,r0,r1) \ + e_key[4 * n + 8] = rotl(e_key[4 * n + 0], r0); \ + e_key[4 * n + 9] = rc ^ e_key[4 * n + 1]; \ + e_key[4 * n + 10] = rotl(e_key[4 * n + 2], r1); \ + e_key[4 * n + 11] = rc ^ e_key[4 * n + 3] + +#define h1_block(n,r0,r1) \ + e_key[4 * n + 8] = rc ^ e_key[4 * n + 0]; \ + e_key[4 * n + 9] = rotl(e_key[4 * n + 1], r0); \ + e_key[4 * n + 10] = rc ^ e_key[4 * n + 2]; \ + e_key[4 * n + 11] = rotl(e_key[4 * n + 3], r1) + +int crypton_set_key(struct cipher_context *cx, unsigned char *key, int key_len) +{ u4byte *key_blk = (u4byte *)key; + /* l_key - storage for the key schedule */ + u4byte *l_key = cx->keyinfo; + u4byte i, rc, t0, t1, tmp[4]; + key_len *= 8; + + if(!tab_gen) + { + gen_tab(); tab_gen = 1; + } + + e_key[2] = e_key[3] = e_key[6] = e_key[7] = 0; + + switch((key_len + 63) / 64) + { + case 4: e_key[3] = in_key[6]; e_key[7] = in_key[7]; + case 3: e_key[2] = in_key[4]; e_key[6] = in_key[5]; + case 2: e_key[0] = in_key[0]; e_key[4] = in_key[1]; + e_key[1] = in_key[2]; e_key[5] = in_key[3]; + } + + tmp[0] = pi(e_key, 0, 1, 2, 3) ^ kp[0]; + tmp[1] = pi(e_key, 1, 2, 3, 0) ^ kp[1]; + tmp[2] = pi(e_key, 2, 3, 0, 1) ^ kp[2]; + tmp[3] = pi(e_key, 3, 0, 1, 2) ^ kp[3]; + + gamma_tau(e_key[0], tmp, 0, 0, 1); + gamma_tau(e_key[1], tmp, 1, 1, 0); + gamma_tau(e_key[2], tmp, 2, 0, 1); + gamma_tau(e_key[3], tmp, 3, 1, 0); + + tmp[0] = pi(e_key + 4, 1, 2, 3, 0) ^ kq[0]; + tmp[1] = pi(e_key + 4, 2, 3, 0, 1) ^ kq[1]; + tmp[2] = pi(e_key + 4, 3, 0, 1, 2) ^ kq[2]; + tmp[3] = pi(e_key + 4, 0, 1, 2, 3) ^ kq[3]; + + gamma_tau(e_key[4], tmp, 0, 1, 0); + gamma_tau(e_key[5], tmp, 1, 0, 1); + gamma_tau(e_key[6], tmp, 2, 1, 0); + gamma_tau(e_key[7], tmp, 3, 0, 1); + + t0 = e_key[0] ^ e_key[1] ^ e_key[2] ^ e_key[3]; + t1 = e_key[4] ^ e_key[5] ^ e_key[6] ^ e_key[7]; + + e_key[0] ^= t1; e_key[1] ^= t1; + e_key[2] ^= t1; e_key[3] ^= t1; + e_key[4] ^= t0; e_key[5] ^= t0; + e_key[6] ^= t0; e_key[7] ^= t0; + + rc = 0x01010101; + h0_block( 0, 8, 16); h1_block(1, 16, 24); rc <<= 1; + h1_block( 2, 24, 8); h0_block(3, 8, 16); rc <<= 1; + h0_block( 4, 16, 24); h1_block(5, 24, 8); rc <<= 1; + h1_block( 6, 8, 16); h0_block(7, 16, 24); rc <<= 1; + h0_block( 8, 24, 8); h1_block(9, 8, 16); rc <<= 1; + h1_block(10, 16, 24); + + for(i = 0; i < 13; ++i) + { + if(i & 1) + { + phi0(e_key + 4 * i, d_key + 48 - 4 * i); + } + else + { + phi1(e_key + 4 * i, d_key + 48 - 4 * i); + } + } + + phi1(e_key + 48, e_key + 48); + phi1(d_key + 48, d_key + 48); + + return 0; +}; + +/* encrypt a block of text */ + +#define fr0(i,k) \ + b1[i] = s_tab[ (i) ][byte(b0[0],i)] ^ \ + s_tab[((i) + 1) & 3][byte(b0[1],i)] ^ \ + s_tab[((i) + 2) & 3][byte(b0[2],i)] ^ \ + s_tab[((i) + 3) & 3][byte(b0[3],i)] ^ (k) + +#define fr1(i,k) \ + b0[i] = s_tab[((i) + 1) & 3][byte(b1[0],i)] ^ \ + s_tab[((i) + 2) & 3][byte(b1[1],i)] ^ \ + s_tab[((i) + 3) & 3][byte(b1[2],i)] ^ \ + s_tab[(i) ][byte(b1[3],i)] ^ (k) + +#define f0_rnd(kp) \ + fr0(0,(kp)[0]); fr0(1,(kp)[1]); \ + fr0(2,(kp)[2]); fr0(3,(kp)[3]) + +#define f1_rnd(kp) \ + fr1(0,(kp)[0]); fr1(1,(kp)[1]); \ + fr1(2,(kp)[2]); fr1(3,(kp)[3]) + +int crypton_encrypt(struct cipher_context *cx, u4byte *in_blk, u4byte *out_blk) +{ u4byte *l_key = cx->keyinfo; + u4byte b0[4], b1[4]; + + b0[0] = in_blk[0] ^ e_key[0]; + b0[1] = in_blk[1] ^ e_key[1]; + b0[2] = in_blk[2] ^ e_key[2]; + b0[3] = in_blk[3] ^ e_key[3]; + + f0_rnd(e_key + 4); f1_rnd(e_key + 8); + f0_rnd(e_key + 12); f1_rnd(e_key + 16); + f0_rnd(e_key + 20); f1_rnd(e_key + 24); + f0_rnd(e_key + 28); f1_rnd(e_key + 32); + f0_rnd(e_key + 36); f1_rnd(e_key + 40); + f0_rnd(e_key + 44); + + gamma_tau(b0[0], b1, 0, 1, 0); + gamma_tau(b0[1], b1, 1, 0, 1); + gamma_tau(b0[2], b1, 2, 1, 0); + gamma_tau(b0[3], b1, 3, 0, 1); + + out_blk[0] = b0[0] ^ e_key[48]; + out_blk[1] = b0[1] ^ e_key[49]; + out_blk[2] = b0[2] ^ e_key[50]; + out_blk[3] = b0[3] ^ e_key[51]; + return 0; +}; + +/* decrypt a block of text */ + +int crypton_decrypt(struct cipher_context *cx, u32 *in_blk, u32 *out_blk) +{ u4byte *l_key = cx->keyinfo; + u4byte b0[4], b1[4]; + + b0[0] = in_blk[0] ^ d_key[0]; + b0[1] = in_blk[1] ^ d_key[1]; + b0[2] = in_blk[2] ^ d_key[2]; + b0[3] = in_blk[3] ^ d_key[3]; + + f0_rnd(d_key + 4); f1_rnd(d_key + 8); + f0_rnd(d_key + 12); f1_rnd(d_key + 16); + f0_rnd(d_key + 20); f1_rnd(d_key + 24); + f0_rnd(d_key + 28); f1_rnd(d_key + 32); + f0_rnd(d_key + 36); f1_rnd(d_key + 40); + f0_rnd(d_key + 44); + + gamma_tau(b0[0], b1, 0, 1, 0); + gamma_tau(b0[1], b1, 1, 0, 1); + gamma_tau(b0[2], b1, 2, 1, 0); + gamma_tau(b0[3], b1, 3, 0, 1); + + out_blk[0] = b0[0] ^ d_key[48]; + out_blk[1] = b0[1] ^ d_key[49]; + out_blk[2] = b0[2] ^ d_key[50]; + out_blk[3] = b0[3] ^ d_key[51]; + return 0; +}; + +static void crypton_lock() +{ + MOD_INC_USE_COUNT; +} + +static void crypton_unlock() +{ + MOD_DEC_USE_COUNT; +} + +static struct cipher_implementation crypton = +{ + DNODE_NULL, + CIPHER_CRYPTON, + "crypton", + 16, + CRYPTON_KEY_SCHEDULE_SIZE, + ATOMIC_INIT(0), + crypton_encrypt, + crypton_decrypt, + crypton_set_key, + crypton_lock, + crypton_unlock +}; + + +#ifdef MODULE + int __init init_module(void) +#else + int __init init_crypton(void) +#endif +{ + if (register_cipher(&crypton)) + printk(KERN_WARNING "Couldn't register crypton encryption\n"); + + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ + if (unregister_cipher(&crypton)) + printk(KERN_WARNING "Couldn't unregister crypton encryption\n"); + /*if (unregister_cipher(&cbc_crypton)) + printk(KERN_WARNING "Couldn't unregister crypton-cbc encryption\n");*/ +} +#endif + diff -urN lin.2.2.17/crypto/des.c int.2.2.17.x/crypto/des.c --- lin.2.2.17/crypto/des.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/des.c Sat Oct 14 01:05:06 2000 @@ -0,0 +1,1239 @@ +/* + * Sourcecode created by descore. Descore is under GPL and from + * Dana L. How . + * + * Modified by Raimar Falke for the Linux-Kernel. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * as published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include + +#define ROR(d,c,o) d = d >> c | d << o + +typedef u8 DesData[8]; +typedef u32 DesKeys[32]; + +u32 des_keymap[] = { + 0x02080008, 0x02082000, 0x00002008, 0x00000000, + 0x02002000, 0x00080008, 0x02080000, 0x02082008, + 0x00000008, 0x02000000, 0x00082000, 0x00002008, + 0x00082008, 0x02002008, 0x02000008, 0x02080000, + 0x00002000, 0x00082008, 0x00080008, 0x02002000, + 0x02082008, 0x02000008, 0x00000000, 0x00082000, + 0x02000000, 0x00080000, 0x02002008, 0x02080008, + 0x00080000, 0x00002000, 0x02082000, 0x00000008, + 0x00080000, 0x00002000, 0x02000008, 0x02082008, + 0x00002008, 0x02000000, 0x00000000, 0x00082000, + 0x02080008, 0x02002008, 0x02002000, 0x00080008, + 0x02082000, 0x00000008, 0x00080008, 0x02002000, + 0x02082008, 0x00080000, 0x02080000, 0x02000008, + 0x00082000, 0x00002008, 0x02002008, 0x02080000, + 0x00000008, 0x02082000, 0x00082008, 0x00000000, + 0x02000000, 0x02080008, 0x00002000, 0x00082008, + + 0x08000004, 0x00020004, 0x00000000, 0x08020200, + 0x00020004, 0x00000200, 0x08000204, 0x00020000, + 0x00000204, 0x08020204, 0x00020200, 0x08000000, + 0x08000200, 0x08000004, 0x08020000, 0x00020204, + 0x00020000, 0x08000204, 0x08020004, 0x00000000, + 0x00000200, 0x00000004, 0x08020200, 0x08020004, + 0x08020204, 0x08020000, 0x08000000, 0x00000204, + 0x00000004, 0x00020200, 0x00020204, 0x08000200, + 0x00000204, 0x08000000, 0x08000200, 0x00020204, + 0x08020200, 0x00020004, 0x00000000, 0x08000200, + 0x08000000, 0x00000200, 0x08020004, 0x00020000, + 0x00020004, 0x08020204, 0x00020200, 0x00000004, + 0x08020204, 0x00020200, 0x00020000, 0x08000204, + 0x08000004, 0x08020000, 0x00020204, 0x00000000, + 0x00000200, 0x08000004, 0x08000204, 0x08020200, + 0x08020000, 0x00000204, 0x00000004, 0x08020004, + + 0x80040100, 0x01000100, 0x80000000, 0x81040100, + 0x00000000, 0x01040000, 0x81000100, 0x80040000, + 0x01040100, 0x81000000, 0x01000000, 0x80000100, + 0x81000000, 0x80040100, 0x00040000, 0x01000000, + 0x81040000, 0x00040100, 0x00000100, 0x80000000, + 0x00040100, 0x81000100, 0x01040000, 0x00000100, + 0x80000100, 0x00000000, 0x80040000, 0x01040100, + 0x01000100, 0x81040000, 0x81040100, 0x00040000, + 0x81040000, 0x80000100, 0x00040000, 0x81000000, + 0x00040100, 0x01000100, 0x80000000, 0x01040000, + 0x81000100, 0x00000000, 0x00000100, 0x80040000, + 0x00000000, 0x81040000, 0x01040100, 0x00000100, + 0x01000000, 0x81040100, 0x80040100, 0x00040000, + 0x81040100, 0x80000000, 0x01000100, 0x80040100, + 0x80040000, 0x00040100, 0x01040000, 0x81000100, + 0x80000100, 0x01000000, 0x81000000, 0x01040100, + + 0x04010801, 0x00000000, 0x00010800, 0x04010000, + 0x04000001, 0x00000801, 0x04000800, 0x00010800, + 0x00000800, 0x04010001, 0x00000001, 0x04000800, + 0x00010001, 0x04010800, 0x04010000, 0x00000001, + 0x00010000, 0x04000801, 0x04010001, 0x00000800, + 0x00010801, 0x04000000, 0x00000000, 0x00010001, + 0x04000801, 0x00010801, 0x04010800, 0x04000001, + 0x04000000, 0x00010000, 0x00000801, 0x04010801, + 0x00010001, 0x04010800, 0x04000800, 0x00010801, + 0x04010801, 0x00010001, 0x04000001, 0x00000000, + 0x04000000, 0x00000801, 0x00010000, 0x04010001, + 0x00000800, 0x04000000, 0x00010801, 0x04000801, + 0x04010800, 0x00000800, 0x00000000, 0x04000001, + 0x00000001, 0x04010801, 0x00010800, 0x04010000, + 0x04010001, 0x00010000, 0x00000801, 0x04000800, + 0x04000801, 0x00000001, 0x04010000, 0x00010800, + + 0x00000400, 0x00000020, 0x00100020, 0x40100000, + 0x40100420, 0x40000400, 0x00000420, 0x00000000, + 0x00100000, 0x40100020, 0x40000020, 0x00100400, + 0x40000000, 0x00100420, 0x00100400, 0x40000020, + 0x40100020, 0x00000400, 0x40000400, 0x40100420, + 0x00000000, 0x00100020, 0x40100000, 0x00000420, + 0x40100400, 0x40000420, 0x00100420, 0x40000000, + 0x40000420, 0x40100400, 0x00000020, 0x00100000, + 0x40000420, 0x00100400, 0x40100400, 0x40000020, + 0x00000400, 0x00000020, 0x00100000, 0x40100400, + 0x40100020, 0x40000420, 0x00000420, 0x00000000, + 0x00000020, 0x40100000, 0x40000000, 0x00100020, + 0x00000000, 0x40100020, 0x00100020, 0x00000420, + 0x40000020, 0x00000400, 0x40100420, 0x00100000, + 0x00100420, 0x40000000, 0x40000400, 0x40100420, + 0x40100000, 0x00100420, 0x00100400, 0x40000400, + + 0x00800000, 0x00001000, 0x00000040, 0x00801042, + 0x00801002, 0x00800040, 0x00001042, 0x00801000, + 0x00001000, 0x00000002, 0x00800002, 0x00001040, + 0x00800042, 0x00801002, 0x00801040, 0x00000000, + 0x00001040, 0x00800000, 0x00001002, 0x00000042, + 0x00800040, 0x00001042, 0x00000000, 0x00800002, + 0x00000002, 0x00800042, 0x00801042, 0x00001002, + 0x00801000, 0x00000040, 0x00000042, 0x00801040, + 0x00801040, 0x00800042, 0x00001002, 0x00801000, + 0x00001000, 0x00000002, 0x00800002, 0x00800040, + 0x00800000, 0x00001040, 0x00801042, 0x00000000, + 0x00001042, 0x00800000, 0x00000040, 0x00001002, + 0x00800042, 0x00000040, 0x00000000, 0x00801042, + 0x00801002, 0x00801040, 0x00000042, 0x00001000, + 0x00001040, 0x00801002, 0x00800040, 0x00000042, + 0x00000002, 0x00001042, 0x00801000, 0x00800002, + + 0x10400000, 0x00404010, 0x00000010, 0x10400010, + 0x10004000, 0x00400000, 0x10400010, 0x00004010, + 0x00400010, 0x00004000, 0x00404000, 0x10000000, + 0x10404010, 0x10000010, 0x10000000, 0x10404000, + 0x00000000, 0x10004000, 0x00404010, 0x00000010, + 0x10000010, 0x10404010, 0x00004000, 0x10400000, + 0x10404000, 0x00400010, 0x10004010, 0x00404000, + 0x00004010, 0x00000000, 0x00400000, 0x10004010, + 0x00404010, 0x00000010, 0x10000000, 0x00004000, + 0x10000010, 0x10004000, 0x00404000, 0x10400010, + 0x00000000, 0x00404010, 0x00004010, 0x10404000, + 0x10004000, 0x00400000, 0x10404010, 0x10000000, + 0x10004010, 0x10400000, 0x00400000, 0x10404010, + 0x00004000, 0x00400010, 0x10400010, 0x00004010, + 0x00400010, 0x00000000, 0x10404000, 0x10000010, + 0x10400000, 0x10004010, 0x00000010, 0x00404000, + + 0x00208080, 0x00008000, 0x20200000, 0x20208080, + 0x00200000, 0x20008080, 0x20008000, 0x20200000, + 0x20008080, 0x00208080, 0x00208000, 0x20000080, + 0x20200080, 0x00200000, 0x00000000, 0x20008000, + 0x00008000, 0x20000000, 0x00200080, 0x00008080, + 0x20208080, 0x00208000, 0x20000080, 0x00200080, + 0x20000000, 0x00000080, 0x00008080, 0x20208000, + 0x00000080, 0x20200080, 0x20208000, 0x00000000, + 0x00000000, 0x20208080, 0x00200080, 0x20008000, + 0x00208080, 0x00008000, 0x20000080, 0x00200080, + 0x20208000, 0x00000080, 0x00008080, 0x20200000, + 0x20008080, 0x20000000, 0x20200000, 0x00208000, + 0x20208080, 0x00008080, 0x00208000, 0x20200080, + 0x00200000, 0x20000080, 0x20008000, 0x00000000, + 0x00008000, 0x00200000, 0x20200080, 0x00208080, + 0x20000000, 0x20208000, 0x00000080, 0x20008080, +}; + +static u8 rotors[] = { + 34, 13, 5, 46, 47, 18, 32, 41, 11, 53, 33, 20, + 14, 36, 30, 24, 49, 2, 15, 37, 42, 50, 0, 21, + 38, 48, 6, 26, 39, 4, 52, 25, 12, 27, 31, 40, + 1, 17, 28, 29, 23, 51, 35, 7, 3, 22, 9, 43, + + 41, 20, 12, 53, 54, 25, 39, 48, 18, 31, 40, 27, + 21, 43, 37, 0, 1, 9, 22, 44, 49, 2, 7, 28, + 45, 55, 13, 33, 46, 11, 6, 32, 19, 34, 38, 47, + 8, 24, 35, 36, 30, 3, 42, 14, 10, 29, 16, 50, + + 55, 34, 26, 38, 11, 39, 53, 5, 32, 45, 54, 41, + 35, 2, 51, 14, 15, 23, 36, 3, 8, 16, 21, 42, + 6, 12, 27, 47, 31, 25, 20, 46, 33, 48, 52, 4, + 22, 7, 49, 50, 44, 17, 1, 28, 24, 43, 30, 9, + + 12, 48, 40, 52, 25, 53, 38, 19, 46, 6, 11, 55, + 49, 16, 10, 28, 29, 37, 50, 17, 22, 30, 35, 1, + 20, 26, 41, 4, 45, 39, 34, 31, 47, 5, 13, 18, + 36, 21, 8, 9, 3, 0, 15, 42, 7, 2, 44, 23, + + 26, 5, 54, 13, 39, 38, 52, 33, 31, 20, 25, 12, + 8, 30, 24, 42, 43, 51, 9, 0, 36, 44, 49, 15, + 34, 40, 55, 18, 6, 53, 48, 45, 4, 19, 27, 32, + 50, 35, 22, 23, 17, 14, 29, 1, 21, 16, 3, 37, + + 40, 19, 11, 27, 53, 52, 13, 47, 45, 34, 39, 26, + 22, 44, 7, 1, 2, 10, 23, 14, 50, 3, 8, 29, + 48, 54, 12, 32, 20, 38, 5, 6, 18, 33, 41, 46, + 9, 49, 36, 37, 0, 28, 43, 15, 35, 30, 17, 51, + + 54, 33, 25, 41, 38, 13, 27, 4, 6, 48, 53, 40, + 36, 3, 21, 15, 16, 24, 37, 28, 9, 17, 22, 43, + 5, 11, 26, 46, 34, 52, 19, 20, 32, 47, 55, 31, + 23, 8, 50, 51, 14, 42, 2, 29, 49, 44, 0, 10, + + 11, 47, 39, 55, 52, 27, 41, 18, 20, 5, 38, 54, + 50, 17, 35, 29, 30, 7, 51, 42, 23, 0, 36, 2, + 19, 25, 40, 31, 48, 13, 33, 34, 46, 4, 12, 45, + 37, 22, 9, 10, 28, 1, 16, 43, 8, 3, 14, 24, + + 18, 54, 46, 5, 6, 34, 48, 25, 27, 12, 45, 4, + 2, 24, 42, 36, 37, 14, 3, 49, 30, 7, 43, 9, + 26, 32, 47, 38, 55, 20, 40, 41, 53, 11, 19, 52, + 44, 29, 16, 17, 35, 8, 23, 50, 15, 10, 21, 0, + + 32, 11, 31, 19, 20, 48, 5, 39, 41, 26, 6, 18, + 16, 7, 1, 50, 51, 28, 17, 8, 44, 21, 2, 23, + 40, 46, 4, 52, 12, 34, 54, 55, 38, 25, 33, 13, + 3, 43, 30, 0, 49, 22, 37, 9, 29, 24, 35, 14, + + 46, 25, 45, 33, 34, 5, 19, 53, 55, 40, 20, 32, + 30, 21, 15, 9, 10, 42, 0, 22, 3, 35, 16, 37, + 54, 31, 18, 13, 26, 48, 11, 12, 52, 39, 47, 27, + 17, 2, 44, 14, 8, 36, 51, 23, 43, 7, 49, 28, + + 31, 39, 6, 47, 48, 19, 33, 38, 12, 54, 34, 46, + 44, 35, 29, 23, 24, 1, 14, 36, 17, 49, 30, 51, + 11, 45, 32, 27, 40, 5, 25, 26, 13, 53, 4, 41, + 0, 16, 3, 28, 22, 50, 10, 37, 2, 21, 8, 42, + + 45, 53, 20, 4, 5, 33, 47, 52, 26, 11, 48, 31, + 3, 49, 43, 37, 7, 15, 28, 50, 0, 8, 44, 10, + 25, 6, 46, 41, 54, 19, 39, 40, 27, 38, 18, 55, + 14, 30, 17, 42, 36, 9, 24, 51, 16, 35, 22, 1, + + 6, 38, 34, 18, 19, 47, 4, 13, 40, 25, 5, 45, + 17, 8, 2, 51, 21, 29, 42, 9, 14, 22, 3, 24, + 39, 20, 31, 55, 11, 33, 53, 54, 41, 52, 32, 12, + 28, 44, 0, 1, 50, 23, 7, 10, 30, 49, 36, 15, + + 20, 52, 48, 32, 33, 4, 18, 27, 54, 39, 19, 6, + 0, 22, 16, 10, 35, 43, 1, 23, 28, 36, 17, 7, + 53, 34, 45, 12, 25, 47, 38, 11, 55, 13, 46, 26, + 42, 3, 14, 15, 9, 37, 21, 24, 44, 8, 50, 29, + + 27, 6, 55, 39, 40, 11, 25, 34, 4, 46, 26, 13, + 7, 29, 23, 17, 42, 50, 8, 30, 35, 43, 24, 14, + 31, 41, 52, 19, 32, 54, 45, 18, 5, 20, 53, 33, + 49, 10, 21, 22, 16, 44, 28, 0, 51, 15, 2, 36, +}; + +static char parity[] = { +8,1,0,8,0,8,8,0,0,8,8,0,8,0,2,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,3, +0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8, +0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8, +8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0, +0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8, +8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0, +8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0, +4,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,5,0,8,0,8,8,0,0,8,8,0,8,0,6,8, +}; + +/* set up the method list from the key */ + +int des_set_key(struct cipher_context *cx, + unsigned char *key, int keybytes) +{ + register u32 n, w; + register char * b0, * b1; + char bits0[56], bits1[56]; + u32 *method; + + method=(u32 *)cx->keyinfo; + + if(keybytes<8) + return -EINVAL; + + /* check for bad parity and weak keys */ + b0 = parity; + n = b0[key[0]]; n <<= 4; + n |= b0[key[1]]; n <<= 4; + n |= b0[key[2]]; n <<= 4; + n |= b0[key[3]]; n <<= 4; + n |= b0[key[4]]; n <<= 4; + n |= b0[key[5]]; n <<= 4; + n |= b0[key[6]]; n <<= 4; + n |= b0[key[7]]; + w = 0X88888888L; + /* report bad parity in key */ + if ( n & w ) + return -1; + /* report a weak or semi-weak key */ + if ( !((n - (w >> 3)) & w) ) { /* 1 in 10^10 keys passes this test */ + if ( n < 0X41415151 ) { + if ( n < 0X31312121 ) { + if ( n < 0X14141515 ) { + /* 01 01 01 01 01 01 01 01 */ + if ( n == 0X11111111 ) return -2; + /* 01 1F 01 1F 01 0E 01 0E */ + if ( n == 0X13131212 ) return -2; + } else { + /* 01 E0 01 E0 01 F1 01 F1 */ + if ( n == 0X14141515 ) return -2; + /* 01 FE 01 FE 01 FE 01 FE */ + if ( n == 0X16161616 ) return -2; + } + } else { + if ( n < 0X34342525 ) { + /* 1F 01 1F 01 0E 01 0E 01 */ + if ( n == 0X31312121 ) return -2; + /* 1F 1F 1F 1F 0E 0E 0E 0E */ /* ? */ + if ( n == 0X33332222 ) return -2; + } else { + /* 1F E0 1F E0 0E F1 0E F1 */ + if ( n == 0X34342525 ) return -2; + /* 1F FE 1F FE 0E FE 0E FE */ + if ( n == 0X36362626 ) return -2; + } + } + } else { + if ( n < 0X61616161 ) { + if ( n < 0X44445555 ) { + /* E0 01 E0 01 F1 01 F1 01 */ + if ( n == 0X41415151 ) return -2; + /* E0 1F E0 1F F1 0E F1 0E */ + if ( n == 0X43435252 ) return -2; + } else { + /* E0 E0 E0 E0 F1 F1 F1 F1 */ /* ? */ + if ( n == 0X44445555 ) return -2; + /* E0 FE E0 FE F1 FE F1 FE */ + if ( n == 0X46465656 ) return -2; + } + } else { + if ( n < 0X64646565 ) { + /* FE 01 FE 01 FE 01 FE 01 */ + if ( n == 0X61616161 ) return -2; + /* FE 1F FE 1F FE 0E FE 0E */ + if ( n == 0X63636262 ) return -2; + } else { + /* FE E0 FE E0 FE F1 FE F1 */ + if ( n == 0X64646565 ) return -2; + /* FE FE FE FE FE FE FE FE */ + if ( n == 0X66666666 ) return -2; + } + } + } + } + + /* explode the bits */ + n = 56; + b0 = bits0; + b1 = bits1; + do { + w = (256 | *key++) << 2; + do { + --n; + b1[n] = 8 & w; + w >>= 1; + b0[n] = 4 & w; + } while ( w >= 16 ); + } while ( n ); + + /* put the bits in the correct places */ + n = 16; + key = rotors; + do { + w = (b1[key[ 0 ]] | b0[key[ 1 ]]) << 4; + w |= (b1[key[ 2 ]] | b0[key[ 3 ]]) << 2; + w |= b1[key[ 4 ]] | b0[key[ 5 ]]; + w <<= 8; + w |= (b1[key[ 6 ]] | b0[key[ 7 ]]) << 4; + w |= (b1[key[ 8 ]] | b0[key[ 9 ]]) << 2; + w |= b1[key[10 ]] | b0[key[11 ]]; + w <<= 8; + w |= (b1[key[12 ]] | b0[key[13 ]]) << 4; + w |= (b1[key[14 ]] | b0[key[15 ]]) << 2; + w |= b1[key[16 ]] | b0[key[17 ]]; + w <<= 8; + w |= (b1[key[18 ]] | b0[key[19 ]]) << 4; + w |= (b1[key[20 ]] | b0[key[21 ]]) << 2; + w |= b1[key[22 ]] | b0[key[23 ]]; + + method[0] = w; + + w = (b1[key[ 0+24]] | b0[key[ 1+24]]) << 4; + w |= (b1[key[ 2+24]] | b0[key[ 3+24]]) << 2; + w |= b1[key[ 4+24]] | b0[key[ 5+24]]; + w <<= 8; + w |= (b1[key[ 6+24]] | b0[key[ 7+24]]) << 4; + w |= (b1[key[ 8+24]] | b0[key[ 9+24]]) << 2; + w |= b1[key[10+24]] | b0[key[11+24]]; + w <<= 8; + w |= (b1[key[12+24]] | b0[key[13+24]]) << 4; + w |= (b1[key[14+24]] | b0[key[15+24]]) << 2; + w |= b1[key[16+24]] | b0[key[17+24]]; + w <<= 8; + w |= (b1[key[18+24]] | b0[key[19+24]]) << 4; + w |= (b1[key[20+24]] | b0[key[21+24]]) << 2; + w |= b1[key[22+24]] | b0[key[23+24]]; + + ROR(w, 4, 28); /* could be eliminated */ + method[1] = w; + + key += 48; + method += 2; + } while ( --n ); + return 0; +} + + +void DesSmallFipsEncrypt (DesData d, DesKeys r, DesData s) +{ + register u32 x, y, z; + + x = s [7]; + x <<= 8; + x |= s [6]; + x <<= 8; + x |= s [5]; + x <<= 8; + x |= s [4]; + y = s [3]; + y <<= 8; + y |= s [2]; + y <<= 8; + y |= s [1]; + y <<= 8; + y |= s [0]; + z = ((x >> 004) ^ y) & 0X0F0F0F0FL; + x ^= z << 004; + y ^= z; + z = ((y >> 020) ^ x) & 0X0000FFFFL; + y ^= z << 020; + x ^= z; + z = ((x >> 002) ^ y) & 0X33333333L; + x ^= z << 002; + y ^= z; + z = ((y >> 010) ^ x) & 0X00FF00FFL; + y ^= z << 010; + x ^= z; + x = x >> 1 | x << 31; + z = (x ^ y) & 0X55555555L; + y ^= z; + x ^= z; + y = y >> 1 | y << 31; + z = r [0]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [1]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [2]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [3]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [4]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [5]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [6]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [7]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [8]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [9]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [10]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [11]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [12]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [13]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [14]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [15]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [16]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [17]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [18]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [19]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [20]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [21]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [22]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [23]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [24]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [25]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [26]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [27]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [28]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [29]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [30]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [31]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + x = x << 1 | x >> 31; + z = (x ^ y) & 0X55555555L; + y ^= z; + x ^= z; + y = y << 1 | y >> 31; + z = ((x >> 010) ^ y) & 0X00FF00FFL; + x ^= z << 010; + y ^= z; + z = ((y >> 002) ^ x) & 0X33333333L; + y ^= z << 002; + x ^= z; + z = ((x >> 020) ^ y) & 0X0000FFFFL; + x ^= z << 020; + y ^= z; + z = ((y >> 004) ^ x) & 0X0F0F0F0FL; + y ^= z << 004; + x ^= z; + d [0] = x; + x >>= 8; + d [1] = x; + x >>= 8; + d [2] = x; + x >>= 8; + d [3] = x; + d [4] = y; + y >>= 8; + d [5] = y; + y >>= 8; + d [6] = y; + y >>= 8; + d [7] = y; + return; +} + +void DesSmallFipsDecrypt (u8 *d, u32 *r, u8 *s) +{ + register u32 x, y, z; + x = s [7]; + x <<= 8; + x |= s [6]; + x <<= 8; + x |= s [5]; + x <<= 8; + x |= s [4]; + y = s [3]; + y <<= 8; + y |= s [2]; + y <<= 8; + y |= s [1]; + y <<= 8; + y |= s [0]; + z = ((x >> 004) ^ y) & 0X0F0F0F0FL; + x ^= z << 004; + y ^= z; + z = ((y >> 020) ^ x) & 0X0000FFFFL; + y ^= z << 020; + x ^= z; + z = ((x >> 002) ^ y) & 0X33333333L; + x ^= z << 002; + y ^= z; + z = ((y >> 010) ^ x) & 0X00FF00FFL; + y ^= z << 010; + x ^= z; + x = x >> 1 | x << 31; + z = (x ^ y) & 0X55555555L; + y ^= z; + x ^= z; + y = y >> 1 | y << 31; + z = r [31]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [30]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [29]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [28]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [27]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [26]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [25]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [24]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [23]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [22]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [21]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [20]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [19]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [18]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [17]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [16]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [15]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [14]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [13]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [12]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [11]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [10]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [9]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [8]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [7]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [6]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [5]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [4]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [3]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [2]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [1]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [0]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + x = x << 1 | x >> 31; + z = (x ^ y) & 0X55555555L; + y ^= z; + x ^= z; + y = y << 1 | y >> 31; + z = ((x >> 010) ^ y) & 0X00FF00FFL; + x ^= z << 010; + y ^= z; + z = ((y >> 002) ^ x) & 0X33333333L; + y ^= z << 002; + x ^= z; + z = ((x >> 020) ^ y) & 0X0000FFFFL; + x ^= z << 020; + y ^= z; + z = ((y >> 004) ^ x) & 0X0F0F0F0FL; + y ^= z << 004; + x ^= z; + d [0] = x; + x >>= 8; + d [1] = x; + x >>= 8; + d [2] = x; + x >>= 8; + d [3] = x; + d [4] = y; + y >>= 8; + d [5] = y; + y >>= 8; + d [6] = y; + y >>= 8; + d [7] = y; + return; +} + +int des_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size) +{ + u8 input_buffer[8]; + u8 output_buffer[8]; + + for (; size >= 8; size -= 8) { + memcpy(&input_buffer, in, 8); + in += 8; + DesSmallFipsEncrypt(output_buffer,cx->keyinfo,input_buffer); + memcpy(out, &output_buffer, 8); + out += 8; + } + return 0; +} + +int des_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size) +{ + u8 input_buffer[8]; + u8 output_buffer[8]; + + for (; size >= 8; size -= 8) { + memcpy(&input_buffer, in, 8); + in += 8; + DesSmallFipsDecrypt(output_buffer,cx->keyinfo,input_buffer); + memcpy(out, &output_buffer, 8); + out += 8; + } + return 0; +} + +static void des_lock(void) +{ + MOD_INC_USE_COUNT; +} + +static void des_unlock(void) +{ + MOD_DEC_USE_COUNT; +} + + +#define CIPHER_BITS_64 +#define CIPHER_NAME(x) des##x +#include "gen-cbc.h" +#include "gen-ecb.h" + +static struct cipher_implementation des = { + {{NULL,NULL},CIPHER_DES, "des"}, + blocksize: 8, + ivsize: 0, + key_schedule_size: DES_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_64, + INIT_CIPHER_BLKOPS(des_ecb), + INIT_CIPHER_OPS(des) +}; + +static struct cipher_implementation des_cbc = { + {{NULL,NULL},CIPHER_DES | CIPHER_CBC, "des-cbc"}, + blocksize: 8, + ivsize: 8, + key_schedule_size: DES_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_64, + INIT_CIPHER_BLKOPS(des_cbc), + INIT_CIPHER_OPS(des) +}; + +#ifdef MODULE +int __init init_module(void) +#else +int __init init_des(void) +#endif +{ + if (register_cipher(&des)) + printk(KERN_WARNING "Couldn't register des encryption\n"); + if (register_cipher(&des_cbc)) + printk(KERN_WARNING "Couldn't register des-cbc encryption\n"); + + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ + if (unregister_cipher(&des)) + printk(KERN_WARNING "Couldn't unregister des encryption\n"); + if (unregister_cipher(&des_cbc)) + printk(KERN_WARNING "Couldn't unregister des-cbc encryption\n"); +} +#endif diff -urN lin.2.2.17/crypto/des_ede3.c int.2.2.17.x/crypto/des_ede3.c --- lin.2.2.17/crypto/des_ede3.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/des_ede3.c Sat Oct 14 01:04:52 2000 @@ -0,0 +1,1326 @@ + +/* + * triple DES (DES EDE3) created from kerneli DES implementation by + * Gisle Sælensminde . Original DES sourcecode created + * by descore. Descore is under GPL and made by Dana L. How + * , and modified by Raimar Falke + * for the Linux-Kernel. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * as published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This implementation accept 24, 16 or 8 byte keys for 3-key 3DES, + * 2-key 3DES or DES compatibility mode respectivly. Other key lengths + * are rejected. The parity bits, which is the least significant bit + * of each byte are always set to the correct value. + * + * In DES there are four weak and six pairs of semi-weak keys. For 3DES + * none of the keys should be weak, and no pair of semi-weak keys should + * appear among the three DES subkeys. If the key is (pseudo)random, the + * chance of selecting a weak key is negligtable, and the test can safly + * be omited. Such (pseudo)random keys are usually the result of a key + * exchange protocol or the output of a cryptographic hash function. If + * the key is selected by the user, the key can not be expected to be + * random, and it can be desirable to check the keys. Since it's + * possible for a user to directly select the key bits in some + * applications of kerneli crypto API, we do check for weak keys. + * + * More specifically, a key is rejected if any of the DES subkeys are + * weak or semi-weak. This is done because we reuse the check from the + * original kerneli DES implementation. This function reject any key if + * it is weak or semi-weak. As a result we may unnecessarily reject some + * strong keys. In future releases this test should be improved, or + * better; we should not let the user select the exact key bits, and + * remove the need for checking. + * + * A DES_EDE3 key degenerates to DES if any of the DES subkeys K1 and + * K2 or K2 and K3 are equal, even we have 112 key bits. This should be + * avoided, unless we operate in DES compatibility mode. Again such keys + * are unlikely if the key is random. To have K1 = K3 is 2-key 3DES, + * which not have such security problems. An exception from this policy + * is done for DES compatibility mode, where all three keys are equal. + */ + +#include +#include +#include +#include +#include +#include + +#define ROR(d,c,o) d = d >> c | d << o + +typedef u8 DesData[8]; +typedef u32 DesKeys[32]; + +static u32 des_keymap[] = { + 0x02080008, 0x02082000, 0x00002008, 0x00000000, + 0x02002000, 0x00080008, 0x02080000, 0x02082008, + 0x00000008, 0x02000000, 0x00082000, 0x00002008, + 0x00082008, 0x02002008, 0x02000008, 0x02080000, + 0x00002000, 0x00082008, 0x00080008, 0x02002000, + 0x02082008, 0x02000008, 0x00000000, 0x00082000, + 0x02000000, 0x00080000, 0x02002008, 0x02080008, + 0x00080000, 0x00002000, 0x02082000, 0x00000008, + 0x00080000, 0x00002000, 0x02000008, 0x02082008, + 0x00002008, 0x02000000, 0x00000000, 0x00082000, + 0x02080008, 0x02002008, 0x02002000, 0x00080008, + 0x02082000, 0x00000008, 0x00080008, 0x02002000, + 0x02082008, 0x00080000, 0x02080000, 0x02000008, + 0x00082000, 0x00002008, 0x02002008, 0x02080000, + 0x00000008, 0x02082000, 0x00082008, 0x00000000, + 0x02000000, 0x02080008, 0x00002000, 0x00082008, + + 0x08000004, 0x00020004, 0x00000000, 0x08020200, + 0x00020004, 0x00000200, 0x08000204, 0x00020000, + 0x00000204, 0x08020204, 0x00020200, 0x08000000, + 0x08000200, 0x08000004, 0x08020000, 0x00020204, + 0x00020000, 0x08000204, 0x08020004, 0x00000000, + 0x00000200, 0x00000004, 0x08020200, 0x08020004, + 0x08020204, 0x08020000, 0x08000000, 0x00000204, + 0x00000004, 0x00020200, 0x00020204, 0x08000200, + 0x00000204, 0x08000000, 0x08000200, 0x00020204, + 0x08020200, 0x00020004, 0x00000000, 0x08000200, + 0x08000000, 0x00000200, 0x08020004, 0x00020000, + 0x00020004, 0x08020204, 0x00020200, 0x00000004, + 0x08020204, 0x00020200, 0x00020000, 0x08000204, + 0x08000004, 0x08020000, 0x00020204, 0x00000000, + 0x00000200, 0x08000004, 0x08000204, 0x08020200, + 0x08020000, 0x00000204, 0x00000004, 0x08020004, + + 0x80040100, 0x01000100, 0x80000000, 0x81040100, + 0x00000000, 0x01040000, 0x81000100, 0x80040000, + 0x01040100, 0x81000000, 0x01000000, 0x80000100, + 0x81000000, 0x80040100, 0x00040000, 0x01000000, + 0x81040000, 0x00040100, 0x00000100, 0x80000000, + 0x00040100, 0x81000100, 0x01040000, 0x00000100, + 0x80000100, 0x00000000, 0x80040000, 0x01040100, + 0x01000100, 0x81040000, 0x81040100, 0x00040000, + 0x81040000, 0x80000100, 0x00040000, 0x81000000, + 0x00040100, 0x01000100, 0x80000000, 0x01040000, + 0x81000100, 0x00000000, 0x00000100, 0x80040000, + 0x00000000, 0x81040000, 0x01040100, 0x00000100, + 0x01000000, 0x81040100, 0x80040100, 0x00040000, + 0x81040100, 0x80000000, 0x01000100, 0x80040100, + 0x80040000, 0x00040100, 0x01040000, 0x81000100, + 0x80000100, 0x01000000, 0x81000000, 0x01040100, + + 0x04010801, 0x00000000, 0x00010800, 0x04010000, + 0x04000001, 0x00000801, 0x04000800, 0x00010800, + 0x00000800, 0x04010001, 0x00000001, 0x04000800, + 0x00010001, 0x04010800, 0x04010000, 0x00000001, + 0x00010000, 0x04000801, 0x04010001, 0x00000800, + 0x00010801, 0x04000000, 0x00000000, 0x00010001, + 0x04000801, 0x00010801, 0x04010800, 0x04000001, + 0x04000000, 0x00010000, 0x00000801, 0x04010801, + 0x00010001, 0x04010800, 0x04000800, 0x00010801, + 0x04010801, 0x00010001, 0x04000001, 0x00000000, + 0x04000000, 0x00000801, 0x00010000, 0x04010001, + 0x00000800, 0x04000000, 0x00010801, 0x04000801, + 0x04010800, 0x00000800, 0x00000000, 0x04000001, + 0x00000001, 0x04010801, 0x00010800, 0x04010000, + 0x04010001, 0x00010000, 0x00000801, 0x04000800, + 0x04000801, 0x00000001, 0x04010000, 0x00010800, + + 0x00000400, 0x00000020, 0x00100020, 0x40100000, + 0x40100420, 0x40000400, 0x00000420, 0x00000000, + 0x00100000, 0x40100020, 0x40000020, 0x00100400, + 0x40000000, 0x00100420, 0x00100400, 0x40000020, + 0x40100020, 0x00000400, 0x40000400, 0x40100420, + 0x00000000, 0x00100020, 0x40100000, 0x00000420, + 0x40100400, 0x40000420, 0x00100420, 0x40000000, + 0x40000420, 0x40100400, 0x00000020, 0x00100000, + 0x40000420, 0x00100400, 0x40100400, 0x40000020, + 0x00000400, 0x00000020, 0x00100000, 0x40100400, + 0x40100020, 0x40000420, 0x00000420, 0x00000000, + 0x00000020, 0x40100000, 0x40000000, 0x00100020, + 0x00000000, 0x40100020, 0x00100020, 0x00000420, + 0x40000020, 0x00000400, 0x40100420, 0x00100000, + 0x00100420, 0x40000000, 0x40000400, 0x40100420, + 0x40100000, 0x00100420, 0x00100400, 0x40000400, + + 0x00800000, 0x00001000, 0x00000040, 0x00801042, + 0x00801002, 0x00800040, 0x00001042, 0x00801000, + 0x00001000, 0x00000002, 0x00800002, 0x00001040, + 0x00800042, 0x00801002, 0x00801040, 0x00000000, + 0x00001040, 0x00800000, 0x00001002, 0x00000042, + 0x00800040, 0x00001042, 0x00000000, 0x00800002, + 0x00000002, 0x00800042, 0x00801042, 0x00001002, + 0x00801000, 0x00000040, 0x00000042, 0x00801040, + 0x00801040, 0x00800042, 0x00001002, 0x00801000, + 0x00001000, 0x00000002, 0x00800002, 0x00800040, + 0x00800000, 0x00001040, 0x00801042, 0x00000000, + 0x00001042, 0x00800000, 0x00000040, 0x00001002, + 0x00800042, 0x00000040, 0x00000000, 0x00801042, + 0x00801002, 0x00801040, 0x00000042, 0x00001000, + 0x00001040, 0x00801002, 0x00800040, 0x00000042, + 0x00000002, 0x00001042, 0x00801000, 0x00800002, + + 0x10400000, 0x00404010, 0x00000010, 0x10400010, + 0x10004000, 0x00400000, 0x10400010, 0x00004010, + 0x00400010, 0x00004000, 0x00404000, 0x10000000, + 0x10404010, 0x10000010, 0x10000000, 0x10404000, + 0x00000000, 0x10004000, 0x00404010, 0x00000010, + 0x10000010, 0x10404010, 0x00004000, 0x10400000, + 0x10404000, 0x00400010, 0x10004010, 0x00404000, + 0x00004010, 0x00000000, 0x00400000, 0x10004010, + 0x00404010, 0x00000010, 0x10000000, 0x00004000, + 0x10000010, 0x10004000, 0x00404000, 0x10400010, + 0x00000000, 0x00404010, 0x00004010, 0x10404000, + 0x10004000, 0x00400000, 0x10404010, 0x10000000, + 0x10004010, 0x10400000, 0x00400000, 0x10404010, + 0x00004000, 0x00400010, 0x10400010, 0x00004010, + 0x00400010, 0x00000000, 0x10404000, 0x10000010, + 0x10400000, 0x10004010, 0x00000010, 0x00404000, + + 0x00208080, 0x00008000, 0x20200000, 0x20208080, + 0x00200000, 0x20008080, 0x20008000, 0x20200000, + 0x20008080, 0x00208080, 0x00208000, 0x20000080, + 0x20200080, 0x00200000, 0x00000000, 0x20008000, + 0x00008000, 0x20000000, 0x00200080, 0x00008080, + 0x20208080, 0x00208000, 0x20000080, 0x00200080, + 0x20000000, 0x00000080, 0x00008080, 0x20208000, + 0x00000080, 0x20200080, 0x20208000, 0x00000000, + 0x00000000, 0x20208080, 0x00200080, 0x20008000, + 0x00208080, 0x00008000, 0x20000080, 0x00200080, + 0x20208000, 0x00000080, 0x00008080, 0x20200000, + 0x20008080, 0x20000000, 0x20200000, 0x00208000, + 0x20208080, 0x00008080, 0x00208000, 0x20200080, + 0x00200000, 0x20000080, 0x20008000, 0x00000000, + 0x00008000, 0x00200000, 0x20200080, 0x00208080, + 0x20000000, 0x20208000, 0x00000080, 0x20008080, +}; + +static u8 rotors[] = { + 34, 13, 5, 46, 47, 18, 32, 41, 11, 53, 33, 20, + 14, 36, 30, 24, 49, 2, 15, 37, 42, 50, 0, 21, + 38, 48, 6, 26, 39, 4, 52, 25, 12, 27, 31, 40, + 1, 17, 28, 29, 23, 51, 35, 7, 3, 22, 9, 43, + + 41, 20, 12, 53, 54, 25, 39, 48, 18, 31, 40, 27, + 21, 43, 37, 0, 1, 9, 22, 44, 49, 2, 7, 28, + 45, 55, 13, 33, 46, 11, 6, 32, 19, 34, 38, 47, + 8, 24, 35, 36, 30, 3, 42, 14, 10, 29, 16, 50, + + 55, 34, 26, 38, 11, 39, 53, 5, 32, 45, 54, 41, + 35, 2, 51, 14, 15, 23, 36, 3, 8, 16, 21, 42, + 6, 12, 27, 47, 31, 25, 20, 46, 33, 48, 52, 4, + 22, 7, 49, 50, 44, 17, 1, 28, 24, 43, 30, 9, + + 12, 48, 40, 52, 25, 53, 38, 19, 46, 6, 11, 55, + 49, 16, 10, 28, 29, 37, 50, 17, 22, 30, 35, 1, + 20, 26, 41, 4, 45, 39, 34, 31, 47, 5, 13, 18, + 36, 21, 8, 9, 3, 0, 15, 42, 7, 2, 44, 23, + + 26, 5, 54, 13, 39, 38, 52, 33, 31, 20, 25, 12, + 8, 30, 24, 42, 43, 51, 9, 0, 36, 44, 49, 15, + 34, 40, 55, 18, 6, 53, 48, 45, 4, 19, 27, 32, + 50, 35, 22, 23, 17, 14, 29, 1, 21, 16, 3, 37, + + 40, 19, 11, 27, 53, 52, 13, 47, 45, 34, 39, 26, + 22, 44, 7, 1, 2, 10, 23, 14, 50, 3, 8, 29, + 48, 54, 12, 32, 20, 38, 5, 6, 18, 33, 41, 46, + 9, 49, 36, 37, 0, 28, 43, 15, 35, 30, 17, 51, + + 54, 33, 25, 41, 38, 13, 27, 4, 6, 48, 53, 40, + 36, 3, 21, 15, 16, 24, 37, 28, 9, 17, 22, 43, + 5, 11, 26, 46, 34, 52, 19, 20, 32, 47, 55, 31, + 23, 8, 50, 51, 14, 42, 2, 29, 49, 44, 0, 10, + + 11, 47, 39, 55, 52, 27, 41, 18, 20, 5, 38, 54, + 50, 17, 35, 29, 30, 7, 51, 42, 23, 0, 36, 2, + 19, 25, 40, 31, 48, 13, 33, 34, 46, 4, 12, 45, + 37, 22, 9, 10, 28, 1, 16, 43, 8, 3, 14, 24, + + 18, 54, 46, 5, 6, 34, 48, 25, 27, 12, 45, 4, + 2, 24, 42, 36, 37, 14, 3, 49, 30, 7, 43, 9, + 26, 32, 47, 38, 55, 20, 40, 41, 53, 11, 19, 52, + 44, 29, 16, 17, 35, 8, 23, 50, 15, 10, 21, 0, + + 32, 11, 31, 19, 20, 48, 5, 39, 41, 26, 6, 18, + 16, 7, 1, 50, 51, 28, 17, 8, 44, 21, 2, 23, + 40, 46, 4, 52, 12, 34, 54, 55, 38, 25, 33, 13, + 3, 43, 30, 0, 49, 22, 37, 9, 29, 24, 35, 14, + + 46, 25, 45, 33, 34, 5, 19, 53, 55, 40, 20, 32, + 30, 21, 15, 9, 10, 42, 0, 22, 3, 35, 16, 37, + 54, 31, 18, 13, 26, 48, 11, 12, 52, 39, 47, 27, + 17, 2, 44, 14, 8, 36, 51, 23, 43, 7, 49, 28, + + 31, 39, 6, 47, 48, 19, 33, 38, 12, 54, 34, 46, + 44, 35, 29, 23, 24, 1, 14, 36, 17, 49, 30, 51, + 11, 45, 32, 27, 40, 5, 25, 26, 13, 53, 4, 41, + 0, 16, 3, 28, 22, 50, 10, 37, 2, 21, 8, 42, + + 45, 53, 20, 4, 5, 33, 47, 52, 26, 11, 48, 31, + 3, 49, 43, 37, 7, 15, 28, 50, 0, 8, 44, 10, + 25, 6, 46, 41, 54, 19, 39, 40, 27, 38, 18, 55, + 14, 30, 17, 42, 36, 9, 24, 51, 16, 35, 22, 1, + + 6, 38, 34, 18, 19, 47, 4, 13, 40, 25, 5, 45, + 17, 8, 2, 51, 21, 29, 42, 9, 14, 22, 3, 24, + 39, 20, 31, 55, 11, 33, 53, 54, 41, 52, 32, 12, + 28, 44, 0, 1, 50, 23, 7, 10, 30, 49, 36, 15, + + 20, 52, 48, 32, 33, 4, 18, 27, 54, 39, 19, 6, + 0, 22, 16, 10, 35, 43, 1, 23, 28, 36, 17, 7, + 53, 34, 45, 12, 25, 47, 38, 11, 55, 13, 46, 26, + 42, 3, 14, 15, 9, 37, 21, 24, 44, 8, 50, 29, + + 27, 6, 55, 39, 40, 11, 25, 34, 4, 46, 26, 13, + 7, 29, 23, 17, 42, 50, 8, 30, 35, 43, 24, 14, + 31, 41, 52, 19, 32, 54, 45, 18, 5, 20, 53, 33, + 49, 10, 21, 22, 16, 44, 28, 0, 51, 15, 2, 36, +}; + +static char parity[] = { +8,1,0,8,0,8,8,0,0,8,8,0,8,0,2,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,3, +0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8, +0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8, +8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0, +0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8, +8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0, +8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0, +4,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,5,0,8,0,8,8,0,0,8,8,0,8,0,6,8, +}; + +static int des_part_set_key(u32 *method, unsigned char *key); + +int des_ede3_set_key(struct cipher_context *cx, + unsigned char *key, int keybytes) +{ + u32 *method; + int status,i; + unsigned char lkey[24]; + unsigned char n1, n2; + method=(u32 *)cx->keyinfo; + + /* asign keybits based on keylength */ + switch(keybytes) { + case 24: + memcpy(lkey,key,24); + break; + case 16: + memcpy(lkey,key,16); + memcpy(lkey+16,key,8); + break; + case 8: + memcpy(lkey,key,8); + memcpy(lkey+8,key,8); + memcpy(lkey+16,key,8); + break; + default: + return -EINVAL; + } + + /* set the correct parity bit for each byte in the key*/ + for(i=0; i<24; i++){ + n1 = lkey[i] & 0xfe; + n2 = n1 ^ (n1 >> 4); + n2 ^= (n2 >> 2); + n2 ^= (n2 >> 1); + lkey[i] = n1 | (~n2 & 0x01); + } + + /* check for degenerate keys */ + if(keybytes > 8 && + (memcmp(lkey,lkey+8,8)==0 || memcmp(lkey+8,lkey+16,8)==0)) + return -2; + + if((status = des_part_set_key(method, lkey)) != 0) + return status; + if((status = des_part_set_key(method+32, lkey+8)) != 0) + return status; + if((status = des_part_set_key(method+64, lkey+16)) != 0) + return status; + + return 0; +} + +static int des_part_set_key(u32 *method, unsigned char *key) +{ + register u32 n, w; + register char * b0, * b1; + char bits0[56], bits1[56]; + + /* check for weak keys */ + b0 = parity; + n = b0[key[0]]; n <<= 4; + n |= b0[key[1]]; n <<= 4; + n |= b0[key[2]]; n <<= 4; + n |= b0[key[3]]; n <<= 4; + n |= b0[key[4]]; n <<= 4; + n |= b0[key[5]]; n <<= 4; + n |= b0[key[6]]; n <<= 4; + n |= b0[key[7]]; + w = 0X88888888L; + if ( !((n - (w >> 3)) & w) ) { /* 1 in 10^10 keys passes this test */ + if ( n < 0X41415151 ) { + if ( n < 0X31312121 ) { + if ( n < 0X14141515 ) { + /* 01 01 01 01 01 01 01 01 */ + if ( n == 0X11111111 ) return -2; + /* 01 1F 01 1F 01 0E 01 0E */ + if ( n == 0X13131212 ) return -2; + } else { + /* 01 E0 01 E0 01 F1 01 F1 */ + if ( n == 0X14141515 ) return -2; + /* 01 FE 01 FE 01 FE 01 FE */ + if ( n == 0X16161616 ) return -2; + } + } else { + if ( n < 0X34342525 ) { + /* 1F 01 1F 01 0E 01 0E 01 */ + if ( n == 0X31312121 ) return -2; + /* 1F 1F 1F 1F 0E 0E 0E 0E */ /* ? */ + if ( n == 0X33332222 ) return -2; + } else { + /* 1F E0 1F E0 0E F1 0E F1 */ + if ( n == 0X34342525 ) return -2; + /* 1F FE 1F FE 0E FE 0E FE */ + if ( n == 0X36362626 ) return -2; + } + } + } else { + if ( n < 0X61616161 ) { + if ( n < 0X44445555 ) { + /* E0 01 E0 01 F1 01 F1 01 */ + if ( n == 0X41415151 ) return -2; + /* E0 1F E0 1F F1 0E F1 0E */ + if ( n == 0X43435252 ) return -2; + } else { + /* E0 E0 E0 E0 F1 F1 F1 F1 */ /* ? */ + if ( n == 0X44445555 ) return -2; + /* E0 FE E0 FE F1 FE F1 FE */ + if ( n == 0X46465656 ) return -2; + } + } else { + if ( n < 0X64646565 ) { + /* FE 01 FE 01 FE 01 FE 01 */ + if ( n == 0X61616161 ) return -2; + /* FE 1F FE 1F FE 0E FE 0E */ + if ( n == 0X63636262 ) return -2; + } else { + /* FE E0 FE E0 FE F1 FE F1 */ + if ( n == 0X64646565 ) return -2; + /* FE FE FE FE FE FE FE FE */ + if ( n == 0X66666666 ) return -2; + } + } + } + } + + /* explode the bits */ + n = 56; + b0 = bits0; + b1 = bits1; + do { + w = (256 | *key++) << 2; + do { + --n; + b1[n] = 8 & w; + w >>= 1; + b0[n] = 4 & w; + } while ( w >= 16 ); + } while ( n ); + + /* put the bits in the correct places */ + n = 16; + key = rotors; + do { + w = (b1[key[ 0 ]] | b0[key[ 1 ]]) << 4; + w |= (b1[key[ 2 ]] | b0[key[ 3 ]]) << 2; + w |= b1[key[ 4 ]] | b0[key[ 5 ]]; + w <<= 8; + w |= (b1[key[ 6 ]] | b0[key[ 7 ]]) << 4; + w |= (b1[key[ 8 ]] | b0[key[ 9 ]]) << 2; + w |= b1[key[10 ]] | b0[key[11 ]]; + w <<= 8; + w |= (b1[key[12 ]] | b0[key[13 ]]) << 4; + w |= (b1[key[14 ]] | b0[key[15 ]]) << 2; + w |= b1[key[16 ]] | b0[key[17 ]]; + w <<= 8; + w |= (b1[key[18 ]] | b0[key[19 ]]) << 4; + w |= (b1[key[20 ]] | b0[key[21 ]]) << 2; + w |= b1[key[22 ]] | b0[key[23 ]]; + + method[0] = w; + + w = (b1[key[ 0+24]] | b0[key[ 1+24]]) << 4; + w |= (b1[key[ 2+24]] | b0[key[ 3+24]]) << 2; + w |= b1[key[ 4+24]] | b0[key[ 5+24]]; + w <<= 8; + w |= (b1[key[ 6+24]] | b0[key[ 7+24]]) << 4; + w |= (b1[key[ 8+24]] | b0[key[ 9+24]]) << 2; + w |= b1[key[10+24]] | b0[key[11+24]]; + w <<= 8; + w |= (b1[key[12+24]] | b0[key[13+24]]) << 4; + w |= (b1[key[14+24]] | b0[key[15+24]]) << 2; + w |= b1[key[16+24]] | b0[key[17+24]]; + w <<= 8; + w |= (b1[key[18+24]] | b0[key[19+24]]) << 4; + w |= (b1[key[20+24]] | b0[key[21+24]]) << 2; + w |= b1[key[22+24]] | b0[key[23+24]]; + + ROR(w, 4, 28); /* could be eliminated */ + method[1] = w; + + key += 48; + method += 2; + } while ( --n ); + return 0; +} + +static void DesSmallFipsEncrypt (DesData d, DesKeys r, DesData s) +{ + register u32 x, y, z; + + x = s [7]; + x <<= 8; + x |= s [6]; + x <<= 8; + x |= s [5]; + x <<= 8; + x |= s [4]; + y = s [3]; + y <<= 8; + y |= s [2]; + y <<= 8; + y |= s [1]; + y <<= 8; + y |= s [0]; + z = ((x >> 004) ^ y) & 0X0F0F0F0FL; + x ^= z << 004; + y ^= z; + z = ((y >> 020) ^ x) & 0X0000FFFFL; + y ^= z << 020; + x ^= z; + z = ((x >> 002) ^ y) & 0X33333333L; + x ^= z << 002; + y ^= z; + z = ((y >> 010) ^ x) & 0X00FF00FFL; + y ^= z << 010; + x ^= z; + x = x >> 1 | x << 31; + z = (x ^ y) & 0X55555555L; + y ^= z; + x ^= z; + y = y >> 1 | y << 31; + z = r [0]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [1]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [2]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [3]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [4]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [5]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [6]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [7]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [8]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [9]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [10]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [11]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [12]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [13]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [14]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [15]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [16]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [17]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [18]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [19]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [20]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [21]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [22]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [23]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [24]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [25]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [26]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [27]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [28]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [29]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [30]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [31]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + x = x << 1 | x >> 31; + z = (x ^ y) & 0X55555555L; + y ^= z; + x ^= z; + y = y << 1 | y >> 31; + z = ((x >> 010) ^ y) & 0X00FF00FFL; + x ^= z << 010; + y ^= z; + z = ((y >> 002) ^ x) & 0X33333333L; + y ^= z << 002; + x ^= z; + z = ((x >> 020) ^ y) & 0X0000FFFFL; + x ^= z << 020; + y ^= z; + z = ((y >> 004) ^ x) & 0X0F0F0F0FL; + y ^= z << 004; + x ^= z; + d [0] = x; + x >>= 8; + d [1] = x; + x >>= 8; + d [2] = x; + x >>= 8; + d [3] = x; + d [4] = y; + y >>= 8; + d [5] = y; + y >>= 8; + d [6] = y; + y >>= 8; + d [7] = y; + return; +} + +static void DesSmallFipsDecrypt (u8 *d, u32 *r, u8 *s) +{ + register u32 x, y, z; + x = s [7]; + x <<= 8; + x |= s [6]; + x <<= 8; + x |= s [5]; + x <<= 8; + x |= s [4]; + y = s [3]; + y <<= 8; + y |= s [2]; + y <<= 8; + y |= s [1]; + y <<= 8; + y |= s [0]; + z = ((x >> 004) ^ y) & 0X0F0F0F0FL; + x ^= z << 004; + y ^= z; + z = ((y >> 020) ^ x) & 0X0000FFFFL; + y ^= z << 020; + x ^= z; + z = ((x >> 002) ^ y) & 0X33333333L; + x ^= z << 002; + y ^= z; + z = ((y >> 010) ^ x) & 0X00FF00FFL; + y ^= z << 010; + x ^= z; + x = x >> 1 | x << 31; + z = (x ^ y) & 0X55555555L; + y ^= z; + x ^= z; + y = y >> 1 | y << 31; + z = r [31]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [30]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [29]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [28]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [27]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [26]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [25]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [24]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [23]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [22]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [21]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [20]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [19]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [18]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [17]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [16]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [15]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [14]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [13]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [12]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [11]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [10]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [9]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [8]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [7]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [6]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [5]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [4]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [3]; + z ^= y; + z = z << 4 | z >> 28; + x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [2]; + z ^= y; + x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + x ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + z = r [1]; + z ^= x; + z = z << 4 | z >> 28; + y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0XFC & z)); + z = r [0]; + z ^= x; + y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0XFC & z)); + z >>= 8; + y ^= * (u32 *) ((u8 *) des_keymap + (0XFC & z)); + x = x << 1 | x >> 31; + z = (x ^ y) & 0X55555555L; + y ^= z; + x ^= z; + y = y << 1 | y >> 31; + z = ((x >> 010) ^ y) & 0X00FF00FFL; + x ^= z << 010; + y ^= z; + z = ((y >> 002) ^ x) & 0X33333333L; + y ^= z << 002; + x ^= z; + z = ((x >> 020) ^ y) & 0X0000FFFFL; + x ^= z << 020; + y ^= z; + z = ((y >> 004) ^ x) & 0X0F0F0F0FL; + y ^= z << 004; + x ^= z; + d [0] = x; + x >>= 8; + d [1] = x; + x >>= 8; + d [2] = x; + x >>= 8; + d [3] = x; + d [4] = y; + y >>= 8; + d [5] = y; + y >>= 8; + d [6] = y; + y >>= 8; + d [7] = y; + return; +} + + +int des_ede3_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size) +{ + u8 input_buffer[8], trans_buffer1[8]; + u8 trans_buffer2[8], output_buffer[8]; + + u32 *key_sched; + + key_sched = cx->keyinfo; + + for (; size >= 8; size -= 8) { + memcpy(&input_buffer, in, 8); + in += 8; + DesSmallFipsEncrypt(trans_buffer1,key_sched,input_buffer); + DesSmallFipsDecrypt(trans_buffer2,key_sched+32,trans_buffer1); + DesSmallFipsEncrypt(output_buffer,key_sched+64,trans_buffer2); + memcpy(out, &output_buffer, 8); + out += 8; + } + return 0; +} + +int des_ede3_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size) +{ + u8 input_buffer[8], trans_buffer1[8]; + u8 trans_buffer2[8], output_buffer[8]; + + u32 *key_sched; + + key_sched = cx->keyinfo; + + for (; size >= 8; size -= 8) { + memcpy(&input_buffer, in, 8); + in += 8; + DesSmallFipsDecrypt(trans_buffer1,key_sched+64,input_buffer); + DesSmallFipsEncrypt(trans_buffer2,key_sched+32,trans_buffer1); + DesSmallFipsDecrypt(output_buffer,key_sched,trans_buffer2); + memcpy(out, &output_buffer, 8); + out += 8; + } + return 0; +} + + +static void des_ede3_lock(void) +{ + MOD_INC_USE_COUNT; +} + +static void des_ede3_unlock(void) +{ + MOD_DEC_USE_COUNT; +} + + +#define CIPHER_BITS_64 +#define CIPHER_NAME(x) des_ede3##x +#include "gen-cbc.h" +#include "gen-ecb.h" + +static struct cipher_implementation des_ede3 = { + {{NULL,NULL},CIPHER_DES_EDE3, "des_ede3"}, + blocksize: 8, + ivsize: 0, + key_schedule_size: DES_EDE3_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_64, + INIT_CIPHER_BLKOPS(des_ede3_ecb), + INIT_CIPHER_OPS(des_ede3) +}; + +static struct cipher_implementation des_ede3_cbc = { + {{NULL,NULL},CIPHER_DES_EDE3 | CIPHER_CBC, "des_ede3-cbc"}, + blocksize: 8, + ivsize: 8, + key_schedule_size: DES_EDE3_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_64 | CIPHER_KEYSIZE_128 | + CIPHER_KEYSIZE_192, + INIT_CIPHER_BLKOPS(des_ede3_cbc), + INIT_CIPHER_OPS(des_ede3) +}; + +#ifdef MODULE +int __init init_module(void) +#else +int __init init_des_ede3(void) +#endif +{ + if (register_cipher(&des_ede3)) + printk(KERN_WARNING "Couldn't register des_ede3 encryption\n"); + if (register_cipher(&des_ede3_cbc)) + printk(KERN_WARNING "Couldn't register des_ede3-cbc encryption\n"); + + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ + if (unregister_cipher(&des_ede3)) + printk(KERN_WARNING "Couldn't unregister des_ede3 encryption\n"); + if (unregister_cipher(&des_ede3_cbc)) + printk(KERN_WARNING "Couldn't unregister des_ede3-cbc encryption\n"); +} +#endif diff -urN lin.2.2.17/crypto/dfc2.c int.2.2.17.x/crypto/dfc2.c --- lin.2.2.17/crypto/dfc2.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/dfc2.c Sat Oct 14 01:03:57 2000 @@ -0,0 +1,485 @@ +/* NOTE: This implementation has been changed from the original + source. See ChangeLog for more information. + Maintained by Alexander Kjeldaas + */ + +/* This is an independent implementation of the DFC encryption */ +/* algorithm designed by a team at CNRS and France Telecom and */ +/* submitted as a candidate in the US NIST Advanced Encryption */ +/* Standard (AES) programme. */ +/* */ +/* Copyright in this implementation is held by Dr B R Gladman but */ +/* I hereby give permission for its free direct or derivative use */ +/* subject to acknowledgment of its origin and compliance with any */ +/* conditions that the originators of DFC place on its use. */ +/* */ +/* My thanks go to Serge Vaudenay of the Ecole Normale Superieure */ +/* for providing test vectors. This implementation has also been */ +/* tested with an independent implementation by Dr Russell Bradford */ +/* (Department of Mathematical Sciences, University of Bath, Bath, */ +/* UK) and checks out. My thanks go to Russell for his help in */ +/* comparing our implementations and finding bugs (and for help in */ +/* resolving 'endian' issues before test vectors became available). */ +/* */ +/* Dr Brian Gladman (gladman@seven77.demon.co.uk) 27th July 1998 */ +/* */ + +/* The EES string is as follows (the abstract contains an error in + the last line of this sequence which changes KC and KD): + + 0xb7e15162, 0x8aed2a6a, 0xbf715880, 0x9cf4f3c7, + 0x62e7160f, 0x38b4da56, 0xa784d904, 0x5190cfef, + 0x324e7738, 0x926cfbe5, 0xf4bf8d8d, 0x8c31d763, + 0xda06c80a, 0xbb1185eb, 0x4f7c7b57, 0x57f59584, + + 0x90cfd47d, 0x7c19bb42, 0x158d9554, 0xf7b46bce, + 0xd55c4d79, 0xfd5f24d6, 0x613c31c3, 0x839a2ddf, + 0x8a9a276b, 0xcfbfa1c8, 0x77c56284, 0xdab79cd4, + 0xc2b3293d, 0x20e9e5ea, 0xf02ac60a, 0xcc93ed87, + + 0x4422a52e, 0xcb238fee, 0xe5ab6add, 0x835fd1a0, + 0x753d0a8f, 0x78e537d2, 0xb95bb79d, 0x8dcaec64, + 0x2c1e9f23, 0xb829b5c2, 0x780bf387, 0x37df8bb3, + 0x00d01334, 0xa0d0bd86, 0x45cbfa73, 0xa6160ffe, + + 0x393c48cb, 0xbbca060f, 0x0ff8ec6d, 0x31beb5cc, + 0xeed7f2f0, 0xbb088017, 0x163bc60d, 0xf45a0ecb, + 0x1bcd289b, 0x06cbbfea, 0x21ad08e1, 0x847f3f73, + 0x78d56ced, 0x94640d6e, 0xf0d3d37b, 0xe67008e1, + + 0x86d1bf27, 0x5b9b241d, 0xeb64749a, 0x47dfdfb9, + + Where: + + EES = RT(0) | RT(1) | ... | RT(63) | KD | KC + + Note that the abstract describing DFC is written + in big endian notation with the most significant + digits of a sequence of digits placed at the low + index positions in arrays. This format is used + here and is only converted to machine format at + the point that maths is done on any numbers in + the round function. + + The key input is thus treated as an array of 32 + bit words numbered from 0..3, 0..5 or 0..7 + depending on key length. The first (leftmost) + bit of this key string as defined in the DFC + abstract is the most significant bit of word 0 + and the rightmost bit of this string is the least + signicant bit of the highest numbered key word. + + The input and output blocks for the cipher are + also treated as arrays of 32 bit words numbered + from 0..3. The most significant bit of word 0 is + the 1st (leftmost) bit of the 128 bit input string + and the least significant bit of word 3 is the + last (rightmost) bit. + + Note that the inputs, the output and the key are + in Intel little endian format when BYTE_SWAP is + defined + +Timing data: + +Algorithm: dfc (dfc2.c) +128 bit key: +Key Setup: 7373 cycles +Encrypt: 1748 cycles = 14.6 mbits/sec +Decrypt: 1755 cycles = 14.6 mbits/sec +Mean: 1752 cycles = 14.6 mbits/sec +192 bit key: +Key Setup: 7359 cycles +Encrypt: 1757 cycles = 14.6 mbits/sec +Decrypt: 1765 cycles = 14.5 mbits/sec +Mean: 1761 cycles = 14.5 mbits/sec +256 bit key: +Key Setup: 7320 cycles +Encrypt: 1750 cycles = 14.6 mbits/sec +Decrypt: 1749 cycles = 14.6 mbits/sec +Mean: 1749 cycles = 14.6 mbits/sec + +*/ + +#include +#include +#include +#include +#include + +#include + +#if 0 +#define rotl rotl32 +#define rotr rotr32 +#else +#define rotl generic_rotl32 +#define rotr generic_rotr32 +#endif + +#define bswap(x) __be32_to_cpu(x) +#define io_swap(x) __cpu_to_be32(x) + +#define BYTE_SWAP + +/* The following arrays are all stored in big endian */ +/* format with 32 bit words at lower array positions */ +/* being more significant in multi-word values */ + +u4byte rt64[64] = +{ + 0xb7e15162, 0x8aed2a6a, 0xbf715880, 0x9cf4f3c7, + 0x62e7160f, 0x38b4da56, 0xa784d904, 0x5190cfef, + 0x324e7738, 0x926cfbe5, 0xf4bf8d8d, 0x8c31d763, + 0xda06c80a, 0xbb1185eb, 0x4f7c7b57, 0x57f59584, + + 0x90cfd47d, 0x7c19bb42, 0x158d9554, 0xf7b46bce, + 0xd55c4d79, 0xfd5f24d6, 0x613c31c3, 0x839a2ddf, + 0x8a9a276b, 0xcfbfa1c8, 0x77c56284, 0xdab79cd4, + 0xc2b3293d, 0x20e9e5ea, 0xf02ac60a, 0xcc93ed87, + + 0x4422a52e, 0xcb238fee, 0xe5ab6add, 0x835fd1a0, + 0x753d0a8f, 0x78e537d2, 0xb95bb79d, 0x8dcaec64, + 0x2c1e9f23, 0xb829b5c2, 0x780bf387, 0x37df8bb3, + 0x00d01334, 0xa0d0bd86, 0x45cbfa73, 0xa6160ffe, + + 0x393c48cb, 0xbbca060f, 0x0ff8ec6d, 0x31beb5cc, + 0xeed7f2f0, 0xbb088017, 0x163bc60d, 0xf45a0ecb, + 0x1bcd289b, 0x06cbbfea, 0x21ad08e1, 0x847f3f73, + 0x78d56ced, 0x94640d6e, 0xf0d3d37b, 0xe67008e1, +}; + +u4byte kc = 0xeb64749a; + +u4byte kd2[2] = +{ + 0x86d1bf27, 0x5b9b241d +}; + +u4byte ka2[6] = +{ + 0xb7e15162, 0x8aed2a6a, + 0xbf715880, 0x9cf4f3c7, + 0x62e7160f, 0x38b4da56, +}; + +u4byte kb2[6] = +{ + 0xa784d904, 0x5190cfef, + 0x324e7738, 0x926cfbe5, + 0xf4bf8d8d, 0x8c31d763, +}; + +u4byte ks8[8] = +{ 0xda06c80a, 0xbb1185eb, 0x4f7c7b57, 0x57f59584, + 0x90cfd47d, 0x7c19bb42, 0x158d9554, 0xf7b46bce, +}; + +#define lo(x) ((x) & 0x0000ffff) +#define hi(x) ((x) >> 16) + +void mult_64(u4byte r[4], const u4byte x[2], const u4byte y[2]) +{ u4byte x0, x1, x2, x3, y0, y1, y2, y3, t0, t1, t2, t3, c; + + x0 = lo(x[1]); x1 = hi(x[1]); x2 = lo(x[0]); x3 = hi(x[0]); + y0 = lo(y[1]); y1 = hi(y[1]); y2 = lo(y[0]); y3 = hi(y[0]); + + t0 = x0 * y0; r[0] = lo(t0); c = hi(t0); + + t0 = x0 * y1; t1 = x1 * y0; c += lo(t0) + lo(t1); + r[0] += (c << 16); c = hi(c) + hi(t0) + hi(t1); + + t0 = x0 * y2; t1 = x1 * y1; t2 = x2 * y0; + c += lo(t0) + lo(t1) + lo(t2); r[1] = lo(c); + c = hi(c) + hi(t0) + hi(t1) + hi(t2); + + t0 = x0 * y3; t1 = x1 * y2; t2 = x2 * y1; t3 = x3 * y0; + c += lo(t0) + lo(t1) + lo(t2) + lo(t3); r[1] += (c << 16); + c = hi(c) + hi(t0) + hi(t1) + hi(t2) + hi(t3); + + t0 = x1 * y3; t1 = x2 * y2; t2 = x3 * y1; + c += lo(t0) + lo(t1) + lo(t2); r[2] = lo(c); + c = hi(c) + hi(t0) + hi(t1) + hi(t2); + + t0 = x2 * y3; t1 = x3 * y2; c += lo(t0) + lo(t1); + r[2] += (c << 16); c = hi(c) + hi(t0) + hi(t1); + + r[3] = c + x3 * y3; +}; + +void add_64(u4byte r[4], const u4byte hi, const u4byte lo) +{ + if((r[0] += lo) < lo) + if(!++r[1]) + if(!++r[2]) + ++r[3]; + + if((r[1] += hi) < hi) + if(!++r[2]) + ++r[3]; +}; + +void mult_13(u4byte r[3]) +{ u4byte c, d; + + c = 13 * lo(r[0]); + d = hi(r[0]); + r[0] = lo(c); + c = hi(c) + 13 * d; + r[0] += (c << 16); + c = hi(c) + 13 * lo(r[1]); + d = hi(r[1]); + r[1] = lo(c); + c = hi(c) + 13 * d; + r[1] += (c << 16); + r[2] = hi(c); +}; + +/* Where necessary this is where conversion from big endian to */ +/* little endian format is performed. Since all the maths is */ +/* little endian care is needed when 64 bit blocks are being */ +/* used to get them in the right order by reversing the order */ +/* in which these are stored. This applies to the key array */ +/* which gives the two values A and B and to the constant KD. */ +/* Since the input and output blocks are big endian we also */ +/* have to invert the order of the 32 bit words in the 64 bit */ +/* blocks being processed. */ + +void r_fun(u4byte outp[2], const u4byte inp[2], const u4byte key[4]) +{ u4byte acc[5], b, t; + + mult_64(acc, inp, key); add_64(acc, key[2], key[3]); + + /* we need the value in the accumulator mod 2^64 + 13 so if */ + /* the accumulator value is hi * 2^64 + lo we need to find */ + /* a k value such that r = hi * 2^64 + lo - k * (2^64 + 13) */ + /* is 0 <= r < 2^64 + 13. We can see that k will be close */ + /* to hi in value - it may equal hi but will not be greater */ + /* and we can let k = hi - e with e >= 0 so that r is given */ + /* by r = e * (2^64 + 13) + lo - 13 * hi. If we compute the */ + /* lo - 13 * hi value, the overflow into the top 64 bits of */ + /* the accumulator has to be 'zeroed' by the e * (2^64 + 13)*/ + /* term and this sets the e value (in fact such an overlow */ + /* is only removed when the lower word is higher than 12). */ + + mult_13(&acc[2]); /* multiply top of accumulator by 13 */ + + /* calculate lo - 13 * hi in acc[0] and acc[1] with any */ + /* overflow into top 64 bits in b */ + + t = acc[0]; acc[0] -= acc[2]; b = (acc[0] > t ? 1 : 0); + + t = acc[1]; acc[1] -= acc[3] + b; + b = (acc[1] > t ? 1 : (acc[1] == t ? b : 0)); + + b = 13 * (acc[4] + b); /* overflow into top 64 bits of acc */ + + if(((acc[0] += b) < b) && !(++acc[1])) + { + if(acc[0] > 12) + + acc[0] -= 13; + } + + /* do the confusion permutation */ + + t = acc[1] ^ kc; b = acc[0] ^ rt64[acc[1] >> 26]; + + b += kd2[0] + ((t += kd2[1]) < kd2[1] ? 1 : 0); + + outp[0] ^= b; outp[1] ^= t; +}; + +int dfc_set_key(struct cipher_context *cx, unsigned char *key, int key_len) +{ u4byte *in_key = (u32 *)key; + /* l_key - storage for the key schedule */ + u4byte *l_key = cx->keyinfo; + u4byte i, lk[32], rk[4]; + key_len *= 8; + + for(i = 0; i < key_len / 32; ++i) + + lk[i] = io_swap(in_key[i]); + + /* pad the key with the KS array */ + + for(i = 0; i < 8 - key_len / 32; ++i) /* K|KS */ + + lk[i + key_len / 32] = ks8[i]; + + /* do the reordering of the key parameters */ + /* the OAP[1]|OBP[1]|OAP[2]... sequence is */ + /* at lk[0]... and the other at lk[16]... */ + + lk[18] = lk[5]; lk[19] = lk[2]; /* EBP */ + lk[16] = lk[1]; lk[17] = lk[6]; /* EAP */ + lk[ 2] = lk[4]; lk[ 3] = lk[3]; /* OBP */ + lk[ 0] = lk[0]; lk[ 1] = lk[7]; /* OAP */ + + /* create other elements using KA and KB */ + + for(i = 0; i < 6; i += 2) + { + lk[i + i + 4] = lk[ 0] ^ ka2[i]; /* OAP[i] ms */ + lk[i + i + 5] = lk[ 1] ^ ka2[i + 1]; /* OAP[i] ls */ + lk[i + i + 6] = lk[ 2] ^ kb2[i]; /* OBP[i] ms */ + lk[i + i + 7] = lk[ 3] ^ kb2[i + 1]; /* OBP[i] ls */ + lk[i + i + 20] = lk[16] ^ ka2[i]; /* EAP[i] ms */ + lk[i + i + 21] = lk[17] ^ ka2[i + 1]; /* EAP[i] ls */ + lk[i + i + 22] = lk[18] ^ kb2[i]; /* EBP[i] ms */ + lk[i + i + 23] = lk[19] ^ kb2[i + 1]; /* EBP[i] ls */ + } + + rk[0] = rk[1] = rk[2] = rk[3] = 0; + + /* do the 4 round key mixing encryption */ + + for(i = 0; i < 32; i += 8) + { + r_fun(rk, rk + 2, lk); /* R2|R1 */ + r_fun(rk + 2, rk, lk + 4); /* R2|R3 */ + r_fun(rk, rk + 2, lk + 8); /* R4|R3 */ + r_fun(rk + 2, rk, lk + 12); /* R4|R5 */ + + /* keep key in big endian format with */ + /* the most significant 32 bit words */ + /* first (lowest) in the key schedule */ + /* - note that the upper and lower 64 */ + /* bit blocks are in inverse order at */ + /* this point in the loop */ + + l_key[i + 0] = rk[2]; l_key[i + 1] = rk[3]; + l_key[i + 2] = rk[0]; l_key[i + 3] = rk[1]; + + r_fun(rk + 2, rk, lk + 16); /* R1|R2 */ + r_fun(rk, rk + 2, lk + 20); /* R3|R2 */ + r_fun(rk + 2, rk, lk + 24); /* R3|R4 */ + r_fun(rk, rk + 2, lk + 28); /* R5|R4 */ + + l_key[i + 4] = rk[0]; l_key[i + 5] = rk[1]; + l_key[i + 6] = rk[2]; l_key[i + 7] = rk[3]; + } + + return 0; +}; + +int dfc_encrypt(struct cipher_context *cx, const u8 *in, u8 *out, int size) +{ u4byte *l_key = cx->keyinfo; + u32 *in_blk = (u32 *)in; + u32 *out_blk = (u32 *)out; + u4byte blk[4]; + + /* the input/output format is big endian - */ + /* any reversals needed are performed when */ + /* maths is done in the round function */ + + blk[0] = io_swap(in_blk[0]); blk[1] = io_swap(in_blk[1]); + blk[2] = io_swap(in_blk[2]); blk[3] = io_swap(in_blk[3]); + + r_fun(blk, blk + 2, l_key + 0); /* R2|R1 */ + r_fun(blk + 2, blk, l_key + 4); /* R2|R3 */ + r_fun(blk, blk + 2, l_key + 8); /* R4|R3 */ + r_fun(blk + 2, blk, l_key + 12); /* R4|R5 */ + r_fun(blk, blk + 2, l_key + 16); /* R6|R5 */ + r_fun(blk + 2, blk, l_key + 20); /* R6|R7 */ + r_fun(blk, blk + 2, l_key + 24); /* R8|R7 */ + r_fun(blk + 2, blk, l_key + 28); /* R8|R9 */ + + /* swap order to obtain the result R9|R8 */ + + out_blk[0] = io_swap(blk[2]); out_blk[1] = io_swap(blk[3]); + out_blk[2] = io_swap(blk[0]); out_blk[3] = io_swap(blk[1]); + return 0; +}; + +int dfc_decrypt(struct cipher_context *cx, const u8 *in, u8 *out, int size) +{ u4byte *l_key = cx->keyinfo; + u32 *in_blk = (u32 *)in; + u32 *out_blk = (u32 *)out; + u4byte blk[4]; + + /* the input/output format is big endian - */ + /* any reversals needed are performed when */ + /* maths is done in the round function */ + + blk[0] = io_swap(in_blk[0]); blk[1] = io_swap(in_blk[1]); + blk[2] = io_swap(in_blk[2]); blk[3] = io_swap(in_blk[3]); + + r_fun(blk, blk + 2, l_key + 28); /* R7|R8 */ + r_fun(blk + 2, blk, l_key + 24); /* R7|R6 */ + r_fun(blk, blk + 2, l_key + 20); /* R5|R6 */ + r_fun(blk + 2, blk, l_key + 16); /* R5|R4 */ + r_fun(blk, blk + 2, l_key + 12); /* R3|R4 */ + r_fun(blk + 2, blk, l_key + 8); /* R3|R2 */ + r_fun(blk, blk + 2, l_key + 4); /* R1|R2 */ + r_fun(blk + 2, blk, l_key ); /* R1|R0 */ + + /* swap order to obtain the result R1|R0 */ + + out_blk[0] = io_swap(blk[2]); out_blk[1] = io_swap(blk[3]); + out_blk[2] = io_swap(blk[0]); out_blk[3] = io_swap(blk[1]); + return 0; +}; + +static void dfc_lock(void) +{ + MOD_INC_USE_COUNT; +} + +static void dfc_unlock(void) +{ + MOD_DEC_USE_COUNT; +} + +#define CIPHER_BITS_128 +#define CIPHER_NAME(x) dfc##x +#include "gen-cbc.h" +#include "gen-ecb.h" + +static struct cipher_implementation dfc = { + {{NULL,NULL},CIPHER_DFC, "dfc"}, + blocksize: 16, + ivsize: 0, + key_schedule_size: DFC_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(dfc_ecb), + INIT_CIPHER_OPS(dfc) +}; + +static struct cipher_implementation dfc_cbc = { + {{NULL,NULL},CIPHER_DFC | CIPHER_CBC, "dfc-cbc"}, + blocksize: 16, + ivsize: 16, + key_schedule_size: DFC_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(dfc_cbc), + INIT_CIPHER_OPS(dfc) +}; + + +#ifdef MODULE + int __init init_module(void) +#else + int __init init_dfc(void) +#endif +{ + if (register_cipher(&dfc)) + printk(KERN_WARNING "Couldn't register dfc encryption\n"); + if (register_cipher(&dfc_cbc)) + printk(KERN_WARNING "Couldn't register dfc-cbc encryption\n"); + + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ + if (unregister_cipher(&dfc)) + printk(KERN_WARNING "Couldn't unregister dfc encryption\n"); + if (unregister_cipher(&dfc_cbc)) + printk(KERN_WARNING "Couldn't unregister dfc-cbc encryption\n"); +} +#endif + diff -urN lin.2.2.17/crypto/gen-cbc.h int.2.2.17.x/crypto/gen-cbc.h --- lin.2.2.17/crypto/gen-cbc.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/gen-cbc.h Mon Oct 16 17:50:51 2000 @@ -0,0 +1,92 @@ + +#include + +#if defined(CIPHER_BITS_128) +# define BS 16 +#else +# define BS 8 +#endif + +/* + * These functions only use the XOR operator on the data, so no + * endianness problems should occur. + */ + +int CIPHER_NAME(_cbc_encrypt)(struct cipher_context *cx, + const u8 *in_blk, u8 *out_blk, int size) +{ + u8 tmp[BS]; + ((u32 *)tmp)[0] = ((u32 *)cx->iv)[0]; + ((u32 *)tmp)[1] = ((u32 *)cx->iv)[1]; +#ifdef CIPHER_BITS_128 + ((u32 *)tmp)[2] = ((u32 *)cx->iv)[2]; + ((u32 *)tmp)[3] = ((u32 *)cx->iv)[3]; +#endif + for (size -= BS; size >= 0; size -= BS) { + ((u32 *)tmp)[0] ^= ((u32 *)in_blk)[0]; + ((u32 *)tmp)[1] ^= ((u32 *)in_blk)[1]; +#ifdef CIPHER_BITS_128 + ((u32 *)tmp)[2] ^= ((u32 *)in_blk)[2]; + ((u32 *)tmp)[3] ^= ((u32 *)in_blk)[3]; +#endif + CIPHER_NAME(_encrypt)(cx, tmp, tmp, BS); + memcpy(out_blk, tmp, sizeof(tmp)); + in_blk += BS; out_blk += BS; + if (current->need_resched) { + schedule(); + } + } + if (size != -BS) { + memset(tmp, 0, sizeof(tmp)); + memcpy(tmp, in_blk, size+BS); + ((u32 *)tmp)[0] ^= ((u32 *)out_blk)[0 - BS/4]; + ((u32 *)tmp)[1] ^= ((u32 *)out_blk)[1 - BS/4]; +#ifdef CIPHER_BITS_128 + ((u32 *)tmp)[2] ^= ((u32 *)out_blk)[2 - BS/4]; + ((u32 *)tmp)[3] ^= ((u32 *)out_blk)[3 - BS/4]; +#endif + CIPHER_NAME(_encrypt)(cx, tmp, out_blk, BS); + } + return 0; +} + +int CIPHER_NAME(_cbc_decrypt)(struct cipher_context *cx, + const u8 *in_blk, u8 *out_blk, int size) +{ + u8 tmp[BS], tmp2[BS]; + ((u32 *)tmp)[0] = ((u32 *)cx->iv)[0]; + ((u32 *)tmp)[1] = ((u32 *)cx->iv)[1]; +#ifdef CIPHER_BITS_128 + ((u32 *)tmp)[2] = ((u32 *)cx->iv)[2]; + ((u32 *)tmp)[3] = ((u32 *)cx->iv)[3]; +#endif + for (size -= BS; size >= 0; size -= BS) { + CIPHER_NAME(_decrypt)(cx, in_blk, out_blk, BS); + ((u32 *)out_blk)[0] ^= ((u32 *)tmp)[0]; + ((u32 *)out_blk)[1] ^= ((u32 *)tmp)[1]; +#ifdef CIPHER_BITS_128 + ((u32 *)out_blk)[2] ^= ((u32 *)tmp)[2]; + ((u32 *)out_blk)[3] ^= ((u32 *)tmp)[3]; +#endif + memcpy(tmp, in_blk, sizeof(tmp)); + in_blk += BS; out_blk += BS; + if (current->need_resched) { + schedule(); + } + } + + if (size != -BS) { + CIPHER_NAME(_decrypt)(cx, in_blk, tmp2, BS); + ((u32 *)tmp2)[0] ^= ((u32 *)tmp)[0]; + ((u32 *)tmp2)[1] ^= ((u32 *)tmp)[1]; +#ifdef CIPHER_BITS_128 + ((u32 *)tmp2)[2] ^= ((u32 *)tmp)[2]; + ((u32 *)tmp2)[3] ^= ((u32 *)tmp)[3]; +#endif + memcpy(out_blk, tmp2, size+BS); + } + return 0; +} + + +#undef BS diff -urN lin.2.2.17/crypto/gen-ecb.h int.2.2.17.x/crypto/gen-ecb.h --- lin.2.2.17/crypto/gen-ecb.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/gen-ecb.h Sat Oct 14 03:01:17 2000 @@ -0,0 +1,48 @@ + +#include + +#if defined(CIPHER_BITS_128) +# define BS 16 +#else +# define BS 8 +#endif + +int CIPHER_NAME(_ecb_encrypt)(struct cipher_context *cx, + const u8 *in_blk, u8 *out_blk, int size) +{ + u8 tmp[BS]; + for (size -= BS; size >= 0; size -= BS) { + CIPHER_NAME(_encrypt)(cx, in_blk, out_blk, BS); + in_blk += BS; out_blk += BS; + if (current->need_resched) { + schedule(); + } + } + if (size != -BS) { + memset(tmp, 0, sizeof(tmp)); + memcpy(tmp, in_blk, size+BS); + CIPHER_NAME(_encrypt)(cx, tmp, out_blk, BS); + } + return 0; +} + +int CIPHER_NAME(_ecb_decrypt)(struct cipher_context *cx, + const u8 *in_blk, u8 *out_blk, int size) +{ + u8 tmp[BS]; + for (size -= BS; size >= 0; size -= BS) { + CIPHER_NAME(_decrypt)(cx, in_blk, out_blk, BS); + in_blk += BS; out_blk += BS; + if (current->need_resched) { + schedule(); + } + } + if (size != -BS) { + CIPHER_NAME(_decrypt)(cx, in_blk, tmp, BS); + memcpy(out_blk, tmp, size+BS); + } + return 0; +} + + +#undef BS diff -urN lin.2.2.17/crypto/idea.c int.2.2.17.x/crypto/idea.c --- lin.2.2.17/crypto/idea.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/idea.c Sat Oct 14 01:04:10 2000 @@ -0,0 +1,414 @@ +/* + * idea.c - C source code for IDEA block cipher. + * IDEA (International Data Encryption Algorithm), formerly known as + * IPES (Improved Proposed Encryption Standard). + * Algorithm developed by Xuejia Lai and James L. Massey, of ETH Zurich. + * This implementation modified and derived from original C code + * developed by Xuejia Lai. + * Zero-based indexing added, names changed from IPES to IDEA. + * CFB functions added. Random number routines added. + * + * Extensively optimized and restructured by Colin Plumb. + * + * There are two adjustments that can be made to this code to + * speed it up. Defaults may be used for PCs. Only the -DIDEA32 + * pays off significantly if selectively set or not set. + * Experiment to see what works best for your machine. + * + * Multiplication: default is inline, -DAVOID_JUMPS uses a + * different version that does not do any conditional + * jumps (a few percent worse on a SPARC), while + * -DSMALL_CACHE takes it out of line to stay + * within a small on-chip code cache. + * Variables: normally, 16-bit variables are used, but some + * machines (notably RISCs) do not have 16-bit registers, + * so they do a great deal of masking. -DIDEA32 uses "int" + * register variables and masks explicitly only where + * necessary. On a SPARC, for example, this boosts + * performace by 30%. + * + * The IDEA(tm) block cipher is covered by patents held by ETH and a + * Swiss company called Ascom-Tech AG. The Swiss patent number is + * PCT/CH91/00117, the European patent number is EP 0 482 154 B1, and + * the U.S. patent number is US005214703. IDEA(tm) is a trademark of + * Ascom-Tech AG. There is no license fee required for noncommercial + * use. Commercial users may obtain licensing details from Dieter + * Profos, Ascom Tech AG, Solothurn Lab, Postfach 151, 4502 Solothurn, + * Switzerland, Tel +41 65 242885, Fax +41 65 235761. + * + * The IDEA block cipher uses a 64-bit block size, and a 128-bit key + * size. It breaks the 64-bit cipher block into four 16-bit words + * because all of the primitive inner operations are done with 16-bit + * arithmetic. It likewise breaks the 128-bit cipher key into eight + * 16-bit words. + * + * For further information on the IDEA cipher, see the book: + * Xuejia Lai, "On the Design and Security of Block Ciphers", + * ETH Series on Information Processing (ed. J.L. Massey) Vol 1, + * Hartung-Gorre Verlag, Konstanz, Switzerland, 1992. ISBN + * 3-89191-573-X. + * + * This code runs on arrays of bytes by taking pairs in big-endian + * order to make the 16-bit words that IDEA uses internally. This + * produces the same result regardless of the byte order of the + * native CPU. + */ + +#include +#include +#include +#include +#include +#include + +#define IDEAKEYSIZE 16 +#define IDEABLOCKSIZE 8 + +#define IDEAROUNDS 8 +#define IDEAKEYLEN (6*IDEAROUNDS+4) + +#define low16(x) ((x) & 0xFFFF) +typedef unsigned char byte; + +typedef struct { + u16 ek[IDEAKEYLEN]; + u16 dk[IDEAKEYLEN]; +} IDEA_context; + +#if defined(__mc68000__) || defined (__sparc__) || defined (__PPC__) \ + || (defined(__mips__) && (defined(MIPSEB) || defined (__MIPSEB__)) ) +#define BIG_ENDIAN_HOST 1 +#else +#define LITTLE_ENDIAN_HOST 1 +#endif + +/* + * Compute the multiplicative inverse of x, modulo 65537, using + * Euclid's algorithm. It is unrolled twice to avoid swapping the + * registers each iteration, and some subtracts of t have been changed + * to adds. + */ +static u16 mulInv(u16 x) +{ + u16 t0, t1; + u16 q, y; + + if (x <= 1) + return x; /* 0 and 1 are self-inverse */ + t1 = 0x10001L / x; /* Since x >= 2, this fits into 16 bits */ + y = 0x10001L % x; + if (y == 1) + return low16(1 - t1); + t0 = 1; + do { + q = x / y; + x = x % y; + t0 += q * t1; + if (x == 1) + return t0; + q = y / x; + y = y % x; + t1 += q * t0; + } while (y != 1); + return low16(1 - t1); +} + +/* + * Expand a 128-bit user key to a working encryption key ek + */ +static void ideaExpandKey(byte const *userkey, u16 * ek) +{ + int i, j; + + for (j = 0; j < 8; j++) { + ek[j] = (userkey[0] << 8) + userkey[1]; + userkey += 2; + } + for (i = 0; j < IDEAKEYLEN; j++) { + i++; + ek[i + 7] = ek[i & 7] << 9 | ek[(i + 1) & 7] >> 7; + ek += i & 8; + i &= 7; + } +} + +/* + * Compute IDEA decryption key dk from an expanded IDEA encryption key + * ek Note that the input and output may be the same. Thus, the key + * is inverted into an internal buffer, and then copied to the output. + */ +static void ideaInvertKey(u16 const *ek, u16 dk[IDEAKEYLEN]) +{ + int i; + u16 t1, t2, t3; + u16 temp[IDEAKEYLEN]; + u16 *p = temp + IDEAKEYLEN; + + t1 = mulInv(*ek++); + t2 = -*ek++; + t3 = -*ek++; + *--p = mulInv(*ek++); + *--p = t3; + *--p = t2; + *--p = t1; + + for (i = 0; i < IDEAROUNDS - 1; i++) { + t1 = *ek++; + *--p = *ek++; + *--p = t1; + + t1 = mulInv(*ek++); + t2 = -*ek++; + t3 = -*ek++; + *--p = mulInv(*ek++); + *--p = t2; + *--p = t3; + *--p = t1; + } + t1 = *ek++; + *--p = *ek++; + *--p = t1; + + t1 = mulInv(*ek++); + t2 = -*ek++; + t3 = -*ek++; + *--p = mulInv(*ek++); + *--p = t3; + *--p = t2; + *--p = t1; + /* Copy and destroy temp copy */ + memcpy(dk, temp, sizeof(temp)); + memset(&temp,0,sizeof(temp)); +} + +/* IDEA encryption/decryption algorithm */ +/* Note that in and out can be the same buffer */ +static void ideaCipher(u16 const inbuf[4], u16 outbuf[4], + u16 const *key) +{ + register u16 x1, x2, x3, x4, s2, s3; + u16 *in, *out; + register u16 t16; /* Temporaries needed by MUL macro */ + register u32 t32; + int r = IDEAROUNDS; +#define MUL(x,y) \ + ((t16 = (y)) ? \ + (x=low16(x)) ? \ + t32 = (u32)x*t16, \ + x = low16(t32), \ + t16 = t32>>16, \ + x = (x-t16)+(x> 8) | (x1 << 8); + x2 = (x2 >> 8) | (x2 << 8); + x3 = (x3 >> 8) | (x3 << 8); + x4 = (x4 >> 8) | (x4 << 8); +#endif + do { + MUL(x1, *key++); + x2 += *key++; + x3 += *key++; + MUL(x4, *key++); + + s3 = x3; + x3 ^= x1; + MUL(x3, *key++); + s2 = x2; + x2 ^= x4; + x2 += x3; + MUL(x2, *key++); + x3 += x2; + + x1 ^= x2; + x4 ^= x3; + + x2 ^= s3; + x3 ^= s2; + } while (--r); + MUL(x1, *key++); + x3 += *key++; + x2 += *key++; + MUL(x4, *key); + + out = (u16 *) outbuf; +#ifdef LITTLE_ENDIAN_HOST + *out++ = x1; + *out++ = x3; + *out++ = x2; + *out = x4; +#else + x1 = low16(x1); + x2 = low16(x2); + x3 = low16(x3); + x4 = low16(x4); + *out++ = (x1 >> 8) | (x1 << 8); + *out++ = (x3 >> 8) | (x3 << 8); + *out++ = (x2 >> 8) | (x2 << 8); + *out = (x4 >> 8) | (x4 << 8); +#endif +} + +int idea_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size) +{ + IDEA_context *c=(IDEA_context *)cx->keyinfo; + + u16 input_buffer[4]; + u16 output_buffer[4]; + u32 *in_blk = (u32 *)in; + u32 *out_blk = (u32 *)out; + u32 n; + + for (; size >= 8; size -= 8) + { + n=*in_blk++; + input_buffer[0]=n & 0xffff; + n=n>>16; + input_buffer[1]=n & 0xffff; + + n=*in_blk++; + input_buffer[2]=n & 0xffff; + n=n>>16; + input_buffer[3]=n & 0xffff; + + ideaCipher( input_buffer,output_buffer, c->ek ); + + n=0; + n|=output_buffer[1]; + n=n<<16; + n|=output_buffer[0]; + + *out_blk++=n; + + n=0; + n|=output_buffer[3]; + n=n<<16; + n|=output_buffer[2]; + + *out_blk++=n; + } + return 0; +} + +int idea_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size) +{ + IDEA_context *c=(IDEA_context *)cx->keyinfo; + + u16 input_buffer[8]; + u16 output_buffer[8]; + u32 *in_blk = (u32 *)in; + u32 *out_blk = (u32 *)out; + u32 n; + + for (; size >= 8; size -= 8) + { + n=*in_blk++; + input_buffer[0]=n & 0xffff; + n=n>>16; + input_buffer[1]=n & 0xffff; + + n=*in_blk++; + input_buffer[2]=n & 0xffff; + n=n>>16; + input_buffer[3]=n & 0xffff; + + ideaCipher( input_buffer,output_buffer, c->dk ); + + n=0; + n|=output_buffer[1]; + n=n<<16; + n|=output_buffer[0]; + + *out_blk++=n; + + n=0; + n|=output_buffer[3]; + n=n<<16; + n|=output_buffer[2]; + + *out_blk++=n; + } + return 0; +} + +int idea_set_key(struct cipher_context *cx, + unsigned char *key, int keybytes) +{ + IDEA_context *c=(IDEA_context *)cx->keyinfo; + + if(keybytes != 16) + return -EINVAL; + + ideaExpandKey(key, c->ek); + ideaInvertKey(c->ek, c->dk); + return 0; +} + +static void idea_lock(void) +{ + MOD_INC_USE_COUNT; +} + +static void idea_unlock(void) +{ + MOD_DEC_USE_COUNT; +} + +#define CIPHER_BITS_64 +#define CIPHER_NAME(x) idea##x +#include "gen-cbc.h" +#include "gen-ecb.h" + +static struct cipher_implementation idea = { + {{NULL,NULL},CIPHER_IDEA, "idea"}, + blocksize: 8, + ivsize: 0, + key_schedule_size: IDEA_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128, + INIT_CIPHER_BLKOPS(idea_ecb), + INIT_CIPHER_OPS(idea) +}; + +static struct cipher_implementation idea_cbc = { + {{NULL,NULL},CIPHER_IDEA | CIPHER_CBC, "idea-cbc"}, + blocksize: 8, + ivsize: 8, + key_schedule_size: IDEA_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128, + INIT_CIPHER_BLKOPS(idea_cbc), + INIT_CIPHER_OPS(idea) +}; + +#ifdef MODULE +int __init init_module(void) +#else +int __init init_idea(void) +#endif +{ + if (register_cipher(&idea)) + printk(KERN_WARNING "Couldn't register idea encryption\n"); + if (register_cipher(&idea_cbc)) + printk(KERN_WARNING "Couldn't register idea-cbc encryption\n"); + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ + if (unregister_cipher(&idea)) + printk(KERN_WARNING "Couldn't unregister idea encryption\n"); + if (unregister_cipher(&idea_cbc)) + printk(KERN_WARNING "Couldn't unregister idea-cbc encryption\n"); +} +#endif diff -urN lin.2.2.17/crypto/mars6.c int.2.2.17.x/crypto/mars6.c --- lin.2.2.17/crypto/mars6.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/mars6.c Sat Oct 14 01:01:12 2000 @@ -0,0 +1,475 @@ +/* NOTE: This implementation has been changed from the original + source. See ChangeLog for more information. + Maintained by Alexander Kjeldaas + Oops.. this isn't reentrant yet. + */ + +/* This is an independent implementation of the MARS encryption */ +/* algorithm designed by a team at IBM as a candidate for the US */ +/* NIST Advanced Encryption Standard (AES) effort. The algorithm */ +/* is subject to Patent action by IBM, who intend to offer royalty */ +/* free use if a Patent is granted. */ +/* */ +/* Copyright in this implementation is held by Dr B R Gladman but */ +/* I hereby give permission for its free direct or derivative use */ +/* subject to acknowledgment of its origin and compliance with any */ +/* constraints that IBM place on the use of the MARS algorithm. */ +/* */ +/* Dr Brian Gladman (gladman@seven77.demon.co.uk) 4th October 1998 */ +/* */ +/* Timing data: + +Algorithm: mars (mars6.c) +128 bit key: +Key Setup: 4329 cycles +Encrypt: 383 cycles = 66.8 mbits/sec +Decrypt: 374 cycles = 68.4 mbits/sec +Mean: 379 cycles = 67.6 mbits/sec +192 bit key: +Key Setup: 4414 cycles +Encrypt: 379 cycles = 67.5 mbits/sec +Decrypt: 382 cycles = 67.0 mbits/sec +Mean: 381 cycles = 67.3 mbits/sec +256 bit key: +Key Setup: 4351 cycles +Encrypt: 387 cycles = 66.2 mbits/sec +Decrypt: 367 cycles = 69.8 mbits/sec +Mean: 377 cycles = 68.0 mbits/sec + +*/ + +#include +#include +#include +#include +#include + +#if 0 +#define rotl rotl32 +#define rotr rotr32 +#else +#define rotl generic_rotl32 +#define rotr generic_rotr32 +#endif + +static u4byte s_box[] = +{ + 0x09d0c479, 0x28c8ffe0, 0x84aa6c39, 0x9dad7287, /* 0x000 */ + 0x7dff9be3, 0xd4268361, 0xc96da1d4, 0x7974cc93, + 0x85d0582e, 0x2a4b5705, 0x1ca16a62, 0xc3bd279d, + 0x0f1f25e5, 0x5160372f, 0xc695c1fb, 0x4d7ff1e4, + 0xae5f6bf4, 0x0d72ee46, 0xff23de8a, 0xb1cf8e83, /* 0x010 */ + 0xf14902e2, 0x3e981e42, 0x8bf53eb6, 0x7f4bf8ac, + 0x83631f83, 0x25970205, 0x76afe784, 0x3a7931d4, + 0x4f846450, 0x5c64c3f6, 0x210a5f18, 0xc6986a26, + 0x28f4e826, 0x3a60a81c, 0xd340a664, 0x7ea820c4, /* 0x020 */ + 0x526687c5, 0x7eddd12b, 0x32a11d1d, 0x9c9ef086, + 0x80f6e831, 0xab6f04ad, 0x56fb9b53, 0x8b2e095c, + 0xb68556ae, 0xd2250b0d, 0x294a7721, 0xe21fb253, + 0xae136749, 0xe82aae86, 0x93365104, 0x99404a66, /* 0x030 */ + 0x78a784dc, 0xb69ba84b, 0x04046793, 0x23db5c1e, + 0x46cae1d6, 0x2fe28134, 0x5a223942, 0x1863cd5b, + 0xc190c6e3, 0x07dfb846, 0x6eb88816, 0x2d0dcc4a, + 0xa4ccae59, 0x3798670d, 0xcbfa9493, 0x4f481d45, /* 0x040 */ + 0xeafc8ca8, 0xdb1129d6, 0xb0449e20, 0x0f5407fb, + 0x6167d9a8, 0xd1f45763, 0x4daa96c3, 0x3bec5958, + 0xababa014, 0xb6ccd201, 0x38d6279f, 0x02682215, + 0x8f376cd5, 0x092c237e, 0xbfc56593, 0x32889d2c, /* 0x050 */ + 0x854b3e95, 0x05bb9b43, 0x7dcd5dcd, 0xa02e926c, + 0xfae527e5, 0x36a1c330, 0x3412e1ae, 0xf257f462, + 0x3c4f1d71, 0x30a2e809, 0x68e5f551, 0x9c61ba44, + 0x5ded0ab8, 0x75ce09c8, 0x9654f93e, 0x698c0cca, /* 0x060 */ + 0x243cb3e4, 0x2b062b97, 0x0f3b8d9e, 0x00e050df, + 0xfc5d6166, 0xe35f9288, 0xc079550d, 0x0591aee8, + 0x8e531e74, 0x75fe3578, 0x2f6d829a, 0xf60b21ae, + 0x95e8eb8d, 0x6699486b, 0x901d7d9b, 0xfd6d6e31, /* 0x070 */ + 0x1090acef, 0xe0670dd8, 0xdab2e692, 0xcd6d4365, + 0xe5393514, 0x3af345f0, 0x6241fc4d, 0x460da3a3, + 0x7bcf3729, 0x8bf1d1e0, 0x14aac070, 0x1587ed55, + 0x3afd7d3e, 0xd2f29e01, 0x29a9d1f6, 0xefb10c53, /* 0x080 */ + 0xcf3b870f, 0xb414935c, 0x664465ed, 0x024acac7, + 0x59a744c1, 0x1d2936a7, 0xdc580aa6, 0xcf574ca8, + 0x040a7a10, 0x6cd81807, 0x8a98be4c, 0xaccea063, + 0xc33e92b5, 0xd1e0e03d, 0xb322517e, 0x2092bd13, /* 0x090 */ + 0x386b2c4a, 0x52e8dd58, 0x58656dfb, 0x50820371, + 0x41811896, 0xe337ef7e, 0xd39fb119, 0xc97f0df6, + 0x68fea01b, 0xa150a6e5, 0x55258962, 0xeb6ff41b, + 0xd7c9cd7a, 0xa619cd9e, 0xbcf09576, 0x2672c073, /* 0x0a0 */ + 0xf003fb3c, 0x4ab7a50b, 0x1484126a, 0x487ba9b1, + 0xa64fc9c6, 0xf6957d49, 0x38b06a75, 0xdd805fcd, + 0x63d094cf, 0xf51c999e, 0x1aa4d343, 0xb8495294, + 0xce9f8e99, 0xbffcd770, 0xc7c275cc, 0x378453a7, /* 0x0b0 */ + 0x7b21be33, 0x397f41bd, 0x4e94d131, 0x92cc1f98, + 0x5915ea51, 0x99f861b7, 0xc9980a88, 0x1d74fd5f, + 0xb0a495f8, 0x614deed0, 0xb5778eea, 0x5941792d, + 0xfa90c1f8, 0x33f824b4, 0xc4965372, 0x3ff6d550, /* 0x0c0 */ + 0x4ca5fec0, 0x8630e964, 0x5b3fbbd6, 0x7da26a48, + 0xb203231a, 0x04297514, 0x2d639306, 0x2eb13149, + 0x16a45272, 0x532459a0, 0x8e5f4872, 0xf966c7d9, + 0x07128dc0, 0x0d44db62, 0xafc8d52d, 0x06316131, /* 0x0d0 */ + 0xd838e7ce, 0x1bc41d00, 0x3a2e8c0f, 0xea83837e, + 0xb984737d, 0x13ba4891, 0xc4f8b949, 0xa6d6acb3, + 0xa215cdce, 0x8359838b, 0x6bd1aa31, 0xf579dd52, + 0x21b93f93, 0xf5176781, 0x187dfdde, 0xe94aeb76, /* 0x0e0 */ + 0x2b38fd54, 0x431de1da, 0xab394825, 0x9ad3048f, + 0xdfea32aa, 0x659473e3, 0x623f7863, 0xf3346c59, + 0xab3ab685, 0x3346a90b, 0x6b56443e, 0xc6de01f8, + 0x8d421fc0, 0x9b0ed10c, 0x88f1a1e9, 0x54c1f029, /* 0x0f0 */ + 0x7dead57b, 0x8d7ba426, 0x4cf5178a, 0x551a7cca, + 0x1a9a5f08, 0xfcd651b9, 0x25605182, 0xe11fc6c3, + 0xb6fd9676, 0x337b3027, 0xb7c8eb14, 0x9e5fd030, + + 0x6b57e354, 0xad913cf7, 0x7e16688d, 0x58872a69, /* 0x100 */ + 0x2c2fc7df, 0xe389ccc6, 0x30738df1, 0x0824a734, + 0xe1797a8b, 0xa4a8d57b, 0x5b5d193b, 0xc8a8309b, + 0x73f9a978, 0x73398d32, 0x0f59573e, 0xe9df2b03, + 0xe8a5b6c8, 0x848d0704, 0x98df93c2, 0x720a1dc3, /* 0x110 */ + 0x684f259a, 0x943ba848, 0xa6370152, 0x863b5ea3, + 0xd17b978b, 0x6d9b58ef, 0x0a700dd4, 0xa73d36bf, + 0x8e6a0829, 0x8695bc14, 0xe35b3447, 0x933ac568, + 0x8894b022, 0x2f511c27, 0xddfbcc3c, 0x006662b6, /* 0x120 */ + 0x117c83fe, 0x4e12b414, 0xc2bca766, 0x3a2fec10, + 0xf4562420, 0x55792e2a, 0x46f5d857, 0xceda25ce, + 0xc3601d3b, 0x6c00ab46, 0xefac9c28, 0xb3c35047, + 0x611dfee3, 0x257c3207, 0xfdd58482, 0x3b14d84f, /* 0x130 */ + 0x23becb64, 0xa075f3a3, 0x088f8ead, 0x07adf158, + 0x7796943c, 0xfacabf3d, 0xc09730cd, 0xf7679969, + 0xda44e9ed, 0x2c854c12, 0x35935fa3, 0x2f057d9f, + 0x690624f8, 0x1cb0bafd, 0x7b0dbdc6, 0x810f23bb, /* 0x140 */ + 0xfa929a1a, 0x6d969a17, 0x6742979b, 0x74ac7d05, + 0x010e65c4, 0x86a3d963, 0xf907b5a0, 0xd0042bd3, + 0x158d7d03, 0x287a8255, 0xbba8366f, 0x096edc33, + 0x21916a7b, 0x77b56b86, 0x951622f9, 0xa6c5e650, /* 0x150 */ + 0x8cea17d1, 0xcd8c62bc, 0xa3d63433, 0x358a68fd, + 0x0f9b9d3c, 0xd6aa295b, 0xfe33384a, 0xc000738e, + 0xcd67eb2f, 0xe2eb6dc2, 0x97338b02, 0x06c9f246, + 0x419cf1ad, 0x2b83c045, 0x3723f18a, 0xcb5b3089, /* 0x160 */ + 0x160bead7, 0x5d494656, 0x35f8a74b, 0x1e4e6c9e, + 0x000399bd, 0x67466880, 0xb4174831, 0xacf423b2, + 0xca815ab3, 0x5a6395e7, 0x302a67c5, 0x8bdb446b, + 0x108f8fa4, 0x10223eda, 0x92b8b48b, 0x7f38d0ee, /* 0x170 */ + 0xab2701d4, 0x0262d415, 0xaf224a30, 0xb3d88aba, + 0xf8b2c3af, 0xdaf7ef70, 0xcc97d3b7, 0xe9614b6c, + 0x2baebff4, 0x70f687cf, 0x386c9156, 0xce092ee5, + 0x01e87da6, 0x6ce91e6a, 0xbb7bcc84, 0xc7922c20, /* 0x180 */ + 0x9d3b71fd, 0x060e41c6, 0xd7590f15, 0x4e03bb47, + 0x183c198e, 0x63eeb240, 0x2ddbf49a, 0x6d5cba54, + 0x923750af, 0xf9e14236, 0x7838162b, 0x59726c72, + 0x81b66760, 0xbb2926c1, 0x48a0ce0d, 0xa6c0496d, /* 0x190 */ + 0xad43507b, 0x718d496a, 0x9df057af, 0x44b1bde6, + 0x054356dc, 0xde7ced35, 0xd51a138b, 0x62088cc9, + 0x35830311, 0xc96efca2, 0x686f86ec, 0x8e77cb68, + 0x63e1d6b8, 0xc80f9778, 0x79c491fd, 0x1b4c67f2, /* 0x1a0 */ + 0x72698d7d, 0x5e368c31, 0xf7d95e2e, 0xa1d3493f, + 0xdcd9433e, 0x896f1552, 0x4bc4ca7a, 0xa6d1baf4, + 0xa5a96dcc, 0x0bef8b46, 0xa169fda7, 0x74df40b7, + 0x4e208804, 0x9a756607, 0x038e87c8, 0x20211e44, /* 0x1b0 */ + 0x8b7ad4bf, 0xc6403f35, 0x1848e36d, 0x80bdb038, + 0x1e62891c, 0x643d2107, 0xbf04d6f8, 0x21092c8c, + 0xf644f389, 0x0778404e, 0x7b78adb8, 0xa2c52d53, + 0x42157abe, 0xa2253e2e, 0x7bf3f4ae, 0x80f594f9, /* 0x1c0 */ + 0x953194e7, 0x77eb92ed, 0xb3816930, 0xda8d9336, + 0xbf447469, 0xf26d9483, 0xee6faed5, 0x71371235, + 0xde425f73, 0xb4e59f43, 0x7dbe2d4e, 0x2d37b185, + 0x49dc9a63, 0x98c39d98, 0x1301c9a2, 0x389b1bbf, /* 0x1d0 */ + 0x0c18588d, 0xa421c1ba, 0x7aa3865c, 0x71e08558, + 0x3c5cfcaa, 0x7d239ca4, 0x0297d9dd, 0xd7dc2830, + 0x4b37802b, 0x7428ab54, 0xaeee0347, 0x4b3fbb85, + 0x692f2f08, 0x134e578e, 0x36d9e0bf, 0xae8b5fcf, /* 0x1e0 */ + 0xedb93ecf, 0x2b27248e, 0x170eb1ef, 0x7dc57fd6, + 0x1e760f16, 0xb1136601, 0x864e1b9b, 0xd7ea7319, + 0x3ab871bd, 0xcfa4d76f, 0xe31bd782, 0x0dbeb469, + 0xabb96061, 0x5370f85d, 0xffb07e37, 0xda30d0fb, /* 0x1f0 */ + 0xebc977b6, 0x0b98b40f, 0x3a4d0fe6, 0xdf4fc26b, + 0x159cf22a, 0xc298d6e2, 0x2b78ef6a, 0x61a94ac0, + 0xab561187, 0x14eea0f0, 0xdf0d4164, 0x19af70ee +}; + +static u4byte vk[47] = +{ + 0x09d0c479, 0x28c8ffe0, 0x84aa6c39, 0x9dad7287, 0x7dff9be3, 0xd4268361, + 0xc96da1d4 +}; + +#define f_mix(a,b,c,d) \ + r = rotr(a, 8); \ + b ^= s_box[a & 255]; \ + b += s_box[(r & 255) + 256]; \ + r = rotr(a, 16); \ + a = rotr(a, 24); \ + c += s_box[r & 255]; \ + d ^= s_box[(a & 255) + 256] + +#define b_mix(a,b,c,d) \ + r = rotl(a, 8); \ + b ^= s_box[(a & 255) + 256]; \ + c -= s_box[r & 255]; \ + r = rotl(a, 16); \ + a = rotl(a, 24); \ + d -= s_box[(r & 255) + 256]; \ + d ^= s_box[a & 255] + +#define f_ktr(a,b,c,d,i) \ + m = a + l_key[i]; \ + a = rotl(a, 13); \ + r = a * l_key[i + 1]; \ + l = s_box[m & 511]; \ + r = rotl(r, 5); \ + c += rotl(m, r); \ + l ^= r; \ + r = rotl(r, 5); \ + l ^= r; \ + d ^= r; \ + b += rotl(l, r) + +#define r_ktr(a,b,c,d,i) \ + r = a * l_key[i + 1]; \ + a = rotr(a, 13); \ + m = a + l_key[i]; \ + l = s_box[m & 511]; \ + r = rotl(r, 5); \ + l ^= r; \ + c -= rotl(m, r); \ + r = rotl(r, 5); \ + l ^= r; \ + d ^= r; \ + b -= rotl(l, r) + +/* For a 32 bit word (x) generate a mask (m) such that a bit in */ +/* m is set to 1 if and only if the corresponding bit in x is: */ +/* */ +/* 1. in a sequence of 10 or more adjacent '0' bits */ +/* 2. in a sequence of 10 or more adjacent '1' bits */ +/* 3. but is not either endpoint of such a sequence unless such */ +/* an endpoint is at the top bit (bit 31) of a word and is */ +/* in a sequence of '0' bits. */ +/* */ +/* The only situation in which a sequence endpoint is included */ +/* in the mask is hence when the endpoint is at bit 31 and is */ +/* the endpoint of a sequence of '0' bits. My thanks go to Shai */ +/* Halevi of IBM for the neat trick (which I missed) of finding */ +/* the '0' and '1' sequences at the same time. */ + +u4byte gen_mask(u4byte x) +{ u4byte m; + + /* if m{bn} stands for bit number bn of m, set m{bn} = 1 if */ + /* x{bn} == x{bn+1} for 0 <= bn <= 30. That is, set a bit */ + /* in m if the corresponding bit and the next higher bit in */ + /* x are equal in value (set m{31} = 0). */ + + m = (~x ^ (x >> 1)) & 0x7fffffff; + + /* Sequences of 9 '1' bits in m now correspond to sequences */ + /* of 10 '0's or 10 '1' bits in x. Shift and 'and' bits in */ + /* m to find sequences of 9 or more '1' bits. As a result */ + /* bits in m are set if they are at the bottom of sequences */ + /* of 10 adjacent '0's or 10 adjacent '1's in x. */ + + m &= (m >> 1) & (m >> 2); m &= (m >> 3) & (m >> 6); + + if(!m) /* return if mask is empty - no key fixing needed */ + /* is this early return worthwhile? */ + return 0; + + /* We need the internal bits in each continuous sequence of */ + /* matching bits (that is the bits less the two endpoints). */ + /* We thus propagate each set bit into the 8 internal bits */ + /* that it represents, starting 1 left and finsihing 8 left */ + /* of its position. */ + + m <<= 1; m |= (m << 1); m |= (m << 2); m |= (m << 4); + + /* m is now correct except for the odd behaviour of bit 31, */ + /* that is, it will be set if it is in a sequence of 10 or */ + /* more '0's and clear otherwise. */ + + m |= (m << 1) & ~x & 0x80000000; + + return m & 0xfffffffc; +}; + + +/* My thanks to Louis Granboulan for spotting an error in the */ +/* previous version of set_key. */ + +int mars_set_key(struct cipher_context *cx, unsigned char *key, int key_len) +{ + u4byte *in_key = (u32 *)key; + u4byte *l_key = cx->keyinfo; + u4byte i, j, m, u, w; + key_len *= 8; + + m = key_len / 32 - 1; + + for(i = j = 0; i < 39; ++i) + { + vk[i + 7] = rotl(vk[i] ^ vk[i + 5], 3) ^ in_key[j] ^ i; + j = (j == m ? 0 : j + 1); + } + + vk[46] = key_len / 32; + + for(j = 0; j < 7; ++j) + { + for(i = 1; i < 40; ++i) + vk[i+7] = rotl(vk[i + 7] + s_box[vk[i + 6] & 511], 9); + + vk[7] = rotl(vk[7] + s_box[vk[46] & 511], 9); + } + + for(i = j = 0; i < 40; ++i) + { + l_key[j] = vk[i + 7]; + + j = (j < 33 ? j + 7 : j - 33); + } + + for(i = 5; i < 37; i += 2) + { + w = l_key[i] | 3; + + if((m = gen_mask(w))) + w ^= (rotl(s_box[265 + (l_key[i] & 3)], l_key[i + 3] & 31) & m); + l_key[i] = w; + } + + return 0; +}; + +int mars_encrypt(struct cipher_context *cx, const u8 *in, u8 *out, int size) +{ u4byte *l_key = cx->keyinfo; + u4byte *in_blk = (u4byte *)in; + u4byte *out_blk = (u4byte *)out; + u4byte a, b, c, d, l, m, r; + + a = in_blk[0] + l_key[0]; b = in_blk[1] + l_key[1]; + c = in_blk[2] + l_key[2]; d = in_blk[3] + l_key[3]; + + f_mix(a,b,c,d); a += d; + f_mix(b,c,d,a); b += c; + f_mix(c,d,a,b); + f_mix(d,a,b,c); + f_mix(a,b,c,d); a += d; + f_mix(b,c,d,a); b += c; + f_mix(c,d,a,b); + f_mix(d,a,b,c); + + f_ktr(a,b,c,d, 4); f_ktr(b,c,d,a, 6); f_ktr(c,d,a,b, 8); f_ktr(d,a,b,c,10); + f_ktr(a,b,c,d,12); f_ktr(b,c,d,a,14); f_ktr(c,d,a,b,16); f_ktr(d,a,b,c,18); + f_ktr(a,d,c,b,20); f_ktr(b,a,d,c,22); f_ktr(c,b,a,d,24); f_ktr(d,c,b,a,26); + f_ktr(a,d,c,b,28); f_ktr(b,a,d,c,30); f_ktr(c,b,a,d,32); f_ktr(d,c,b,a,34); + + b_mix(a,b,c,d); + b_mix(b,c,d,a); c -= b; + b_mix(c,d,a,b); d -= a; + b_mix(d,a,b,c); + b_mix(a,b,c,d); + b_mix(b,c,d,a); c -= b; + b_mix(c,d,a,b); d -= a; + b_mix(d,a,b,c); + + out_blk[0] = a - l_key[36]; out_blk[1] = b - l_key[37]; + out_blk[2] = c - l_key[38]; out_blk[3] = d - l_key[39]; + return 0; +}; + +int mars_decrypt(struct cipher_context *cx, const u8 *in, u8 *out, int size) +{ u4byte *l_key = cx->keyinfo; + u4byte *in_blk = (u4byte *)in; + u4byte *out_blk = (u4byte *)out; + u4byte a, b, c, d, l, m, r; + + d = in_blk[0] + l_key[36]; c = in_blk[1] + l_key[37]; + b = in_blk[2] + l_key[38]; a = in_blk[3] + l_key[39]; + + f_mix(a,b,c,d); a += d; + f_mix(b,c,d,a); b += c; + f_mix(c,d,a,b); + f_mix(d,a,b,c); + f_mix(a,b,c,d); a += d; + f_mix(b,c,d,a); b += c; + f_mix(c,d,a,b); + f_mix(d,a,b,c); + + r_ktr(a,b,c,d,34); r_ktr(b,c,d,a,32); r_ktr(c,d,a,b,30); r_ktr(d,a,b,c,28); + r_ktr(a,b,c,d,26); r_ktr(b,c,d,a,24); r_ktr(c,d,a,b,22); r_ktr(d,a,b,c,20); + r_ktr(a,d,c,b,18); r_ktr(b,a,d,c,16); r_ktr(c,b,a,d,14); r_ktr(d,c,b,a,12); + r_ktr(a,d,c,b,10); r_ktr(b,a,d,c, 8); r_ktr(c,b,a,d, 6); r_ktr(d,c,b,a, 4); + + b_mix(a,b,c,d); + b_mix(b,c,d,a); c -= b; + b_mix(c,d,a,b); d -= a; + b_mix(d,a,b,c); + b_mix(a,b,c,d); + b_mix(b,c,d,a); c -= b; + b_mix(c,d,a,b); d -= a; + b_mix(d,a,b,c); + + out_blk[0] = d - l_key[0]; out_blk[1] = c - l_key[1]; + out_blk[2] = b - l_key[2]; out_blk[3] = a - l_key[3]; + return 0; +} + +static void mars_lock(void) +{ + MOD_INC_USE_COUNT; +} + +static void mars_unlock(void) +{ + MOD_DEC_USE_COUNT; +} + +#define CIPHER_BITS_128 +#define CIPHER_NAME(x) mars##x +#include "gen-cbc.h" +#include "gen-ecb.h" + +static struct cipher_implementation mars = { + {{NULL,NULL},CIPHER_MARS, "mars"}, + blocksize: 16, + ivsize: 0, + key_schedule_size: MARS_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(mars_ecb), + INIT_CIPHER_OPS(mars) +}; + +static struct cipher_implementation mars_cbc = { + {{NULL,NULL},CIPHER_MARS | CIPHER_CBC, "mars-cbc"}, + blocksize: 16, + ivsize: 16, + key_schedule_size: MARS_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(mars_cbc), + INIT_CIPHER_OPS(mars) +}; + + +#ifdef MODULE + int __init init_module(void) +#else + int __init init_mars(void) +#endif +{ + if (register_cipher(&mars)) + printk(KERN_WARNING "Couldn't register mars encryption\n"); + if (register_cipher(&mars_cbc)) + printk(KERN_WARNING "Couldn't register mars-cbc encryption\n"); + + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ + if (unregister_cipher(&mars)) + printk(KERN_WARNING "Couldn't unregister mars encryption\n"); + if (unregister_cipher(&mars_cbc)) + printk(KERN_WARNING "Couldn't unregister mars-cbc encryption\n"); +} +#endif + diff -urN lin.2.2.17/crypto/md5.h int.2.2.17.x/crypto/md5.h --- lin.2.2.17/crypto/md5.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/md5.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,56 @@ +/* md5.h - header file for md5c.c + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" without + express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. +*/ + + +#ifndef _CRYPTO_MD5_H +#define _CRYPTO_MD5_H + +/* MD5 context. */ +struct MD5_CTX { + u32 state[4]; /* state (ABCD) */ + u32 count[2]; /* number of bits, modulo 2^64 (lsb first) */ + unsigned char buffer[64]; /* input buffer */ +}; + +typedef struct MD5_CTX MD5_CTX; + +void MD5Init (struct MD5_CTX *); +void MD5Update (struct MD5_CTX *, unsigned char *, unsigned int); +void MD5Final (unsigned char x[16], struct MD5_CTX *); + +#endif /* _CRYPTO_MD5_H */ + + + + + + + + + + + + + diff -urN lin.2.2.17/crypto/md5c.c int.2.2.17.x/crypto/md5c.c --- lin.2.2.17/crypto/md5c.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/md5c.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,320 @@ +/* The MD5 implementation below was modified by Alexander Kjeldaas + 1999-09-15 for readability purposes, and for + inclusion into the Linux kernel */ + +/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + */ + +#include +#include +#include +#include +#include "md5.h" + + +/* Start of Linux Kernel port */ +typedef u32 UINT4; +typedef u8 *POINTER; +#define PROTO_LIST(x) x +#define MD5_memcpy memcpy +#define MD5_memset memset + +/* Encodes input (UINT4) into output (unsigned char). Assumes len is + a multiple of 4. + */ +#ifdef __LITTLE_ENDIAN +#define Encode memcpy +#define Decode memcpy +#else +static void Encode (unsigned char *output, + UINT4 *input, + unsigned int len) +{ + unsigned int i; + UINT4 *out = (UINT4 *)output; + len <<= 2; + + for (i = 0; i < len; i++) { + out[i] = cpu_to_le32(input[i]); + } +} + +/* Decodes input (unsigned char) into output (UINT4). Assumes len is + a multiple of 4. + */ +static void Decode (UINT4 *output, + unsigned char *input, + unsigned int len) +{ + unsigned int i; + UINT4 *in = (UINT4 *)input; + len <<= 2; + + for (i = 0; i < len; i++) { + output[i] = le32_to_cpu(in[i]); + } +} + +#endif /* __LITTLE_ENDIAN */ +/* End of Linux Kernel port */ + + +/* Constants for MD5Transform routine. + */ +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64])); + +static unsigned char PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G, H and I are basic MD5 functions. + */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. + */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. +Rotation is separate from addition to prevent recomputation. + */ +#define FF(a, b, c, d, x, s, ac) { \ + (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) { \ + (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) { \ + (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) { \ + (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } + +/* MD5 initialization. Begins an MD5 operation, writing a new context. + */ +void MD5Init (MD5_CTX *context) /* context */ +{ + context->count[0] = context->count[1] = 0; + /* Load magic initialization constants. +*/ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; +} + +/* MD5 block update operation. Continues an MD5 message-digest + operation, processing another message block, and updating the + context. + */ +void MD5Update (MD5_CTX *context, /* context */ + unsigned char *input, /* input block */ + unsigned int inputLen) /* length of input block */ +{ + unsigned int i, index, partLen; + + /* Compute number of bytes mod 64 */ + index = (unsigned int)((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + if ((context->count[0] += ((UINT4)inputLen << 3)) + < ((UINT4)inputLen << 3)) + context->count[1]++; + context->count[1] += ((UINT4)inputLen >> 29); + + partLen = 64 - index; + + /* Transform as many times as possible. +*/ + if (inputLen >= partLen) { + MD5_memcpy + ((POINTER)&context->buffer[index], (POINTER)input, partLen); + MD5Transform (context->state, context->buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) + MD5Transform (context->state, &input[i]); + + index = 0; + } + else + i = 0; + + /* Buffer remaining input */ + MD5_memcpy + ((POINTER)&context->buffer[index], (POINTER)&input[i], + inputLen-i); +} + +/* MD5 finalization. Ends an MD5 message-digest operation, writing the + the message digest and zeroizing the context. + */ +void MD5Final (unsigned char digest[16], /* message digest */ + MD5_CTX *context) /* context */ +{ + unsigned char bits[8]; + unsigned int index, padLen; + + /* Save number of bits */ + Encode (bits, context->count, 8); + + /* Pad out to 56 mod 64. +*/ + index = (unsigned int)((context->count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + MD5Update (context, PADDING, padLen); + + /* Append length (before padding) */ + MD5Update (context, bits, 8); + /* Store state in digest */ + Encode (digest, context->state, 16); + + /* Zeroize sensitive information. +*/ + MD5_memset ((POINTER)context, 0, sizeof (*context)); +} + +/* MD5 basic transformation. Transforms state based on block. + */ +static void MD5Transform (UINT4 state[4], + unsigned char block[64]) +{ + UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + Decode (x, block, 64); + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information. +*/ + MD5_memset ((POINTER)x, 0, sizeof (x)); +} + + diff -urN lin.2.2.17/crypto/md5glue.c int.2.2.17.x/crypto/md5glue.c --- lin.2.2.17/crypto/md5glue.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/md5glue.c Mon Oct 16 17:28:18 2000 @@ -0,0 +1,104 @@ + +/* + * Source code by Alan Smithee, mailed to maintainer on pulped trees. + * + * Glue that ties the standard MD5 code to the rest of the system. + * Everything below this line is GPL. + * + */ + +#include +#include +#include +#include +#include +#include "md5.h" +#include "md5c.c" + +int +md5_open (struct digest_context *cx) +{ + if (!cx || !cx->digest_info) + return -EINVAL; + + MD5Init ((struct MD5_CTX *) cx->digest_info); + + return 0; +} + +int +md5_update (struct digest_context *cx, u8 *in, int size) +{ + if (!cx || !in || !cx->digest_info) + return -EINVAL; + + MD5Update ((struct MD5_CTX *) cx->digest_info, in, size); + + return 0; +} + +int +md5_digest (struct digest_context *cx, u8 *out) +{ + struct MD5_CTX tmp; + + if (!cx || !out || !cx->digest_info) + return -EINVAL; + + memcpy (&tmp, (struct MD5_CTX *) cx->digest_info, + sizeof (struct MD5_CTX)); + MD5Final (out, &tmp); + + return 0; +} + +int +md5_close (struct digest_context *cx, u8 *out) +{ + u8 tmp[16]; + + if (!cx || !cx->digest_info) + return -EINVAL; + + if (out == 0) + out = tmp; + + MD5Final (out, (struct MD5_CTX *) cx->digest_info); + + return 0; +} + +void md5_lock (void) +{ + MOD_INC_USE_COUNT; +} + +void md5_unlock(void) +{ + MOD_DEC_USE_COUNT; +} + +static struct digest_implementation md5 = { + {{NULL,NULL},DIGEST_MD5, "md5"}, + blocksize: 16, + working_size: MD5_WORKING_SIZE, + INIT_DIGEST_OPS(md5) +}; + +#ifdef MODULE +#define init_md5 init_module +#endif + +int __init init_md5 (void) +{ + printk ("MD5 Message Digest Algorithm (c) RSA Systems, Inc\n"); + register_digest (&md5); + return 0; +} + +#ifdef MODULE +void cleanup_module (void) +{ + unregister_digest (&md5); +} +#endif diff -urN lin.2.2.17/crypto/rc5.c int.2.2.17.x/crypto/rc5.c --- lin.2.2.17/crypto/rc5.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/rc5.c Sat Oct 14 01:04:34 2000 @@ -0,0 +1,231 @@ +/* + * rc5.c RC5-32/16/b + * + * Copyright (c) 1999 Pekka Riikonen + * + * 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, dis- + * tribute, sublicense, and/or sell copies of the Software, and to permit + * persons to whom the Software is furnished to do so, subject to the fol- + * lowing 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 MERCHANTABIL- + * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT + * SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABIL- + * ITY, 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. + * + * Except as contained in this notice, the name of the authors shall + * not be used in advertising or otherwise to promote the sale, use or + * other dealings in this Software without prior written authorization from + * the authors. + * + */ + +/* + * Based on RC5 reference code and on description of Bruce Schneier's + * Applied Cryptography. + * + * This implementation has a word size of 32 bits, a rounds of 16 and + * variable key length from 128 and 192 up to 256 bits. + * + */ + +#include +#include +#include +#include +#include +#include + +/* RC5 definitions */ +#define w 32 /* word size, in bits */ +#define r 16 /* rounds */ +#define b 16 /* minimum key size in bytes */ +#define c 8 /* same for 128, 192 and 256 bits key */ +#define t 34 /* size of table S, t = 2 * (r + 1) */ + +/* RC5 encryption */ +#define RC5E(i, A, B) \ + A = A ^ B; \ + A = rotl(A, B) + S[i]; \ + B = B ^ A; \ + B = rotl(B, A) + S[i + 1]; + +/* RC5 decryption */ +#define RC5D(i, A, B) \ + B = B - S[i + 1]; \ + B = rotr(B, A) ^ A; \ + A = A - S[i]; \ + A = rotr(A, B) ^ B; + +#if 0 +#define rotl rotl32 +#define rotr rotr32 +#else +#define rotl generic_rotl32 +#define rotr generic_rotr32 +#endif + +/* Sets RC5 key */ + +int rc5_set_key(struct cipher_context *cx, unsigned char *key, int key_len) +{ + u4byte *in_key = (u32 *)key; + u4byte *out_key = cx->keyinfo; /* S */ + u32 i, j, k, A, B, L[c]; + + if (key_len < b || key_len > (2 * b)) + return -1; + + key_len *= 8; + + /* init L */ + for (i = 0; i < key_len / w; i++) + L[i] = in_key[i]; + + /* init key array (S) */ + out_key[0] = 0xb7e15163; + for (i = 1; i < t; i++) + out_key[i] = out_key[i - 1] + 0x9e3779b9; + + /* mix L and key array (S) */ + A = B = 0; + for (k = i = j = 0; k < (3 * t); k++) { + A = rotl(out_key[i] + (A + B), 3); + B += A; + B = rotl(L[j] + B, B); + out_key[i] = A; + L[j] = B; + i = (i + 1) % t; + j = (j + 1) % c; + } + + return 0; +} + +/* Encrypts *one* block at a time. */ + +int rc5_encrypt(struct cipher_context *cx, + const u8 *in8, u8 *out8, int size) +{ + u32 A, B; + u32 *in = (u32 *)in8; + u32 *out = (u32 *)out8; + + u32 *S = cx->keyinfo; + A = in[0] + S[0]; + B = in[1] + S[1]; + + RC5E(2, A, B); RC5E(4, A, B); + RC5E(6, A, B); RC5E(8, A, B); + RC5E(10, A, B); RC5E(12, A, B); + RC5E(14, A, B); RC5E(16, A, B); + RC5E(18, A, B); RC5E(20, A, B); + RC5E(22, A, B); RC5E(24, A, B); + RC5E(26, A, B); RC5E(28, A, B); + RC5E(30, A, B); RC5E(32, A, B); + + out[0] = A; + out[1] = B; + + return 0; +} + +/* Decrypts *one* block at a time. */ + +int rc5_decrypt(struct cipher_context *cx, + const u8 *in8, u8 *out8, int size) +{ + u32 A, B; + u32 *in = (u32 *)in8; + u32 *out = (u32 *)out8; + + u32 *S = cx->keyinfo; + A = in[0]; + B = in[1]; + + RC5D(32, A, B); RC5D(30, A, B); + RC5D(28, A, B); RC5D(26, A, B); + RC5D(24, A, B); RC5D(22, A, B); + RC5D(20, A, B); RC5D(18, A, B); + RC5D(16, A, B); RC5D(14, A, B); + RC5D(12, A, B); RC5D(10, A, B); + RC5D(8, A, B); RC5D(6, A, B); + RC5D(4, A, B); RC5D(2, A, B); + + out[0] = A - S[0]; + out[1] = B - S[1]; + + return 0; +} + +static void rc5_lock(void) +{ + MOD_INC_USE_COUNT; +} + +static void rc5_unlock(void) +{ + MOD_DEC_USE_COUNT; +} + + +#define CIPHER_BITS_64 +#define CIPHER_NAME(x) rc5##x +#include "gen-cbc.h" +#include "gen-ecb.h" + +static struct cipher_implementation rc5 = { + {{NULL,NULL},CIPHER_RC5, "rc5"}, + blocksize: 8, + ivsize: 0, + key_schedule_size: RC5_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(rc5_ecb), + INIT_CIPHER_OPS(rc5) +}; + +static struct cipher_implementation rc5_cbc = { + {{NULL,NULL},CIPHER_RC5 | CIPHER_CBC, "rc5-cbc"}, + blocksize: 8, + ivsize: 8, + key_schedule_size: RC5_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(rc5_cbc), + INIT_CIPHER_OPS(rc5) +}; + + +#ifdef MODULE +int __init init_module(void) +#else +int __init init_rc5(void) +#endif +{ + if (register_cipher(&rc5)) + printk(KERN_WARNING "Couldn't register RC5 encryption\n"); + if (register_cipher(&rc5_cbc)) + printk(KERN_WARNING "Couldn't register RC5-cbc encryption\n"); + + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ + if (unregister_cipher(&rc5)) + printk(KERN_WARNING "Couldn't unregister RC5 encryption\n"); + if (unregister_cipher(&rc5_cbc)) + printk(KERN_WARNING "Couldn't unregister RC5-cbc encryption\n"); +} +#endif diff -urN lin.2.2.17/crypto/rc62.c int.2.2.17.x/crypto/rc62.c --- lin.2.2.17/crypto/rc62.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/rc62.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,214 @@ +/* NOTE: This implementation has been changed from the original + source. See ChangeLog for more information. + Maintained by Alexander Kjeldaas + */ + +/* This is an independent implementation of the RC6 algorithm that */ +/* Ron Rivest and RSA Labs have submitted as a candidate for the */ +/* NIST AES activity. Refer to RSA Labs and Ron Rivest for any */ +/* copyright, patent or license issues for the RC6 algorithm. */ +/* */ +/* Copyright in this implementation is held by Dr B R Gladman but */ +/* I hereby give permission for its free direct or derivative use */ +/* subject to acknowledgment of its origin and compliance with any */ +/* constraints that are placed on the exploitation of RC6 by its */ +/* designers. */ +/* */ +/* Dr Brian Gladman (gladman@seven77.demon.co.uk) 18th July 1998 */ +/* + Timing data: + +Algorithm: rc6 (rc62.c) +128 bit key: +Key Setup: 1580 cycles +Encrypt: 286 cycles = 89.6 mbits/sec +Decrypt: 236 cycles = 108.6 mbits/sec +Mean: 261 cycles = 98.2 mbits/sec +192 bit key: +Key Setup: 1882 cycles +Encrypt: 286 cycles = 89.5 mbits/sec +Decrypt: 235 cycles = 108.9 mbits/sec +Mean: 261 cycles = 98.3 mbits/sec +256 bit key: +Key Setup: 1774 cycles +Encrypt: 285 cycles = 89.7 mbits/sec +Decrypt: 236 cycles = 108.3 mbits/sec +Mean: 261 cycles = 98.1 mbits/sec + +*/ + +#include +#include +#include +#include +#include + +#if 0 +#define rotl rotl32 +#define rotr rotr32 +#else +#define rotl generic_rotl32 +#define rotr generic_rotr32 +#endif + +#define f_rnd(i,a,b,c,d) \ + u = rotl(d * (d + d + 1), 5); \ + t = rotl(b * (b + b + 1), 5); \ + a = rotl(a ^ t, u) + l_key[i]; \ + c = rotl(c ^ u, t) + l_key[i + 1] + +#define i_rnd(i,a,b,c,d) \ + u = rotl(d * (d + d + 1), 5); \ + t = rotl(b * (b + b + 1), 5); \ + c = rotr(c - l_key[i + 1], t) ^ u; \ + a = rotr(a - l_key[i], u) ^ t + +/* initialise the key schedule from the user supplied key */ + +int rc6_set_key(struct cipher_context *cx, unsigned char *key, int key_len) +{ u4byte *in_key = (u32 *)key; + /* l_key - storage for the key schedule */ + u4byte *l_key = cx->keyinfo; + u4byte i, j, k, a, b, l[8], t; + key_len *= 8; + + l_key[0] = 0xb7e15163; + + for(k = 1; k < 44; ++k) + + l_key[k] = l_key[k - 1] + 0x9e3779b9; + + for(k = 0; k < key_len / 32; ++k) + + l[k] = in_key[k]; + + t = (key_len / 32) - 1; + + a = b = i = j = 0; + + for(k = 0; k < 132; ++k) + { a = rotl(l_key[i] + a + b, 3); b += a; + b = rotl(l[j] + b, b); + l_key[i] = a; l[j] = b; + i = (i == 43 ? 0 : i + 1); + j = (j == t ? 0 : j + 1); + } + + return 0; +}; + +/* encrypt a block of text */ + +int rc6_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size) +{ u32 *l_key = cx->keyinfo; + u32 *in_blk = (u32 *)in; + u32 *out_blk = (u32 *)out; + u4byte a,b,c,d,t,u; + + a = in_blk[0]; b = in_blk[1] + l_key[0]; + c = in_blk[2]; d = in_blk[3] + l_key[1]; + + f_rnd( 2,a,b,c,d); f_rnd( 4,b,c,d,a); + f_rnd( 6,c,d,a,b); f_rnd( 8,d,a,b,c); + f_rnd(10,a,b,c,d); f_rnd(12,b,c,d,a); + f_rnd(14,c,d,a,b); f_rnd(16,d,a,b,c); + f_rnd(18,a,b,c,d); f_rnd(20,b,c,d,a); + f_rnd(22,c,d,a,b); f_rnd(24,d,a,b,c); + f_rnd(26,a,b,c,d); f_rnd(28,b,c,d,a); + f_rnd(30,c,d,a,b); f_rnd(32,d,a,b,c); + f_rnd(34,a,b,c,d); f_rnd(36,b,c,d,a); + f_rnd(38,c,d,a,b); f_rnd(40,d,a,b,c); + + out_blk[0] = a + l_key[42]; out_blk[1] = b; + out_blk[2] = c + l_key[43]; out_blk[3] = d; + return 0; +}; + +/* decrypt a block of text */ + +int rc6_decrypt(struct cipher_context *cx, const u8 *in, u8 *out, int size) +{ u4byte *l_key = cx->keyinfo; + u32 *in_blk = (u32 *)in; + u32 *out_blk = (u32 *)out; + u4byte a,b,c,d,t,u; + + d = in_blk[3]; c = in_blk[2] - l_key[43]; + b = in_blk[1]; a = in_blk[0] - l_key[42]; + + i_rnd(40,d,a,b,c); i_rnd(38,c,d,a,b); + i_rnd(36,b,c,d,a); i_rnd(34,a,b,c,d); + i_rnd(32,d,a,b,c); i_rnd(30,c,d,a,b); + i_rnd(28,b,c,d,a); i_rnd(26,a,b,c,d); + i_rnd(24,d,a,b,c); i_rnd(22,c,d,a,b); + i_rnd(20,b,c,d,a); i_rnd(18,a,b,c,d); + i_rnd(16,d,a,b,c); i_rnd(14,c,d,a,b); + i_rnd(12,b,c,d,a); i_rnd(10,a,b,c,d); + i_rnd( 8,d,a,b,c); i_rnd( 6,c,d,a,b); + i_rnd( 4,b,c,d,a); i_rnd( 2,a,b,c,d); + + out_blk[3] = d - l_key[1]; out_blk[2] = c; + out_blk[1] = b - l_key[0]; out_blk[0] = a; + return 0; +}; + +static void rc6_lock(void) +{ + MOD_INC_USE_COUNT; +} + +static void rc6_unlock(void) +{ + MOD_DEC_USE_COUNT; +} + +#define CIPHER_BITS_128 +#define CIPHER_NAME(x) rc6##x +#include "gen-cbc.h" + +static struct cipher_implementation rc6 = { + {{NULL,NULL},CIPHER_RC6, "rc6"}, + blocksize: 16, + ivsize: 0, + key_schedule_size: RC6_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(rc6), + INIT_CIPHER_OPS(rc6) +}; + +static struct cipher_implementation rc6_cbc = { + {{NULL,NULL},CIPHER_RC6 | CIPHER_CBC, "rc6-cbc"}, + blocksize: 16, + ivsize: 16, + key_schedule_size: RC6_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(rc6_cbc), + INIT_CIPHER_OPS(rc6) +}; + +#ifdef MODULE + int __init init_module(void) +#else + int __init init_rc6(void) +#endif +{ + if (register_cipher(&rc6)) + printk(KERN_WARNING "Couldn't register rc6 encryption\n"); + if (register_cipher(&rc6_cbc)) + printk(KERN_WARNING "Couldn't register rc6-cbc encryption\n"); + + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ + if (unregister_cipher(&rc6)) + printk(KERN_WARNING "Couldn't unregister rc6 encryption\n"); + if (unregister_cipher(&rc6_cbc)) + printk(KERN_WARNING "Couldn't unregister rc6-cbc encryption\n"); +} +#endif + diff -urN lin.2.2.17/crypto/rijndael.c int.2.2.17.x/crypto/rijndael.c --- lin.2.2.17/crypto/rijndael.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/rijndael.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,464 @@ +/* NOTE: This implementation has been changed from the original + source. See ChangeLog for more information. + Maintained by Alexander Kjeldaas + */ + +// Copyright in this code is held by Dr B.R. Gladman but free direct or +// derivative use is permitted subject to acknowledgement of its origin +// and subject to any constraints placed on the use of the algorithm by +// its designers (if such constraints may exist, this will be indicated +// below). +// +// Dr. B. R. Gladman (brian.gladman@btinternet.com). 25th January 2000. +// +// This is an implementation of Rijndael, an encryption algorithm designed +// by Daemen and Rijmen and submitted as a candidate algorithm for the +// Advanced Encryption Standard programme of the US National Institute of +// Standards and Technology. +// +// The designers of Rijndael have not placed any constraints on the use of +// this algorithm. + +/* Some changes from the Gladman version: + s/RIJNDAEL(e_key)/E_KEY/g + s/RIJNDAEL(d_key)/D_KEY/g +*/ + +#include +#include +#include +#include +#include +#include + +#if 0 +#define rotl rotl32 +#define rotr rotr32 +#else +#define rotl generic_rotl32 +#define rotr generic_rotr32 +#endif + + +#define STATIC static +#define u4byte_in(x) le32_to_cpu(*(u32 *)(x)) +#define u4byte_out(to, from) (*(u32 *)(to) = cpu_to_le32(from)) + +#define E_KEY ((u4byte *)cx->keyinfo) +#define D_KEY ((u4byte *)(cx->keyinfo + 60)) + + +STATIC u1byte pow_tab[256]; +STATIC u1byte log_tab[256]; +STATIC u1byte sbx_tab[256]; +STATIC u1byte isb_tab[256]; +STATIC u4byte rco_tab[ 10]; +STATIC u4byte ft_tab[4][256]; +STATIC u4byte it_tab[4][256]; + +STATIC u4byte fl_tab[4][256]; +STATIC u4byte il_tab[4][256]; + +STATIC u4byte tab_gen = 0; + +inline u1byte f_mult(u1byte a, u1byte b) +{ u1byte aa = log_tab[a], cc = aa + log_tab[b]; + + return pow_tab[cc + (cc < aa ? 1 : 0)]; + +} + +#define ff_mult(a,b) (a && b ? f_mult(a, b) : 0) + +#define f_rn(bo, bi, n, k) \ + bo[n] = ft_tab[0][byte(bi[n],0)] ^ \ + ft_tab[1][byte(bi[(n + 1) & 3],1)] ^ \ + ft_tab[2][byte(bi[(n + 2) & 3],2)] ^ \ + ft_tab[3][byte(bi[(n + 3) & 3],3)] ^ *(k + n) + +#define i_rn(bo, bi, n, k) \ + bo[n] = it_tab[0][byte(bi[n],0)] ^ \ + it_tab[1][byte(bi[(n + 3) & 3],1)] ^ \ + it_tab[2][byte(bi[(n + 2) & 3],2)] ^ \ + it_tab[3][byte(bi[(n + 1) & 3],3)] ^ *(k + n) + +#define ls_box(x) \ + ( fl_tab[0][byte(x, 0)] ^ \ + fl_tab[1][byte(x, 1)] ^ \ + fl_tab[2][byte(x, 2)] ^ \ + fl_tab[3][byte(x, 3)] ) + +#define f_rl(bo, bi, n, k) \ + bo[n] = fl_tab[0][byte(bi[n],0)] ^ \ + fl_tab[1][byte(bi[(n + 1) & 3],1)] ^ \ + fl_tab[2][byte(bi[(n + 2) & 3],2)] ^ \ + fl_tab[3][byte(bi[(n + 3) & 3],3)] ^ *(k + n) + +#define i_rl(bo, bi, n, k) \ + bo[n] = il_tab[0][byte(bi[n],0)] ^ \ + il_tab[1][byte(bi[(n + 3) & 3],1)] ^ \ + il_tab[2][byte(bi[(n + 2) & 3],2)] ^ \ + il_tab[3][byte(bi[(n + 1) & 3],3)] ^ *(k + n) + +STATIC void gen_tabs(void) +{ u4byte i, t; + u1byte p, q; + + // log and power tables for GF(2**8) finite field with + // 0x011b as modular polynomial - the simplest prmitive + // root is 0x03, used here to generate the tables + + for(i = 0,p = 1; i < 256; ++i) + { + pow_tab[i] = (u1byte)p; log_tab[p] = (u1byte)i; + + p ^= (p << 1) ^ (p & 0x80 ? 0x01b : 0); + } + + log_tab[1] = 0; + + for(i = 0,p = 1; i < 10; ++i) + { + rco_tab[i] = p; + + p = (p << 1) ^ (p & 0x80 ? 0x01b : 0); + } + + for(i = 0; i < 256; ++i) + { + p = (i ? pow_tab[255 - log_tab[i]] : 0); + q = ((p >> 7) | (p << 1)) ^ ((p >> 6) | (p << 2)); + p ^= 0x63 ^ q ^ ((q >> 6) | (q << 2)); + sbx_tab[i] = p; isb_tab[p] = (u1byte)i; + } + + for(i = 0; i < 256; ++i) + { + p = sbx_tab[i]; + + + t = p; fl_tab[0][i] = t; + fl_tab[1][i] = rotl(t, 8); + fl_tab[2][i] = rotl(t, 16); + fl_tab[3][i] = rotl(t, 24); + + t = ((u4byte)ff_mult(2, p)) | + ((u4byte)p << 8) | + ((u4byte)p << 16) | + ((u4byte)ff_mult(3, p) << 24); + + ft_tab[0][i] = t; + ft_tab[1][i] = rotl(t, 8); + ft_tab[2][i] = rotl(t, 16); + ft_tab[3][i] = rotl(t, 24); + + p = isb_tab[i]; + + t = p; il_tab[0][i] = t; + il_tab[1][i] = rotl(t, 8); + il_tab[2][i] = rotl(t, 16); + il_tab[3][i] = rotl(t, 24); + + t = ((u4byte)ff_mult(14, p)) | + ((u4byte)ff_mult( 9, p) << 8) | + ((u4byte)ff_mult(13, p) << 16) | + ((u4byte)ff_mult(11, p) << 24); + + it_tab[0][i] = t; + it_tab[1][i] = rotl(t, 8); + it_tab[2][i] = rotl(t, 16); + it_tab[3][i] = rotl(t, 24); + } + + tab_gen = 1; +} + +#define star_x(x) (((x) & 0x7f7f7f7f) << 1) ^ ((((x) & 0x80808080) >> 7) * 0x1b) + +#define imix_col(y,x) \ + u = star_x(x); \ + v = star_x(u); \ + w = star_x(v); \ + t = w ^ (x); \ + (y) = u ^ v ^ w; \ + (y) ^= rotr(u ^ t, 8) ^ \ + rotr(v ^ t, 16) ^ \ + rotr(t,24) + +// initialise the key schedule from the user supplied key + +#define loop4(i) \ +{ t = rotr(t, 8); t = ls_box(t) ^ rco_tab[i]; \ + t ^= E_KEY[4 * i]; E_KEY[4 * i + 4] = t; \ + t ^= E_KEY[4 * i + 1]; E_KEY[4 * i + 5] = t; \ + t ^= E_KEY[4 * i + 2]; E_KEY[4 * i + 6] = t; \ + t ^= E_KEY[4 * i + 3]; E_KEY[4 * i + 7] = t; \ +} + +#define loop6(i) \ +{ t = rotr(t, 8); t = ls_box(t) ^ rco_tab[i]; \ + t ^= E_KEY[6 * i]; E_KEY[6 * i + 6] = t; \ + t ^= E_KEY[6 * i + 1]; E_KEY[6 * i + 7] = t; \ + t ^= E_KEY[6 * i + 2]; E_KEY[6 * i + 8] = t; \ + t ^= E_KEY[6 * i + 3]; E_KEY[6 * i + 9] = t; \ + t ^= E_KEY[6 * i + 4]; E_KEY[6 * i + 10] = t; \ + t ^= E_KEY[6 * i + 5]; E_KEY[6 * i + 11] = t; \ +} + +#define loop8(i) \ +{ t = rotr(t, 8); ; t = ls_box(t) ^ rco_tab[i]; \ + t ^= E_KEY[8 * i]; E_KEY[8 * i + 8] = t; \ + t ^= E_KEY[8 * i + 1]; E_KEY[8 * i + 9] = t; \ + t ^= E_KEY[8 * i + 2]; E_KEY[8 * i + 10] = t; \ + t ^= E_KEY[8 * i + 3]; E_KEY[8 * i + 11] = t; \ + t = E_KEY[8 * i + 4] ^ ls_box(t); \ + E_KEY[8 * i + 12] = t; \ + t ^= E_KEY[8 * i + 5]; E_KEY[8 * i + 13] = t; \ + t ^= E_KEY[8 * i + 6]; E_KEY[8 * i + 14] = t; \ + t ^= E_KEY[8 * i + 7]; E_KEY[8 * i + 15] = t; \ +} + +int rijndael_set_key(struct cipher_context *cx, unsigned char *in_key, + int key_len) +{ + u4byte i, t, u, v, w; + u4byte k_len; + +#if 0 + mode = f; +#endif + + k_len = (key_len*8 + 31) / 32; + cx->key_length = k_len * 4; + + E_KEY[0] = u4byte_in(in_key ); + E_KEY[1] = u4byte_in(in_key + 4); + E_KEY[2] = u4byte_in(in_key + 8); + E_KEY[3] = u4byte_in(in_key + 12); + + switch(k_len) + { + case 4: t = E_KEY[3]; + for(i = 0; i < 10; ++i) + loop4(i); + break; + + case 6: E_KEY[4] = u4byte_in(in_key + 16); + t = E_KEY[5] = u4byte_in(in_key + 20); + for(i = 0; i < 8; ++i) + loop6(i); + break; + + case 8: E_KEY[4] = u4byte_in(in_key + 16); + E_KEY[5] = u4byte_in(in_key + 20); + E_KEY[6] = u4byte_in(in_key + 24); + t = E_KEY[7] = u4byte_in(in_key + 28); + for(i = 0; i < 7; ++i) + loop8(i); + break; + } + +#if 0 + if(mode != enc) + { +#endif + D_KEY[0] = E_KEY[0]; D_KEY[1] = E_KEY[1]; + D_KEY[2] = E_KEY[2]; D_KEY[3] = E_KEY[3]; + + for(i = 4; i < 4 * k_len + 24; ++i) + { + imix_col(D_KEY[i], E_KEY[i]); + } +#if 0 + } +#endif + + return 0; +} + +// encrypt a block of text + +#define f_nround(bo, bi, k) \ + f_rn(bo, bi, 0, k); \ + f_rn(bo, bi, 1, k); \ + f_rn(bo, bi, 2, k); \ + f_rn(bo, bi, 3, k); \ + k += 4 + +#define f_lround(bo, bi, k) \ + f_rl(bo, bi, 0, k); \ + f_rl(bo, bi, 1, k); \ + f_rl(bo, bi, 2, k); \ + f_rl(bo, bi, 3, k) + + +int rijndael_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size) +{ + u4byte b0[4], b1[4], *kp; + u4byte k_len = cx->key_length >> 2; + + b0[0] = u4byte_in(in ) ^ E_KEY[0]; + b0[1] = u4byte_in(in + 4) ^ E_KEY[1]; + b0[2] = u4byte_in(in + 8) ^ E_KEY[2]; + b0[3] = u4byte_in(in + 12) ^ E_KEY[3]; + + kp = E_KEY + 4; + + if(k_len > 6) + { + f_nround(b1, b0, kp); f_nround(b0, b1, kp); + } + + if(k_len > 4) + { + f_nround(b1, b0, kp); f_nround(b0, b1, kp); + } + + f_nround(b1, b0, kp); f_nround(b0, b1, kp); + f_nround(b1, b0, kp); f_nround(b0, b1, kp); + f_nround(b1, b0, kp); f_nround(b0, b1, kp); + f_nround(b1, b0, kp); f_nround(b0, b1, kp); + f_nround(b1, b0, kp); f_lround(b0, b1, kp); + + u4byte_out(out, b0[0]); u4byte_out(out + 4, b0[1]); + u4byte_out(out + 8, b0[2]); u4byte_out(out + 12, b0[3]); + + return 0; +} + +// decrypt a block of text + +#define i_nround(bo, bi, k) \ + i_rn(bo, bi, 0, k); \ + i_rn(bo, bi, 1, k); \ + i_rn(bo, bi, 2, k); \ + i_rn(bo, bi, 3, k); \ + k -= 4 + +#define i_lround(bo, bi, k) \ + i_rl(bo, bi, 0, k); \ + i_rl(bo, bi, 1, k); \ + i_rl(bo, bi, 2, k); \ + i_rl(bo, bi, 3, k) + +int rijndael_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size) +{ + u4byte b0[4], b1[4], *kp; + u4byte k_len = cx->key_length >> 2; + + b0[0] = u4byte_in(in ) ^ E_KEY[4*k_len + 24]; + b0[1] = u4byte_in(in + 4) ^ E_KEY[4*k_len + 25]; + b0[2] = u4byte_in(in + 8) ^ E_KEY[4*k_len + 26]; + b0[3] = u4byte_in(in + 12) ^ E_KEY[4*k_len + 27]; + + kp = D_KEY + 4 * (k_len + 5); + + if(k_len > 6) + { + i_nround(b1, b0, kp); i_nround(b0, b1, kp); + } + + if(k_len > 4) + { + i_nround(b1, b0, kp); i_nround(b0, b1, kp); + } + + i_nround(b1, b0, kp); i_nround(b0, b1, kp); + i_nround(b1, b0, kp); i_nround(b0, b1, kp); + i_nround(b1, b0, kp); i_nround(b0, b1, kp); + i_nround(b1, b0, kp); i_nround(b0, b1, kp); + i_nround(b1, b0, kp); i_lround(b0, b1, kp); + + u4byte_out(out, b0[0]); u4byte_out(out + 4, b0[1]); + u4byte_out(out + 8, b0[2]); u4byte_out(out + 12, b0[3]); + + return 0; +} + + + +static void rijndael_lock(void) +{ + MOD_INC_USE_COUNT; +} + +static void rijndael_unlock(void) +{ + MOD_DEC_USE_COUNT; +} + +#define CIPHER_BITS_128 +#define CIPHER_NAME(x) rijndael##x +#include "gen-cbc.h" + +static struct cipher_implementation rijndael = { + {{NULL,NULL},CIPHER_RIJNDAEL, "rijndael"}, + blocksize: 16, + ivsize: 0, + key_schedule_size: RIJNDAEL_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(rijndael), + INIT_CIPHER_OPS(rijndael) +}; + +static struct cipher_implementation rijndael_cbc = { + {{NULL,NULL},CIPHER_RIJNDAEL | CIPHER_CBC, "rijndael-cbc"}, + blocksize: 16, + ivsize: 16, + key_schedule_size: RIJNDAEL_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(rijndael_cbc), + INIT_CIPHER_OPS(rijndael) +}; + + +struct cipher_implementation aes; +struct cipher_implementation aes_cbc; + + +#ifdef MODULE + int __init init_module(void) +#else + int __init init_rijndael(void) +#endif +{ + gen_tabs(); + memcpy(&aes, &rijndael, sizeof(struct cipher_implementation)); + memcpy(&aes_cbc, &rijndael_cbc, sizeof(struct cipher_implementation)); + aes.trans.t_name = "aes"; + aes.trans.t_id = CIPHER_AES; + aes_cbc.trans.t_name = "aes-cbc"; + aes_cbc.trans.t_id = CIPHER_AES | CIPHER_CBC; +#ifdef CONFIG_CIPHER_RIJNDAEL + if (register_cipher(&rijndael)) + printk(KERN_WARNING "Couldn't register rijndael encryption\n"); + if (register_cipher(&rijndael_cbc)) + printk(KERN_WARNING "Couldn't register rijndael-cbc encryption\n"); +#endif + if (register_cipher(&aes)) + printk(KERN_WARNING "Couldn't register aes encryption\n"); + if (register_cipher(&aes_cbc)) + printk(KERN_WARNING "Couldn't register aes-cbc encryption\n"); + + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ +#ifdef CONFIG_CIPHER_RIJNDAEL + if (unregister_cipher(&rijndael)) + printk(KERN_WARNING "Couldn't unregister rijndael encryption\n"); + if (unregister_cipher(&rijndael_cbc)) + printk(KERN_WARNING "Couldn't unregister rijndael-cbc encryption\n"); +#endif + if (unregister_cipher(&aes)) + printk(KERN_WARNING "Couldn't unregister aes encryption\n"); + if (unregister_cipher(&aes_cbc)) + printk(KERN_WARNING "Couldn't unregister aes-cbc encryption\n"); +} +#endif diff -urN lin.2.2.17/crypto/safer3.c int.2.2.17.x/crypto/safer3.c --- lin.2.2.17/crypto/safer3.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/safer3.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,354 @@ + +/* This is an independent implementation of the SAFER+ encryption */ +/* algorithm submitted by Cylink as a candidate in the US NIST */ +/* Advanced Encryption Standard (AES) programme. This algorithm */ +/* has not been patented and is freely available for use without */ +/* the need for licensing. */ +/* */ +/* Copyright in this implementation is held by Dr B R Gladman but */ +/* I hereby give permission for its free direct or derivative use */ +/* subject to acknowledgment of its origin. */ +/* */ +/* Dr Brian Gladman (gladman@seven77.demon.co.uk) 24th July 1998 */ +/* +/* Timing data: + +Algorithm: safer (safer3.c) +128 bit key: +Key Setup: 3973 cycles +Encrypt: 1769 cycles = 14.5 mbits/sec +Decrypt: 1764 cycles = 14.5 mbits/sec +Mean: 1766 cycles = 14.5 mbits/sec +192 bit key: +Key Setup: 6507 cycles +Encrypt: 2608 cycles = 9.8 mbits/sec +Decrypt: 2601 cycles = 9.8 mbits/sec +Mean: 2605 cycles = 9.8 mbits/sec +256 bit key: +Key Setup: 9479 cycles +Encrypt: 3459 cycles = 7.4 mbits/sec +Decrypt: 3425 cycles = 7.5 mbits/sec +Mean: 3442 cycles = 7.4 mbits/sec + +*/ + +#define BYTE_SWAP +#define WORD_SWAP + +#include "../std_defs.h" + +static char *alg_name[] = { "safer", "safer3.c" }; + +char **cipher_name() +{ + return alg_name; +}; + +u1byte expf[256] = +{ 1, 45, 226, 147, 190, 69, 21, 174, 120, 3, 135, 164, 184, 56, 207, 63, + 8, 103, 9, 148, 235, 38, 168, 107, 189, 24, 52, 27, 187, 191, 114, 247, + 64, 53, 72, 156, 81, 47, 59, 85, 227, 192, 159, 216, 211, 243, 141, 177, + 255, 167, 62, 220, 134, 119, 215, 166, 17, 251, 244, 186, 146, 145, 100, 131, + 241, 51, 239, 218, 44, 181, 178, 43, 136, 209, 153, 203, 140, 132, 29, 20, + 129, 151, 113, 202, 95, 163, 139, 87, 60, 130, 196, 82, 92, 28, 232, 160, + 4, 180, 133, 74, 246, 19, 84, 182, 223, 12, 26, 142, 222, 224, 57, 252, + 32, 155, 36, 78, 169, 152, 158, 171, 242, 96, 208, 108, 234, 250, 199, 217, + 0, 212, 31, 110, 67, 188, 236, 83, 137, 254, 122, 93, 73, 201, 50, 194, + 249, 154, 248, 109, 22, 219, 89, 150, 68, 233, 205, 230, 70, 66, 143, 10, + 193, 204, 185, 101, 176, 210, 198, 172, 30, 65, 98, 41, 46, 14, 116, 80, + 2, 90, 195, 37, 123, 138, 42, 91, 240, 6, 13, 71, 111, 112, 157, 126, + 16, 206, 18, 39, 213, 76, 79, 214, 121, 48, 104, 54, 117, 125, 228, 237, + 128, 106, 144, 55, 162, 94, 118, 170, 197, 127, 61, 175, 165, 229, 25, 97, + 253, 77, 124, 183, 11, 238, 173, 75, 34, 245, 231, 115, 35, 33, 200, 5, + 225, 102, 221, 179, 88, 105, 99, 86, 15, 161, 49, 149, 23, 7, 58, 40 +}; + +u1byte logf[512] = +{ + 128, 0, 176, 9, 96, 239, 185, 253, 16, 18, 159, 228, 105, 186, 173, 248, + 192, 56, 194, 101, 79, 6, 148, 252, 25, 222, 106, 27, 93, 78, 168, 130, + 112, 237, 232, 236, 114, 179, 21, 195, 255, 171, 182, 71, 68, 1, 172, 37, + 201, 250, 142, 65, 26, 33, 203, 211, 13, 110, 254, 38, 88, 218, 50, 15, + 32, 169, 157, 132, 152, 5, 156, 187, 34, 140, 99, 231, 197, 225, 115, 198, + 175, 36, 91, 135, 102, 39, 247, 87, 244, 150, 177, 183, 92, 139, 213, 84, + 121, 223, 170, 246, 62, 163, 241, 17, 202, 245, 209, 23, 123, 147, 131, 188, + 189, 82, 30, 235, 174, 204, 214, 53, 8, 200, 138, 180, 226, 205, 191, 217, + 208, 80, 89, 63, 77, 98, 52, 10, 72, 136, 181, 86, 76, 46, 107, 158, + 210, 61, 60, 3, 19, 251, 151, 81, 117, 74, 145, 113, 35, 190, 118, 42, + 95, 249, 212, 85, 11, 220, 55, 49, 22, 116, 215, 119, 167, 230, 7, 219, + 164, 47, 70, 243, 97, 69, 103, 227, 12, 162, 59, 28, 133, 24, 4, 29, + 41, 160, 143, 178, 90, 216, 166, 126, 238, 141, 83, 75, 161, 154, 193, 14, + 122, 73, 165, 44, 129, 196, 199, 54, 43, 127, 67, 149, 51, 242, 108, 104, + 109, 240, 2, 40, 206, 221, 155, 234, 94, 153, 124, 20, 134, 207, 229, 66, + 184, 64, 120, 45, 58, 233, 100, 31, 146, 144, 125, 57, 111, 224, 137, 48, + + 128, 0, 176, 9, 96, 239, 185, 253, 16, 18, 159, 228, 105, 186, 173, 248, + 192, 56, 194, 101, 79, 6, 148, 252, 25, 222, 106, 27, 93, 78, 168, 130, + 112, 237, 232, 236, 114, 179, 21, 195, 255, 171, 182, 71, 68, 1, 172, 37, + 201, 250, 142, 65, 26, 33, 203, 211, 13, 110, 254, 38, 88, 218, 50, 15, + 32, 169, 157, 132, 152, 5, 156, 187, 34, 140, 99, 231, 197, 225, 115, 198, + 175, 36, 91, 135, 102, 39, 247, 87, 244, 150, 177, 183, 92, 139, 213, 84, + 121, 223, 170, 246, 62, 163, 241, 17, 202, 245, 209, 23, 123, 147, 131, 188, + 189, 82, 30, 235, 174, 204, 214, 53, 8, 200, 138, 180, 226, 205, 191, 217, + 208, 80, 89, 63, 77, 98, 52, 10, 72, 136, 181, 86, 76, 46, 107, 158, + 210, 61, 60, 3, 19, 251, 151, 81, 117, 74, 145, 113, 35, 190, 118, 42, + 95, 249, 212, 85, 11, 220, 55, 49, 22, 116, 215, 119, 167, 230, 7, 219, + 164, 47, 70, 243, 97, 69, 103, 227, 12, 162, 59, 28, 133, 24, 4, 29, + 41, 160, 143, 178, 90, 216, 166, 126, 238, 141, 83, 75, 161, 154, 193, 14, + 122, 73, 165, 44, 129, 196, 199, 54, 43, 127, 67, 149, 51, 242, 108, 104, + 109, 240, 2, 40, 206, 221, 155, 234, 94, 153, 124, 20, 134, 207, 229, 66, + 184, 64, 120, 45, 58, 233, 100, 31, 146, 144, 125, 57, 111, 224, 137, 48 +}; + +u1byte l_key[33 * 16]; +u4byte k_bytes; + +u4byte *set_key(const u4byte in_key[], const u4byte key_len) +{ u1byte by, lk[33]; + u4byte i, j, k, l, m; + + get_key(lk, key_len); + + k_bytes = key_len / 8; lk[k_bytes] = 0; + + for(i = 0; i < k_bytes; ++i) + { + lk[k_bytes] ^= lk[i]; l_key[i] = lk[i]; + } + + for(i = 0; i < k_bytes; ++i) + { + for(j = 0; j <= k_bytes; ++j) + { + by = lk[j]; lk[j] = by << 3 | by >> 5; + } + + k = 17 * i + 35; l = 16 * i + 16; m = i + 1; + + if(i < 16) + { + for(j = 0; j < 16; ++j) + { + l_key[l + j] = lk[m] + expf[expf[(k + j) & 255]]; + + m = (m == k_bytes ? 0 : m + 1); + } + } + else + { + for(j = 0; j < 16; ++j) + { + l_key[l + j] = lk[m] + expf[(k + j) & 255]; + + m = (m == k_bytes ? 0 : m + 1); + } + } + } + return (u4byte*)l_key; +}; + +void do_fr(u1byte x[16], u1byte *kp) +{ u1byte t; + + x[ 0] = expf[x[ 0] ^ kp[ 0]] + kp[16]; + x[ 1] = logf[x[ 1] + kp[ 1]] ^ kp[17]; + x[ 2] = logf[x[ 2] + kp[ 2]] ^ kp[18]; + x[ 3] = expf[x[ 3] ^ kp[ 3]] + kp[19]; + + x[ 4] = expf[x[ 4] ^ kp[ 4]] + kp[20]; + x[ 5] = logf[x[ 5] + kp[ 5]] ^ kp[21]; + x[ 6] = logf[x[ 6] + kp[ 6]] ^ kp[22]; + x[ 7] = expf[x[ 7] ^ kp[ 7]] + kp[23]; + + x[ 8] = expf[x[ 8] ^ kp[ 8]] + kp[24]; + x[ 9] = logf[x[ 9] + kp[ 9]] ^ kp[25]; + x[10] = logf[x[10] + kp[10]] ^ kp[26]; + x[11] = expf[x[11] ^ kp[11]] + kp[27]; + + x[12] = expf[x[12] ^ kp[12]] + kp[28]; + x[13] = logf[x[13] + kp[13]] ^ kp[29]; + x[14] = logf[x[14] + kp[14]] ^ kp[30]; + x[15] = expf[x[15] ^ kp[15]] + kp[31]; + + x[ 1] += x[ 0]; x[ 0] += x[ 1]; + x[ 3] += x[ 2]; x[ 2] += x[ 3]; + x[ 5] += x[ 4]; x[ 4] += x[ 5]; + x[ 7] += x[ 6]; x[ 6] += x[ 7]; + x[ 9] += x[ 8]; x[ 8] += x[ 9]; + x[11] += x[10]; x[10] += x[11]; + x[13] += x[12]; x[12] += x[13]; + x[15] += x[14]; x[14] += x[15]; + + x[ 7] += x[ 0]; x[ 0] += x[ 7]; + x[ 1] += x[ 2]; x[ 2] += x[ 1]; + x[ 3] += x[ 4]; x[ 4] += x[ 3]; + x[ 5] += x[ 6]; x[ 6] += x[ 5]; + x[11] += x[ 8]; x[ 8] += x[11]; + x[ 9] += x[10]; x[10] += x[ 9]; + x[15] += x[12]; x[12] += x[15]; + x[13] += x[14]; x[14] += x[13]; + + x[ 3] += x[ 0]; x[ 0] += x[ 3]; + x[15] += x[ 2]; x[ 2] += x[15]; + x[ 7] += x[ 4]; x[ 4] += x[ 7]; + x[ 1] += x[ 6]; x[ 6] += x[ 1]; + x[ 5] += x[ 8]; x[ 8] += x[ 5]; + x[13] += x[10]; x[10] += x[13]; + x[11] += x[12]; x[12] += x[11]; + x[ 9] += x[14]; x[14] += x[ 9]; + + x[13] += x[ 0]; x[ 0] += x[13]; + x[ 5] += x[ 2]; x[ 2] += x[ 5]; + x[ 9] += x[ 4]; x[ 4] += x[ 9]; + x[11] += x[ 6]; x[ 6] += x[11]; + x[15] += x[ 8]; x[ 8] += x[15]; + x[ 1] += x[10]; x[10] += x[ 1]; + x[ 3] += x[12]; x[12] += x[ 3]; + x[ 7] += x[14]; x[14] += x[ 7]; + + t = x[0]; x[0] = x[14]; x[14] = x[12]; x[12] = x[10]; x[10] = x[2]; + x[2] = x[8]; x[8] = x[4]; x[4] = t; + + t = x[1]; x[1] = x[7]; x[7] = x[11]; x[11] = x[5]; x[5] = x[13]; x[13] = t; + + t = x[15]; x[15] = x[3]; x[3] = t; +}; + +void do_ir(u1byte x[16], u1byte *kp) +{ u1byte t; + + t = x[3]; x[3] = x[15]; x[15] = t; + + t = x[13]; x[13] = x[5]; x[5] = x[11]; x[11] = x[7]; x[7] = x[1]; x[1] = t; + + t = x[4]; x[4] = x[8]; x[8] = x[2]; x[2] = x[10]; + x[10] = x[12]; x[12] = x[14]; x[14] = x[0]; x[0] = t; + + x[14] -= x[ 7]; x[ 7] -= x[14]; + x[12] -= x[ 3]; x[ 3] -= x[12]; + x[10] -= x[ 1]; x[ 1] -= x[10]; + x[ 8] -= x[15]; x[15] -= x[ 8]; + x[ 6] -= x[11]; x[11] -= x[ 6]; + x[ 4] -= x[ 9]; x[ 9] -= x[ 4]; + x[ 2] -= x[ 5]; x[ 5] -= x[ 2]; + x[ 0] -= x[13]; x[13] -= x[ 0]; + + x[14] -= x[ 9]; x[ 9] -= x[14]; + x[12] -= x[11]; x[11] -= x[12]; + x[10] -= x[13]; x[13] -= x[10]; + x[ 8] -= x[ 5]; x[ 5] -= x[ 8]; + x[ 6] -= x[ 1]; x[ 1] -= x[ 6]; + x[ 4] -= x[ 7]; x[ 7] -= x[ 4]; + x[ 2] -= x[15]; x[15] -= x[ 2]; + x[ 0] -= x[ 3]; x[ 3] -= x[ 0]; + + x[14] -= x[13]; x[13] -= x[14]; + x[12] -= x[15]; x[15] -= x[12]; + x[10] -= x[ 9]; x[ 9] -= x[10]; + x[ 8] -= x[11]; x[11] -= x[ 8]; + x[ 6] -= x[ 5]; x[ 5] -= x[ 6]; + x[ 4] -= x[ 3]; x[ 3] -= x[ 4]; + x[ 2] -= x[ 1]; x[ 1] -= x[ 2]; + x[ 0] -= x[ 7]; x[ 7] -= x[ 0]; + + x[14] -= x[15]; x[15] -= x[14]; + x[12] -= x[13]; x[13] -= x[12]; + x[10] -= x[11]; x[11] -= x[10]; + x[ 8] -= x[ 9]; x[ 9] -= x[ 8]; + x[ 6] -= x[ 7]; x[ 7] -= x[ 6]; + x[ 4] -= x[ 5]; x[ 5] -= x[ 4]; + x[ 2] -= x[ 3]; x[ 3] -= x[ 2]; + x[ 0] -= x[ 1]; x[ 1] -= x[ 0]; + + x[ 0] = logf[x[ 0] - kp[16] + 256] ^ kp[ 0]; + x[ 1] = expf[x[ 1] ^ kp[17]] - kp[ 1]; + x[ 2] = expf[x[ 2] ^ kp[18]] - kp[ 2]; + x[ 3] = logf[x[ 3] - kp[19] + 256] ^ kp[ 3]; + + x[ 4] = logf[x[ 4] - kp[20] + 256] ^ kp[ 4]; + x[ 5] = expf[x[ 5] ^ kp[21]] - kp[ 5]; + x[ 6] = expf[x[ 6] ^ kp[22]] - kp[ 6]; + x[ 7] = logf[x[ 7] - kp[23] + 256] ^ kp[ 7]; + + x[ 8] = logf[x[ 8] - kp[24] + 256] ^ kp[ 8]; + x[ 9] = expf[x[ 9] ^ kp[25]] - kp[ 9]; + x[10] = expf[x[10] ^ kp[26]] - kp[10]; + x[11] = logf[x[11] - kp[27] + 256] ^ kp[11]; + + x[12] = logf[x[12] - kp[28] + 256] ^ kp[12]; + x[13] = expf[x[13] ^ kp[29]] - kp[13]; + x[14] = expf[x[14] ^ kp[30]] - kp[14]; + x[15] = logf[x[15] - kp[31] + 256] ^ kp[15]; +}; + +void encrypt(const u4byte in_blk[4], u4byte out_blk[4]) +{ u1byte blk[16], *kp; + + get_block(blk); + + do_fr(blk, l_key); do_fr(blk, l_key + 32); + do_fr(blk, l_key + 64); do_fr(blk, l_key + 96); + do_fr(blk, l_key + 128); do_fr(blk, l_key + 160); + do_fr(blk, l_key + 192); do_fr(blk, l_key + 224); + + if(k_bytes > 16) + { + do_fr(blk, l_key + 256); do_fr(blk, l_key + 288); + do_fr(blk, l_key + 320); do_fr(blk, l_key + 352); + } + + if(k_bytes > 24) + { + do_fr(blk, l_key + 384); do_fr(blk, l_key + 416); + do_fr(blk, l_key + 448); do_fr(blk, l_key + 480); + } + + kp = l_key + 16 * k_bytes; + + blk[ 0] ^= kp[ 0]; blk[ 1] += kp[ 1]; + blk[ 2] += kp[ 2]; blk[ 3] ^= kp[ 3]; + blk[ 4] ^= kp[ 4]; blk[ 5] += kp[ 5]; + blk[ 6] += kp[ 6]; blk[ 7] ^= kp[ 7]; + blk[ 8] ^= kp[ 8]; blk[ 9] += kp[ 9]; + blk[10] += kp[10]; blk[11] ^= kp[11]; + blk[12] ^= kp[12]; blk[13] += kp[13]; + blk[14] += kp[14]; blk[15] ^= kp[15]; + + put_block(blk); +}; + +void decrypt(const u4byte in_blk[4], u4byte out_blk[4]) +{ u1byte blk[16], *kp; + + get_block(blk); + + kp = l_key + 16 * k_bytes; + + blk[ 0] ^= kp[ 0]; blk[ 1] -= kp[ 1]; + blk[ 2] -= kp[ 2]; blk[ 3] ^= kp[ 3]; + blk[ 4] ^= kp[ 4]; blk[ 5] -= kp[ 5]; + blk[ 6] -= kp[ 6]; blk[ 7] ^= kp[ 7]; + blk[ 8] ^= kp[ 8]; blk[ 9] -= kp[ 9]; + blk[10] -= kp[10]; blk[11] ^= kp[11]; + blk[12] ^= kp[12]; blk[13] -= kp[13]; + blk[14] -= kp[14]; blk[15] ^= kp[15]; + + if(k_bytes > 24) + { + do_ir(blk, l_key + 480); do_ir(blk, l_key + 448); + do_ir(blk, l_key + 416); do_ir(blk, l_key + 384); + } + + if(k_bytes > 16) + { + do_ir(blk, l_key + 352); do_ir(blk, l_key + 320); + do_ir(blk, l_key + 288); do_ir(blk, l_key + 256); + } + + do_ir(blk, l_key + 224); do_ir(blk, l_key + 192); + do_ir(blk, l_key + 160); do_ir(blk, l_key + 128); + do_ir(blk, l_key + 96); do_ir(blk, l_key + 64); + do_ir(blk, l_key + 32); do_ir(blk, l_key); + + put_block(blk); +}; diff -urN lin.2.2.17/crypto/serp6f.c int.2.2.17.x/crypto/serp6f.c --- lin.2.2.17/crypto/serp6f.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/serp6f.c Sat Oct 14 01:01:32 2000 @@ -0,0 +1,1050 @@ + +/* Optimized implementation of the Serpent AES candidate algorithm + * Designed by Anderson, Biham and Knudsen and Implemented by + * Gisle Sælensminde 2000. + * + * The implementation is based on the pentium optimised sboxes of + * Dag Arne Osvik. Even these sboxes are designed to be optimal for x86 + * processors they are efficient on other processors as well, but the speedup + * isn't so impressive compared to other implementations. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * as published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + */ + +#include +#include +#include +#include +#include + +#include + +#define rotl(reg, val) ((reg << val) | (reg >> (32 - val))) +#define rotr(reg, val) ((reg >> val) | (reg << (32 - val))) + +#define io_swap(x) __cpu_to_be32(x) + +#define BLOCK_SWAP + +/* The sbox functions. The first four parameters is the input bits, and + * the last is a tempoary. These parameters are also used for output, but + * the bit order is permuted. The output bit order from S0 is + * (1 4 2 0 3), where 3 is the (now useless) tempoary. + */ + +#define S0(r0,r1,r2,r3,r4) \ + r3 = r3 ^ r0; \ + r4 = r1; \ + r1 = r1 & r3; \ + r4 = r4 ^ r2; \ + r1 = r1 ^ r0; \ + r0 = r0 | r3; \ + r0 = r0 ^ r4; \ + r4 = r4 ^ r3; \ + r3 = r3 ^ r2; \ + r2 = r2 | r1; \ + r2 = r2 ^ r4; \ + r4 = -1 ^ r4; \ + r4 = r4 | r1; \ + r1 = r1 ^ r3; \ + r1 = r1 ^ r4; \ + r3 = r3 | r0; \ + r1 = r1 ^ r3; \ + r4 = r4 ^ r3; + +#define S1(r0,r1,r2,r3,r4) \ + r1 = -1 ^ r1; \ + r4 = r0; \ + r0 = r0 ^ r1; \ + r4 = r4 | r1; \ + r4 = r4 ^ r3; \ + r3 = r3 & r0; \ + r2 = r2 ^ r4; \ + r3 = r3 ^ r1; \ + r3 = r3 | r2; \ + r0 = r0 ^ r4; \ + r3 = r3 ^ r0; \ + r1 = r1 & r2; \ + r0 = r0 | r1; \ + r1 = r1 ^ r4; \ + r0 = r0 ^ r2; \ + r4 = r4 | r3; \ + r0 = r0 ^ r4; \ + r4 = -1 ^ r4; \ + r1 = r1 ^ r3; \ + r4 = r4 & r2; \ + r1 = -1 ^ r1; \ + r4 = r4 ^ r0; \ + r1 = r1 ^ r4; + +#define S2(r0,r1,r2,r3,r4) \ + r4 = r0; \ + r0 = r0 & r2; \ + r0 = r0 ^ r3; \ + r2 = r2 ^ r1; \ + r2 = r2 ^ r0; \ + r3 = r3 | r4; \ + r3 = r3 ^ r1; \ + r4 = r4 ^ r2; \ + r1 = r3; \ + r3 = r3 | r4; \ + r3 = r3 ^ r0; \ + r0 = r0 & r1; \ + r4 = r4 ^ r0; \ + r1 = r1 ^ r3; \ + r1 = r1 ^ r4; \ + r4 = -1 ^ r4; + +#define S3(r0,r1,r2,r3,r4) \ + r4 = r0 ; \ + r0 = r0 | r3; \ + r3 = r3 ^ r1; \ + r1 = r1 & r4; \ + r4 = r4 ^ r2; \ + r2 = r2 ^ r3; \ + r3 = r3 & r0; \ + r4 = r4 | r1; \ + r3 = r3 ^ r4; \ + r0 = r0 ^ r1; \ + r4 = r4 & r0; \ + r1 = r1 ^ r3; \ + r4 = r4 ^ r2; \ + r1 = r1 | r0; \ + r1 = r1 ^ r2; \ + r0 = r0 ^ r3; \ + r2 = r1; \ + r1 = r1 | r3; \ + r1 = r1 ^ r0; + +#define S4(r0,r1,r2,r3,r4) \ + r1 = r1 ^ r3; \ + r3 = -1 ^ r3; \ + r2 = r2 ^ r3; \ + r3 = r3 ^ r0; \ + r4 = r1; \ + r1 = r1 & r3; \ + r1 = r1 ^ r2; \ + r4 = r4 ^ r3; \ + r0 = r0 ^ r4; \ + r2 = r2 & r4; \ + r2 = r2 ^ r0; \ + r0 = r0 & r1; \ + r3 = r3 ^ r0; \ + r4 = r4 | r1; \ + r4 = r4 ^ r0; \ + r0 = r0 | r3; \ + r0 = r0 ^ r2; \ + r2 = r2 & r3; \ + r0 = -1 ^ r0; \ + r4 = r4 ^ r2; + +#define S5(r0,r1,r2,r3,r4) \ + r0 = r0 ^ r1; \ + r1 = r1 ^ r3; \ + r3 = -1 ^ r3; \ + r4 = r1; \ + r1 = r1 & r0; \ + r2 = r2 ^ r3; \ + r1 = r1 ^ r2; \ + r2 = r2 | r4; \ + r4 = r4 ^ r3; \ + r3 = r3 & r1; \ + r3 = r3 ^ r0; \ + r4 = r4 ^ r1; \ + r4 = r4 ^ r2; \ + r2 = r2 ^ r0; \ + r0 = r0 & r3; \ + r2 = -1 ^ r2; \ + r0 = r0 ^ r4; \ + r4 = r4 | r3; \ + r2 = r2 ^ r4; + +#define S6(r0,r1,r2,r3,r4) \ + r2 = -1 ^ r2; \ + r4 = r3; \ + r3 = r3 & r0; \ + r0 = r0 ^ r4; \ + r3 = r3 ^ r2; \ + r2 = r2 | r4; \ + r1 = r1 ^ r3; \ + r2 = r2 ^ r0; \ + r0 = r0 | r1; \ + r2 = r2 ^ r1; \ + r4 = r4 ^ r0; \ + r0 = r0 | r3; \ + r0 = r0 ^ r2; \ + r4 = r4 ^ r3; \ + r4 = r4 ^ r0; \ + r3 = -1 ^ r3; \ + r2 = r2 & r4; \ + r2 = r2 ^ r3; + +#define S7(r0,r1,r2,r3,r4) \ + r4 = r2; \ + r2 = r2 & r1; \ + r2 = r2 ^ r3; \ + r3 = r3 & r1; \ + r4 = r4 ^ r2; \ + r2 = r2 ^ r1; \ + r1 = r1 ^ r0; \ + r0 = r0 | r4; \ + r0 = r0 ^ r2; \ + r3 = r3 ^ r1; \ + r2 = r2 ^ r3; \ + r3 = r3 & r0; \ + r3 = r3 ^ r4; \ + r4 = r4 ^ r2; \ + r2 = r2 & r0; \ + r4 = -1 ^ r4; \ + r2 = r2 ^ r4; \ + r4 = r4 & r0; \ + r1 = r1 ^ r3; \ + r4 = r4 ^ r1; + +/* The inverse sboxes */ + +#define I0(r0,r1,r2,r3,r4) \ + r2 = r2 ^ -1; \ + r4 = r1; \ + r1 = r1 | r0; \ + r4 = r4 ^ -1; \ + r1 = r1 ^ r2; \ + r2 = r2 | r4; \ + r1 = r1 ^ r3; \ + r0 = r0 ^ r4; \ + r2 = r2 ^ r0; \ + r0 = r0 & r3; \ + r4 = r4 ^ r0; \ + r0 = r0 | r1; \ + r0 = r0 ^ r2; \ + r3 = r3 ^ r4; \ + r2 = r2 ^ r1; \ + r3 = r3 ^ r0; \ + r3 = r3 ^ r1; \ + r2 = r2 & r3; \ + r4 = r4 ^ r2; + +#define I1(r0,r1,r2,r3,r4) \ + r4 = r1; \ + r1 = r1 ^ r3; \ + r3 = r3 & r1; \ + r4 = r4 ^ r2; \ + r3 = r3 ^ r0; \ + r0 = r0 | r1; \ + r2 = r2 ^ r3; \ + r0 = r0 ^ r4; \ + r0 = r0 | r2; \ + r1 = r1 ^ r3; \ + r0 = r0 ^ r1; \ + r1 = r1 | r3; \ + r1 = r1 ^ r0; \ + r4 = r4 ^ -1; \ + r4 = r4 ^ r1; \ + r1 = r1 | r0; \ + r1 = r1 ^ r0; \ + r1 = r1 | r4; \ + r3 = r3 ^ r1; + +#define I2(r0,r1,r2,r3,r4) \ + r2 = r2 ^ r3; \ + r3 = r3 ^ r0; \ + r4 = r3; \ + r3 = r3 & r2; \ + r3 = r3 ^ r1; \ + r1 = r1 | r2; \ + r1 = r1 ^ r4; \ + r4 = r4 & r3; \ + r2 = r2 ^ r3; \ + r4 = r4 & r0; \ + r4 = r4 ^ r2; \ + r2 = r2 & r1; \ + r2 = r2 | r0; \ + r3 = r3 ^ -1; \ + r2 = r2 ^ r3; \ + r0 = r0 ^ r3; \ + r0 = r0 & r1; \ + r3 = r3 ^ r4; \ + r3 = r3 ^ r0; + +#define I3(r0,r1,r2,r3,r4) \ + r4 = r2; \ + r2 = r2 ^ r1; \ + r0 = r0 ^ r2; \ + r4 = r4 & r2; \ + r4 = r4 ^ r0; \ + r0 = r0 & r1; \ + r1 = r1 ^ r3; \ + r3 = r3 | r4; \ + r2 = r2 ^ r3; \ + r0 = r0 ^ r3; \ + r1 = r1 ^ r4; \ + r3 = r3 & r2; \ + r3 = r3 ^ r1; \ + r1 = r1 ^ r0; \ + r1 = r1 | r2; \ + r0 = r0 ^ r3; \ + r1 = r1 ^ r4; \ + r0 = r0 ^ r1; + +#define I4(r0,r1,r2,r3,r4) \ + r4 = r2; \ + r2 = r2 & r3; \ + r2 = r2 ^ r1; \ + r1 = r1 | r3; \ + r1 = r1 & r0; \ + r4 = r4 ^ r2; \ + r4 = r4 ^ r1; \ + r1 = r1 & r2; \ + r0 = r0 ^ -1; \ + r3 = r3 ^ r4; \ + r1 = r1 ^ r3; \ + r3 = r3 & r0; \ + r3 = r3 ^ r2; \ + r0 = r0 ^ r1; \ + r2 = r2 & r0; \ + r3 = r3 ^ r0; \ + r2 = r2 ^ r4; \ + r2 = r2 | r3; \ + r3 = r3 ^ r0; \ + r2 = r2 ^ r1; + +#define I5(r0,r1,r2,r3,r4) \ + r1 = r1 ^ -1; \ + r4 = r3; \ + r2 = r2 ^ r1; \ + r3 = r3 | r0; \ + r3 = r3 ^ r2; \ + r2 = r2 | r1; \ + r2 = r2 & r0; \ + r4 = r4 ^ r3; \ + r2 = r2 ^ r4; \ + r4 = r4 | r0; \ + r4 = r4 ^ r1; \ + r1 = r1 & r2; \ + r1 = r1 ^ r3; \ + r4 = r4 ^ r2; \ + r3 = r3 & r4; \ + r4 = r4 ^ r1; \ + r3 = r3 ^ r0; \ + r3 = r3 ^ r4; \ + r4 = r4 ^ -1; + + +#define I6(r0,r1,r2,r3,r4) \ + r0 = r0 ^ r2; \ + r4 = r2; \ + r2 = r2 & r0; \ + r4 = r4 ^ r3; \ + r2 = r2 ^ -1; \ + r3 = r3 ^ r1; \ + r2 = r2 ^ r3; \ + r4 = r4 | r0; \ + r0 = r0 ^ r2; \ + r3 = r3 ^ r4; \ + r4 = r4 ^ r1; \ + r1 = r1 & r3; \ + r1 = r1 ^ r0; \ + r0 = r0 ^ r3; \ + r0 = r0 | r2; \ + r3 = r3 ^ r1; \ + r4 = r4 ^ r0; + + #define I7(r0,r1,r2,r3,r4) \ + r4 = r2; \ + r2 = r2 ^ r0; \ + r0 = r0 & r3; \ + r4 = r4 | r3; \ + r2 = r2 ^ -1; \ + r3 = r3 ^ r1; \ + r1 = r1 | r0; \ + r0 = r0 ^ r2; \ + r2 = r2 & r4; \ + r3 = r3 & r4; \ + r1 = r1 ^ r2; \ + r2 = r2 ^ r0; \ + r0 = r0 | r2; \ + r4 = r4 ^ r1; \ + r0 = r0 ^ r3; \ + r3 = r3 ^ r4; \ + r4 = r4 | r0; \ + r3 = r3 ^ r2; \ + r4 = r4 ^ r2; + +/* forward and inverse linear transformations */ + +#define LINTRANS(r0,r1,r2,r3,r4) \ + r0 = rotl(r0, 13); \ + r2 = rotl(r2, 3); \ + r3 = r3 ^ r2; \ + r4 = r0 << 3; \ + r1 = r1 ^ r0; \ + r3 = r3 ^ r4; \ + r1 = r1 ^ r2; \ + r3 = rotl(r3, 7); \ + r1 = rotl(r1, 1); \ + r2 = r2 ^ r3; \ + r4 = r1 << 7; \ + r0 = r0 ^ r1; \ + r2 = r2 ^ r4; \ + r0 = r0 ^ r3; \ + r2 = rotl(r2, 22); \ + r0 = rotl(r0, 5); + +#define ILINTRANS(r0,r1,r2,r3,r4) \ + r2 = rotr(r2, 22); \ + r0 = rotr(r0, 5); \ + r2 = r2 ^ r3; \ + r4 = r1 << 7; \ + r0 = r0 ^ r1; \ + r2 = r2 ^ r4; \ + r0 = r0 ^ r3; \ + r3 = rotr(r3, 7); \ + r1 = rotr(r1, 1); \ + r3 = r3 ^ r2; \ + r4 = r0 << 3; \ + r1 = r1 ^ r0; \ + r3 = r3 ^ r4; \ + r1 = r1 ^ r2; \ + r2 = rotr(r2, 3); \ + r0 = rotr(r0, 13); + + +#define KEYMIX(r0,r1,r2,r3,r4,IN) \ + r0 = r0 ^ l_key[IN+8]; \ + r1 = r1 ^ l_key[IN+9]; \ + r2 = r2 ^ l_key[IN+10]; \ + r3 = r3 ^ l_key[IN+11]; + +#define GETKEY(r0, r1, r2, r3, IN) \ + r0 = l_key[IN+8]; \ + r1 = l_key[IN+9]; \ + r2 = l_key[IN+10]; \ + r3 = l_key[IN+11]; + +#define SETKEY(r0, r1, r2, r3, IN) \ + l_key[IN+8] = r0; \ + l_key[IN+9] = r1; \ + l_key[IN+10] = r2; \ + l_key[IN+11] = r3; + +/* initialise the key schedule from the user supplied key */ + +int serpent_set_key(struct cipher_context *cx, unsigned char *key, int key_len) +{ u32 *in_key = (u32 *)key; + /* l_key - storage for the key schedule */ + u32 *l_key = cx->keyinfo; + u32 i,lk,r0,r1,r2,r3,r4; + + key_len *= 8; + + if(key_len < 0 || key_len > 256) + + return 1; + + i = 0; lk = (key_len + 31) / 32; + + while(i < lk) + { +#ifdef BLOCK_SWAP + l_key[i] = io_swap(in_key[lk - i - 1]); +#else + l_key[i] = in_key[i]; +#endif + i++; + } + + if(key_len < 256) + { + while(i < 8) + + l_key[i++] = 0; + + i = key_len / 32; lk = 1 << key_len % 32; + + l_key[i] = l_key[i] & (lk - 1) | lk; + } + + for(i = 0; i < 132; ++i) + { + lk = l_key[i] ^ l_key[i + 3] ^ l_key[i + 5] + ^ l_key[i + 7] ^ 0x9e3779b9 ^ i; + + l_key[i + 8] = (lk << 11) | (lk >> 21); + } + + GETKEY(r0, r1, r2, r3, 0); + S3(r0,r1,r2,r3,r4); + SETKEY(r1, r2, r3, r4, 0) + + GETKEY(r0, r1, r2, r3, 4); + S2(r0,r1,r2,r3,r4); + SETKEY(r2, r3, r1, r4, 4) + + GETKEY(r0, r1, r2, r3, 8); + S1(r0,r1,r2,r3,r4); + SETKEY(r3, r1, r2, r0, 8) + + GETKEY(r0, r1, r2, r3, 12); + S0(r0,r1,r2,r3,r4); + SETKEY(r1, r4, r2, r0, 12) + + GETKEY(r0, r1, r2, r3, 16); + S7(r0,r1,r2,r3,r4); + SETKEY(r2, r4, r3, r0, 16) + + GETKEY(r0, r1, r2, r3, 20); + S6(r0,r1,r2,r3,r4) + SETKEY(r0, r1, r4, r2, 20) + + GETKEY(r0, r1, r2, r3, 24); + S5(r0,r1,r2,r3,r4); + SETKEY(r1, r3, r0, r2, 24) + + GETKEY(r0, r1, r2, r3, 28); + S4(r0,r1,r2,r3,r4) + SETKEY(r1, r4, r0, r3, 28) + + GETKEY(r0, r1, r2, r3, 32); + S3(r0,r1,r2,r3,r4); + SETKEY(r1, r2, r3, r4, 32) + + GETKEY(r0, r1, r2, r3, 36); + S2(r0,r1,r2,r3,r4); + SETKEY(r2, r3, r1, r4, 36) + + GETKEY(r0, r1, r2, r3, 40); + S1(r0,r1,r2,r3,r4); + SETKEY(r3, r1, r2, r0, 40) + + GETKEY(r0, r1, r2, r3, 44); + S0(r0,r1,r2,r3,r4); + SETKEY(r1, r4, r2, r0, 44) + + GETKEY(r0, r1, r2, r3, 48); + S7(r0,r1,r2,r3,r4); + SETKEY(r2, r4, r3, r0, 48) + + GETKEY(r0, r1, r2, r3, 52); + S6(r0,r1,r2,r3,r4) + SETKEY(r0, r1, r4, r2, 52) + + GETKEY(r0, r1, r2, r3, 56); + S5(r0,r1,r2,r3,r4); + SETKEY(r1, r3, r0, r2, 56) + + GETKEY(r0, r1, r2, r3, 60); + S4(r0,r1,r2,r3,r4) + SETKEY(r1, r4, r0, r3, 60) + + GETKEY(r0, r1, r2, r3, 64); + S3(r0,r1,r2,r3,r4); + SETKEY(r1, r2, r3, r4, 64) + + GETKEY(r0, r1, r2, r3, 68); + S2(r0,r1,r2,r3,r4); + SETKEY(r2, r3, r1, r4, 68) + + GETKEY(r0, r1, r2, r3, 72); + S1(r0,r1,r2,r3,r4); + SETKEY(r3, r1, r2, r0, 72) + + GETKEY(r0, r1, r2, r3, 76); + S0(r0,r1,r2,r3,r4); + SETKEY(r1, r4, r2, r0, 76) + + GETKEY(r0, r1, r2, r3, 80); + S7(r0,r1,r2,r3,r4); + SETKEY(r2, r4, r3, r0, 80) + + GETKEY(r0, r1, r2, r3, 84); + S6(r0,r1,r2,r3,r4) + SETKEY(r0, r1, r4, r2, 84) + + GETKEY(r0, r1, r2, r3, 88); + S5(r0,r1,r2,r3,r4); + SETKEY(r1, r3, r0, r2, 88) + + GETKEY(r0, r1, r2, r3, 92); + S4(r0,r1,r2,r3,r4) + SETKEY(r1, r4, r0, r3, 92) + + GETKEY(r0, r1, r2, r3, 96); + S3(r0,r1,r2,r3,r4); + SETKEY(r1, r2, r3, r4, 96) + + GETKEY(r0, r1, r2, r3, 100); + S2(r0,r1,r2,r3,r4); + SETKEY(r2, r3, r1, r4, 100) + + GETKEY(r0, r1, r2, r3, 104); + S1(r0,r1,r2,r3,r4); + SETKEY(r3, r1, r2, r0, 104) + + GETKEY(r0, r1, r2, r3, 108); + S0(r0,r1,r2,r3,r4); + SETKEY(r1, r4, r2, r0, 108) + + GETKEY(r0, r1, r2, r3, 112); + S7(r0,r1,r2,r3,r4); + SETKEY(r2, r4, r3, r0, 112) + + GETKEY(r0, r1, r2, r3, 116); + S6(r0,r1,r2,r3,r4) + SETKEY(r0, r1, r4, r2, 116) + + GETKEY(r0, r1, r2, r3, 120); + S5(r0,r1,r2,r3,r4); + SETKEY(r1, r3, r0, r2, 120) + + GETKEY(r0, r1, r2, r3, 124); + S4(r0,r1,r2,r3,r4) + SETKEY(r1, r4, r0, r3, 124) + + GETKEY(r0, r1, r2, r3, 128); + S3(r0,r1,r2,r3,r4); + SETKEY(r1, r2, r3, r4, 128) + + return 0; +}; + +/* Encryption and decryption functions. The rounds are fully inlined. + * The sboxes alters the bit order of the output, and the altered + * bit ordrer is used progressivly. */ + +/* encrypt a block of text */ + +int serpent_encrypt(struct cipher_context *cx, const u8 *in, + u8 *out, int size) +{ u32 *l_key = cx->keyinfo; + const u32 *in_blk = (u32 *) in; + u32 *out_blk = (u32 *) out; + u32 r0,r1,r2,r3,r4; + +#ifdef BLOCK_SWAP + r0 = io_swap(in_blk[3]); r1 = io_swap(in_blk[2]); + r2 = io_swap(in_blk[1]); r3 = io_swap(in_blk[0]); +#else + r0 = in_blk[0]; r1 = in_blk[1]; r2 = in_blk[2]; r3 = in_blk[3]; +#endif + + /* round 1 */ + KEYMIX(r0,r1,r2,r3,r4,0); + S0(r0,r1,r2,r3,r4); + LINTRANS(r1,r4,r2,r0,r3); + + /* round 2 */ + KEYMIX(r1,r4,r2,r0,r3,4); + S1(r1,r4,r2,r0,r3); + LINTRANS(r0,r4,r2,r1,r3); + + /* round 3 */ + KEYMIX(r0,r4,r2,r1,r3,8); + S2(r0,r4,r2,r1,r3); + LINTRANS(r2,r1,r4,r3,r0); + + /* round 4 */ + KEYMIX(r2,r1,r4,r3,r0,12); + S3(r2,r1,r4,r3,r0); + LINTRANS(r1,r4,r3,r0,r2); + + /* round 5 */ + KEYMIX(r1,r4,r3,r0,r2,16); + S4(r1,r4,r3,r0,r2) + LINTRANS(r4,r2,r1,r0,r3); + + /* round 6 */ + KEYMIX(r4,r2,r1,r0,r3,20); + S5(r4,r2,r1,r0,r3); + LINTRANS(r2,r0,r4,r1,r3); + + /* round 7 */ + KEYMIX(r2,r0,r4,r1,r3,24); + S6(r2,r0,r4,r1,r3) + LINTRANS(r2,r0,r3,r4,r1); + + /* round 8 */ + KEYMIX(r2,r0,r3,r4,r1,28); + S7(r2,r0,r3,r4,r1); + LINTRANS(r3,r1,r4,r2,r0); + + /* round 9 */ + KEYMIX(r3,r1,r4,r2,r0,32); + S0(r3,r1,r4,r2,r0); + LINTRANS(r1,r0,r4,r3,r2); + + /* round 10 */ + KEYMIX(r1,r0,r4,r3,r2,36); + S1(r1,r0,r4,r3,r2); + LINTRANS(r3,r0,r4,r1,r2); + + /* round 11 */ + KEYMIX(r3,r0,r4,r1,r2,40); + S2(r3,r0,r4,r1,r2); + LINTRANS(r4,r1,r0,r2,r3); + + /* round 12 */ + KEYMIX(r4,r1,r0,r2,r3,44); + S3(r4,r1,r0,r2,r3); + LINTRANS(r1,r0,r2,r3,r4); + + /* round 13 */ + KEYMIX(r1,r0,r2,r3,r4,48); + S4(r1,r0,r2,r3,r4) + LINTRANS(r0,r4,r1,r3,r2); + + /* round 14 */ + KEYMIX(r0,r4,r1,r3,r2,52); + S5(r0,r4,r1,r3,r2); + LINTRANS(r4,r3,r0,r1,r2); + + /* round 15 */ + KEYMIX(r4,r3,r0,r1,r2,56); + S6(r4,r3,r0,r1,r2) + LINTRANS(r4,r3,r2,r0,r1); + + /* round 16 */ + KEYMIX(r4,r3,r2,r0,r1,60); + S7(r4,r3,r2,r0,r1); + LINTRANS(r2,r1,r0,r4,r3); + + /* round 17 */ + KEYMIX(r2,r1,r0,r4,r3,64); + S0(r2,r1,r0,r4,r3); + LINTRANS(r1,r3,r0,r2,r4); + + /* round 18 */ + KEYMIX(r1,r3,r0,r2,r4,68); + S1(r1,r3,r0,r2,r4); + LINTRANS(r2,r3,r0,r1,r4); + + /* round 19 */ + KEYMIX(r2,r3,r0,r1,r4,72); + S2(r2,r3,r0,r1,r4); + LINTRANS(r0,r1,r3,r4,r2); + + /* round 20 */ + KEYMIX(r0,r1,r3,r4,r2,76); + S3(r0,r1,r3,r4,r2); + LINTRANS(r1,r3,r4,r2,r0); + + /* round 21 */ + KEYMIX(r1,r3,r4,r2,r0,80); + S4(r1,r3,r4,r2,r0) + LINTRANS(r3,r0,r1,r2,r4); + + /* round 22 */ + KEYMIX(r3,r0,r1,r2,r4,84); + S5(r3,r0,r1,r2,r4); + LINTRANS(r0,r2,r3,r1,r4); + + /* round 23 */ + KEYMIX(r0,r2,r3,r1,r4,88); + S6(r0,r2,r3,r1,r4) + LINTRANS(r0,r2,r4,r3,r1); + + /* round 24 */ + KEYMIX(r0,r2,r4,r3,r1,92); + S7(r0,r2,r4,r3,r1); + LINTRANS(r4,r1,r3,r0,r2); + + /* round 25 */ + KEYMIX(r4,r1,r3,r0,r2,96); + S0(r4,r1,r3,r0,r2); + LINTRANS(r1,r2,r3,r4,r0); + + /* round 26 */ + KEYMIX(r1,r2,r3,r4,r0,100); + S1(r1,r2,r3,r4,r0); + LINTRANS(r4,r2,r3,r1,r0); + + /* round 27 */ + KEYMIX(r4,r2,r3,r1,r0,104); + S2(r4,r2,r3,r1,r0); + LINTRANS(r3,r1,r2,r0,r4); + + /* round 28 */ + KEYMIX(r3,r1,r2,r0,r4,108); + S3(r3,r1,r2,r0,r4); + LINTRANS(r1,r2,r0,r4,r3); + + /* round 29 */ + KEYMIX(r1,r2,r0,r4,r3,112); + S4(r1,r2,r0,r4,r3) + LINTRANS(r2,r3,r1,r4,r0); + + /* round 30 */ + KEYMIX(r2,r3,r1,r4,r0,116); + S5(r2,r3,r1,r4,r0); + LINTRANS(r3,r4,r2,r1,r0); + + /* round 31 */ + KEYMIX(r3,r4,r2,r1,r0,120); + S6(r3,r4,r2,r1,r0) + LINTRANS(r3,r4,r0,r2,r1); + + /* round 32 */ + KEYMIX(r3,r4,r0,r2,r1,124); + S7(r3,r4,r0,r2,r1); + KEYMIX(r0,r1,r2,r3,r4,128); + + +#ifdef BLOCK_SWAP + out_blk[3] = io_swap(r0); out_blk[2] = io_swap(r1); + out_blk[1] = io_swap(r2); out_blk[0] = io_swap(r3); +#else + out_blk[0] = r0; out_blk[1] = r1; out_blk[2] = r2; out_blk[3] = r3; +#endif + return 0; +}; + +/* decrypt a block of text */ + +int serpent_decrypt(struct cipher_context *cx, const u8 *in, + u8 *out, int size) +{ u32 *l_key = cx->keyinfo; + const u32 *in_blk = (const u32 *)in; + u32 *out_blk = (u32 *)out; + u32 r0,r1,r2,r3,r4; + +#ifdef BLOCK_SWAP + r0 = io_swap(in_blk[3]); r1 = io_swap(in_blk[2]); + r2 = io_swap(in_blk[1]); r3 = io_swap(in_blk[0]); +#else + r0 = in_blk[0]; r1 = in_blk[1]; r2 = in_blk[2]; r3 = in_blk[3]; +#endif + + /* round 1 */ + KEYMIX(r0,r1,r2,r3,r4,128); + I7(r0,r1,r2,r3,r4); + KEYMIX(r3,r0,r1,r4,r2,124); + + /* round 2 */ + ILINTRANS(r3,r0,r1,r4,r2); + I6(r3,r0,r1,r4,r2); + KEYMIX(r0,r1,r2,r4,r3,120); + + /* round 3 */ + ILINTRANS(r0,r1,r2,r4,r3); + I5(r0,r1,r2,r4,r3); + KEYMIX(r1,r3,r4,r2,r0,116); + + /* round 4 */ + ILINTRANS(r1,r3,r4,r2,r0); + I4(r1,r3,r4,r2,r0); + KEYMIX(r1,r2,r4,r0,r3,112); + + /* round 5 */ + ILINTRANS(r1,r2,r4,r0,r3); + I3(r1,r2,r4,r0,r3); + KEYMIX(r4,r2,r0,r1,r3,108); + + /* round 6 */ + ILINTRANS(r4,r2,r0,r1,r3); + I2(r4,r2,r0,r1,r3); + KEYMIX(r2,r3,r0,r1,r4,104); + + /* round 7 */ + ILINTRANS(r2,r3,r0,r1,r4); + I1(r2,r3,r0,r1,r4); + KEYMIX(r4,r2,r1,r0,r3,100); + + /* round 8 */ + ILINTRANS(r4,r2,r1,r0,r3); + I0(r4,r2,r1,r0,r3); + KEYMIX(r4,r3,r2,r0,r1,96); + + /* round 9 */ + ILINTRANS(r4,r3,r2,r0,r1); + I7(r4,r3,r2,r0,r1); + KEYMIX(r0,r4,r3,r1,r2,92); + + /* round 10 */ + ILINTRANS(r0,r4,r3,r1,r2); + I6(r0,r4,r3,r1,r2); + KEYMIX(r4,r3,r2,r1,r0,88); + + /* round 11 */ + ILINTRANS(r4,r3,r2,r1,r0); + I5(r4,r3,r2,r1,r0); + KEYMIX(r3,r0,r1,r2,r4,84); + + /* round 12 */ + ILINTRANS(r3,r0,r1,r2,r4); + I4(r3,r0,r1,r2,r4); + KEYMIX(r3,r2,r1,r4,r0,80); + + /* round 13 */ + ILINTRANS(r3,r2,r1,r4,r0); + I3(r3,r2,r1,r4,r0); + KEYMIX(r1,r2,r4,r3,r0,76); + + /* round 14 */ + ILINTRANS(r1,r2,r4,r3,r0); + I2(r1,r2,r4,r3,r0); + KEYMIX(r2,r0,r4,r3,r1,72); + + /* round 15 */ + ILINTRANS(r2,r0,r4,r3,r1); + I1(r2,r0,r4,r3,r1); + KEYMIX(r1,r2,r3,r4,r0,68); + + /* round 16 */ + ILINTRANS(r1,r2,r3,r4,r0); + I0(r1,r2,r3,r4,r0); + KEYMIX(r1,r0,r2,r4,r3,64); + + /* round 17 */ + ILINTRANS(r1,r0,r2,r4,r3); + I7(r1,r0,r2,r4,r3); + KEYMIX(r4,r1,r0,r3,r2,60); + + /* round 18 */ + ILINTRANS(r4,r1,r0,r3,r2); + I6(r4,r1,r0,r3,r2); + KEYMIX(r1,r0,r2,r3,r4,56); + + /* round 19 */ + ILINTRANS(r1,r0,r2,r3,r4); + I5(r1,r0,r2,r3,r4); + KEYMIX(r0,r4,r3,r2,r1,52); + + /* round 20 */ + ILINTRANS(r0,r4,r3,r2,r1); + I4(r0,r4,r3,r2,r1); + KEYMIX(r0,r2,r3,r1,r4,48); + + /* round 21 */ + ILINTRANS(r0,r2,r3,r1,r4); + I3(r0,r2,r3,r1,r4); + KEYMIX(r3,r2,r1,r0,r4,44); + + /* round 22 */ + ILINTRANS(r3,r2,r1,r0,r4); + I2(r3,r2,r1,r0,r4); + KEYMIX(r2,r4,r1,r0,r3,40); + + /* round 23 */ + ILINTRANS(r2,r4,r1,r0,r3); + I1(r2,r4,r1,r0,r3); + KEYMIX(r3,r2,r0,r1,r4,36); + + /* round 24 */ + ILINTRANS(r3,r2,r0,r1,r4); + I0(r3,r2,r0,r1,r4); + KEYMIX(r3,r4,r2,r1,r0,32); + + /* round 25 */ + ILINTRANS(r3,r4,r2,r1,r0); + I7(r3,r4,r2,r1,r0); + KEYMIX(r1,r3,r4,r0,r2,28); + + /* round 26 */ + ILINTRANS(r1,r3,r4,r0,r2); + I6(r1,r3,r4,r0,r2); + KEYMIX(r3,r4,r2,r0,r1,24); + + /* round 27 */ + ILINTRANS(r3,r4,r2,r0,r1); + I5(r3,r4,r2,r0,r1); + KEYMIX(r4,r1,r0,r2,r3,20); + + /* round 28 */ + ILINTRANS(r4,r1,r0,r2,r3); + I4(r4,r1,r0,r2,r3); + KEYMIX(r4,r2,r0,r3,r1,16); + + /* round 29 */ + ILINTRANS(r4,r2,r0,r3,r1); + I3(r4,r2,r0,r3,r1); + KEYMIX(r0,r2,r3,r4,r1,12); + + /* round 30 */ + ILINTRANS(r0,r2,r3,r4,r1); + I2(r0,r2,r3,r4,r1); + KEYMIX(r2,r1,r3,r4,r0,8); + + /* round 31 */ + ILINTRANS(r2,r1,r3,r4,r0); + I1(r2,r1,r3,r4,r0); + KEYMIX(r0,r2,r4,r3,r1,4); + + /* round 32 */ + ILINTRANS(r0,r2,r4,r3,r1); + I0(r0,r2,r4,r3,r1); + KEYMIX(r0,r1,r2,r3,r4,0); + +#ifdef BLOCK_SWAP + out_blk[3] = io_swap(r0); out_blk[2] = io_swap(r1); + out_blk[1] = io_swap(r2); out_blk[0] = io_swap(r3); +#else + out_blk[0] = r0; out_blk[1] = r1; out_blk[2] = r2; out_blk[3] = r3; +#endif + return 0; +}; + + +static void serpent_lock(void) +{ + MOD_INC_USE_COUNT; +} + +static void serpent_unlock(void) +{ + MOD_DEC_USE_COUNT; +} + + +#define CIPHER_BITS_128 +#define CIPHER_NAME(x) serpent##x +#include "gen-cbc.h" +#include "gen-ecb.h" + +static struct cipher_implementation serpent = { + {{NULL,NULL},CIPHER_SERPENT, "serpent"}, + blocksize: 16, + ivsize: 0, + key_schedule_size: SERPENT_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(serpent_ecb), + INIT_CIPHER_OPS(serpent) +}; + +static struct cipher_implementation serpent_cbc = { + {{NULL,NULL},CIPHER_SERPENT | CIPHER_CBC, "serpent-cbc"}, + blocksize: 16, + ivsize: 16, + key_schedule_size: SERPENT_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(serpent_cbc), + INIT_CIPHER_OPS(serpent) +}; + +#ifdef MODULE +int __init init_module(void) +#else +int __init init_serpent(void) +#endif +{ + if (register_cipher(&serpent)) + printk(KERN_WARNING "Couldn't register serpent encryption\n"); + if (register_cipher(&serpent_cbc)) + printk(KERN_WARNING "Couldn't register serpent-cbc encryption\n"); + + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ + if (unregister_cipher(&serpent)) + printk(KERN_WARNING "Couldn't unregister serpent encryption\n"); + if (unregister_cipher(&serpent_cbc)) + printk(KERN_WARNING "Couldn't unregister serpent-cbc encryption\n"); +} +#endif + diff -urN lin.2.2.17/crypto/sha1c.c int.2.2.17.x/crypto/sha1c.c --- lin.2.2.17/crypto/sha1c.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/sha1c.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,182 @@ +/* +Modified for kerneli by Andrew McDonald +from: + +SHA-1 in C +By Steve Reid +100% Public Domain +Available from: +ftp://ftp.zedz.net/pub/crypto/crypto/HASH/sha/sha1.c + +Test Vectors (from FIPS PUB 180-1) +"abc" + A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D +"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 +A million repetitions of "a" + 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F +*/ + +#define SHA1HANDSOFF /* Copies data before messing with it. */ + +#include + +struct SHA1_CTX { + unsigned long state[5]; + unsigned long count[2]; + unsigned char buffer[64]; +}; + +void SHA1Transform(unsigned long state[5], unsigned char buffer[64]); +void SHA1Init(struct SHA1_CTX* context); +void SHA1Update(struct SHA1_CTX* context, unsigned char* data, unsigned int len); +void SHA1Final(unsigned char digest[20], struct SHA1_CTX* context); + +#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) + +/* blk0() and blk() perform the initial expand. */ +/* I got the idea of expanding during the round function from SSLeay */ +#ifdef __LITTLE_ENDIAN +#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ + |(rol(block->l[i],8)&0x00FF00FF)) +#else +#define blk0(i) block->l[i] +#endif /* __LITTLE_ENDIAN */ +#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ + ^block->l[(i+2)&15]^block->l[i&15],1)) + +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ +#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); +#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); +#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); + + +/* Hash a single 512-bit block. This is the core of the algorithm. */ + +void SHA1Transform(unsigned long state[5], unsigned char buffer[64]) +{ + unsigned long a, b, c, d, e; + typedef union { + unsigned char c[64]; + unsigned long l[16]; + } CHAR64LONG16; + CHAR64LONG16* block; +#ifdef SHA1HANDSOFF + static unsigned char workspace[64]; + block = (CHAR64LONG16*)workspace; + memcpy(block, buffer, 64); +#else + block = (CHAR64LONG16*)buffer; +#endif + /* Copy context->state[] to working vars */ + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + /* 4 rounds of 20 operations each. Loop unrolled. */ + R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); + R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); + R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); + R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); + R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); + R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); + R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); + R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); + R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); + R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); + R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); + R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); + R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); + R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); + R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); + R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); + R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); + R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); + R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); + R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); + /* Add the working vars back into context.state[] */ + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + /* Wipe variables */ + a = b = c = d = e = 0; +} + + +/* SHA1Init - Initialize new context */ + +void SHA1Init(struct SHA1_CTX* context) +{ + /* SHA1 initialization constants */ + context->state[0] = 0x67452301; + context->state[1] = 0xEFCDAB89; + context->state[2] = 0x98BADCFE; + context->state[3] = 0x10325476; + context->state[4] = 0xC3D2E1F0; + context->count[0] = context->count[1] = 0; +} + + +/* Run your data through this. */ + +void SHA1Update(struct SHA1_CTX* context, unsigned char* data, unsigned int len) +{ + unsigned int i, j; + + j = (context->count[0] >> 3) & 63; + if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++; + context->count[1] += (len >> 29); + if ((j + len) > 63) { + memcpy(&context->buffer[j], data, (i = 64-j)); + SHA1Transform(context->state, context->buffer); + for ( ; i + 63 < len; i += 64) { + SHA1Transform(context->state, &data[i]); + } + j = 0; + } + else i = 0; + memcpy(&context->buffer[j], &data[i], len - i); +} + + +/* Add padding and return the message digest. */ + +void SHA1Final(unsigned char digest[20], struct SHA1_CTX* context) +{ + unsigned long i, j; + unsigned char finalcount[8]; + + for (i = 0; i < 8; i++) { + finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] + >> ((3-(i & 3)) * 8) ) & 255); + /* Endian independent */ + } + SHA1Update(context, (unsigned char *)"\200", 1); + while ((context->count[0] & 504) != 448) { + SHA1Update(context, (unsigned char *)"\0", 1); + } + SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ + for (i = 0; i < 20; i++) { + digest[i] = (unsigned char) + ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); + } + /* Wipe variables */ + i = j = 0; + memset(context->buffer, 0, 64); + memset(context->state, 0, 20); + memset(context->count, 0, 8); + memset(&finalcount, 0, 8); +#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite it's own static vars */ + SHA1Transform(context->state, context->buffer); +#endif +} + + + + + diff -urN lin.2.2.17/crypto/sha1glue.c int.2.2.17.x/crypto/sha1glue.c --- lin.2.2.17/crypto/sha1glue.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/sha1glue.c Mon Oct 16 17:28:18 2000 @@ -0,0 +1,102 @@ +/* + * Modified by Andrew McDonald from md5glue + * by Alan Smithee, mailed to maintainer on pulped trees. + * + * Glue that ties the standard SHA1 code to the rest of the system. + * Everything below this line is GPL. + * + */ + +#include +#include +#include +#include +#include +#include "sha1c.c" + +int +sha1_open (struct digest_context *cx) +{ + if (!cx || !cx->digest_info) + return -EINVAL; + + SHA1Init ((struct SHA1_CTX *) cx->digest_info); + + return 0; +} + +int +sha1_update (struct digest_context *cx, u8 *in, int size) +{ + if (!cx || !in || !cx->digest_info) + return -EINVAL; + + SHA1Update ((struct SHA1_CTX *) cx->digest_info, in, size); + + return 0; +} + +int +sha1_digest (struct digest_context *cx, u8 *out) +{ + struct SHA1_CTX tmp; + + if (!cx || !out || !cx->digest_info) + return -EINVAL; + + memcpy (&tmp, (struct SHA1_CTX *) cx->digest_info, + sizeof (struct SHA1_CTX)); + SHA1Final (out, &tmp); + + return 0; +} + +int +sha1_close (struct digest_context *cx, u8 *out) +{ + u8 tmp[16]; + + if (!cx || !cx->digest_info) + return -EINVAL; + + if (out == 0) + out = tmp; + + SHA1Final (out, (struct SHA1_CTX *) cx->digest_info); + + return 0; +} + +void sha1_lock (void) +{ + MOD_INC_USE_COUNT; +} + +void sha1_unlock(void) +{ + MOD_DEC_USE_COUNT; +} + +static struct digest_implementation sha1 = { + {{NULL,NULL},DIGEST_SHA1, "sha1"}, + blocksize: 20, + working_size: SHA1_WORKING_SIZE, + INIT_DIGEST_OPS(sha1) +}; + +#ifdef MODULE +#define init_sha1 init_module +#endif + +int __init init_sha1 (void) +{ + register_digest (&sha1); + return 0; +} + +#ifdef MODULE +void cleanup_module (void) +{ + unregister_digest (&sha1); +} +#endif diff -urN lin.2.2.17/crypto/testing/Makefile int.2.2.17.x/crypto/testing/Makefile --- lin.2.2.17/crypto/testing/Makefile Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/Makefile Sat Oct 14 00:48:24 2000 @@ -0,0 +1,30 @@ + +all: ../crypto.a testcip speed test_blowfish digesttest + +../crypto.a: + @if [ ! -f ../crypto.a ]; then \ + echo "You need to compile the kernel first"; fi + +%.o : %.c + gcc -O2 -Wall -g -c -I../../include $(CFLAGS) $(CPPFLAGS) $< -o $@ + +speed: ../crypto.a stubs.o speed.o misc.o + gcc -g -o speed speed.c -I../../include/ ../crypto.a stubs.o misc.o + +test_blowfish: ../crypto.a stubs.o test_blowfish.o misc.o + gcc -g -o test_blowfish test_blowfish.c -I../../include/ ../crypto.a stubs.o misc.o + +stubs.o: stubs.c + gcc -O2 -g -Wall -D__KERNEL__ -c -o stubs.o -I../../include/ stubs.c + +testcip: testcip.c stubs.o misc.o + gcc -O2 -g -Wall -o testcip testcip.c -I../../include/ ../crypto.a stubs.o misc.o + +testapi: testapi.c stubs.o misc.o + gcc -O2 -g -Wall -o testapi testapi.c -I../../include/ ../crypto.a stubs.o misc.o + +digesttest: ../crypto.a stubs.o digesttest.o + gcc -g -o digesttest digesttest.c -I../../include/ ../crypto.a stubs.o misc.o + +clean: + rm -f speed test_blowfish testcip digesttest *.o diff -urN lin.2.2.17/crypto/testing/aes-test int.2.2.17.x/crypto/testing/aes-test --- lin.2.2.17/crypto/testing/aes-test Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/aes-test Tue Oct 17 09:45:50 2000 @@ -0,0 +1,48 @@ +#!/bin/bash + +CIPHER="$1" # cipher to use +KATFILE="$2" # file with known-answer-test values in NIST's + # ecb_tbl.txt format should be given on stdin. + + +[ "$#" -ne 2 ] && cat < 1999-11-16 + * with bits from speed.c: + * written by Alexander Kjeldaas 1998-11-23 + * + * Copyright 1999 by Andrew McDonald. + * Some code, Copyright 1998 by Alexander Kjeldaas. + * Redistribution of this file is permitted under the GNU Public License. + */ + +#define __KERNEL__ + +#define printk printk_dummy + +#include + +#undef memcpy +#undef memset +#undef printk + +#include "libcfuncs.h" +#include "misc.h" + + +int digest_test(struct digest_implementation *di, FILE *file); + + +int main(int argc, char* argv[]) +{ + int digest; + struct digest_implementation *di; + FILE *file; + + if (argc < 2 || argc > 3) { + printf("Usage:\n"); + printf("digesttest digestnum [filename]\n"); + exit(1); + } + + cryptoapi_init(); + digest = atoi(argv[1]); + di = find_digest_by_id(digest); + if (!di) + exit(1); + PRINTF("Testing digest %s, number %d...\n", di->trans.t_name, + di->trans.t_id); + + if (argc < 3) + file = stdin; + else { + if (!(file = fopen(argv[2], "rb"))) { + fprintf(stderr, "Can't open file %s", argv[2]); + exit(1); + } + } + + digest_test(di, file); + exit(0); +} + +int digest_test(struct digest_implementation *di, FILE *file) +{ + struct digest_context* cx; + u8* output; + u8 buf[16384]; + int i, j; + + cx = (struct digest_context *) malloc(sizeof(struct digest_context)); + cx->di = di; + cx->digest_info = (u32 *) malloc(di->working_size); + output = (unsigned char *) malloc(di->blocksize); + di->open(cx); + + while (!feof(file)) { + i = fread(buf, 1, 16384, file); + di->update(cx, buf, i); + } + + di->close(cx, output); + + fclose(file); + + for (i = 0; i < (di->blocksize / sizeof(unsigned int)); i++) { + for (j = 0; j < sizeof(unsigned int); j++) { + printf("%02X", output[i*4+j]); + } + printf(" "); + } + printf("\n"); + return 0; +} diff -urN lin.2.2.17/crypto/testing/libcfuncs.h int.2.2.17.x/crypto/testing/libcfuncs.h --- lin.2.2.17/crypto/testing/libcfuncs.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/libcfuncs.h Sat Oct 14 00:48:24 2000 @@ -0,0 +1,39 @@ + +/* Mixing kernel header-files and GNU libc header files does not work, + * so we define what we need from libc here + * + */ + +#define EOF (-1) +typedef void *FILE; +extern int fprintf (FILE *, const char *format, ...); +extern int fflush (FILE *); +extern FILE stdout, stdin, stderr; +extern int printf (const char *format, ...); +extern int vprintf(const char *format, va_list ap); +extern int open(const char *pathname, int flags); +extern int gettimeofday(struct timeval *tv, void *); +extern void *malloc(size_t size); +extern int errno; +extern int close(int fd); +extern void perror(const char *s); +extern ssize_t read(int fd, void *buf, size_t count); +extern int getopt(int argc, char * const argv[], + const char *optstring); +extern char *optarg; +extern int optind, opterr, optopt; +extern int fsync(int fd); +extern int toupper (int c); +extern int tolower (int c); +extern int atoi(const char *nptr); +extern FILE *fopen (const char *path, const char *mode); +extern int feof( FILE *stream); +extern size_t fread( void *ptr, size_t size, size_t nmemb, FILE + *stream); + +extern size_t fwrite( const void *ptr, size_t size, size_t nmemb, + FILE *stream); +extern int fclose( FILE *stream); +extern int rand(void); +extern char *strdup(const char *s); + diff -urN lin.2.2.17/crypto/testing/mars_ecb_vk.txt int.2.2.17.x/crypto/testing/mars_ecb_vk.txt --- lin.2.2.17/crypto/testing/mars_ecb_vk.txt Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/mars_ecb_vk.txt Mon Oct 16 17:27:04 2000 @@ -0,0 +1,2332 @@ +========================= + +FILENAME: "ecb_vk.txt" + +Electronic Codebook (ECB) Mode +Variable Key Known Answer Tests + +Algorithm Name: Mars +Principle Submitter: IBM + +========== + +KEYSIZE=128 + +PT=00000000000000000000000000000000 + +I=1 +KEY=80000000000000000000000000000000 +CT=B3E2AD5608AC1B6733A7CB4FDF8F9952 + +I=2 +KEY=40000000000000000000000000000000 +CT=8655D5CCAF76A3A8AA09841F04689465 + +I=3 +KEY=20000000000000000000000000000000 +CT=F611F21A70C0AB5FB3D52AD5E8196E09 + +I=4 +KEY=10000000000000000000000000000000 +CT=6676D02EAE3EE58FA396BE40A3A6A234 + +I=5 +KEY=08000000000000000000000000000000 +CT=786E147E5D66764A16DFE1DCB10F3F13 + +I=6 +KEY=04000000000000000000000000000000 +CT=FDDBC84DA51496AD1CA2B7013B93FFA8 + +I=7 +KEY=02000000000000000000000000000000 +CT=B5A0BB3A8E7FEAC192B7BF8080E2CC81 + +I=8 +KEY=01000000000000000000000000000000 +CT=9A4802E8BF4426467617E9A44072EB76 + +I=9 +KEY=00800000000000000000000000000000 +CT=BE279F4EE696EC5B07820A1066F110CD + +I=10 +KEY=00400000000000000000000000000000 +CT=4BBB919E52C258960549FAE9DD5FF524 + +I=11 +KEY=00200000000000000000000000000000 +CT=6B077B5DE4C9961DC6E11053662E3CFB + +I=12 +KEY=00100000000000000000000000000000 +CT=755358499858F166C9DEAF2E79B3EDA3 + +I=13 +KEY=00080000000000000000000000000000 +CT=632644AA2ACB4FB3214E9E5BFF57D4D8 + +I=14 +KEY=00040000000000000000000000000000 +CT=DD3F06DD5A90BD7EA3F4B1BFB56E4ABB + +I=15 +KEY=00020000000000000000000000000000 +CT=B2FB07551FD5B549C857020356B99D45 + +I=16 +KEY=00010000000000000000000000000000 +CT=5DE9EF4627A3EB6FD3920C322ECE9FAB + +I=17 +KEY=00008000000000000000000000000000 +CT=A8D37D0254E1C908AAD02631B614A0C6 + +I=18 +KEY=00004000000000000000000000000000 +CT=91372C769C1E64DE0FDDC1C63436B623 + +I=19 +KEY=00002000000000000000000000000000 +CT=4F8FF5063FFF638497733E1526EE27BD + +I=20 +KEY=00001000000000000000000000000000 +CT=5157ECB5597AC6A8D761E97517C65C0F + +I=21 +KEY=00000800000000000000000000000000 +CT=117B9349CFFD2066452CC0FE204C18A5 + +I=22 +KEY=00000400000000000000000000000000 +CT=AE0AF51926529A3F354F7585578F6439 + +I=23 +KEY=00000200000000000000000000000000 +CT=B2723B8D2D61497DBF44FF9D70E48C0E + +I=24 +KEY=00000100000000000000000000000000 +CT=464B3EB2A0F8A394DA239E0D0D62EDE2 + +I=25 +KEY=00000080000000000000000000000000 +CT=AA03D30E1CE0E91DC360B1E538017F05 + +I=26 +KEY=00000040000000000000000000000000 +CT=B1EDF5E18160BF8E16F386D999BF65BE + +I=27 +KEY=00000020000000000000000000000000 +CT=85F1BDD358B23675328841103F1DCE65 + +I=28 +KEY=00000010000000000000000000000000 +CT=38DEA42C35E5758C7C5CCF451936DFCB + +I=29 +KEY=00000008000000000000000000000000 +CT=E484E7CB2D35D5AE92939B06864A0E6B + +I=30 +KEY=00000004000000000000000000000000 +CT=53B7E22F63F4D8AAC66D148619A7691D + +I=31 +KEY=00000002000000000000000000000000 +CT=0042A8EDB756329533D82ED13386E648 + +I=32 +KEY=00000001000000000000000000000000 +CT=44BBDB223AFCC69EB69C5D07AF10E5D8 + +I=33 +KEY=00000000800000000000000000000000 +CT=C5B1739AF4C0AE459BF11144132D0979 + +I=34 +KEY=00000000400000000000000000000000 +CT=151BBFAECB027BAB90C8DA3E4743F033 + +I=35 +KEY=00000000200000000000000000000000 +CT=376786816F319B96A19B134143952FE5 + +I=36 +KEY=00000000100000000000000000000000 +CT=3E94AC897203461EFD9EED441F66AE9F + +I=37 +KEY=00000000080000000000000000000000 +CT=61A93766162F0B01EDC84D47B1D4ECAA + +I=38 +KEY=00000000040000000000000000000000 +CT=B21FA9D0AC731750F15B47FFF2BC4030 + +I=39 +KEY=00000000020000000000000000000000 +CT=BDE8813E0E4EAE6CECCBC4C6BD10C610 + +I=40 +KEY=00000000010000000000000000000000 +CT=50A5AE30DC3432F3060EE3628B274FFB + +I=41 +KEY=00000000008000000000000000000000 +CT=E3DA95B76AD9E29F0B3F14DD33C670AC + +I=42 +KEY=00000000004000000000000000000000 +CT=969DC8A583DED13E53042450FA4BE8FA + +I=43 +KEY=00000000002000000000000000000000 +CT=D7CB0D2F9BFF048CBD8CBD8452361611 + +I=44 +KEY=00000000001000000000000000000000 +CT=E056677749114108153C6AC262EC0396 + +I=45 +KEY=00000000000800000000000000000000 +CT=E5572F1812044977D4309B8D675CAE48 + +I=46 +KEY=00000000000400000000000000000000 +CT=F00C1AB95B5CE3D3ACC2162E7A7F0262 + +I=47 +KEY=00000000000200000000000000000000 +CT=AB33C3682E0C1BFA627F4932AE4AAD94 + +I=48 +KEY=00000000000100000000000000000000 +CT=EE5B68820CB978CAACA22B1D590E31CF + +I=49 +KEY=00000000000080000000000000000000 +CT=8ACACFB9E872873E315D84657613756B + +I=50 +KEY=00000000000040000000000000000000 +CT=75CD1E528E5B6DB21BC8E44E70E5ECFA + +I=51 +KEY=00000000000020000000000000000000 +CT=3195CE6F460654E6FC00672755A5B7C3 + +I=52 +KEY=00000000000010000000000000000000 +CT=8ACC17F3EDF59AA02DBBA93F27AD11D0 + +I=53 +KEY=00000000000008000000000000000000 +CT=DD82C41281BE711F7E5DCDCDC6CBBF6F + +I=54 +KEY=00000000000004000000000000000000 +CT=971ABFC0649C9ABE7DE583799F31DD9D + +I=55 +KEY=00000000000002000000000000000000 +CT=9CD8E45DE9909A8146956F2B581AE664 + +I=56 +KEY=00000000000001000000000000000000 +CT=095314A316B4DB9CE6F2CDDEC59ECE89 + +I=57 +KEY=00000000000000800000000000000000 +CT=B626E1C40D644E2E72370CA4A3528576 + +I=58 +KEY=00000000000000400000000000000000 +CT=002E4294BD6DDE3E3BFFB0CF5A5A7D4B + +I=59 +KEY=00000000000000200000000000000000 +CT=DA89C327F041BEBDB09E835ED2A2DDBE + +I=60 +KEY=00000000000000100000000000000000 +CT=9BC999880C14C9358CA89C435B1FDB00 + +I=61 +KEY=00000000000000080000000000000000 +CT=D0C92CFF98EB228C6C19B405E6EFEE77 + +I=62 +KEY=00000000000000040000000000000000 +CT=FAE5C83332BB176704F0E73B27442C0C + +I=63 +KEY=00000000000000020000000000000000 +CT=DC9FB83F80E56CAF1DB807B5921927E8 + +I=64 +KEY=00000000000000010000000000000000 +CT=6FBB39934CC2627EE4F93343F50EB9D4 + +I=65 +KEY=00000000000000008000000000000000 +CT=02A31EDEF8DEA2DE3307748BF4DC1C54 + +I=66 +KEY=00000000000000004000000000000000 +CT=8C433C3D2005B30996ADA41F896436AC + +I=67 +KEY=00000000000000002000000000000000 +CT=ED04C68D4D73C6EE193E0FC9E2CBD1B0 + +I=68 +KEY=00000000000000001000000000000000 +CT=515E01A6F25A4F1B2B57B27DECBFF195 + +I=69 +KEY=00000000000000000800000000000000 +CT=30A07996E5C40C41786FC75B9C56325B + +I=70 +KEY=00000000000000000400000000000000 +CT=279C94707B0732D210DA7B619158825A + +I=71 +KEY=00000000000000000200000000000000 +CT=07552A95AC44BB11CD34428C858FD19F + +I=72 +KEY=00000000000000000100000000000000 +CT=BA67FC2E51DA92EA19079B237B42C9D8 + +I=73 +KEY=00000000000000000080000000000000 +CT=40387C974070B484E0DBAAFD5ADA0243 + +I=74 +KEY=00000000000000000040000000000000 +CT=3BF99A29B17D84BE5F8DC315616061F8 + +I=75 +KEY=00000000000000000020000000000000 +CT=D4EF00C794D337961FD9E3B5AF7A67A5 + +I=76 +KEY=00000000000000000010000000000000 +CT=1C77C28A6CBF3CBB24F2686ED3A408E2 + +I=77 +KEY=00000000000000000008000000000000 +CT=F93568CD7CBA7A6E9B9DD7144F1D4ABB + +I=78 +KEY=00000000000000000004000000000000 +CT=C3BCD1F7F268E2806CCF0498C85D2E3E + +I=79 +KEY=00000000000000000002000000000000 +CT=2FD2F0DEB5DBF7EB3B9050042E56A9A9 + +I=80 +KEY=00000000000000000001000000000000 +CT=2150DEB8C7C6327227A772031FF64047 + +I=81 +KEY=00000000000000000000800000000000 +CT=3E8B4B1CBB877B6F612BFB391043CFC3 + +I=82 +KEY=00000000000000000000400000000000 +CT=2376F56DFEB40C9348D758CA068C2127 + +I=83 +KEY=00000000000000000000200000000000 +CT=AABB351CA9BDCDACCD8E966766FF1C59 + +I=84 +KEY=00000000000000000000100000000000 +CT=212EF966B6CEECC65B5B0AE6A9DAA099 + +I=85 +KEY=00000000000000000000080000000000 +CT=99C95AC67935AE473E2EF3907DDCE5B3 + +I=86 +KEY=00000000000000000000040000000000 +CT=125DC68286DB1F81E6CD3D0C9EF8B922 + +I=87 +KEY=00000000000000000000020000000000 +CT=CC55D94C0102A12D87454DB8BA8E654C + +I=88 +KEY=00000000000000000000010000000000 +CT=3F1E089ACAD719F7DB9292A770038475 + +I=89 +KEY=00000000000000000000008000000000 +CT=EC4D155D404F72B4BE88D1E17C345822 + +I=90 +KEY=00000000000000000000004000000000 +CT=276F8AECA95C7F65CD95B77680955548 + +I=91 +KEY=00000000000000000000002000000000 +CT=7D78CE850C26BB18B8631CDFF0A5E597 + +I=92 +KEY=00000000000000000000001000000000 +CT=6345692D62E879A058F342D5226A036D + +I=93 +KEY=00000000000000000000000800000000 +CT=E19D5A2899061B7B5537EA6DF0390FE8 + +I=94 +KEY=00000000000000000000000400000000 +CT=4FAB8BB80E979853052BA0B19EF8521D + +I=95 +KEY=00000000000000000000000200000000 +CT=E84EE11321AF1C0AE6430C4F600270B4 + +I=96 +KEY=00000000000000000000000100000000 +CT=73048F29C44F0953DFCC6B5380D36977 + +I=97 +KEY=00000000000000000000000080000000 +CT=16280B84B187AE90E25121AB297620FA + +I=98 +KEY=00000000000000000000000040000000 +CT=FAAE881E9FA9DCA876B668CCAFA12B6A + +I=99 +KEY=00000000000000000000000020000000 +CT=46A73C4A4516E1E0BE2140E175A7225F + +I=100 +KEY=00000000000000000000000010000000 +CT=01C71A7B0BD6410894C9234A4250ABB4 + +I=101 +KEY=00000000000000000000000008000000 +CT=EA8CEF3C1E8EF94D4A17A4D4C1C28C32 + +I=102 +KEY=00000000000000000000000004000000 +CT=13BB356657B36C0D023047B324443468 + +I=103 +KEY=00000000000000000000000002000000 +CT=B14DCC5250036260131B3D92B1B26C18 + +I=104 +KEY=00000000000000000000000001000000 +CT=261E07BADC6E4BBB0EAD9ECCAE179821 + +I=105 +KEY=00000000000000000000000000800000 +CT=1D40D508EB8878251EC5C01D8E9949BB + +I=106 +KEY=00000000000000000000000000400000 +CT=735BDCA8DF0C58679161E99BED3B8D3E + +I=107 +KEY=00000000000000000000000000200000 +CT=49C907F757494623F8E8519F4A5D13A0 + +I=108 +KEY=00000000000000000000000000100000 +CT=AB858C224E5A3ADDF5A7549A98EEAF94 + +I=109 +KEY=00000000000000000000000000080000 +CT=7C7A62A1DBF206572A323682E0441458 + +I=110 +KEY=00000000000000000000000000040000 +CT=7461D6F4D609F8BCA9CAB4EB559C71C3 + +I=111 +KEY=00000000000000000000000000020000 +CT=2F646495150F4F9CA06B77281C1150FD + +I=112 +KEY=00000000000000000000000000010000 +CT=A0C27498F797D6A9F513640AFE6CC316 + +I=113 +KEY=00000000000000000000000000008000 +CT=8D511A840453125335AB8DF8C64FA8E8 + +I=114 +KEY=00000000000000000000000000004000 +CT=9E64465740D81CCB74713A144F636985 + +I=115 +KEY=00000000000000000000000000002000 +CT=804499E6C6E8790988747009D3B3C66D + +I=116 +KEY=00000000000000000000000000001000 +CT=59EBC223BAC60B13198C9AF47066274E + +I=117 +KEY=00000000000000000000000000000800 +CT=CCA216CC095954AFD3DE594C91A26310 + +I=118 +KEY=00000000000000000000000000000400 +CT=06FF525F42EFF20A548DA1B7DCD1FFF8 + +I=119 +KEY=00000000000000000000000000000200 +CT=B2F1FD473FCA588111E6EB9DCE82CFA9 + +I=120 +KEY=00000000000000000000000000000100 +CT=557307573D2E5225AD6EDADDF1FCAB68 + +I=121 +KEY=00000000000000000000000000000080 +CT=CA159F81D155071BDCA701174C69184D + +I=122 +KEY=00000000000000000000000000000040 +CT=41491AE31AB75E3ACA41B1A2CB75C1D9 + +I=123 +KEY=00000000000000000000000000000020 +CT=C3B4B9419C0E19D4A851C2DAD2954268 + +I=124 +KEY=00000000000000000000000000000010 +CT=6E3DD6DF183B80A0FF5D2D0A4B25A2C8 + +I=125 +KEY=00000000000000000000000000000008 +CT=EC69E1BD0815AE6C83876B75E58A7EB6 + +I=126 +KEY=00000000000000000000000000000004 +CT=8F5766DE11517F63A60459B1EDC32D44 + +I=127 +KEY=00000000000000000000000000000002 +CT=8A74C64985345925D8A6AB8E6A0D3589 + +I=128 +KEY=00000000000000000000000000000001 +CT=F65B8E5EAF04B33AD5FCF1B14874E059 + +========== + +KEYSIZE=192 + +PT=00000000000000000000000000000000 + +I=1 +KEY=800000000000000000000000000000000000000000000000 +CT=FD04E0B77403BBDC72A370240B45B92D + +I=2 +KEY=400000000000000000000000000000000000000000000000 +CT=CB0B4AC08E20385D31CF468B52B356E2 + +I=3 +KEY=200000000000000000000000000000000000000000000000 +CT=C39B63B4A8F7BF5C3CC61141584DE462 + +I=4 +KEY=100000000000000000000000000000000000000000000000 +CT=C63F433FF98BEE849D75D0F0402C9273 + +I=5 +KEY=080000000000000000000000000000000000000000000000 +CT=9433992C094CDBEC06199B0517970B5D + +I=6 +KEY=040000000000000000000000000000000000000000000000 +CT=FA8B068AD3C2C32F99EF1A4F76C409AF + +I=7 +KEY=020000000000000000000000000000000000000000000000 +CT=014617D6109068C39137EE0CC522163E + +I=8 +KEY=010000000000000000000000000000000000000000000000 +CT=41B87685C649AD72C32D9390C23CF34B + +I=9 +KEY=008000000000000000000000000000000000000000000000 +CT=6836281F31AA9120DC144E26074491EC + +I=10 +KEY=004000000000000000000000000000000000000000000000 +CT=C4163CB0CA1315C3D0115D495E0FF701 + +I=11 +KEY=002000000000000000000000000000000000000000000000 +CT=F0B8F3585636D2785FF619523C4365B9 + +I=12 +KEY=001000000000000000000000000000000000000000000000 +CT=6E1740E818B450955C6B7612DBBA0DAE + +I=13 +KEY=000800000000000000000000000000000000000000000000 +CT=192A2FAAC85794EB20E43645E2E1B749 + +I=14 +KEY=000400000000000000000000000000000000000000000000 +CT=5CA4011E7024A4978B58E1DFA9278625 + +I=15 +KEY=000200000000000000000000000000000000000000000000 +CT=498152C714A2CEFD692AC99DB90CDDBD + +I=16 +KEY=000100000000000000000000000000000000000000000000 +CT=DEB3A9FEB22886C511A057AB858BB4DD + +I=17 +KEY=000080000000000000000000000000000000000000000000 +CT=D60466B1EA5C1C7A5DDFDA049A685B50 + +I=18 +KEY=000040000000000000000000000000000000000000000000 +CT=62A0EE49A6333815350E9C9CD7CB24D2 + +I=19 +KEY=000020000000000000000000000000000000000000000000 +CT=3AE70846AFDCC299B32EB9DE118070B8 + +I=20 +KEY=000010000000000000000000000000000000000000000000 +CT=5118414720E424364E15B5EDC8E64559 + +I=21 +KEY=000008000000000000000000000000000000000000000000 +CT=42F9E38F7FB493D6048C63F804F5AD62 + +I=22 +KEY=000004000000000000000000000000000000000000000000 +CT=71043DAA3CF78997D9965DE84B150FA6 + +I=23 +KEY=000002000000000000000000000000000000000000000000 +CT=55B0DF5816DD16D2EB5CDDC5478D0652 + +I=24 +KEY=000001000000000000000000000000000000000000000000 +CT=CA853E905496251FF856259149FB5CCA + +I=25 +KEY=000000800000000000000000000000000000000000000000 +CT=BEF7C892708F0369378EA80C0EB9DD4A + +I=26 +KEY=000000400000000000000000000000000000000000000000 +CT=3E7D986D91BEE75E597999C3E7372F06 + +I=27 +KEY=000000200000000000000000000000000000000000000000 +CT=8877D8DAF98680C7EC03C870BAFB66F9 + +I=28 +KEY=000000100000000000000000000000000000000000000000 +CT=493B8E5D02D01A6C98DDF4D016F4932D + +I=29 +KEY=000000080000000000000000000000000000000000000000 +CT=E372455C9A44DCD5AEA803A276B2C5C3 + +I=30 +KEY=000000040000000000000000000000000000000000000000 +CT=92FCA63F71BCD0C950231E104D833246 + +I=31 +KEY=000000020000000000000000000000000000000000000000 +CT=1630F75A2F31B1998725D849CC2ADA9A + +I=32 +KEY=000000010000000000000000000000000000000000000000 +CT=E3B636FC5BE0F05A036AEDF4DE7154BD + +I=33 +KEY=000000008000000000000000000000000000000000000000 +CT=DBC8BD2D128A11715152306E19C9D1F9 + +I=34 +KEY=000000004000000000000000000000000000000000000000 +CT=AEFB45876EE3B0025A2D26A7A20E2A72 + +I=35 +KEY=000000002000000000000000000000000000000000000000 +CT=C7F1370CD98539026B8FD0968F7A8247 + +I=36 +KEY=000000001000000000000000000000000000000000000000 +CT=6D09CC037CDFD06ECAC142630A599C4F + +I=37 +KEY=000000000800000000000000000000000000000000000000 +CT=94C29805153DB7FE4834BD261F0CA87E + +I=38 +KEY=000000000400000000000000000000000000000000000000 +CT=B509BAF1EAB92764F8085764968CD111 + +I=39 +KEY=000000000200000000000000000000000000000000000000 +CT=E6ECD9CCAF93F302250A90E3C083C22E + +I=40 +KEY=000000000100000000000000000000000000000000000000 +CT=1419D2C7A7A8F7AB5D78B327770EE8F7 + +I=41 +KEY=000000000080000000000000000000000000000000000000 +CT=984FA23C883200CFA802FCBF1DE752A2 + +I=42 +KEY=000000000040000000000000000000000000000000000000 +CT=003BFBA6334DEDFF7A3652DFDC73D04A + +I=43 +KEY=000000000020000000000000000000000000000000000000 +CT=B21EC3CCD1303B81744348C64B5E5984 + +I=44 +KEY=000000000010000000000000000000000000000000000000 +CT=58557001247E8AFE91399042E723751B + +I=45 +KEY=000000000008000000000000000000000000000000000000 +CT=0EF33C5A09600898D9FFE6AF5A06C2B6 + +I=46 +KEY=000000000004000000000000000000000000000000000000 +CT=AA0E866FEE8227BF6A8FDA4B318920AB + +I=47 +KEY=000000000002000000000000000000000000000000000000 +CT=839A0DA3DB2718EEBB917B4CE37D23BF + +I=48 +KEY=000000000001000000000000000000000000000000000000 +CT=BA3292A8130B2708EEBC5B2478B52C17 + +I=49 +KEY=000000000000800000000000000000000000000000000000 +CT=49B2A8F2FC9639B5918176993D96646A + +I=50 +KEY=000000000000400000000000000000000000000000000000 +CT=21967CDE8F85ED1600F359F376CD18CA + +I=51 +KEY=000000000000200000000000000000000000000000000000 +CT=6CCA94D43AB4B3A82FA4E514D928E644 + +I=52 +KEY=000000000000100000000000000000000000000000000000 +CT=3C76EAC404CF1E23B0A159C919A60206 + +I=53 +KEY=000000000000080000000000000000000000000000000000 +CT=F9DE0E78E8CC16D3A99D7642DEA13DB0 + +I=54 +KEY=000000000000040000000000000000000000000000000000 +CT=5B74643F1DEA8CA49078E4BF54B856CA + +I=55 +KEY=000000000000020000000000000000000000000000000000 +CT=0E07FE27FBFAB005FF7EF334C3320736 + +I=56 +KEY=000000000000010000000000000000000000000000000000 +CT=477810CB11FC7E68144960AAD5372A64 + +I=57 +KEY=000000000000008000000000000000000000000000000000 +CT=A638D2171A231AFF384C97A7E9EFF6B6 + +I=58 +KEY=000000000000004000000000000000000000000000000000 +CT=9EA186F9AA6BE6D395E92474CCB9CAA3 + +I=59 +KEY=000000000000002000000000000000000000000000000000 +CT=7F6A295094E5512EDEA0B7206B977270 + +I=60 +KEY=000000000000001000000000000000000000000000000000 +CT=2DD07726A9333391A6EB41F4859A1627 + +I=61 +KEY=000000000000000800000000000000000000000000000000 +CT=515847FB17843E42C936A6201DF28563 + +I=62 +KEY=000000000000000400000000000000000000000000000000 +CT=35B29379EABD877B458FC4A4FB532931 + +I=63 +KEY=000000000000000200000000000000000000000000000000 +CT=B986149A6E871ACD8E3E1E5F5928C889 + +I=64 +KEY=000000000000000100000000000000000000000000000000 +CT=84D0A488FB56ADB915B553B2EDDBCC41 + +I=65 +KEY=000000000000000080000000000000000000000000000000 +CT=63B2B5A4D51E076D673044C71DC68B02 + +I=66 +KEY=000000000000000040000000000000000000000000000000 +CT=F388AD195E35B2892E586B830D728440 + +I=67 +KEY=000000000000000020000000000000000000000000000000 +CT=8FA923E8949678F76205CF4CBE07FF2F + +I=68 +KEY=000000000000000010000000000000000000000000000000 +CT=ACCF2708E75B4CF48E45B641B81C1F41 + +I=69 +KEY=000000000000000008000000000000000000000000000000 +CT=0A7C295579AD4296447B7E56EB719ED3 + +I=70 +KEY=000000000000000004000000000000000000000000000000 +CT=06572AAB88739B2BDEE8E1E9CCA22883 + +I=71 +KEY=000000000000000002000000000000000000000000000000 +CT=2CF0CA3DB58CDC62890D386B07A4145F + +I=72 +KEY=000000000000000001000000000000000000000000000000 +CT=CEFAEB3CEAA5959FAB15E884D46E9F09 + +I=73 +KEY=000000000000000000800000000000000000000000000000 +CT=57EB477F0573D6C75E45EE8606B5A2B6 + +I=74 +KEY=000000000000000000400000000000000000000000000000 +CT=C55F45149DE0FD18F2588B2B9F54CC22 + +I=75 +KEY=000000000000000000200000000000000000000000000000 +CT=ABCA7BE4CCC597AD8783C24EAB8BF17D + +I=76 +KEY=000000000000000000100000000000000000000000000000 +CT=702F3D046E8651BF40D6A5914D8AC8B5 + +I=77 +KEY=000000000000000000080000000000000000000000000000 +CT=2C6424E1EF097C8FB44138C8A5160AE7 + +I=78 +KEY=000000000000000000040000000000000000000000000000 +CT=3F0E8296D93C233CBBE22623CCB66A52 + +I=79 +KEY=000000000000000000020000000000000000000000000000 +CT=D828348AFD520F98ED31F0B9FA4C48B1 + +I=80 +KEY=000000000000000000010000000000000000000000000000 +CT=BA7A4AA5F32D16DF08ABAA63E72F8BAD + +I=81 +KEY=000000000000000000008000000000000000000000000000 +CT=9211FA0B1161E094BE702157D4CAFC73 + +I=82 +KEY=000000000000000000004000000000000000000000000000 +CT=1A4D5C52FDDEE81374295341F950055D + +I=83 +KEY=000000000000000000002000000000000000000000000000 +CT=9544A653B635734B0FBC84E6C64B1AD5 + +I=84 +KEY=000000000000000000001000000000000000000000000000 +CT=8B7E7EE1A74570F35183E15D05114BD0 + +I=85 +KEY=000000000000000000000800000000000000000000000000 +CT=6567CE30F21EE879D60359CEE9AD3EC0 + +I=86 +KEY=000000000000000000000400000000000000000000000000 +CT=E5078C9B9B7572A60822A44150C6A4F4 + +I=87 +KEY=000000000000000000000200000000000000000000000000 +CT=51DFF3FE97481F08F6D5B66480AEE6D5 + +I=88 +KEY=000000000000000000000100000000000000000000000000 +CT=E84E478B15FB1BCD50E3CA9936FE9E01 + +I=89 +KEY=000000000000000000000080000000000000000000000000 +CT=FC614E54348A78E28ADB5DFB11130ADC + +I=90 +KEY=000000000000000000000040000000000000000000000000 +CT=0F872CF9F54CE981ED17E41B23ED616C + +I=91 +KEY=000000000000000000000020000000000000000000000000 +CT=AFCC9646ED78283BD19092853223F347 + +I=92 +KEY=000000000000000000000010000000000000000000000000 +CT=35D5A827B175D776F8F90F30F41A1C4B + +I=93 +KEY=000000000000000000000008000000000000000000000000 +CT=B55980544140E694FCDFCE7C251C121C + +I=94 +KEY=000000000000000000000004000000000000000000000000 +CT=244C4A55D5EEC8BD55C4F0D295ED2541 + +I=95 +KEY=000000000000000000000002000000000000000000000000 +CT=B3700314BD37894991C2FD4355B26845 + +I=96 +KEY=000000000000000000000001000000000000000000000000 +CT=43F3C6FFB517CD6E8EE1AEFCAA6FDE06 + +I=97 +KEY=000000000000000000000000800000000000000000000000 +CT=0F1A3E34821335E4EC22D404155192C2 + +I=98 +KEY=000000000000000000000000400000000000000000000000 +CT=22C59B22CC6A1E0EA313346F461324CD + +I=99 +KEY=000000000000000000000000200000000000000000000000 +CT=2A90EF00D977A82EBDF6681F33D7DC1C + +I=100 +KEY=000000000000000000000000100000000000000000000000 +CT=4B36176A8C174A635BF96A5B46BCF54C + +I=101 +KEY=000000000000000000000000080000000000000000000000 +CT=E344C5213246712CAA2A056A6EE1868F + +I=102 +KEY=000000000000000000000000040000000000000000000000 +CT=8F75D3C2ABBF84F3AA5E1734D6CC76A6 + +I=103 +KEY=000000000000000000000000020000000000000000000000 +CT=2258F75A5FC2B667DD0B28039CEA784C + +I=104 +KEY=000000000000000000000000010000000000000000000000 +CT=D74F3EA90D02FC4908FDDCBE5849152E + +I=105 +KEY=000000000000000000000000008000000000000000000000 +CT=0DCD8607E57390DD609717338591B205 + +I=106 +KEY=000000000000000000000000004000000000000000000000 +CT=594419C26F408B721F82ACCAC2DF1D5B + +I=107 +KEY=000000000000000000000000002000000000000000000000 +CT=12D0F6A150858F64F0C88061CE592C11 + +I=108 +KEY=000000000000000000000000001000000000000000000000 +CT=5351E750DE5C9322AFA2885FB83C623B + +I=109 +KEY=000000000000000000000000000800000000000000000000 +CT=7C120675A918C2C728149D332A196586 + +I=110 +KEY=000000000000000000000000000400000000000000000000 +CT=CDCA42B4E3ED64C2D37812847D7377CC + +I=111 +KEY=000000000000000000000000000200000000000000000000 +CT=E4B73F8C0D9A40A67ACB9837CF8006DB + +I=112 +KEY=000000000000000000000000000100000000000000000000 +CT=A863A13ED52E8BFD6652FEE291837B1D + +I=113 +KEY=000000000000000000000000000080000000000000000000 +CT=64F9790C0BBD5C234FFADF0037485BB1 + +I=114 +KEY=000000000000000000000000000040000000000000000000 +CT=37A8AA3E38B937D92E1E41EC5E157FE0 + +I=115 +KEY=000000000000000000000000000020000000000000000000 +CT=F84D2A60A99BA9C17848BFBFBFEA0271 + +I=116 +KEY=000000000000000000000000000010000000000000000000 +CT=01AD547F2E1A713AC0B3D3E332A044A6 + +I=117 +KEY=000000000000000000000000000008000000000000000000 +CT=ED06A9B6EB5E24DF2CDA83564080AE93 + +I=118 +KEY=000000000000000000000000000004000000000000000000 +CT=3682650D35D3247471F3EB10A173479D + +I=119 +KEY=000000000000000000000000000002000000000000000000 +CT=E3BD985B5B7C83F841F2F2A37A2974B3 + +I=120 +KEY=000000000000000000000000000001000000000000000000 +CT=EEA30254CF0FD6379A7203FC2328EEB6 + +I=121 +KEY=000000000000000000000000000000800000000000000000 +CT=4F2C052C360DA20FF826DFA98429AAA5 + +I=122 +KEY=000000000000000000000000000000400000000000000000 +CT=5F4CE32E4D55F0EB15799A3C46E1C40A + +I=123 +KEY=000000000000000000000000000000200000000000000000 +CT=2EBE1C941F8247BBA3E85A04BA10B27C + +I=124 +KEY=000000000000000000000000000000100000000000000000 +CT=9F41738ADB0CD8B4DD048527FCCFC23B + +I=125 +KEY=000000000000000000000000000000080000000000000000 +CT=0E9F502FEE59A16CC5CEEDC82FD98E1A + +I=126 +KEY=000000000000000000000000000000040000000000000000 +CT=56DC540BBAFB42B9817B4D464993DBCE + +I=127 +KEY=000000000000000000000000000000020000000000000000 +CT=7421D3EB41769680565DD67683FE6737 + +I=128 +KEY=000000000000000000000000000000010000000000000000 +CT=777D08A4999E79A97CDBAFA5B6C33D12 + +I=129 +KEY=000000000000000000000000000000008000000000000000 +CT=4F3145690B092FAEDEBC672FE0ABC1EC + +I=130 +KEY=000000000000000000000000000000004000000000000000 +CT=C221E4ABE2DD5ABA26DC29B6F3E421C6 + +I=131 +KEY=000000000000000000000000000000002000000000000000 +CT=EC48948223D3086FA730F6F81C103E8B + +I=132 +KEY=000000000000000000000000000000001000000000000000 +CT=38B03357B1A0719A4E04FC3725B66400 + +I=133 +KEY=000000000000000000000000000000000800000000000000 +CT=A9458E67FD55DFB7F5D43344D7B8D994 + +I=134 +KEY=000000000000000000000000000000000400000000000000 +CT=C82BBCFE8E647A4915E578BB6BB410EC + +I=135 +KEY=000000000000000000000000000000000200000000000000 +CT=27DA68521E57EFBC401640232896ABC7 + +I=136 +KEY=000000000000000000000000000000000100000000000000 +CT=DD6C4A6784C293F1D6B334731298C043 + +I=137 +KEY=000000000000000000000000000000000080000000000000 +CT=C2C4A691BD77C60869E6C030E357B7DF + +I=138 +KEY=000000000000000000000000000000000040000000000000 +CT=EDA41EF6E7863F1A7D718E31A7D0AB0F + +I=139 +KEY=000000000000000000000000000000000020000000000000 +CT=7915CF01D36808B875E1561FB88ECF2D + +I=140 +KEY=000000000000000000000000000000000010000000000000 +CT=033826639ABFCBA709DEECD8F32306D5 + +I=141 +KEY=000000000000000000000000000000000008000000000000 +CT=B7CE1348B2832FABD58542A59319C947 + +I=142 +KEY=000000000000000000000000000000000004000000000000 +CT=479E3B195B3F9BE75AA2D0931F179495 + +I=143 +KEY=000000000000000000000000000000000002000000000000 +CT=6B9E7F0C5050E8CD232722C33261135D + +I=144 +KEY=000000000000000000000000000000000001000000000000 +CT=063F64EDD05343702B76BE045A9D1DDD + +I=145 +KEY=000000000000000000000000000000000000800000000000 +CT=E1AE2D5667E440C0A44EF9CC91AA10CC + +I=146 +KEY=000000000000000000000000000000000000400000000000 +CT=A64A692A55AF5D1C99794707BA00E670 + +I=147 +KEY=000000000000000000000000000000000000200000000000 +CT=B975AC5AFA03D77D7361AACFF32E1B39 + +I=148 +KEY=000000000000000000000000000000000000100000000000 +CT=267A1379C257776BE4CA75C8B1A59EF6 + +I=149 +KEY=000000000000000000000000000000000000080000000000 +CT=ED392DDA2AD879B58405B41FAA7A56A1 + +I=150 +KEY=000000000000000000000000000000000000040000000000 +CT=4DECF57B85B75F1A78431A972CC873F6 + +I=151 +KEY=000000000000000000000000000000000000020000000000 +CT=5F9D95B7F415376A6665BDF645E5C6AC + +I=152 +KEY=000000000000000000000000000000000000010000000000 +CT=5929FF53CC9876F923C6D19D3D101F18 + +I=153 +KEY=000000000000000000000000000000000000008000000000 +CT=D6CF5F18474D3A44D0BE029EE879E6FA + +I=154 +KEY=000000000000000000000000000000000000004000000000 +CT=8860A98873A8DBFFDC4D7835F3D59BB7 + +I=155 +KEY=000000000000000000000000000000000000002000000000 +CT=4B506DF2FF9DA5672F55624AFE5374E8 + +I=156 +KEY=000000000000000000000000000000000000001000000000 +CT=B4D6692D5AAE39519C0AAB97597A5521 + +I=157 +KEY=000000000000000000000000000000000000000800000000 +CT=7185FA267D3926EA0804F07A91398C37 + +I=158 +KEY=000000000000000000000000000000000000000400000000 +CT=8C3BD232227C1C1B214186A603D85115 + +I=159 +KEY=000000000000000000000000000000000000000200000000 +CT=5300AFD8D507A60ACB0907B4D3E3D2B0 + +I=160 +KEY=000000000000000000000000000000000000000100000000 +CT=D8A16D32AE71F991EE2C1C19153B146D + +I=161 +KEY=000000000000000000000000000000000000000080000000 +CT=32B3F26C1415BF7F82B6A637843F4C21 + +I=162 +KEY=000000000000000000000000000000000000000040000000 +CT=E416420B5F736F39328D36181992A720 + +I=163 +KEY=000000000000000000000000000000000000000020000000 +CT=619918287897135AD5516BA12A0FC6D7 + +I=164 +KEY=000000000000000000000000000000000000000010000000 +CT=69830C559F08DDCEEB6F83900DC14626 + +I=165 +KEY=000000000000000000000000000000000000000008000000 +CT=BB451FB76A7B1FE65E0332DE6E6712A3 + +I=166 +KEY=000000000000000000000000000000000000000004000000 +CT=AF2DE55E1EFFAF00EBF4EAEE45B29A4C + +I=167 +KEY=000000000000000000000000000000000000000002000000 +CT=CA31B9A81450A198A073A299C7DF14C9 + +I=168 +KEY=000000000000000000000000000000000000000001000000 +CT=4FF7E9FADFCFFBB2DD3F23214B407180 + +I=169 +KEY=000000000000000000000000000000000000000000800000 +CT=B8BC9344751D34B0BFE353E5F3A9E309 + +I=170 +KEY=000000000000000000000000000000000000000000400000 +CT=4589951B936D1948299548D199E0612F + +I=171 +KEY=000000000000000000000000000000000000000000200000 +CT=61B33E9A6A14F21B12D00832385F9BCA + +I=172 +KEY=000000000000000000000000000000000000000000100000 +CT=652B66FBC2B192ACA177D4C16ACB1E3F + +I=173 +KEY=000000000000000000000000000000000000000000080000 +CT=81A252288A18D4E4EC1F919FE34BD4C8 + +I=174 +KEY=000000000000000000000000000000000000000000040000 +CT=4D38323769C7AEFBF838F51A57E21C0E + +I=175 +KEY=000000000000000000000000000000000000000000020000 +CT=C07D35D5788A04FEEBA6A337453DEFCA + +I=176 +KEY=000000000000000000000000000000000000000000010000 +CT=6692591964FF5304D877DDE631E55AC2 + +I=177 +KEY=000000000000000000000000000000000000000000008000 +CT=1792F89A673DFE67A04BAC230317BFD3 + +I=178 +KEY=000000000000000000000000000000000000000000004000 +CT=0EC45273FAA59A4C6AA56C0BDF9DC1C4 + +I=179 +KEY=000000000000000000000000000000000000000000002000 +CT=273575F8DB870005ED51F0F1FB962A35 + +I=180 +KEY=000000000000000000000000000000000000000000001000 +CT=D9EDC0E324D69F3CAB465E3F63AC4CD3 + +I=181 +KEY=000000000000000000000000000000000000000000000800 +CT=647B9C834502295B5D46AE962ABD9059 + +I=182 +KEY=000000000000000000000000000000000000000000000400 +CT=3C8B932E1E8C1E9FD4629AF03D16D717 + +I=183 +KEY=000000000000000000000000000000000000000000000200 +CT=9FD433DAE0C3B5C35C7CA5468B4AF8DE + +I=184 +KEY=000000000000000000000000000000000000000000000100 +CT=916E8226F1925A4C7E0056E8951B4609 + +I=185 +KEY=000000000000000000000000000000000000000000000080 +CT=A53FCF269CF194C323B2C2A5B82571E2 + +I=186 +KEY=000000000000000000000000000000000000000000000040 +CT=51C6D510F3053D502D141C99FBB28618 + +I=187 +KEY=000000000000000000000000000000000000000000000020 +CT=040E54E63CCF8E5D6EE6A27EEDCC02AB + +I=188 +KEY=000000000000000000000000000000000000000000000010 +CT=DE90BD5F4C96E4F52EC9200D9E298DCD + +I=189 +KEY=000000000000000000000000000000000000000000000008 +CT=87233EAEFC125F7C6E1FE329CC415520 + +I=190 +KEY=000000000000000000000000000000000000000000000004 +CT=71B61DD72D4FBD96542E73A5E5BD7CA5 + +I=191 +KEY=000000000000000000000000000000000000000000000002 +CT=F5F6E1B6215062A2547C1A7C84EB8E86 + +I=192 +KEY=000000000000000000000000000000000000000000000001 +CT=2DD740E5E0E0CBE72EBDF2808410D55F + +========== + +KEYSIZE=256 + +PT=00000000000000000000000000000000 + +I=1 +KEY=8000000000000000000000000000000000000000000000000000000000000000 +CT=EA4FCDBA1EB0C533938AA9FA32B740F3 + +I=2 +KEY=4000000000000000000000000000000000000000000000000000000000000000 +CT=B8E6D5134AB08E553AD5785B33D66111 + +I=3 +KEY=2000000000000000000000000000000000000000000000000000000000000000 +CT=2D7805B2B86764E8FC3DD6E2EFB1532D + +I=4 +KEY=1000000000000000000000000000000000000000000000000000000000000000 +CT=B9449A4D8C53639D0A6751DB3695B325 + +I=5 +KEY=0800000000000000000000000000000000000000000000000000000000000000 +CT=B2C6850F1AAAF7CD2E9B3FC1F5433FDC + +I=6 +KEY=0400000000000000000000000000000000000000000000000000000000000000 +CT=7D124E20CE475B66BEA88399FF95C8C0 + +I=7 +KEY=0200000000000000000000000000000000000000000000000000000000000000 +CT=D5F5ED2CDEC8D3043BD0C58238AF2820 + +I=8 +KEY=0100000000000000000000000000000000000000000000000000000000000000 +CT=051135A86EADA21353CB5FFD7A58408E + +I=9 +KEY=0080000000000000000000000000000000000000000000000000000000000000 +CT=FEF406FC9C405AFB959C796E4ED0AF0D + +I=10 +KEY=0040000000000000000000000000000000000000000000000000000000000000 +CT=52DA5222BB9974AE66CC9BB77E1F15E8 + +I=11 +KEY=0020000000000000000000000000000000000000000000000000000000000000 +CT=F5DC2C5F98AF6CF4BCC23ECEEAF213AD + +I=12 +KEY=0010000000000000000000000000000000000000000000000000000000000000 +CT=09DF90DE791250ACBE170DC643780CF2 + +I=13 +KEY=0008000000000000000000000000000000000000000000000000000000000000 +CT=3FA812132A21BEB83162C33B28CC242C + +I=14 +KEY=0004000000000000000000000000000000000000000000000000000000000000 +CT=CEE571785850DD567A75D9E244660C66 + +I=15 +KEY=0002000000000000000000000000000000000000000000000000000000000000 +CT=642BB005B38790E518E53A53373C2474 + +I=16 +KEY=0001000000000000000000000000000000000000000000000000000000000000 +CT=E3EBE5FA1C748BCB125602F8B7911FAE + +I=17 +KEY=0000800000000000000000000000000000000000000000000000000000000000 +CT=C863C98E1C09C28B4A05B5FBCE64DF28 + +I=18 +KEY=0000400000000000000000000000000000000000000000000000000000000000 +CT=B4BAB3A731F8CCD8A09A5D3AFF77BE60 + +I=19 +KEY=0000200000000000000000000000000000000000000000000000000000000000 +CT=1A3FC4F1DE42F1AC5DA5F88701E6F292 + +I=20 +KEY=0000100000000000000000000000000000000000000000000000000000000000 +CT=FF43862813E9F1CFEF044F4B8CFED265 + +I=21 +KEY=0000080000000000000000000000000000000000000000000000000000000000 +CT=8F2785A7E28C1910580BBFD989A7F0D3 + +I=22 +KEY=0000040000000000000000000000000000000000000000000000000000000000 +CT=26059027035B43615A7996D19FED9D42 + +I=23 +KEY=0000020000000000000000000000000000000000000000000000000000000000 +CT=8CD8416F37E3BA1B5D6D0838F6B6E604 + +I=24 +KEY=0000010000000000000000000000000000000000000000000000000000000000 +CT=BB0BD60CD950DE5E0B9AAF78FF9A30DB + +I=25 +KEY=0000008000000000000000000000000000000000000000000000000000000000 +CT=B99C1D4F98B68E8CD7495D16F3260D7D + +I=26 +KEY=0000004000000000000000000000000000000000000000000000000000000000 +CT=4F1A4F8D20456CFE0EF0E39DE6C71B9C + +I=27 +KEY=0000002000000000000000000000000000000000000000000000000000000000 +CT=F453DB1AB45A6F5834F9908E1A15D4F7 + +I=28 +KEY=0000001000000000000000000000000000000000000000000000000000000000 +CT=DA25287B7CD050E9B3E2074ED3B49FCF + +I=29 +KEY=0000000800000000000000000000000000000000000000000000000000000000 +CT=BAB2AE0FF7C4902697DE88ED7F2FA06C + +I=30 +KEY=0000000400000000000000000000000000000000000000000000000000000000 +CT=ABE6F6C9D29A58B985A91782EE28CF3E + +I=31 +KEY=0000000200000000000000000000000000000000000000000000000000000000 +CT=5C59FBE090DB3D75D7A5A8FD76F8A3DB + +I=32 +KEY=0000000100000000000000000000000000000000000000000000000000000000 +CT=DCA806B1D0BAFCEAB015EC19A3E5C7FA + +I=33 +KEY=0000000080000000000000000000000000000000000000000000000000000000 +CT=1BA870E6D62FEB16E6C2AA1128AE5ABA + +I=34 +KEY=0000000040000000000000000000000000000000000000000000000000000000 +CT=0FE91367D4C178DD313C6AB7F3D5149A + +I=35 +KEY=0000000020000000000000000000000000000000000000000000000000000000 +CT=BFE27CB1B52150E0636A81473148B018 + +I=36 +KEY=0000000010000000000000000000000000000000000000000000000000000000 +CT=F79BE17022979D01E3AFFB3499556DC4 + +I=37 +KEY=0000000008000000000000000000000000000000000000000000000000000000 +CT=A2F2B772060C53A539B5A3FE4C935171 + +I=38 +KEY=0000000004000000000000000000000000000000000000000000000000000000 +CT=DB97947A8B14B3E3859068A0288285F6 + +I=39 +KEY=0000000002000000000000000000000000000000000000000000000000000000 +CT=1FD086FE698C5E092A8E0C9EE527714A + +I=40 +KEY=0000000001000000000000000000000000000000000000000000000000000000 +CT=8ADAB79B444DDDF86B8D53D2A9112881 + +I=41 +KEY=0000000000800000000000000000000000000000000000000000000000000000 +CT=C36CEC9730A74CE94CF2EA5C7B0EC3ED + +I=42 +KEY=0000000000400000000000000000000000000000000000000000000000000000 +CT=033629A0675A45A11BE7924137D711EC + +I=43 +KEY=0000000000200000000000000000000000000000000000000000000000000000 +CT=D5C22EF288E7D2D04BC04B57B702A03F + +I=44 +KEY=0000000000100000000000000000000000000000000000000000000000000000 +CT=1FD290A5EB2E278C6396625034EB268C + +I=45 +KEY=0000000000080000000000000000000000000000000000000000000000000000 +CT=05C35E0CB6D27E6E9D680368B2ABA9B5 + +I=46 +KEY=0000000000040000000000000000000000000000000000000000000000000000 +CT=B0194CDF7510FE98EDF9464259378FAF + +I=47 +KEY=0000000000020000000000000000000000000000000000000000000000000000 +CT=043729754E5B1F63408F62742E5F2765 + +I=48 +KEY=0000000000010000000000000000000000000000000000000000000000000000 +CT=24A2746042EC7970E8AB59589AD63775 + +I=49 +KEY=0000000000008000000000000000000000000000000000000000000000000000 +CT=7BDEF0A2EF8B637C4C3C5D001BAB5F85 + +I=50 +KEY=0000000000004000000000000000000000000000000000000000000000000000 +CT=0221B515A1559D96E9C3CBFB929E96A9 + +I=51 +KEY=0000000000002000000000000000000000000000000000000000000000000000 +CT=7E975026E5771D90EDA081B72C0BC77C + +I=52 +KEY=0000000000001000000000000000000000000000000000000000000000000000 +CT=7C7F9F98B4739C9774F84E75E5B30A95 + +I=53 +KEY=0000000000000800000000000000000000000000000000000000000000000000 +CT=A4E176B7C98D76BC6662BBB3E606BA9C + +I=54 +KEY=0000000000000400000000000000000000000000000000000000000000000000 +CT=7FDBDA5910B26D8D3FE42987B09430C0 + +I=55 +KEY=0000000000000200000000000000000000000000000000000000000000000000 +CT=7B134F40F8E10D8287B8E6FC0BDE45E8 + +I=56 +KEY=0000000000000100000000000000000000000000000000000000000000000000 +CT=CF3C98CC0CAFB2935385C0B5D8F07857 + +I=57 +KEY=0000000000000080000000000000000000000000000000000000000000000000 +CT=FB71BA47019735DA4082D68A1A587BDB + +I=58 +KEY=0000000000000040000000000000000000000000000000000000000000000000 +CT=E9D45576FC1A56DAFB48ABFB90A1DE4B + +I=59 +KEY=0000000000000020000000000000000000000000000000000000000000000000 +CT=AE9408DC1A007CA9C13F2F9D12FC4F71 + +I=60 +KEY=0000000000000010000000000000000000000000000000000000000000000000 +CT=B407201A6A44CB236468709B181BCA23 + +I=61 +KEY=0000000000000008000000000000000000000000000000000000000000000000 +CT=06E1A40D4F7534E24538D26802AF9E98 + +I=62 +KEY=0000000000000004000000000000000000000000000000000000000000000000 +CT=3468992A9D6F274286611D1E5DB327BA + +I=63 +KEY=0000000000000002000000000000000000000000000000000000000000000000 +CT=635748DEDCB4E65B76E818D09994D19A + +I=64 +KEY=0000000000000001000000000000000000000000000000000000000000000000 +CT=C2A0DACC741E90029F16CDA81BEB8D0C + +I=65 +KEY=0000000000000000800000000000000000000000000000000000000000000000 +CT=D20B9853FC98ED3FCFA4C3B9781352D3 + +I=66 +KEY=0000000000000000400000000000000000000000000000000000000000000000 +CT=869B106388046F6F5F9AE5ADC1F23BC2 + +I=67 +KEY=0000000000000000200000000000000000000000000000000000000000000000 +CT=4F9BF7227D943B80C97B2FED132098FE + +I=68 +KEY=0000000000000000100000000000000000000000000000000000000000000000 +CT=7232A96D275C409349A0382BAE576274 + +I=69 +KEY=0000000000000000080000000000000000000000000000000000000000000000 +CT=ADAF9B3E14B8CC101A2F143B373517B7 + +I=70 +KEY=0000000000000000040000000000000000000000000000000000000000000000 +CT=813E38DF25E4356EAFC7ECEB75270FD4 + +I=71 +KEY=0000000000000000020000000000000000000000000000000000000000000000 +CT=46D6957C76223046E232EEBB661CCE59 + +I=72 +KEY=0000000000000000010000000000000000000000000000000000000000000000 +CT=1714E3EDD2A7BFE4FC35D4B6034E4184 + +I=73 +KEY=0000000000000000008000000000000000000000000000000000000000000000 +CT=445ED35901D4608FAC3BCD59E685E77C + +I=74 +KEY=0000000000000000004000000000000000000000000000000000000000000000 +CT=236F86A3A59F563611C9A1A9C8DF045C + +I=75 +KEY=0000000000000000002000000000000000000000000000000000000000000000 +CT=FC0739E82EF130E533C77FA15BD85B57 + +I=76 +KEY=0000000000000000001000000000000000000000000000000000000000000000 +CT=EDC81185A966066433F1B19BE7659080 + +I=77 +KEY=0000000000000000000800000000000000000000000000000000000000000000 +CT=9D0ED59542D4851F7812B29640739765 + +I=78 +KEY=0000000000000000000400000000000000000000000000000000000000000000 +CT=4BA903B83FD4A443564723403BD7D431 + +I=79 +KEY=0000000000000000000200000000000000000000000000000000000000000000 +CT=5DA2CD3D64EDCB29588F02BFED3D575B + +I=80 +KEY=0000000000000000000100000000000000000000000000000000000000000000 +CT=E66697B697E8881555F5B358A2EB7628 + +I=81 +KEY=0000000000000000000080000000000000000000000000000000000000000000 +CT=7DE9B3320A7872088B1417AAC4E841ED + +I=82 +KEY=0000000000000000000040000000000000000000000000000000000000000000 +CT=236D82828CE9A9471B51DDCDA350C542 + +I=83 +KEY=0000000000000000000020000000000000000000000000000000000000000000 +CT=CF250F09887F0B9300FF865810A2E03F + +I=84 +KEY=0000000000000000000010000000000000000000000000000000000000000000 +CT=0103157DB999DF64D6C6DACB16F15F78 + +I=85 +KEY=0000000000000000000008000000000000000000000000000000000000000000 +CT=EA918B3C7929C992E6F0D7B0DD6B8A59 + +I=86 +KEY=0000000000000000000004000000000000000000000000000000000000000000 +CT=FB853888B1D95F9C7BB7630231C9108E + +I=87 +KEY=0000000000000000000002000000000000000000000000000000000000000000 +CT=46E63459DCC0514DD200BF82B6AEEA0B + +I=88 +KEY=0000000000000000000001000000000000000000000000000000000000000000 +CT=19051C0A056D4B56DFF08C52FBBD4547 + +I=89 +KEY=0000000000000000000000800000000000000000000000000000000000000000 +CT=055240C320AC09978BE4EC0EE9E40123 + +I=90 +KEY=0000000000000000000000400000000000000000000000000000000000000000 +CT=E0D04118BAD95366416C6D715507646B + +I=91 +KEY=0000000000000000000000200000000000000000000000000000000000000000 +CT=888C70E963419AA6446123CD9685252C + +I=92 +KEY=0000000000000000000000100000000000000000000000000000000000000000 +CT=E060A32AF3CD8A525C60A8EB4BEB5B24 + +I=93 +KEY=0000000000000000000000080000000000000000000000000000000000000000 +CT=36A235722A72A5BD05896B74EBB39E35 + +I=94 +KEY=0000000000000000000000040000000000000000000000000000000000000000 +CT=665A781CF1F7839FA4E7EF66F5B47D45 + +I=95 +KEY=0000000000000000000000020000000000000000000000000000000000000000 +CT=8156E976338FB48ED3E469F1485EAA06 + +I=96 +KEY=0000000000000000000000010000000000000000000000000000000000000000 +CT=BA853DF1B7622D17A549624B234082F8 + +I=97 +KEY=0000000000000000000000008000000000000000000000000000000000000000 +CT=3A411EF75149822F0C4E998587BA0CAD + +I=98 +KEY=0000000000000000000000004000000000000000000000000000000000000000 +CT=EA33525A7CC7C74340773389A764513E + +I=99 +KEY=0000000000000000000000002000000000000000000000000000000000000000 +CT=E007DDE8158568CF80C470745E455EEE + +I=100 +KEY=0000000000000000000000001000000000000000000000000000000000000000 +CT=C140AE31D6B8AB675539344B9D857A89 + +I=101 +KEY=0000000000000000000000000800000000000000000000000000000000000000 +CT=8C86266079ABCEE926A5EF6F80F50308 + +I=102 +KEY=0000000000000000000000000400000000000000000000000000000000000000 +CT=CD77B23315E31DF96FABD6E427184F9F + +I=103 +KEY=0000000000000000000000000200000000000000000000000000000000000000 +CT=A72E93628614A603E59ECC5C766A639B + +I=104 +KEY=0000000000000000000000000100000000000000000000000000000000000000 +CT=00EE192F18F06F5799B9593DE71B2FBE + +I=105 +KEY=0000000000000000000000000080000000000000000000000000000000000000 +CT=A79378A27F39485A2A6757A953DE8D63 + +I=106 +KEY=0000000000000000000000000040000000000000000000000000000000000000 +CT=38353F1349680DF284CF7D59272D435B + +I=107 +KEY=0000000000000000000000000020000000000000000000000000000000000000 +CT=0960EF878BE3F63CB8A25AFDEE9272F8 + +I=108 +KEY=0000000000000000000000000010000000000000000000000000000000000000 +CT=CB52EEC84DD320FB74A13DF2D4AF5B64 + +I=109 +KEY=0000000000000000000000000008000000000000000000000000000000000000 +CT=89525CFDCCC1A572987EEEC44507942D + +I=110 +KEY=0000000000000000000000000004000000000000000000000000000000000000 +CT=894183826F3CD163F2BDCE8FD123BCBD + +I=111 +KEY=0000000000000000000000000002000000000000000000000000000000000000 +CT=152FAB85782DD050EF29C8C7E95C5941 + +I=112 +KEY=0000000000000000000000000001000000000000000000000000000000000000 +CT=6C8CC544D1E6B9B8ACEB723A6E903710 + +I=113 +KEY=0000000000000000000000000000800000000000000000000000000000000000 +CT=9D1DCFEFD9CAEB5934AA93278F8E0988 + +I=114 +KEY=0000000000000000000000000000400000000000000000000000000000000000 +CT=86473616CFE39825E9F93B4A5D1518F0 + +I=115 +KEY=0000000000000000000000000000200000000000000000000000000000000000 +CT=3EC955C39DC4442411A578115482A331 + +I=116 +KEY=0000000000000000000000000000100000000000000000000000000000000000 +CT=117C11E5DAFA73A4CBA2E599582DF463 + +I=117 +KEY=0000000000000000000000000000080000000000000000000000000000000000 +CT=371B4F0F917CDC7F028CF90072EA6C0C + +I=118 +KEY=0000000000000000000000000000040000000000000000000000000000000000 +CT=F6EAC5AC916431427022EE688D4E8248 + +I=119 +KEY=0000000000000000000000000000020000000000000000000000000000000000 +CT=5E7787153D1C5E94A860600D0FE0F695 + +I=120 +KEY=0000000000000000000000000000010000000000000000000000000000000000 +CT=44888E6DD958A843AF2143DA81986196 + +I=121 +KEY=0000000000000000000000000000008000000000000000000000000000000000 +CT=F3B940BFEFF393BFDAF0C435D262961C + +I=122 +KEY=0000000000000000000000000000004000000000000000000000000000000000 +CT=40781DABC58A81B11FAA4039E6F73345 + +I=123 +KEY=0000000000000000000000000000002000000000000000000000000000000000 +CT=7685B120BD850BD6D7A618E023D42BA0 + +I=124 +KEY=0000000000000000000000000000001000000000000000000000000000000000 +CT=8088416E7FEDB30B1883DF50E29CD4D1 + +I=125 +KEY=0000000000000000000000000000000800000000000000000000000000000000 +CT=B0C9ED5257B103131AB5DBECC16D1547 + +I=126 +KEY=0000000000000000000000000000000400000000000000000000000000000000 +CT=01C8B821C4683B586CD8096A0DC4FDAA + +I=127 +KEY=0000000000000000000000000000000200000000000000000000000000000000 +CT=4CA16F058B3AE1E2B3774E3DF99087CA + +I=128 +KEY=0000000000000000000000000000000100000000000000000000000000000000 +CT=620D06B8EFBFDD1EE274D5EAE42B8F0E + +I=129 +KEY=0000000000000000000000000000000080000000000000000000000000000000 +CT=34CF934F88C0D631B3D80BE0A5671B11 + +I=130 +KEY=0000000000000000000000000000000040000000000000000000000000000000 +CT=F8AB4045BD0CD95486B921B7430E74A0 + +I=131 +KEY=0000000000000000000000000000000020000000000000000000000000000000 +CT=96ECEC4088D81E2EF27D74A96E2614DC + +I=132 +KEY=0000000000000000000000000000000010000000000000000000000000000000 +CT=EB0152474310B99F0F8F0DFD6D67962C + +I=133 +KEY=0000000000000000000000000000000008000000000000000000000000000000 +CT=74DA68DA599D7DD37918F24F7654DC4D + +I=134 +KEY=0000000000000000000000000000000004000000000000000000000000000000 +CT=F766AD686EB2BAF2950974F78968F510 + +I=135 +KEY=0000000000000000000000000000000002000000000000000000000000000000 +CT=A2D18CF5C770587E19DBD6FFEBD52FAE + +I=136 +KEY=0000000000000000000000000000000001000000000000000000000000000000 +CT=DDADE16C2B9E78715FC281197149E4F0 + +I=137 +KEY=0000000000000000000000000000000000800000000000000000000000000000 +CT=79931CFAC3FD4F540E53905538B5E122 + +I=138 +KEY=0000000000000000000000000000000000400000000000000000000000000000 +CT=93F88DDDE5004BD8998CDB7A1BD1EE4D + +I=139 +KEY=0000000000000000000000000000000000200000000000000000000000000000 +CT=011A413B2CC8E56A94A5C6D3932B3C3B + +I=140 +KEY=0000000000000000000000000000000000100000000000000000000000000000 +CT=C509B737BBC749EE466ADF8142F52B28 + +I=141 +KEY=0000000000000000000000000000000000080000000000000000000000000000 +CT=514332276B9E9299F9F722B63752B0A8 + +I=142 +KEY=0000000000000000000000000000000000040000000000000000000000000000 +CT=D9F3A75F94986D0A1AB14258934C21D1 + +I=143 +KEY=0000000000000000000000000000000000020000000000000000000000000000 +CT=6FE84CDC49C9A8A55D85EA1A1D5C0DD9 + +I=144 +KEY=0000000000000000000000000000000000010000000000000000000000000000 +CT=0C85C65BD9DE393D2FEA3BE5AC7BAB67 + +I=145 +KEY=0000000000000000000000000000000000008000000000000000000000000000 +CT=904C7F2E8084FC10D59480C3DE1CB1A4 + +I=146 +KEY=0000000000000000000000000000000000004000000000000000000000000000 +CT=52C696236B4B7EE6B03B8876DEA8DD45 + +I=147 +KEY=0000000000000000000000000000000000002000000000000000000000000000 +CT=A0D46DAEA95CB4968F62BD9B3F8075A8 + +I=148 +KEY=0000000000000000000000000000000000001000000000000000000000000000 +CT=51BE75B32A05384D2A2E08CB1EAB5F63 + +I=149 +KEY=0000000000000000000000000000000000000800000000000000000000000000 +CT=1123151EB432831D2C65A90ED1D0A429 + +I=150 +KEY=0000000000000000000000000000000000000400000000000000000000000000 +CT=A26350A8FF6C10FCBA736D46FC26BF69 + +I=151 +KEY=0000000000000000000000000000000000000200000000000000000000000000 +CT=FF85BEF6CF6674FA5EE40EC9FB9052FF + +I=152 +KEY=0000000000000000000000000000000000000100000000000000000000000000 +CT=6ED96DB33AB981AF27894AC436CB4D62 + +I=153 +KEY=0000000000000000000000000000000000000080000000000000000000000000 +CT=B38DE9B3C4D6D128101B02FDD05E3BF8 + +I=154 +KEY=0000000000000000000000000000000000000040000000000000000000000000 +CT=11E05766EBB66AB211E2D9653EF3144D + +I=155 +KEY=0000000000000000000000000000000000000020000000000000000000000000 +CT=F6A196E085116E5BC21732A2EF9ACAF4 + +I=156 +KEY=0000000000000000000000000000000000000010000000000000000000000000 +CT=BC2A6753CA41E306A0500E97B38D8A9A + +I=157 +KEY=0000000000000000000000000000000000000008000000000000000000000000 +CT=773A687B1FC97918943C1B66EF693354 + +I=158 +KEY=0000000000000000000000000000000000000004000000000000000000000000 +CT=C6E2112CCDBD821D2B9068B285C5192B + +I=159 +KEY=0000000000000000000000000000000000000002000000000000000000000000 +CT=EA69C8E28021801EE9A14809848D781F + +I=160 +KEY=0000000000000000000000000000000000000001000000000000000000000000 +CT=6290745CD4CB62DE172F8AB30966EB57 + +I=161 +KEY=0000000000000000000000000000000000000000800000000000000000000000 +CT=1051EE4C389B96B1365B417C74EFBF10 + +I=162 +KEY=0000000000000000000000000000000000000000400000000000000000000000 +CT=52B6F3EE6655128999EEE3831E708D76 + +I=163 +KEY=0000000000000000000000000000000000000000200000000000000000000000 +CT=5BDE19A1D741ECE40CE98CD02F02AD75 + +I=164 +KEY=0000000000000000000000000000000000000000100000000000000000000000 +CT=36EF5E803A68F6AC20D92FB14E2AFDF5 + +I=165 +KEY=0000000000000000000000000000000000000000080000000000000000000000 +CT=B3E1E30B78FBBCA07F065A422D33410B + +I=166 +KEY=0000000000000000000000000000000000000000040000000000000000000000 +CT=5FA0E6C8E6C1FCD613975A18348484CB + +I=167 +KEY=0000000000000000000000000000000000000000020000000000000000000000 +CT=B74E4A2406EEB2AB836AED857754A612 + +I=168 +KEY=0000000000000000000000000000000000000000010000000000000000000000 +CT=52EBF44DB69347A22DF8CA0ABAE3D668 + +I=169 +KEY=0000000000000000000000000000000000000000008000000000000000000000 +CT=986B7B05D1E9639779D034047FC3B780 + +I=170 +KEY=0000000000000000000000000000000000000000004000000000000000000000 +CT=1846AF7EB612C5C356DAF4FE42108444 + +I=171 +KEY=0000000000000000000000000000000000000000002000000000000000000000 +CT=22AD41F78567C6D5C2266486404168DC + +I=172 +KEY=0000000000000000000000000000000000000000001000000000000000000000 +CT=73409A5B03D08BCEE496F7255417DEC5 + +I=173 +KEY=0000000000000000000000000000000000000000000800000000000000000000 +CT=32C47FAEB48DA7847B3C5B063153B049 + +I=174 +KEY=0000000000000000000000000000000000000000000400000000000000000000 +CT=5514F66B91C06AD15BE581AA99F5961B + +I=175 +KEY=0000000000000000000000000000000000000000000200000000000000000000 +CT=38AF52E0648030498BA94D0BBF819B8A + +I=176 +KEY=0000000000000000000000000000000000000000000100000000000000000000 +CT=91D48EEE9A769F0753C6A6DC1037405D + +I=177 +KEY=0000000000000000000000000000000000000000000080000000000000000000 +CT=2CA3F3F2BB2332984A97E5274462E7AF + +I=178 +KEY=0000000000000000000000000000000000000000000040000000000000000000 +CT=806EE4C1C6432102E40A21F03222B0E1 + +I=179 +KEY=0000000000000000000000000000000000000000000020000000000000000000 +CT=E8BBDC90505FE81AB2024274BB2FA258 + +I=180 +KEY=0000000000000000000000000000000000000000000010000000000000000000 +CT=307920977ADAD0EEDEBA2CB8AF83D3CE + +I=181 +KEY=0000000000000000000000000000000000000000000008000000000000000000 +CT=6B0A17013DFAAD05442FA8B298043438 + +I=182 +KEY=0000000000000000000000000000000000000000000004000000000000000000 +CT=BA6EC60065FA6C9679D7E47FC1B85479 + +I=183 +KEY=0000000000000000000000000000000000000000000002000000000000000000 +CT=F1AA580B5E904BED235ACE85C0E009D0 + +I=184 +KEY=0000000000000000000000000000000000000000000001000000000000000000 +CT=9092A797F7024CC218B4A3575F4F7D63 + +I=185 +KEY=0000000000000000000000000000000000000000000000800000000000000000 +CT=CF404B154F2A8388DA9ED1E93AC78894 + +I=186 +KEY=0000000000000000000000000000000000000000000000400000000000000000 +CT=1B32215E25E3EB15FE4BED2F2F31281E + +I=187 +KEY=0000000000000000000000000000000000000000000000200000000000000000 +CT=999B92E27EC161089F45DB53D036C8F0 + +I=188 +KEY=0000000000000000000000000000000000000000000000100000000000000000 +CT=B2F7DBFD67DBC260A7CFCD9C90FEF16F + +I=189 +KEY=0000000000000000000000000000000000000000000000080000000000000000 +CT=7BD9AA3B08F103C796EE8023EF474F0A + +I=190 +KEY=0000000000000000000000000000000000000000000000040000000000000000 +CT=483121AF85F36EA159BE2EB5802FBF21 + +I=191 +KEY=0000000000000000000000000000000000000000000000020000000000000000 +CT=AE2788C2115CB466713687AB06FE5E46 + +I=192 +KEY=0000000000000000000000000000000000000000000000010000000000000000 +CT=ADE758D100ABEEB7BA80BF257781494D + +I=193 +KEY=0000000000000000000000000000000000000000000000008000000000000000 +CT=6DF30205652926EB339833F2EDD8472E + +I=194 +KEY=0000000000000000000000000000000000000000000000004000000000000000 +CT=031E86B2AD4D83A4A19BCAF191F9B65A + +I=195 +KEY=0000000000000000000000000000000000000000000000002000000000000000 +CT=F605CCC9E46B1792EA2F0B4124924F42 + +I=196 +KEY=0000000000000000000000000000000000000000000000001000000000000000 +CT=A70E3286C50B8DD8306109AB59119510 + +I=197 +KEY=0000000000000000000000000000000000000000000000000800000000000000 +CT=6922EEA4B8AE7BFECE899009848A33DA + +I=198 +KEY=0000000000000000000000000000000000000000000000000400000000000000 +CT=1DD856F5453D1D61860E48035BFDADC7 + +I=199 +KEY=0000000000000000000000000000000000000000000000000200000000000000 +CT=9AE9BEC5D195B32BD52623EF21CF2AA3 + +I=200 +KEY=0000000000000000000000000000000000000000000000000100000000000000 +CT=C89ADA0E7DF448DE2155DB7C3E3EAAF2 + +I=201 +KEY=0000000000000000000000000000000000000000000000000080000000000000 +CT=0D176C6E373B2A3B3408AD24BE258365 + +I=202 +KEY=0000000000000000000000000000000000000000000000000040000000000000 +CT=8C2E48AF6FE6305B58EF5B950061E93C + +I=203 +KEY=0000000000000000000000000000000000000000000000000020000000000000 +CT=2E81D19464919FFB1886E81C46AEDE37 + +I=204 +KEY=0000000000000000000000000000000000000000000000000010000000000000 +CT=7169BEE79D4DCC57F771A43AA0A80EF1 + +I=205 +KEY=0000000000000000000000000000000000000000000000000008000000000000 +CT=425223474892BA95538DAFF58F3DD0D3 + +I=206 +KEY=0000000000000000000000000000000000000000000000000004000000000000 +CT=B2650BF17E26E9A4F6484DD2992517D9 + +I=207 +KEY=0000000000000000000000000000000000000000000000000002000000000000 +CT=71936A21362F80ECCED8FC955FF159F3 + +I=208 +KEY=0000000000000000000000000000000000000000000000000001000000000000 +CT=E09665C274E582FFD6BCD0663BD6EA12 + +I=209 +KEY=0000000000000000000000000000000000000000000000000000800000000000 +CT=3E8D36D10E6AB4454154A226B7D6E50E + +I=210 +KEY=0000000000000000000000000000000000000000000000000000400000000000 +CT=5D008338DDD66164591A9B98B23323CA + +I=211 +KEY=0000000000000000000000000000000000000000000000000000200000000000 +CT=6BC5ACE2FA017CCC5CD0A8E88AF73B28 + +I=212 +KEY=0000000000000000000000000000000000000000000000000000100000000000 +CT=C115E4646FC054C50C2BBEC7C20C94F7 + +I=213 +KEY=0000000000000000000000000000000000000000000000000000080000000000 +CT=2CEB602F3C61BE94AF96FD012BB3190C + +I=214 +KEY=0000000000000000000000000000000000000000000000000000040000000000 +CT=5A04F68F56580702891E4ECF6C600C92 + +I=215 +KEY=0000000000000000000000000000000000000000000000000000020000000000 +CT=D6A0DC0D5FB91B6478B9A1AAA586431B + +I=216 +KEY=0000000000000000000000000000000000000000000000000000010000000000 +CT=E38BB33BF982D61BB2CD980BFCE4C2BF + +I=217 +KEY=0000000000000000000000000000000000000000000000000000008000000000 +CT=B47BF164959077E378396A175020AC95 + +I=218 +KEY=0000000000000000000000000000000000000000000000000000004000000000 +CT=CC5CEE68ABBFDC2DFE32FD3A1E433932 + +I=219 +KEY=0000000000000000000000000000000000000000000000000000002000000000 +CT=A8180BBB689F29A560296FF24C785DC4 + +I=220 +KEY=0000000000000000000000000000000000000000000000000000001000000000 +CT=DCCBE0BB943D3B772010A08C11E82763 + +I=221 +KEY=0000000000000000000000000000000000000000000000000000000800000000 +CT=0439C5D8BB8BDD7FCB3A3281BD8A3A3F + +I=222 +KEY=0000000000000000000000000000000000000000000000000000000400000000 +CT=2864CEAE94E09933190479BEA2515040 + +I=223 +KEY=0000000000000000000000000000000000000000000000000000000200000000 +CT=2AFF33A00C93057FE56EDCBBB65987BB + +I=224 +KEY=0000000000000000000000000000000000000000000000000000000100000000 +CT=38C6B37E80EC873DE0A0ABEB9803438F + +I=225 +KEY=0000000000000000000000000000000000000000000000000000000080000000 +CT=1D9428E92329672C0E902F6AA6AFC874 + +I=226 +KEY=0000000000000000000000000000000000000000000000000000000040000000 +CT=2AB8CC1998977DF208C97B2D0DC86C54 + +I=227 +KEY=0000000000000000000000000000000000000000000000000000000020000000 +CT=2E42C343E7E489916E2F2C0AD2AFFFB1 + +I=228 +KEY=0000000000000000000000000000000000000000000000000000000010000000 +CT=571C17477C9FB6C334718983E0B25859 + +I=229 +KEY=0000000000000000000000000000000000000000000000000000000008000000 +CT=3ABAD289F84A4B75412C82D8AD9BD739 + +I=230 +KEY=0000000000000000000000000000000000000000000000000000000004000000 +CT=E91C1A5E57DD295A7F4AC1687F6B8DB6 + +I=231 +KEY=0000000000000000000000000000000000000000000000000000000002000000 +CT=60CEAEC342165320652D7ED13FDAC05A + +I=232 +KEY=0000000000000000000000000000000000000000000000000000000001000000 +CT=DA854CEC00C19BB97F7D8292ABAEB5BB + +I=233 +KEY=0000000000000000000000000000000000000000000000000000000000800000 +CT=6BC45EBD7172512E5F6D51C60E271ACF + +I=234 +KEY=0000000000000000000000000000000000000000000000000000000000400000 +CT=6604FAE8ECBC741D0F46D90AA235CAF6 + +I=235 +KEY=0000000000000000000000000000000000000000000000000000000000200000 +CT=5F95FA50CF7CDD4B619DCB8D6E0B7873 + +I=236 +KEY=0000000000000000000000000000000000000000000000000000000000100000 +CT=C98C198A5A988E2911302C22BFDC4890 + +I=237 +KEY=0000000000000000000000000000000000000000000000000000000000080000 +CT=4B5818505B80DA67A206BF3107DF2B4C + +I=238 +KEY=0000000000000000000000000000000000000000000000000000000000040000 +CT=B2EA813634A26DC5894BFC4BB070E147 + +I=239 +KEY=0000000000000000000000000000000000000000000000000000000000020000 +CT=B6DDED10D2E8B13D7C758692C844017B + +I=240 +KEY=0000000000000000000000000000000000000000000000000000000000010000 +CT=F2DC2468DF800E237C026F968CC3AAE2 + +I=241 +KEY=0000000000000000000000000000000000000000000000000000000000008000 +CT=EBCCE81109DCF1B9793AB60BD062F033 + +I=242 +KEY=0000000000000000000000000000000000000000000000000000000000004000 +CT=1BC015DC9E1B9DBB68293EB93D65088F + +I=243 +KEY=0000000000000000000000000000000000000000000000000000000000002000 +CT=F718F0FC2A276D6CBB7A2BD59BBC3DB0 + +I=244 +KEY=0000000000000000000000000000000000000000000000000000000000001000 +CT=D89BE6BDD07222EF8297FDD246C3DA09 + +I=245 +KEY=0000000000000000000000000000000000000000000000000000000000000800 +CT=7013B55968A743157C4959DE2068AC57 + +I=246 +KEY=0000000000000000000000000000000000000000000000000000000000000400 +CT=758199FCB16B8ADF9B1350A02B10B735 + +I=247 +KEY=0000000000000000000000000000000000000000000000000000000000000200 +CT=29D38DC5215AA1F3CAEC044C8B472696 + +I=248 +KEY=0000000000000000000000000000000000000000000000000000000000000100 +CT=F5E1BCA4497ED2B1D871B5877C5BE3A8 + +I=249 +KEY=0000000000000000000000000000000000000000000000000000000000000080 +CT=C7388535D265CBFCEDE6423CC29F33A4 + +I=250 +KEY=0000000000000000000000000000000000000000000000000000000000000040 +CT=84992BD0280C4CDF8B1587D42AA63605 + +I=251 +KEY=0000000000000000000000000000000000000000000000000000000000000020 +CT=197E91D0F0261D975BA1F6FAA7983E51 + +I=252 +KEY=0000000000000000000000000000000000000000000000000000000000000010 +CT=644BDF2B1508CFF2E8D791DADC5D4BD6 + +I=253 +KEY=0000000000000000000000000000000000000000000000000000000000000008 +CT=D7BB8C6C07F21F648CE87A17A0589334 + +I=254 +KEY=0000000000000000000000000000000000000000000000000000000000000004 +CT=B6718CB65E557AF3C25D03770AD6B1FA + +I=255 +KEY=0000000000000000000000000000000000000000000000000000000000000002 +CT=F32E30ADD384B71F7254A15B4042E1F6 + +I=256 +KEY=0000000000000000000000000000000000000000000000000000000000000001 +CT=B5C218F26198EE763B863EDA24446609 +========== diff -urN lin.2.2.17/crypto/testing/misc.c int.2.2.17.x/crypto/testing/misc.c --- lin.2.2.17/crypto/testing/misc.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/misc.c Mon Oct 16 16:22:37 2000 @@ -0,0 +1,168 @@ +/* + * crypto/testing/misc.c + * + * Written by Alexander Kjeldaas 2000-10-08 + * + * Copyright 2000 by Alexander Kjeldaas. Redistribution of this file + * is permitted under the GNU Public License. + */ + +/* Misc. functions */ + +#define __KERNEL__ + +#define printk printk_dummy + +#include +#undef memcpy +#undef memset +#undef printk + +#include "libcfuncs.h" +#include "misc.h" + + +int h2int(char c) +{ + c = tolower(c); + if (c >= '0' && c <= '9') + return c - '0'; + return c - 'a' + 10; +} + +char int2h(int h) +{ + if (h >= 0 && h <= 9) + return (char)(h + '0'); + return (char)h - 10 + 'a'; +} + +int parsehex(char *h, char *b) +{ + int size = 0; + /* int i; */ + char *hex = h, *buf = b; + if ((strlen(hex) & 1) == 1) { + *buf = h2int(*hex); + buf++; hex++; + size++; + } + for (; *hex; hex+=2, buf++, size++) { + *buf = (h2int(hex[0]) << 4) + h2int(hex[1]); + } + /* net2host(b, size); */ + return size; +} + +void net2host(char *x, int size) +{ + int *y = (int *)x; + size /= sizeof(int); + for (; size >= 0; size--) + y[size] = ntohl(y[size]); +} + +asmlinkage int printk(const char * fmt, va_list args) +{ + return vprintf(fmt, args); +} + + +void dump_buffer(unsigned char *buf, int size) +{ + int i; + /* net2host(buf, size); */ + for (i = 0; i < size; i++, buf++) { + PRINTF("%c", int2h((*buf) >> 4)); + PRINTF("%c", int2h((*buf) & 0xf)); + } + + PRINTF("\n"); +} + +int make_random_buf(char *buf, int size) +{ + int i; + for (i = 0; i < size; i++) { + buf[i] = rand(); + } + return 0; +} + +int my_memcmp(char *buf1, char *buf2, int size) +{ + int i; + int *b1 = (int *)buf1; + int *b2 = (int *)buf2; + for (i = 0; i < size; i+=sizeof(int)) { + if (*b1 != *b2) { + PRINTF("Error at offset %d: buf1=%0x, buf2=%0x\n", + i, *b1, *b2); + return 1; + } + b1++;b2++; + } + return memcmp(buf1, buf2, size); +} + + +void dump_u8_buffer(u8 *buf, int number) +{ + int i; + + for(i=0;itv_sec - (tv1)->tv_sec)*1000*1000 + \ + ((tv2)->tv_usec - (tv1)->tv_usec)) + +void dump_u8_buffer(u8 *buf, int number); +void dump_u16_buffer(u16 *buf, int number); +void dump_u32_buffer(u32 *buf, int number); +void dump_buffer (unsigned char *buf, int size); +int my_memcmp(char *buf1, char *buf2, int size); +int parsehex(char *hex, char *buf); +void net2host(char *x, int size); +int make_random_buf(char *buf, int size); +int swab32_buf(char *buf, int size); +asmlinkage int printk(const char * fmt, va_list args); + diff -urN lin.2.2.17/crypto/testing/rc6_ecb_vk.txt int.2.2.17.x/crypto/testing/rc6_ecb_vk.txt --- lin.2.2.17/crypto/testing/rc6_ecb_vk.txt Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/rc6_ecb_vk.txt Mon Oct 16 17:27:04 2000 @@ -0,0 +1,2333 @@ +========================= + +FILENAME: "ecb_vk.txt" + +Electronic Codebook (ECB) Mode +Variable Key Known Answer Tests + +Algorithm Name: RC6 (TM) +Principal Submitter: RSA Laboratories + +========== + +KEYSIZE=128 + +PT=00000000000000000000000000000000 + +I=1 +KEY=80000000000000000000000000000000 +CT=1ad578a02a08162850a15a1552a17ad4 + +I=2 +KEY=40000000000000000000000000000000 +CT=912e9cf1473035a8443a82495c0730d3 + +I=3 +KEY=20000000000000000000000000000000 +CT=3d3e851a80abaf221761931747473048 + +I=4 +KEY=10000000000000000000000000000000 +CT=96cfc0510819eeb7fcdf2cc7beabef77 + +I=5 +KEY=08000000000000000000000000000000 +CT=fb787268ec3c583a3685973b861aef8d + +I=6 +KEY=04000000000000000000000000000000 +CT=2ae927525c73250d954b619edac718be + +I=7 +KEY=02000000000000000000000000000000 +CT=00298d1db6c6da02e28e49c63b4a5795 + +I=8 +KEY=01000000000000000000000000000000 +CT=7e32f418910c9ac8701292b5f96346f3 + +I=9 +KEY=00800000000000000000000000000000 +CT=9fc6c21a562a049ad320eaa0d43c1998 + +I=10 +KEY=00400000000000000000000000000000 +CT=7a0bd66c361d641dfd313cbe23f69a57 + +I=11 +KEY=00200000000000000000000000000000 +CT=c2e2cad226964597a98c388b27127ea1 + +I=12 +KEY=00100000000000000000000000000000 +CT=b7f4837ac6f1f808d8ebbf1d08077fb4 + +I=13 +KEY=00080000000000000000000000000000 +CT=0495e1aeda7a9ec9acbf38fe41cb08fa + +I=14 +KEY=00040000000000000000000000000000 +CT=e001020e1d0c05be072695f3f48f07b2 + +I=15 +KEY=00020000000000000000000000000000 +CT=608ce7a12c9eec348ff674fb9f8d1972 + +I=16 +KEY=00010000000000000000000000000000 +CT=916bec60955c1a3540b4c245f4d3b94b + +I=17 +KEY=00008000000000000000000000000000 +CT=b2b91ec4efe12cd4edda71ed52b278b1 + +I=18 +KEY=00004000000000000000000000000000 +CT=0ca46cf5275313ab3d9494a5bb7d786a + +I=19 +KEY=00002000000000000000000000000000 +CT=e679b7c6f661ae52ba5199ec24d4e542 + +I=20 +KEY=00001000000000000000000000000000 +CT=043fab3a991b3fec872ac747640731cb + +I=21 +KEY=00000800000000000000000000000000 +CT=ef8c38151a67b9a51e0935bba14d9e22 + +I=22 +KEY=00000400000000000000000000000000 +CT=2d4515423cfcf372b5632c2879a71267 + +I=23 +KEY=00000200000000000000000000000000 +CT=2420a9327b9d2426c19f755bc3d8bd88 + +I=24 +KEY=00000100000000000000000000000000 +CT=2151d88643ee81d8d23b44d22e2b0d65 + +I=25 +KEY=00000080000000000000000000000000 +CT=aefa6f32e963cb2d4d89e673b503ddac + +I=26 +KEY=00000040000000000000000000000000 +CT=43dbe4d6b1ba3f05f16d73b2f80a12df + +I=27 +KEY=00000020000000000000000000000000 +CT=ed8c9b25558cad4ef9469364be97ca30 + +I=28 +KEY=00000010000000000000000000000000 +CT=bde5b1dc5053f94670599cbe6845604b + +I=29 +KEY=00000008000000000000000000000000 +CT=4529434499884be7c4e6d009f3d5353e + +I=30 +KEY=00000004000000000000000000000000 +CT=b3d4c642173189b9295912e860cf6880 + +I=31 +KEY=00000002000000000000000000000000 +CT=651f1b1629535ad03d5c296d560fde1f + +I=32 +KEY=00000001000000000000000000000000 +CT=8a380594d7396453771a1dfbe2914c8e + +I=33 +KEY=00000000800000000000000000000000 +CT=395fe0214ac536428c86737514b6237f + +I=34 +KEY=00000000400000000000000000000000 +CT=acefac47a7ab6e635ea9f85ef74deff3 + +I=35 +KEY=00000000200000000000000000000000 +CT=8c208e26e96d9dfa248010d8c1cfdb3b + +I=36 +KEY=00000000100000000000000000000000 +CT=d3ae8ae99b3a84c3721eaa57c8eb17b1 + +I=37 +KEY=00000000080000000000000000000000 +CT=40d8da37a8a6591a203f2a38ab05a08d + +I=38 +KEY=00000000040000000000000000000000 +CT=f0580d0b864e8c03638a33499b36c9a5 + +I=39 +KEY=00000000020000000000000000000000 +CT=10f19634c2d1006b0c208aa303065b0f + +I=40 +KEY=00000000010000000000000000000000 +CT=7d43298935d0af6db498542752666c99 + +I=41 +KEY=00000000008000000000000000000000 +CT=456ad1f19d18900b4f85eb64e06df643 + +I=42 +KEY=00000000004000000000000000000000 +CT=08c83a53955102f6e60c2cb0f6c02443 + +I=43 +KEY=00000000002000000000000000000000 +CT=351c1035006bc7475df60694859bb491 + +I=44 +KEY=00000000001000000000000000000000 +CT=bb47464dff62381ad4a93684d00a817f + +I=45 +KEY=00000000000800000000000000000000 +CT=514ac91b28081bd0e0cae22d766257df + +I=46 +KEY=00000000000400000000000000000000 +CT=7758c19b083a62e6f2caad2b4c3df4dc + +I=47 +KEY=00000000000200000000000000000000 +CT=46b352eac71542e417619e0360221673 + +I=48 +KEY=00000000000100000000000000000000 +CT=648d51c6f9522fe38108bbfd34015f22 + +I=49 +KEY=00000000000080000000000000000000 +CT=dcd800cc104b9c098ab4b931c7538f00 + +I=50 +KEY=00000000000040000000000000000000 +CT=e40601c1632937fa769c58be63deb056 + +I=51 +KEY=00000000000020000000000000000000 +CT=bc968175089f3864c81124a55aa445ec + +I=52 +KEY=00000000000010000000000000000000 +CT=05479acfa5a7c6bc89fe432d8d25a366 + +I=53 +KEY=00000000000008000000000000000000 +CT=8ddf91e221b4c2043c079f5f0ed63ea7 + +I=54 +KEY=00000000000004000000000000000000 +CT=66c47e3e339ffd404a61547e54ed0f7f + +I=55 +KEY=00000000000002000000000000000000 +CT=3d622a36a3375d2efff3b49363f25755 + +I=56 +KEY=00000000000001000000000000000000 +CT=c2e42ddc662f226d09908e2cfdd03d32 + +I=57 +KEY=00000000000000800000000000000000 +CT=3221bc8032e72e0de7580480a99dfd7d + +I=58 +KEY=00000000000000400000000000000000 +CT=c65a142d036e99d1a4da370d964a8a44 + +I=59 +KEY=00000000000000200000000000000000 +CT=e9c03f4840645726563582aa30464d1e + +I=60 +KEY=00000000000000100000000000000000 +CT=93c2f8237d526e910f007fa0cf0608a8 + +I=61 +KEY=00000000000000080000000000000000 +CT=6f3a45184b87581e98b7b0d873f8b315 + +I=62 +KEY=00000000000000040000000000000000 +CT=d3569bab0fdd360451e113895b39d0e2 + +I=63 +KEY=00000000000000020000000000000000 +CT=4002ff10ddb6fcb6669ae3fed696b2ec + +I=64 +KEY=00000000000000010000000000000000 +CT=b265c44f675800a3b498ffa91c440654 + +I=65 +KEY=00000000000000008000000000000000 +CT=092e77f2537ee742d627ea8628e473e9 + +I=66 +KEY=00000000000000004000000000000000 +CT=441859995f05e1c06d118cffb389c9ce + +I=67 +KEY=00000000000000002000000000000000 +CT=844480bb205810808dc1f87c2b5281e9 + +I=68 +KEY=00000000000000001000000000000000 +CT=4b2e7c3b31cfc0ca5b51ea589dffc9ac + +I=69 +KEY=00000000000000000800000000000000 +CT=d55d552ea89c267ff3b0af688cf00d78 + +I=70 +KEY=00000000000000000400000000000000 +CT=6ad19e9dd39381c8a02f3cc6f60c8048 + +I=71 +KEY=00000000000000000200000000000000 +CT=271ed37db771414743eb781b2b315841 + +I=72 +KEY=00000000000000000100000000000000 +CT=ed0a833c87fe6cdc56e021bcd3099508 + +I=73 +KEY=00000000000000000080000000000000 +CT=6dbe8feeb66cf747ffec4e6d3d2d6bb0 + +I=74 +KEY=00000000000000000040000000000000 +CT=79460469efea89fa576b526b17709d4e + +I=75 +KEY=00000000000000000020000000000000 +CT=5c3c35ec3d15cfae719221549293a6ac + +I=76 +KEY=00000000000000000010000000000000 +CT=607106e18f8c8a6e725af44a491d891a + +I=77 +KEY=00000000000000000008000000000000 +CT=1c22a5627309a238e2ce5a39be370243 + +I=78 +KEY=00000000000000000004000000000000 +CT=fb6d4f017d84e9b74c2a59204a2ea0d6 + +I=79 +KEY=00000000000000000002000000000000 +CT=b66a30712db3bd6b580678bda72cc5b5 + +I=80 +KEY=00000000000000000001000000000000 +CT=59c93b2a53be699840e29d78acf05de0 + +I=81 +KEY=00000000000000000000800000000000 +CT=ad37dfe5dcbb5a50228537bf24ed0159 + +I=82 +KEY=00000000000000000000400000000000 +CT=c9fab85dcb8da12a7c9416b267f21486 + +I=83 +KEY=00000000000000000000200000000000 +CT=ec797a0f6ebed4c257bc7fc1d7bd0100 + +I=84 +KEY=00000000000000000000100000000000 +CT=629d633d7a7c345a3a3cf66565e298e1 + +I=85 +KEY=00000000000000000000080000000000 +CT=859d400cc95f29e7131561f4d7e4dd12 + +I=86 +KEY=00000000000000000000040000000000 +CT=932cff2e8a828c61ba537e186f559e93 + +I=87 +KEY=00000000000000000000020000000000 +CT=62fa5692938cb84279c7e399ba10e08d + +I=88 +KEY=00000000000000000000010000000000 +CT=50321207b2a375b12f4630f3f1909b08 + +I=89 +KEY=00000000000000000000008000000000 +CT=63978a72d0acaf85676eaa2d1ee01f3c + +I=90 +KEY=00000000000000000000004000000000 +CT=20721cca68ae0451687d82534a360173 + +I=91 +KEY=00000000000000000000002000000000 +CT=9223a844eab1ca5d3a43ebc4c5cf01c8 + +I=92 +KEY=00000000000000000000001000000000 +CT=70e162cc61ac398cf4d9dbe62fd653ce + +I=93 +KEY=00000000000000000000000800000000 +CT=082ced7a4969fd3c8131bf9ae57754db + +I=94 +KEY=00000000000000000000000400000000 +CT=169070d4658d94c12041d14ec60a2b0a + +I=95 +KEY=00000000000000000000000200000000 +CT=960e45070b5ba767f1a3117851ecf9da + +I=96 +KEY=00000000000000000000000100000000 +CT=4aaaa999c2421953e3607ca202d4c1de + +I=97 +KEY=00000000000000000000000080000000 +CT=e4b97e5b2ba83d2038b5d08eb792f92f + +I=98 +KEY=00000000000000000000000040000000 +CT=ecbc7f9c422fc676152cc7e40391d730 + +I=99 +KEY=00000000000000000000000020000000 +CT=55ebabc43a33305fb82b39a88a737fff + +I=100 +KEY=00000000000000000000000010000000 +CT=c1bda064749b2b7a9e9378137462f800 + +I=101 +KEY=00000000000000000000000008000000 +CT=bddd0163e4ceac2c614abda9ebe15f3d + +I=102 +KEY=00000000000000000000000004000000 +CT=b767cf0e6717b409743ae41c56a2054d + +I=103 +KEY=00000000000000000000000002000000 +CT=ad897cfaed8fbbd9a3006f7eb2a7c601 + +I=104 +KEY=00000000000000000000000001000000 +CT=2929929d821d010a1a30e9cf4415f809 + +I=105 +KEY=00000000000000000000000000800000 +CT=0c861d39741060051855648b385708b5 + +I=106 +KEY=00000000000000000000000000400000 +CT=4ba018ea1aff5c0a9cf368592b08fd34 + +I=107 +KEY=00000000000000000000000000200000 +CT=4377cd44b655a0abc40e5b9d3a480ec6 + +I=108 +KEY=00000000000000000000000000100000 +CT=2f604e94c9cd1dcb730ab0af407fedbd + +I=109 +KEY=00000000000000000000000000080000 +CT=44a3514094941b7e497bcfe0d746ba48 + +I=110 +KEY=00000000000000000000000000040000 +CT=1235a968a7d12ba7042e7e63a897dbed + +I=111 +KEY=00000000000000000000000000020000 +CT=0ba061c7ad274e004b2e06d3d5fc784d + +I=112 +KEY=00000000000000000000000000010000 +CT=e0db8ce28d1c2f6b692b230a7ab0cb44 + +I=113 +KEY=00000000000000000000000000008000 +CT=ed4bbd535080655af3f4d71709b1b8d5 + +I=114 +KEY=00000000000000000000000000004000 +CT=92d183fbe0bd07a0884ebd1963a193be + +I=115 +KEY=00000000000000000000000000002000 +CT=995bb9e75386c99da3038c3c6340c838 + +I=116 +KEY=00000000000000000000000000001000 +CT=4914da6c7a8e1ab8297a9d280de576f9 + +I=117 +KEY=00000000000000000000000000000800 +CT=6415185d85078ce80f46c6e09edb8b78 + +I=118 +KEY=00000000000000000000000000000400 +CT=8b2908466f8bd3c1c3a4a5eafcc0ff92 + +I=119 +KEY=00000000000000000000000000000200 +CT=425bf2fcf5dd8b0013773f9a0dc09b0d + +I=120 +KEY=00000000000000000000000000000100 +CT=9ac35220be56e453b73cd887b299d06e + +I=121 +KEY=00000000000000000000000000000080 +CT=41900ef8223d019f1bc3e8ea68fc763c + +I=122 +KEY=00000000000000000000000000000040 +CT=9d294a574144109a9c6de8e90ee517b6 + +I=123 +KEY=00000000000000000000000000000020 +CT=4146d6bb7ae455d93eaf43753c7ae693 + +I=124 +KEY=00000000000000000000000000000010 +CT=4155b7d12fd12f96fd39c576fdd41422 + +I=125 +KEY=00000000000000000000000000000008 +CT=1af1e634b06211668ce2410d5edca968 + +I=126 +KEY=00000000000000000000000000000004 +CT=815739510622bfe08eee06b772368524 + +I=127 +KEY=00000000000000000000000000000002 +CT=e2f7d8411181a21b02c1466e750056c2 + +I=128 +KEY=00000000000000000000000000000001 +CT=13095792d8b1d771378839c912ca3c41 + +========== + +KEYSIZE=192 + +PT=00000000000000000000000000000000 + +I=1 +KEY=800000000000000000000000000000000000000000000000 +CT=8301730c7d5fefc416beec1104c51e36 + +I=2 +KEY=400000000000000000000000000000000000000000000000 +CT=f7ef83bdd4c3d5b30e805c351db87200 + +I=3 +KEY=200000000000000000000000000000000000000000000000 +CT=a236eb8595fdf9239c658d58342ef566 + +I=4 +KEY=100000000000000000000000000000000000000000000000 +CT=236397eb9eeda5ea8bf4a42864a5a39f + +I=5 +KEY=080000000000000000000000000000000000000000000000 +CT=21c3dd416d64f6055c8c3977eefb4652 + +I=6 +KEY=040000000000000000000000000000000000000000000000 +CT=59128f63bd9d834c3eeca5a5299417d1 + +I=7 +KEY=020000000000000000000000000000000000000000000000 +CT=0f95fa4c48de95391b45a460b92b22bf + +I=8 +KEY=010000000000000000000000000000000000000000000000 +CT=5073fabd5fa03d153108b9a5f2128c78 + +I=9 +KEY=008000000000000000000000000000000000000000000000 +CT=b83872427919126f2c976d45872b7596 + +I=10 +KEY=004000000000000000000000000000000000000000000000 +CT=73f8e6c4181758afa29945e970c8f854 + +I=11 +KEY=002000000000000000000000000000000000000000000000 +CT=b72dc39b9a72effa047e3657b1f02b1b + +I=12 +KEY=001000000000000000000000000000000000000000000000 +CT=081f1c50bf964ccc01949363a1a1c76c + +I=13 +KEY=000800000000000000000000000000000000000000000000 +CT=d4a2ab8b904be542386cc2342ac354d6 + +I=14 +KEY=000400000000000000000000000000000000000000000000 +CT=bc94c45b53bb5281bff16f7bc7ccd26e + +I=15 +KEY=000200000000000000000000000000000000000000000000 +CT=7d976240134d43279ab809a3ec1bab8e + +I=16 +KEY=000100000000000000000000000000000000000000000000 +CT=be18d342080322dbbcedbb83c7f11ca5 + +I=17 +KEY=000080000000000000000000000000000000000000000000 +CT=d1359d29060e0003c78066a900c90c00 + +I=18 +KEY=000040000000000000000000000000000000000000000000 +CT=fd0a7e670b7e9b57c913d38e4649715e + +I=19 +KEY=000020000000000000000000000000000000000000000000 +CT=c9dfb5b1cb3e079cfc027e67da61ec2a + +I=20 +KEY=000010000000000000000000000000000000000000000000 +CT=10fdd69900fbc470499edf0aff655430 + +I=21 +KEY=000008000000000000000000000000000000000000000000 +CT=565721a361f5f0eb44366dec1d6841be + +I=22 +KEY=000004000000000000000000000000000000000000000000 +CT=07ad173e39a769d345277f4cfd16bba8 + +I=23 +KEY=000002000000000000000000000000000000000000000000 +CT=8e89b6b70a10d1866ed4d139a0e6565c + +I=24 +KEY=000001000000000000000000000000000000000000000000 +CT=88a431dd4cbbd94778ae53a36ee246de + +I=25 +KEY=000000800000000000000000000000000000000000000000 +CT=f4c8e31b64506e9bde6bb682dbcef50a + +I=26 +KEY=000000400000000000000000000000000000000000000000 +CT=5b0e256e4eab25aec08cd2ce5547334d + +I=27 +KEY=000000200000000000000000000000000000000000000000 +CT=edbaa578c13d7d215057ead4f03b9e1c + +I=28 +KEY=000000100000000000000000000000000000000000000000 +CT=7ea37db8eb1b362e370a43df1adb2f0a + +I=29 +KEY=000000080000000000000000000000000000000000000000 +CT=8b7c67ae8f749c4efb7418788d369dec + +I=30 +KEY=000000040000000000000000000000000000000000000000 +CT=34d3a7e87a4b1b3fac60672a3d82f40d + +I=31 +KEY=000000020000000000000000000000000000000000000000 +CT=4fe628152a1d46cf6da78d5f17255877 + +I=32 +KEY=000000010000000000000000000000000000000000000000 +CT=3460a571d035b6da52aa8e59702b79c0 + +I=33 +KEY=000000008000000000000000000000000000000000000000 +CT=ca2375e2e96ab28c7fc3e61b6561b07c + +I=34 +KEY=000000004000000000000000000000000000000000000000 +CT=7e33319a69017428ddbd979d3f6982c6 + +I=35 +KEY=000000002000000000000000000000000000000000000000 +CT=49da8b8ad80a6bba1003ff6b8d06e3d8 + +I=36 +KEY=000000001000000000000000000000000000000000000000 +CT=cce4c841b39187943dcca5eb8bbf1221 + +I=37 +KEY=000000000800000000000000000000000000000000000000 +CT=3b42fa9129bf36f87e445589460a19bd + +I=38 +KEY=000000000400000000000000000000000000000000000000 +CT=3e397a22c64a8c09b5b59a9d397b0a96 + +I=39 +KEY=000000000200000000000000000000000000000000000000 +CT=159ab9c871fb3eb373a94721e9f0743a + +I=40 +KEY=000000000100000000000000000000000000000000000000 +CT=9c2deceefedf2475c26effea3a0e2920 + +I=41 +KEY=000000000080000000000000000000000000000000000000 +CT=0fcc4399113e6bf62a23f657bef97224 + +I=42 +KEY=000000000040000000000000000000000000000000000000 +CT=2fca4167b034d9edac4e12828b911600 + +I=43 +KEY=000000000020000000000000000000000000000000000000 +CT=3f9434872c4e49eb8718edb8896cff2e + +I=44 +KEY=000000000010000000000000000000000000000000000000 +CT=8168025815d16028078007c9e1370331 + +I=45 +KEY=000000000008000000000000000000000000000000000000 +CT=f0fbf790b49553ec3963805cc2f6aa7e + +I=46 +KEY=000000000004000000000000000000000000000000000000 +CT=951c45d26a548a9a6152ccbc00d3c6fa + +I=47 +KEY=000000000002000000000000000000000000000000000000 +CT=845dcc97b1f8cd3254d2b29a59c7ae41 + +I=48 +KEY=000000000001000000000000000000000000000000000000 +CT=6694a168d387e4fb3291a376b938136d + +I=49 +KEY=000000000000800000000000000000000000000000000000 +CT=9569359a00659b9645565857398c982f + +I=50 +KEY=000000000000400000000000000000000000000000000000 +CT=417c97d7f56216ffebe64a73f8d81168 + +I=51 +KEY=000000000000200000000000000000000000000000000000 +CT=8c46288b3314b9e1bc91e3c901c784a8 + +I=52 +KEY=000000000000100000000000000000000000000000000000 +CT=8eb78926977246f186274d88a4b0e6b3 + +I=53 +KEY=000000000000080000000000000000000000000000000000 +CT=51e819059ab0325a2df7f8cf49a54353 + +I=54 +KEY=000000000000040000000000000000000000000000000000 +CT=56a59894fc1972b03d66d6c43688138b + +I=55 +KEY=000000000000020000000000000000000000000000000000 +CT=cb772637b59ad2330acc8cc2fa7a338b + +I=56 +KEY=000000000000010000000000000000000000000000000000 +CT=1e3759e5bbe19ea0f66fbb0702f07440 + +I=57 +KEY=000000000000008000000000000000000000000000000000 +CT=2112cfd246447d95f1a6bff65a044121 + +I=58 +KEY=000000000000004000000000000000000000000000000000 +CT=8a7e580bac4406b297e12b472c2748e3 + +I=59 +KEY=000000000000002000000000000000000000000000000000 +CT=349abe7c34357c7c719bd48ab62df95c + +I=60 +KEY=000000000000001000000000000000000000000000000000 +CT=5edb9089b865dac899854dace9dbbdbc + +I=61 +KEY=000000000000000800000000000000000000000000000000 +CT=c82372837c0b459699779683785ce09c + +I=62 +KEY=000000000000000400000000000000000000000000000000 +CT=b26532f7c0fdff76bfadd7178e7a2a7a + +I=63 +KEY=000000000000000200000000000000000000000000000000 +CT=965f80c599bf6aa85ca2199c785edaf1 + +I=64 +KEY=000000000000000100000000000000000000000000000000 +CT=8434dfe0c8717514fb0f8a4ff46930b6 + +I=65 +KEY=000000000000000080000000000000000000000000000000 +CT=10d701937e2944c7b48baa32da64c6a5 + +I=66 +KEY=000000000000000040000000000000000000000000000000 +CT=9a401e466c3686609b7b92fc6c57ea3b + +I=67 +KEY=000000000000000020000000000000000000000000000000 +CT=e3442053c50265aebefd327633e449b1 + +I=68 +KEY=000000000000000010000000000000000000000000000000 +CT=7df5ec480defa928687a35116989a7e2 + +I=69 +KEY=000000000000000008000000000000000000000000000000 +CT=eb2d38038a867146e3999d3e4dace2bd + +I=70 +KEY=000000000000000004000000000000000000000000000000 +CT=ae420a68558a2a50085331d8c46d7685 + +I=71 +KEY=000000000000000002000000000000000000000000000000 +CT=049b78384de81bb815c48cc565dc1029 + +I=72 +KEY=000000000000000001000000000000000000000000000000 +CT=38edcb5d37e043621f1eb80c78e40657 + +I=73 +KEY=000000000000000000800000000000000000000000000000 +CT=928c462d2ae8b7b45c252d0cae80b34c + +I=74 +KEY=000000000000000000400000000000000000000000000000 +CT=b3ad5d661d6dacfd57c214fdb9384491 + +I=75 +KEY=000000000000000000200000000000000000000000000000 +CT=9785657218402c1f3d1a40e73b015359 + +I=76 +KEY=000000000000000000100000000000000000000000000000 +CT=302355f21d129456a3ec58cd4c74d334 + +I=77 +KEY=000000000000000000080000000000000000000000000000 +CT=7322a935e1f65e2f341f778d0a55dac0 + +I=78 +KEY=000000000000000000040000000000000000000000000000 +CT=7eeef0009743f18e1e08f5cb02cfa104 + +I=79 +KEY=000000000000000000020000000000000000000000000000 +CT=82fa95b00ba5c8d71cb372895e91f7ad + +I=80 +KEY=000000000000000000010000000000000000000000000000 +CT=44e308a9bae6315936931c0d6f3472a4 + +I=81 +KEY=000000000000000000008000000000000000000000000000 +CT=a0f7760cb5f12b2f7f7451688dcc6db3 + +I=82 +KEY=000000000000000000004000000000000000000000000000 +CT=249cbf1a9027a9d4a049dcc61c100631 + +I=83 +KEY=000000000000000000002000000000000000000000000000 +CT=ae5191679db49836ebd11781e1a9e809 + +I=84 +KEY=000000000000000000001000000000000000000000000000 +CT=6f0f72e56952895f7425a34eb97d0d41 + +I=85 +KEY=000000000000000000000800000000000000000000000000 +CT=e4c8937ea026250290e85a2aa4b3a338 + +I=86 +KEY=000000000000000000000400000000000000000000000000 +CT=0d1b7815f62d8c6db79e9755eb5cc047 + +I=87 +KEY=000000000000000000000200000000000000000000000000 +CT=3b8da219500f670d2d32c753f613e646 + +I=88 +KEY=000000000000000000000100000000000000000000000000 +CT=dc16f91f486975c2762aaef8e4c66543 + +I=89 +KEY=000000000000000000000080000000000000000000000000 +CT=7cc222b3c5866ac0f27a60c9d9713981 + +I=90 +KEY=000000000000000000000040000000000000000000000000 +CT=b7f625fc185b3acef820af59570370fd + +I=91 +KEY=000000000000000000000020000000000000000000000000 +CT=8aa59ea7476afe267d7745a2a5e1d0cb + +I=92 +KEY=000000000000000000000010000000000000000000000000 +CT=ddb9e4aa397029e10ed5f1984513280b + +I=93 +KEY=000000000000000000000008000000000000000000000000 +CT=c92b81f3061a4abc6c35d1b0af2ba410 + +I=94 +KEY=000000000000000000000004000000000000000000000000 +CT=05f510ba96377001a23093980c02fbcd + +I=95 +KEY=000000000000000000000002000000000000000000000000 +CT=a22d14ebc78b338735ca0aad155b0114 + +I=96 +KEY=000000000000000000000001000000000000000000000000 +CT=c562318b01d5235ccd4dc3d3a8b10da0 + +I=97 +KEY=000000000000000000000000800000000000000000000000 +CT=fa248caa2f7c4b029054a31917be9b47 + +I=98 +KEY=000000000000000000000000400000000000000000000000 +CT=fcc4e2e3c6e5db8decbf2493e3a52b9a + +I=99 +KEY=000000000000000000000000200000000000000000000000 +CT=c5d23718f33adc9f8b3b35263e47248a + +I=100 +KEY=000000000000000000000000100000000000000000000000 +CT=773e59c9ca8efd081e1cfd4f3df4bc16 + +I=101 +KEY=000000000000000000000000080000000000000000000000 +CT=9a5e5ab516ecea600952d25684dff5e9 + +I=102 +KEY=000000000000000000000000040000000000000000000000 +CT=4eb9b9cc17e48f68423c884d64091022 + +I=103 +KEY=000000000000000000000000020000000000000000000000 +CT=0ccd75beca8406ebf53cb0abb1b46b23 + +I=104 +KEY=000000000000000000000000010000000000000000000000 +CT=0242108dabd2ed9886e8abd70aa97b29 + +I=105 +KEY=000000000000000000000000008000000000000000000000 +CT=c52a6eb2958c995465c4f870f1a8269e + +I=106 +KEY=000000000000000000000000004000000000000000000000 +CT=5fd2c7f3c81b013b96ec3acbb0688175 + +I=107 +KEY=000000000000000000000000002000000000000000000000 +CT=1e63a0b10b0293a8572fd7749acb9a53 + +I=108 +KEY=000000000000000000000000001000000000000000000000 +CT=9e1d466fa752c13af4296cffb8566db2 + +I=109 +KEY=000000000000000000000000000800000000000000000000 +CT=ba1a69d7ad2869734a4954553d4ef249 + +I=110 +KEY=000000000000000000000000000400000000000000000000 +CT=ec2e7d615474b0b08d47afcbe4fd8402 + +I=111 +KEY=000000000000000000000000000200000000000000000000 +CT=5c295aa2183b5fb9498094db774244d1 + +I=112 +KEY=000000000000000000000000000100000000000000000000 +CT=1c5a17d1be0d9edcf339db3d2631f236 + +I=113 +KEY=000000000000000000000000000080000000000000000000 +CT=cf6e9758b39149e3e29fb66cd58d0976 + +I=114 +KEY=000000000000000000000000000040000000000000000000 +CT=4f3ff2cab95f678d85207691bfdab811 + +I=115 +KEY=000000000000000000000000000020000000000000000000 +CT=463f1fcdf4a918300a93d7bed72f788b + +I=116 +KEY=000000000000000000000000000010000000000000000000 +CT=ca5c88802cf0520c6521b106f4a58977 + +I=117 +KEY=000000000000000000000000000008000000000000000000 +CT=95c83d16f101b16e82d9df9108a6805a + +I=118 +KEY=000000000000000000000000000004000000000000000000 +CT=f98e0be43f35a4cd52f93fd0877c1638 + +I=119 +KEY=000000000000000000000000000002000000000000000000 +CT=3b0d41f3a12de6bdacfca225f1344d77 + +I=120 +KEY=000000000000000000000000000001000000000000000000 +CT=bcb6197992a90a62497b53ec8e7e5857 + +I=121 +KEY=000000000000000000000000000000800000000000000000 +CT=9ca86b881701310c33f6cb2911ed777e + +I=122 +KEY=000000000000000000000000000000400000000000000000 +CT=ddf4ebc89b16643e7b4f0b43ab3fc443 + +I=123 +KEY=000000000000000000000000000000200000000000000000 +CT=650aa74cdf7c5e92720e02a87eca8fb2 + +I=124 +KEY=000000000000000000000000000000100000000000000000 +CT=f44e947b2a18f15189884e55eac372cd + +I=125 +KEY=000000000000000000000000000000080000000000000000 +CT=a4cc79ab8f6aba941d400b45c32da248 + +I=126 +KEY=000000000000000000000000000000040000000000000000 +CT=3c49ee1d3e4d8fd1e5ce9c793511f2e7 + +I=127 +KEY=000000000000000000000000000000020000000000000000 +CT=49199a91a32424357890f5c8e08e168c + +I=128 +KEY=000000000000000000000000000000010000000000000000 +CT=438ebcc76304c4231dcdbdf85a876a85 + +I=129 +KEY=000000000000000000000000000000008000000000000000 +CT=dd04c176440bbc6686c90aee775bd368 + +I=130 +KEY=000000000000000000000000000000004000000000000000 +CT=1dbae21df9d10630d8e9ba704aa3a6e2 + +I=131 +KEY=000000000000000000000000000000002000000000000000 +CT=f46b5df361ff1a58ad233a2884e9b73b + +I=132 +KEY=000000000000000000000000000000001000000000000000 +CT=dbd49c75b6cca6ccef0423ff3941922a + +I=133 +KEY=000000000000000000000000000000000800000000000000 +CT=2c62774d20d574a487057a24280ebbc9 + +I=134 +KEY=000000000000000000000000000000000400000000000000 +CT=a6e24fff68df51b5613692d4098f7e22 + +I=135 +KEY=000000000000000000000000000000000200000000000000 +CT=a961b427d5fcd129ee29830dbd2952dd + +I=136 +KEY=000000000000000000000000000000000100000000000000 +CT=7f637c136f8a57358dd5229b5e3bc38c + +I=137 +KEY=000000000000000000000000000000000080000000000000 +CT=6fc5a39b35d2ef01b808e20c05db9dde + +I=138 +KEY=000000000000000000000000000000000040000000000000 +CT=95e085e82a0883c8f6c1c83d6f4df270 + +I=139 +KEY=000000000000000000000000000000000020000000000000 +CT=bdee30731d4cd3593e46d9a8222485cc + +I=140 +KEY=000000000000000000000000000000000010000000000000 +CT=508b5bb4ecce303014d5a9abb47dd30d + +I=141 +KEY=000000000000000000000000000000000008000000000000 +CT=047832614b07aeabc28a39d5e72007c9 + +I=142 +KEY=000000000000000000000000000000000004000000000000 +CT=c1d4b662ee239a6db9262b23c561b677 + +I=143 +KEY=000000000000000000000000000000000002000000000000 +CT=e567714df47d43f1505d318c8d553062 + +I=144 +KEY=000000000000000000000000000000000001000000000000 +CT=cdf70f29afd13ec6820d2c126d053dc4 + +I=145 +KEY=000000000000000000000000000000000000800000000000 +CT=182f2fd0adc68d8dc72b08ac17e642c1 + +I=146 +KEY=000000000000000000000000000000000000400000000000 +CT=5daa43afbcd59026c0c410072a263673 + +I=147 +KEY=000000000000000000000000000000000000200000000000 +CT=e0c6dd7a8971a7d21afae153f115d658 + +I=148 +KEY=000000000000000000000000000000000000100000000000 +CT=4ed2daa970922690d8cdf6cdfda2e8d3 + +I=149 +KEY=000000000000000000000000000000000000080000000000 +CT=c1f929b679e007b1ddbbe896ce91c8c5 + +I=150 +KEY=000000000000000000000000000000000000040000000000 +CT=2323f5569ba740e14e05e0fb0914ce44 + +I=151 +KEY=000000000000000000000000000000000000020000000000 +CT=875afce0522e00712ab29e0e77ba57d2 + +I=152 +KEY=000000000000000000000000000000000000010000000000 +CT=a6185ecbdefeb900335bab38d95d7583 + +I=153 +KEY=000000000000000000000000000000000000008000000000 +CT=1331b89b377ea2a88a181907300bc50c + +I=154 +KEY=000000000000000000000000000000000000004000000000 +CT=fc9d177c5b5d072e041d6c2f9ee6b536 + +I=155 +KEY=000000000000000000000000000000000000002000000000 +CT=5bce1ea4fd0cc1ede325dceb55790565 + +I=156 +KEY=000000000000000000000000000000000000001000000000 +CT=937fe02d20fcb72f0f57201012b88ba4 + +I=157 +KEY=000000000000000000000000000000000000000800000000 +CT=5280e7768e573dc74db90abdc10422fe + +I=158 +KEY=000000000000000000000000000000000000000400000000 +CT=0995e2d8e83c853c58ecf916e8067c3a + +I=159 +KEY=000000000000000000000000000000000000000200000000 +CT=98df44d404b5bd54ca5d55d08e7f1b12 + +I=160 +KEY=000000000000000000000000000000000000000100000000 +CT=9fd5f1165cd60fa5229cf03080428664 + +I=161 +KEY=000000000000000000000000000000000000000080000000 +CT=b4ae95212e3e8ffd6b27d4f0cc079cca + +I=162 +KEY=000000000000000000000000000000000000000040000000 +CT=878bd051874ab0bac12ea94c60cc2671 + +I=163 +KEY=000000000000000000000000000000000000000020000000 +CT=3b0f2ef2a0849425063f49e65df4d3ab + +I=164 +KEY=000000000000000000000000000000000000000010000000 +CT=07d4297668485ebbf0f9266c203407e2 + +I=165 +KEY=000000000000000000000000000000000000000008000000 +CT=c2ecfb79c073bd453bdd2323c77ff80d + +I=166 +KEY=000000000000000000000000000000000000000004000000 +CT=5173b04fc7c211ca17161164b79d0ae7 + +I=167 +KEY=000000000000000000000000000000000000000002000000 +CT=5135a445a721783aacd06930d39f72c4 + +I=168 +KEY=000000000000000000000000000000000000000001000000 +CT=a511e849b1b75dc94b1d73d957b53d78 + +I=169 +KEY=000000000000000000000000000000000000000000800000 +CT=42312b67f192d72b73689c712d60eab7 + +I=170 +KEY=000000000000000000000000000000000000000000400000 +CT=30c89a160855bc3f339a170b715dd482 + +I=171 +KEY=000000000000000000000000000000000000000000200000 +CT=8dc19a7a97319a3309b98797a59954fa + +I=172 +KEY=000000000000000000000000000000000000000000100000 +CT=d0aa5a8b9dff98e18281e5ff20cca3de + +I=173 +KEY=000000000000000000000000000000000000000000080000 +CT=afa70ef4b45ea22e90108b834019120a + +I=174 +KEY=000000000000000000000000000000000000000000040000 +CT=2801c6a5c0547cb988a2137a559d12b0 + +I=175 +KEY=000000000000000000000000000000000000000000020000 +CT=d791f5709d4afe0642955f1b072f144e + +I=176 +KEY=000000000000000000000000000000000000000000010000 +CT=35bb50e6d59a693709de9b88cc8581f6 + +I=177 +KEY=000000000000000000000000000000000000000000008000 +CT=9b58cc95279539c1af0bbc274a62f5c8 + +I=178 +KEY=000000000000000000000000000000000000000000004000 +CT=f51803ff4ea1b0f0aff1c68c5c98cb3a + +I=179 +KEY=000000000000000000000000000000000000000000002000 +CT=975b5309f1d3ace9ba08b3d2d3fcb43e + +I=180 +KEY=000000000000000000000000000000000000000000001000 +CT=d53cd9381ea85b0c106c22da611f7336 + +I=181 +KEY=000000000000000000000000000000000000000000000800 +CT=393270b47546f1bfe35690accac0febd + +I=182 +KEY=000000000000000000000000000000000000000000000400 +CT=53e21284948996fc03ed9bcc34b45b61 + +I=183 +KEY=000000000000000000000000000000000000000000000200 +CT=ad9ca2740670da740c75703a8859382b + +I=184 +KEY=000000000000000000000000000000000000000000000100 +CT=ac9c2960e3061e56d8b9a1cdd3eed010 + +I=185 +KEY=000000000000000000000000000000000000000000000080 +CT=e5f68b122d15823f131dea0468977d70 + +I=186 +KEY=000000000000000000000000000000000000000000000040 +CT=7eb7c6460fe9885bc96afd4d4b65e90e + +I=187 +KEY=000000000000000000000000000000000000000000000020 +CT=409147483adc22592ca41224d35bb323 + +I=188 +KEY=000000000000000000000000000000000000000000000010 +CT=ab61745316651f61f4e2cc1dfbf8135c + +I=189 +KEY=000000000000000000000000000000000000000000000008 +CT=88977ead91ecf9c83f33ebe41fb7410c + +I=190 +KEY=000000000000000000000000000000000000000000000004 +CT=9dc923136a1882d73cb412c986103481 + +I=191 +KEY=000000000000000000000000000000000000000000000002 +CT=9914219ed77b8fa772b4b8c53f9ad2fc + +I=192 +KEY=000000000000000000000000000000000000000000000001 +CT=b9a0fa2324625650a2052d691e7de9c3 + +========== + +KEYSIZE=256 + +PT=00000000000000000000000000000000 + +I=1 +KEY=8000000000000000000000000000000000000000000000000000000000000000 +CT=5172978a58543de597060983fd799f1b + +I=2 +KEY=4000000000000000000000000000000000000000000000000000000000000000 +CT=0f86aece7ace09a8eac0345c935be91a + +I=3 +KEY=2000000000000000000000000000000000000000000000000000000000000000 +CT=8c8d6acdb23ae4b5bee4e2c15273286f + +I=4 +KEY=1000000000000000000000000000000000000000000000000000000000000000 +CT=11395d4bfe4c8258979ee2bf2d24dff4 + +I=5 +KEY=0800000000000000000000000000000000000000000000000000000000000000 +CT=d50183337fd8b3faef06c78b2ecfc40f + +I=6 +KEY=0400000000000000000000000000000000000000000000000000000000000000 +CT=f3969970b4e37d9ffd9bd886200d7c0f + +I=7 +KEY=0200000000000000000000000000000000000000000000000000000000000000 +CT=ff101a14ccb71863e0b51e8583d22760 + +I=8 +KEY=0100000000000000000000000000000000000000000000000000000000000000 +CT=0cacb5ab8a51226134656220dbf23228 + +I=9 +KEY=0080000000000000000000000000000000000000000000000000000000000000 +CT=bf75c54f53a3f374dc549be280f6c6e0 + +I=10 +KEY=0040000000000000000000000000000000000000000000000000000000000000 +CT=1dc755ed6128dc50826e65632c7672d6 + +I=11 +KEY=0020000000000000000000000000000000000000000000000000000000000000 +CT=d7a46c3a378db6a9c041d7db1835de3f + +I=12 +KEY=0010000000000000000000000000000000000000000000000000000000000000 +CT=175fdb12efb7e7d950777fe12baac953 + +I=13 +KEY=0008000000000000000000000000000000000000000000000000000000000000 +CT=1a5c489cb6e0608eadaf3dbfa8b5fd1b + +I=14 +KEY=0004000000000000000000000000000000000000000000000000000000000000 +CT=7fd567fb07007a65ca8d98d4bf66f7f1 + +I=15 +KEY=0002000000000000000000000000000000000000000000000000000000000000 +CT=3256e4481641ed28938ad6471414cd04 + +I=16 +KEY=0001000000000000000000000000000000000000000000000000000000000000 +CT=a2ad960b437dcd0669681bbbc30f0cf1 + +I=17 +KEY=0000800000000000000000000000000000000000000000000000000000000000 +CT=fb04b658fa923ea9cd5fb98be54989de + +I=18 +KEY=0000400000000000000000000000000000000000000000000000000000000000 +CT=f3f43741881655cf074e36bd655f420b + +I=19 +KEY=0000200000000000000000000000000000000000000000000000000000000000 +CT=637dcf9d891ead8d85a842be0dc8261f + +I=20 +KEY=0000100000000000000000000000000000000000000000000000000000000000 +CT=e663749a2786e3ba3833348a9ce5e7f0 + +I=21 +KEY=0000080000000000000000000000000000000000000000000000000000000000 +CT=76f0f7c439e25c54a9bc7aea05640882 + +I=22 +KEY=0000040000000000000000000000000000000000000000000000000000000000 +CT=2cde682fc40895f1e2464739fad230dd + +I=23 +KEY=0000020000000000000000000000000000000000000000000000000000000000 +CT=3242fe919adfdce04f163ebe772ad51d + +I=24 +KEY=0000010000000000000000000000000000000000000000000000000000000000 +CT=ce05f79a80b2947b13bd22ee37fb3f79 + +I=25 +KEY=0000008000000000000000000000000000000000000000000000000000000000 +CT=5345bde33281a0cb4a899a4f18c57563 + +I=26 +KEY=0000004000000000000000000000000000000000000000000000000000000000 +CT=2e971691ddfd33d36738c08a517b0b44 + +I=27 +KEY=0000002000000000000000000000000000000000000000000000000000000000 +CT=ee144813e2194b18f1593c44932f170f + +I=28 +KEY=0000001000000000000000000000000000000000000000000000000000000000 +CT=f626c435e30aba4fa6f6dca30cc08833 + +I=29 +KEY=0000000800000000000000000000000000000000000000000000000000000000 +CT=8ad30f69bd7446793c36676755d05f57 + +I=30 +KEY=0000000400000000000000000000000000000000000000000000000000000000 +CT=56851cb7277cbe4ae9aff86e5bd49f90 + +I=31 +KEY=0000000200000000000000000000000000000000000000000000000000000000 +CT=ca864ac764d6b9b9141a08146cfa7f56 + +I=32 +KEY=0000000100000000000000000000000000000000000000000000000000000000 +CT=484518d9a3c6cf7b7b92393dbbf78e42 + +I=33 +KEY=0000000080000000000000000000000000000000000000000000000000000000 +CT=093f44542b0e41e300c11ae77a48c6c4 + +I=34 +KEY=0000000040000000000000000000000000000000000000000000000000000000 +CT=6d9856adc56605f70ef069d639c9d977 + +I=35 +KEY=0000000020000000000000000000000000000000000000000000000000000000 +CT=3ffb2ff7c5457744cabdfb89c0bba7e8 + +I=36 +KEY=0000000010000000000000000000000000000000000000000000000000000000 +CT=6d8254191931be754d64f70fe3e226c7 + +I=37 +KEY=0000000008000000000000000000000000000000000000000000000000000000 +CT=23f3cc55c460ee949a9934c7e5c06ccb + +I=38 +KEY=0000000004000000000000000000000000000000000000000000000000000000 +CT=8739da7f4a9d821eaa7a349e25741daa + +I=39 +KEY=0000000002000000000000000000000000000000000000000000000000000000 +CT=73e724c08890501275a0559621526948 + +I=40 +KEY=0000000001000000000000000000000000000000000000000000000000000000 +CT=4cc6569d4f6207ddb03b232bfa8aa481 + +I=41 +KEY=0000000000800000000000000000000000000000000000000000000000000000 +CT=52a6d921aef99205822b361d8d9dd998 + +I=42 +KEY=0000000000400000000000000000000000000000000000000000000000000000 +CT=970e1899aeeeb7ccd26f854ca25214e2 + +I=43 +KEY=0000000000200000000000000000000000000000000000000000000000000000 +CT=d1defc8ac21c95160cf71612aac55a8c + +I=44 +KEY=0000000000100000000000000000000000000000000000000000000000000000 +CT=d8c2a3ad65f16024265714c21b8a70c5 + +I=45 +KEY=0000000000080000000000000000000000000000000000000000000000000000 +CT=55de20482fae35a03f0d57b7546eb980 + +I=46 +KEY=0000000000040000000000000000000000000000000000000000000000000000 +CT=81bca41f11d12ee26326e042e74961af + +I=47 +KEY=0000000000020000000000000000000000000000000000000000000000000000 +CT=6d8d5c30a508436401396224d4e417b5 + +I=48 +KEY=0000000000010000000000000000000000000000000000000000000000000000 +CT=0fa1ecab0b3c598c51372a5aaf6e1315 + +I=49 +KEY=0000000000008000000000000000000000000000000000000000000000000000 +CT=945bf2690a9ce9ed8009004039e1e743 + +I=50 +KEY=0000000000004000000000000000000000000000000000000000000000000000 +CT=73618ad5fd3a9740cb92c3f870c772b9 + +I=51 +KEY=0000000000002000000000000000000000000000000000000000000000000000 +CT=a7bab4d0765d66f06fcb85a42d4cf0ee + +I=52 +KEY=0000000000001000000000000000000000000000000000000000000000000000 +CT=2a659ea8bf9ea163976c33a0b7463a56 + +I=53 +KEY=0000000000000800000000000000000000000000000000000000000000000000 +CT=4d9d5cc19bf1b2d48ef2cf4cd313d3e3 + +I=54 +KEY=0000000000000400000000000000000000000000000000000000000000000000 +CT=0d7a26f850bdd2a633689367901bc2a4 + +I=55 +KEY=0000000000000200000000000000000000000000000000000000000000000000 +CT=1a1235352ec6cd1a7a1913e77ef7ce4d + +I=56 +KEY=0000000000000100000000000000000000000000000000000000000000000000 +CT=5fdc541376baf15d5ac011b9c0b74e75 + +I=57 +KEY=0000000000000080000000000000000000000000000000000000000000000000 +CT=cb8dcb7ad04598e8337747e02a8df16e + +I=58 +KEY=0000000000000040000000000000000000000000000000000000000000000000 +CT=2855a6eea8b20b8b25edee37a7d7e976 + +I=59 +KEY=0000000000000020000000000000000000000000000000000000000000000000 +CT=58b5cd00d833233e718dbeaabcc48e8f + +I=60 +KEY=0000000000000010000000000000000000000000000000000000000000000000 +CT=6df58a11f96b67c330ed10fffb1e6d74 + +I=61 +KEY=0000000000000008000000000000000000000000000000000000000000000000 +CT=8fd74aab8d136dcf1b398d1174aa343b + +I=62 +KEY=0000000000000004000000000000000000000000000000000000000000000000 +CT=a81e2f57e80761e361db1008ac1abdd8 + +I=63 +KEY=0000000000000002000000000000000000000000000000000000000000000000 +CT=bdd939e7a93f6fecc762e2e3321dfec7 + +I=64 +KEY=0000000000000001000000000000000000000000000000000000000000000000 +CT=c281060452693278b48ad9076911ec39 + +I=65 +KEY=0000000000000000800000000000000000000000000000000000000000000000 +CT=c06c159eeaff3cb4b509db604060f537 + +I=66 +KEY=0000000000000000400000000000000000000000000000000000000000000000 +CT=757ced2216a9912b5fbfa1e623077e5d + +I=67 +KEY=0000000000000000200000000000000000000000000000000000000000000000 +CT=9606edc198f44f955f510fa525e9c80c + +I=68 +KEY=0000000000000000100000000000000000000000000000000000000000000000 +CT=ade8d3fae7a4651855e053f42fff7905 + +I=69 +KEY=0000000000000000080000000000000000000000000000000000000000000000 +CT=398ba679b6c0a63479f0c6fe25614f01 + +I=70 +KEY=0000000000000000040000000000000000000000000000000000000000000000 +CT=fb77eca9def62902240e4bf3806f3a64 + +I=71 +KEY=0000000000000000020000000000000000000000000000000000000000000000 +CT=b4313d0a9d34b21f69021a5458680579 + +I=72 +KEY=0000000000000000010000000000000000000000000000000000000000000000 +CT=bdc7c4ed3b989bf8288e8b4acde3feea + +I=73 +KEY=0000000000000000008000000000000000000000000000000000000000000000 +CT=430a2daffa822532fd4843df9cbaf824 + +I=74 +KEY=0000000000000000004000000000000000000000000000000000000000000000 +CT=16a2deba266577150b6dc34995902c99 + +I=75 +KEY=0000000000000000002000000000000000000000000000000000000000000000 +CT=5902382c7675af5c52a6adf349454276 + +I=76 +KEY=0000000000000000001000000000000000000000000000000000000000000000 +CT=0d912aa37cfb56223c6ed9e04b3d563f + +I=77 +KEY=0000000000000000000800000000000000000000000000000000000000000000 +CT=1fd8880be6a6e51c0c0e9c2866127f7d + +I=78 +KEY=0000000000000000000400000000000000000000000000000000000000000000 +CT=bc4079ee5cdb86bdd8fae650e2931d98 + +I=79 +KEY=0000000000000000000200000000000000000000000000000000000000000000 +CT=c52e414fc84c978fad8cfa103844c306 + +I=80 +KEY=0000000000000000000100000000000000000000000000000000000000000000 +CT=df6291b74ef77e82a8fb7c207213125f + +I=81 +KEY=0000000000000000000080000000000000000000000000000000000000000000 +CT=530424a0f23cd90074f2d672a4ff3a96 + +I=82 +KEY=0000000000000000000040000000000000000000000000000000000000000000 +CT=83ed777537f5ee3e5769b8a07476a6ab + +I=83 +KEY=0000000000000000000020000000000000000000000000000000000000000000 +CT=5357341784eab13f104fbaefc69b726b + +I=84 +KEY=0000000000000000000010000000000000000000000000000000000000000000 +CT=6dbaca4c68ad93373cbeb1db0963f33f + +I=85 +KEY=0000000000000000000008000000000000000000000000000000000000000000 +CT=efa128916df70d852574ec8507625cc8 + +I=86 +KEY=0000000000000000000004000000000000000000000000000000000000000000 +CT=0bd55284ac672e1a2f248fb89c22b514 + +I=87 +KEY=0000000000000000000002000000000000000000000000000000000000000000 +CT=e3222e0e2770496c443ed562ecbfc368 + +I=88 +KEY=0000000000000000000001000000000000000000000000000000000000000000 +CT=6b689b6db9374e072b45a7807daab132 + +I=89 +KEY=0000000000000000000000800000000000000000000000000000000000000000 +CT=3215a725bcfbb120926f8bbce41fc3ec + +I=90 +KEY=0000000000000000000000400000000000000000000000000000000000000000 +CT=f2475fe25bef963862cf66c91da0250b + +I=91 +KEY=0000000000000000000000200000000000000000000000000000000000000000 +CT=5e1cc549bb39348529fd279dfe5e1ffc + +I=92 +KEY=0000000000000000000000100000000000000000000000000000000000000000 +CT=1a8edd22aa0fe906267df710de8db007 + +I=93 +KEY=0000000000000000000000080000000000000000000000000000000000000000 +CT=ee139ce12f8205d4eecce6d7fd23b01f + +I=94 +KEY=0000000000000000000000040000000000000000000000000000000000000000 +CT=fd84d87207d7be3a79272cc9df65e1e6 + +I=95 +KEY=0000000000000000000000020000000000000000000000000000000000000000 +CT=ce01b0eea6bf6d981affb07fe1dd164e + +I=96 +KEY=0000000000000000000000010000000000000000000000000000000000000000 +CT=1bcca9bd22179b1c941947643fb01f0f + +I=97 +KEY=0000000000000000000000008000000000000000000000000000000000000000 +CT=87a581347df02ff9973a0622df673804 + +I=98 +KEY=0000000000000000000000004000000000000000000000000000000000000000 +CT=1edeb75b65b365582ab5aa265037fa55 + +I=99 +KEY=0000000000000000000000002000000000000000000000000000000000000000 +CT=807dd7e0418803258ef677ba9345cf51 + +I=100 +KEY=0000000000000000000000001000000000000000000000000000000000000000 +CT=70ce90d345621481a99dc8ee1a62dcd5 + +I=101 +KEY=0000000000000000000000000800000000000000000000000000000000000000 +CT=bb51e835284e0f7b74c053151f07d207 + +I=102 +KEY=0000000000000000000000000400000000000000000000000000000000000000 +CT=0240317ec3afa5d4610c545c0d507367 + +I=103 +KEY=0000000000000000000000000200000000000000000000000000000000000000 +CT=9b77b76ca91662a9cb067267f0560c65 + +I=104 +KEY=0000000000000000000000000100000000000000000000000000000000000000 +CT=2219ed37d533b05cdc20b16f45d3dbd9 + +I=105 +KEY=0000000000000000000000000080000000000000000000000000000000000000 +CT=bc5a33af9e4591bd4cf53b20728c3f85 + +I=106 +KEY=0000000000000000000000000040000000000000000000000000000000000000 +CT=68628b89f58c20e5195db795c0a41489 + +I=107 +KEY=0000000000000000000000000020000000000000000000000000000000000000 +CT=5d177de234b6288510163f2351750215 + +I=108 +KEY=0000000000000000000000000010000000000000000000000000000000000000 +CT=6015d7ba2f33b88b2be0016e022e05fe + +I=109 +KEY=0000000000000000000000000008000000000000000000000000000000000000 +CT=2d203e35b97e3b315c17d9f0f80acda0 + +I=110 +KEY=0000000000000000000000000004000000000000000000000000000000000000 +CT=e5800af9bf96d6b7ed3a2aed899ca456 + +I=111 +KEY=0000000000000000000000000002000000000000000000000000000000000000 +CT=1163e6f8f1de919686c138089efa7986 + +I=112 +KEY=0000000000000000000000000001000000000000000000000000000000000000 +CT=2180b46e9eac63a165be63dae17889a4 + +I=113 +KEY=0000000000000000000000000000800000000000000000000000000000000000 +CT=3d751dc36b1046ac808d8275b48697ac + +I=114 +KEY=0000000000000000000000000000400000000000000000000000000000000000 +CT=df022c5efceb5d3fe7e72ddf11d16ea3 + +I=115 +KEY=0000000000000000000000000000200000000000000000000000000000000000 +CT=c706ab7a20e0d038143b78d9d12ec1a4 + +I=116 +KEY=0000000000000000000000000000100000000000000000000000000000000000 +CT=8afb006f196b00dae7f0b36c9e88a3b9 + +I=117 +KEY=0000000000000000000000000000080000000000000000000000000000000000 +CT=bed70262ed524a5c6a495092e2543993 + +I=118 +KEY=0000000000000000000000000000040000000000000000000000000000000000 +CT=088a58a7351c7a7af594035514de0757 + +I=119 +KEY=0000000000000000000000000000020000000000000000000000000000000000 +CT=f5df0bb68ab377b12321365c05480ea8 + +I=120 +KEY=0000000000000000000000000000010000000000000000000000000000000000 +CT=512dc8d603a7e4c8031d3566f141b233 + +I=121 +KEY=0000000000000000000000000000008000000000000000000000000000000000 +CT=50342ea0e9e81ec53e3683c8c1471602 + +I=122 +KEY=0000000000000000000000000000004000000000000000000000000000000000 +CT=8aab01e320b17fd9945d725f5ea904ba + +I=123 +KEY=0000000000000000000000000000002000000000000000000000000000000000 +CT=76fb320065713c165decbe5dafdd79bd + +I=124 +KEY=0000000000000000000000000000001000000000000000000000000000000000 +CT=a8ad014d22cd8fcc9557438b8228253a + +I=125 +KEY=0000000000000000000000000000000800000000000000000000000000000000 +CT=6017a9eb6f3336882fccedec746c62f6 + +I=126 +KEY=0000000000000000000000000000000400000000000000000000000000000000 +CT=2edf94990eb0f4bafe1f5903102fe874 + +I=127 +KEY=0000000000000000000000000000000200000000000000000000000000000000 +CT=4ec81b0fa8fae0025af09d26f1f200ea + +I=128 +KEY=0000000000000000000000000000000100000000000000000000000000000000 +CT=af7f474333e74691e5d01a3a841f8096 + +I=129 +KEY=0000000000000000000000000000000080000000000000000000000000000000 +CT=28fce531836f2a255ca19de6f53841e8 + +I=130 +KEY=0000000000000000000000000000000040000000000000000000000000000000 +CT=6282a41053316b1a4027488e6f747003 + +I=131 +KEY=0000000000000000000000000000000020000000000000000000000000000000 +CT=3668527987ac38a3f7c052a20b668f24 + +I=132 +KEY=0000000000000000000000000000000010000000000000000000000000000000 +CT=4c3473fe666072653e29354f07ef02b5 + +I=133 +KEY=0000000000000000000000000000000008000000000000000000000000000000 +CT=0a51d7a5b347225798ede5663940f32f + +I=134 +KEY=0000000000000000000000000000000004000000000000000000000000000000 +CT=d3ca3a8821a3d094cf63cf12136a1249 + +I=135 +KEY=0000000000000000000000000000000002000000000000000000000000000000 +CT=fbc5e4b37a69ad5f21e53f88e55ab95d + +I=136 +KEY=0000000000000000000000000000000001000000000000000000000000000000 +CT=cccaaa0a2defd357ee31c2cfec9d0e8e + +I=137 +KEY=0000000000000000000000000000000000800000000000000000000000000000 +CT=93348b5393560aa416c6e6f0c99a58f7 + +I=138 +KEY=0000000000000000000000000000000000400000000000000000000000000000 +CT=13ac66e49e23a8d3582aa7117f7a8f2f + +I=139 +KEY=0000000000000000000000000000000000200000000000000000000000000000 +CT=c403ad02f23055cee08281e7d0c7eb2a + +I=140 +KEY=0000000000000000000000000000000000100000000000000000000000000000 +CT=65dfd53b699b191ce7a6610a405083dc + +I=141 +KEY=0000000000000000000000000000000000080000000000000000000000000000 +CT=3d6f7e99f6512553bb983e8f75672b97 + +I=142 +KEY=0000000000000000000000000000000000040000000000000000000000000000 +CT=92ba0d580a954f8c8494a840f0252aef + +I=143 +KEY=0000000000000000000000000000000000020000000000000000000000000000 +CT=958d8c9141ce21dbd69e19ba1e4f67aa + +I=144 +KEY=0000000000000000000000000000000000010000000000000000000000000000 +CT=e508796197f539fcdc917ecab19507e0 + +I=145 +KEY=0000000000000000000000000000000000008000000000000000000000000000 +CT=2200a6914a2050e99a55fb3bf20315e4 + +I=146 +KEY=0000000000000000000000000000000000004000000000000000000000000000 +CT=627c0b2401ee6c095404cd7aa59ea67e + +I=147 +KEY=0000000000000000000000000000000000002000000000000000000000000000 +CT=75159b707278dfe6fd8a024b9ff0d5a8 + +I=148 +KEY=0000000000000000000000000000000000001000000000000000000000000000 +CT=f47982be40c39306acf25a120bc1b4e0 + +I=149 +KEY=0000000000000000000000000000000000000800000000000000000000000000 +CT=01caabef85a1e081ea6983079a90ea34 + +I=150 +KEY=0000000000000000000000000000000000000400000000000000000000000000 +CT=7f473cd21a453bf74cc76184d6f5496f + +I=151 +KEY=0000000000000000000000000000000000000200000000000000000000000000 +CT=659442fd57b94862529d3e4c530826fe + +I=152 +KEY=0000000000000000000000000000000000000100000000000000000000000000 +CT=88a9140c094a695716a2966b1a8078a0 + +I=153 +KEY=0000000000000000000000000000000000000080000000000000000000000000 +CT=28ccfc1bb6180aa7373da1f5a54e47ea + +I=154 +KEY=0000000000000000000000000000000000000040000000000000000000000000 +CT=53dfd8cb845fd279b337b52dbba3cf4c + +I=155 +KEY=0000000000000000000000000000000000000020000000000000000000000000 +CT=1bb5b100dfe6ba16983ad4a0f09fd50b + +I=156 +KEY=0000000000000000000000000000000000000010000000000000000000000000 +CT=a896ae30d529d4acffcf5b763309cd28 + +I=157 +KEY=0000000000000000000000000000000000000008000000000000000000000000 +CT=f40a1b359a9b6b1197276c71222371f4 + +I=158 +KEY=0000000000000000000000000000000000000004000000000000000000000000 +CT=9fde11c9e6cf9a1e9089820fd928767c + +I=159 +KEY=0000000000000000000000000000000000000002000000000000000000000000 +CT=7771a5a99b099a2c861d084e790958a2 + +I=160 +KEY=0000000000000000000000000000000000000001000000000000000000000000 +CT=be1907aa5ca148a0282850401c48af71 + +I=161 +KEY=0000000000000000000000000000000000000000800000000000000000000000 +CT=8e47d50827fd36b62c0d3bd36f863198 + +I=162 +KEY=0000000000000000000000000000000000000000400000000000000000000000 +CT=81aa1751209f9173258cd1625db65e07 + +I=163 +KEY=0000000000000000000000000000000000000000200000000000000000000000 +CT=1ee8fe72574bd819c97a0dea2a5e0b64 + +I=164 +KEY=0000000000000000000000000000000000000000100000000000000000000000 +CT=031ba0b3efcae9b08793c8107c277a27 + +I=165 +KEY=0000000000000000000000000000000000000000080000000000000000000000 +CT=34c8dfd0dc4ba5240ca21bf4959eef6b + +I=166 +KEY=0000000000000000000000000000000000000000040000000000000000000000 +CT=c7a4da0d5892a185d35447db904511b5 + +I=167 +KEY=0000000000000000000000000000000000000000020000000000000000000000 +CT=7a8b9982b6c8ae1b5dc02fc1d9afa2e0 + +I=168 +KEY=0000000000000000000000000000000000000000010000000000000000000000 +CT=c77e0dfb29402c587c6dd97e0bd09aba + +I=169 +KEY=0000000000000000000000000000000000000000008000000000000000000000 +CT=1aa2fd990bd0b0715b18482088de0844 + +I=170 +KEY=0000000000000000000000000000000000000000004000000000000000000000 +CT=31c2d486fda54bab4286a02d260918ac + +I=171 +KEY=0000000000000000000000000000000000000000002000000000000000000000 +CT=545f5a95e159b5f0ddf544b60f9c28c3 + +I=172 +KEY=0000000000000000000000000000000000000000001000000000000000000000 +CT=45c84895af0393588c67d9cdd5e4d7e2 + +I=173 +KEY=0000000000000000000000000000000000000000000800000000000000000000 +CT=745bf4af94a92d32ffe44b41aef39320 + +I=174 +KEY=0000000000000000000000000000000000000000000400000000000000000000 +CT=13c47c2f92f91d72f34381ac9a81473d + +I=175 +KEY=0000000000000000000000000000000000000000000200000000000000000000 +CT=8836d5aa076110fcd5bd66f3becb39f6 + +I=176 +KEY=0000000000000000000000000000000000000000000100000000000000000000 +CT=11ede6f221e96c7515b1256df055fbc3 + +I=177 +KEY=0000000000000000000000000000000000000000000080000000000000000000 +CT=4e3be7d6830703a6185cf0bdbe7f5be4 + +I=178 +KEY=0000000000000000000000000000000000000000000040000000000000000000 +CT=6a1abda47972cff536946a1c7d380810 + +I=179 +KEY=0000000000000000000000000000000000000000000020000000000000000000 +CT=74031db865d2fc8319a320ffac4694d8 + +I=180 +KEY=0000000000000000000000000000000000000000000010000000000000000000 +CT=e1f751f11027548c057075e8d8f880ea + +I=181 +KEY=0000000000000000000000000000000000000000000008000000000000000000 +CT=af24fa74ca96d89088c9018aa60e1d53 + +I=182 +KEY=0000000000000000000000000000000000000000000004000000000000000000 +CT=0e5214d31b2c9219f6c9686a35f210ff + +I=183 +KEY=0000000000000000000000000000000000000000000002000000000000000000 +CT=2a72e2e692463ee8846c94a483c27e25 + +I=184 +KEY=0000000000000000000000000000000000000000000001000000000000000000 +CT=2b9c3298626f11072d7b1d80b47a841f + +I=185 +KEY=0000000000000000000000000000000000000000000000800000000000000000 +CT=7468caa1a5ffc828be5a752c33132e90 + +I=186 +KEY=0000000000000000000000000000000000000000000000400000000000000000 +CT=29c75add5ede2680c169ff9fd9177331 + +I=187 +KEY=0000000000000000000000000000000000000000000000200000000000000000 +CT=9ba78930cdd3357a2d84a49725902e8f + +I=188 +KEY=0000000000000000000000000000000000000000000000100000000000000000 +CT=f190ac4c43e202f925b5fd1e4ca62dd6 + +I=189 +KEY=0000000000000000000000000000000000000000000000080000000000000000 +CT=5716fb34a1a6b40c35b2ba860f12163e + +I=190 +KEY=0000000000000000000000000000000000000000000000040000000000000000 +CT=43b90548889a171e85515ab05ec76856 + +I=191 +KEY=0000000000000000000000000000000000000000000000020000000000000000 +CT=b4de6f86875147f5276d584cec11afb4 + +I=192 +KEY=0000000000000000000000000000000000000000000000010000000000000000 +CT=3da6c1a8937583bf6491b2e9c52081e6 + +I=193 +KEY=0000000000000000000000000000000000000000000000008000000000000000 +CT=9a54fcd26d9754add5f8967ef551eab0 + +I=194 +KEY=0000000000000000000000000000000000000000000000004000000000000000 +CT=f0dcfa56a7e41a859276a6f8927b561d + +I=195 +KEY=0000000000000000000000000000000000000000000000002000000000000000 +CT=5881a8ae181f16b64cd0c455389f511c + +I=196 +KEY=0000000000000000000000000000000000000000000000001000000000000000 +CT=e9f7ad45d9ea9aa4c830b89eec61c1b5 + +I=197 +KEY=0000000000000000000000000000000000000000000000000800000000000000 +CT=9118b623a63bfc69a9aab868d752460b + +I=198 +KEY=0000000000000000000000000000000000000000000000000400000000000000 +CT=2d208d46fb2177c243c539fccd4a1e9d + +I=199 +KEY=0000000000000000000000000000000000000000000000000200000000000000 +CT=2a4f52a297f20e428222008d9be4a23b + +I=200 +KEY=0000000000000000000000000000000000000000000000000100000000000000 +CT=ebcfdd28550c9654374590ec4bfd1cdc + +I=201 +KEY=0000000000000000000000000000000000000000000000000080000000000000 +CT=fabb99266fc741241f6cfc0ced776a11 + +I=202 +KEY=0000000000000000000000000000000000000000000000000040000000000000 +CT=fbdec944b2303e3a08a964e24130d10d + +I=203 +KEY=0000000000000000000000000000000000000000000000000020000000000000 +CT=9897e33e6052aba1f07233bcef531e32 + +I=204 +KEY=0000000000000000000000000000000000000000000000000010000000000000 +CT=509dca41b038225b30d8b7880d52999d + +I=205 +KEY=0000000000000000000000000000000000000000000000000008000000000000 +CT=3f70238f99f2af394c31308d68f1707c + +I=206 +KEY=0000000000000000000000000000000000000000000000000004000000000000 +CT=e6ff6426e9025dd6519837f71a6c3636 + +I=207 +KEY=0000000000000000000000000000000000000000000000000002000000000000 +CT=f222502aef77c1f21db79b08f7ab8ca2 + +I=208 +KEY=0000000000000000000000000000000000000000000000000001000000000000 +CT=c17d2c00477c1aa20b539be8174e7202 + +I=209 +KEY=0000000000000000000000000000000000000000000000000000800000000000 +CT=0f7b12ae962af9c0c8cdcaa288fc6e12 + +I=210 +KEY=0000000000000000000000000000000000000000000000000000400000000000 +CT=0e740ee58431521a622122aefb163ce2 + +I=211 +KEY=0000000000000000000000000000000000000000000000000000200000000000 +CT=cf0b94fecac6f67070306654fe198449 + +I=212 +KEY=0000000000000000000000000000000000000000000000000000100000000000 +CT=604ea1d0711acb8e545c0a88976008f9 + +I=213 +KEY=0000000000000000000000000000000000000000000000000000080000000000 +CT=71d03d8f6f917fdf5b612180454f3699 + +I=214 +KEY=0000000000000000000000000000000000000000000000000000040000000000 +CT=a6bcfe7b73edce71db36af00b01c37ec + +I=215 +KEY=0000000000000000000000000000000000000000000000000000020000000000 +CT=93d761851bb991221ae77968459787dd + +I=216 +KEY=0000000000000000000000000000000000000000000000000000010000000000 +CT=f117e4d5c88cc1c067c88ae38a5bf1d5 + +I=217 +KEY=0000000000000000000000000000000000000000000000000000008000000000 +CT=b534328da555a9b69ac2a5b08e3ce47e + +I=218 +KEY=0000000000000000000000000000000000000000000000000000004000000000 +CT=7bdfb785d866b6487790b9f6164f5ebd + +I=219 +KEY=0000000000000000000000000000000000000000000000000000002000000000 +CT=5b3bb41e43d02901f5a0231768347b38 + +I=220 +KEY=0000000000000000000000000000000000000000000000000000001000000000 +CT=917216669db1600015f2fe7cbdda0ff4 + +I=221 +KEY=0000000000000000000000000000000000000000000000000000000800000000 +CT=c79b582fc430c0187d7b1d7b1e79bdb9 + +I=222 +KEY=0000000000000000000000000000000000000000000000000000000400000000 +CT=b9a43998aed6bb7b79c91bb4c2530f4e + +I=223 +KEY=0000000000000000000000000000000000000000000000000000000200000000 +CT=0b24ebdf9a1d129f5e8397ab7412bc74 + +I=224 +KEY=0000000000000000000000000000000000000000000000000000000100000000 +CT=96d523e4ef1c888c72460deba8d58b78 + +I=225 +KEY=0000000000000000000000000000000000000000000000000000000080000000 +CT=85708c4539c8b06dd787afdd06a3fe24 + +I=226 +KEY=0000000000000000000000000000000000000000000000000000000040000000 +CT=67a106762d2f46b7880750bcf987054c + +I=227 +KEY=0000000000000000000000000000000000000000000000000000000020000000 +CT=8f46e37371e81c389ca94a8272a14fc8 + +I=228 +KEY=0000000000000000000000000000000000000000000000000000000010000000 +CT=92dc700c11bbe46da9559caa7ba662f0 + +I=229 +KEY=0000000000000000000000000000000000000000000000000000000008000000 +CT=90d2b52984da214f392ef4eac26a04fe + +I=230 +KEY=0000000000000000000000000000000000000000000000000000000004000000 +CT=832d440d62996c5bfcb7faa08deb4d2c + +I=231 +KEY=0000000000000000000000000000000000000000000000000000000002000000 +CT=69b7f725ba2b0539f6b45f2c8495d571 + +I=232 +KEY=0000000000000000000000000000000000000000000000000000000001000000 +CT=ce78a2aa25f818d87c46367579fae698 + +I=233 +KEY=0000000000000000000000000000000000000000000000000000000000800000 +CT=f5e3e4da4fc90f25f7d6679f076ca32e + +I=234 +KEY=0000000000000000000000000000000000000000000000000000000000400000 +CT=f7618b001bc19f0195bd21021d9545b6 + +I=235 +KEY=0000000000000000000000000000000000000000000000000000000000200000 +CT=d84e1e36e1100913c7afdbfe5009edea + +I=236 +KEY=0000000000000000000000000000000000000000000000000000000000100000 +CT=9db2838e3903829913d2aee6465202fd + +I=237 +KEY=0000000000000000000000000000000000000000000000000000000000080000 +CT=361afbf61bdb378ccf2b76c01469baa2 + +I=238 +KEY=0000000000000000000000000000000000000000000000000000000000040000 +CT=dc4c998046574b4cc447154f663e8ebd + +I=239 +KEY=0000000000000000000000000000000000000000000000000000000000020000 +CT=0d890efa71666be0a38b423bad47c90f + +I=240 +KEY=0000000000000000000000000000000000000000000000000000000000010000 +CT=f39c444538e646a2bd59b443f68c51d5 + +I=241 +KEY=0000000000000000000000000000000000000000000000000000000000008000 +CT=9c6d37340e8f5ea22213e17a9f720238 + +I=242 +KEY=0000000000000000000000000000000000000000000000000000000000004000 +CT=3a23813329f978c1c6c3be1715011283 + +I=243 +KEY=0000000000000000000000000000000000000000000000000000000000002000 +CT=ce24d63afa37e2a659a21cf770109bb4 + +I=244 +KEY=0000000000000000000000000000000000000000000000000000000000001000 +CT=df329017478d86b2c360d55bc2b2adcf + +I=245 +KEY=0000000000000000000000000000000000000000000000000000000000000800 +CT=bc5efa1fbf848776746fd7826656e25c + +I=246 +KEY=0000000000000000000000000000000000000000000000000000000000000400 +CT=a3e4185241c566dd2cf8117d4d7699f4 + +I=247 +KEY=0000000000000000000000000000000000000000000000000000000000000200 +CT=ef7bbdeb18879c11e2979dcc601cb620 + +I=248 +KEY=0000000000000000000000000000000000000000000000000000000000000100 +CT=fdc76a95f9c87e394f82a787d7406d40 + +I=249 +KEY=0000000000000000000000000000000000000000000000000000000000000080 +CT=b224e2becacf6773b9941516195ed06b + +I=250 +KEY=0000000000000000000000000000000000000000000000000000000000000040 +CT=b3951d0cf640bb7bd8f3d9948745ff9e + +I=251 +KEY=0000000000000000000000000000000000000000000000000000000000000020 +CT=f9c8966e2874f736765b89da10ef4611 + +I=252 +KEY=0000000000000000000000000000000000000000000000000000000000000010 +CT=3750f26bab98833ab30444c0821a594c + +I=253 +KEY=0000000000000000000000000000000000000000000000000000000000000008 +CT=d369c2b7c2337d67a87cd5b4eb45d290 + +I=254 +KEY=0000000000000000000000000000000000000000000000000000000000000004 +CT=f3a44b0f53dcc9f79e1afa8abb022c84 + +I=255 +KEY=0000000000000000000000000000000000000000000000000000000000000002 +CT=6e47c47f3940d369ec703e974ab350b6 + +I=256 +KEY=0000000000000000000000000000000000000000000000000000000000000001 +CT=1100de2a57c47c2eb63277537ade5716 + +========== diff -urN lin.2.2.17/crypto/testing/rijndael_ecb_vk.txt int.2.2.17.x/crypto/testing/rijndael_ecb_vk.txt --- lin.2.2.17/crypto/testing/rijndael_ecb_vk.txt Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/rijndael_ecb_vk.txt Mon Oct 16 17:27:04 2000 @@ -0,0 +1,2334 @@ + +========================= + +FILENAME: "ecb_vk.txt" + +Electronic Codebook (ECB) Mode +Variable Key Known Answer Tests + +Algorithm Name: Rijndael +Principal Submitter: Joan Daemen + +========== + +KEYSIZE=128 + +PT=00000000000000000000000000000000 + +I=1 +KEY=80000000000000000000000000000000 +CT=0EDD33D3C621E546455BD8BA1418BEC8 + +I=2 +KEY=40000000000000000000000000000000 +CT=C0CC0C5DA5BD63ACD44A80774FAD5222 + +I=3 +KEY=20000000000000000000000000000000 +CT=2F0B4B71BC77851B9CA56D42EB8FF080 + +I=4 +KEY=10000000000000000000000000000000 +CT=6B1E2FFFE8A114009D8FE22F6DB5F876 + +I=5 +KEY=08000000000000000000000000000000 +CT=9AA042C315F94CBB97B62202F83358F5 + +I=6 +KEY=04000000000000000000000000000000 +CT=DBE01DE67E346A800C4C4B4880311DE4 + +I=7 +KEY=02000000000000000000000000000000 +CT=C117D2238D53836ACD92DDCDB85D6A21 + +I=8 +KEY=01000000000000000000000000000000 +CT=DC0ED85DF9611ABB7249CDD168C5467E + +I=9 +KEY=00800000000000000000000000000000 +CT=807D678FFF1F56FA92DE3381904842F2 + +I=10 +KEY=00400000000000000000000000000000 +CT=0E53B3FCAD8E4B130EF73AEB957FB402 + +I=11 +KEY=00200000000000000000000000000000 +CT=969FFD3B7C35439417E7BDE923035D65 + +I=12 +KEY=00100000000000000000000000000000 +CT=A99B512C19CA56070491166A1503BF15 + +I=13 +KEY=00080000000000000000000000000000 +CT=6E9985252126EE344D26AE369D2327E3 + +I=14 +KEY=00040000000000000000000000000000 +CT=B85F4809F904C275491FCDCD1610387E + +I=15 +KEY=00020000000000000000000000000000 +CT=ED365B8D7D20C1F5D53FB94DD211DF7B + +I=16 +KEY=00010000000000000000000000000000 +CT=B3A575E86A8DB4A7135D604C43304896 + +I=17 +KEY=00008000000000000000000000000000 +CT=89704BCB8E69F846259EB0ACCBC7F8A2 + +I=18 +KEY=00004000000000000000000000000000 +CT=C56EE7C92197861F10D7A92B90882055 + +I=19 +KEY=00002000000000000000000000000000 +CT=92F296F6846E0EAF9422A5A24A08B069 + +I=20 +KEY=00001000000000000000000000000000 +CT=E67E32BB8F11DEB8699318BEE9E91A60 + +I=21 +KEY=00000800000000000000000000000000 +CT=B08EEF85EAF626DD91B65C4C3A97D92B + +I=22 +KEY=00000400000000000000000000000000 +CT=661083A6ADDCE79BB4E0859AB5538013 + +I=23 +KEY=00000200000000000000000000000000 +CT=55DFE2941E0EB10AFC0B333BD34DE1FE + +I=24 +KEY=00000100000000000000000000000000 +CT=6BFE5945E715C9662609770F8846087A + +I=25 +KEY=00000080000000000000000000000000 +CT=79848E9C30C2F8CDA8B325F7FED2B139 + +I=26 +KEY=00000040000000000000000000000000 +CT=7A713A53B99FEF34AC04DEEF80965BD0 + +I=27 +KEY=00000020000000000000000000000000 +CT=18144A2B46620D32C3C32CE52D49257F + +I=28 +KEY=00000010000000000000000000000000 +CT=872E827C70887C80749F7B8BB1847C7E + +I=29 +KEY=00000008000000000000000000000000 +CT=6B86C6A4FE6A60C59B1A3102F8DE49F3 + +I=30 +KEY=00000004000000000000000000000000 +CT=9848BB3DFDF6F532F094679A4C231A20 + +I=31 +KEY=00000002000000000000000000000000 +CT=925AD528E852E329B2091CD3F1C2BCEE + +I=32 +KEY=00000001000000000000000000000000 +CT=80DF436544B0DD596722E46792A40CD8 + +I=33 +KEY=00000000800000000000000000000000 +CT=525DAF18F93E83E1E74BBBDDE4263BBA + +I=34 +KEY=00000000400000000000000000000000 +CT=F65C9D2EE485D24701FFA3313B9D5BE6 + +I=35 +KEY=00000000200000000000000000000000 +CT=E4FC8D8BCA06425BDF94AFA40FCC14BA + +I=36 +KEY=00000000100000000000000000000000 +CT=A53F0A5CA1E4E6440BB975FF320DE6F8 + +I=37 +KEY=00000000080000000000000000000000 +CT=D55313B9394080462E87E02899B553F0 + +I=38 +KEY=00000000040000000000000000000000 +CT=34A71D761F71BCD344384C7F97D27906 + +I=39 +KEY=00000000020000000000000000000000 +CT=233F3D819599612EBC89580245C996A8 + +I=40 +KEY=00000000010000000000000000000000 +CT=B4F1374E5268DBCB676E447529E53F89 + +I=41 +KEY=00000000008000000000000000000000 +CT=0816BD27861D2BA891D1044E39951E96 + +I=42 +KEY=00000000004000000000000000000000 +CT=F3BE9EA3F10C73CA64FDE5DB13A951D1 + +I=43 +KEY=00000000002000000000000000000000 +CT=2448086A8106FBD03048DDF857D3F1C8 + +I=44 +KEY=00000000001000000000000000000000 +CT=670756E65BEC8B68F03D77CDCDCE7B91 + +I=45 +KEY=00000000000800000000000000000000 +CT=EF968CF0D36FD6C6EFFD225F6FB44CA9 + +I=46 +KEY=00000000000400000000000000000000 +CT=2E8767157922E3826DDCEC1B0CC1E105 + +I=47 +KEY=00000000000200000000000000000000 +CT=78CE7EEC670E45A967BAB17E26A1AD36 + +I=48 +KEY=00000000000100000000000000000000 +CT=3C5CEE825655F098F6E81A2F417DA3FB + +I=49 +KEY=00000000000080000000000000000000 +CT=67BFDB431DCE1292200BC6F5207ADB12 + +I=50 +KEY=00000000000040000000000000000000 +CT=7540FD38E447C0779228548747843A6F + +I=51 +KEY=00000000000020000000000000000000 +CT=B85E513301F8A936EA9EC8A21A85B5E6 + +I=52 +KEY=00000000000010000000000000000000 +CT=04C67DBF16C11427D507A455DE2C9BC5 + +I=53 +KEY=00000000000008000000000000000000 +CT=03F75EB8959E55079CFFB4FF149A37B6 + +I=54 +KEY=00000000000004000000000000000000 +CT=74550287F666C63BB9BC7838433434B0 + +I=55 +KEY=00000000000002000000000000000000 +CT=7D537200195EBC3AEFD1EAAB1C385221 + +I=56 +KEY=00000000000001000000000000000000 +CT=CE24E4D40C68A82B535CBD3C8E21652A + +I=57 +KEY=00000000000000800000000000000000 +CT=AB20072405AA8FC40265C6F1F3DC8BC0 + +I=58 +KEY=00000000000000400000000000000000 +CT=6CFD2CF688F566B093F67B9B3839E80A + +I=59 +KEY=00000000000000200000000000000000 +CT=BD95977E6B7239D407A012C5544BF584 + +I=60 +KEY=00000000000000100000000000000000 +CT=DF9C0130AC77E7C72C997F587B46DBE0 + +I=61 +KEY=00000000000000080000000000000000 +CT=E7F1B82CADC53A648798945B34EFEFF2 + +I=62 +KEY=00000000000000040000000000000000 +CT=932C6DBF69255CF13EDCDB72233ACEA3 + +I=63 +KEY=00000000000000020000000000000000 +CT=5C76002BC7206560EFE550C80B8F12CC + +I=64 +KEY=00000000000000010000000000000000 +CT=F6B7BDD1CAEEBAB574683893C4475484 + +I=65 +KEY=00000000000000008000000000000000 +CT=A920E37CC6DC6B31DA8C0169569F5034 + +I=66 +KEY=00000000000000004000000000000000 +CT=919380ECD9C778BC513148B0C28D65FD + +I=67 +KEY=00000000000000002000000000000000 +CT=EE67308DD3F2D9E6C2170755E5784BE1 + +I=68 +KEY=00000000000000001000000000000000 +CT=3CC73E53B85609023A05E149B223AE09 + +I=69 +KEY=00000000000000000800000000000000 +CT=983E8AF7CF05EBB28D71EB841C9406E6 + +I=70 +KEY=00000000000000000400000000000000 +CT=0F3099B2D31FA5299EE5BF43193287FC + +I=71 +KEY=00000000000000000200000000000000 +CT=B763D84F38C27FE6931DCEB6715D4DB6 + +I=72 +KEY=00000000000000000100000000000000 +CT=5AE3C9B0E3CC29C0C61565CD01F8A248 + +I=73 +KEY=00000000000000000080000000000000 +CT=F58083572CD90981958565D48D2DEE25 + +I=74 +KEY=00000000000000000040000000000000 +CT=7E6255EEF8F70C0EF10337AAB1CCCEF8 + +I=75 +KEY=00000000000000000020000000000000 +CT=AAD4BAC34DB22821841CE2F631961902 + +I=76 +KEY=00000000000000000010000000000000 +CT=D7431C0409BB1441BA9C6858DC7D4E81 + +I=77 +KEY=00000000000000000008000000000000 +CT=EF9298C65E339F6E801A59C626456993 + +I=78 +KEY=00000000000000000004000000000000 +CT=53FE29F68FF541ABC3F0EF3350B72F7E + +I=79 +KEY=00000000000000000002000000000000 +CT=F6BBA5C10DB02529E2C2DA3FB582CC14 + +I=80 +KEY=00000000000000000001000000000000 +CT=E4239AA37FC531A386DAD1126FC0E9CD + +I=81 +KEY=00000000000000000000800000000000 +CT=8F7758F857D15BBE7BFD0E416404C365 + +I=82 +KEY=00000000000000000000400000000000 +CT=D273EB57C687BCD1B4EA7218A509E7B8 + +I=83 +KEY=00000000000000000000200000000000 +CT=65D64F8D76E8B3423FA25C4EB58A210A + +I=84 +KEY=00000000000000000000100000000000 +CT=623D802B4EC450D66A16625702FCDBE0 + +I=85 +KEY=00000000000000000000080000000000 +CT=7496460CB28E5791BAEAF9B68FB00022 + +I=86 +KEY=00000000000000000000040000000000 +CT=34EA600F18BB0694B41681A49D510C1D + +I=87 +KEY=00000000000000000000020000000000 +CT=5F8FF0D47D5766D29B5D6E8F46423BD8 + +I=88 +KEY=00000000000000000000010000000000 +CT=225F9286C5928BF09F84D3F93F541959 + +I=89 +KEY=00000000000000000000008000000000 +CT=B21E90D25DF383416A5F072CEBEB1FFB + +I=90 +KEY=00000000000000000000004000000000 +CT=4AEFCDA089318125453EB9E8EB5E492E + +I=91 +KEY=00000000000000000000002000000000 +CT=4D3E75C6CD40EC4869BC85158591ADB8 + +I=92 +KEY=00000000000000000000001000000000 +CT=63A8B904405436A1B99D7751866771B7 + +I=93 +KEY=00000000000000000000000800000000 +CT=64F0DAAE47529199792EAE172BA53293 + +I=94 +KEY=00000000000000000000000400000000 +CT=C3EEF84BEA18225D515A8C852A9047EE + +I=95 +KEY=00000000000000000000000200000000 +CT=A44AC422B47D47B81AF73B3E9AC9596E + +I=96 +KEY=00000000000000000000000100000000 +CT=D16E04A8FBC435094F8D53ADF25F5084 + +I=97 +KEY=00000000000000000000000080000000 +CT=EF13DC34BAB03E124EEAD8B6BF44B532 + +I=98 +KEY=00000000000000000000000040000000 +CT=D94799075C24DCC067AF0D392049250D + +I=99 +KEY=00000000000000000000000020000000 +CT=14F431771EDDCE4764C21A2254B5E3C8 + +I=100 +KEY=00000000000000000000000010000000 +CT=7039329F36F2ED682B02991F28D64679 + +I=101 +KEY=00000000000000000000000008000000 +CT=124EE24EDE5551639DB8B8B941F6141D + +I=102 +KEY=00000000000000000000000004000000 +CT=C2852879A34D5184E478EC918B993FEE + +I=103 +KEY=00000000000000000000000002000000 +CT=86A806A3525B93E432053C9AB5ABBEDF + +I=104 +KEY=00000000000000000000000001000000 +CT=C1609BF5A4F07E37C17A36366EC23ECC + +I=105 +KEY=00000000000000000000000000800000 +CT=7E81E7CB92159A51FFCEA331B1E8EA53 + +I=106 +KEY=00000000000000000000000000400000 +CT=37A7BE002856C5A59A6E03EAFCE7729A + +I=107 +KEY=00000000000000000000000000200000 +CT=BDF98A5A4F91E890C9A1D1E5FAAB138F + +I=108 +KEY=00000000000000000000000000100000 +CT=4E96ACB66E051F2BC739CC3D3E34A26B + +I=109 +KEY=00000000000000000000000000080000 +CT=EE996CDD120EB86E21ECFA49E8E1FCF1 + +I=110 +KEY=00000000000000000000000000040000 +CT=61B9E6B579DBF6070C351A1440DD85FF + +I=111 +KEY=00000000000000000000000000020000 +CT=AC369E484316440B40DFC83AA96E28E7 + +I=112 +KEY=00000000000000000000000000010000 +CT=0A2D16DE985C76D45C579C1159413BBE + +I=113 +KEY=00000000000000000000000000008000 +CT=DA3FDC38DA1D374FA4802CDA1A1C6B0F + +I=114 +KEY=00000000000000000000000000004000 +CT=B842523D4C41C2211AFE43A5800ADCE3 + +I=115 +KEY=00000000000000000000000000002000 +CT=9E2CDA90D8E992DBA6C73D8229567192 + +I=116 +KEY=00000000000000000000000000001000 +CT=D49583B781D9E20F5BE101415957FC49 + +I=117 +KEY=00000000000000000000000000000800 +CT=EF09DA5C12B376E458B9B8670032498E + +I=118 +KEY=00000000000000000000000000000400 +CT=A96BE0463DA774461A5E1D5A9DD1AC10 + +I=119 +KEY=00000000000000000000000000000200 +CT=32CEE3341060790D2D4B1362EF397090 + +I=120 +KEY=00000000000000000000000000000100 +CT=21CEA416A3D3359D2C4D58FB6A035F06 + +I=121 +KEY=00000000000000000000000000000080 +CT=172AEAB3D507678ECAF455C12587ADB7 + +I=122 +KEY=00000000000000000000000000000040 +CT=B6F897941EF8EBFF9FE80A567EF38478 + +I=123 +KEY=00000000000000000000000000000020 +CT=A9723259D94A7DC662FB0C782CA3F1DD + +I=124 +KEY=00000000000000000000000000000010 +CT=2F91C984B9A4839F30001B9F430493B4 + +I=125 +KEY=00000000000000000000000000000008 +CT=0472406345A610B048CB99EE0EF3FA0F + +I=126 +KEY=00000000000000000000000000000004 +CT=F5F39086646F8C05ED16EFA4B617957C + +I=127 +KEY=00000000000000000000000000000002 +CT=26D50F485A30408D5AF47A5736292450 + +I=128 +KEY=00000000000000000000000000000001 +CT=0545AAD56DA2A97C3663D1432A3D1C84 + +========== + +KEYSIZE=192 + +PT=00000000000000000000000000000000 + +I=1 +KEY=800000000000000000000000000000000000000000000000 +CT=DE885DC87F5A92594082D02CC1E1B42C + +I=2 +KEY=400000000000000000000000000000000000000000000000 +CT=C749194F94673F9DD2AA1932849630C1 + +I=3 +KEY=200000000000000000000000000000000000000000000000 +CT=0CEF643313912934D310297B90F56ECC + +I=4 +KEY=100000000000000000000000000000000000000000000000 +CT=C4495D39D4A553B225FBA02A7B1B87E1 + +I=5 +KEY=080000000000000000000000000000000000000000000000 +CT=636D10B1A0BCAB541D680A7970ADC830 + +I=6 +KEY=040000000000000000000000000000000000000000000000 +CT=07CF045786BD6AFCC147D99E45A901A7 + +I=7 +KEY=020000000000000000000000000000000000000000000000 +CT=6A8E3F425A7599348F95398448827976 + +I=8 +KEY=010000000000000000000000000000000000000000000000 +CT=5518276836148A00D91089A20D8BFF57 + +I=9 +KEY=008000000000000000000000000000000000000000000000 +CT=F267E07B5E87E3BC20B969C61D4FCB06 + +I=10 +KEY=004000000000000000000000000000000000000000000000 +CT=5A1CDE69571D401BFCD20DEBADA2212C + +I=11 +KEY=002000000000000000000000000000000000000000000000 +CT=70A9057263254701D12ADD7D74CD509E + +I=12 +KEY=001000000000000000000000000000000000000000000000 +CT=35713A7E108031279388A33A0FE2E190 + +I=13 +KEY=000800000000000000000000000000000000000000000000 +CT=E74EDE82B1254714F0C7B4B243108655 + +I=14 +KEY=000400000000000000000000000000000000000000000000 +CT=39272E3100FAA37B55B862320D1B3EB3 + +I=15 +KEY=000200000000000000000000000000000000000000000000 +CT=6D6E24C659FC5AEF712F77BCA19C9DD0 + +I=16 +KEY=000100000000000000000000000000000000000000000000 +CT=76D18212F972370D3CC2C6C372C6CF2F + +I=17 +KEY=000080000000000000000000000000000000000000000000 +CT=B21A1F0BAE39E55C7594ED570A7783EA + +I=18 +KEY=000040000000000000000000000000000000000000000000 +CT=77DE202111895AC48DD1C974B358B458 + +I=19 +KEY=000020000000000000000000000000000000000000000000 +CT=67810B311969012AAF7B504FFAF39FD1 + +I=20 +KEY=000010000000000000000000000000000000000000000000 +CT=C22EA2344D3E9417A6BA07843E713AEA + +I=21 +KEY=000008000000000000000000000000000000000000000000 +CT=C79CAF4B97BEE0BD0630AB354539D653 + +I=22 +KEY=000004000000000000000000000000000000000000000000 +CT=135FD1AF761D9AE23DF4AA6B86760DB4 + +I=23 +KEY=000002000000000000000000000000000000000000000000 +CT=D4659D0B06ACD4D56AB8D11A16FD83B9 + +I=24 +KEY=000001000000000000000000000000000000000000000000 +CT=F7D270028FC188E4E4F35A4AAA25D4D4 + +I=25 +KEY=000000800000000000000000000000000000000000000000 +CT=345CAE5A8C9620A9913D5473985852FF + +I=26 +KEY=000000400000000000000000000000000000000000000000 +CT=4E8980ADDE60B0E42C0B287FEA41E729 + +I=27 +KEY=000000200000000000000000000000000000000000000000 +CT=F11B6D74E1F15155633DC39743C1A527 + +I=28 +KEY=000000100000000000000000000000000000000000000000 +CT=9C87916C0180064F9D3179C6F5DD8C35 + +I=29 +KEY=000000080000000000000000000000000000000000000000 +CT=71AB186BCAEA518E461D4F7FAD230E6A + +I=30 +KEY=000000040000000000000000000000000000000000000000 +CT=C4A31BBC3DAAF742F9141C2A5001A49C + +I=31 +KEY=000000020000000000000000000000000000000000000000 +CT=E7C47B7B1D40F182A8928C8A55671D07 + +I=32 +KEY=000000010000000000000000000000000000000000000000 +CT=8E17F294B28FA373C6249538868A7EEF + +I=33 +KEY=000000008000000000000000000000000000000000000000 +CT=754404096A5CBC08AF09491BE249141A + +I=34 +KEY=000000004000000000000000000000000000000000000000 +CT=101CB56E55F05D86369B6D1069204F0A + +I=35 +KEY=000000002000000000000000000000000000000000000000 +CT=73F19BB6604205C6EE227B9759791E41 + +I=36 +KEY=000000001000000000000000000000000000000000000000 +CT=6270C0028F0D136C37A56B2CB64D24D6 + +I=37 +KEY=000000000800000000000000000000000000000000000000 +CT=A3BF7C2C38D1114A087ECF212E694346 + +I=38 +KEY=000000000400000000000000000000000000000000000000 +CT=49CABFF2CEF7D9F95F5EFB1F7A1A7DDE + +I=39 +KEY=000000000200000000000000000000000000000000000000 +CT=EC7F8A47CC59B849469255AD49F62752 + +I=40 +KEY=000000000100000000000000000000000000000000000000 +CT=68FAE55A13EFAF9B07B3552A8A0DC9D1 + +I=41 +KEY=000000000080000000000000000000000000000000000000 +CT=211E6B19C69FAEF481F64F24099CDA65 + +I=42 +KEY=000000000040000000000000000000000000000000000000 +CT=DBB918C75BC5732416F79FB0C8EE4C5C + +I=43 +KEY=000000000020000000000000000000000000000000000000 +CT=98D494E5D963A6C8B92536D3EC35E3FD + +I=44 +KEY=000000000010000000000000000000000000000000000000 +CT=C9A873404D403D6F074190851D67781A + +I=45 +KEY=000000000008000000000000000000000000000000000000 +CT=073AEF4A7C77D921928CB0DD9D27CAE7 + +I=46 +KEY=000000000004000000000000000000000000000000000000 +CT=89BDE25CEE36FDE769A10E52298CF90F + +I=47 +KEY=000000000002000000000000000000000000000000000000 +CT=26D0842D37EAD38557C65E0A5E5F122E + +I=48 +KEY=000000000001000000000000000000000000000000000000 +CT=F8294BA375AF46B3F22905BBAFFAB107 + +I=49 +KEY=000000000000800000000000000000000000000000000000 +CT=2AD63EB4D0D43813B979CF72B35BDB94 + +I=50 +KEY=000000000000400000000000000000000000000000000000 +CT=7710C171EE0F4EFA39BE4C995180181D + +I=51 +KEY=000000000000200000000000000000000000000000000000 +CT=C0CB2B40DBA7BE8C0698FAE1E4B80FF8 + +I=52 +KEY=000000000000100000000000000000000000000000000000 +CT=97970E505194622FD955CA1B80B784E9 + +I=53 +KEY=000000000000080000000000000000000000000000000000 +CT=7CB1824B29F850900DF2CAD9CF04C1CF + +I=54 +KEY=000000000000040000000000000000000000000000000000 +CT=FDF4F036BB988E42F2F62DE63FE19A64 + +I=55 +KEY=000000000000020000000000000000000000000000000000 +CT=08908CFE2C82606B2C15DF61B75CF3E2 + +I=56 +KEY=000000000000010000000000000000000000000000000000 +CT=B3AA689EF2D07FF365ACB9ADBA2AF07A + +I=57 +KEY=000000000000008000000000000000000000000000000000 +CT=F2672CD8EAA3B98776660D0263656F5C + +I=58 +KEY=000000000000004000000000000000000000000000000000 +CT=5BDEAC00E986687B9E1D94A0DA7BF452 + +I=59 +KEY=000000000000002000000000000000000000000000000000 +CT=E6D57BD66EA1627363EE0C4B711B0B21 + +I=60 +KEY=000000000000001000000000000000000000000000000000 +CT=03730DD6ACB4AD9996A63BE7765EC06F + +I=61 +KEY=000000000000000800000000000000000000000000000000 +CT=A470E361AA5437B2BE8586D2F78DE582 + +I=62 +KEY=000000000000000400000000000000000000000000000000 +CT=7567FEEFA559911FD479670246B484E3 + +I=63 +KEY=000000000000000200000000000000000000000000000000 +CT=29829DEA15A4E7A4C049045E7B106E29 + +I=64 +KEY=000000000000000100000000000000000000000000000000 +CT=A407834C3D89D48A2CB7A152208FA4ED + +I=65 +KEY=000000000000000080000000000000000000000000000000 +CT=68F948053F78FEF0D8F9FE7EF3A89819 + +I=66 +KEY=000000000000000040000000000000000000000000000000 +CT=B605174CAB13AD8FE3B20DA3AE7B0234 + +I=67 +KEY=000000000000000020000000000000000000000000000000 +CT=CCAB8F0AEBFF032893996D383CBFDBFA + +I=68 +KEY=000000000000000010000000000000000000000000000000 +CT=AF14BB8428C9730B7DC17B6C1CBEBCC8 + +I=69 +KEY=000000000000000008000000000000000000000000000000 +CT=5A41A21332040877EB7B89E8E80D19FE + +I=70 +KEY=000000000000000004000000000000000000000000000000 +CT=AC1BA52EFCDDE368B1596F2F0AD893A0 + +I=71 +KEY=000000000000000002000000000000000000000000000000 +CT=41B890E31B9045E6ECDC1BC3F2DB9BCC + +I=72 +KEY=000000000000000001000000000000000000000000000000 +CT=4D54A549728E55B19A23660424A0F146 + +I=73 +KEY=000000000000000000800000000000000000000000000000 +CT=A917581F41C47C7DDCFFD5285E2D6A61 + +I=74 +KEY=000000000000000000400000000000000000000000000000 +CT=604DF24BA6099B93A7405A524D764FCB + +I=75 +KEY=000000000000000000200000000000000000000000000000 +CT=78D9D156F28B190E232D1B7AE7FC730A + +I=76 +KEY=000000000000000000100000000000000000000000000000 +CT=5A12C39E442CD7F27B3CD77F5D029582 + +I=77 +KEY=000000000000000000080000000000000000000000000000 +CT=FF2BF2F47CF7B0F28EE25AF95DBF790D + +I=78 +KEY=000000000000000000040000000000000000000000000000 +CT=1863BB7D193BDA39DF090659EB8AE48B + +I=79 +KEY=000000000000000000020000000000000000000000000000 +CT=38178F2FB4CFCF31E87E1ABCDC023EB5 + +I=80 +KEY=000000000000000000010000000000000000000000000000 +CT=F5B13DC690CC0D541C6BA533023DC8C9 + +I=81 +KEY=000000000000000000008000000000000000000000000000 +CT=48EC05238D7375D126DC9D08884D4827 + +I=82 +KEY=000000000000000000004000000000000000000000000000 +CT=ACD0D81139691B310B92A6E377BACC87 + +I=83 +KEY=000000000000000000002000000000000000000000000000 +CT=9A4AA43578B55CE9CC178F0D2E162C79 + +I=84 +KEY=000000000000000000001000000000000000000000000000 +CT=08AD94BC737DB3C87D49B9E01B720D81 + +I=85 +KEY=000000000000000000000800000000000000000000000000 +CT=3BCFB2D5D210E8332900C5991D551A2A + +I=86 +KEY=000000000000000000000400000000000000000000000000 +CT=C5F0C6B9397ACB29635CE1A0DA2D8D96 + +I=87 +KEY=000000000000000000000200000000000000000000000000 +CT=844A29EFC693E2FA9900F87FBF5DCD5F + +I=88 +KEY=000000000000000000000100000000000000000000000000 +CT=5126A1C41051FEA158BE41200E1EA59D + +I=89 +KEY=000000000000000000000080000000000000000000000000 +CT=302123CA7B4F46D667FFFB0EB6AA7703 + +I=90 +KEY=000000000000000000000040000000000000000000000000 +CT=A9D16BCE7DB5C024277709EE2A88D91A + +I=91 +KEY=000000000000000000000020000000000000000000000000 +CT=F013C5EC123A26CFC34B598C992A996B + +I=92 +KEY=000000000000000000000010000000000000000000000000 +CT=E38A825CD971A1D2E56FB1DBA248F2A8 + +I=93 +KEY=000000000000000000000008000000000000000000000000 +CT=6E701773C0311E0BD4C5A097406D22B3 + +I=94 +KEY=000000000000000000000004000000000000000000000000 +CT=754262CEF0C64BE4C3E67C35ABE439F7 + +I=95 +KEY=000000000000000000000002000000000000000000000000 +CT=C9C2D4C47DF7D55CFA0EE5F1FE5070F4 + +I=96 +KEY=000000000000000000000001000000000000000000000000 +CT=6AB4BEA85B172573D8BD2D5F4329F13D + +I=97 +KEY=000000000000000000000000800000000000000000000000 +CT=11F03EF28E2CC9AE5165C587F7396C8C + +I=98 +KEY=000000000000000000000000400000000000000000000000 +CT=0682F2EB1A68BAC7949922C630DD27FA + +I=99 +KEY=000000000000000000000000200000000000000000000000 +CT=ABB0FEC0413D659AFE8E3DCF6BA873BB + +I=100 +KEY=000000000000000000000000100000000000000000000000 +CT=FE86A32E19F805D6569B2EFADD9C92AA + +I=101 +KEY=000000000000000000000000080000000000000000000000 +CT=E434E472275D1837D3D717F2EECC88C3 + +I=102 +KEY=000000000000000000000000040000000000000000000000 +CT=74E57DCD12A21D26EF8ADAFA5E60469A + +I=103 +KEY=000000000000000000000000020000000000000000000000 +CT=C275429D6DAD45DDD423FA63C816A9C1 + +I=104 +KEY=000000000000000000000000010000000000000000000000 +CT=7F6EC1A9AE729E86F7744AED4B8F4F07 + +I=105 +KEY=000000000000000000000000008000000000000000000000 +CT=48B5A71AB9292BD4F9E608EF102636B2 + +I=106 +KEY=000000000000000000000000004000000000000000000000 +CT=076FB95D5F536C78CBED3181BCCF3CF1 + +I=107 +KEY=000000000000000000000000002000000000000000000000 +CT=BFA76BEA1E684FD3BF9256119EE0BC0F + +I=108 +KEY=000000000000000000000000001000000000000000000000 +CT=7D395923D56577F3FF8670998F8C4A71 + +I=109 +KEY=000000000000000000000000000800000000000000000000 +CT=BA02C986E529AC18A882C34BA389625F + +I=110 +KEY=000000000000000000000000000400000000000000000000 +CT=3DFCF2D882AFE75D3A191193013A84B5 + +I=111 +KEY=000000000000000000000000000200000000000000000000 +CT=FAD1FDE1D0241784B63080D2C74D236C + +I=112 +KEY=000000000000000000000000000100000000000000000000 +CT=7D6C80D39E41F007A14FB9CD2B2C15CD + +I=113 +KEY=000000000000000000000000000080000000000000000000 +CT=7975F401FC10637BB33EA2DB058FF6EC + +I=114 +KEY=000000000000000000000000000040000000000000000000 +CT=657983865C55A818F02B7FCD52ED7E99 + +I=115 +KEY=000000000000000000000000000020000000000000000000 +CT=B32BEB1776F9827FF4C3AC9997E84B20 + +I=116 +KEY=000000000000000000000000000010000000000000000000 +CT=2AE2C7C374F0A41E3D46DBC3E66BB59F + +I=117 +KEY=000000000000000000000000000008000000000000000000 +CT=4D835E4ABDD4BDC6B88316A6E931A07F + +I=118 +KEY=000000000000000000000000000004000000000000000000 +CT=E07EFABFF1C353F7384EBB87B435A3F3 + +I=119 +KEY=000000000000000000000000000002000000000000000000 +CT=ED3088DC3FAF89AD87B4356FF1BB09C2 + +I=120 +KEY=000000000000000000000000000001000000000000000000 +CT=4324D01140C156FC898C2E32BA03FB05 + +I=121 +KEY=000000000000000000000000000000800000000000000000 +CT=BE15D016FACB5BAFBC24FA9289132166 + +I=122 +KEY=000000000000000000000000000000400000000000000000 +CT=AC9B7048EDB1ACF4D97A5B0B3F50884B + +I=123 +KEY=000000000000000000000000000000200000000000000000 +CT=448BECE1F86C7845DFA9A4BB2A016FB3 + +I=124 +KEY=000000000000000000000000000000100000000000000000 +CT=10DD445E87686EB46EA9B1ABC49257F0 + +I=125 +KEY=000000000000000000000000000000080000000000000000 +CT=B7FCCF7659FA756D4B7303EEA6C07458 + +I=126 +KEY=000000000000000000000000000000040000000000000000 +CT=289117115CA3513BAA7640B1004872C2 + +I=127 +KEY=000000000000000000000000000000020000000000000000 +CT=57CB42F7EE7186051F50B93FFA7B35BF + +I=128 +KEY=000000000000000000000000000000010000000000000000 +CT=F2741BFBFB81663B9136802FB9C3126A + +I=129 +KEY=000000000000000000000000000000008000000000000000 +CT=E32DDDC5C7398C096E3BD535B31DB5CE + +I=130 +KEY=000000000000000000000000000000004000000000000000 +CT=81D3C204E608AF9CC713EAEBCB72433F + +I=131 +KEY=000000000000000000000000000000002000000000000000 +CT=D4DEEF4BFC36AAA579496E6935F8F98E + +I=132 +KEY=000000000000000000000000000000001000000000000000 +CT=C356DB082B97802B038571C392C5C8F6 + +I=133 +KEY=000000000000000000000000000000000800000000000000 +CT=A3919ECD4861845F2527B77F06AC6A4E + +I=134 +KEY=000000000000000000000000000000000400000000000000 +CT=A53858E17A2F802A20E40D44494FFDA0 + +I=135 +KEY=000000000000000000000000000000000200000000000000 +CT=5D989E122B78C758921EDBEEB827F0C0 + +I=136 +KEY=000000000000000000000000000000000100000000000000 +CT=4B1C0C8F9E7830CC3C4BE7BD226FA8DE + +I=137 +KEY=000000000000000000000000000000000080000000000000 +CT=82C40C5FD897FBCA7B899C70713573A1 + +I=138 +KEY=000000000000000000000000000000000040000000000000 +CT=ED13EE2D45E00F75CCDB51EA8E3E36AD + +I=139 +KEY=000000000000000000000000000000000020000000000000 +CT=F121799EEFE8432423176A3CCF6462BB + +I=140 +KEY=000000000000000000000000000000000010000000000000 +CT=4FA0C06F07997E98271DD86F7B355C50 + +I=141 +KEY=000000000000000000000000000000000008000000000000 +CT=849EB364B4E81D058649DC5B1BF029B9 + +I=142 +KEY=000000000000000000000000000000000004000000000000 +CT=F48F9E0DE8DE7AD944A207809335D9B1 + +I=143 +KEY=000000000000000000000000000000000002000000000000 +CT=E59E9205B5A81A4FD26DFCF308966022 + +I=144 +KEY=000000000000000000000000000000000001000000000000 +CT=3A91A1BE14AAE9ED700BDF9D70018804 + +I=145 +KEY=000000000000000000000000000000000000800000000000 +CT=8ABAD78DCB79A48D79070E7DA89664EC + +I=146 +KEY=000000000000000000000000000000000000400000000000 +CT=B68377D98AAE6044938A7457F6C649D9 + +I=147 +KEY=000000000000000000000000000000000000200000000000 +CT=E4E1275C42F5F1B63D662C099D6CE33D + +I=148 +KEY=000000000000000000000000000000000000100000000000 +CT=7DEF32A34C6BE668F17DA1BB193B06EF + +I=149 +KEY=000000000000000000000000000000000000080000000000 +CT=78B6000CC3D30CB3A74B68D0EDBD2B53 + +I=150 +KEY=000000000000000000000000000000000000040000000000 +CT=0A47531DE88DD8AE5C23EAE4F7D1F2D5 + +I=151 +KEY=000000000000000000000000000000000000020000000000 +CT=667B24E8000CF68231EC484581D922E5 + +I=152 +KEY=000000000000000000000000000000000000010000000000 +CT=39DAA5EBD4AACAE130E9C33236C52024 + +I=153 +KEY=000000000000000000000000000000000000008000000000 +CT=E3C88760B3CB21360668A63E55BB45D1 + +I=154 +KEY=000000000000000000000000000000000000004000000000 +CT=F131EE903C1CDB49D416866FD5D8DE51 + +I=155 +KEY=000000000000000000000000000000000000002000000000 +CT=7A1916135B0447CF4033FC13047A583A + +I=156 +KEY=000000000000000000000000000000000000001000000000 +CT=F7D55FB27991143DCDFA90DDF0424FCB + +I=157 +KEY=000000000000000000000000000000000000000800000000 +CT=EA93E7D1CA1111DBD8F7EC111A848C0C + +I=158 +KEY=000000000000000000000000000000000000000400000000 +CT=2A689E39DFD3CBCBE221326E95888779 + +I=159 +KEY=000000000000000000000000000000000000000200000000 +CT=C1CE399CA762318AC2C40D1928B4C57D + +I=160 +KEY=000000000000000000000000000000000000000100000000 +CT=D43FB6F2B2879C8BFAF0092DA2CA63ED + +I=161 +KEY=000000000000000000000000000000000000000080000000 +CT=224563E617158DF97650AF5D130E78A5 + +I=162 +KEY=000000000000000000000000000000000000000040000000 +CT=6562FDF6833B7C4F7484AE6EBCC243DD + +I=163 +KEY=000000000000000000000000000000000000000020000000 +CT=93D58BA7BED22615D661D002885A7457 + +I=164 +KEY=000000000000000000000000000000000000000010000000 +CT=9A0EF559003AD9E52D3E09ED3C1D3320 + +I=165 +KEY=000000000000000000000000000000000000000008000000 +CT=96BAF5A7DC6F3DD27EB4C717A85D261C + +I=166 +KEY=000000000000000000000000000000000000000004000000 +CT=B8762E06884900E8452293190E19CCDB + +I=167 +KEY=000000000000000000000000000000000000000002000000 +CT=785416A22BD63CBABF4B1789355197D3 + +I=168 +KEY=000000000000000000000000000000000000000001000000 +CT=A0D20CE1489BAA69A3612DCE90F7ABF6 + +I=169 +KEY=000000000000000000000000000000000000000000800000 +CT=700244E93DC94230CC607FFBA0E48F32 + +I=170 +KEY=000000000000000000000000000000000000000000400000 +CT=85329E476829F872A2B4A7E59F91FF2D + +I=171 +KEY=000000000000000000000000000000000000000000200000 +CT=E4219B4935D988DB719B8B8B2B53D247 + +I=172 +KEY=000000000000000000000000000000000000000000100000 +CT=6ACDD04FD13D4DB4409FE8DD13FD737B + +I=173 +KEY=000000000000000000000000000000000000000000080000 +CT=9EB7A670AB59E15BE582378701C1EC14 + +I=174 +KEY=000000000000000000000000000000000000000000040000 +CT=29DF2D6935FE657763BC7A9F22D3D492 + +I=175 +KEY=000000000000000000000000000000000000000000020000 +CT=99303359D4A13AFDBE6C784028CE533A + +I=176 +KEY=000000000000000000000000000000000000000000010000 +CT=FF5C70A6334545F33B9DBF7BEA0417CA + +I=177 +KEY=000000000000000000000000000000000000000000008000 +CT=289F58A17E4C50EDA4269EFB3DF55815 + +I=178 +KEY=000000000000000000000000000000000000000000004000 +CT=EA35DCB416E9E1C2861D1682F062B5EB + +I=179 +KEY=000000000000000000000000000000000000000000002000 +CT=3A47BF354BE775383C50B0C0A83E3A58 + +I=180 +KEY=000000000000000000000000000000000000000000001000 +CT=BF6C1DC069FB95D05D43B01D8206D66B + +I=181 +KEY=000000000000000000000000000000000000000000000800 +CT=046D1D580D5898DA6595F32FD1F0C33D + +I=182 +KEY=000000000000000000000000000000000000000000000400 +CT=5F57803B7B82A110F7E9855D6A546082 + +I=183 +KEY=000000000000000000000000000000000000000000000200 +CT=25336ECF34E7BE97862CDFF715FF05A8 + +I=184 +KEY=000000000000000000000000000000000000000000000100 +CT=ACBAA2A943D8078022D693890E8C4FEF + +I=185 +KEY=000000000000000000000000000000000000000000000080 +CT=3947597879F6B58E4E2F0DF825A83A38 + +I=186 +KEY=000000000000000000000000000000000000000000000040 +CT=4EB8CC3335496130655BF3CA570A4FC0 + +I=187 +KEY=000000000000000000000000000000000000000000000020 +CT=BBDA7769AD1FDA425E18332D97868824 + +I=188 +KEY=000000000000000000000000000000000000000000000010 +CT=5E7532D22DDB0829A29C868198397154 + +I=189 +KEY=000000000000000000000000000000000000000000000008 +CT=E66DA67B630AB7AE3E682855E1A1698E + +I=190 +KEY=000000000000000000000000000000000000000000000004 +CT=4D93800F671B48559A64D1EA030A590A + +I=191 +KEY=000000000000000000000000000000000000000000000002 +CT=F33159FCC7D9AE30C062CD3B322AC764 + +I=192 +KEY=000000000000000000000000000000000000000000000001 +CT=8BAE4EFB70D33A9792EEA9BE70889D72 + +========== + +KEYSIZE=256 + +PT=00000000000000000000000000000000 + +I=1 +KEY=8000000000000000000000000000000000000000000000000000000000000000 +CT=E35A6DCB19B201A01EBCFA8AA22B5759 + +I=2 +KEY=4000000000000000000000000000000000000000000000000000000000000000 +CT=5075C2405B76F22F553488CAE47CE90B + +I=3 +KEY=2000000000000000000000000000000000000000000000000000000000000000 +CT=49DF95D844A0145A7DE01C91793302D3 + +I=4 +KEY=1000000000000000000000000000000000000000000000000000000000000000 +CT=E7396D778E940B8418A86120E5F421FE + +I=5 +KEY=0800000000000000000000000000000000000000000000000000000000000000 +CT=05F535C36FCEDE4657BE37F4087DB1EF + +I=6 +KEY=0400000000000000000000000000000000000000000000000000000000000000 +CT=D0C1DDDD10DA777C68AB36AF51F2C204 + +I=7 +KEY=0200000000000000000000000000000000000000000000000000000000000000 +CT=1C55FB811B5C6464C4E5DE1535A75514 + +I=8 +KEY=0100000000000000000000000000000000000000000000000000000000000000 +CT=52917F3AE957D5230D3A2AF57C7B5A71 + +I=9 +KEY=0080000000000000000000000000000000000000000000000000000000000000 +CT=C6E3D5501752DD5E9AEF086D6B45D705 + +I=10 +KEY=0040000000000000000000000000000000000000000000000000000000000000 +CT=A24A9C7AF1D9B1E17E1C9A3E711B3FA7 + +I=11 +KEY=0020000000000000000000000000000000000000000000000000000000000000 +CT=B881ECA724A6D43DBC6B96F6F59A0D20 + +I=12 +KEY=0010000000000000000000000000000000000000000000000000000000000000 +CT=EC524D9A24DFFF2A9639879B83B8E137 + +I=13 +KEY=0008000000000000000000000000000000000000000000000000000000000000 +CT=34C4F345F5466215A037F443635D6F75 + +I=14 +KEY=0004000000000000000000000000000000000000000000000000000000000000 +CT=5BA5055BEDB8895F672E29F2EB5A355D + +I=15 +KEY=0002000000000000000000000000000000000000000000000000000000000000 +CT=B3F692AA3A435259EBBEF9B51AD1E08D + +I=16 +KEY=0001000000000000000000000000000000000000000000000000000000000000 +CT=414FEB4376F2C64A5D2FBB2ED531BA7D + +I=17 +KEY=0000800000000000000000000000000000000000000000000000000000000000 +CT=A20D519E3BCA3303F07E81719F61605E + +I=18 +KEY=0000400000000000000000000000000000000000000000000000000000000000 +CT=A08D10E520AF811F45BD60A2DC0DC4B1 + +I=19 +KEY=0000200000000000000000000000000000000000000000000000000000000000 +CT=B06893A8C563C430E6F3858826EFBBE4 + +I=20 +KEY=0000100000000000000000000000000000000000000000000000000000000000 +CT=0FFEE26AE2D3929C6BD9C6BEDFF84409 + +I=21 +KEY=0000080000000000000000000000000000000000000000000000000000000000 +CT=4D0F5E906ED77801FC0EF53EDC5F9E2B + +I=22 +KEY=0000040000000000000000000000000000000000000000000000000000000000 +CT=8B6EC00119AD8B026DCE56EA7DEFE930 + +I=23 +KEY=0000020000000000000000000000000000000000000000000000000000000000 +CT=69026591D43363EE9D83B5007F0B484E + +I=24 +KEY=0000010000000000000000000000000000000000000000000000000000000000 +CT=27135D86950C6A2F86872706279A4761 + +I=25 +KEY=0000008000000000000000000000000000000000000000000000000000000000 +CT=35E6DB8723F281DA410C3AC8535ED77C + +I=26 +KEY=0000004000000000000000000000000000000000000000000000000000000000 +CT=57427CF214B8C28E4BBF487CCB8D0E09 + +I=27 +KEY=0000002000000000000000000000000000000000000000000000000000000000 +CT=6DF01BF56E5131AC87F96E99CAB86367 + +I=28 +KEY=0000001000000000000000000000000000000000000000000000000000000000 +CT=3856C5B55790B768BBF7D43031579BCF + +I=29 +KEY=0000000800000000000000000000000000000000000000000000000000000000 +CT=1E6ED8FB7C15BC4D2F63BA7037ED44D0 + +I=30 +KEY=0000000400000000000000000000000000000000000000000000000000000000 +CT=E1B2ED6CD8D93D455534E401156D4BCF + +I=31 +KEY=0000000200000000000000000000000000000000000000000000000000000000 +CT=EFBCCA5BDFDAD10E875F02336212CE36 + +I=32 +KEY=0000000100000000000000000000000000000000000000000000000000000000 +CT=0B777F02FD18DCE2646DCFE868DFAFAD + +I=33 +KEY=0000000080000000000000000000000000000000000000000000000000000000 +CT=C8A104B5693D1B14F5BF1F10100BF508 + +I=34 +KEY=0000000040000000000000000000000000000000000000000000000000000000 +CT=4CCE6615244AFCB38408FECE219962EA + +I=35 +KEY=0000000020000000000000000000000000000000000000000000000000000000 +CT=F99E7845D3A255B394C9C050CBA258B1 + +I=36 +KEY=0000000010000000000000000000000000000000000000000000000000000000 +CT=B4AFBB787F9BCFB7B55FDF447F611295 + +I=37 +KEY=0000000008000000000000000000000000000000000000000000000000000000 +CT=AE1C426A697FAF2808B7EF6ADDB5C020 + +I=38 +KEY=0000000004000000000000000000000000000000000000000000000000000000 +CT=7572F92811A85B9BDD38DEAD9945BCAE + +I=39 +KEY=0000000002000000000000000000000000000000000000000000000000000000 +CT=71BC7AA46E43FB95A181527D9F6A360F + +I=40 +KEY=0000000001000000000000000000000000000000000000000000000000000000 +CT=5542EF2923066F1EC8F546DD0D8E7CA8 + +I=41 +KEY=0000000000800000000000000000000000000000000000000000000000000000 +CT=6B92317C7D623790B748FDD7EFC42422 + +I=42 +KEY=0000000000400000000000000000000000000000000000000000000000000000 +CT=0FE7C097E899C71EF045360F8D6C25CF + +I=43 +KEY=0000000000200000000000000000000000000000000000000000000000000000 +CT=4ECE7EE107D0264D04693151C25B9DF6 + +I=44 +KEY=0000000000100000000000000000000000000000000000000000000000000000 +CT=FD6AE687CBFCA9E301045888D3BB9605 + +I=45 +KEY=0000000000080000000000000000000000000000000000000000000000000000 +CT=476B579C8556C7254424902CC1D6D36E + +I=46 +KEY=0000000000040000000000000000000000000000000000000000000000000000 +CT=4133CBCDFDD6B8860A1FC18665D6D71B + +I=47 +KEY=0000000000020000000000000000000000000000000000000000000000000000 +CT=3B36EC2664798C108B816812C65DFDC7 + +I=48 +KEY=0000000000010000000000000000000000000000000000000000000000000000 +CT=364E20A234FEA385D48DC5A09C9E70CF + +I=49 +KEY=0000000000008000000000000000000000000000000000000000000000000000 +CT=4A4BA25969DE3F5EE5642C71AAD0EFD1 + +I=50 +KEY=0000000000004000000000000000000000000000000000000000000000000000 +CT=E42CBAAE43297F67A76C1C501BB79E36 + +I=51 +KEY=0000000000002000000000000000000000000000000000000000000000000000 +CT=23CEDEDA4C15B4C037E8C61492217937 + +I=52 +KEY=0000000000001000000000000000000000000000000000000000000000000000 +CT=A1719147A1F4A1A1180BD16E8593DCDE + +I=53 +KEY=0000000000000800000000000000000000000000000000000000000000000000 +CT=AB82337E9FB0EC60D1F25A1D0014192C + +I=54 +KEY=0000000000000400000000000000000000000000000000000000000000000000 +CT=74BF2D8FC5A8388DF1A3A4D7D33FC164 + +I=55 +KEY=0000000000000200000000000000000000000000000000000000000000000000 +CT=D5B493317E6FBC6FFFD664B3C491368A + +I=56 +KEY=0000000000000100000000000000000000000000000000000000000000000000 +CT=BA767381586DA56A2A8D503D5F7ADA0B + +I=57 +KEY=0000000000000080000000000000000000000000000000000000000000000000 +CT=E8E6BC57DFE9CCADB0DECABF4E5CF91F + +I=58 +KEY=0000000000000040000000000000000000000000000000000000000000000000 +CT=3C8E5A5CDC9CEED90815D1F84BB2998C + +I=59 +KEY=0000000000000020000000000000000000000000000000000000000000000000 +CT=283843020BA38F056001B2FD585F7CC9 + +I=60 +KEY=0000000000000010000000000000000000000000000000000000000000000000 +CT=D8ADC7426F623ECE8741A70621D28870 + +I=61 +KEY=0000000000000008000000000000000000000000000000000000000000000000 +CT=D7C5C215592D06F00E6A80DA69A28EA9 + +I=62 +KEY=0000000000000004000000000000000000000000000000000000000000000000 +CT=52CF6FA433C3C870CAC70190358F7F16 + +I=63 +KEY=0000000000000002000000000000000000000000000000000000000000000000 +CT=F63D442A584DA71786ADEC9F3346DF75 + +I=64 +KEY=0000000000000001000000000000000000000000000000000000000000000000 +CT=549078F4B0CA7079B45F9A5ADAFAFD99 + +I=65 +KEY=0000000000000000800000000000000000000000000000000000000000000000 +CT=F2A5986EE4E9984BE2BAFB79EA8152FA + +I=66 +KEY=0000000000000000400000000000000000000000000000000000000000000000 +CT=8A74535017B4DB2776668A1FAE64384C + +I=67 +KEY=0000000000000000200000000000000000000000000000000000000000000000 +CT=E613342F57A97FD95DC088711A5D0ECD + +I=68 +KEY=0000000000000000100000000000000000000000000000000000000000000000 +CT=3FFAEBF6B22CF1DC82AE17CD48175B01 + +I=69 +KEY=0000000000000000080000000000000000000000000000000000000000000000 +CT=BAFD52EFA15C248CCBF9757735E6B1CE + +I=70 +KEY=0000000000000000040000000000000000000000000000000000000000000000 +CT=7AF94BC018D9DDD4539D2DD1C6F4000F + +I=71 +KEY=0000000000000000020000000000000000000000000000000000000000000000 +CT=FE177AD61CA0FDB281086FBA8FE76803 + +I=72 +KEY=0000000000000000010000000000000000000000000000000000000000000000 +CT=74DBEA15E2E9285BAD163D7D534251B6 + +I=73 +KEY=0000000000000000008000000000000000000000000000000000000000000000 +CT=23DD21331B3A92F200FE56FF050FFE74 + +I=74 +KEY=0000000000000000004000000000000000000000000000000000000000000000 +CT=A69C5AA34AB20A858CAFA766EACED6D8 + +I=75 +KEY=0000000000000000002000000000000000000000000000000000000000000000 +CT=3F72BB4DF2A4F941A4A09CB78F04B97A + +I=76 +KEY=0000000000000000001000000000000000000000000000000000000000000000 +CT=72CC43577E1FD5FD14622D24D97FCDCC + +I=77 +KEY=0000000000000000000800000000000000000000000000000000000000000000 +CT=D83AF8EBE93E0B6B99CAFADE224937D1 + +I=78 +KEY=0000000000000000000400000000000000000000000000000000000000000000 +CT=44042329128D56CAA8D084C8BD769D1E + +I=79 +KEY=0000000000000000000200000000000000000000000000000000000000000000 +CT=14102D72290DE4F2C430ADD1ED64BA1D + +I=80 +KEY=0000000000000000000100000000000000000000000000000000000000000000 +CT=449124097B1ECD0AE7065206DF06F03C + +I=81 +KEY=0000000000000000000080000000000000000000000000000000000000000000 +CT=D060A99F8CC153A42E11E5F97BD7584A + +I=82 +KEY=0000000000000000000040000000000000000000000000000000000000000000 +CT=65605B3EA9261488D53E48602ADEA299 + +I=83 +KEY=0000000000000000000020000000000000000000000000000000000000000000 +CT=C5E5CAD7A208DE8EA6BE049EFE5C7346 + +I=84 +KEY=0000000000000000000010000000000000000000000000000000000000000000 +CT=4C280C46D2181646048DD5BC0C0831A5 + +I=85 +KEY=0000000000000000000008000000000000000000000000000000000000000000 +CT=5DD65CF37F2A0929559AABAFDA08E730 + +I=86 +KEY=0000000000000000000004000000000000000000000000000000000000000000 +CT=31F2335CAAF264172F69A693225E6D22 + +I=87 +KEY=0000000000000000000002000000000000000000000000000000000000000000 +CT=3E28B35F99A72662590DA96426DD377F + +I=88 +KEY=0000000000000000000001000000000000000000000000000000000000000000 +CT=570F40F5D7B20441486578ED344343BE + +I=89 +KEY=0000000000000000000000800000000000000000000000000000000000000000 +CT=C54308AD1C9E3B19F8B7417873045A8C + +I=90 +KEY=0000000000000000000000400000000000000000000000000000000000000000 +CT=CBF335E39CE13ADE2B696179E8FD0CE1 + +I=91 +KEY=0000000000000000000000200000000000000000000000000000000000000000 +CT=9C2FBF422355D8293083D51F4A3C18A9 + +I=92 +KEY=0000000000000000000000100000000000000000000000000000000000000000 +CT=5ED8B5A31ECEFAB16C9AA6986DA67BCE + +I=93 +KEY=0000000000000000000000080000000000000000000000000000000000000000 +CT=627815DCFC814ABC75900041B1DD7B59 + +I=94 +KEY=0000000000000000000000040000000000000000000000000000000000000000 +CT=9EF3E82A50A59F166260494F7A7F2CC3 + +I=95 +KEY=0000000000000000000000020000000000000000000000000000000000000000 +CT=878CD0D8D920888B5935D6C351128737 + +I=96 +KEY=0000000000000000000000010000000000000000000000000000000000000000 +CT=E44429474D6FC3084EB2A6B8B46AF754 + +I=97 +KEY=0000000000000000000000008000000000000000000000000000000000000000 +CT=EBAACF9641D54E1FB18D0A2BE4F19BE5 + +I=98 +KEY=0000000000000000000000004000000000000000000000000000000000000000 +CT=13B3BF497CEE780E123C7E193DEA3A01 + +I=99 +KEY=0000000000000000000000002000000000000000000000000000000000000000 +CT=6E8F381DE00A41161F0DF03B4155BFD4 + +I=100 +KEY=0000000000000000000000001000000000000000000000000000000000000000 +CT=35E4F29BBA2BAE01144910783C3FEF49 + +I=101 +KEY=0000000000000000000000000800000000000000000000000000000000000000 +CT=55B17BD66788CEAC366398A31F289FFB + +I=102 +KEY=0000000000000000000000000400000000000000000000000000000000000000 +CT=11341F56C0D6D1008D28741DAA7679CE + +I=103 +KEY=0000000000000000000000000200000000000000000000000000000000000000 +CT=4DF7253DF421D83358BDBE924745D98C + +I=104 +KEY=0000000000000000000000000100000000000000000000000000000000000000 +CT=BAE2EE651116D93EDC8E83B5F3347BE1 + +I=105 +KEY=0000000000000000000000000080000000000000000000000000000000000000 +CT=F9721ABD06709157183AF3965A659D9D + +I=106 +KEY=0000000000000000000000000040000000000000000000000000000000000000 +CT=19A1C252A613FE2860A4AE6D75CE6FA3 + +I=107 +KEY=0000000000000000000000000020000000000000000000000000000000000000 +CT=B5DDB2F5D9752C949FBDE3FFF5556C6E + +I=108 +KEY=0000000000000000000000000010000000000000000000000000000000000000 +CT=81B044FCFFC78ECCFCD171AAD0405C66 + +I=109 +KEY=0000000000000000000000000008000000000000000000000000000000000000 +CT=C640566D3C06020EB2C42F1D62E56A9B + +I=110 +KEY=0000000000000000000000000004000000000000000000000000000000000000 +CT=EA6C4BCF425291679FDFFD26A424FBCC + +I=111 +KEY=0000000000000000000000000002000000000000000000000000000000000000 +CT=57F6901465D9440D9F15EE2CBA5A4090 + +I=112 +KEY=0000000000000000000000000001000000000000000000000000000000000000 +CT=FBCFA74CADC7406260F63D96C8AAB6B1 + +I=113 +KEY=0000000000000000000000000000800000000000000000000000000000000000 +CT=DFF4F096CEA211D4BBDACA033D0EC7D1 + +I=114 +KEY=0000000000000000000000000000400000000000000000000000000000000000 +CT=1EE5190D551F0F42F675227A381296A9 + +I=115 +KEY=0000000000000000000000000000200000000000000000000000000000000000 +CT=F98E1905012E580F097623C10B93054F + +I=116 +KEY=0000000000000000000000000000100000000000000000000000000000000000 +CT=E7D43743D21DD3C9F168C86856558B9A + +I=117 +KEY=0000000000000000000000000000080000000000000000000000000000000000 +CT=632A9DDA730DAB67593C5D08D8AC1059 + +I=118 +KEY=0000000000000000000000000000040000000000000000000000000000000000 +CT=E084317000715B9057BC9DE9F3AB6124 + +I=119 +KEY=0000000000000000000000000000020000000000000000000000000000000000 +CT=61F9EF33A0BB4E666C2ED99101919FAB + +I=120 +KEY=0000000000000000000000000000010000000000000000000000000000000000 +CT=6DC1D68A11834657D46703C22578D59A + +I=121 +KEY=0000000000000000000000000000008000000000000000000000000000000000 +CT=53AC1548863D3D16F1D4DC7242E05F2C + +I=122 +KEY=0000000000000000000000000000004000000000000000000000000000000000 +CT=E82CD587A408306AD78CEAE0916B9F8C + +I=123 +KEY=0000000000000000000000000000002000000000000000000000000000000000 +CT=0FD2D40EA6AD17A3A767F0A8600D6295 + +I=124 +KEY=0000000000000000000000000000001000000000000000000000000000000000 +CT=AD84CC8255ADB39DFCA23F92761AE7E9 + +I=125 +KEY=0000000000000000000000000000000800000000000000000000000000000000 +CT=F4F20CF7D51BEE7DA024A2B11A7ECA0B + +I=126 +KEY=0000000000000000000000000000000400000000000000000000000000000000 +CT=5057691B85D9CE93A193214DB0A016B6 + +I=127 +KEY=0000000000000000000000000000000200000000000000000000000000000000 +CT=0F58C960876390BDEF4BB6BE95CAA1EE + +I=128 +KEY=0000000000000000000000000000000100000000000000000000000000000000 +CT=9A3E66EEBC21BC0BD9430B341EF465FA + +I=129 +KEY=0000000000000000000000000000000080000000000000000000000000000000 +CT=20415035F34B8BCBCB28ABF07F78F0D4 + +I=130 +KEY=0000000000000000000000000000000040000000000000000000000000000000 +CT=AC89FC7BA10479EBF10DE65BCEF89B3C + +I=131 +KEY=0000000000000000000000000000000020000000000000000000000000000000 +CT=068FA75A30BE443171AF3F6FEB1A20D2 + +I=132 +KEY=0000000000000000000000000000000010000000000000000000000000000000 +CT=50E02F213246C525A8C27700CA34B502 + +I=133 +KEY=0000000000000000000000000000000008000000000000000000000000000000 +CT=227DA47D5A0906DB3AB042BB0A695FB6 + +I=134 +KEY=0000000000000000000000000000000004000000000000000000000000000000 +CT=8663AC30ED12514F1DE46777F4514BFC + +I=135 +KEY=0000000000000000000000000000000002000000000000000000000000000000 +CT=A987D4BC12E1DE9F4B6DF43567C34A8B + +I=136 +KEY=0000000000000000000000000000000001000000000000000000000000000000 +CT=6D5A0370F599ACA605F63B04E5143D0C + +I=137 +KEY=0000000000000000000000000000000000800000000000000000000000000000 +CT=9809266E378B07B7AFDB3BAA97B7E442 + +I=138 +KEY=0000000000000000000000000000000000400000000000000000000000000000 +CT=8F753252B30CCCACE12D9A301F4D5090 + +I=139 +KEY=0000000000000000000000000000000000200000000000000000000000000000 +CT=032465F6C0CE34D41962F561692A1AFF + +I=140 +KEY=0000000000000000000000000000000000100000000000000000000000000000 +CT=C50E9AD5BEB8F3B00821DD47FF8AC093 + +I=141 +KEY=0000000000000000000000000000000000080000000000000000000000000000 +CT=9C6FEA3D46268D54A6829B2AD25BB276 + +I=142 +KEY=0000000000000000000000000000000000040000000000000000000000000000 +CT=0FD8575E87706F561343D7B3A41E044A + +I=143 +KEY=0000000000000000000000000000000000020000000000000000000000000000 +CT=BEE9BEB3739540D88CBCE77925F0A114 + +I=144 +KEY=0000000000000000000000000000000000010000000000000000000000000000 +CT=D24EAEE7FFFBAC3D6F26C2DCE0DCDE28 + +I=145 +KEY=0000000000000000000000000000000000008000000000000000000000000000 +CT=47771A90398FF0F7FA821C2F8F5E1398 + +I=146 +KEY=0000000000000000000000000000000000004000000000000000000000000000 +CT=4639741B6F84B135AD118C8249B64ED0 + +I=147 +KEY=0000000000000000000000000000000000002000000000000000000000000000 +CT=8EE5505EC85567697A3306F250A27720 + +I=148 +KEY=0000000000000000000000000000000000001000000000000000000000000000 +CT=7C8A19AC1AEFBC5E0119D91A5F05D4C2 + +I=149 +KEY=0000000000000000000000000000000000000800000000000000000000000000 +CT=5141B9B672E54773B672E3A6C424887B + +I=150 +KEY=0000000000000000000000000000000000000400000000000000000000000000 +CT=B5A2D3CD206653C6402F34FB0AE3613D + +I=151 +KEY=0000000000000000000000000000000000000200000000000000000000000000 +CT=0F5BD9408738231D114B0A82753279A3 + +I=152 +KEY=0000000000000000000000000000000000000100000000000000000000000000 +CT=FEF033FF4268EA487FC74C5E43A45338 + +I=153 +KEY=0000000000000000000000000000000000000080000000000000000000000000 +CT=A3EDC09DCD529B113910D904AD855581 + +I=154 +KEY=0000000000000000000000000000000000000040000000000000000000000000 +CT=AB8FBB6F27A0AC7C55B59FDD36B72F1C + +I=155 +KEY=0000000000000000000000000000000000000020000000000000000000000000 +CT=EEA44D5ED4D769CC930CD83D8999EC46 + +I=156 +KEY=0000000000000000000000000000000000000010000000000000000000000000 +CT=6972276803AE9AA7C6F431AB10979C34 + +I=157 +KEY=0000000000000000000000000000000000000008000000000000000000000000 +CT=86DEAA9F39244101818178474D7DBDE9 + +I=158 +KEY=0000000000000000000000000000000000000004000000000000000000000000 +CT=88C6B466EA361D662D8D08CBF181F4FE + +I=159 +KEY=0000000000000000000000000000000000000002000000000000000000000000 +CT=91AB2C6B7C63FF59F7CBEEBF91B20B95 + +I=160 +KEY=0000000000000000000000000000000000000001000000000000000000000000 +CT=2DFE6C146AD5B3D8C3C1718F13B48E01 + +I=161 +KEY=0000000000000000000000000000000000000000800000000000000000000000 +CT=C7CFF1623451711391A302EEC3584AAA + +I=162 +KEY=0000000000000000000000000000000000000000400000000000000000000000 +CT=089FE845CC05011686C66019D18BE050 + +I=163 +KEY=0000000000000000000000000000000000000000200000000000000000000000 +CT=08C8410B9B427211A67124B0DCCEAD48 + +I=164 +KEY=0000000000000000000000000000000000000000100000000000000000000000 +CT=8D91592F5566085254784606334D7629 + +I=165 +KEY=0000000000000000000000000000000000000000080000000000000000000000 +CT=3298FEAAF2E1201D6299FF8846639C97 + +I=166 +KEY=0000000000000000000000000000000000000000040000000000000000000000 +CT=C497CB9F0BDFE0EFC8C2F3F90760AA72 + +I=167 +KEY=0000000000000000000000000000000000000000020000000000000000000000 +CT=2788AFD046E0309CBE4424690DA2AB89 + +I=168 +KEY=0000000000000000000000000000000000000000010000000000000000000000 +CT=E9891707F25EF29FEE372890D4258982 + +I=169 +KEY=0000000000000000000000000000000000000000008000000000000000000000 +CT=DB041D94A23D45D4D4DCED5A030CAF61 + +I=170 +KEY=0000000000000000000000000000000000000000004000000000000000000000 +CT=FFAFDBF0ECB18DF9EA02C27077448E6D + +I=171 +KEY=0000000000000000000000000000000000000000002000000000000000000000 +CT=2DAAA42A7D0A1D3B0E4761D99CF2150A + +I=172 +KEY=0000000000000000000000000000000000000000001000000000000000000000 +CT=3B7A54CB7CF30ABE263DD6ED5BFE8D63 + +I=173 +KEY=0000000000000000000000000000000000000000000800000000000000000000 +CT=EEFA090174C590C448A55D43648F534A + +I=174 +KEY=0000000000000000000000000000000000000000000400000000000000000000 +CT=9E15798731ED42F43EA2740A691DA872 + +I=175 +KEY=0000000000000000000000000000000000000000000200000000000000000000 +CT=31FBD661540A5DEAAD1017CFD3909EC8 + +I=176 +KEY=0000000000000000000000000000000000000000000100000000000000000000 +CT=CDA9AE05F224140E28CB951721B44D6A + +I=177 +KEY=0000000000000000000000000000000000000000000080000000000000000000 +CT=0C5BC512C60A1EAC3434EFB1A8FBB182 + +I=178 +KEY=0000000000000000000000000000000000000000000040000000000000000000 +CT=AA863610DEEEEB62D045E87EA30B59B5 + +I=179 +KEY=0000000000000000000000000000000000000000000020000000000000000000 +CT=6AC2448DE568D279C7EEBE1DF403920C + +I=180 +KEY=0000000000000000000000000000000000000000000010000000000000000000 +CT=E2011E3D292B26888AE801215FD0CB40 + +I=181 +KEY=0000000000000000000000000000000000000000000008000000000000000000 +CT=E06F3E15EE3A61672D1C99BADE5B9DBE + +I=182 +KEY=0000000000000000000000000000000000000000000004000000000000000000 +CT=BB7027F0548CF6712CEB4C7A4B28E178 + +I=183 +KEY=0000000000000000000000000000000000000000000002000000000000000000 +CT=061EC21FB70FADBDF87C3BD2AE23825B + +I=184 +KEY=0000000000000000000000000000000000000000000001000000000000000000 +CT=4C21F26FE94ABBAC381352375314C3EB + +I=185 +KEY=0000000000000000000000000000000000000000000000800000000000000000 +CT=F7CEE6DD99909C2B569EEDA61ED8942E + +I=186 +KEY=0000000000000000000000000000000000000000000000400000000000000000 +CT=CE98C4A876C65E4CCB261EBB1D9DF7F5 + +I=187 +KEY=0000000000000000000000000000000000000000000000200000000000000000 +CT=A5491881CF833C3604ABC08044F402AC + +I=188 +KEY=0000000000000000000000000000000000000000000000100000000000000000 +CT=A1BA16E64CCCB3087D57A768507B0BFC + +I=189 +KEY=0000000000000000000000000000000000000000000000080000000000000000 +CT=D55951E202D2949EBD3BE43120C738BF + +I=190 +KEY=0000000000000000000000000000000000000000000000040000000000000000 +CT=EBB8E43069E69F450EFEC65DCD52B7FD + +I=191 +KEY=0000000000000000000000000000000000000000000000020000000000000000 +CT=2B292135663B4AA5ABFE9423D57E7EE9 + +I=192 +KEY=0000000000000000000000000000000000000000000000010000000000000000 +CT=E91BF974B3BE3AD966249D8655292A85 + +I=193 +KEY=0000000000000000000000000000000000000000000000008000000000000000 +CT=384365998EAA9562236CC58F6ADF9610 + +I=194 +KEY=0000000000000000000000000000000000000000000000004000000000000000 +CT=C2E997012AA3D4D8D359C9A947CBE69F + +I=195 +KEY=0000000000000000000000000000000000000000000000002000000000000000 +CT=F49421204148BA213BE87E2D5C22B0BF + +I=196 +KEY=0000000000000000000000000000000000000000000000001000000000000000 +CT=82ED0ED9953AA92E4DF30929CA65C00F + +I=197 +KEY=0000000000000000000000000000000000000000000000000800000000000000 +CT=291EB1D11653C8479437C74A977F5106 + +I=198 +KEY=0000000000000000000000000000000000000000000000000400000000000000 +CT=BCB997B1939B8983ABD550D6025683E3 + +I=199 +KEY=0000000000000000000000000000000000000000000000000200000000000000 +CT=1FBA2592C6F489775CAADA71F9B983E9 + +I=200 +KEY=0000000000000000000000000000000000000000000000000100000000000000 +CT=969F66F217AF1A3DB9E41C1B29039824 + +I=201 +KEY=0000000000000000000000000000000000000000000000000080000000000000 +CT=A54BB7D6B17E423AC0A7744C19073CB8 + +I=202 +KEY=0000000000000000000000000000000000000000000000000040000000000000 +CT=B0AC6E6578D1021F47DCF9748A32EAD5 + +I=203 +KEY=0000000000000000000000000000000000000000000000000020000000000000 +CT=B87B361C3B7B194C77A4358D4669153E + +I=204 +KEY=0000000000000000000000000000000000000000000000000010000000000000 +CT=46A133847F96EAA8282A799DC8899D58 + +I=205 +KEY=0000000000000000000000000000000000000000000000000008000000000000 +CT=2265EC3A9F2D5C9547A091CC8CFB18EA + +I=206 +KEY=0000000000000000000000000000000000000000000000000004000000000000 +CT=54CBF3A6FC4FE56D426117AA1FFD1DDE + +I=207 +KEY=0000000000000000000000000000000000000000000000000002000000000000 +CT=5312877CCEAB6CFB0905394A370A8003 + +I=208 +KEY=0000000000000000000000000000000000000000000000000001000000000000 +CT=7190BD6EC613FE38B84ECFE28F702FE4 + +I=209 +KEY=0000000000000000000000000000000000000000000000000000800000000000 +CT=D1FA5B9CA89A43B04C05F0EF29EF68CD + +I=210 +KEY=0000000000000000000000000000000000000000000000000000400000000000 +CT=808285751548ED934FD1056D2D9AE8BA + +I=211 +KEY=0000000000000000000000000000000000000000000000000000200000000000 +CT=2758DEF3E7B95A9AE89777BE64D5A6CF + +I=212 +KEY=0000000000000000000000000000000000000000000000000000100000000000 +CT=07D81F87DB3E0ACC82B01E08FB22F3C1 + +I=213 +KEY=0000000000000000000000000000000000000000000000000000080000000000 +CT=8DA250E5553D650711A75EE1CB4FD1C7 + +I=214 +KEY=0000000000000000000000000000000000000000000000000000040000000000 +CT=A93D946BD0E87F32719DF5F158CEE669 + +I=215 +KEY=0000000000000000000000000000000000000000000000000000020000000000 +CT=03945236EC2A4D4EAF30B8ABEB54330D + +I=216 +KEY=0000000000000000000000000000000000000000000000000000010000000000 +CT=11CC35301F24B79DDE31AEA2D1354F88 + +I=217 +KEY=0000000000000000000000000000000000000000000000000000008000000000 +CT=E73715B3E8D9A290F44AE6FFBF247E5D + +I=218 +KEY=0000000000000000000000000000000000000000000000000000004000000000 +CT=7345E07732B71CB158BBF64CCA5C5B96 + +I=219 +KEY=0000000000000000000000000000000000000000000000000000002000000000 +CT=6E128F296D24705A1924FD9B70C4ED04 + +I=220 +KEY=0000000000000000000000000000000000000000000000000000001000000000 +CT=95A789776F036783FBD330947083F54F + +I=221 +KEY=0000000000000000000000000000000000000000000000000000000800000000 +CT=360DEC2533EA4AA2E3E54FD3DE2906EB + +I=222 +KEY=0000000000000000000000000000000000000000000000000000000400000000 +CT=E68EFD7FECF4D601EA22727BD764965B + +I=223 +KEY=0000000000000000000000000000000000000000000000000000000200000000 +CT=9065C64A8BFF44AC33EDBB611CF83D7B + +I=224 +KEY=0000000000000000000000000000000000000000000000000000000100000000 +CT=8F33C8DF2A7A51CE8090E8F123BC3723 + +I=225 +KEY=0000000000000000000000000000000000000000000000000000000080000000 +CT=807F391FFBA8291BA625623210F99018 + +I=226 +KEY=0000000000000000000000000000000000000000000000000000000040000000 +CT=5E8B3F3A701522CE5CAA761C929D6292 + +I=227 +KEY=0000000000000000000000000000000000000000000000000000000020000000 +CT=3BA404DC38735A78289E3809E8364835 + +I=228 +KEY=0000000000000000000000000000000000000000000000000000000010000000 +CT=D23BEDBAD229F8305DC425B6B759DCC9 + +I=229 +KEY=0000000000000000000000000000000000000000000000000000000008000000 +CT=44880F21CF5913040AE376AEE2A10AD8 + +I=230 +KEY=0000000000000000000000000000000000000000000000000000000004000000 +CT=9BC98E29D057C0E828C3B5CCE69256C1 + +I=231 +KEY=0000000000000000000000000000000000000000000000000000000002000000 +CT=B293CC7A975DA141A68279368057CC41 + +I=232 +KEY=0000000000000000000000000000000000000000000000000000000001000000 +CT=8D60FB87ACD91385B313BE5F1D7BD30F + +I=233 +KEY=0000000000000000000000000000000000000000000000000000000000800000 +CT=2C8E56132D70291B303C48FDF75543CD + +I=234 +KEY=0000000000000000000000000000000000000000000000000000000000400000 +CT=D1F80035B826791F6CE4E59B7DB1BB0D + +I=235 +KEY=0000000000000000000000000000000000000000000000000000000000200000 +CT=42CE6224FC36469339A133DD08173BD4 + +I=236 +KEY=0000000000000000000000000000000000000000000000000000000000100000 +CT=61817155EA41BCBA2AF7F06AE7CBF585 + +I=237 +KEY=0000000000000000000000000000000000000000000000000000000000080000 +CT=D1923A9866068D2EF5FB77D57C3315B6 + +I=238 +KEY=0000000000000000000000000000000000000000000000000000000000040000 +CT=B37CBDB5D719F49691CA968EF2E84140 + +I=239 +KEY=0000000000000000000000000000000000000000000000000000000000020000 +CT=EC974E653A055D7F8F22171030F68E1D + +I=240 +KEY=0000000000000000000000000000000000000000000000000000000000010000 +CT=DDE5D3B9AAD9C32213BB3675A822499C + +I=241 +KEY=0000000000000000000000000000000000000000000000000000000000008000 +CT=D3B6E9216EA1AE57EB1C628A3C38AB78 + +I=242 +KEY=0000000000000000000000000000000000000000000000000000000000004000 +CT=82C99ECC69472B7E96324B042AE8B87A + +I=243 +KEY=0000000000000000000000000000000000000000000000000000000000002000 +CT=97144DC5338C43600F84439C0AA0D147 + +I=244 +KEY=0000000000000000000000000000000000000000000000000000000000001000 +CT=400AC4A0BBADA1DB2121EB144C7E5209 + +I=245 +KEY=0000000000000000000000000000000000000000000000000000000000000800 +CT=EFD9D550EB419ED278F4885A490AB54C + +I=246 +KEY=0000000000000000000000000000000000000000000000000000000000000400 +CT=2AB7816E149B7C0404C88A8857793670 + +I=247 +KEY=0000000000000000000000000000000000000000000000000000000000000200 +CT=5B591DFF9E8DEE15BAD24C025DBCA481 + +I=248 +KEY=0000000000000000000000000000000000000000000000000000000000000100 +CT=0C06633E30721C3749F49AD8CBF2B754 + +I=249 +KEY=0000000000000000000000000000000000000000000000000000000000000080 +CT=96D6D31A41B5123B2035FD91A921D4CA + +I=250 +KEY=0000000000000000000000000000000000000000000000000000000000000040 +CT=E7F6C34D86668BC2805CA7793C5E86AD + +I=251 +KEY=0000000000000000000000000000000000000000000000000000000000000020 +CT=F46DFF5FF500D6879C4D3E45CF0CF0F3 + +I=252 +KEY=0000000000000000000000000000000000000000000000000000000000000010 +CT=60D842D9C61DA7495C116197B7CECBBE + +I=253 +KEY=0000000000000000000000000000000000000000000000000000000000000008 +CT=D45B24EDB673353EBDF248B8FA06B67A + +I=254 +KEY=0000000000000000000000000000000000000000000000000000000000000004 +CT=119EAEBCC165D0BD02C0D35DC82EF992 + +I=255 +KEY=0000000000000000000000000000000000000000000000000000000000000002 +CT=E673143680414ADA301D0ED34626B9FE + +I=256 +KEY=0000000000000000000000000000000000000000000000000000000000000001 +CT=6B6CFE160A6263631B292F879EEFF926 + +========== \ No newline at end of file diff -urN lin.2.2.17/crypto/testing/serpent_ecb_vk.txt int.2.2.17.x/crypto/testing/serpent_ecb_vk.txt --- lin.2.2.17/crypto/testing/serpent_ecb_vk.txt Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/serpent_ecb_vk.txt Mon Oct 16 17:27:04 2000 @@ -0,0 +1,2334 @@ +========================= + +FILENAME: "ecb_vk.txt" + +Electronic Codebook (ECB) Mode +Variable Key Known Answer Tests + +Algorithm Name: Serpent +Principal Submitter: Ross Anderson, Eli Biham, Lars Knudsen + +========== + +KEYSIZE=128 + +PT=00000000000000000000000000000000 + +I=1 +KEY=80000000000000000000000000000000 +CT=49afbfad9d5a34052cd8ffa5986bd2dd + +I=2 +KEY=40000000000000000000000000000000 +CT=0c1e2e4e79bd02c2501096e79b5e73fa + +I=3 +KEY=20000000000000000000000000000000 +CT=d769e71b31f4ae12e14cdc48238d2d7b + +I=4 +KEY=10000000000000000000000000000000 +CT=bd0276d6be072cc00b3d426130bf355f + +I=5 +KEY=08000000000000000000000000000000 +CT=c191e2121daea18ec30957bbce199a8c + +I=6 +KEY=04000000000000000000000000000000 +CT=afdffc707b4c6890fa9eec5dcf8c9cd6 + +I=7 +KEY=02000000000000000000000000000000 +CT=7ed064ab9270ede51862d2a4775eb639 + +I=8 +KEY=01000000000000000000000000000000 +CT=e108b719d47da77d82b2811f09c768f6 + +I=9 +KEY=00800000000000000000000000000000 +CT=46d78ac926c7fd72aeb6e662d6be0671 + +I=10 +KEY=00400000000000000000000000000000 +CT=b86ddb30f8bacec337679bb112a33a04 + +I=11 +KEY=00200000000000000000000000000000 +CT=d55f0d5779c68cb6db174f85006f5ef9 + +I=12 +KEY=00100000000000000000000000000000 +CT=9cce4fe5fc2c3f58007049ff81ae3fd2 + +I=13 +KEY=00080000000000000000000000000000 +CT=e8db9396961180f9515acedbc47d5cef + +I=14 +KEY=00040000000000000000000000000000 +CT=abcc122ccc4b2b00a40e266c54f0d234 + +I=15 +KEY=00020000000000000000000000000000 +CT=137ef0814dc6171858a93557e97b78b3 + +I=16 +KEY=00010000000000000000000000000000 +CT=1aeddc72581c90d87f6f01e431dc31eb + +I=17 +KEY=00008000000000000000000000000000 +CT=9543bc267111fbdb019c00d0d907d643 + +I=18 +KEY=00004000000000000000000000000000 +CT=2269c1f5dbeb2ced1932a60dcf273b46 + +I=19 +KEY=00002000000000000000000000000000 +CT=bb49509c9b79d012cb04ab565534df90 + +I=20 +KEY=00001000000000000000000000000000 +CT=4d0f02eb268acfaec89115f7f761c805 + +I=21 +KEY=00000800000000000000000000000000 +CT=9288439abb3beb346b7fafadb897dd11 + +I=22 +KEY=00000400000000000000000000000000 +CT=dc348afd3ee54b134f8f9f5045e87171 + +I=23 +KEY=00000200000000000000000000000000 +CT=52d8aa93f95a76980a42960a407b4e86 + +I=24 +KEY=00000100000000000000000000000000 +CT=ea977f02d0f2b330dc33aa53055af7b8 + +I=25 +KEY=00000080000000000000000000000000 +CT=8dd4bdf3874ed531036747e0b1b93f57 + +I=26 +KEY=00000040000000000000000000000000 +CT=b8dba7c86499bff611935cede230cf03 + +I=27 +KEY=00000020000000000000000000000000 +CT=32cce0726492e1afbc3a001f655c73ed + +I=28 +KEY=00000010000000000000000000000000 +CT=807570b6677b0fbdf7e7cabcd5dd0c97 + +I=29 +KEY=00000008000000000000000000000000 +CT=26381f839c8d92efe1c29df688571c6d + +I=30 +KEY=00000004000000000000000000000000 +CT=da6e8ca3ec924a0a6c7b704b56c46783 + +I=31 +KEY=00000002000000000000000000000000 +CT=cc6e7070e5ac70cd9664fda7bb505df2 + +I=32 +KEY=00000001000000000000000000000000 +CT=8c41cd11c3dc2333dc96ddf74d85430c + +I=33 +KEY=00000000800000000000000000000000 +CT=a006685e857f4c2a70fcea63ed27888f + +I=34 +KEY=00000000400000000000000000000000 +CT=f6e94cd2ef8eb4886893458d49f84fdd + +I=35 +KEY=00000000200000000000000000000000 +CT=1f654042740ca63ad906c1b7bcf18bde + +I=36 +KEY=00000000100000000000000000000000 +CT=340fbc9913fc30b3a867921b6acb45fc + +I=37 +KEY=00000000080000000000000000000000 +CT=b2b0488b1c9dfa4d66fcaeeb4c29ec9e + +I=38 +KEY=00000000040000000000000000000000 +CT=a35d40c8cfe4b26d0047e1661d5bfbca + +I=39 +KEY=00000000020000000000000000000000 +CT=97f91ad53e32fd33198ccb9c553cf4b9 + +I=40 +KEY=00000000010000000000000000000000 +CT=7adeec246ef1a8b16caa7aeb85441dd1 + +I=41 +KEY=00000000008000000000000000000000 +CT=12e12c07623a87b76100474804b4f7a4 + +I=42 +KEY=00000000004000000000000000000000 +CT=d24a5c39b10157c7f957f51bd35adf80 + +I=43 +KEY=00000000002000000000000000000000 +CT=54593378469cea645783a4ab0847ce46 + +I=44 +KEY=00000000001000000000000000000000 +CT=3ac3fce2fbdd176ff7f659ee19bcba72 + +I=45 +KEY=00000000000800000000000000000000 +CT=82c4c432a703271e6f4bda3f174063e7 + +I=46 +KEY=00000000000400000000000000000000 +CT=58d9b1ac0a6dad03ede51d30ac77c579 + +I=47 +KEY=00000000000200000000000000000000 +CT=8a8f0c4f316232a05eb611358fd7a8a2 + +I=48 +KEY=00000000000100000000000000000000 +CT=afae1db5edb3f7203577b37ce8e4876c + +I=49 +KEY=00000000000080000000000000000000 +CT=07112de84d0759a816f620dc786e648d + +I=50 +KEY=00000000000040000000000000000000 +CT=c3f4922db4541025e4c162acaae48de9 + +I=51 +KEY=00000000000020000000000000000000 +CT=47836c92ed4fa66f1c6459478f45fcb0 + +I=52 +KEY=00000000000010000000000000000000 +CT=d25965deadcbeb3c9b8ee599fa81f361 + +I=53 +KEY=00000000000008000000000000000000 +CT=7d86a4cd06353c4a73022b2e75af7e2c + +I=54 +KEY=00000000000004000000000000000000 +CT=bf1bdfdb65e06f4d19c8b11a4e280f60 + +I=55 +KEY=00000000000002000000000000000000 +CT=6845080536e71bd50c9db865bac484db + +I=56 +KEY=00000000000001000000000000000000 +CT=37004f392802c0ade017bc4a1ac4754c + +I=57 +KEY=00000000000000800000000000000000 +CT=501f9de66d9b8048c9a2657bee750323 + +I=58 +KEY=00000000000000400000000000000000 +CT=edffad56dbd99444dbf01f5d347fef94 + +I=59 +KEY=00000000000000200000000000000000 +CT=afe80d1a72308a41a10bc463507a27ce + +I=60 +KEY=00000000000000100000000000000000 +CT=c848af4b9d8eef03e085ea6331e14fbf + +I=61 +KEY=00000000000000080000000000000000 +CT=5c0547e4ca27c23506eb54dbf1f9f9c8 + +I=62 +KEY=00000000000000040000000000000000 +CT=9eea58726c084358c80beace0ba9316f + +I=63 +KEY=00000000000000020000000000000000 +CT=c3f8221b5e849c830bbc30697cfc4e33 + +I=64 +KEY=00000000000000010000000000000000 +CT=7d10842f40364fa264c876e5f2f9921e + +I=65 +KEY=00000000000000008000000000000000 +CT=e25769f083838d9ba05dbabd0adfb8a5 + +I=66 +KEY=00000000000000004000000000000000 +CT=08cb3d4622c7974eff08da8a346f4b34 + +I=67 +KEY=00000000000000002000000000000000 +CT=3ff6bcf81372f04eb8a1e082042ab5aa + +I=68 +KEY=00000000000000001000000000000000 +CT=0198c38d19e4579133178aa8e4dd77e4 + +I=69 +KEY=00000000000000000800000000000000 +CT=dffdd86a4c6b22b399f4ccbedf1c4033 + +I=70 +KEY=00000000000000000400000000000000 +CT=b10b0e2bde47b1129c75b5838627062c + +I=71 +KEY=00000000000000000200000000000000 +CT=ec608bdd3f215e9f73b57183dc7cb6b2 + +I=72 +KEY=00000000000000000100000000000000 +CT=ee7b79d43681851ba43510b25fedac83 + +I=73 +KEY=00000000000000000080000000000000 +CT=1906141e04ad2a584cef3a93dc13621f + +I=74 +KEY=00000000000000000040000000000000 +CT=7590c1bb23c24da9cd0f10040ee1b732 + +I=75 +KEY=00000000000000000020000000000000 +CT=c581396fbdfecf75f55ce431879cfa72 + +I=76 +KEY=00000000000000000010000000000000 +CT=93e88288dc748f6fa096bd2f5b35e9ae + +I=77 +KEY=00000000000000000008000000000000 +CT=b1f29150a0c4c5fdb8d20d2dc52661b5 + +I=78 +KEY=00000000000000000004000000000000 +CT=e5ee3a9b5f38d0dd5db7be33f1b6f56f + +I=79 +KEY=00000000000000000002000000000000 +CT=db980feddfe7c14e3ff9b3e4bcc54165 + +I=80 +KEY=00000000000000000001000000000000 +CT=1d085c7a534503011e3f248a0dd69ebf + +I=81 +KEY=00000000000000000000800000000000 +CT=578aa13f4284049cf77ddb639e9d6777 + +I=82 +KEY=00000000000000000000400000000000 +CT=7f725360786ca59b82bf2673b0918054 + +I=83 +KEY=00000000000000000000200000000000 +CT=fb21f98e591af7f7d6ee6ee04e70faa8 + +I=84 +KEY=00000000000000000000100000000000 +CT=dc73336c2d3056fb56c11a09ca147f62 + +I=85 +KEY=00000000000000000000080000000000 +CT=f51c58c6fe6a0ebc9c9109eb97ab2cbc + +I=86 +KEY=00000000000000000000040000000000 +CT=081d42e412311642222b52cff05d7fcc + +I=87 +KEY=00000000000000000000020000000000 +CT=e50c69c214a093004fe6f107bfc34a08 + +I=88 +KEY=00000000000000000000010000000000 +CT=c5b57a240a095310ba40b7747459c6d3 + +I=89 +KEY=00000000000000000000008000000000 +CT=b1110d1bc986bfa5acdbf1231b913574 + +I=90 +KEY=00000000000000000000004000000000 +CT=23f5505f1badb259826d8ab7e59ce579 + +I=91 +KEY=00000000000000000000002000000000 +CT=e5ddaabeaf6cae289174d9839165f372 + +I=92 +KEY=00000000000000000000001000000000 +CT=c44e60a86495404c6ea369d6a26edd77 + +I=93 +KEY=00000000000000000000000800000000 +CT=273d4e769fceb754be0ce32a7eecd427 + +I=94 +KEY=00000000000000000000000400000000 +CT=239d65850b45fafe8bd0982492c4680d + +I=95 +KEY=00000000000000000000000200000000 +CT=5db91003c20f59ea498576f2efce4f6c + +I=96 +KEY=00000000000000000000000100000000 +CT=3bc4e9986a9576474f947ee49b9046fc + +I=97 +KEY=00000000000000000000000080000000 +CT=2aa67c0d7f134c3ee48b5a945a94aa50 + +I=98 +KEY=00000000000000000000000040000000 +CT=f6f6f7dd1920f20aeb08844c8c811175 + +I=99 +KEY=00000000000000000000000020000000 +CT=0d3313cbc0c84fc2747900009ba06bd4 + +I=100 +KEY=00000000000000000000000010000000 +CT=7385cbac63b11c5adaf763c9c652e317 + +I=101 +KEY=00000000000000000000000008000000 +CT=80a74048515d7162287b0f4d991ced6c + +I=102 +KEY=00000000000000000000000004000000 +CT=7d3abfdd15cfd8c0a989fc7a151e35ad + +I=103 +KEY=00000000000000000000000002000000 +CT=0336740082e8c5a85d32dcba80b0af79 + +I=104 +KEY=00000000000000000000000001000000 +CT=fdaa7495db62ec0c22cae25fa2fe26d3 + +I=105 +KEY=00000000000000000000000000800000 +CT=da10538ff08a81323b8e0bdab580c9a3 + +I=106 +KEY=00000000000000000000000000400000 +CT=3aa421d16db303cd32c58261d71f6512 + +I=107 +KEY=00000000000000000000000000200000 +CT=90f78d5b05e1ca8e0b34220760a4916d + +I=108 +KEY=00000000000000000000000000100000 +CT=03a35d1b2758a91907430778c9491f2b + +I=109 +KEY=00000000000000000000000000080000 +CT=b729c8708dc7cd28d21eaa12dcda299e + +I=110 +KEY=00000000000000000000000000040000 +CT=4b30d94af1cb3be76fb98ef878f68f5b + +I=111 +KEY=00000000000000000000000000020000 +CT=5b3eef9c55455e7347e533bb6c5f8b15 + +I=112 +KEY=00000000000000000000000000010000 +CT=8e01b7823aacf4f23552ac40c03afa8e + +I=113 +KEY=00000000000000000000000000008000 +CT=f9d23961d0661eebde0f824e47ceba97 + +I=114 +KEY=00000000000000000000000000004000 +CT=385ac4a1512edbecae3527ec49b84c11 + +I=115 +KEY=00000000000000000000000000002000 +CT=4561dab55aa5b7625a6961fed1ab2614 + +I=116 +KEY=00000000000000000000000000001000 +CT=40778dfdd63cbe86812440519715c680 + +I=117 +KEY=00000000000000000000000000000800 +CT=93c6789d563e3df7d74ea3523333bdcf + +I=118 +KEY=00000000000000000000000000000400 +CT=7f47b8dbe11e385f07b6efb20a35045f + +I=119 +KEY=00000000000000000000000000000200 +CT=66ea39db24ed91686ead33208de35ccf + +I=120 +KEY=00000000000000000000000000000100 +CT=4c42473dcc65b14088257f8744af633e + +I=121 +KEY=00000000000000000000000000000080 +CT=3ddabfc006daab06462af4ef81544e26 + +I=122 +KEY=00000000000000000000000000000040 +CT=24850e35c86eac07349927c73b1b234a + +I=123 +KEY=00000000000000000000000000000020 +CT=568db914df56817d3c85fde9f96932e0 + +I=124 +KEY=00000000000000000000000000000010 +CT=8fc4ac4d7589bad559ac81301c1898a7 + +I=125 +KEY=00000000000000000000000000000008 +CT=15dafb79236ac6f5f361f80d5255b334 + +I=126 +KEY=00000000000000000000000000000004 +CT=4ab0a08142246b0c5175116b8fbb865e + +I=127 +KEY=00000000000000000000000000000002 +CT=a143e86d9bd26437f1c5a9c7903121b9 + +I=128 +KEY=00000000000000000000000000000001 +CT=c8466045b204026fffd194320355ca4e + +========== + +KEYSIZE=192 + +PT=00000000000000000000000000000000 + +I=1 +KEY=800000000000000000000000000000000000000000000000 +CT=e78e5402c7195568ac3678f7a3f60c66 + +I=2 +KEY=400000000000000000000000000000000000000000000000 +CT=23645a0ddd4b0f8b73b6215ea938a59e + +I=3 +KEY=200000000000000000000000000000000000000000000000 +CT=95d262643c94cab3e5830fc90a3ad119 + +I=4 +KEY=100000000000000000000000000000000000000000000000 +CT=2a66ae878814c427cd1be1b929d69d1b + +I=5 +KEY=080000000000000000000000000000000000000000000000 +CT=c1f74b3c5df4b485118b6901a22bef14 + +I=6 +KEY=040000000000000000000000000000000000000000000000 +CT=abe310b271d2f83f15ddd70139a8f18a + +I=7 +KEY=020000000000000000000000000000000000000000000000 +CT=8072229836095e09a76de47ff4b90942 + +I=8 +KEY=010000000000000000000000000000000000000000000000 +CT=463b70d45332c3d5afc57cac1785055d + +I=9 +KEY=008000000000000000000000000000000000000000000000 +CT=5587b5bcb9ee5a28ba2bacc418005240 + +I=10 +KEY=004000000000000000000000000000000000000000000000 +CT=735ab1e66239c7882ab3b52623e812fb + +I=11 +KEY=002000000000000000000000000000000000000000000000 +CT=2c899a7e69368ddfd435b90fb54a5110 + +I=12 +KEY=001000000000000000000000000000000000000000000000 +CT=058a2258fec39fd98caee246e83fba23 + +I=13 +KEY=000800000000000000000000000000000000000000000000 +CT=29de401b293b69509f1f26172b99e768 + +I=14 +KEY=000400000000000000000000000000000000000000000000 +CT=33fda1c0a7f752f26f7eef1de21af616 + +I=15 +KEY=000200000000000000000000000000000000000000000000 +CT=90144147c0838e88c081c08c806d3879 + +I=16 +KEY=000100000000000000000000000000000000000000000000 +CT=598957d7605d027c870c3968de1c4281 + +I=17 +KEY=000080000000000000000000000000000000000000000000 +CT=252e46bf0615ac356a4350f223d1e48b + +I=18 +KEY=000040000000000000000000000000000000000000000000 +CT=cc2447d57f2a53f825c167bffc7e00fd + +I=19 +KEY=000020000000000000000000000000000000000000000000 +CT=7100c3404f1394015041d22fe81d66d6 + +I=20 +KEY=000010000000000000000000000000000000000000000000 +CT=9df94fccb015d30e3b86aeca1c393ab0 + +I=21 +KEY=000008000000000000000000000000000000000000000000 +CT=4844e0e701a2a85dbac818f1ab2c14b5 + +I=22 +KEY=000004000000000000000000000000000000000000000000 +CT=4ce4e7e3104510c0ec02486e618b072b + +I=23 +KEY=000002000000000000000000000000000000000000000000 +CT=88f251a4fd7939dab8e3547140958ace + +I=24 +KEY=000001000000000000000000000000000000000000000000 +CT=d752effc32d3d7ba1217a3a6759d5def + +I=25 +KEY=000000800000000000000000000000000000000000000000 +CT=6c03785cc372b967a9ae4e7e153064ce + +I=26 +KEY=000000400000000000000000000000000000000000000000 +CT=f356816a32dabc65bf3361957e131771 + +I=27 +KEY=000000200000000000000000000000000000000000000000 +CT=b1700202c5b1c1fa94d756db5b160d7d + +I=28 +KEY=000000100000000000000000000000000000000000000000 +CT=d2dd321ee0d420bde198cda1c84de12a + +I=29 +KEY=000000080000000000000000000000000000000000000000 +CT=0e53163d96ceaec6073786bfe36b26ae + +I=30 +KEY=000000040000000000000000000000000000000000000000 +CT=607e94a93e5ed0e8d4657697af12263a + +I=31 +KEY=000000020000000000000000000000000000000000000000 +CT=4fe24da11e3b2e528689b4d72a1f4995 + +I=32 +KEY=000000010000000000000000000000000000000000000000 +CT=c89dc4741fba46d09f0c909e415d1e8a + +I=33 +KEY=000000008000000000000000000000000000000000000000 +CT=927998642db52db45aa726f55a9807e4 + +I=34 +KEY=000000004000000000000000000000000000000000000000 +CT=8a9da14de34dfcd06af101411ead6e6c + +I=35 +KEY=000000002000000000000000000000000000000000000000 +CT=58d05e0e1c2217640ba965d33642e784 + +I=36 +KEY=000000001000000000000000000000000000000000000000 +CT=6b329fe46eb5523e2360a28956d4c07d + +I=37 +KEY=000000000800000000000000000000000000000000000000 +CT=80765c8e114a3f19ac86e68ac5e69ee6 + +I=38 +KEY=000000000400000000000000000000000000000000000000 +CT=9e111a3bc422a8d3c8372a7b214dcf7f + +I=39 +KEY=000000000200000000000000000000000000000000000000 +CT=43a392e7c0a7441e5fd4b8f53b04376d + +I=40 +KEY=000000000100000000000000000000000000000000000000 +CT=321c8906902c819fee83ac1ca3de46ed + +I=41 +KEY=000000000080000000000000000000000000000000000000 +CT=961146f0e1d1618b4aa3dddfc407bcda + +I=42 +KEY=000000000040000000000000000000000000000000000000 +CT=35ff30c0f11225b0fbdeee829e1033e7 + +I=43 +KEY=000000000020000000000000000000000000000000000000 +CT=c14f87b211633d3f3b7b297fe1f53b9f + +I=44 +KEY=000000000010000000000000000000000000000000000000 +CT=75e05358f1d0798f359c29a6ed9327cf + +I=45 +KEY=000000000008000000000000000000000000000000000000 +CT=ce93218acbc0c73f0b2be8082ed9fc4c + +I=46 +KEY=000000000004000000000000000000000000000000000000 +CT=54a73a50cda285a429016cc5086d9f40 + +I=47 +KEY=000000000002000000000000000000000000000000000000 +CT=73de0beacbf4cd85e4e067226e94804d + +I=48 +KEY=000000000001000000000000000000000000000000000000 +CT=8851067bedfa997f5feb63a07676e0ea + +I=49 +KEY=000000000000800000000000000000000000000000000000 +CT=3438f325f239c49b2a21b5140aeb83a7 + +I=50 +KEY=000000000000400000000000000000000000000000000000 +CT=e93a4212daaaaa91d2628bbffa824252 + +I=51 +KEY=000000000000200000000000000000000000000000000000 +CT=660bef72e98bc11e63944336550e6d30 + +I=52 +KEY=000000000000100000000000000000000000000000000000 +CT=39ebf5fc10b7bb85fe45473508bad887 + +I=53 +KEY=000000000000080000000000000000000000000000000000 +CT=c97a923736e49d536ba33bf4502f4d89 + +I=54 +KEY=000000000000040000000000000000000000000000000000 +CT=352acb145387dfa72b05b0dd79199c47 + +I=55 +KEY=000000000000020000000000000000000000000000000000 +CT=73682433c31b7492335615ef9f39e5e0 + +I=56 +KEY=000000000000010000000000000000000000000000000000 +CT=2f3166a3e2ea671397d852958b3cf986 + +I=57 +KEY=000000000000008000000000000000000000000000000000 +CT=84f405f8270c1c58c0fe19a564df189f + +I=58 +KEY=000000000000004000000000000000000000000000000000 +CT=8e768cbf45b91029f767db75843ebd53 + +I=59 +KEY=000000000000002000000000000000000000000000000000 +CT=b1927686ab4297fb6aa8eface91b6c45 + +I=60 +KEY=000000000000001000000000000000000000000000000000 +CT=2192b94b157c15177f4bb4dcbd6eee89 + +I=61 +KEY=000000000000000800000000000000000000000000000000 +CT=2b596f7f119a2f59179f522c7ea1ec51 + +I=62 +KEY=000000000000000400000000000000000000000000000000 +CT=56c5e66ea1d98ea8dd9906d9d73610a5 + +I=63 +KEY=000000000000000200000000000000000000000000000000 +CT=6ad3b33d2ede5b781d136fcea356c807 + +I=64 +KEY=000000000000000100000000000000000000000000000000 +CT=5585ab166028e001379c6d2cbd3169a0 + +I=65 +KEY=000000000000000080000000000000000000000000000000 +CT=167da93e33b3c95fe3f7a8526668073a + +I=66 +KEY=000000000000000040000000000000000000000000000000 +CT=dfb3528fca5f163952a30b34108300fd + +I=67 +KEY=000000000000000020000000000000000000000000000000 +CT=1503116c28b3b82ff9f0db169d857efc + +I=68 +KEY=000000000000000010000000000000000000000000000000 +CT=7b4dac54ba36d4ab88ef3356ebcbc086 + +I=69 +KEY=000000000000000008000000000000000000000000000000 +CT=dcea72fe37b7eee1837be0eaa4ce66ca + +I=70 +KEY=000000000000000004000000000000000000000000000000 +CT=c9da8b98ef3157d221c06d6b95549701 + +I=71 +KEY=000000000000000002000000000000000000000000000000 +CT=e83cabd11d2f8271a117c7c65cc66e78 + +I=72 +KEY=000000000000000001000000000000000000000000000000 +CT=c462f0880d5ae2411dc6f1a68873abde + +I=73 +KEY=000000000000000000800000000000000000000000000000 +CT=fe0089c7e6c657d1b71cf467d4f58df0 + +I=74 +KEY=000000000000000000400000000000000000000000000000 +CT=49932b6abd5601fda5c8403e9cb92502 + +I=75 +KEY=000000000000000000200000000000000000000000000000 +CT=ec725bcf1a0133a45aeb7a5a72898d6b + +I=76 +KEY=000000000000000000100000000000000000000000000000 +CT=6ece8cb7f45ba9d63e152399f6558b6a + +I=77 +KEY=000000000000000000080000000000000000000000000000 +CT=9aa8f493830fd6ede37e7803f9869b19 + +I=78 +KEY=000000000000000000040000000000000000000000000000 +CT=70856a78e1bb29b9d00108361683e0bf + +I=79 +KEY=000000000000000000020000000000000000000000000000 +CT=3bec70b8070fc514b3de12bfcd6e7b88 + +I=80 +KEY=000000000000000000010000000000000000000000000000 +CT=4896551f1308c48fbdd89b8313de2fc8 + +I=81 +KEY=000000000000000000008000000000000000000000000000 +CT=21270b0aa9831c887320210856618204 + +I=82 +KEY=000000000000000000004000000000000000000000000000 +CT=9d94843edde4c6a89bea613af35afdcd + +I=83 +KEY=000000000000000000002000000000000000000000000000 +CT=a44742fb1f8c552797b0fe90a7f0efa9 + +I=84 +KEY=000000000000000000001000000000000000000000000000 +CT=731be62d606ecf6ee9a0f0c96a26f6ea + +I=85 +KEY=000000000000000000000800000000000000000000000000 +CT=f1471235da8b77caf22aa978414bf459 + +I=86 +KEY=000000000000000000000400000000000000000000000000 +CT=f67b2cdbbb11ee10d180c2070e73c387 + +I=87 +KEY=000000000000000000000200000000000000000000000000 +CT=36f6bafee414e8f22f815cc204f46b5f + +I=88 +KEY=000000000000000000000100000000000000000000000000 +CT=e0d276ef75ac7dc2b15bee758cc7b892 + +I=89 +KEY=000000000000000000000080000000000000000000000000 +CT=7d541fc08e0ff9b773cc84c974749f1e + +I=90 +KEY=000000000000000000000040000000000000000000000000 +CT=7998830324cf92a793e295412bd3aa9c + +I=91 +KEY=000000000000000000000020000000000000000000000000 +CT=d3a3a62bc99f201eded9ea8c1ebe84b3 + +I=92 +KEY=000000000000000000000010000000000000000000000000 +CT=fc131ea2cfd76056fe0cb6f6322e514e + +I=93 +KEY=000000000000000000000008000000000000000000000000 +CT=92aec5acdbc80e93bb494565d6152683 + +I=94 +KEY=000000000000000000000004000000000000000000000000 +CT=2897ad37ac521cfbafee2d3cc49d5427 + +I=95 +KEY=000000000000000000000002000000000000000000000000 +CT=0a02072414040730d415d26f4c4f4e80 + +I=96 +KEY=000000000000000000000001000000000000000000000000 +CT=6f7fb8316285e5f39b2ddaedb8ec2fc5 + +I=97 +KEY=000000000000000000000000800000000000000000000000 +CT=77dbaaf18692980aa85d126a9b4a4726 + +I=98 +KEY=000000000000000000000000400000000000000000000000 +CT=5d0ae9ba98b4eab278222e08da5c9515 + +I=99 +KEY=000000000000000000000000200000000000000000000000 +CT=df65cdef8e09029d1eba45894d1e1904 + +I=100 +KEY=000000000000000000000000100000000000000000000000 +CT=9911f98f1f260c8f60e4e0c1801b84c1 + +I=101 +KEY=000000000000000000000000080000000000000000000000 +CT=974fb48c48cd2c4a3b19bb191ce3f37f + +I=102 +KEY=000000000000000000000000040000000000000000000000 +CT=43a52a7da3ebc9554fccacaabf02b42f + +I=103 +KEY=000000000000000000000000020000000000000000000000 +CT=0389dc8774b21120ece15cc270912897 + +I=104 +KEY=000000000000000000000000010000000000000000000000 +CT=4dd7be782da1dbd775ba298bc90dc63b + +I=105 +KEY=000000000000000000000000008000000000000000000000 +CT=6ea07ca0ddfcac58cfa211b4bde9c321 + +I=106 +KEY=000000000000000000000000004000000000000000000000 +CT=ba8829b1de058c4b48615d851fc74f17 + +I=107 +KEY=000000000000000000000000002000000000000000000000 +CT=22a6e18a3555867731c492d0c8717633 + +I=108 +KEY=000000000000000000000000001000000000000000000000 +CT=b68e5336ce0a364dbcbf4cae81e371d6 + +I=109 +KEY=000000000000000000000000000800000000000000000000 +CT=384427b8f008e2b31a904c532beb1599 + +I=110 +KEY=000000000000000000000000000400000000000000000000 +CT=84709b1ffbaba5397a9f133a0767b8cb + +I=111 +KEY=000000000000000000000000000200000000000000000000 +CT=7723e3a896d01b6b1f5340df029f7b48 + +I=112 +KEY=000000000000000000000000000100000000000000000000 +CT=68e0fe27173a8a85f7445414574d1d87 + +I=113 +KEY=000000000000000000000000000080000000000000000000 +CT=9b4788cbf0b56848101b3deb7a3a4656 + +I=114 +KEY=000000000000000000000000000040000000000000000000 +CT=852593f9947f166bf58eae7c9a00001a + +I=115 +KEY=000000000000000000000000000020000000000000000000 +CT=29be7cc59519fe143ef6319682de0bba + +I=116 +KEY=000000000000000000000000000010000000000000000000 +CT=3949b20d461f75274e87df21de5d62a0 + +I=117 +KEY=000000000000000000000000000008000000000000000000 +CT=db487555a81a86c1b726b917390b853a + +I=118 +KEY=000000000000000000000000000004000000000000000000 +CT=06b7908886620d9c9a0f3aedf235fb33 + +I=119 +KEY=000000000000000000000000000002000000000000000000 +CT=aa300793219c42fc41987f9bbf19b58e + +I=120 +KEY=000000000000000000000000000001000000000000000000 +CT=a49d34f3c92c7cdb71a48d17a4723697 + +I=121 +KEY=000000000000000000000000000000800000000000000000 +CT=093c1029c5eb09844c39dcb42a6ac5eb + +I=122 +KEY=000000000000000000000000000000400000000000000000 +CT=6a41993b586a37321a851455d80a3000 + +I=123 +KEY=000000000000000000000000000000200000000000000000 +CT=13574f75f33be868fa293a751411cb47 + +I=124 +KEY=000000000000000000000000000000100000000000000000 +CT=2b97b42b03879363bfa1587040246455 + +I=125 +KEY=000000000000000000000000000000080000000000000000 +CT=77b91d8da3f6eaa1713b543994c673c5 + +I=126 +KEY=000000000000000000000000000000040000000000000000 +CT=db664148b36b317331adc103bc680d57 + +I=127 +KEY=000000000000000000000000000000020000000000000000 +CT=375a6f5c49202d3a59bf429a9a77be2a + +I=128 +KEY=000000000000000000000000000000010000000000000000 +CT=dc7a7fb1247b60aead86ce0d898b647d + +I=129 +KEY=000000000000000000000000000000008000000000000000 +CT=345eb88a1d9bd2c5ddee04ac3923f08a + +I=130 +KEY=000000000000000000000000000000004000000000000000 +CT=2dba9b16738d1adc7d859b0ecd7d1cd1 + +I=131 +KEY=000000000000000000000000000000002000000000000000 +CT=4f48ebfcb17522ed2239191e520a967a + +I=132 +KEY=000000000000000000000000000000001000000000000000 +CT=b8c410bd14ad99cefd7428a3bc6f7e35 + +I=133 +KEY=000000000000000000000000000000000800000000000000 +CT=07f3715387341ce7b8325e824842c01a + +I=134 +KEY=000000000000000000000000000000000400000000000000 +CT=6812212678dc0a46f0b86b24b15b8a03 + +I=135 +KEY=000000000000000000000000000000000200000000000000 +CT=2e767244fc74c817f0789bb8943292ef + +I=136 +KEY=000000000000000000000000000000000100000000000000 +CT=01a32dd3f99dff43e110db0f2b88a819 + +I=137 +KEY=000000000000000000000000000000000080000000000000 +CT=5e81d0e1effcd9961bcd343696009839 + +I=138 +KEY=000000000000000000000000000000000040000000000000 +CT=129025e1728372901320b2fcff6d5b9b + +I=139 +KEY=000000000000000000000000000000000020000000000000 +CT=b3b3f7264dab71c2ca0febe44431b30d + +I=140 +KEY=000000000000000000000000000000000010000000000000 +CT=b9953f99bac2841911ab1c9caa7c98d7 + +I=141 +KEY=000000000000000000000000000000000008000000000000 +CT=dbaca3686bdfbe3d8c5e2e6b1db5577f + +I=142 +KEY=000000000000000000000000000000000004000000000000 +CT=1be312be1113ebac050bfcf37b0de85d + +I=143 +KEY=000000000000000000000000000000000002000000000000 +CT=f2a282d526d5432c476a112ef6162cbe + +I=144 +KEY=000000000000000000000000000000000001000000000000 +CT=d4ad15036534cfc7091be72117ed9a0d + +I=145 +KEY=000000000000000000000000000000000000800000000000 +CT=142ed387794e196f1b148ecba2e5062b + +I=146 +KEY=000000000000000000000000000000000000400000000000 +CT=761ea776ecf0bcf73d52013da09328fe + +I=147 +KEY=000000000000000000000000000000000000200000000000 +CT=f3513e388fd5c6111b2c11edbe568001 + +I=148 +KEY=000000000000000000000000000000000000100000000000 +CT=00f9e9822b79ee8c60edca082a9dd220 + +I=149 +KEY=000000000000000000000000000000000000080000000000 +CT=e8e0bf758a9e88242b31617e828647fb + +I=150 +KEY=000000000000000000000000000000000000040000000000 +CT=dead0d2f9480117270c95f860c9ffc81 + +I=151 +KEY=000000000000000000000000000000000000020000000000 +CT=56604fa1c8d7b258131f61beefa89b17 + +I=152 +KEY=000000000000000000000000000000000000010000000000 +CT=0fc45f51d2c185e667da0517f2a60955 + +I=153 +KEY=000000000000000000000000000000000000008000000000 +CT=192751977bff5834d51a9e81f448f19e + +I=154 +KEY=000000000000000000000000000000000000004000000000 +CT=26dd12ba453b5d54146c02d91f2e998b + +I=155 +KEY=000000000000000000000000000000000000002000000000 +CT=9b5c07141c98e441003fecf9c9311a2a + +I=156 +KEY=000000000000000000000000000000000000001000000000 +CT=e9494c80b90f1753a3689ab4ea258d66 + +I=157 +KEY=000000000000000000000000000000000000000800000000 +CT=8fb4ca5e0a62e4b5adeb7be7731085b0 + +I=158 +KEY=000000000000000000000000000000000000000400000000 +CT=5e29ae31cbbdc216e6d4adf274d47d0d + +I=159 +KEY=000000000000000000000000000000000000000200000000 +CT=cb173fb1cec206bef29a15b8ac72e919 + +I=160 +KEY=000000000000000000000000000000000000000100000000 +CT=9f35799a7d5dab723493eb92af1c18d3 + +I=161 +KEY=000000000000000000000000000000000000000080000000 +CT=f495f5658d888139913df0d3cf048baa + +I=162 +KEY=000000000000000000000000000000000000000040000000 +CT=e92daa5d108115d6f242f544e6ea72c9 + +I=163 +KEY=000000000000000000000000000000000000000020000000 +CT=c0ea8a7652bfc6cf81a5c46da38d2840 + +I=164 +KEY=000000000000000000000000000000000000000010000000 +CT=a221dece41a3a28cfc9d58e74cbd6014 + +I=165 +KEY=000000000000000000000000000000000000000008000000 +CT=369dec7982b167b3f0f98a5e393d5e41 + +I=166 +KEY=000000000000000000000000000000000000000004000000 +CT=b14d25d008a846a0768e394b751b8452 + +I=167 +KEY=000000000000000000000000000000000000000002000000 +CT=ac516cd4467bda2ad6da18bf202e8ce2 + +I=168 +KEY=000000000000000000000000000000000000000001000000 +CT=a82c0be53acb86f86692c1ead49acfea + +I=169 +KEY=000000000000000000000000000000000000000000800000 +CT=05548475ba322605dfc3ad55707a0539 + +I=170 +KEY=000000000000000000000000000000000000000000400000 +CT=173639d0c531a19ec3cb8f4891b23706 + +I=171 +KEY=000000000000000000000000000000000000000000200000 +CT=79febf394be1b8afb954c791a5eaa653 + +I=172 +KEY=000000000000000000000000000000000000000000100000 +CT=8e009de1f46674d9bac9d36f4fd29daf + +I=173 +KEY=000000000000000000000000000000000000000000080000 +CT=9212a730377098bdb34645b8db9f6c6f + +I=174 +KEY=000000000000000000000000000000000000000000040000 +CT=c586abec28a5e252ed99934117d9dc00 + +I=175 +KEY=000000000000000000000000000000000000000000020000 +CT=416c7812ce8049a70965f9cba27d07dc + +I=176 +KEY=000000000000000000000000000000000000000000010000 +CT=7819c9eff656380d997f50779f75ddaa + +I=177 +KEY=000000000000000000000000000000000000000000008000 +CT=f9a6b55b40c1c6f9ce21e07cefd14839 + +I=178 +KEY=000000000000000000000000000000000000000000004000 +CT=3c70be049ad5f70660cdfd4738c88a5b + +I=179 +KEY=000000000000000000000000000000000000000000002000 +CT=774ebef1e5916cd2bcfd70a3b647637f + +I=180 +KEY=000000000000000000000000000000000000000000001000 +CT=4087268a3bea1b020f4f0ff6cec88d3d + +I=181 +KEY=000000000000000000000000000000000000000000000800 +CT=005b7c9abf6dd5cbd3fad77bc09fbac9 + +I=182 +KEY=000000000000000000000000000000000000000000000400 +CT=0d45f3c58653e1c4f0328e8b760d668b + +I=183 +KEY=000000000000000000000000000000000000000000000200 +CT=9eb8ce9db6a787f32abd31365f67159a + +I=184 +KEY=000000000000000000000000000000000000000000000100 +CT=9ac89d752faa132d66d5fe92e4783989 + +I=185 +KEY=000000000000000000000000000000000000000000000080 +CT=89266048a5fcfc1eb27b739bad4e279e + +I=186 +KEY=000000000000000000000000000000000000000000000040 +CT=82aeb3e765f31b046ae49903518efc92 + +I=187 +KEY=000000000000000000000000000000000000000000000020 +CT=707df5c6fd03a2de93d46ac486a30d5e + +I=188 +KEY=000000000000000000000000000000000000000000000010 +CT=beb9bf4ecbf6875d1e72cf2478e3c1be + +I=189 +KEY=000000000000000000000000000000000000000000000008 +CT=144226cc1aeffe130c8dbb91f8797a25 + +I=190 +KEY=000000000000000000000000000000000000000000000004 +CT=b7b8c1114487a380ffb64ca05bdd3e8b + +I=191 +KEY=000000000000000000000000000000000000000000000002 +CT=2c5eb11071ee2d0b2351e16aa93ec873 + +I=192 +KEY=000000000000000000000000000000000000000000000001 +CT=0f61ac094954e286bcc90288fc62bd0a + +========== + +KEYSIZE=256 + +PT=00000000000000000000000000000000 + +I=1 +KEY=8000000000000000000000000000000000000000000000000000000000000000 +CT=abed96e766bf28cbc0ebd21a82ef0819 + +I=2 +KEY=4000000000000000000000000000000000000000000000000000000000000000 +CT=959658cdfcd80356dde045bbe7b1888d + +I=3 +KEY=2000000000000000000000000000000000000000000000000000000000000000 +CT=04d49cc0fae714b46b5b177664df4c28 + +I=4 +KEY=1000000000000000000000000000000000000000000000000000000000000000 +CT=39f1b1a339ded740d80b663a057d4866 + +I=5 +KEY=0800000000000000000000000000000000000000000000000000000000000000 +CT=df15b01e30cf9c81688f989809579a86 + +I=6 +KEY=0400000000000000000000000000000000000000000000000000000000000000 +CT=9db98fdedb783247d6af34f7579d89f6 + +I=7 +KEY=0200000000000000000000000000000000000000000000000000000000000000 +CT=fc41583a46c0f673c82bd63be56c72a6 + +I=8 +KEY=0100000000000000000000000000000000000000000000000000000000000000 +CT=34ed2423c59cc9c04ab5c6c931fd5898 + +I=9 +KEY=0080000000000000000000000000000000000000000000000000000000000000 +CT=8432a8062a2aaef13171209ec5dded82 + +I=10 +KEY=0040000000000000000000000000000000000000000000000000000000000000 +CT=c632e81cbb67020f6cfb9062f7a9171c + +I=11 +KEY=0020000000000000000000000000000000000000000000000000000000000000 +CT=c706ee8ed28ea73f32b2efc95c41d66d + +I=12 +KEY=0010000000000000000000000000000000000000000000000000000000000000 +CT=4b1a9b43530384e0b095e924a401fd48 + +I=13 +KEY=0008000000000000000000000000000000000000000000000000000000000000 +CT=89404af86981af4ddaa800424c9c132b + +I=14 +KEY=0004000000000000000000000000000000000000000000000000000000000000 +CT=170594ac5052d7c192f581e1000a7e0d + +I=15 +KEY=0002000000000000000000000000000000000000000000000000000000000000 +CT=1e3970ea40cb25bcede878f627d35092 + +I=16 +KEY=0001000000000000000000000000000000000000000000000000000000000000 +CT=10c2b5f2de944c7b1cb5fc21945d714d + +I=17 +KEY=0000800000000000000000000000000000000000000000000000000000000000 +CT=2f3e64eaf25b990300e0ce75ec5ddd19 + +I=18 +KEY=0000400000000000000000000000000000000000000000000000000000000000 +CT=4f6c152d9df44abce9b18a765a0175bb + +I=19 +KEY=0000200000000000000000000000000000000000000000000000000000000000 +CT=2e861155411717b16c60fb9eb0e1ef46 + +I=20 +KEY=0000100000000000000000000000000000000000000000000000000000000000 +CT=ce0449630e05e22eaeec4499f4020d36 + +I=21 +KEY=0000080000000000000000000000000000000000000000000000000000000000 +CT=862de372c7497defe2b639359707e293 + +I=22 +KEY=0000040000000000000000000000000000000000000000000000000000000000 +CT=6119f054d0f45711d06bed281d48712e + +I=23 +KEY=0000020000000000000000000000000000000000000000000000000000000000 +CT=74978fc86fb0e92c2601a58681eb06ac + +I=24 +KEY=0000010000000000000000000000000000000000000000000000000000000000 +CT=35031cbf461d8df3b4c946c9dcc54ca9 + +I=25 +KEY=0000008000000000000000000000000000000000000000000000000000000000 +CT=dd2fb08b5b4bbcd07bd70453da57a417 + +I=26 +KEY=0000004000000000000000000000000000000000000000000000000000000000 +CT=7e841efe450c947ece8ea3456c6bdfb6 + +I=27 +KEY=0000002000000000000000000000000000000000000000000000000000000000 +CT=bf2e9008e158a8ed760a304d465edb83 + +I=28 +KEY=0000001000000000000000000000000000000000000000000000000000000000 +CT=78d223b7577b97c57d41f7a9aa67fbc7 + +I=29 +KEY=0000000800000000000000000000000000000000000000000000000000000000 +CT=982171d6e83e59b519741c29d21fd21d + +I=30 +KEY=0000000400000000000000000000000000000000000000000000000000000000 +CT=e8f80fe26ab8942b8c884bdfef37e3a2 + +I=31 +KEY=0000000200000000000000000000000000000000000000000000000000000000 +CT=9daabac1e9699a951db64db0ea0ff761 + +I=32 +KEY=0000000100000000000000000000000000000000000000000000000000000000 +CT=eae7ed73f898a19411b8d08f71c5c66f + +I=33 +KEY=0000000080000000000000000000000000000000000000000000000000000000 +CT=7e20e6a88a263f8adad3a8813524dbdf + +I=34 +KEY=0000000040000000000000000000000000000000000000000000000000000000 +CT=6cd1bfcb283a3531c830082153865a96 + +I=35 +KEY=0000000020000000000000000000000000000000000000000000000000000000 +CT=182b87a0094e36ab50cc26c12f2d44e3 + +I=36 +KEY=0000000010000000000000000000000000000000000000000000000000000000 +CT=af7c418e585d5ffc2966ae7f4ebc61b2 + +I=37 +KEY=0000000008000000000000000000000000000000000000000000000000000000 +CT=dd136237150e9bd819d19f84ac180294 + +I=38 +KEY=0000000004000000000000000000000000000000000000000000000000000000 +CT=5bd17b54d6878b398d8cedb08ce67dc0 + +I=39 +KEY=0000000002000000000000000000000000000000000000000000000000000000 +CT=fef8c88ea06c5a0aa3efb1dce54541f1 + +I=40 +KEY=0000000001000000000000000000000000000000000000000000000000000000 +CT=a8c35caf2d91a05408b171b960cd084d + +I=41 +KEY=0000000000800000000000000000000000000000000000000000000000000000 +CT=4bdf0294712fcd25975fbc084f6cc973 + +I=42 +KEY=0000000000400000000000000000000000000000000000000000000000000000 +CT=e5f0bb96b46ac2c2413022e9d7f38a48 + +I=43 +KEY=0000000000200000000000000000000000000000000000000000000000000000 +CT=dd6732cd14961e4e42c3ce0ea83850cd + +I=44 +KEY=0000000000100000000000000000000000000000000000000000000000000000 +CT=590e7b58c1963e45c5bb60a576378dc3 + +I=45 +KEY=0000000000080000000000000000000000000000000000000000000000000000 +CT=69f5d841ad99f218fcb89521d1165484 + +I=46 +KEY=0000000000040000000000000000000000000000000000000000000000000000 +CT=c236007a7a244d2364075279bbd3b307 + +I=47 +KEY=0000000000020000000000000000000000000000000000000000000000000000 +CT=7ce8d07c90029b2253133a4b941668bd + +I=48 +KEY=0000000000010000000000000000000000000000000000000000000000000000 +CT=af3ebebfb4e37c7d22226101d27c54cc + +I=49 +KEY=0000000000008000000000000000000000000000000000000000000000000000 +CT=532e1616fa8ee2853aed696920e1f23c + +I=50 +KEY=0000000000004000000000000000000000000000000000000000000000000000 +CT=e332c5955575f799b05b02976fb41d80 + +I=51 +KEY=0000000000002000000000000000000000000000000000000000000000000000 +CT=791da10535733bf5d4b9706d5af92243 + +I=52 +KEY=0000000000001000000000000000000000000000000000000000000000000000 +CT=cd5eb5936eb10eb78432478eed00a2d1 + +I=53 +KEY=0000000000000800000000000000000000000000000000000000000000000000 +CT=074280068f0cf9b8632959989d87b1aa + +I=54 +KEY=0000000000000400000000000000000000000000000000000000000000000000 +CT=a37c95a3c73592d03de7b645536221e2 + +I=55 +KEY=0000000000000200000000000000000000000000000000000000000000000000 +CT=b969cca153bb861999da020e3255b002 + +I=56 +KEY=0000000000000100000000000000000000000000000000000000000000000000 +CT=c9b0ce3c773d5e16062c7b0017b1a1fc + +I=57 +KEY=0000000000000080000000000000000000000000000000000000000000000000 +CT=fd38f1a2db8d38559c7ccad15d0e3e85 + +I=58 +KEY=0000000000000040000000000000000000000000000000000000000000000000 +CT=fb6c3f215a5c11976576bde1d5c59169 + +I=59 +KEY=0000000000000020000000000000000000000000000000000000000000000000 +CT=92350faab64bba4a84cc16683c7a0d4e + +I=60 +KEY=0000000000000010000000000000000000000000000000000000000000000000 +CT=ecec6570c11fcacec3af112e2ff2931a + +I=61 +KEY=0000000000000008000000000000000000000000000000000000000000000000 +CT=e7cb6e1dfe6da642b9e5856e98f91915 + +I=62 +KEY=0000000000000004000000000000000000000000000000000000000000000000 +CT=3a5f963f0c2dbd81d9c1f663233f582b + +I=63 +KEY=0000000000000002000000000000000000000000000000000000000000000000 +CT=3b560746eb55e71ce00b9544faeb2fe9 + +I=64 +KEY=0000000000000001000000000000000000000000000000000000000000000000 +CT=42046b25c85dbd6b402b296a97ef83a5 + +I=65 +KEY=0000000000000000800000000000000000000000000000000000000000000000 +CT=9c7d38da9dccad1bc3c16bca0ba4d808 + +I=66 +KEY=0000000000000000400000000000000000000000000000000000000000000000 +CT=5c3fa08c807c5210e0faeb4b67c902f5 + +I=67 +KEY=0000000000000000200000000000000000000000000000000000000000000000 +CT=388834b1138b8cc182b9a24d18575de8 + +I=68 +KEY=0000000000000000100000000000000000000000000000000000000000000000 +CT=cee14aa1bd42dca608bfed10acff716e + +I=69 +KEY=0000000000000000080000000000000000000000000000000000000000000000 +CT=6a03f9523ff9ec178a5d8448ee7b2d0f + +I=70 +KEY=0000000000000000040000000000000000000000000000000000000000000000 +CT=669f77ed3196867e9faf60565711c8cb + +I=71 +KEY=0000000000000000020000000000000000000000000000000000000000000000 +CT=178ed0cacf39d5eb031afb65b005e4f7 + +I=72 +KEY=0000000000000000010000000000000000000000000000000000000000000000 +CT=4a7fc4ff3fec7dce25472c2e8b457208 + +I=73 +KEY=0000000000000000008000000000000000000000000000000000000000000000 +CT=87fd250d814d84ecb6a065a8250fdf18 + +I=74 +KEY=0000000000000000004000000000000000000000000000000000000000000000 +CT=637c3e8200e21b8c7e5e119659dbd635 + +I=75 +KEY=0000000000000000002000000000000000000000000000000000000000000000 +CT=47ad826682ec4b03924d22de4918eacd + +I=76 +KEY=0000000000000000001000000000000000000000000000000000000000000000 +CT=a3ab5728256056198cc2b73d92b14373 + +I=77 +KEY=0000000000000000000800000000000000000000000000000000000000000000 +CT=1629dc7684f194c15f5e855243a72ff0 + +I=78 +KEY=0000000000000000000400000000000000000000000000000000000000000000 +CT=fe2f18ce7947084f7840d30d49fbcaad + +I=79 +KEY=0000000000000000000200000000000000000000000000000000000000000000 +CT=9009b9a658ec414872af1bb0347ee30c + +I=80 +KEY=0000000000000000000100000000000000000000000000000000000000000000 +CT=b09928f5fb282a0b99de6eba2d7877a5 + +I=81 +KEY=0000000000000000000080000000000000000000000000000000000000000000 +CT=4e619867dbbcaea296e10fa8555ebde5 + +I=82 +KEY=0000000000000000000040000000000000000000000000000000000000000000 +CT=1d4ceafa69284d2d1cf56eb9d3f4d3da + +I=83 +KEY=0000000000000000000020000000000000000000000000000000000000000000 +CT=7ab218e774099540500548c17d4be628 + +I=84 +KEY=0000000000000000000010000000000000000000000000000000000000000000 +CT=54b7afb791f374fefd54897be6b5c908 + +I=85 +KEY=0000000000000000000008000000000000000000000000000000000000000000 +CT=9099027805d50c43a70374102895a79c + +I=86 +KEY=0000000000000000000004000000000000000000000000000000000000000000 +CT=7c651cfc911bf96e0b606ee3ca04a145 + +I=87 +KEY=0000000000000000000002000000000000000000000000000000000000000000 +CT=be1fa13657e2ef57cc7a5e265794cfd9 + +I=88 +KEY=0000000000000000000001000000000000000000000000000000000000000000 +CT=f8ec20959d0efaa529d1384de88addd1 + +I=89 +KEY=0000000000000000000000800000000000000000000000000000000000000000 +CT=be1f71467e549cdc3d24d6722673fb43 + +I=90 +KEY=0000000000000000000000400000000000000000000000000000000000000000 +CT=c34f0989edeb49c9125c8185d72e62a2 + +I=91 +KEY=0000000000000000000000200000000000000000000000000000000000000000 +CT=d8124193ed6e4e2b69945dca643bb9fb + +I=92 +KEY=0000000000000000000000100000000000000000000000000000000000000000 +CT=97ef94fa4c866d88c44b3d58ff8136cd + +I=93 +KEY=0000000000000000000000080000000000000000000000000000000000000000 +CT=0eb5f6ff1d75645292aea192e03ced37 + +I=94 +KEY=0000000000000000000000040000000000000000000000000000000000000000 +CT=1a55bea7371ea49069ac73348305a33c + +I=95 +KEY=0000000000000000000000020000000000000000000000000000000000000000 +CT=bfda5f26889f30b13d4ba05303ecf8ce + +I=96 +KEY=0000000000000000000000010000000000000000000000000000000000000000 +CT=c5718a9b347ed13a969bbb93423ac251 + +I=97 +KEY=0000000000000000000000008000000000000000000000000000000000000000 +CT=3543719280f21dcc88b31d906dd924b3 + +I=98 +KEY=0000000000000000000000004000000000000000000000000000000000000000 +CT=8daaabd85ebf091e8aa2052313f872e5 + +I=99 +KEY=0000000000000000000000002000000000000000000000000000000000000000 +CT=eee34ebf694065e99721990939b6cbe4 + +I=100 +KEY=0000000000000000000000001000000000000000000000000000000000000000 +CT=24b6b069385cf3dfea203a5b95dfb114 + +I=101 +KEY=0000000000000000000000000800000000000000000000000000000000000000 +CT=fc594972c7955c07e2393f22a619904d + +I=102 +KEY=0000000000000000000000000400000000000000000000000000000000000000 +CT=473d28bca0b356021fc516f3e6a55253 + +I=103 +KEY=0000000000000000000000000200000000000000000000000000000000000000 +CT=fd2cba4c24c0d02535198851d50d579f + +I=104 +KEY=0000000000000000000000000100000000000000000000000000000000000000 +CT=32515fac86315a2586d76a62ea6f201b + +I=105 +KEY=0000000000000000000000000080000000000000000000000000000000000000 +CT=644eff865f7c1f854261b11c2a8e07d7 + +I=106 +KEY=0000000000000000000000000040000000000000000000000000000000000000 +CT=9cd938a4d83df05dad1d70c6ea74d1fe + +I=107 +KEY=0000000000000000000000000020000000000000000000000000000000000000 +CT=f69af279f30363c234310eb4fea51291 + +I=108 +KEY=0000000000000000000000000010000000000000000000000000000000000000 +CT=db9b673ca99514f7953f18acc5c390b1 + +I=109 +KEY=0000000000000000000000000008000000000000000000000000000000000000 +CT=a872107c5116e36a75b7dbee56c47757 + +I=110 +KEY=0000000000000000000000000004000000000000000000000000000000000000 +CT=dbae7a1d2fcfc6ddd2f911af0f905055 + +I=111 +KEY=0000000000000000000000000002000000000000000000000000000000000000 +CT=5257eed79149f2a064dfaf163e01e3bd + +I=112 +KEY=0000000000000000000000000001000000000000000000000000000000000000 +CT=242fc696e8271727615914b4210f5071 + +I=113 +KEY=0000000000000000000000000000800000000000000000000000000000000000 +CT=8d9ff3a56ab97fdfb5bab64fe4a81c80 + +I=114 +KEY=0000000000000000000000000000400000000000000000000000000000000000 +CT=bf2254e8f9abd0013367728f9e16b59e + +I=115 +KEY=0000000000000000000000000000200000000000000000000000000000000000 +CT=8b91a39c085f3505949e4f14747e37cb + +I=116 +KEY=0000000000000000000000000000100000000000000000000000000000000000 +CT=09abf7df68f01db2ae5d526e9e2ee81e + +I=117 +KEY=0000000000000000000000000000080000000000000000000000000000000000 +CT=eb2502774a32f36cc1594617dddd1663 + +I=118 +KEY=0000000000000000000000000000040000000000000000000000000000000000 +CT=ad263ae59f0d719234cfa1c77e717ce1 + +I=119 +KEY=0000000000000000000000000000020000000000000000000000000000000000 +CT=c9d2d1eed4f8e1b4d05d897c9f1e5f67 + +I=120 +KEY=0000000000000000000000000000010000000000000000000000000000000000 +CT=16ff204fb3031451731de91fde5a6b44 + +I=121 +KEY=0000000000000000000000000000008000000000000000000000000000000000 +CT=eb5d9352b3615c55e895550b497191c1 + +I=122 +KEY=0000000000000000000000000000004000000000000000000000000000000000 +CT=a88f3176c389ae8f406364e67b9e1557 + +I=123 +KEY=0000000000000000000000000000002000000000000000000000000000000000 +CT=09bed1aed5eee6b077797b6cb31b44c2 + +I=124 +KEY=0000000000000000000000000000001000000000000000000000000000000000 +CT=0be7804beb8204cea6f59fe55132a363 + +I=125 +KEY=0000000000000000000000000000000800000000000000000000000000000000 +CT=54b00567b36ea41d04e8e877ead25944 + +I=126 +KEY=0000000000000000000000000000000400000000000000000000000000000000 +CT=293cb655ee6ac5a4c1c2cc31f5696ae7 + +I=127 +KEY=0000000000000000000000000000000200000000000000000000000000000000 +CT=22380e8215ec5f116f04311c267ce997 + +I=128 +KEY=0000000000000000000000000000000100000000000000000000000000000000 +CT=e9ba668276b81896d093a9e67ab12036 + +I=129 +KEY=0000000000000000000000000000000080000000000000000000000000000000 +CT=34c79f703a62b02e6790efbbbeb07241 + +I=130 +KEY=0000000000000000000000000000000040000000000000000000000000000000 +CT=bfc96d59ae31369b0618fd78fc295826 + +I=131 +KEY=0000000000000000000000000000000020000000000000000000000000000000 +CT=f811a6558ce7a67bd3280ee4e3259be8 + +I=132 +KEY=0000000000000000000000000000000010000000000000000000000000000000 +CT=8c8205692ab866bcf965dd61d595bf8e + +I=133 +KEY=0000000000000000000000000000000008000000000000000000000000000000 +CT=098a85e6ca58293bd2298c07f86a8f8c + +I=134 +KEY=0000000000000000000000000000000004000000000000000000000000000000 +CT=2801da2be78057706abafaab8226fa39 + +I=135 +KEY=0000000000000000000000000000000002000000000000000000000000000000 +CT=500796a8bccee9141ab21282d6c912a8 + +I=136 +KEY=0000000000000000000000000000000001000000000000000000000000000000 +CT=80cbe789099bdf0140da3ac157d7bf47 + +I=137 +KEY=0000000000000000000000000000000000800000000000000000000000000000 +CT=8ce81e5dea464efaf01b3da5a6da5aa9 + +I=138 +KEY=0000000000000000000000000000000000400000000000000000000000000000 +CT=4aec37a4ef16b38bcdba0b01051803d1 + +I=139 +KEY=0000000000000000000000000000000000200000000000000000000000000000 +CT=e6a2f6431269aa02c93793af80436a7b + +I=140 +KEY=0000000000000000000000000000000000100000000000000000000000000000 +CT=4aa9046b1fb69a6abcb8f3351d75efbd + +I=141 +KEY=0000000000000000000000000000000000080000000000000000000000000000 +CT=66b8c45fe8c254088d62d307edb9cf51 + +I=142 +KEY=0000000000000000000000000000000000040000000000000000000000000000 +CT=fddcfb5c4da597b9d887e03b8337da0c + +I=143 +KEY=0000000000000000000000000000000000020000000000000000000000000000 +CT=69042f478d87f8b6e0d149216f2e8d93 + +I=144 +KEY=0000000000000000000000000000000000010000000000000000000000000000 +CT=ad8f00cdace047f3225a235fc2b05738 + +I=145 +KEY=0000000000000000000000000000000000008000000000000000000000000000 +CT=6a624c0f16aaa6cd4995e01988deaa3b + +I=146 +KEY=0000000000000000000000000000000000004000000000000000000000000000 +CT=7d8f824eaa7dd1657a0f59a2f27b5e0f + +I=147 +KEY=0000000000000000000000000000000000002000000000000000000000000000 +CT=7015d246b39a995c11b409485e100b51 + +I=148 +KEY=0000000000000000000000000000000000001000000000000000000000000000 +CT=cad1a2944343525c2b9da630937cf40f + +I=149 +KEY=0000000000000000000000000000000000000800000000000000000000000000 +CT=c7f24334553fe63c4ab2f3ffbf0183ab + +I=150 +KEY=0000000000000000000000000000000000000400000000000000000000000000 +CT=bf2da14eea8055f51636984e51f4a349 + +I=151 +KEY=0000000000000000000000000000000000000200000000000000000000000000 +CT=c424de5973035fad65d99e27a2ae07c0 + +I=152 +KEY=0000000000000000000000000000000000000100000000000000000000000000 +CT=3ed7b674bcedb60523386119e2cb5fbe + +I=153 +KEY=0000000000000000000000000000000000000080000000000000000000000000 +CT=f0bed60941174023ae4d07e7deb23d5f + +I=154 +KEY=0000000000000000000000000000000000000040000000000000000000000000 +CT=159a9d7e5a210dad034ea2e50cbc30e5 + +I=155 +KEY=0000000000000000000000000000000000000020000000000000000000000000 +CT=695724e11b4cea84603f935571a1f5ff + +I=156 +KEY=0000000000000000000000000000000000000010000000000000000000000000 +CT=788ac03153fad14a7a3f8322543dca64 + +I=157 +KEY=0000000000000000000000000000000000000008000000000000000000000000 +CT=1964e04df808496e530e6ab5f2182ce4 + +I=158 +KEY=0000000000000000000000000000000000000004000000000000000000000000 +CT=18a056a20724416b3ebe7f88743d8297 + +I=159 +KEY=0000000000000000000000000000000000000002000000000000000000000000 +CT=dd28593d13343349ab120f2667441d8a + +I=160 +KEY=0000000000000000000000000000000000000001000000000000000000000000 +CT=a0bf14c7d0e3336d4cd5b2b1b47f5e73 + +I=161 +KEY=0000000000000000000000000000000000000000800000000000000000000000 +CT=d467c69d25a1a02481a2e3508d014bad + +I=162 +KEY=0000000000000000000000000000000000000000400000000000000000000000 +CT=3115ecf100476954f6c185250aa099c8 + +I=163 +KEY=0000000000000000000000000000000000000000200000000000000000000000 +CT=6d1be89c5f75270a366e6dcfcf3de5ba + +I=164 +KEY=0000000000000000000000000000000000000000100000000000000000000000 +CT=4d1686baa1be780736c35914731c186e + +I=165 +KEY=0000000000000000000000000000000000000000080000000000000000000000 +CT=3c5db56a9a87347b5a804560dd2dfd97 + +I=166 +KEY=0000000000000000000000000000000000000000040000000000000000000000 +CT=24813b7d9043df69980def2dc0617d54 + +I=167 +KEY=0000000000000000000000000000000000000000020000000000000000000000 +CT=5751c2eb5dd14d8823c714fc4475459e + +I=168 +KEY=0000000000000000000000000000000000000000010000000000000000000000 +CT=5b750ced85b4169116cf4e93c37e76e0 + +I=169 +KEY=0000000000000000000000000000000000000000008000000000000000000000 +CT=4ebaddc62d252e4028bbddf02807b3b4 + +I=170 +KEY=0000000000000000000000000000000000000000004000000000000000000000 +CT=216204523a32b2dcfc612be2d974b0dd + +I=171 +KEY=0000000000000000000000000000000000000000002000000000000000000000 +CT=fe995e0532b897921552c7cefebbab91 + +I=172 +KEY=0000000000000000000000000000000000000000001000000000000000000000 +CT=354c096b0477ecb122c25c61f85e4125 + +I=173 +KEY=0000000000000000000000000000000000000000000800000000000000000000 +CT=81b0c7e94e8426f4f227fa23ee5618c1 + +I=174 +KEY=0000000000000000000000000000000000000000000400000000000000000000 +CT=85c91b3e8e1dd2dac0cd310f69286f5e + +I=175 +KEY=0000000000000000000000000000000000000000000200000000000000000000 +CT=db3c6cce550a8c72f67f59ab1b272d71 + +I=176 +KEY=0000000000000000000000000000000000000000000100000000000000000000 +CT=4fae77cd8c5fbf1a7ab49785947c564a + +I=177 +KEY=0000000000000000000000000000000000000000000080000000000000000000 +CT=986d08049ce14579b756c250ad68d56e + +I=178 +KEY=0000000000000000000000000000000000000000000040000000000000000000 +CT=a9bb29db295e7364e65f687c418f39f2 + +I=179 +KEY=0000000000000000000000000000000000000000000020000000000000000000 +CT=d425810268f0bec64400911d990bd237 + +I=180 +KEY=0000000000000000000000000000000000000000000010000000000000000000 +CT=621910144f7cd3432b0663ed18137235 + +I=181 +KEY=0000000000000000000000000000000000000000000008000000000000000000 +CT=a45cafd42aa19e21a7cc83d4a504a074 + +I=182 +KEY=0000000000000000000000000000000000000000000004000000000000000000 +CT=6cb51ae713730353acd21906a8a8cebb + +I=183 +KEY=0000000000000000000000000000000000000000000002000000000000000000 +CT=b12b97ba267a9ccdd65cef0f4c436e64 + +I=184 +KEY=0000000000000000000000000000000000000000000001000000000000000000 +CT=2711d87a5b1d5011e616975ef6d32a8f + +I=185 +KEY=0000000000000000000000000000000000000000000000800000000000000000 +CT=2911f90a41b56f53e0cafffc3923c0bc + +I=186 +KEY=0000000000000000000000000000000000000000000000400000000000000000 +CT=beb86799fcc846a7121209dcb2026add + +I=187 +KEY=0000000000000000000000000000000000000000000000200000000000000000 +CT=b9b5317d691bbef913c925e226fdb94b + +I=188 +KEY=0000000000000000000000000000000000000000000000100000000000000000 +CT=cc333ef43909a98cd6a0da7043ac3b2a + +I=189 +KEY=0000000000000000000000000000000000000000000000080000000000000000 +CT=0291cc086e364c94fdb5250e07f17685 + +I=190 +KEY=0000000000000000000000000000000000000000000000040000000000000000 +CT=d98abd571faebeaece0d65d17ac320e6 + +I=191 +KEY=0000000000000000000000000000000000000000000000020000000000000000 +CT=dd6bb22de6b4caea4e56cb09d2ec6177 + +I=192 +KEY=0000000000000000000000000000000000000000000000010000000000000000 +CT=b6bb4f3f2ae83fe4a07ba5f10c3fd267 + +I=193 +KEY=0000000000000000000000000000000000000000000000008000000000000000 +CT=8c590b173aa66854937f5e05e22c73d9 + +I=194 +KEY=0000000000000000000000000000000000000000000000004000000000000000 +CT=bdb4f7428f37c024df2af13a6296f3e9 + +I=195 +KEY=0000000000000000000000000000000000000000000000002000000000000000 +CT=51d5c74df6f71c146c835ae145aed598 + +I=196 +KEY=0000000000000000000000000000000000000000000000001000000000000000 +CT=b8b86c7a65adb388d047bdd756edfbee + +I=197 +KEY=0000000000000000000000000000000000000000000000000800000000000000 +CT=084e0d8cfcfb7ad95019336fc94293a9 + +I=198 +KEY=0000000000000000000000000000000000000000000000000400000000000000 +CT=516ea8aae87eee2b4f22a1c09852c325 + +I=199 +KEY=0000000000000000000000000000000000000000000000000200000000000000 +CT=8030de81cd83227b63b2841fd72f6066 + +I=200 +KEY=0000000000000000000000000000000000000000000000000100000000000000 +CT=c09fd5e5c061b14dfa78d90f67458ed4 + +I=201 +KEY=0000000000000000000000000000000000000000000000000080000000000000 +CT=4cc791c47060fb666a86f60b6289e0ec + +I=202 +KEY=0000000000000000000000000000000000000000000000000040000000000000 +CT=fec1a2f79535ffa094ecd4720030cd36 + +I=203 +KEY=0000000000000000000000000000000000000000000000000020000000000000 +CT=28d2784e2364f10096b516833dcb39f9 + +I=204 +KEY=0000000000000000000000000000000000000000000000000010000000000000 +CT=04d2f725d569186682e209608e25c617 + +I=205 +KEY=0000000000000000000000000000000000000000000000000008000000000000 +CT=087395ef3b31e6a948e5e2a35e2ca345 + +I=206 +KEY=0000000000000000000000000000000000000000000000000004000000000000 +CT=6351fd25f8a06beceb244026c65c10c2 + +I=207 +KEY=0000000000000000000000000000000000000000000000000002000000000000 +CT=3c61acc4a77da654cda7839816d2f385 + +I=208 +KEY=0000000000000000000000000000000000000000000000000001000000000000 +CT=c660a12d18c94d0f5c81a22ed9c7ffb5 + +I=209 +KEY=0000000000000000000000000000000000000000000000000000800000000000 +CT=1f01ebc6151c8f3ea70c423f4e2c64c9 + +I=210 +KEY=0000000000000000000000000000000000000000000000000000400000000000 +CT=5e1231b72071ce574dfbbe66f5eed01b + +I=211 +KEY=0000000000000000000000000000000000000000000000000000200000000000 +CT=da025263d62d201cad37b53dae0507cb + +I=212 +KEY=0000000000000000000000000000000000000000000000000000100000000000 +CT=1600c5e3a94b0b44a8be99c5da558fd8 + +I=213 +KEY=0000000000000000000000000000000000000000000000000000080000000000 +CT=dfef4c129ba77381194046afc87e22ff + +I=214 +KEY=0000000000000000000000000000000000000000000000000000040000000000 +CT=5a39e491cca9abe1f1436008f4a455cc + +I=215 +KEY=0000000000000000000000000000000000000000000000000000020000000000 +CT=57a5d924b055186029a2656898ad2b8d + +I=216 +KEY=0000000000000000000000000000000000000000000000000000010000000000 +CT=f7f0d88f13ee760300aced0f001b3e34 + +I=217 +KEY=0000000000000000000000000000000000000000000000000000008000000000 +CT=924b4d0d4a88e669910cd9b890f25d76 + +I=218 +KEY=0000000000000000000000000000000000000000000000000000004000000000 +CT=8168c47238ef6f1994bfcef5b9baeef9 + +I=219 +KEY=0000000000000000000000000000000000000000000000000000002000000000 +CT=b6a59008e7267eb5f5492e2283198b31 + +I=220 +KEY=0000000000000000000000000000000000000000000000000000001000000000 +CT=c706d911f2f7ac8372984c60980adfd8 + +I=221 +KEY=0000000000000000000000000000000000000000000000000000000800000000 +CT=0bde9a2a1364784d2d2da743f77c6992 + +I=222 +KEY=0000000000000000000000000000000000000000000000000000000400000000 +CT=b3bd8ce8da0d939fb59caacd8b0c452c + +I=223 +KEY=0000000000000000000000000000000000000000000000000000000200000000 +CT=4327b8cb4a6015ff9df50a4a5ca08442 + +I=224 +KEY=0000000000000000000000000000000000000000000000000000000100000000 +CT=89f64377bf1e8a46c8247044e8056a98 + +I=225 +KEY=0000000000000000000000000000000000000000000000000000000080000000 +CT=31028ff4ed7a98d2d4f72615445d7e4a + +I=226 +KEY=0000000000000000000000000000000000000000000000000000000040000000 +CT=f5e331d2036713649c8c15705a87d9f5 + +I=227 +KEY=0000000000000000000000000000000000000000000000000000000020000000 +CT=d1dca9bb950823af5a4be2fbc52ec83b + +I=228 +KEY=0000000000000000000000000000000000000000000000000000000010000000 +CT=0951a1ddbf1f268d786c7233af62f0ef + +I=229 +KEY=0000000000000000000000000000000000000000000000000000000008000000 +CT=aa23686541d98309973f3d68e242a3e2 + +I=230 +KEY=0000000000000000000000000000000000000000000000000000000004000000 +CT=ad69fca1d17ae46f423a945fa36660e1 + +I=231 +KEY=0000000000000000000000000000000000000000000000000000000002000000 +CT=98272fdd4978e941b4f68f571b899fd8 + +I=232 +KEY=0000000000000000000000000000000000000000000000000000000001000000 +CT=121952d98be02632491241b44304804a + +I=233 +KEY=0000000000000000000000000000000000000000000000000000000000800000 +CT=b16dea3eb57e5967a8b218f08842502b + +I=234 +KEY=0000000000000000000000000000000000000000000000000000000000400000 +CT=5d9bd9d06cdf97480ba073a57480fab3 + +I=235 +KEY=0000000000000000000000000000000000000000000000000000000000200000 +CT=c9a296f7f58e208252dffec1d46fb538 + +I=236 +KEY=0000000000000000000000000000000000000000000000000000000000100000 +CT=d831b2b44cd0782c94a9533c4221e4bf + +I=237 +KEY=0000000000000000000000000000000000000000000000000000000000080000 +CT=b93146526d778bae13e579c4962110ef + +I=238 +KEY=0000000000000000000000000000000000000000000000000000000000040000 +CT=2e483ad91c6aba09440d32dff6f838ac + +I=239 +KEY=0000000000000000000000000000000000000000000000000000000000020000 +CT=f650a662bee544675d15eeb6d16c5dfb + +I=240 +KEY=0000000000000000000000000000000000000000000000000000000000010000 +CT=4a0d75387c3fabe4e4b8d059e526a623 + +I=241 +KEY=0000000000000000000000000000000000000000000000000000000000008000 +CT=eaac3bade1e4886d2376b945ae19ca2c + +I=242 +KEY=0000000000000000000000000000000000000000000000000000000000004000 +CT=86392882c55672c087a978a66a162d05 + +I=243 +KEY=0000000000000000000000000000000000000000000000000000000000002000 +CT=1ba2f2b6ee41fa58119bc0c6dd7909d3 + +I=244 +KEY=0000000000000000000000000000000000000000000000000000000000001000 +CT=68d5648946c464cbcfaf9b2abb0567c3 + +I=245 +KEY=0000000000000000000000000000000000000000000000000000000000000800 +CT=a909bc4a2061b560596840e160549097 + +I=246 +KEY=0000000000000000000000000000000000000000000000000000000000000400 +CT=231665465c569176adaa126a76b893b8 + +I=247 +KEY=0000000000000000000000000000000000000000000000000000000000000200 +CT=a9814e3b420304fb5df34a79d4db7879 + +I=248 +KEY=0000000000000000000000000000000000000000000000000000000000000100 +CT=6d9fb653caedbf0091aa5a143707994f + +I=249 +KEY=0000000000000000000000000000000000000000000000000000000000000080 +CT=c0165682bd8ee32b0e3c468812aa23a2 + +I=250 +KEY=0000000000000000000000000000000000000000000000000000000000000040 +CT=5991506d96f9f27ddf74015705d4e1ea + +I=251 +KEY=0000000000000000000000000000000000000000000000000000000000000020 +CT=99443cb4450fa3c81d921e478476f365 + +I=252 +KEY=0000000000000000000000000000000000000000000000000000000000000010 +CT=a9e429527f98ef1c9cb832bcd036e00e + +I=253 +KEY=0000000000000000000000000000000000000000000000000000000000000008 +CT=b7c9b6bd6b749af86c8ed5ee57659dec + +I=254 +KEY=0000000000000000000000000000000000000000000000000000000000000004 +CT=8dcb599c6eecc7e896d73c71bf1423ad + +I=255 +KEY=0000000000000000000000000000000000000000000000000000000000000002 +CT=f0fc3a5418ec55a5bbac2f2d4a94d833 + +I=256 +KEY=0000000000000000000000000000000000000000000000000000000000000001 +CT=2fc5e1a6366cfad169343760445d88e0 + +========== + diff -urN lin.2.2.17/crypto/testing/speed.c int.2.2.17.x/crypto/testing/speed.c --- lin.2.2.17/crypto/testing/speed.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/speed.c Sat Oct 14 00:48:24 2000 @@ -0,0 +1,230 @@ +/* + * crypto/testing/speed.c + * + * Written by Alexander Kjeldaas 1998-11-23 + * + * Copyright 1998 by Alexander Kjeldaas. Redistribution of this file + * is permitted under the GNU Public License. + */ + +#define __KERNEL__ + +#define printk printk_dummy + +#include + +#undef memcpy +#undef memset +#undef printk + +#include "libcfuncs.h" +#include "misc.h" + + +int cipher_correct(struct cipher_implementation *ci); +int test_cipher(struct cipher_implementation *ci, int encrypt); +int test_cbc_cipher(struct cipher_implementation *ci, int encrypt); + +int main() +{ + int cipher; + /* Register all ciphers */ + cryptoapi_init(); + + for (cipher = 1; cipher < MAX_CIPHER; cipher++) { + struct cipher_implementation *ci; + struct timeval tv1,tv2; + int modes[] = {0, CIPHER_CBC}; + int test[] = {1, 0}; + int i; + for (i = 0; i < sizeof(modes)/sizeof(int); i++) { + ci = find_cipher_by_id(cipher | modes[i]); + if (!ci) + continue; + if (test[i]) { + PRINTF("Testing cipher %s, number %d..", + ci->trans.t_name, ci->trans.t_id); + if (!cipher_correct(ci)) { + PRINTF("seems to work\n"); + } else { + PRINTF("doesnt work!\n"); + } + } + gettimeofday(&tv1, NULL); + if (test_cipher(ci, 1)) + return 1; + gettimeofday(&tv2, NULL); + PRINTF("encrypt %-15s = %8d usec/MB; %6.3f MB/s; " + "%6.3f Mb/s\n", + ci->trans.t_name, (int)timediff(&tv2,&tv1), + 1000000.0/timediff(&tv2,&tv1), + 1000000.0*8.0/timediff(&tv2,&tv1)); + gettimeofday(&tv1, NULL); + if (test_cipher(ci,0)) + return 1; + gettimeofday(&tv2, NULL); + PRINTF("decrypt %-15s = %8u usec/MB; %6.3f MB/s; " + "%6.3f Mb/s\n", + ci->trans.t_name, (int)timediff(&tv2,&tv1), + 1000000.0/timediff(&tv2,&tv1), + 1000000.0*8.0/timediff(&tv2,&tv1)); + } + } + exit(0); +} + +#if 0 +static inline void rdtsc(long long *x) +{ + asm volatile (".byte 0x0f, 0x31\n\t" + "movl %%eax, %0\n\t" + "movl %%edx, %1" + : "=m" (((long *)x)[0]), "=m"(((long *)x)[1]) + ::"ax","dx"); +} +#endif + +int test_cipher(struct cipher_implementation *ci, int encrypt) +{ + int fd,i,j,bs,size; + char buf[512], buf_in[512], buf_out[512]; + static u8 key[] = {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, + 0x20, 0x02, 0x02, 0x40, 0x40, 0x04, 0x04, 0x20}; + struct cipher_context *cx; + cx = (struct cipher_context *) malloc(sizeof(struct cipher_context)); + cx->ci = ci; + cx->keyinfo = (u32 *) malloc(ci->key_schedule_size); + errno=ci->set_key(cx, (char *)key, sizeof(key)); + if(errno) { + perror("Can't set key"); + return 1; + } + fd = open("speed.c", O_RDONLY); + if (!fd) { + perror("Couldn't open speed.c"); + return 1; + } + if ((size = read(fd, buf, sizeof(buf))) < sizeof(buf)) { + perror("Couldn't read 512 bytes from speed.c"); + return 1; + } + close(fd); + memcpy(buf_in, buf, sizeof(buf)); + bs = ci->blocksize; + if (bs == 0) { + bs = 512; + } + for (i = 0; i < 1024; i++) { + char *in = &buf_in[0]; + char *out = &buf_out[0]; + int (*func)(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + if (encrypt) + func = ci->encrypt; + else + func = ci->decrypt; + + for (j = 512; j > 0; j-=bs) { + errno=func(cx, (u8 *)in, (u8 *)out, bs); + if(errno) { + perror("Can't encrypt/decrypt in test_cipher()"); + return 1; + } + in += bs; out += bs; + } + in = &buf_in[0]; + out = &buf_out[0]; + for (j = 512; j > 0; j-=bs) { + func(cx, (u8 *)out, (u8 *)in, bs); + in += bs; out += bs; + } + } + return 0; +} + +int cipher_correct(struct cipher_implementation *ci) +{ + int fd,j,bs,size,err; + char buf[512], buf_enc[512],buf_dec[512]; + static u8 key[] = {0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x80, + 0x40, 0x60, 0x40, 0x40, 0x40, 0x04, 0x40, 0x00}; + struct cipher_context *cx; + cx = (struct cipher_context *) malloc(sizeof(struct cipher_context)); + cx->ci = ci; + cx->keyinfo = (u32 *) malloc(ci->key_schedule_size); + errno=ci->set_key(cx, (char *)key, sizeof(key)); + if(errno) { + printf("errno=%d key=%d\n",errno,sizeof(key)); + perror("Can't set key"); + return 1; + } + fd = open("speed.c", O_RDONLY); + if (!fd) { + perror("Couldn't open speed.c"); + return 1; + } + if ((size = read(fd, buf, sizeof(buf))) < sizeof(buf)) { + perror("Couldn't read 512 bytes from speed.c"); + return 1; + } + close(fd); + bs = ci->blocksize; + if (bs == 0) { + return 0; + } + { + char *in = &buf[0]; + char *out = &buf_enc[0]; + for (j = 512; j > 0; j-=bs) { + errno=ci->encrypt(cx, (u8 *)in, (u8 *)out, bs); + if(errno) { + perror("Can't encryp in cipher_correct"); + return 1; + } + + in += bs; out += bs; + } + in = &buf_enc[0]; + out = &buf_dec[0]; + for (j = 512; j > 0; j-=bs) { + errno=ci->decrypt(cx, (u8 *)in, (u8 *)out, bs); + if(errno) { + perror("Can't encrypt in cipher_correct"); + return 1; + } + + in += bs; out += bs; + } + if ((err = my_memcmp(buf, buf_dec, sizeof(buf)))) { + PRINTF("failed ecb check"); + PRINTF("\nPlaintext buffer\n"); + dump_u8_buffer(buf, 512); + PRINTF("\nEncrypted plaintext\n"); + dump_u8_buffer(buf_enc, 512); + PRINTF("\nDecrypted buffer\n"); + dump_u8_buffer(buf_dec, 512); + exit(err); + } + } + { + struct cipher_implementation *ci_cbc; + ci_cbc = find_cipher_by_id(ci->trans.t_id | CIPHER_CBC); + if (!ci_cbc) + return 0; /* not supporting cbc is ok */ + memset(cx->iv, 0, sizeof(cx->iv)); + ci_cbc->encrypt(cx, (u8 *)buf, (u8 *)buf_enc, 512); + ci_cbc->decrypt(cx, (u8 *)buf_enc, (u8 *)buf_dec, 512); + if ((err = my_memcmp(buf, buf_dec, sizeof(buf)))) { + PRINTF("failed cbc check"); + PRINTF("\nPlaintext buffer\n"); + dump_u8_buffer(buf, 512); + PRINTF("\nEncrypted plaintext\n"); + dump_u8_buffer(buf_enc, 512); + PRINTF("\nDecrypted buffer\n"); + dump_u8_buffer(buf_dec, 512); + exit(err); + } + } + return 0; +} + diff -urN lin.2.2.17/crypto/testing/stubs.c int.2.2.17.x/crypto/testing/stubs.c --- lin.2.2.17/crypto/testing/stubs.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/stubs.c Mon Oct 16 15:22:00 2000 @@ -0,0 +1,41 @@ + +#include +#include +#include + +extern void *malloc(size_t size); +extern void free(void *ptr); + + +void * kmalloc(size_t x, int kind) +{ + return malloc(x); +} + +void kfree(const void *x) +{ + free((void *)x); +} + + +int proc_register(struct proc_dir_entry *parent, struct proc_dir_entry *child) +{ + return 0; +} + +int proc_unregister(struct proc_dir_entry *entry, int stuff) +{ + return 0; +} + +struct proc_dir_entry proc_root; +struct proc_dir_entry proc_root_fs; + +int request_module(const char * name) +{ + return (int) name; +} + +asmlinkage void schedule(void) +{ +} diff -urN lin.2.2.17/crypto/testing/test.3des-ede int.2.2.17.x/crypto/testing/test.3des-ede --- lin.2.2.17/crypto/testing/test.3des-ede Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/test.3des-ede Sat Oct 14 00:48:17 2000 @@ -0,0 +1,36 @@ +#!/bin/bash + +NR=1 +test () { + echo "test number $NR" + ./testcip -c des_ede3 "$@" | sed '/^Registered/d' | sed '/^MD5/d' + NR=$[NR+1] +} + +# Ordinary tests +test -k 0123456789abcdeffedcba987654321089abcdef01234567 -p 0123456789abcde7 -e de0b7c06ae5e0ed5 +test -k 0123456789abcdeffedcba9876543210 -p 0123456789abcde7 -e 7f1d0a77826b8aff +test -k 0123456789abcdef -p 0123456789abcde7 -e c95744256a5ed31d + +# Only parity bits differ - should give same result +test -k 01000000ffffffffffffffff00000000 -p 0000000000000000 -e fb7d235c9a27599f +test -k 00000000fffffffffefefefe00000001 -p 0000000000000000 -e fb7d235c9a27599f + + + +# The following keys are weak and should be rejected if such testing is done. +# The plaintext and ciphertext is therefore not important, and is set to 0. +# See comments in crypto/des_ede3.c + +# Weak subkeys - should be rejected +test -k fefefefefefefefefedcba987654321089abcdef01234567 -p 0000000000000000 -e 0000000000000000 +test -k 0123456789abcdeffedcba98765432101f1f1f1f0e0e0e0e -p 0000000000000000 -e 0000000000000000 +test -k 0123456789abcdefe0e0e0e0f1f1f1f1 -p 0000000000000000 -e 0000000000000000 + +# Two semi-weak subkeys - should be rejected +test -k 01fe01fe01fe01fefedcba9876543210fe01fe01fe01fe01 -p 0000000000000000 -e 0000000000000000 + +#Degenerate keys - should be rejected +test -k 0123456789abcdef0123456789abcdef89abcdef01234567 -p 0000000000000000 -e 0000000000000000 +test -k 0123456789abcdef89abcdef0123456789abcdef01234567 -p 0000000000000000 -e 0000000000000000 +test -k 0123456789abcdef0123456789abcdef0123456789abcdef -p 0123456789abcde7 -e c95744256a5ed31d \ No newline at end of file diff -urN lin.2.2.17/crypto/testing/test.blowfish int.2.2.17.x/crypto/testing/test.blowfish --- lin.2.2.17/crypto/testing/test.blowfish Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/test.blowfish Tue Oct 17 09:50:17 2000 @@ -0,0 +1,54 @@ +#!/bin/bash + +NR=1 +test () { + echo "Test number $NR" + ./testcip -s -c blowfish "$@" | sed '/^Registered/d' + NR=$[NR+1] +} + +test -k 0000000000000000 -p 0000000000000000 -e 4EF997456198DD78 +test -k FFFFFFFFFFFFFFFF -p FFFFFFFFFFFFFFFF -e 51866FD5B85ECB8A +test -k 3000000000000000 -p 1000000000000001 -e 7D856F9A613063F2 +test -k 1111111111111111 -p 1111111111111111 -e 2466DD878B963C9D +test -k 0123456789ABCDEF -p 1111111111111111 -e 61F9C3802281B096 +test -k 1111111111111111 -p 0123456789ABCDEF -e 7D0CC630AFDA1EC7 +test -k 0000000000000000 -p 0000000000000000 -e 4EF997456198DD78 +test -k FEDCBA9876543210 -p 0123456789ABCDEF -e 0ACEAB0FC6A0A28D +test -k 7CA110454A1A6E57 -p 01A1D6D039776742 -e 59C68245EB05282B +test -k 0131D9619DC1376E -p 5CD54CA83DEF57DA -e B1B8CC0B250F09A0 +test -k 07A1133E4A0B2686 -p 0248D43806F67172 -e 1730E5778BEA1DA4 +test -k 3849674C2602319E -p 51454B582DDF440A -e A25E7856CF2651EB +test -k 04B915BA43FEB5B6 -p 42FD443059577FA2 -e 353882B109CE8F1A +test -k 0113B970FD34F2CE -p 059B5E0851CF143A -e 48F4D0884C379918 +test -k 0170F175468FB5E6 -p 0756D8E0774761D2 -e 432193B78951FC98 +test -k 43297FAD38E373FE -p 762514B829BF486A -e 13F04154D69D1AE5 +test -k 07A7137045DA2A16 -p 3BDD119049372802 -e 2EEDDA93FFD39C79 +test -k 04689104C2FD3B2F -p 26955F6835AF609A -e D887E0393C2DA6E3 +test -k 37D06BB516CB7546 -p 164D5E404F275232 -e 5F99D04F5B163969 +test -k 1F08260D1AC2465E -p 6B056E18759F5CCA -e 4A057A3B24D3977B +test -k 584023641ABA6176 -p 004BD6EF09176062 -e 452031C1E4FADA8E +test -k 025816164629B007 -p 480D39006EE762F2 -e 7555AE39F59B87BD +test -k 49793EBC79B3258F -p 437540C8698F3CFA -e 53C55F9CB49FC019 +test -k 4FB05E1515AB73A7 -p 072D43A077075292 -e 7A8E7BFA937E89A3 +test -k 49E95D6D4CA229BF -p 02FE55778117F12A -e CF9C5D7A4986ADB5 +test -k 018310DC409B26D6 -p 1D9D5C5018F728C2 -e D1ABB290658BC778 +test -k 1C587F1C13924FEF -p 305532286D6F295A -e 55CB3774D13EF201 +test -k 0101010101010101 -p 0123456789ABCDEF -e FA34EC4847B268B2 +test -k 1F1F1F1F0E0E0E0E -p 0123456789ABCDEF -e A790795108EA3CAE +test -k E0FEE0FEF1FEF1FE -p 0123456789ABCDEF -e C39E072D9FAC631D +test -k 0000000000000000 -p FFFFFFFFFFFFFFFF -e 014933E0CDAFF6E4 +test -k FFFFFFFFFFFFFFFF -p 0000000000000000 -e F21E9A77B71C49BC +test -k 0123456789ABCDEF -p 0000000000000000 -e 245946885754369A +test -k FEDCBA9876543210 -p FFFFFFFFFFFFFFFF -e 6B5C5A9C5D9E0A5A + + + + + + + + + + + diff -urN lin.2.2.17/crypto/testing/test.des int.2.2.17.x/crypto/testing/test.des --- lin.2.2.17/crypto/testing/test.des Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/test.des Sat Oct 14 00:48:17 2000 @@ -0,0 +1,83 @@ +#!/bin/bash + +NR=1 +test () { + echo "Test number $NR" + ./testcip -c des "$@" | sed '/^Registered/d' + NR=$[NR+1] +} + +test -k 0000000000000000 -p 0000000000000000 -e 8CA64DE9C1B123A7 +test -k FFFFFFFFFFFFFFFF -p FFFFFFFFFFFFFFFF -e 7359B2163E4EDC58 +test -k 3000000000000000 -p 1000000000000001 -e 958E6E627A05557B +test -k 1111111111111111 -p 1111111111111111 -e F40379AB9E0EC533 +test -k 0123456789ABCDEF -p 1111111111111111 -e 17668DFC7292532D +test -k 1111111111111111 -p 0123456789ABCDEF -e 8A5AE1F81AB8F2DD +test -k 0000000000000000 -p 0000000000000000 -e 8CA64DE9C1B123A7 +test -k FEDCBA9876543210 -p 0123456789ABCDEF -e ED39D950FA74BCC4 +test -k 7CA110454A1A6E57 -p 01A1D6D039776742 -e 690F5B0D9A26939B +test -k 0131D9619DC1376E -p 5CD54CA83DEF57DA -e 7A389D10354BD271 + +test -k 07A1133E4A0B2686 -p 0248D43806F67172 -e 868EBB51CAB4599A +test -k 3849674C2602319E -p 51454B582DDF440A -e 7178876E01F19B2A +test -k 04B915BA43FEB5B6 -p 42FD443059577FA2 -e AF37FB421F8C4095 +test -k 0113B970FD34F2CE -p 059B5E0851CF143A -e 86A560F10EC6D85B +test -k 0170F175468FB5E6 -p 0756D8E0774761D2 -e 0CD3DA020021DC09 +test -k 43297FAD38E373FE -p 762514B829BF486A -e EA676B2CB7DB2B7A +test -k 07A7137045DA2A16 -p 3BDD119049372802 -e DFD64A815CAF1A0F +test -k 04689104C2FD3B2F -p 26955F6835AF609A -e 5C513C9C4886C088 +test -k 37D06BB516CB7546 -p 164D5E404F275232 -e 0A2AEEAE3FF4AB77 +test -k 1F08260D1AC2465E -p 6B056E18759F5CCA -e EF1BF03E5DFA575A + +test -k 584023641ABA6176 -p 004BD6EF09176062 -e 88BF0DB6D70DEE56 +test -k 025816164629B007 -p 480D39006EE762F2 -e A1F9915541020B56 +test -k 49793EBC79B3258F -p 437540C8698F3CFA -e 6FBF1CAFCFFD0556 +test -k 4FB05E1515AB73A7 -p 072D43A077075292 -e 2F22E49BAB7CA1AC +test -k 49E95D6D4CA229BF -p 02FE55778117F12A -e 5A6B612CC26CCE4A +test -k 018310DC409B26D6 -p 1D9D5C5018F728C2 -e 5F4C038ED12B2E41 +test -k 1C587F1C13924FEF -p 305532286D6F295A -e 63FAC0D034D9F793 +test -k 0101010101010101 -p 0123456789ABCDEF -e 617B3A0CE8F07100 +test -k 1F1F1F1F0E0E0E0E -p 0123456789ABCDEF -e DB958605F8C8C606 +test -k E0FEE0FEF1FEF1FE -p 0123456789ABCDEF -e EDBFD1C66C29CCC7 + +test -k 0000000000000000 -p FFFFFFFFFFFFFFFF -e 355550B2150E2451 +test -k FFFFFFFFFFFFFFFF -p 0000000000000000 -e CAAAAF4DEAF1DBAE +test -k 0123456789ABCDEF -p 0000000000000000 -e D5D44FF720683D0D +test -k FEDCBA9876543210 -p FFFFFFFFFFFFFFFF -e 2A2BB008DF97C2F2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -urN lin.2.2.17/crypto/testing/test.mars int.2.2.17.x/crypto/testing/test.mars --- lin.2.2.17/crypto/testing/test.mars Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/test.mars Tue Oct 17 09:47:25 2000 @@ -0,0 +1,438 @@ +#!/bin/bash + +test () { + echo "Test number $I - keysize $KEYSIZE" + echo testcip -c mars -k $KEY -p $PT -e $CT + ./testcip -c mars -k $KEY -p $PT -e $CT | sed '/^Registered/d' +} + +# This data is from the MARS website at +# http://www.research.ibm.com/security/mars.html + +KEYSIZE=128 + +KEY=00000000000000000000000000000000 +PT=00000000000000000000000000000000 +CT=deb3513283c296de39069e6b994c2438 + +test +exit + + The MARS cipher: Test vectors for encryption and key expansion + --------------------------------------------------------------- + +For each key and plaintext, the following information is given: + +Key[n]: The original key, consisting of n 32-bit words +Expanded key: The 40-word expanded key array +Plain Text: The 4-word plaintext +IV1: Values after key addition +IV2: Values after Forward mixing +IV3: Values after Forward "core" +IV4: Values after Backwards "core" +IV5: Values after Backwards mixing +Encryption: The 4-word ciphertext (after key subtraction) + +All the values are given as arrays of 32-bit words. + +======================================================================== + +KEYSIZE=128 + +Key[4]= 00000000 00000000 00000000 00000000 +Expanded Key= [ + b1a4a724 a4ebfe6c 8c31f1ff 46f21b7f 3107f81e 72538073 d9d5bb7c 07cd149b + fd2c12fa e5135e4f 753ab740 bb33ab03 d576aff3 7c14f40b 729b9d51 06a17a6f + 9bf4836a 14d4a4e3 3cebfbf6 a2fe105b d602ac90 330ae033 7838d957 e477c263 + 1c3c1975 09a546d7 e1b7efda 54441e9f c98e224a 2e237bf3 964fa90b 56f7ae07 + 9f7da180 86bad2ef 9e2b2c11 056f518f 1dd62186 b1e4e06c e37c58bc a1f6a479 +] +Plain Text= 00000000 00000000 00000000 00000000 +IV1=b1a4a724 a4ebfe6c 8c31f1ff 46f21b7f +IV2=d4ae0c38 eb8ea742 641bdc9c bdb280da +IV3=ac1a7cb0 acc2f1f0 4758625c e6a02ebb +IV4=d0bd0bde 37a00fb8 42611579 2b2e7337 +IV5=fc8972b8 35a7774a 1c82f727 3b42c8b1 +Encryption= deb35132 83c296de 39069e6b 994c2438 + + + +Key[4]= deb35132 83c296de 39069e6b 994c2438 +Expanded Key= [ + 107f46e3 39ad6bbf aca8391d 44ed470a ad55b583 92110113 54b14fdb f205608b + a9a28c86 bf72c2c3 f61ee573 2ea0a3f7 0a9cf79f 59304a1f 512724f6 367da517 + ef526563 25b0ed67 fa465e58 240a3743 7853b1f3 4e240a9f c17dbecc addaf83b + bfa7fef7 0707ea83 617a9c9d d1679d07 c1145fe7 67c8d86b d682cdb0 b8d7c197 + d233542f 650b9107 32658199 d17af7bb 5402a899 800a2588 aa01ba64 6fff9d90 +] +Plain Text= deb35132 83c296de 39069e6b 994c2438 +IV1=ef329815 bd70029d e5aed788 de396b42 +IV2=4ca72af4 03c66f6d ccad0d6e 96630d80 +IV3=9329ec9a 3d26d758 7cefb387 efedf183 +IV4=39cc73ee 820582dd 1210940a 0a8c46e4 +IV5=fd14ee92 ce0d533c ae243428 0ba5a667 +Encryption= a91245f9 4e032db4 042279c4 9ba608d7 + + + +Key[4]= 77a114cb cdc1bb6a 3d24e7af 02ea2cef +Expanded Key= [ + 44cb6f54 153cc9b2 6ee728e4 a340f7b6 540c1cd3 c409ec9f cdd08801 5091a06b + bcf3fe6d dd2fe2b3 8fb06ca6 5c010d73 68dbb887 bca5cb7b d11bbc8d 151e15c7 + 4a82ec22 3102c2b3 302c92be 31d87c33 0c5f67d8 b0fd72af eeaf82dd f9750f33 + 0787e8e9 4a62dcfb c60b8ef6 f94c0607 7c9c2b56 b49dfca3 414b9c9b dbd4aa0b + b6b17ece 0732d49b 2d9417fe 63ac89ab 339d359b a20d713e a78ab93a 065f28ef +] +Plain Text= a91245f9 4e032db4 042279c4 9ba608d7 +IV1=edddb54d 633ff766 7309a2a8 3ee7008d +IV2=f5281910 68768f38 ebc1221e 79a7d9b8 +IV3=766b7d4a bf15a754 c0116d3a bdf880a2 +IV4=b9f2e174 6669507c 7284181a db627725 +IV5=e0f32ee8 089aaa99 b1ed467a b040501a +Encryption= ad55f94d 668d395b 0a628d40 a9e1272b + + + +Key[4]= daf4ed86 ab4c8231 37466aef ab0b0bc4 +Expanded Key= [ + 9ab7ae2b 0f73f81c afce20e3 9f2cfc8c 24588fd8 71821903 f4c0714f 13e5cf37 + 0c5504ef 87652183 94cf826a 44154193 ac28ea54 0a2bc753 19b79d6d 75a2cb9b + 4c29c8b8 3252e0af ec304911 802ece97 50e19471 03d7b0bb 0dc62c42 33228923 + 55fe4042 27ad014f 00d18904 5008eb3f b1fd2680 7e5d366b edfefe45 3705a077 + 038249f0 783d8b4f 48d8876f 879d2d47 1501127d 767cfa6a 4ae62be2 b078cdc5 +] +Plain Text= ad55f94d 668d395b 0a628d40 a9e1272b +IV1=480da778 76013177 ba30ae23 490e23b7 +IV2=e487eaaa a632cb30 ff8e0b66 0ecec341 +IV3=25a6b5d9 1c060b55 a9650144 0abf5bc8 +IV4=eba5e911 c1dcb107 4d9d6879 84d82641 +IV5=e71059d1 abc6aef5 7a08a7f5 ecd3737c +Encryption= d20f4754 3549b48b 2f227c13 3c5aa5b7 + + + +Key[4]= 08fbaad2 9e0536ba 186416fc 9751ae73 +Expanded Key= [ + 8facb7c3 1e4d7bd0 502e75b3 be262b34 42339164 bc93d863 77542989 57830ca3 + c6005fa6 f961896f 77dabef4 eef3f5ef 2f6d2790 7191e8d3 7a9a75a9 954ab137 + f0f3e6a4 897eea03 da6255a4 651f381f d955b3cc 4c6f688f 98dd5f55 c9af195b + 46cc7058 594426cb 6dcc6f5d 246e1603 4885ac99 a55f011f f0a974f4 1e7879bb + 496516db 53586ce7 052ee42b 16931b2f 2344322a 65538aa7 907ebef8 2edcb4b5 +] +Plain Text= d20f4754 3549b48b 2f227c13 3c5aa5b7 +IV1=61bbff17 5397305b 7f50f1c6 fa80d0eb +IV2=1f5b2a7f 98e26c7d 9c28a2db c388d646 +IV3=5391c7f7 ac9974d6 c61a1ba2 2a835d9a +IV4=439e5ccf 09e5f169 dd070fc1 e48c7f88 +IV5=66d17bdc 564113e9 cf75bd7d b837736d +Encryption= 438d49b2 f0ed8942 3ef6fe85 895abeb8 + + + +Key[4]= 4b76e360 6ee8bff8 2692e879 1e0b10cb +Expanded Key= [ + 52c6f009 815d8fe2 bca5d163 ed58e175 7fcea016 1b1d6a83 6aa9dc77 81738423 + e14a5dac fcf52adb 29555a50 7d69b6cf 86b2fda6 68379ba7 56be0e57 7ee6b92f + a61e4f38 be2b2907 9e38217e ba274493 5a07edf2 81e73e03 d32d7b57 3fa55113 + da0b9ce7 2db6fe77 716a0763 c325bc9b 11f60f27 a630f1d3 002dea39 211a58ef + b31e95b2 d25b023b 4bfa6acd 52fae8eb ae6284ad 93194cdd 138cb6c5 edacf29e +] +Plain Text= 438d49b2 f0ed8942 3ef6fe85 895abeb8 +IV1=965439bb 724b1924 fb9ccfe8 76b3a02d +IV2=7b6be06c 602314b7 63771017 37bea240 +IV3=1db44a41 a2b1ac42 b17bc0d1 a1def98a +IV4=0d57f939 2af36857 096d5f88 a4d22e98 +IV5=aeccfcfb 44341a9c d70f8297 c04ad313 +Encryption= 006a784e b11acdbf c382cbd2 d29de075 + + + +Key[4]= 3c574a4f 4d9ee67d 8502e334 cb30c961 +Expanded Key= [ + 799cd786 064c7fdb 40797b7d a7d6d58d d30dac61 83a0a657 95c4c8ad bfe9f16f + 0f1d67f8 2b655cfb a3ada6ea 971696bb c7f6f838 62bd9817 2a28d073 d00a5dc3 + 70e5b711 833a53cb c41ac997 0226db0f 2a0e962f 4ae61c07 57524b48 75296af3 + 4a3ec498 4899295b 246af131 6ab8bfd3 cab75997 5526fb83 3b006506 701724d7 + 259d2f30 a5495eb3 2c322c6e 6ca0bfbb 96499bb9 35d296e6 c5405907 c790427f +] +Plain Text= 774bd161 926c943a 6012c09f 07a639df +IV1=f0e8a8e7 98b91415 a08c3c1c af7d0f6c +IV2=e505456e 5e50b756 104c76bc 3b7a7f0f +IV3=cd65c3b7 df284a23 cf1d4788 7ac39e05 +IV4=c3335301 9434ec9d b866e1fe 7af2b0d9 +IV5=bc29fc5a acb54455 e56b5886 6e618555 +Encryption= 25e060a1 76e2ad6f 202aff7f a6d142d6 + + + +Key[4]= 19b72aee 3b7c4b12 a5281c4b 6de18bb7 +Expanded Key= [ + 0982d435 f7279ef7 1bda470b 45f061e5 ba116f23 c895f257 5381bcd7 98f66d13 + 97225c42 3f947a5f 651e009f 2606f323 32037254 84ef30f3 c969d992 5494cbcb + 32aff3a5 fbbc8d13 0566bf24 8b900dcb 202848e2 3d4326f3 a4283891 2d15c6e7 + ebf715af ad204e3b c244af1b ac3a3bcb 73be3c62 7c4f754b 00d579c8 de94f6f7 + e5f0cf5c af81d4a7 6bd0c00e dbae03f3 0cabad09 83ade475 b0f5b796 5aedfcd4 +] +Plain Text= 25e060a1 76e2ad6f 202aff7f a6d142d6 +IV1=2f6334d6 6e0a4c66 3c05468a ecc1a4bb +IV2=6f36adf6 ea07f787 ca688e0c f4c1e34e +IV3=e821d02c 5f02db89 55620874 a840651d +IV4=f66436e2 d40e8df4 0ff380b2 9675ffe3 +IV5=f172fa0b 602df703 9b0632f6 171dbbd0 +Encryption= e4c74d02 dc80128e ea107b60 bc2fbefc + + + +Key[4]= fd7067ec e7fc599c 4f38672b d1ce354b +Expanded Key= [ + 35c6054c ead872e0 173d6797 4c3fb6bc dce28b70 3d3fe397 bdd6a46a 212e68fb + eab4dcf5 f7940653 9e40d6a4 0d05f15b 9107bcb2 b1203cb3 bf2cdc40 0fc1c023 + 024817f6 c840506b 079bd465 328bcd5b 54167911 21a2fdcf 904e85f1 9d13314b + 8d73ebe6 474ea967 2bd38bfa 8171605f eeeb15ac aae9dfab 216fb826 d0344cbf + 36930990 6567d303 b69b3b7e ff916b63 38ed75e4 cc4ba8aa 4caae370 9ee7eeaa +] +Plain Text= e4c74d02 dc80128e ea107b60 bc2fbefc +IV1=1a8d524e c758856e 014de2f7 086f75b8 +IV2=a1dbf118 a63a2592 da97146d 633d7cd4 +IV3=7b6da857 9daaa4be ed94501a f2828a94 +IV4=0a9e10fd e5718e50 f9368c26 0a954028 +IV5=96078932 fc574ac3 c9486194 3a1e2cf2 +Encryption= 5d1a134e 300ba219 7c9d7e24 9b363e48 + + + +Key[4]= a06a74a2 d7f7fb85 33a5190f 4af80b03 +Expanded Key= [ + 6a27430b 05197ee0 12bf0ca4 bae671d5 8f5c134c 609be0d3 9588298c 0259f10b + 9b74a8b1 f1eec9db 00209110 4c3d5a47 453eac26 414c783b 199f646f 07926d87 + 3c6485ad be978c6b c11c4c1b efaa2b63 7d279602 ddc41c57 b2ed70bb e666b34b + 3e746d2e e5368f07 eff70385 7d604743 9dce2946 c944cf0b 778a497c 35cfe4ff + 1203474e 3232ff5f 012eabef f479e82b 3cdc7dab 5552410a 03cbbaa2 3ed1c8d3 +] +Plain Text= 5d1a134e 300ba219 7c9d7e24 9b363e48 +IV1=c7415659 352520f9 8f5c8ac8 561cb01d +IV2=ac00b5b3 5fa9e06b d5ab2e6c 91ed9b75 +IV3=e97f4904 cfe41398 18e89eb8 46dddb60 +IV4=d1a0927a 9bc5bc62 b615c73f e9713c36 +IV5=49b56ac7 445c4f4a 8dc56b77 e715291d +Encryption= 0cd8ed1c ef0a0e40 89f9b0d5 a843604a + + +========================= + +KEYSIZE=192 + +Key[6]= 00000000 00000000 00000000 00000000 00000000 00000000 +Expanded Key= [ + 27dee7e4 154762f7 e3c5a235 c48782ce 5913a42a 721c0d67 a48a56ae 80625c03 + 5e79bc19 fa87c763 74dc1baa 95862b4f cb5e6aca adcfa1f7 f95d5ace 783dc87b + fb5a66c8 468d8353 57e96c55 a1b9080f 660f1eda 2280402b 7c08c082 aca23c27 + ac64e883 b12eeaef b4a136c0 badaefdf b01ea677 6941a1bf 1b3fc7df f957f01f + df5a6502 59716c27 b0ca5a13 ddf1435b 55cee350 f6258fd3 9022223d 3c80200d +] +Plain Text= 00000000 00000000 00000000 00000000 +IV1=27dee7e4 154762f7 e3c5a235 c48782ce +IV2=e80fc980 0742e155 bd8d241b 37783b4e +IV3=16b14fca 32df6557 46f71002 276b20e6 +IV4=cf2dc74c 50268150 e051a9c6 0b70b3c9 +IV5=fe228ce3 13669fff 98a87b0e d1cda745 +Encryption= a853a993 1d41102c 088658d1 954d8738 + + + +Key[6]= 088658d1 954d8738 00000000 00000000 00000000 00000000 +Expanded Key= [ + e1bbe2d1 38f11822 8b7ff4cb 833ef90a 3f5553aa 8d070683 17f7fe15 0f7ab327 + f3df6127 902acb97 81dee7fd 583bd767 89313d2a a3771397 28484806 a0d22c3f + 26ceab0c 3fd3aa03 2033baf6 4945ddcb 310275bd d349301b 75aa0b65 c232bb13 + 21e164da 61d7122b d9cdc3a3 a10dcdeb 963d65ee f79190e3 ac5fec07 7bb534db + 0ada3ccc ac68d1bf 07dd3839 bdf75b57 13a61e19 f98ced2b 0bf573f7 e785c0b7 +] +Plain Text= a853a993 1d41102c 088658d1 954d8738 +IV1=8a0f8c64 5632284e 94064d9c 188c8042 +IV2=42715daf 5ec41b05 3844f3df 2865b968 +IV3=ade6083c 910718db d65aef96 642a93e2 +IV4=6d30ef88 7233660f f6e45d88 d7b453c5 +IV5=416a7f80 cbcf4e69 b9b4c39f 769b446a +Encryption= 2dc46167 d242613e adbf4fa8 8f1583b3 + + + +Key[6]= a5391779 1a58048b a853a993 1d41102c 088658d1 954d8738 +Expanded Key= [ + 4a6aebc3 768beddd 1e423871 f8025453 a7c4735e 27ed4143 756416db c8becd2b + 8cf25e26 d6b74c8f c9228fe4 8358a8b7 52d355e2 79da8313 34f9b718 aec232ff + 47b58b4a b4d4b333 c1edc83b 8262694b 34383327 57b83157 28a3944b 364b51cf + 765df4d0 d32bfa13 5c46ca3f 59d46817 8418566a 9a84017b 1c513de5 5b93f74f + b5b9ad02 9a1d6973 54b5bc74 efb92a6f 98bbd3f0 3eb92df5 36b8fdf3 7ebf1ddf +] +Plain Text= 2dc46167 d242613e adbf4fa8 8f1583b3 +IV1=782f4d2a 48ce4f1b cc018819 8717d806 +IV2=e971f2c4 6d32633c 98d1e2f4 d19bf151 +IV3=f645cf5e fdd1e86a 270776f7 8c476579 +IV4=c9762c8c 12eae970 102304a5 82d58468 +IV5=bebf08bb ac11ad3a 178bbb47 3bd83a36 +Encryption= 260334cb 6d587f45 e0d2bd54 bd191c57 + + + +Key[6]= 45ebaa2d a74118dc 8597c8f4 cf037112 a5391779 1a58048b +Expanded Key= [ + c3789384 6cba897c 408d3347 62e14f4f 7d32d3fe 43ea20f7 37fa62bf da083f43 + 11d6a36a 07b4af27 df307c63 e17af4b3 a2a0780a 789c6bdb 01a69dca 222748cf + da90b300 2ec1916f e1f0f2e7 790a2f0b feaf1e2d c91f2683 3245b509 dccc6bdf + 37de8109 e7c010e7 4f2c4c08 c2e5657b 035e22f7 b1ec4a4b 6235691e 3adceb5b + aa741a09 6c5c2aaf 7ba3d350 70a06e87 0561f28b b4286bcc 1e5190ea c1e27949 +] +Plain Text= 260334cb 6d587f45 e0d2bd54 bd191c57 +IV1=e97bc84f da1308c1 215ff09b 1ffa6ba6 +IV2=6968e88e 48a6f539 f646d8f5 ccf35a64 +IV3=351f5756 5bcdd6dd b78eb579 21d447c8 +IV4=47795ee4 580e29ec d58aa750 f2786c0f +IV5=68327186 f1852491 2a73796a a41c3b33 +Encryption= 62d07efb 3d5cb8c5 0c21e880 e239c1ea + + + +Key[6]= 49ca42ad 4578d936 a394fc3f a25b0e57 45ebaa2d a74118dc +Expanded Key= [ + 46cf477d 7806a8af 6c0747fb dc22326f 62e33d0e 3eb59f73 4c4bdc94 6e11939f + 39b73bac d436284f e4e3c788 7730c9ff 1ad527ef 2a208e43 bbb18767 cc89ac87 + f5dba503 402435cf 55aed575 783a9b8b deb4e077 889f48bf b79241f0 3e3229d3 + da59b650 331295af 508fa084 3662f35b 8dd036f0 9338daab 04db36d4 441e3847 + 1bfbd04f a37048a7 5a73c893 8df886bb e71ca0b7 c12b1e84 e43fdbde e0d55925 +] +Plain Text= 62d07efb 3d5cb8c5 0c21e880 e239c1ea +IV1=a99fc678 b5636174 7829307b be5bf459 +IV2=17f9dc09 92619cfa f9eb89ed 6d073d91 +IV3=f8e918b0 0fa0e9a3 db163491 998e7a05 +IV4=0ab43ad1 80927ba4 81b55ad0 adbfa2e7 +IV5=15acb673 39db6781 51aed997 162a269d +Encryption= 2e9015bc 78b048fd 6d6efdb9 3554cd78 + + + +========================= + +KEYSIZE=256 + + +Key[8]= 9867a1fb 22ef7a3e 8ce27c31 a3e1aa02 3ccce5e8 2aa8beed 9ac3db99 27725ed6 +Expanded Key= [ + a91e1d4c 37e56ec3 e58bebf2 6880f69f 4befbee1 99b5f3c3 28f97526 848139ff + 61059077 67cf6183 7fa48a1e 540e89cb 38d3e758 2e9cf23b 447f210c d9522fbf + 00257735 49bbfecf fad2232a cf5b30f7 774d76c3 81c8b1bb a0aafceb 246d7bfb + ed446268 f9c3d043 1eec3571 66b20b3b c263fc6b 8b548cd3 74763e02 55fe0f6f + 9ce3a41e f4c52fe7 556a2237 3a9377f7 d234d139 012c7b59 0299ba4a c9146c4c +] +Plain Text= a4ab4413 0847c4d3 1621a7a8 8493f4d4 +IV1=4dc9615f 402d3396 fbad939a ed14eb73 +IV2=e9a020c2 e0a4f75c a8e75caf 7bbceb86 +IV3=7295ee8e ef559e88 c55cd79f cf801586 +IV4=43b9e148 e3e8b667 00b39555 5a77ef0e +IV5=39d67e16 bf5ddf3c 6238d676 81b8fc2f +Encryption= 67a1acdd be3163e3 5f9f1c2c b8a48fe3 + +Key[8]= ffc60d26 9cde19dd d37d601d 1b4525e1 9867a1fb 22ef7a3e 8ce27c31 a3e1aa02 +Expanded Key= [ + 097eb64b c557cf89 6bbac604 8521dae9 9a595464 324ce39b 65190327 994e3b77 + 4c9bc470 7946faf7 71223e33 131a1dab aa782641 cf99146b fdb3ca12 083277f7 + a94740ba a29543db be118237 1629f7c3 0405db16 f00dee7f d68b0ebd b29d18f7 + afe89b13 8ff53a93 39ed1fc8 5f0f1c2b 771b06ba c250d197 ebf3e844 10d89fcf + 8ebf8837 fe2eba8b b15728c9 96264faf bfdd1e1e d7d14fa5 9815fa3f 2af4dc7a +] +Plain Text= 67a1acdd be3163e3 5f9f1c2c b8a48fe3 +IV1=71206328 8389336c cb59e230 3dc66acc +IV2=7d103a6b 84778a60 3fdba434 9490f8f7 +IV3=66eb22aa 6b422c3b 54c5627e 04e8931e +IV4=ca1318c9 ce16accf 889d9385 eec063fe +IV5=86128f07 b5ef876d 5ca522a4 11a48ba6 +Encryption= c63570e9 de1e37c8 c48f2865 e6afaf2c + + + +Key[8]= 39f37dcf 42c02e15 17f24878 fdea8acd ffc60d26 9cde19dd d37d601d 1b4525e1 +Expanded Key= [ + b5d1b8fc cb2f7b75 5f1c1dda 00a62687 466f4f54 ea90d5f7 af0b7a08 b52eff07 + f651c6ad fe6e7fdf 8cfa506d 61229bcb 83447de8 fbecc4bb baba340c 2336e74b + cd8da3fa 59d6a0b7 1a2733bf ba8f591f 36551504 211451ef c4f6df9b 6bc36377 + 4ee90fc2 8c2e7d97 060d69e7 006c54c3 640d25f5 a26f3277 ecd2c408 8213195b + 5a19494e 552413ab 663979af c4a3ebb3 f2f1c819 2958ee3d 0fe42311 d13d70fe +] +Plain Text= c63570e9 de1e37c8 c48f2865 e6afaf2c +IV1=7c0729e5 a94db33d 23ab463f e755d5b3 +IV2=205d700c edb01810 dd5d7ea0 63e57e89 +IV3=21fc603a 94f5c159 326f10a0 caee99ed +IV4=7a8e1a8d 19e3c5ff c75861d8 70ad45de +IV5=032a106f e7fd9725 a5221cac 2855b0e3 +Encryption= 10384856 bea4a8e8 953df99b 57183fe5 + + + +Key[8]= 29cb3599 fc6486fd 82cfb1e3 aaf2b528 39f37dcf 42c02e15 17f24878 fdea8acd +Expanded Key= [ + 4dcf4e2f 993b2ae8 299c9b55 ba6eee2e 33fc179a c86f1f83 62ad2038 85124d6f + 36862f67 72cc261f 9439514a c4d83ec3 084d31f7 c5763c1f ef5c7974 c17c9487 + 0d4b3adc 25e5df1b a9c5e13c f20eeee7 72a6014c 3145e1c7 271f2f02 6e3f566f + a8e1bed1 c8e60d2b 224c7330 985d62bf 17807fea 4c57f03f 5d4873bd b042a68b + e7e7038a 5458d3ef 6bd3ecfa a94ca647 490f7727 108fa88a 17083fe5 00bd62df +] +Plain Text= 10384856 bea4a8e8 953df99b 57183fe5 +IV1=5e079685 57dfd3d0 beda94f0 11872e13 +IV2=420b553e 6df086e4 7999e228 e50073e3 +IV3=5fc050ea c292d8ef ebf6e830 1bb84912 +IV4=f7fabec8 76867745 c83005b0 af07ab80 +IV5=20a3f1a0 76ade4b6 8eed877d cab8c5f5 +Encryption= d7947a79 661e3c2c 77e54798 c9fb6316 + + + +Key[8]= fe5f4fe0 9a7abad1 f52af67b 6309d63e 29cb3599 fc6486fd 82cfb1e3 aaf2b528 +Expanded Key= [ + c565d096 141e8678 9b1fd313 0ac36be1 d58bb999 80f197fb 5fea7d4e c922cfef + 24ef0266 7a20c223 04eff6ef bc1937cf a2cf1793 738e0507 e0917cf6 22c0348f + aa14ea8e c8119caf 0b4aa557 3b415933 e8f62c04 ee8de23b 989d55d5 c0ff2ebb + 76ae8a58 aa691277 58087c0b 58754acf bd4437e3 119b67cf 79ecad7c 20ef4ccb + 872a528a f4726f5b cb92238a 83e06e47 97b5b690 739f70d6 4643d98f 398a936b +] +Plain Text= d7947a79 661e3c2c 77e54798 c9fb6316 +IV1=9cfa4b0f 7a3cc2a4 13051aab d4becef7 +IV2=d906fff1 be0c3a1c 7f0685ef 059b0b7b +IV3=b67e9f99 0cec4744 b1259502 4a9ee8c4 +IV4=17727c21 5dd4dc1e daceacdb 9a8439f8 +IV5=e831be7a 8b46342a 97c46f04 756ca673 +Encryption= 507c07ea 17a6c354 51809575 3be21308 + + + +Key[8]= ae23480a 8ddc7985 a4aa630e 58ebc536 fe5f4fe0 9a7abad1 f52af67b 6309d63e +Expanded Key= [ + bbc05697 e91c98f2 dfc3b387 6cd475f7 58481400 7ca14ca7 1296cbaa a67919f3 + d8affabd 334358ff b91b1cbe db172497 f9f4d090 712c94ff 429feb5f 7e627087 + 09da20af 1140babb 3d5b3bb3 20c4df67 72702b6d 1c70527b dd0fe8ad 7931df1b + ea38af60 ec62bc1b a23b6d3a b0c21223 c51e7c79 012ff093 3230d7af ddedba1f + 23104c69 4d0614ab 287b7f3f 85b5953b 30897d20 5a87dc90 753693f5 7983c677 +] +Plain Text= 507c07ea 17a6c354 51809575 3be21308 +IV1=0c3c5e81 00c35c46 314448fc a8b688ff +IV2=aa2c442a 8d933397 09eb28e5 60ba4a67 +IV3=1ebfcfc0 4e5c1e33 2b25a340 6e4b6580 +IV4=36fc10a6 63763bf3 18cbaad4 aeaabd86 +IV5=e6ffe933 669e74d5 3193e177 1c949040 +Encryption= b6766c13 0c169845 bc5d4d82 a310c9c9 + +========== + + + + + + + + + + + + + + diff -urN lin.2.2.17/crypto/testing/test.rc5 int.2.2.17.x/crypto/testing/test.rc5 --- lin.2.2.17/crypto/testing/test.rc5 Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/test.rc5 Sat Oct 14 00:48:17 2000 @@ -0,0 +1,1548 @@ +#!/bin/bash + +# NOTE! These are real test vectors but they _are not_ tested +# with ./testcip -program, since it didn't compile. -Pekka + +test () { + echo "Test number $I - keysize $KEYSIZE" + ./testcip -c rc5 -k $KEY -p $PLT -e $CIP | sed '/^Registered/d' +} + + +KEYSIZE=128 + +I=1 +KEY=00000000000000000000000000000000 +PLT=0000000000000000 +CIP=883883FF1E216EAE +test + +I=2 +KEY=4433112FEAB711778BEF67A792110E8F +PLT=883883FF1E216EAE +CIP=B778BA49909B416E +test + +I=3 +KEY=34674A5515253711848516413A3FA2D9 +PLT=B778BA49909B416E +CIP=FCD887CC6CFA3EC8 +test + +I=4 +KEY=2A34F9A881DE3F2C537E93949FEEE60C +PLT=FCD887CC6CFA3EC8 +CIP=8967D496B0790EDA +test + +I=5 +KEY=5C32634A4DDE89D67002430E38B084B6 +PLT=8967D496B0790EDA +CIP=EA2C67E337131273 +test + +I=6 +KEY=62C3A6BFDBDFC8ABB5358023A4C76153 +PLT=EA2C67E337131273 +CIP=A86C8CE7DF81CC2A +test + +I=7 +KEY=890157A721F7862748713E53716D30A7 +PLT=A86C8CE7DF81CC2A +CIP=C474526F0017C435 +test + +I=8 +KEY=FA1573DF3C738EA7ECA937038E89A3AF +PLT=C474526F0017C435 +CIP=E9428C0CBE68C918 +test + +I=9 +KEY=C486E9A07038E89C75B2B5F00786544C +PLT=E9428C0CBE68C918 +CIP=0BD943E39068D335 +test + +I=10 +KEY=0C2F94875343A2C3F48DD42FD847B593 +PLT=0BD943E39068D335 +CIP=D445FD7502F07D7E +test + +I=11 +KEY=8D3789B1F0A1301D05939C05B1CB8015 +PLT=D445FD7502F07D7E +CIP=71B62AEA0F789FB2 +test + +I=12 +KEY=3DACF2D62BC4948AA6F497AA6A16EA6A +PLT=71B62AEA0F789FB2 +CIP=D4DE56FFD5ACAC3B +test + +I=13 +KEY=0AD98B4F693728BFA58B41A3BBA185AF +PLT=D4DE56FFD5ACAC3B +CIP=27B9AAC70CE6DD54 +test + +I=14 +KEY=53438A230735B087BF71A8872CAB4517 +PLT=27B9AAC70CE6DD54 +CIP=96D4000A1FE521FE +test + +I=15 +KEY=751A9596D72A606A44F09D6E9F8A8E2A +PLT=96D4000A1FE521FE +CIP=027D596E70E67FDD +test + +I=16 +KEY=472A264AA54C4AAE90020BBA387EAACE +PLT=027D596E70E67FDD +CIP=084D7486097F5DEA +test + +I=17 +KEY=50E67E4A7D50F2A69C143C569B52A8E6 +PLT=084D7486097F5DEA +CIP=26DCE9FD91831497 +test + +I=18 +KEY=EA7DA3517A1D33BDC963906D128D19BD +PLT=26DCE9FD91831497 +CIP=DCAB4E64921547DA +test + +I=19 +KEY=3BA0DF5C89F44A3C9D62863089EAC8A4 +PLT=DCAB4E64921547DA +CIP=18ABE640B9E6B971 +test + +I=20 +KEY=EA829ED8CE226C5888A8687075304F90 +PLT=18ABE640B9E6B971 +CIP=2EDA40B0C834F765 +test + +I=21 +KEY=F9141E3C965EC0004AE427489F8C6890 +PLT=2EDA40B0C834F765 +CIP=059656D159706DAA +test + +I=22 +KEY=C305B5F9F5CDA5A1E59FEB05F00544E1 +PLT=059656D159706DAA +CIP=E59344102717A1A1 +test + +I=23 +KEY=CD2088A01AB458F09A76C3E4589E76A0 +PLT=E59344102717A1A1 +CIP=0B1A42A432EA975B +test + +I=24 +KEY=0CEA8624097AC3340F9C3928B4441A84 +PLT=0B1A42A432EA975B +CIP=935524627CF77EF6 +test + +I=25 +KEY=6FA285AEC47E9CF26DF0925E78229442 +PLT=935524627CF77EF6 +CIP=061166839FBF56C2 +test + +I=26 +KEY=01C5F6BB3B97019383F11A13103BBED3 +PLT=061166839FBF56C2 +CIP=40323BD418CE9235 +test + +I=27 +KEY=821A2534DBBE7FC449B8DC806A727864 +PLT=40323BD418CE9235 +CIP=D6FFB23A5BF8CE2C +test + +I=28 +KEY=C3623F96BC1E3392EA0CB906DE8C435A +PLT=D6FFB23A5BF8CE2C +CIP=F08B20BFCD2AF65B +test + +I=29 +KEY=5CBFAF0BC0E39B27D52FAC0F0B83852F +PLT=F08B20BFCD2AF65B +CIP=2DD627ECD3B20DF2 +test + +I=30 +KEY=1806CD906F9024545B72D6D4B4C25DCC +PLT=2DD627ECD3B20DF2 +CIP=0AD02B4DD18C2FFB +test + +I=31 +KEY=533B47B9D8E9380595414901A79F37AD +PLT=0AD02B4DD18C2FFB +CIP=2BDD595B901A0D51 +test + +I=32 +KEY=BDE3DBB78D77930BF6991DAB931566DB +PLT=2BDD595B901A0D51 +CIP=BF99EB003ABFFA8E +test + +I=33 +KEY=45469BF00AAECC60712AB87CCC383F90 +PLT=BF99EB003ABFFA8E +CIP=19FD0782C6B334D5 +test + +I=34 +KEY=A056430A4DB4EBA28446963AD94E4482 +PLT=19FD0782C6B334D5 +CIP=5962E34BFCF57F33 +test + +I=35 +KEY=EA6DF6B7E3BD8DA36027639342EB49DB +PLT=5962E34BFCF57F33 +CIP=BCB9F81F66089A02 +test + +I=36 +KEY=8EE7B38B1D2576F7AC9DEDDFC1030F7F +PLT=BCB9F81F66089A02 +CIP=74C4E87C119D6A43 +test + +I=37 +KEY=9E0E961466805F0C9326DF1802EE66BC +PLT=74C4E87C119D6A43 +CIP=7D3AC9E8CF4EE80D +test + +I=38 +KEY=6A58B288F01A2E7034CAAB4C2EDE2288 +PLT=7D3AC9E8CF4EE80D +CIP=C113094AD4F73BD9 +test + +I=39 +KEY=28BCAAA6790025EA77E891BEE594620A +PLT=C113094AD4F73BD9 +CIP=E83AC68878EC1F24 +test + +I=40 +KEY=7250B348C9181BD87F42728409920018 +PLT=E83AC68878EC1F24 +CIP=E77397A9393BA826 +test + +I=41 +KEY=9CEF33092C6FBD21A79333E13FCD66C9 +PLT=E77397A9393BA826 +CIP=21ED57E24E0FE088 +test + +I=42 +KEY=4958DEB2A99E700232E826BEBB18B6B2 +PLT=21ED57E24E0FE088 +CIP=46B7622DBF7DCA53 +test + +I=43 +KEY=8D095121375B5D155A1B3DB58DBF678D +PLT=46B7622DBF7DCA53 +CIP=852F7D08CC743ADD +test + +I=44 +KEY=3AF060C46EB201C085D662C8D6603B58 +PLT=852F7D08CC743ADD +CIP=0B707A89924B83D9 +test + +I=45 +KEY=7F9B2561991B2B1930BB1B896A0FBAD9 +PLT=0B707A89924B83D9 +CIP=4147445F321F8AE4 +test + +I=46 +KEY=2C13A3772C63C817F43B9AEB14CF2CEF +PLT=4147445F321F8AE4 +CIP=05C4479BF4590B10 +test + +I=47 +KEY=AC69F3730BD913CB3D7FC033E82D11BB +PLT=05C4479BF4590B10 +CIP=014EC1E0611BEA26 +test + +I=48 +KEY=F1A80E28019C0D50748283808292B910 +PLT=014EC1E0611BEA26 +CIP=6B345C61D43CD647 +test + +I=49 +KEY=5D4BBC51AC8596A994397B5DD8171D21 +PLT=6B345C61D43CD647 +CIP=A610C68608A514A7 +test + +I=50 +KEY=049029D6BA04E5BEE8DC275219347AD6 +PLT=A610C68608A514A7 +CIP=BBA9CAAB6AA0748C +test + +I=51 +KEY=DBCF0A1BA76D36DB60BD22ABB499CADB +PLT=BBA9CAAB6AA0748C +CIP=42E67363D4D613D5 +test + +I=52 +KEY=00FDF893744BC9B3C8D5AF3339AB8AC3 +PLT=42E67363D4D613D5 +CIP=A6D7BCAFEC02F2B2 +test + +I=53 +KEY=EAC7487B8495F0EF0087276F21EDCB9F +PLT=A6D7BCAFEC02F2B2 +CIP=437A809B72F19809 +test + +I=54 +KEY=D9A59D67AC25828B0BC198671687BEBB +PLT=437A809B72F19809 +CIP=438E97832A094DE0 +test + +I=55 +KEY=EC0D81EF0A79025B55B96A3F20EFBF83 +PLT=438E97832A094DE0 +CIP=A0722DDE3E45366B +test + +I=56 +KEY=1F108976CD9CF71625766F7E2E10C52E +PLT=A0722DDE3E45366B +CIP=FFA9FBC2AE73C071 +test + +I=57 +KEY=686EF53E967259EAEE44D1BE3E9240C2 +PLT=FFA9FBC2AE73C071 +CIP=F93605BF2E6F52BE +test + +I=58 +KEY=F47B4E7F3DC785E78C1F634BD02D854F +PLT=F93605BF2E6F52BE +CIP=1CF5FB81DF6FDFB9 +test + +I=59 +KEY=8F393029D80359A1A123DFB97AEB0271 +PLT=1CF5FB81DF6FDFB9 +CIP=5A4D3E3D82FD3E36 +test + +I=60 +KEY=23C551F5F3911DE55FE3001DC8A95A7D +PLT=5A4D3E3D82FD3E36 +CIP=A652BD50C400EEBA +test + +I=61 +KEY=075230ACE7166D480922209849E05270 +PLT=A652BD50C400EEBA +CIP=E805C1A1484EF1FC +test + +I=62 +KEY=5189DAED836F9F210D99291D03774B51 +PLT=E805C1A1484EF1FC +CIP=372E8983886B0A77 +test + +I=63 +KEY=720DA49338EF305BE75D31E31E573B63 +PLT=372E8983886B0A77 +CIP=8D7661153BA61A68 +test + +I=64 +KEY=7A2579E9F83941BD7329B10D230BD3C5 +PLT=8D7661153BA61A68 +CIP=963A87730EB2C805 +test + +I=65 +KEY=CB27205F9DA34A731D47129B32159D53 +PLT=963A87730EB2C805 +CIP=482EA344585DB33D +test + +I=66 +KEY=5E8A8410F004160CC6467254E858A204 +PLT=482EA344585DB33D +CIP=A473072F359BD765 +test + +I=67 +KEY=4E37DA3F7299E7A72FDB3FCF484BA33F +PLT=A473072F359BD765 +CIP=905C759B4C34BC6B +test + +I=68 +KEY=FD83A2DFCF175E6B10259977C4AD642B +PLT=905C759B4C34BC6B +CIP=E89E2443E6F522C0 +test + +I=69 +KEY=EE5712C74153EE2B1F0D494B9AE3EFA3 +PLT=E89E2443E6F522C0 +CIP=B5CCF6919E60CC1B +test + +I=70 +KEY=0B6B1065EB3DF2D1A247ABE1145D1DA1 +PLT=B5CCF6919E60CC1B +CIP=88FB0FF209027FFB +test + +I=71 +KEY=864E92AAF9F4200239747202E93ACAC2 +PLT=88FB0FF209027FFB +CIP=1216BABE92A51E11 +test + +I=72 +KEY=A120A7AA9BEC1D96DB6EBF5EBC70ECCE +PLT=1216BABE92A51E11 +CIP=8C06F25DEF2168D8 +test + +I=73 +KEY=E2C56325800134BD59BBBF4940A5983D +PLT=8C06F25DEF2168D8 +CIP=F71DDDE756056FDE +test + +I=74 +KEY=DAE1EAFB37CB17777BBF0D2B1ADFC417 +PLT=F71DDDE756056FDE +CIP=5BF56211FC3CE08B +test + +I=75 +KEY=C48FA649BA5161518B8BCEE56D014401 +PLT=5BF56211FC3CE08B +CIP=57D3FEEE0C478627 +test + +I=76 +KEY=1900BC76589673362EB2371ED90C24BE +PLT=57D3FEEE0C478627 +CIP=FB1193AF48F3459B +test + +I=77 +KEY=5005D1D75087E9076EE34B87B30BBE5F +PLT=FB1193AF48F3459B +CIP=CB9785BFA8406508 +test + +I=78 +KEY=A8915D038917D51F44BD26134289D63F +PLT=CB9785BFA8406508 +CIP=8549B183313FCA50 +test + +I=79 +KEY=043F67BB8B3113A3710D13373DEB4013 +PLT=8549B183313FCA50 +CIP=A6BBB9CDB600EF18 +test + +I=80 +KEY=E96F5EC5C8997ABDCD294EDD983D9AAD +PLT=A6BBB9CDB600EF18 +CIP=726CD70982409ADE +test + +I=81 +KEY=BF059641D53D5C31B91756A9538BAE29 +PLT=726CD70982409ADE +CIP=1C76C2F3A6B6ADDC +test + +I=82 +KEY=493971A385CB377B60A31773914558A3 +PLT=1C76C2F3A6B6ADDC +CIP=895007DA59B8E78B +test + +I=83 +KEY=BB7C68D633E88592B194F2A6857E90CA +PLT=895007DA59B8E78B +CIP=6ABFD6669330CAFF +test + +I=84 +KEY=676E0CD6799E076EACA0355610647976 +PLT=6ABFD6669330CAFF +CIP=23A3E7C2312F40E7 +test + +I=85 +KEY=71400AAA0A088C8AECB0C636E90A7A62 +PLT=23A3E7C2312F40E7 +CIP=67E8F5BB6EC317E8 +test + +I=86 +KEY=028FE18307072C2BBCB3DE2B71B50C6B +PLT=67E8F5BB6EC317E8 +CIP=C2C8E60D0C2FEAD7 +test + +I=87 +KEY=7F1F97A92AF71C95934F16496A13D89D +PLT=C2C8E60D0C2FEAD7 +CIP=A09C11A69AF50A19 +test + +I=88 +KEY=F4487A7637C23DC6A72EAEAAA3380DD6 +PLT=A09C11A69AF50A19 +CIP=44C2FD13F354918D +test + +I=89 +KEY=18433BAB4CD109AB979FA48F51D53763 +PLT=44C2FD13F354918D +CIP=347513216FAF48AB +test + +I=90 +KEY=DDC111110F5B5049A5D1425DA195B9A1 +PLT=347513216FAF48AB +CIP=D0CEB4AF93FCCA68 +test + +I=91 +KEY=04E559736163CD17B149812F2B6F1C4F +PLT=D0CEB4AF93FCCA68 +CIP=A536286FF2835BC7 +test + +I=92 +KEY=73CB7067C6B9794F94BB4BC7E5650CAF +PLT=A536286FF2835BC7 +CIP=E51FDC33A4922310 +test + +I=93 +KEY=15A159CFB4C9EA13419F7417EA9BC033 +PLT=E51FDC33A4922310 +CIP=74EF2C30E7019E9B +test + +I=94 +KEY=C0F29684A1DE3FC085A861E0849685C0 +PLT=74EF2C30E7019E9B +CIP=C2F199B2B8E465CD +test + +I=95 +KEY=01CEC9B25EB0A95ADF82885E7C7C10E2 +PLT=C2F199B2B8E465CD +CIP=461ECB1BBDD216C8 +test + +I=96 +KEY=4B610D0300C324E3E91B5083AED30B4B +PLT=461ECB1BBDD216C8 +CIP=F4E4948DC4D27A2E +test + +I=97 +KEY=FBFD7559B8BFB0E5D92360651A75A2DD +PLT=F4E4948DC4D27A2E +CIP=B9FF7CBF51189BE5 +test + +I=98 +KEY=F5910AE3BF4B447FE57D50835C2B545F +PLT=B9FF7CBF51189BE5 +CIP=7CDE71A25DD6450D +test + +I=99 +KEY=6FEC1C06BF745192888A066233067442 +PLT=7CDE71A25DD6450D +CIP=3994CF3989226B4C +test + +I=100 +KEY=D6F9076178BDACC1857F45698E5F80A9 +PLT=3994CF3989226B4C +CIP=817D63B20B63D6FB +test + +I=101 +KEY=158217F65E88C67A0DEAB0E642642142 +PLT=817D63B20B63D6FB +CIP=6F5E5E134B464B0E +test + +I=102 +KEY=3FC960B794C11E83E751B7430C3F2403 +PLT=6F5E5E134B464B0E +CIP=66E7F0E5CC27164F +test + +I=103 +KEY=25A3D8497D119DD57437E3699A75EB25 +PLT=66E7F0E5CC27164F +CIP=7ECBF284D12C2907 +test + +I=104 +KEY=C1960F404F6CD3D4C6162B8CD09E9E94 +PLT=7ECBF284D12C2907 +CIP=DD621E777CF11221 +test + +I=105 +KEY=D535E34BE03F09F7F1E1D0DF5475BAB7 +PLT=DD621E777CF11221 +CIP=04931D3D3F19C113 +test + +I=106 +KEY=F1E73D0D728D7C5D4E6DD8B931534C3D +PLT=04931D3D3F19C113 +CIP=7F0923D40494C7A5 +test + +I=107 +KEY=80402038ACB2897CE232CB4C3836EE44 +PLT=7F0923D40494C7A5 +CIP=AFA196C7F5991792 +test + +I=108 +KEY=AF03F5D3F3C3BE778CB5BE87042F3037 +PLT=AFA196C7F5991792 +CIP=DFAC3E8F35205169 +test + +I=109 +KEY=5AC7371BF97D57576581C367AB0BE70F +PLT=DFAC3E8F35205169 +CIP=97671E5CC3DFA2F5 +test + +I=110 +KEY=79F87EB86A6079A4E046E204CAAA094C +PLT=97671E5CC3DFA2F5 +CIP=9D7001B8F47474E0 +test + +I=111 +KEY=C77079B8188613C8DA8209BC28B00AB8 +PLT=9D7001B8F47474E0 +CIP=BD1B85428B44EFD1 +test + +I=112 +KEY=A0AEF516B6A0A6B2C2E8553AE5D48382 +PLT=BD1B85428B44EFD1 +CIP=CEF9411204DBB0DD +test + +I=113 +KEY=1CFCAD3ABE76A6B21652171A314A6BB2 +PLT=CEF9411204DBB0DD +CIP=AA5E86E576BAEAD1 +test + +I=114 +KEY=75C9F82D98895A755D9FE3E57569B675 +PLT=AA5E86E576BAEAD1 +CIP=5356FFC9DDA8858E +test + +I=115 +KEY=73C3BA61C4053A914485A0E1A9575219 +PLT=5356FFC9DDA8858E +CIP=DC5605588219BA0E +test + +I=116 +KEY=90AAEFC091EA75E00DCC3B6078CED418 +PLT=DC5605588219BA0E +CIP=9AF377A4DF1AF6C4 +test + +I=117 +KEY=AA422314E78CEF24334AA0885C868F14 +PLT=9AF377A4DF1AF6C4 +CIP=65EE9FF12244080B +test + +I=118 +KEY=E521153D214F6409E1BB59852B2B7C31 +PLT=65EE9FF12244080B +CIP=80A0D82D08AD2727 +test + +I=119 +KEY=276D174529F90FAD4B5145B1459B82BD +PLT=80A0D82D08AD2727 +CIP=DE4A09776C8431D8 +test + +I=120 +KEY=A9B1E4AF9227192F485B77C38B290FC7 +PLT=DE4A09776C8431D8 +CIP=70CBBC4EF0232C14 +test + +I=121 +KEY=4782B49E0DCECEF649BC7486298803CE +PLT=70CBBC4EF0232C14 +CIP=335545FF9FEC562C +test + +I=122 +KEY=CD7D4A7340F5EB77E9AF2DBFE829DEAF +PLT=335545FF9FEC562C +CIP=E8D2EEB266DF09D8 +test + +I=123 +KEY=5D30BFBAE31C4E8AF4D27B5E0F308A12 +PLT=E8D2EEB266DF09D8 +CIP=4BC37331863E2F4B +test + +I=124 +KEY=B3877E7141D11D11AB051D150E31AFD1 +PLT=4BC37331863E2F4B +CIP=0D8E2A158120676B +test + +I=125 +KEY=DA0F051187C11DE58859B20598E14F35 +PLT=0D8E2A158120676B +CIP=7E026D14C8591C67 +test + +I=126 +KEY=02EEE1EC32D41A3C918075E877AA3ED4 +PLT=7E026D14C8591C67 +CIP=91C6E084E4C3A25A +test + +I=127 +KEY=BDF6B078E7AE8434908A1D483000E454 +PLT=91C6E084E4C3A25A +CIP=EC67F6FE4CD74E43 +test + +I=128 +KEY=4AFCC362B0A44ABE4B3E0E4286A27A0E +PLT=EC67F6FE4CD74E43 +CIP=1CEA06CF62B737A0 +test + +I=129 +KEY=DC6D33DF31D79A376B07C3831033C4AF +PLT=1CEA06CF62B737A0 +CIP=ABF319BEFEAB17E6 +test + +I=130 +KEY=7728EE029B18D14E0FAADB6A26EEDE0E +PLT=ABF319BEFEAB17E6 +CIP=2FA845279E184D1B +test + +I=131 +KEY=44D1F4D7A899E0BF774D8A8798237817 +PLT=2FA845279E184D1B +CIP=B59D26A53B9F3C16 +test + +I=132 +KEY=1F1F0131308DEE15B8C7380955595BB5 +PLT=B59D26A53B9F3C16 +CIP=5402D7F2843361A5 +test + +I=133 +KEY=215289D246F81ED26000EE9A547E9112 +PLT=5402D7F2843361A5 +CIP=2FDFC82DC29DEB09 +test + +I=134 +KEY=05BD7E71C4AF6B354E059B75DD47067D +PLT=2FDFC82DC29DEB09 +CIP=1405F43C5B74A09F +test + +I=135 +KEY=4ADC70808C189EACC67A4FCC922E2D2C +PLT=1405F43C5B74A09F +CIP=E3C2261579F93ADA +test + +I=136 +KEY=E195A7A5350F06050F3FC80D5D4F7CA5 +PLT=E3C2261579F93ADA +CIP=7C8E6CD59CA7DAAE +test + +I=137 +KEY=4DD36711E107A1F5540B7A257D25A7C5 +PLT=7C8E6CD59CA7DAAE +CIP=D372EAB336A44A5A +test + +I=138 +KEY=E4FB0E3FCB0D604B5F4BCBC736199403 +PLT=D372EAB336A44A5A +CIP=FA96B094C7DCEEF3 +test + +I=139 +KEY=D634AE6487686D1C0EF4B8449AF09C04 +PLT=FA96B094C7DCEEF3 +CIP=FDEA162D6EB09608 +test + +I=140 +KEY=2C01C1A1E7F959956AA131197DAB111D +PLT=FDEA162D6EB09608 +CIP=8654F781884AAC3B +test + +I=141 +KEY=54FDB8C9864F90C98A691339A53FD681 +PLT=8654F781884AAC3B +CIP=E372EE8FC03C8C4D +test + +I=142 +KEY=D461A93BB3CF624F9659C02BE693BC2F +PLT=E372EE8FC03C8C4D +CIP=87EA0DFD7ABE61E9 +test + +I=143 +KEY=7D09E059CAA56285A77191CD080FD57D +PLT=87EA0DFD7ABE61E9 +CIP=6ADFBE420889CDE3 +test + +I=144 +KEY=4B9AC05A0C827EC22A84C3DED8C0B1D2 +PLT=6ADFBE420889CDE3 +CIP=6F31C3EF3A56D66F +test + +I=145 +KEY=54BDD657FA95F60FB909EA8F0F89519F +PLT=6F31C3EF3A56D66F +CIP=F27546BDE1A1DD2A +test + +I=146 +KEY=6CC18FBD505D1BCDE5E16219CF8F5B5D +PLT=F27546BDE1A1DD2A +CIP=5271A1BF41E1F8ED +test + +I=147 +KEY=25616E4F0FBB7967B091481B58639D7F +PLT=5271A1BF41E1F8ED +CIP=B77EF9B7412D74D5 +test + +I=148 +KEY=E76DAE275EF199173CF3515739359DE7 +PLT=B77EF9B7412D74D5 +CIP=FB519D537F03C0DE +test + +I=149 +KEY=3EBDD9B3849D6E7B69EFF26B6213BCE3 +PLT=FB519D537F03C0DE +CIP=6CFF1710ADE9AFAD +test + +I=150 +KEY=93A8EC0CB1A2A59045A8BB84157E04C0 +PLT=6CFF1710ADE9AFAD +CIP=0D783FF6079C2D11 +test + +I=151 +KEY=BBC25FE2A60246CE032EB1F25B3E0716 +PLT=0D783FF6079C2D11 +CIP=791A75C228B3D365 +test + +I=152 +KEY=CBE6FB02EFDAD712ACF23AC61D98D062 +PLT=791A75C228B3D365 +CIP=63F01470159B9E47 +test + +I=153 +KEY=D87EC6240D0699681342B0307E842D60 +PLT=63F01470159B9E47 +CIP=41722CCF0A7914A8 +test + +I=154 +KEY=AF0154436B730AD7A5313C9728B748AF +PLT=41722CCF0A7914A8 +CIP=B6A366ABC8F189AE +test + +I=155 +KEY=6CC51BDB93D554C305E780CB0347EF7B +PLT=B6A366ABC8F189AE +CIP=BB37DA35FFD80457 +test + +I=156 +KEY=03ADB3A528E9BD7D1B9312B1C9B3DCD5 +PLT=BB37DA35FFD80457 +CIP=9FE86E9822A94D70 +test + +I=157 +KEY=8F20207416085F48F2B6E4F062BAB108 +PLT=9FE86E9822A94D70 +CIP=42108BFA127FAB39 +test + +I=158 +KEY=D8683FF639A6F3DA1D72B0AE4B60D9BA +PLT=42108BFA127FAB39 +CIP=C84A5F8E164485F0 +test + +I=159 +KEY=01C4A88E6C4C4C9E9182E24E58BE652E +PLT=C84A5F8E164485F0 +CIP=0D7E9B5CC0AC33DF +test + +I=160 +KEY=83F8122078746BB4AFB62E68CBC2ADEC +PLT=0D7E9B5CC0AC33DF +CIP=340E0E67ADD2D77D +test + +I=161 +KEY=B75F9DB7F6AD30CFF50F719B0C2F8DB7 +PLT=340E0E67ADD2D77D +CIP=9B2DA0E5281016C2 +test + +I=162 +KEY=4FBFEFA9C227C4ADF3C763112B2988E5 +PLT=9B2DA0E5281016C2 +CIP=411F45BC6F280B37 +test + +I=163 +KEY=62D098509208532C466249C0AADA45BC +PLT=411F45BC6F280B37 +CIP=29CA18AFF6993FEE +test + +I=164 +KEY=BB59884FB3C5973FCE7348732B93EC7F +PLT=29CA18AFF6993FEE +CIP=11D5047D502C8D28 +test + +I=165 +KEY=6869EC6541EFECADA7593BC58905A81D +PLT=11D5047D502C8D28 +CIP=613E40D662A9058F +test + +I=166 +KEY=B660296E9920772ECAF2528A65A226B6 +PLT=613E40D662A9058F +CIP=3ADAE5366AB89201 +test + +I=167 +KEY=3146DD6A5E3670963AE240DA73A63BD6 +PLT=3ADAE5366AB89201 +CIP=2685B0A6C4F47780 +test + +I=168 +KEY=0354868A55DA211ED35AADE62770EAC6 +PLT=2685B0A6C4F47780 +CIP=DC06A2F4510B0D98 +test + +I=169 +KEY=7A4292C85ACABFEC2A506684DABE93D4 +PLT=DC06A2F4510B0D98 +CIP=B5ABE033A943715F +test + +I=170 +KEY=755B4193D293783BA19307EF8AF18593 +PLT=B5ABE033A943715F +CIP=55145BC9489DC79E +test + +I=171 +KEY=8E7FA619EB4D61618A2B891119177ED9 +PLT=55145BC9489DC79E +CIP=469589A83E15795C +test + +I=172 +KEY=0E4A0F1419E04410215CAE1880049668 +PLT=469589A83E15795C +CIP=60546FDB6E75B430 +test + +I=173 +KEY=001569574191C053C9C3DCC333D79A4B +PLT=60546FDB6E75B430 +CIP=C53251F7D7794ED9 +test + +I=174 +KEY=4199BB77AC557737C06B8C9F38E788D7 +PLT=C53251F7D7794ED9 +CIP=4597FC424A659374 +test + +I=175 +KEY=1CCAF95EACA81CCA985E036A948035B2 +PLT=4597FC424A659374 +CIP=139FA4C13FE579E8 +test + +I=176 +KEY=192763495405D351F14FDC3DE2798091 +PLT=139FA4C13FE579E8 +CIP=46284F4AAE8C6762 +test + +I=177 +KEY=08BE1FDAB36CCBAADD50DA8238F0CFDA +PLT=46284F4AAE8C6762 +CIP=9A6B08B20AB64D88 +test + +I=178 +KEY=C04C0ABA375C2182998A89DADE0ABAA2 +PLT=9A6B08B20AB64D88 +CIP=A3EF435A254AA1BC +test + +I=179 +KEY=31C60CFAA936CAB241D0E512D60C559A +PLT=A3EF435A254AA1BC +CIP=F04905782C96729A +test + +I=180 +KEY=B738BC245D7693F0EAF094786338E7A8 +PLT=F04905782C96729A +CIP=D890D9B6FA044BFC +test + +I=181 +KEY=F97E762AF14AB1CE5C240E1A601E9036 +PLT=D890D9B6FA044BFC +CIP=8DF90CD89185BD2B +test + +I=182 +KEY=6C4EE4A81ED06C981DBA62F07B08A8A8 +PLT=8DF90CD89185BD2B +CIP=E9962A11CADA1476 +test + +I=183 +KEY=BB19C26DDDF7B52974DFCFB937E3A761 +PLT=E9962A11CADA1476 +CIP=01E654B4F7D702B6 +test + +I=184 +KEY=F006FCE4C8B4B4D429AE82A83936ABB4 +PLT=01E654B4F7D702B6 +CIP=DE2A01F4C83D4FBD +test + +I=185 +KEY=FE9E2908B8D6142C0386CC08624A32A4 +PLT=DE2A01F4C83D4FBD +CIP=4FBD9F7388027424 +test + +I=186 +KEY=202B7D0BC7BBEC7363DD204BA47D25E3 +PLT=4FBD9F7388027424 +CIP=EF831C50ABF89607 +test + +I=187 +KEY=DF20CEC4EE581C70AB40A894BB0859D0 +PLT=EF831C50ABF89607 +CIP=A50964BD7BAED843 +test + +I=188 +KEY=D0DDDACDCC039DED553717812BB9170D +PLT=A50964BD7BAED843 +CIP=7D782764FFA0A8BE +test + +I=189 +KEY=818676605F9A4BAC1ADE7C6018345F54 +PLT=7D782764FFA0A8BE +CIP=E926424E163DCD43 +test + +I=190 +KEY=A0C24EEE70AA9746D594D216D3D2D3BE +PLT=E926424E163DCD43 +CIP=D22F59B40BA6EF61 +test + +I=191 +KEY=10C2D770BD10BB442D1CC410CA1C09C4 +PLT=D22F59B40BA6EF61 +CIP=7622C571BBF113D6 +test + +I=192 +KEY=CF3F94B1840739310DED25D97B5DE8B1 +PLT=7622C571BBF113D6 +CIP=F12288744E04E3C2 +test + +I=193 +KEY=11A600F891D4EF2CD67A9DF04D84A6D4 +PLT=F12288744E04E3C2 +CIP=2F4476E3F9AC3806 +test + +I=194 +KEY=CD5FB9076D23584B3A6723AF73B9E973 +PLT=2F4476E3F9AC3806 +CIP=2583FF8C16ED6666 +test + +I=195 +KEY=35C82F501C8077F40592B270CEEADBBC +PLT=2583FF8C16ED6666 +CIP=A8C25E5702002AB0 +test + +I=196 +KEY=216D49CF34AD93473AED123B36CD07B7 +PLT=A8C25E5702002AB0 +CIP=4064EB43FEAFD539 +test + +I=197 +KEY=D3B36F97C497B2C3809DDD17078580D3 +PLT=4064EB43FEAFD539 +CIP=973E2EDFB4F8360A +test + +I=198 +KEY=E3F7BDE32D61621F8EC5E323ADE9482F +PLT=973E2EDFB4F8360A +CIP=4D2CAF26D7A6839F +test + +I=199 +KEY=4FA402465C36C71E36280E0A46026CD6 +PLT=4D2CAF26D7A6839F +CIP=495E72861ED2FA07 +test + +I=200 +KEY=A03404D683DCC72EF122A5960704AC46 +PLT=495E72861ED2FA07 +CIP=0E5459C40522EAA7 +test + +I=201 +KEY=803C4F14E01C1A3CDF7453DC89B2C944 +PLT=0E5459C40522EAA7 +CIP=484A71FEA947E559 +test + +I=202 +KEY=0352A7C67B94EA66E260C62A7EDE724E +PLT=484A71FEA947E559 +CIP=B89282B381559C3D +test + +I=203 +KEY=81D114C378D18D736351455BC3CFDA63 +PLT=B89282B381559C3D +CIP=2C59A1CF370982F9 +test + +I=204 +KEY=F6DD9533CB8378CFBA6910DB2A27256F +PLT=2C59A1CF370982F9 +CIP=B63893339044E3BF +test + +I=205 +KEY=B5F75B4F570B102315C133637CB360D3 +PLT=B63893339044E3BF +CIP=4CAE18100BEA368F +test + +I=206 +KEY=2362A4C8B55AA7A04CB0EB2877204E50 +PLT=4CAE18100BEA368F +CIP=508646575A15ECB9 +test + +I=207 +KEY=74857947E96FDD57EDD7476B8F0B2547 +PLT=508646575A15ECB9 +CIP=16004ECF06D205EB +test + +I=208 +KEY=341F17A354B152BF976DD477E2C7C27F +PLT=16004ECF06D205EB +CIP=5CF08AC79EBFF2BA +test + +I=209 +KEY=9F8BC59342279F1F11ED54BFDB57D027 +PLT=5CF08AC79EBFF2BA +CIP=FBEEE6E3E3FA9AAB +test + +I=210 +KEY=B55BDE67308DF1EB26556043160D78D3 +PLT=FBEEE6E3E3FA9AAB +CIP=6E345F03FF6377E8 +test + +I=211 +KEY=050BB8BFD9CD6E932D29875FBFD9E023 +PLT=6E345F03FF6377E8 +CIP=9B9611D70867C0D1 +test + +I=212 +KEY=1B39EB0352C55D1F2599C0E778D59957 +PLT=9B9611D70867C0D1 +CIP=DAF0C46A385E783F +test + +I=213 +KEY=FA9A8A22C80A73BAA922148EC406930A +PLT=DAF0C46A385E783F +CIP=D82DD2D52686F120 +test + +I=214 +KEY=AE01F9E115F9272DC0B7EF7148A1D045 +PLT=D82DD2D52686F120 +CIP=B6E7FAFF95B5601D +test + +I=215 +KEY=99579BDBA185366F0DE7178F8A43093F +PLT=B6E7FAFF95B5601D +CIP=19D24D8DB2FF6999 +test + +I=216 +KEY=C6419A75743F7BD507AB8A55BD8F825D +PLT=19D24D8DB2FF6999 +CIP=EE74D01E49B02923 +test + +I=217 +KEY=52141C3A5670A01E2C34B14EAFB6568E +PLT=EE74D01E49B02923 +CIP=650003F0AC78DDCF +test + +I=218 +KEY=5926C1A44F4A2C902BA4C7644A5E91E0 +PLT=650003F0AC78DDCF +CIP=8A1A4201CB35698E +test + +I=219 +KEY=E7476FBD9F8D12B939397EDD489BE751 +PLT=8A1A4201CB35698E +CIP=30D4B2D556325343 +test + +I=220 +KEY=8D179C51681FAE65856351A5C6231515 +PLT=30D4B2D556325343 +CIP=B84D98C1C7496DFE +test + +I=221 +KEY=60F5EEC91979A5699C393DC10C49DC51 +PLT=B84D98C1C7496DFE +CIP=A5FE28B39207D1E2 +test + +I=222 +KEY=8037D15FF6CB1D337253581F4DA50D53 +PLT=A5FE28B39207D1E2 +CIP=6082ECB44CB335B0 +test + +I=223 +KEY=84A260182C0C2D14496611E4B1343184 +PLT=6082ECB44CB335B0 +CIP=8C29FA05479CB354 +test + +I=224 +KEY=B50B6125CADDF1ADBFEB10F1A31F6AB5 +PLT=8C29FA05479CB354 +CIP=A388DBDCE3DF7C51 +test + +I=225 +KEY=E4DCB160F18A548C88A86748DEE82E6C +PLT=A388DBDCE3DF7C51 +CIP=F17792A2F0B03856 +test + +I=226 +KEY=9E4052B66B80269A489E3FCA2626CF62 +PLT=F17792A2F0B03856 +CIP=37106FB40A5A62AE +test + +I=227 +KEY=6B907674E534BCF45650662411B8C6D4 +PLT=37106FB40A5A62AE +CIP=8246745732174575 +test + +I=228 +KEY=947315A35D85738736F15D0791C57267 +PLT=8246745732174575 +CIP=0ECD20FA52B7ED7D +test + +I=229 +KEY=F6E62712066084D2B38ABAB2D8A073BA +PLT=0ECD20FA52B7ED7D +CIP=6C3AE64082C4F2D3 +test + +I=230 +KEY=CD609004646EE2986634EBA055222BA0 +PLT=6C3AE64082C4F2D3 +CIP=8E7D9F47565CA786 +test + +I=231 +KEY=F2F7C2CB9BC5EFCF2BC5937F8CCD74A7 +PLT=8E7D9F47565CA786 +CIP=76ECA83CB23DB045 +test + +I=232 +KEY=48FC37D8D734ED2C06A8617036167F0C +PLT=76ECA83CB23DB045 +CIP=5513837DB5C0AE31 +test + +I=233 +KEY=697FC95D53CD031D5E1587213945B82D +PLT=5513837DB5C0AE31 +CIP=03FA443F67D97740 +test + +I=234 +KEY=81CF44F300777B278DCF135FD8A7DB9F +PLT=03FA443F67D97740 +CIP=B6BF41C92C4BA925 +test + +I=235 +KEY=810BC62DBE1DE7E9F1E7C7A199E7E609 +PLT=B6BF41C92C4BA925 +CIP=A437A2CC60A3899A +test + +I=236 +KEY=4B1C2F8430501BCCC56C37AC7B50E73C +PLT=A437A2CC60A3899A +CIP=0D073B2DACD1DE7F +test + +I=237 +KEY=7C2982D984D11FB5F643E045B5A36C6D +PLT=0D073B2DACD1DE7F +CIP=9F1DA216D1CCB42A +test + +I=238 +KEY=75D202DE61845D0EC0C6753272C8DB66 +PLT=9F1DA216D1CCB42A +CIP=DA949E68AA4312F9 +test + +I=239 +KEY=76D8CEACDADA46C01E2EE464BE4A5358 +PLT=DA949E68AA4312F9 +CIP=7535B6508100C572 +test + +I=240 +KEY=B144D6487B660968A1D84824B46897C0 +PLT=7535B6508100C572 +CIP=9C7B2962BD28588B +test + +I=241 +KEY=A38EE37625DAA082A03476C2883E6AB2 +PLT=9C7B2962BD28588B +CIP=F4F0C5E36F1BCB4A +test + +I=242 +KEY=8FE7CD3B3E03C5EBEA59D53F685F4453 +PLT=F4F0C5E36F1BCB4A +CIP=A65FB8441CD2F52E +test + +I=243 +KEY=03708A6011C6C96C112A4400061C1CE4 +PLT=A65FB8441CD2F52E +CIP=499A7317E352869A +test + +I=244 +KEY=6EB7B73B13192F3F3B1DDC97563350D7 +PLT=499A7317E352869A +CIP=DC74E83F914CE1F5 +test + +I=245 +KEY=79D3992BF897A3D70F252427612BDC1F +PLT=DC74E83F914CE1F5 +CIP=6204047C6D1D7851 +test + +I=246 +KEY=E6AA23B0C3D262F431A40F18832EDA8C +PLT=6204047C6D1D7851 +CIP=E2CBEB58BEFE5DEF +test + +I=247 +KEY=F282785CC97A38E07E20E83C65E66D98 +PLT=E2CBEB58BEFE5DEF +CIP=AD9720A18DF4ECD8 +test + +I=248 +KEY=07B5D7A9779D8EC9E6917F817C695561 +PLT=AD9720A18DF4ECD8 +CIP=DF34149BD0B8E3D1 +test + +I=249 +KEY=C39B7EDB3F4196138E15AA8F0C73574B +PLT=DF34149BD0B8E3D1 +CIP=E7B1A2C903E20CCC +test + +I=250 +KEY=0621A845AFBF6399855D6F2D18C91EC9 +PLT=E7B1A2C903E20CCC +CIP=5F303A708CA44CC1 +test + +I=251 +KEY=3AA4F788AED061D0AB7CD568D0D644D0 +PLT=5F303A708CA44CC1 +CIP=5E3651FE419CD9FC +test + +I=252 +KEY=E472E896CDEE669E1E600392C34ED94E +PLT=5E3651FE419CD9FC +CIP=33135B2B11B94C13 +test + +I=253 +KEY=CCC95DC34527B44B3CE1AE0B571BBFDB +PLT=33135B2B11B94C13 +CIP=E8FD390B5F252B1A +test + +I=254 +KEY=2BC779EBE6490423CA49E42B91D1B72B +PLT=E8FD390B5F252B1A +CIP=762D2725FBEF2DBE +test + +I=255 +KEY=EFDFCB952B81A19D93AD2C495FCB1495 +PLT=762D2725FBEF2DBE +CIP=A8077693C5E70D85 +test + +I=256 +KEY=B9E7288F4B91B00B07290A4BAA072D23 +PLT=A8077693C5E70D85 +CIP=E517B7748C7F6DE7 +test diff -urN lin.2.2.17/crypto/testing/test.serpent int.2.2.17.x/crypto/testing/test.serpent --- lin.2.2.17/crypto/testing/test.serpent Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/test.serpent Sat Oct 14 00:48:17 2000 @@ -0,0 +1,6033 @@ +#!/bin/bash + +test () { + echo "Test number $I - keysize $KEYSIZE" + ./testcip -c serpent -k $KEY -p $PT -e $CT | sed '/^Registered/d' +} + +# This data is from the Serpent AES submission (filename ecb_e_m.txt) + +KEYSIZE=128 + +I=0 +KEY=00000000000000000000000000000000 +PT=00000000000000000000000000000000 +CT=90e7a5ba9497fa1bfc00f7d1a3a86a1e +test + +I=1 +KEY=90e7a5ba9497fa1bfc00f7d1a3a86a1e +PT=90e7a5ba9497fa1bfc00f7d1a3a86a1e +CT=5d0c5da998aaa940d493738892579447 +test + +I=2 +KEY=cdebf8130c3d535b2893845931fffe59 +PT=5d0c5da998aaa940d493738892579447 +CT=b5e6510fbbd63d828ade0b89ae48ef5f + +I=3 +KEY=780da91cb7eb6ed9a24d8fd09fb71106 +PT=b5e6510fbbd63d828ade0b89ae48ef5f +CT=8056b61dacb4d3f52976ef5b1d4165e8 + +I=4 +KEY=f85b1f011b5fbd2c8b3b608b82f674ee +PT=8056b61dacb4d3f52976ef5b1d4165e8 +CT=3997c4990223e5c70f3cb015f48ec57a + +I=5 +KEY=c1ccdb98197c58eb8407d09e7678b194 +PT=3997c4990223e5c70f3cb015f48ec57a +CT=b7754c34b5837b193364fc55cca342d3 + +I=6 +KEY=76b997acacff23f2b7632ccbbadbf347 +PT=b7754c34b5837b193364fc55cca342d3 +CT=e913e0510a87bdbc5307183b43e5bead + +I=7 +KEY=9faa77fda6789e4ee46434f0f93e4dea +PT=e913e0510a87bdbc5307183b43e5bead +CT=5deecef8bb9617241c3b72b0ca15d781 + +I=8 +KEY=c244b9051dee896af85f4640332b9a6b +PT=5deecef8bb9617241c3b72b0ca15d781 +CT=f93e76e8ea57a73ecf91768d887a3132 + +I=9 +KEY=3b7acfedf7b92e5437ce30cdbb51ab59 +PT=f93e76e8ea57a73ecf91768d887a3132 +CT=4155187326abdd90e66ee198b92852c5 + +I=10 +KEY=7a2fd79ed112f3c4d1a0d1550279f99c +PT=4155187326abdd90e66ee198b92852c5 +CT=5c4242407bd8348aa3c3b6a243b7c371 + +I=11 +KEY=266d95deaacac74e726367f741ce3aed +PT=5c4242407bd8348aa3c3b6a243b7c371 +CT=5b4cecf483508ff319caa2f00a0c17d5 + +I=12 +KEY=7d21792a299a48bd6ba9c5074bc22d38 +PT=5b4cecf483508ff319caa2f00a0c17d5 +CT=aeeb485281bb39e30c56a9e7aa636ca8 + +I=13 +KEY=d3ca3178a821715e67ff6ce0e1a14190 +PT=aeeb485281bb39e30c56a9e7aa636ca8 +CT=74aa340e5149fd50a92687169a5dad2c + +I=14 +KEY=a7600576f9688c0eced9ebf67bfcecbc +PT=74aa340e5149fd50a92687169a5dad2c +CT=8bcead0ed0a0932cf13fcb7ab5011a8d + +I=15 +KEY=2caea87829c81f223fe6208ccefdf631 +PT=8bcead0ed0a0932cf13fcb7ab5011a8d +CT=c4002db30e5fcde6f52f855600d1c2d5 + +I=16 +KEY=e8ae85cb2797d2c4cac9a5dace2c34e4 +PT=c4002db30e5fcde6f52f855600d1c2d5 +CT=e9dd90ae5a580fef7f81620f75390414 + +I=17 +KEY=017315657dcfdd2bb548c7d5bb1530f0 +PT=e9dd90ae5a580fef7f81620f75390414 +CT=f27e886c458ef023209736a2359d3895 + +I=18 +KEY=f30d9d0938412d0895dff1778e880865 +PT=f27e886c458ef023209736a2359d3895 +CT=8b740f950c175f95040ca834cc11e520 + +I=19 +KEY=7879929c3456729d91d359434299ed45 +PT=8b740f950c175f95040ca834cc11e520 +CT=27d47ca238d5938fa213d8638f5b0f32 + +I=20 +KEY=5fadee3e0c83e11233c08120cdc2e277 +PT=27d47ca238d5938fa213d8638f5b0f32 +CT=8b518675e0dd55858c6f8ca18baa526b + +I=21 +KEY=d4fc684bec5eb497bfaf0d814668b01c +PT=8b518675e0dd55858c6f8ca18baa526b +CT=720a221100bdf2b047c7ea8696e2b3fa + +I=22 +KEY=a6f64a5aece34627f868e707d08a03e6 +PT=720a221100bdf2b047c7ea8696e2b3fa +CT=a429e76808fa660c6d60eed37e34f1a9 + +I=23 +KEY=02dfad32e419202b950809d4aebef24f +PT=a429e76808fa660c6d60eed37e34f1a9 +CT=d3df614f50d17762938398a0831b0296 + +I=24 +KEY=d100cc7db4c85749068b91742da5f0d9 +PT=d3df614f50d17762938398a0831b0296 +CT=f29296629ff5f465fafb6bfc1f813515 + +I=25 +KEY=23925a1f2b3da32cfc70fa883224c5cc +PT=f29296629ff5f465fafb6bfc1f813515 +CT=80d6d15957374029996a623c99238958 + +I=26 +KEY=a3448b467c0ae305651a98b4ab074c94 +PT=80d6d15957374029996a623c99238958 +CT=9b47672e762432137d13f94ecd75d81b + +I=27 +KEY=3803ec680a2ed116180961fa6672948f +PT=9b47672e762432137d13f94ecd75d81b +CT=5ccd63f83b863ae198ba0698853eef2d + +I=28 +KEY=64ce8f9031a8ebf780b36762e34c7ba2 +PT=5ccd63f83b863ae198ba0698853eef2d +CT=602c04659a301521a347b8e13852af49 + +I=29 +KEY=04e28bf5ab98fed623f4df83db1ed4eb +PT=602c04659a301521a347b8e13852af49 +CT=dce9d616364728bd82007e360c7dc53e + +I=30 +KEY=d80b5de39ddfd66ba1f4a1b5d76311d5 +PT=dce9d616364728bd82007e360c7dc53e +CT=fbb8ea4fbbfddaea84b6610a620e2d51 + +I=31 +KEY=23b3b7ac26220c812542c0bfb56d3c84 +PT=fbb8ea4fbbfddaea84b6610a620e2d51 +CT=a3e2ada129623ed16a13440d0ae57bfa + +I=32 +KEY=80511a0d0f4032504f5184b2bf88477e +PT=a3e2ada129623ed16a13440d0ae57bfa +CT=b9d32b748df0e1afee4b4b1f9f659baa + +I=33 +KEY=3982317982b0d3ffa11acfad20eddcd4 +PT=b9d32b748df0e1afee4b4b1f9f659baa +CT=d3f16a2c390edd835da4cedc80fed18b + +I=34 +KEY=ea735b55bbbe0e7cfcbe0171a0130d5f +PT=d3f16a2c390edd835da4cedc80fed18b +CT=88cacedfcf3d796cd1c2c4e5da52352f + +I=35 +KEY=62b9958a748377102d7cc5947a413870 +PT=88cacedfcf3d796cd1c2c4e5da52352f +CT=93f380c72955353a6e574b1949e23ae8 + +I=36 +KEY=f14a154d5dd6422a432b8e8d33a30298 +PT=93f380c72955353a6e574b1949e23ae8 +CT=22b0471ed3f302be0be383c996452921 + +I=37 +KEY=d3fa52538e25409448c80d44a5e62bb9 +PT=22b0471ed3f302be0be383c996452921 +CT=23f177c639e0fe82ddf9c4c7044d4248 + +I=38 +KEY=f00b2595b7c5be169531c983a1ab69f1 +PT=23f177c639e0fe82ddf9c4c7044d4248 +CT=7d31de04dcd97189a0bae72bafcbbf91 + +I=39 +KEY=8d3afb916b1ccf9f358b2ea80e60d660 +PT=7d31de04dcd97189a0bae72bafcbbf91 +CT=7d2d38fb002c62ff6cc023286abb2882 + +I=40 +KEY=f017c36a6b30ad60594b0d8064dbfee2 +PT=7d2d38fb002c62ff6cc023286abb2882 +CT=a65d17620e49a844393686f87373114b + +I=41 +KEY=564ad40865790524607d8b7817a8efa9 +PT=a65d17620e49a844393686f87373114b +CT=2776e834b7c5278eccdb080c1af52e21 + +I=42 +KEY=713c3c3cd2bc22aaaca683740d5dc188 +PT=2776e834b7c5278eccdb080c1af52e21 +CT=f5219b02d9d8e287c0e1caf89ddbae70 + +I=43 +KEY=841da73e0b64c02d6c47498c90866ff8 +PT=f5219b02d9d8e287c0e1caf89ddbae70 +CT=04fa5d22c24d21bb5627f42082f5ec61 + +I=44 +KEY=80e7fa1cc929e1963a60bdac12738399 +PT=04fa5d22c24d21bb5627f42082f5ec61 +CT=c14c29d52bb22a4abd5707678a55a571 + +I=45 +KEY=41abd3c9e29bcbdc8737bacb982626e8 +PT=c14c29d52bb22a4abd5707678a55a571 +CT=6eaf10acdc685e63f8bdad80a6626a31 + +I=46 +KEY=2f04c3653ef395bf7f8a174b3e444cd9 +PT=6eaf10acdc685e63f8bdad80a6626a31 +CT=9e7363e279adcd0dfc2f1b8709addc1b + +I=47 +KEY=b177a087475e58b283a50ccc37e990c2 +PT=9e7363e279adcd0dfc2f1b8709addc1b +CT=fdf3c06baba03318401116c3d0c943a8 + +I=48 +KEY=4c8460ececfe6baac3b41a0fe720d36a +PT=fdf3c06baba03318401116c3d0c943a8 +CT=63f1040c9b3626aeba7db06f766ff53c + +I=49 +KEY=2f7564e077c84d0479c9aa60914f2656 +PT=63f1040c9b3626aeba7db06f766ff53c +CT=afd90f2e80c89fcc44a965e05287dc2d + +I=50 +KEY=80ac6bcef700d2c83d60cf80c3c8fa7b +PT=afd90f2e80c89fcc44a965e05287dc2d +CT=62f0ad9d5fe4cbbbc151c8cbf765d822 + +I=51 +KEY=e25cc653a8e41973fc31074b34ad2259 +PT=62f0ad9d5fe4cbbbc151c8cbf765d822 +CT=fd9135db0d9b098823a3057e02d63186 + +I=52 +KEY=1fcdf388a57f10fbdf920235367b13df +PT=fd9135db0d9b098823a3057e02d63186 +CT=b49d59b12cce545d136ede740ea1f203 + +I=53 +KEY=ab50aa3989b144a6ccfcdc4138dae1dc +PT=b49d59b12cce545d136ede740ea1f203 +CT=6493367a1c29e02edb93cc32f94d667d + +I=54 +KEY=cfc39c439598a488176f1073c19787a1 +PT=6493367a1c29e02edb93cc32f94d667d +CT=2c82f5079b5cf66371e0176bcb26ff4e + +I=55 +KEY=e34169440ec452eb668f07180ab178ef +PT=2c82f5079b5cf66371e0176bcb26ff4e +CT=5e221e543e290d14437334f8ac33441a + +I=56 +KEY=bd63771030ed5fff25fc33e0a6823cf5 +PT=5e221e543e290d14437334f8ac33441a +CT=3aa92404c6007679e5badb2f44efbd05 + +I=57 +KEY=87ca5314f6ed2986c046e8cfe26d81f0 +PT=3aa92404c6007679e5badb2f44efbd05 +CT=39e62714a3cbe5941be6604c5da3f66d + +I=58 +KEY=be2c74005526cc12dba08883bfce779d +PT=39e62714a3cbe5941be6604c5da3f66d +CT=eb643953304dd57166e6c3c21fe5d442 + +I=59 +KEY=55484d53656b1963bd464b41a02ba3df +PT=eb643953304dd57166e6c3c21fe5d442 +CT=b054df558404653b2fb7870779729308 + +I=60 +KEY=e51c9206e16f7c5892f1cc46d95930d7 +PT=b054df558404653b2fb7870779729308 +CT=cc8888bd62fe78d06b1dc157a5cf66ee + +I=61 +KEY=29941abb83910488f9ec0d117c965639 +PT=cc8888bd62fe78d06b1dc157a5cf66ee +CT=bdf868d4e14dcb8a011cf988c0eaa389 + +I=62 +KEY=946c726f62dccf02f8f0f499bc7cf5b0 +PT=bdf868d4e14dcb8a011cf988c0eaa389 +CT=68b22fd31307f25c4e7099f049df729c + +I=63 +KEY=fcde5dbc71db3d5eb6806d69f5a3872c +PT=68b22fd31307f25c4e7099f049df729c +CT=4f2b80a07601de4a31806b550f7bfda7 + +I=64 +KEY=b3f5dd1c07dae3148700063cfad87a8b +PT=4f2b80a07601de4a31806b550f7bfda7 +CT=3327a52e3469d73d25cdcdcfbe1041ce + +I=65 +KEY=80d2783233b33429a2cdcbf344c83b45 +PT=3327a52e3469d73d25cdcdcfbe1041ce +CT=5ef2874dae787aa9f2de3d23cb0db131 + +I=66 +KEY=de20ff7f9dcb4e805013f6d08fc58a74 +PT=5ef2874dae787aa9f2de3d23cb0db131 +CT=cd39f261126609e40d3de716bc04253c + +I=67 +KEY=13190d1e8fad47645d2e11c633c1af48 +PT=cd39f261126609e40d3de716bc04253c +CT=57db0e3d4fa62dd3f05b91d526dbe3f9 + +I=68 +KEY=44c20323c00b6ab7ad758013151a4cb1 +PT=57db0e3d4fa62dd3f05b91d526dbe3f9 +CT=d884f82533c01c21256b9b1d9029fe35 + +I=69 +KEY=9c46fb06f3cb7696881e1b0e8533b284 +PT=d884f82533c01c21256b9b1d9029fe35 +CT=9fa8a2639f7d3fce51098cf827d157a7 + +I=70 +KEY=03ee59656cb64958d91797f6a2e2e523 +PT=9fa8a2639f7d3fce51098cf827d157a7 +CT=431404ec97c1ef4318da9fe6c333047b + +I=71 +KEY=40fa5d89fb77a61bc1cd081061d1e158 +PT=431404ec97c1ef4318da9fe6c333047b +CT=45c193fbab6b9f3bdee77044226b4a3c + +I=72 +KEY=053bce72501c39201f2a785443baab64 +PT=45c193fbab6b9f3bdee77044226b4a3c +CT=dd6ff2781e3a74874a65dcc27bcb74e3 + +I=73 +KEY=d8543c0a4e264da7554fa4963871df87 +PT=dd6ff2781e3a74874a65dcc27bcb74e3 +CT=e1306b019f5d79cb294f8437c787f44a + +I=74 +KEY=3964570bd17b346c7c0020a1fff62bcd +PT=e1306b019f5d79cb294f8437c787f44a +CT=04154311deed614abcc5cba235a20a42 + +I=75 +KEY=3d71141a0f965526c0c5eb03ca54218f +PT=04154311deed614abcc5cba235a20a42 +CT=d4f15e24cdfb644cb8c2910e0ddb4ed6 + +I=76 +KEY=e9804a3ec26d316a78077a0dc78f6f59 +PT=d4f15e24cdfb644cb8c2910e0ddb4ed6 +CT=6cfa285e642508e26dedae055b0c49e7 + +I=77 +KEY=857a6260a648398815ead4089c8326be +PT=6cfa285e642508e26dedae055b0c49e7 +CT=78f15905354e7f80a743d183973c0a85 + +I=78 +KEY=fd8b3b6593064608b2a9058b0bbf2c3b +PT=78f15905354e7f80a743d183973c0a85 +CT=2e35f5740e44e28b26b51bf65a2676a7 + +I=79 +KEY=d3bece119d42a483941c1e7d51995a9c +PT=2e35f5740e44e28b26b51bf65a2676a7 +CT=ef6ee091fe08fbd5f1f106d89527c100 + +I=80 +KEY=3cd02e80634a5f5665ed18a5c4be9b9c +PT=ef6ee091fe08fbd5f1f106d89527c100 +CT=92c508be2ca03a53ffd785888a45c1f4 + +I=81 +KEY=ae15263e4fea65059a3a9d2d4efb5a68 +PT=92c508be2ca03a53ffd785888a45c1f4 +CT=500bb5146d89679c264472fd0da0d397 + +I=82 +KEY=fe1e932a22630299bc7eefd0435b89ff +PT=500bb5146d89679c264472fd0da0d397 +CT=16db8cfca082c845bf5249623be8860b + +I=83 +KEY=e8c51fd682e1cadc032ca6b278b30ff4 +PT=16db8cfca082c845bf5249623be8860b +CT=3336133e35f5d0bc58256431f7a9a4e3 + +I=84 +KEY=dbf30ce8b7141a605b09c2838f1aab17 +PT=3336133e35f5d0bc58256431f7a9a4e3 +CT=73452a0a75c401f90c4e15c4290e6b4e + +I=85 +KEY=a8b626e2c2d01b995747d747a614c059 +PT=73452a0a75c401f90c4e15c4290e6b4e +CT=028b57b7d8c1dc19496002a5dd746406 + +I=86 +KEY=aa3d71551a11c7801e27d5e27b60a45f +PT=028b57b7d8c1dc19496002a5dd746406 +CT=830c9912913db225f3183fc45d2c9ca7 + +I=87 +KEY=2931e8478b2c75a5ed3fea26264c38f8 +PT=830c9912913db225f3183fc45d2c9ca7 +CT=f4a68e31d506fe48c1e77768e8603c44 + +I=88 +KEY=dd9766765e2a8bed2cd89d4ece2c04bc +PT=f4a68e31d506fe48c1e77768e8603c44 +CT=2b96a7313fbf19a1e0d7c9c2888136ec + +I=89 +KEY=f601c1476195924ccc0f548c46ad3250 +PT=2b96a7313fbf19a1e0d7c9c2888136ec +CT=7c8d227b733cfecde920dc652a534667 + +I=90 +KEY=8a8ce33c12a96c81252f88e96cfe7437 +PT=7c8d227b733cfecde920dc652a534667 +CT=f6c1c2b2339b75008053ea99aab5abe8 + +I=91 +KEY=7c4d218e21321981a57c6270c64bdfdf +PT=f6c1c2b2339b75008053ea99aab5abe8 +CT=7c407381bb1fa4c670841d6df066bf84 + +I=92 +KEY=000d520f9a2dbd47d5f87f1d362d605b +PT=7c407381bb1fa4c670841d6df066bf84 +CT=73c8973c7630f092c1579e7804c68ecc + +I=93 +KEY=73c5c533ec1d4dd514afe16532ebee97 +PT=73c8973c7630f092c1579e7804c68ecc +CT=3a2d933d64926a359430dd5d0768b007 + +I=94 +KEY=49e8560e888f27e0809f3c3835835e90 +PT=3a2d933d64926a359430dd5d0768b007 +CT=55ebf1ab74a6649f872d3c04990312ba + +I=95 +KEY=1c03a7a5fc29437f07b2003cac804c2a +PT=55ebf1ab74a6649f872d3c04990312ba +CT=741f5430a26f82ee958410f7adb51947 + +I=96 +KEY=681cf3955e46c191923610cb0135556d +PT=741f5430a26f82ee958410f7adb51947 +CT=6bc8f4dd2494e4feecff7520f1177cd9 + +I=97 +KEY=03d407487ad2256f7ec965ebf02229b4 +PT=6bc8f4dd2494e4feecff7520f1177cd9 +CT=7bf8f1749fbb56612d77464adaa2d0a0 + +I=98 +KEY=782cf63ce569730e53be23a12a80f914 +PT=7bf8f1749fbb56612d77464adaa2d0a0 +CT=56fb7c4244c8d3a1b00b49e4c902638c + +I=99 +KEY=2ed78a7ea1a1a0afe3b56a45e3829a98 +PT=56fb7c4244c8d3a1b00b49e4c902638c +CT=295f3ab6363fc49b06605ca3ca489b0a + +I=100 +KEY=0788b0c8979e6434e5d536e629ca0192 +PT=295f3ab6363fc49b06605ca3ca489b0a +CT=d33ce65e4631a25bb6a87a4004fc786a + +I=101 +KEY=d4b45696d1afc66f537d4ca62d3679f8 +PT=d33ce65e4631a25bb6a87a4004fc786a +CT=d606cd8a768ec3c8c1fd055bcd91be65 + +I=102 +KEY=02b29b1ca72105a7928049fde0a7c79d +PT=d606cd8a768ec3c8c1fd055bcd91be65 +CT=3666ac8a6ad61a2db2d602f8cccdf2b0 + +I=103 +KEY=34d43796cdf71f8a20564b052c6a352d +PT=3666ac8a6ad61a2db2d602f8cccdf2b0 +CT=6aca9f27cbbcdfb9185173d6a753411e + +I=104 +KEY=5e1ea8b1064bc033380738d38b397433 +PT=6aca9f27cbbcdfb9185173d6a753411e +CT=919e890970d7d4ff78b333fbab1cd0fa + +I=105 +KEY=cf8021b8769c14cc40b40b282025a4c9 +PT=919e890970d7d4ff78b333fbab1cd0fa +CT=bd7b66d3a2356a342cc7ea74c065fc64 + +I=106 +KEY=72fb476bd4a97ef86c73e15ce04058ad +PT=bd7b66d3a2356a342cc7ea74c065fc64 +CT=01dd4844877c8b94b28872b123b40a8d + +I=107 +KEY=73260f2f53d5f56cdefb93edc3f45220 +PT=01dd4844877c8b94b28872b123b40a8d +CT=f9db3a0ae3d39190b6bcf705018bb536 + +I=108 +KEY=8afd3525b00664fc684764e8c27fe716 +PT=f9db3a0ae3d39190b6bcf705018bb536 +CT=9f33a2ebd76327202c471e41780f95ce + +I=109 +KEY=15ce97ce676543dc44007aa9ba7072d8 +PT=9f33a2ebd76327202c471e41780f95ce +CT=7dd2a411a726f31437cd86ff7bd2a511 + +I=110 +KEY=681c33dfc043b0c873cdfc56c1a2d7c9 +PT=7dd2a411a726f31437cd86ff7bd2a511 +CT=b2c03f0aa618a1546bcc654e18ce471b + +I=111 +KEY=dadc0cd5665b119c18019918d96c90d2 +PT=b2c03f0aa618a1546bcc654e18ce471b +CT=cf46dd238a30a1b59316046f47702754 + +I=112 +KEY=159ad1f6ec6bb0298b179d779e1cb786 +PT=cf46dd238a30a1b59316046f47702754 +CT=e94802f741c2f3372376036b5e99f02e + +I=113 +KEY=fcd2d301ada9431ea8619e1cc08547a8 +PT=e94802f741c2f3372376036b5e99f02e +CT=1cbe198b5c4f6be4403d4dde970cebc9 + +I=114 +KEY=e06cca8af1e628fae85cd3c25789ac61 +PT=1cbe198b5c4f6be4403d4dde970cebc9 +CT=032005439cb0ddee606a28fa3777550a + +I=115 +KEY=e34ccfc96d56f5148836fb3860fef96b +PT=032005439cb0ddee606a28fa3777550a +CT=0cdb425a21fa47d20641952bfb01525b + +I=116 +KEY=ef978d934cacb2c68e776e139bffab30 +PT=0cdb425a21fa47d20641952bfb01525b +CT=7b76ae2a947e38ea4176d28429ee5945 + +I=117 +KEY=94e123b9d8d28a2ccf01bc97b211f275 +PT=7b76ae2a947e38ea4176d28429ee5945 +CT=9a0353db5f0408c43790e971c780f7a3 + +I=118 +KEY=0ee2706287d682e8f89155e6759105d6 +PT=9a0353db5f0408c43790e971c780f7a3 +CT=6bb338abf621f1ad8be884ec0686969a + +I=119 +KEY=655148c971f773457379d10a7317934c +PT=6bb338abf621f1ad8be884ec0686969a +CT=93a269b17363e903864b8dfe32edf1af + +I=120 +KEY=f6f3217802949a46f5325cf441fa62e3 +PT=93a269b17363e903864b8dfe32edf1af +CT=c7a7909e9239de14e77a321bdbf37b05 + +I=121 +KEY=3154b1e690ad445212486eef9a0919e6 +PT=c7a7909e9239de14e77a321bdbf37b05 +CT=9975334936e13f592ab662d6211ae872 + +I=122 +KEY=a82182afa64c7b0b38fe0c39bb13f194 +PT=9975334936e13f592ab662d6211ae872 +CT=868c82b31a268ba7a213a7e777695603 + +I=123 +KEY=2ead001cbc6af0ac9aedabdecc7aa797 +PT=868c82b31a268ba7a213a7e777695603 +CT=75918ec0f51e72e2d39ae05c9624a60c + +I=124 +KEY=5b3c8edc4974824e49774b825a5e019b +PT=75918ec0f51e72e2d39ae05c9624a60c +CT=c8a440ea32c88c731dd5f1eacfb44ede + +I=125 +KEY=9398ce367bbc0e3d54a2ba6895ea4f45 +PT=c8a440ea32c88c731dd5f1eacfb44ede +CT=78429eabb321581d4621da18520149c4 + +I=126 +KEY=ebda509dc89d562012836070c7eb0681 +PT=78429eabb321581d4621da18520149c4 +CT=fce551f9ae5926bd70702466c34b37ed + +I=127 +KEY=173f016466c4709d62f3441604a0316c +PT=fce551f9ae5926bd70702466c34b37ed +CT=0845a7fbdd4b01598c773d673c296f92 + +I=128 +KEY=1f7aa69fbb8f71c4ee84797138895efe +PT=0845a7fbdd4b01598c773d673c296f92 +CT=cb3bbfeb055787bcfc79fff7c8005cad + +I=129 +KEY=d4411974bed8f67812fd8686f0890253 +PT=cb3bbfeb055787bcfc79fff7c8005cad +CT=6b26bf57ac07c34e8e5446740bdf6db9 + +I=130 +KEY=bf67a62312df35369ca9c0f2fb566fea +PT=6b26bf57ac07c34e8e5446740bdf6db9 +CT=145b99fe5bf9765cc6d72b1b5d391a94 + +I=131 +KEY=ab3c3fdd4926436a5a7eebe9a66f757e +PT=145b99fe5bf9765cc6d72b1b5d391a94 +CT=2afa06f2f81918a34923f9480c986fdc + +I=132 +KEY=81c6392fb13f5bc9135d12a1aaf71aa2 +PT=2afa06f2f81918a34923f9480c986fdc +CT=45ff720606fe80e148de85977adc91b2 + +I=133 +KEY=c4394b29b7c1db285b839736d02b8b10 +PT=45ff720606fe80e148de85977adc91b2 +CT=bd69984c9cb20b0bb2f71dcd1989c268 + +I=134 +KEY=7950d3652b73d023e9748afbc9a24978 +PT=bd69984c9cb20b0bb2f71dcd1989c268 +CT=237e5212d2ccbeba103965773e7147d6 + +I=135 +KEY=5a2e8177f9bf6e99f94def8cf7d30eae +PT=237e5212d2ccbeba103965773e7147d6 +CT=2140a2d4ac837948eedbbe86ca3f3567 + +I=136 +KEY=7b6e23a3553c17d11796510a3dec3bc9 +PT=2140a2d4ac837948eedbbe86ca3f3567 +CT=3234b91452f79136ebce41af83122034 + +I=137 +KEY=495a9ab707cb86e7fc5810a5befe1bfd +PT=3234b91452f79136ebce41af83122034 +CT=c1abcb54c1828c7fa53c9be71867411b + +I=138 +KEY=88f151e3c6490a9859648b42a6995ae6 +PT=c1abcb54c1828c7fa53c9be71867411b +CT=3683c529079a6de9c5ff57a64de6e59f + +I=139 +KEY=be7294cac1d367719c9bdce4eb7fbf79 +PT=3683c529079a6de9c5ff57a64de6e59f +CT=a79b49117f4a1458eb43c3133488ef5a + +I=140 +KEY=19e9dddbbe99732977d81ff7dff75023 +PT=a79b49117f4a1458eb43c3133488ef5a +CT=ed5ab6fd320bebf586c10326d22d2613 + +I=141 +KEY=f4b36b268c9298dcf1191cd10dda7630 +PT=ed5ab6fd320bebf586c10326d22d2613 +CT=99202ed533e6f269403f88d37bf329be + +I=142 +KEY=6d9345f3bf746ab5b126940276295f8e +PT=99202ed533e6f269403f88d37bf329be +CT=0014a7596afd96e960b9e0b245c7e8ef + +I=143 +KEY=6d87e2aad589fc5cd19f74b033eeb761 +PT=0014a7596afd96e960b9e0b245c7e8ef +CT=0cd28bc6e5d64a8fe047ab6b4c2e3a8d + +I=144 +KEY=6155696c305fb6d331d8dfdb7fc08dec +PT=0cd28bc6e5d64a8fe047ab6b4c2e3a8d +CT=47c58164f955a002e47bb8bfc9d8bbcd + +I=145 +KEY=2690e808c90a16d1d5a36764b6183621 +PT=47c58164f955a002e47bb8bfc9d8bbcd +CT=4f1547ca58f6706125e84f436572541b + +I=146 +KEY=6985afc291fc66b0f04b2827d36a623a +PT=4f1547ca58f6706125e84f436572541b +CT=41cf9de31ef2c3aefe49ebdd72622bdd + +I=147 +KEY=284a32218f0ea51e0e02c3faa10849e7 +PT=41cf9de31ef2c3aefe49ebdd72622bdd +CT=65e4aaace0862fe98a53593c5741a2f0 + +I=148 +KEY=4dae988d6f888af784519ac6f649eb17 +PT=65e4aaace0862fe98a53593c5741a2f0 +CT=53643d9fdd317d97cea7c789f2f4e9fd + +I=149 +KEY=1ecaa512b2b9f7604af65d4f04bd02ea +PT=53643d9fdd317d97cea7c789f2f4e9fd +CT=469554dcec8a80b53fe08a96d19ecb82 + +I=150 +KEY=585ff1ce5e3377d57516d7d9d523c968 +PT=469554dcec8a80b53fe08a96d19ecb82 +CT=a842ac3cfa6a423c65272a19cec783a9 + +I=151 +KEY=f01d5df2a45935e91031fdc01be44ac1 +PT=a842ac3cfa6a423c65272a19cec783a9 +CT=ac491c1e25d34c9f6b5ab7d442947a16 + +I=152 +KEY=5c5441ec818a79767b6b4a14597030d7 +PT=ac491c1e25d34c9f6b5ab7d442947a16 +CT=c007b3856ea6e7a8711fd4395c0cceda + +I=153 +KEY=9c53f269ef2c9ede0a749e2d057cfe0d +PT=c007b3856ea6e7a8711fd4395c0cceda +CT=f0f625340506bd1f49bdc287dd56428a + +I=154 +KEY=6ca5d75dea2a23c143c95caad82abc87 +PT=f0f625340506bd1f49bdc287dd56428a +CT=54158add44c8f5bcb69a2e6263eec4a2 + +I=155 +KEY=38b05d80aee2d67df55372c8bbc47825 +PT=54158add44c8f5bcb69a2e6263eec4a2 +CT=3d1405c1f03742d9397fe02dcf5236c1 + +I=156 +KEY=05a458415ed594a4cc2c92e574964ee4 +PT=3d1405c1f03742d9397fe02dcf5236c1 +CT=1c63f843d5fc54450039f93c7e7c2d2e + +I=157 +KEY=19c7a0028b29c0e1cc156bd90aea63ca +PT=1c63f843d5fc54450039f93c7e7c2d2e +CT=1b1099c9d6d69551b8e2df8ef089b3bb + +I=158 +KEY=02d739cb5dff55b074f7b457fa63d071 +PT=1b1099c9d6d69551b8e2df8ef089b3bb +CT=2143b3a318ab36ecbd3687c06305ebad + +I=159 +KEY=23948a684554635cc9c1339799663bdc +PT=2143b3a318ab36ecbd3687c06305ebad +CT=7c853ea35b987225e16c28423b3cbb74 + +I=160 +KEY=5f11b4cb1ecc117928ad1bd5a25a80a8 +PT=7c853ea35b987225e16c28423b3cbb74 +CT=4448f7c3bbcb730f55cbe7cc7c346b9d + +I=161 +KEY=1b594308a50762767d66fc19de6eeb35 +PT=4448f7c3bbcb730f55cbe7cc7c346b9d +CT=3f4da6041dcb06630609f23e2f92fd23 + +I=162 +KEY=2414e50cb8cc64157b6f0e27f1fc1616 +PT=3f4da6041dcb06630609f23e2f92fd23 +CT=1f972f1d54d05dc04c655b2165dbd731 + +I=163 +KEY=3b83ca11ec1c39d5370a55069427c127 +PT=1f972f1d54d05dc04c655b2165dbd731 +CT=023c2b208e34103438d0b28ae13c0d7b + +I=164 +KEY=39bfe131622829e10fdae78c751bcc5c +PT=023c2b208e34103438d0b28ae13c0d7b +CT=94b01f29e3c111f37b68f5d246cd7714 + +I=165 +KEY=ad0ffe1881e9381274b2125e33d6bb48 +PT=94b01f29e3c111f37b68f5d246cd7714 +CT=6a113c0a28f50ba720c250d732d3c80a + +I=166 +KEY=c71ec212a91c33b55470428901057342 +PT=6a113c0a28f50ba720c250d732d3c80a +CT=79f7ceac3b9ca39a46bf386986430f66 + +I=167 +KEY=bee90cbe9280902f12cf7ae087467c24 +PT=79f7ceac3b9ca39a46bf386986430f66 +CT=a28428ece2013966f8f21d4491c09268 + +I=168 +KEY=1c6d24527081a949ea3d67a41686ee4c +PT=a28428ece2013966f8f21d4491c09268 +CT=173754fa8ed34fc752255271d3d138db + +I=169 +KEY=0b5a70a8fe52e68eb81835d5c557d697 +PT=173754fa8ed34fc752255271d3d138db +CT=37069565202dc7c3ecd106c0fb5cfd4e + +I=170 +KEY=3c5ce5cdde7f214d54c933153e0b2bd9 +PT=37069565202dc7c3ecd106c0fb5cfd4e +CT=cc637e9c1ee831c32a981b229e3a6153 + +I=171 +KEY=f03f9b51c097108e7e512837a0314a8a +PT=cc637e9c1ee831c32a981b229e3a6153 +CT=be2546a77385a8032991f95f7802d7b1 + +I=172 +KEY=4e1addf6b312b88d57c0d168d8339d3b +PT=be2546a77385a8032991f95f7802d7b1 +CT=0a121db767344edac19cede2d6a37762 + +I=173 +KEY=4408c041d426f657965c3c8a0e90ea59 +PT=0a121db767344edac19cede2d6a37762 +CT=20cb72bc2adc97943eda332f7c31c044 + +I=174 +KEY=64c3b2fdfefa61c3a8860fa572a12a1d +PT=20cb72bc2adc97943eda332f7c31c044 +CT=0dfe61e403edcad54f3ea58b175c404a + +I=175 +KEY=693dd319fd17ab16e7b8aa2e65fd6a57 +PT=0dfe61e403edcad54f3ea58b175c404a +CT=b486e26b9f3ac070d5327d37ad9786c2 + +I=176 +KEY=ddbb3172622d6b66328ad719c86aec95 +PT=b486e26b9f3ac070d5327d37ad9786c2 +CT=31946974edd29d31bdb84cdf723b9c37 + +I=177 +KEY=ec2f58068ffff6578f329bc6ba5170a2 +PT=31946974edd29d31bdb84cdf723b9c37 +CT=0e8037adab50b680b0f78f8ad7c99560 + +I=178 +KEY=e2af6fab24af40d73fc5144c6d98e5c2 +PT=0e8037adab50b680b0f78f8ad7c99560 +CT=04f66c0e1a50aa0357d10bfed10b4442 + +I=179 +KEY=e65903a53effead468141fb2bc93a180 +PT=04f66c0e1a50aa0357d10bfed10b4442 +CT=9f0a0cdff158d69ea1a1abfcee3e6675 + +I=180 +KEY=79530f7acfa73c4ac9b5b44e52adc7f5 +PT=9f0a0cdff158d69ea1a1abfcee3e6675 +CT=48efcd173a819cc8b19684b97ef12f24 + +I=181 +KEY=31bcc26df526a082782330f72c5ce8d1 +PT=48efcd173a819cc8b19684b97ef12f24 +CT=1db127461ed7123c2425b40f6dd308cc + +I=182 +KEY=2c0de52bebf1b2be5c0684f8418fe01d +PT=1db127461ed7123c2425b40f6dd308cc +CT=643cd08a170a490dd255e4d81b428d5d + +I=183 +KEY=483135a1fcfbfbb38e5360205acd6d40 +PT=643cd08a170a490dd255e4d81b428d5d +CT=772c80a42ac76ffee67e73a6841d8d7e + +I=184 +KEY=3f1db505d63c944d682d1386ded0e03e +PT=772c80a42ac76ffee67e73a6841d8d7e +CT=5353a35504b8f271ec1a49b92620710f + +I=185 +KEY=6c4e1650d284663c84375a3ff8f09131 +PT=5353a35504b8f271ec1a49b92620710f +CT=ebe5a8fe754a4662230e5ddbbaa472d1 + +I=186 +KEY=87abbeaea7ce205ea73907e44254e3e0 +PT=ebe5a8fe754a4662230e5ddbbaa472d1 +CT=eb86c00d04f92f76dcf6dde5eb2edb19 + +I=187 +KEY=6c2d7ea3a3370f287bcfda01a97a38f9 +PT=eb86c00d04f92f76dcf6dde5eb2edb19 +CT=12a181853773ab096bad728c219a960c + +I=188 +KEY=7e8cff269444a4211062a88d88e0aef5 +PT=12a181853773ab096bad728c219a960c +CT=d949e4cbd711f1bf8b0f1d2f1d4b5d06 + +I=189 +KEY=a7c51bed4355559e9b6db5a295abf3f3 +PT=d949e4cbd711f1bf8b0f1d2f1d4b5d06 +CT=9332d7b6fecc1f7f962000c2fa869320 + +I=190 +KEY=34f7cc5bbd994ae10d4db5606f2d60d3 +PT=9332d7b6fecc1f7f962000c2fa869320 +CT=5c81168b4aa3e5e0e1885d2d6844329f + +I=191 +KEY=6876dad0f73aaf01ecc5e84d0769524c +PT=5c81168b4aa3e5e0e1885d2d6844329f +CT=24deebf2c91a340039255fbe30f1b319 + +I=192 +KEY=4ca831223e209b01d5e0b7f33798e155 +PT=24deebf2c91a340039255fbe30f1b319 +CT=fade0033804acef2fe3d84eb34b173a7 + +I=193 +KEY=b6763111be6a55f32bdd3318032992f2 +PT=fade0033804acef2fe3d84eb34b173a7 +CT=c2fec0a5e4892d570cd3364e0d7c7d59 + +I=194 +KEY=7488f1b45ae378a4270e05560e55efab +PT=c2fec0a5e4892d570cd3364e0d7c7d59 +CT=e2598f63d7f171ddef80662cffa57ad2 + +I=195 +KEY=96d17ed78d120979c88e637af1f09579 +PT=e2598f63d7f171ddef80662cffa57ad2 +CT=7fa5a283b6969abda64410546473e501 + +I=196 +KEY=e974dc543b8493c46eca732e95837078 +PT=7fa5a283b6969abda64410546473e501 +CT=6e898c01e1d90f8b47809cc6a1549562 + +I=197 +KEY=87fd5055da5d9c4f294aefe834d7e51a +PT=6e898c01e1d90f8b47809cc6a1549562 +CT=b4d149d42f992b23a3f5d572bf4acd1e + +I=198 +KEY=332c1981f5c4b76c8abf3a9a8b9d2804 +PT=b4d149d42f992b23a3f5d572bf4acd1e +CT=80b3c34892874689fe0851377ca01b7d + +I=199 +KEY=b39fdac96743f1e574b76badf73d3379 +PT=80b3c34892874689fe0851377ca01b7d +CT=e668aa0ef80fe5fef96be9a9ddabc9a3 + +I=200 +KEY=55f770c79f4c141b8ddc82042a96fada +PT=e668aa0ef80fe5fef96be9a9ddabc9a3 +CT=039daaeab17fcabf6a433a76ae069ba3 + +I=201 +KEY=566ada2d2e33dea4e79fb87284906179 +PT=039daaeab17fcabf6a433a76ae069ba3 +CT=98c59b283ee15d65afc184516f9cc007 + +I=202 +KEY=ceaf410510d283c1485e3c23eb0ca17e +PT=98c59b283ee15d65afc184516f9cc007 +CT=cbf8934e962a8a0977ee566faba70ccf + +I=203 +KEY=0557d24b86f809c83fb06a4c40abadb1 +PT=cbf8934e962a8a0977ee566faba70ccf +CT=c8fdeb3351f037a30b69e98ea43a4ec2 + +I=204 +KEY=cdaa3978d7083e6b34d983c2e491e373 +PT=c8fdeb3351f037a30b69e98ea43a4ec2 +CT=f11331c8d39a96f3e1a8b5752b1f9127 + +I=205 +KEY=3cb908b00492a898d57136b7cf8e7254 +PT=f11331c8d39a96f3e1a8b5752b1f9127 +CT=4f0161cc9077d9d4e2e5f15aca7a2327 + +I=206 +KEY=73b8697c94e5714c3794c7ed05f45173 +PT=4f0161cc9077d9d4e2e5f15aca7a2327 +CT=10de12ba7f9403298d583a5f71a57196 + +I=207 +KEY=63667bc6eb717265baccfdb2745120e5 +PT=10de12ba7f9403298d583a5f71a57196 +CT=613b84464a09778c0bf964cdee9d54e5 + +I=208 +KEY=025dff80a17805e9b135997f9acc7400 +PT=613b84464a09778c0bf964cdee9d54e5 +CT=29cf542a451480367da9f6f934298ddf + +I=209 +KEY=2b92abaae46c85dfcc9c6f86aee5f9df +PT=29cf542a451480367da9f6f934298ddf +CT=1f536ceefd59f8687bd9c2762b35483b + +I=210 +KEY=34c1c74419357db7b745adf085d0b1e4 +PT=1f536ceefd59f8687bd9c2762b35483b +CT=ce4a251276003d564d202d007ca0c168 + +I=211 +KEY=fa8be2566f3540e1fa6580f0f970708c +PT=ce4a251276003d564d202d007ca0c168 +CT=4ac7a9493677fd51e6ae05e2a5458ce4 + +I=212 +KEY=b04c4b1f5942bdb01ccb85125c35fc68 +PT=4ac7a9493677fd51e6ae05e2a5458ce4 +CT=8dde5dc01880684777f16a60d0dd1c61 + +I=213 +KEY=3d9216df41c2d5f76b3aef728ce8e009 +PT=8dde5dc01880684777f16a60d0dd1c61 +CT=d2367e380d2cbef00e29a8167ddbc70e + +I=214 +KEY=efa468e74cee6b0765134764f1332707 +PT=d2367e380d2cbef00e29a8167ddbc70e +CT=2a836a628cd4ca7efe29a35d893523ff + +I=215 +KEY=c5270285c03aa1799b3ae439780604f8 +PT=2a836a628cd4ca7efe29a35d893523ff +CT=4ccd31a8ac4fb6d61566ff4d94d16081 + +I=216 +KEY=89ea332d6c7517af8e5c1b74ecd76479 +PT=4ccd31a8ac4fb6d61566ff4d94d16081 +CT=9d0961ff4ef2627d833517dbbf4b8cbe + +I=217 +KEY=14e352d2228775d20d690caf539ce8c7 +PT=9d0961ff4ef2627d833517dbbf4b8cbe +CT=c0511f7cba3963b7c8a822196b9da49d + +I=218 +KEY=d4b24dae98be1665c5c12eb638014c5a +PT=c0511f7cba3963b7c8a822196b9da49d +CT=35ee49ffe066fd9ed2a6f8023b23a615 + +I=219 +KEY=e15c045178d8ebfb1767d6b40322ea4f +PT=35ee49ffe066fd9ed2a6f8023b23a615 +CT=1a87d62661ac6b352342685dad27fb4f + +I=220 +KEY=fbdbd277197480ce3425bee9ae051100 +PT=1a87d62661ac6b352342685dad27fb4f +CT=06f8dc8f6c42e2289682fd5587ae7995 + +I=221 +KEY=fd230ef8753662e6a2a743bc29ab6895 +PT=06f8dc8f6c42e2289682fd5587ae7995 +CT=9e3a8178dd466b823e79b8e683fd2aa1 + +I=222 +KEY=63198f80a87009649cdefb5aaa564234 +PT=9e3a8178dd466b823e79b8e683fd2aa1 +CT=0ef5303e629da6ecee630c03ea1993cb + +I=223 +KEY=6decbfbecaedaf8872bdf759404fd1ff +PT=0ef5303e629da6ecee630c03ea1993cb +CT=4cc4ccc1887e38cb1c73bddd894b39a5 + +I=224 +KEY=2128737f429397436ece4a84c904e85a +PT=4cc4ccc1887e38cb1c73bddd894b39a5 +CT=8cc8bae389faedfda5e6aa123de9ffe0 + +I=225 +KEY=ade0c99ccb697abecb28e096f4ed17ba +PT=8cc8bae389faedfda5e6aa123de9ffe0 +CT=b0b3342dad1a5f8fa0c70661c4274c87 + +I=226 +KEY=1d53fdb1667325316befe6f730ca5b3d +PT=b0b3342dad1a5f8fa0c70661c4274c87 +CT=adb6695a651adf77197aa03cf61fdd88 + +I=227 +KEY=b0e594eb0369fa46729546cbc6d586b5 +PT=adb6695a651adf77197aa03cf61fdd88 +CT=6602df8a6a9fa918d87e217758038f03 + +I=228 +KEY=d6e74b6169f6535eaaeb67bc9ed609b6 +PT=6602df8a6a9fa918d87e217758038f03 +CT=021f112bc14fb28847a12aec0ea888a4 + +I=229 +KEY=d4f85a4aa8b9e1d6ed4a4d50907e8112 +PT=021f112bc14fb28847a12aec0ea888a4 +CT=477ae4b11b5d88ff45942688dc9e6e68 + +I=230 +KEY=9382befbb3e46929a8de6bd84ce0ef7a +PT=477ae4b11b5d88ff45942688dc9e6e68 +CT=dedaf752ca1a24b5b732fe2d0f4be91e + +I=231 +KEY=4d5849a979fe4d9c1fec95f543ab0664 +PT=dedaf752ca1a24b5b732fe2d0f4be91e +CT=463cc0431159088bad9cffcdc8d20d95 + +I=232 +KEY=0b6489ea68a74517b2706a388b790bf1 +PT=463cc0431159088bad9cffcdc8d20d95 +CT=d912a32af60ece4327145d2d7e0643c5 + +I=233 +KEY=d2762ac09ea98b5495643715f57f4834 +PT=d912a32af60ece4327145d2d7e0643c5 +CT=317fcac600df8522e3285adf4e9eefea + +I=234 +KEY=e309e0069e760e76764c6dcabbe1a7de +PT=317fcac600df8522e3285adf4e9eefea +CT=4cf17d563dbfc8b7892ffc1dc6d28806 + +I=235 +KEY=aff89d50a3c9c6c1ff6391d77d332fd8 +PT=4cf17d563dbfc8b7892ffc1dc6d28806 +CT=d94ca4f1a749e8181d4fd9219b75c9e8 + +I=236 +KEY=76b439a104802ed9e22c48f6e646e630 +PT=d94ca4f1a749e8181d4fd9219b75c9e8 +CT=f757356bd7cd6bca51f6524e9c1c8b95 + +I=237 +KEY=81e30ccad34d4513b3da1ab87a5a6da5 +PT=f757356bd7cd6bca51f6524e9c1c8b95 +CT=2687fc574167cc0e888d39cd30b02eed + +I=238 +KEY=a764f09d922a891d3b5723754aea4348 +PT=2687fc574167cc0e888d39cd30b02eed +CT=9c2f0537b6bcc32c6dd2f7ba1da6c587 + +I=239 +KEY=3b4bf5aa24964a315685d4cf574c86cf +PT=9c2f0537b6bcc32c6dd2f7ba1da6c587 +CT=caea4f80b31058d0b11ac3d8f95b3af3 + +I=240 +KEY=f1a1ba2a978612e1e79f1717ae17bc3c +PT=caea4f80b31058d0b11ac3d8f95b3af3 +CT=f20987781325b5b5fa4b7761ba308bf2 + +I=241 +KEY=03a83d5284a3a7541dd46076142737ce +PT=f20987781325b5b5fa4b7761ba308bf2 +CT=063bd48bb753312c95dcc518b78dbc9f + +I=242 +KEY=0593e9d933f096788808a56ea3aa8b51 +PT=063bd48bb753312c95dcc518b78dbc9f +CT=4d73d16f94e9e1f877cffddd044a4430 + +I=243 +KEY=48e038b6a7197780ffc758b3a7e0cf61 +PT=4d73d16f94e9e1f877cffddd044a4430 +CT=f1bf4d90456a9ab37ccf2e8feb7ca9a7 + +I=244 +KEY=b95f7526e273ed338308763c4c9c66c6 +PT=f1bf4d90456a9ab37ccf2e8feb7ca9a7 +CT=8ade34f8b4933d4dd22c1b7fc91477eb + +I=245 +KEY=338141de56e0d07e51246d438588112d +PT=8ade34f8b4933d4dd22c1b7fc91477eb +CT=734b8cef7e0ff1c502b399c2e6d200d7 + +I=246 +KEY=40cacd3128ef21bb5397f481635a11fa +PT=734b8cef7e0ff1c502b399c2e6d200d7 +CT=17fe23f54eda4685b602fcf3fa871270 + +I=247 +KEY=5734eec46635673ee595087299dd038a +PT=17fe23f54eda4685b602fcf3fa871270 +CT=e85fadd1b2195710a4782d8055edc8f2 + +I=248 +KEY=bf6b4315d42c302e41ed25f2cc30cb78 +PT=e85fadd1b2195710a4782d8055edc8f2 +CT=f8f27ebc47be2ba111322ed2069e560f + +I=249 +KEY=47993da993921b8f50df0b20caae9d77 +PT=f8f27ebc47be2ba111322ed2069e560f +CT=769b06dcaa1dd2e8174f72a252d6ee31 + +I=250 +KEY=31023b75398fc9674790798298787346 +PT=769b06dcaa1dd2e8174f72a252d6ee31 +CT=02fbc28e369d513fdc0b1d991a82c8bf + +I=251 +KEY=33f9f9fb0f1298589b9b641b82fabbf9 +PT=02fbc28e369d513fdc0b1d991a82c8bf +CT=337cd0599ebf5b4e7d75583eceb4f66f + +I=252 +KEY=008529a291adc316e6ee3c254c4e4d96 +PT=337cd0599ebf5b4e7d75583eceb4f66f +CT=fe5997e58ddf47f04e04d7455f3906e6 + +I=253 +KEY=fedcbe471c7284e6a8eaeb6013774b70 +PT=fe5997e58ddf47f04e04d7455f3906e6 +CT=577744b371af4e9ddc0cd887a74cc043 + +I=254 +KEY=a9abfaf46dddca7b74e633e7b43b8b33 +PT=577744b371af4e9ddc0cd887a74cc043 +CT=3713d1a3577260302fe4740ca96b5bad + +I=255 +KEY=9eb82b573aafaa4b5b0247eb1d50d09e +PT=3713d1a3577260302fe4740ca96b5bad +CT=7f12861268e4a47fa8f01953b149c22c + +I=256 +KEY=e1aaad45524b0e34f3f25eb8ac1912b2 +PT=7f12861268e4a47fa8f01953b149c22c +CT=be787369f9b3299a850bdc57831ce3a6 + +I=257 +KEY=5fd2de2cabf827ae76f982ef2f05f114 +PT=be787369f9b3299a850bdc57831ce3a6 +CT=6cb37981e730b317315986304b8e35d4 + +I=258 +KEY=3361a7ad4cc894b947a004df648bc4c0 +PT=6cb37981e730b317315986304b8e35d4 +CT=a309860c6a2f28f6c190901d41cf2eae + +I=259 +KEY=906821a126e7bc4f863094c22544ea6e +PT=a309860c6a2f28f6c190901d41cf2eae +CT=c0f690a835e4e925bf5319f1c0e8cb9d + +I=260 +KEY=509eb1091303556a39638d33e5ac21f3 +PT=c0f690a835e4e925bf5319f1c0e8cb9d +CT=41c30496df8f0fa3886439efd9df8672 + +I=261 +KEY=115db59fcc8c5ac9b107b4dc3c73a781 +PT=41c30496df8f0fa3886439efd9df8672 +CT=3e67bced5508c62df28d0df64c28fc41 + +I=262 +KEY=2f3a097299849ce4438ab92a705b5bc0 +PT=3e67bced5508c62df28d0df64c28fc41 +CT=a693ef3574ae3613f86432f9c60bf488 + +I=263 +KEY=89a9e647ed2aaaf7bbee8bd3b650af48 +PT=a693ef3574ae3613f86432f9c60bf488 +CT=3cf289b189b42004d2af0559df64c98d + +I=264 +KEY=b55b6ff6649e8af369418e8a693466c5 +PT=3cf289b189b42004d2af0559df64c98d +CT=05ef12f5d05d0725a245ec8dfad7c268 + +I=265 +KEY=b0b47d03b4c38dd6cb04620793e3a4ad +PT=05ef12f5d05d0725a245ec8dfad7c268 +CT=9e25f51f6a463998f672a18bc49c14a9 + +I=266 +KEY=2e91881cde85b44e3d76c38c577fb004 +PT=9e25f51f6a463998f672a18bc49c14a9 +CT=0713603c19128dcc24ddd3c3556d54c6 + +I=267 +KEY=2982e820c797398219ab104f0212e4c2 +PT=0713603c19128dcc24ddd3c3556d54c6 +CT=16234235abc7b866cdcff3f80907db86 + +I=268 +KEY=3fa1aa156c5081e4d464e3b70b153f44 +PT=16234235abc7b866cdcff3f80907db86 +CT=e76c63f62277d5c585c29348f3e0795a + +I=269 +KEY=d8cdc9e34e27542151a670fff8f5461e +PT=e76c63f62277d5c585c29348f3e0795a +CT=6c7ace029b73b4760fcd43a3e6b9c5d8 + +I=270 +KEY=b4b707e1d554e0575e6b335c1e4c83c6 +PT=6c7ace029b73b4760fcd43a3e6b9c5d8 +CT=b14fe51defcd698b2a76c233522a477a + +I=271 +KEY=05f8e2fc3a9989dc741df16f4c66c4bc +PT=b14fe51defcd698b2a76c233522a477a +CT=a261d4a6828f0b82669e492b34d34949 + +I=272 +KEY=a799365ab816825e1283b84478b58df5 +PT=a261d4a6828f0b82669e492b34d34949 +CT=8b2f195fe879faabeb9fb6d3ac31f2dc + +I=273 +KEY=2cb62f05506f78f5f91c0e97d4847f29 +PT=8b2f195fe879faabeb9fb6d3ac31f2dc +CT=1fa8cd273bbb6394b040aacde1c9af25 + +I=274 +KEY=331ee2226bd41b61495ca45a354dd00c +PT=1fa8cd273bbb6394b040aacde1c9af25 +CT=13b9e0ee001e8c68c7e77963f3057f4d + +I=275 +KEY=20a702cc6bca97098ebbdd39c648af41 +PT=13b9e0ee001e8c68c7e77963f3057f4d +CT=c875b409a058efb825971b73d4fdb06a + +I=276 +KEY=e8d2b6c5cb9278b1ab2cc64a12b51f2b +PT=c875b409a058efb825971b73d4fdb06a +CT=65e4372394e9be3d76a92bc977bdacd4 + +I=277 +KEY=8d3681e65f7bc68cdd85ed836508b3ff +PT=65e4372394e9be3d76a92bc977bdacd4 +CT=a068b8d390859a58dae1d7f67532eb33 + +I=278 +KEY=2d5e3935cffe5cd407643a75103a58cc +PT=a068b8d390859a58dae1d7f67532eb33 +CT=7a2b2ebbfa7c1105fd3f1cae16518e48 + +I=279 +KEY=5775178e35824dd1fa5b26db066bd684 +PT=7a2b2ebbfa7c1105fd3f1cae16518e48 +CT=5fa590412d388f748b98aec9ab16cc54 + +I=280 +KEY=08d087cf18bac2a571c38812ad7d1ad0 +PT=5fa590412d388f748b98aec9ab16cc54 +CT=a3c854365c3773ef7256834dda794ac0 + +I=281 +KEY=ab18d3f9448db14a03950b5f77045010 +PT=a3c854365c3773ef7256834dda794ac0 +CT=8f506b1ae3dbc29f23e106b419b2fa1e + +I=282 +KEY=2448b8e3a75673d520740deb6eb6aa0e +PT=8f506b1ae3dbc29f23e106b419b2fa1e +CT=e6de475c5de99f947330f8f4038f72bd + +I=283 +KEY=c296ffbffabfec415344f51f6d39d8b3 +PT=e6de475c5de99f947330f8f4038f72bd +CT=38a4e2f4f0f85dccd7001956585aa57e + +I=284 +KEY=fa321d4b0a47b18d8444ec4935637dcd +PT=38a4e2f4f0f85dccd7001956585aa57e +CT=2b7948323de6827d322dc9ea895d5124 + +I=285 +KEY=d14b557937a133f0b66925a3bc3e2ce9 +PT=2b7948323de6827d322dc9ea895d5124 +CT=591d4541e6ecbcf90affba477812335d + +I=286 +KEY=88561038d14d8f09bc969fe4c42c1fb4 +PT=591d4541e6ecbcf90affba477812335d +CT=608c7e00efb7747ad17e35dd07ca07c8 + +I=287 +KEY=e8da6e383efafb736de8aa39c3e6187c +PT=608c7e00efb7747ad17e35dd07ca07c8 +CT=9ba49264263d0e19bca772ea146fcccc + +I=288 +KEY=737efc5c18c7f56ad14fd8d3d789d4b0 +PT=9ba49264263d0e19bca772ea146fcccc +CT=8fd4ce6ea919f5039b5f96f178301b86 + +I=289 +KEY=fcaa3232b1de00694a104e22afb9cf36 +PT=8fd4ce6ea919f5039b5f96f178301b86 +CT=ec6d51d06bb364b6e8ff5dbd448035b8 + +I=290 +KEY=10c763e2da6d64dfa2ef139feb39fa8e +PT=ec6d51d06bb364b6e8ff5dbd448035b8 +CT=28875366467d3ba64ac410079813f4ff + +I=291 +KEY=384030849c105f79e82b0398732a0e71 +PT=28875366467d3ba64ac410079813f4ff +CT=348831680d595a3bd6acdfb632a58308 + +I=292 +KEY=0cc801ec914905423e87dc2e418f8d79 +PT=348831680d595a3bd6acdfb632a58308 +CT=1ecb71bc17d33d6f30e6f6929589075c + +I=293 +KEY=12037050869a382d0e612abcd4068a25 +PT=1ecb71bc17d33d6f30e6f6929589075c +CT=acb2b1949d6d82e96cb490e2ed1648af + +I=294 +KEY=beb1c1c41bf7bac462d5ba5e3910c28a +PT=acb2b1949d6d82e96cb490e2ed1648af +CT=037f4d2e546b4114fc44f6f900e330db + +I=295 +KEY=bdce8cea4f9cfbd09e914ca739f3f251 +PT=037f4d2e546b4114fc44f6f900e330db +CT=96364a510329e24bd9c0dc1f1b4c3786 + +I=296 +KEY=2bf8c6bb4cb5199b475190b822bfc5d7 +PT=96364a510329e24bd9c0dc1f1b4c3786 +CT=1920e679cc59c2b9eaa88743878db4e1 + +I=297 +KEY=32d820c280ecdb22adf917fba5327136 +PT=1920e679cc59c2b9eaa88743878db4e1 +CT=6499fc9f797f858f9dee0d20110efd54 + +I=298 +KEY=5641dc5df9935ead30171adbb43c8c62 +PT=6499fc9f797f858f9dee0d20110efd54 +CT=8cdf1a4a21c4e868042a1dd3a0812b17 + +I=299 +KEY=da9ec617d857b6c5343d070814bda775 +PT=8cdf1a4a21c4e868042a1dd3a0812b17 +CT=76c800409b96fa82298f7ae3d9f44dd9 + +I=300 +KEY=ac56c65743c14c471db27debcd49eaac +PT=76c800409b96fa82298f7ae3d9f44dd9 +CT=86e96fd3554d69bffcab838172a3c5d3 + +I=301 +KEY=2abfa984168c25f8e119fe6abfea2f7f +PT=86e96fd3554d69bffcab838172a3c5d3 +CT=3f9f65b9662c7473d0541de8a7a3e301 + +I=302 +KEY=1520cc3d70a0518b314de3821849cc7e +PT=3f9f65b9662c7473d0541de8a7a3e301 +CT=13be0d89fa33ac42ada1008d15d4e5dc + +I=303 +KEY=069ec1b48a93fdc99cece30f0d9d29a2 +PT=13be0d89fa33ac42ada1008d15d4e5dc +CT=80e4b109da148e84553916a5fbf65e5d + +I=304 +KEY=867a70bd5087734dc9d5f5aaf66b77ff +PT=80e4b109da148e84553916a5fbf65e5d +CT=0c54342cb428f62d703b05ac0baeb60b + +I=305 +KEY=8a2e4491e4af8560b9eef006fdc5c1f4 +PT=0c54342cb428f62d703b05ac0baeb60b +CT=e2a855b841347e98a3df26235bc60774 + +I=306 +KEY=68861129a59bfbf81a31d625a603c680 +PT=e2a855b841347e98a3df26235bc60774 +CT=7072e3f79176be35803eda7d76b948b5 + +I=307 +KEY=18f4f2de34ed45cd9a0f0c58d0ba8e35 +PT=7072e3f79176be35803eda7d76b948b5 +CT=de8d29fa0d972e14dcf93cd6fd811254 + +I=308 +KEY=c679db24397a6bd946f6308e2d3b9c61 +PT=de8d29fa0d972e14dcf93cd6fd811254 +CT=8a79dca76268a9c16478861805e0d431 + +I=309 +KEY=4c0007835b12c218228eb69628db4850 +PT=8a79dca76268a9c16478861805e0d431 +CT=f94c9c91ec29774b872cdffb2d01b7ea + +I=310 +KEY=b54c9b12b73bb553a5a2696d05daffba +PT=f94c9c91ec29774b872cdffb2d01b7ea +CT=dacd5db555e715ae95dcedf2663a2cfe + +I=311 +KEY=6f81c6a7e2dca0fd307e849f63e0d344 +PT=dacd5db555e715ae95dcedf2663a2cfe +CT=9144b67c9eb6665e441ee7e96ee850c8 + +I=312 +KEY=fec570db7c6ac6a3746063760d08838c +PT=9144b67c9eb6665e441ee7e96ee850c8 +CT=71b7e26598d6e8a232910cfe56061d43 + +I=313 +KEY=8f7292bee4bc2e0146f16f885b0e9ecf +PT=71b7e26598d6e8a232910cfe56061d43 +CT=41d7e6743222cbaf1bdd3e4c3f7823dc + +I=314 +KEY=cea574cad69ee5ae5d2c51c46476bd13 +PT=41d7e6743222cbaf1bdd3e4c3f7823dc +CT=4dec01de2a381307bfd3017a42c5a382 + +I=315 +KEY=83497514fca6f6a9e2ff50be26b31e91 +PT=4dec01de2a381307bfd3017a42c5a382 +CT=4b51fd45dd81697246bd31f862d07b87 + +I=316 +KEY=c818885121279fdba442614644636516 +PT=4b51fd45dd81697246bd31f862d07b87 +CT=aa1ea784ab448339a18bf82dadd09f38 + +I=317 +KEY=62062fd58a631ce205c9996be9b3fa2e +PT=aa1ea784ab448339a18bf82dadd09f38 +CT=2f6e43f77173c845a02dd4b94b581f35 + +I=318 +KEY=4d686c22fb10d4a7a5e44dd2a2ebe51b +PT=2f6e43f77173c845a02dd4b94b581f35 +CT=9e3d8ec0d5805cb452c991a9eb73ad0e + +I=319 +KEY=d355e2e22e908813f72ddc7b49984815 +PT=9e3d8ec0d5805cb452c991a9eb73ad0e +CT=e434467e25cec2bae033708c60130daa + +I=320 +KEY=3761a49c0b5e4aa9171eacf7298b45bf +PT=e434467e25cec2bae033708c60130daa +CT=ee8dc23273a973e0f29afcc1d5adc431 + +I=321 +KEY=d9ec66ae78f73949e5845036fc26818e +PT=ee8dc23273a973e0f29afcc1d5adc431 +CT=6bf73c2db9cf62c4ce40f6169c0bc630 + +I=322 +KEY=b21b5a83c1385b8d2bc4a620602d47be +PT=6bf73c2db9cf62c4ce40f6169c0bc630 +CT=f0d6d96a051bb320777649a5a6368b50 + +I=323 +KEY=42cd83e9c423e8ad5cb2ef85c61bccee +PT=f0d6d96a051bb320777649a5a6368b50 +CT=f4ee407fec9efcf2d33dbd6e58e4091a + +I=324 +KEY=b623c39628bd145f8f8f52eb9effc5f4 +PT=f4ee407fec9efcf2d33dbd6e58e4091a +CT=75e112be8452e6490e66d2c1d2151ded + +I=325 +KEY=c3c2d128aceff21681e9802a4cead819 +PT=75e112be8452e6490e66d2c1d2151ded +CT=98eaede3a12379d6572abbee134ebfcf + +I=326 +KEY=5b283ccb0dcc8bc0d6c33bc45fa467d6 +PT=98eaede3a12379d6572abbee134ebfcf +CT=c0b9518271dde10098da8332ad0e15ab + +I=327 +KEY=9b916d497c116ac04e19b8f6f2aa727d +PT=c0b9518271dde10098da8332ad0e15ab +CT=05ddc987deaef7fe994d20054100625c + +I=328 +KEY=9e4ca4cea2bf9d3ed75498f3b3aa1021 +PT=05ddc987deaef7fe994d20054100625c +CT=1703a6baff2fd94bbea4a418b055f443 + +I=329 +KEY=894f02745d90447569f03ceb03ffe462 +PT=1703a6baff2fd94bbea4a418b055f443 +CT=270470398a007e76b694691c056bc4ee + +I=330 +KEY=ae4b724dd7903a03df6455f70694208c +PT=270470398a007e76b694691c056bc4ee +CT=225287593161094a7c537fa469686fe0 + +I=331 +KEY=8c19f514e6f13349a3372a536ffc4f6c +PT=225287593161094a7c537fa469686fe0 +CT=b3835ecc9e87f579414ea9fc165abc0e + +I=332 +KEY=3f9aabd87876c630e27983af79a6f362 +PT=b3835ecc9e87f579414ea9fc165abc0e +CT=1161cf9bfb59d21d7d08f4e84d57fb99 + +I=333 +KEY=2efb6443832f142d9f71774734f108fb +PT=1161cf9bfb59d21d7d08f4e84d57fb99 +CT=c7fba87efd50d7f5c6d0303b0e362b01 + +I=334 +KEY=e900cc3d7e7fc3d859a1477c3ac723fa +PT=c7fba87efd50d7f5c6d0303b0e362b01 +CT=0ae3c0d0061cb0adb330ccac95374074 + +I=335 +KEY=e3e30ced78637375ea918bd0aff0638e +PT=0ae3c0d0061cb0adb330ccac95374074 +CT=dfb9249b36657f7f1fd54ca44e30a5e0 + +I=336 +KEY=3c5a28764e060c0af544c774e1c0c66e +PT=dfb9249b36657f7f1fd54ca44e30a5e0 +CT=9f7ef9c67cc1d2512acb84f3cefc07da + +I=337 +KEY=a324d1b032c7de5bdf8f43872f3cc1b4 +PT=9f7ef9c67cc1d2512acb84f3cefc07da +CT=ac4e91336990f8bb425a3c28b74ed575 + +I=338 +KEY=0f6a40835b5726e09dd57faf987214c1 +PT=ac4e91336990f8bb425a3c28b74ed575 +CT=4008fcc6bca00ee92cd48c0a29184f37 + +I=339 +KEY=4f62bc45e7f72809b101f3a5b16a5bf6 +PT=4008fcc6bca00ee92cd48c0a29184f37 +CT=1c311ec4005cad8a7aead0a58d2bd4df + +I=340 +KEY=5353a281e7ab8583cbeb23003c418f29 +PT=1c311ec4005cad8a7aead0a58d2bd4df +CT=1bbc845c6e3510d010b8ce92e3319c86 + +I=341 +KEY=48ef26dd899e9553db53ed92df7013af +PT=1bbc845c6e3510d010b8ce92e3319c86 +CT=c4d442a88321b98ff7f3b178255d446f + +I=342 +KEY=8c3b64750abf2cdc2ca05ceafa2d57c0 +PT=c4d442a88321b98ff7f3b178255d446f +CT=1d841bb608215ceb42ac5216a939d521 + +I=343 +KEY=91bf7fc3029e70376e0c0efc531482e1 +PT=1d841bb608215ceb42ac5216a939d521 +CT=5c7d9ba058b88d9fb967bda3080fee41 + +I=344 +KEY=cdc2e4635a26fda8d76bb35f5b1b6ca0 +PT=5c7d9ba058b88d9fb967bda3080fee41 +CT=558feedddf24ec966a8f3835fe252849 + +I=345 +KEY=984d0abe8502113ebde48b6aa53e44e9 +PT=558feedddf24ec966a8f3835fe252849 +CT=a75c5a7a23a020982b367b68ac2154ae + +I=346 +KEY=3f1150c4a6a231a696d2f002091f1047 +PT=a75c5a7a23a020982b367b68ac2154ae +CT=b75d2acdfa1f13ca235f5d7b3da0a877 + +I=347 +KEY=884c7a095cbd226cb58dad7934bfb830 +PT=b75d2acdfa1f13ca235f5d7b3da0a877 +CT=fd9b2f39020ca174f3ef99b834c2df99 + +I=348 +KEY=75d755305eb18318466234c1007d67a9 +PT=fd9b2f39020ca174f3ef99b834c2df99 +CT=f313b97c9a68b5ea4559c3f466a1185b + +I=349 +KEY=86c4ec4cc4d936f2033bf73566dc7ff2 +PT=f313b97c9a68b5ea4559c3f466a1185b +CT=0c136310f5fc3411e5c43f792241f938 + +I=350 +KEY=8ad78f5c312502e3e6ffc84c449d86ca +PT=0c136310f5fc3411e5c43f792241f938 +CT=b15a27b62026660ed67bbd6f9a451a07 + +I=351 +KEY=3b8da8ea110364ed30847523ded89ccd +PT=b15a27b62026660ed67bbd6f9a451a07 +CT=2ae627810e55ca3b53cbb14d987dbb76 + +I=352 +KEY=116b8f6b1f56aed6634fc46e46a527bb +PT=2ae627810e55ca3b53cbb14d987dbb76 +CT=fb8bf764f2683404cc3685e5a8d4b32d + +I=353 +KEY=eae0780fed3e9ad2af79418bee719496 +PT=fb8bf764f2683404cc3685e5a8d4b32d +CT=65462d84b6a50c2acb618fe4d66e6ef5 + +I=354 +KEY=8fa6558b5b9b96f86418ce6f381ffa63 +PT=65462d84b6a50c2acb618fe4d66e6ef5 +CT=35751dc452fe4107636ba323d60c7d6d + +I=355 +KEY=bad3484f0965d7ff07736d4cee13870e +PT=35751dc452fe4107636ba323d60c7d6d +CT=9da691c55581b07b67e532f584674571 + +I=356 +KEY=2775d98a5ce4678460965fb96a74c27f +PT=9da691c55581b07b67e532f584674571 +CT=04aefc109700d4d5e1fa124f1dbcd423 + +I=357 +KEY=23db259acbe4b351816c4df677c8165c +PT=04aefc109700d4d5e1fa124f1dbcd423 +CT=9e611972dd9437e09d90b039f70abb5a + +I=358 +KEY=bdba3ce8167084b11cfcfdcf80c2ad06 +PT=9e611972dd9437e09d90b039f70abb5a +CT=02dad7ac91e7970f96fea1e07147e3ff + +I=359 +KEY=bf60eb44879713be8a025c2ff1854ef9 +PT=02dad7ac91e7970f96fea1e07147e3ff +CT=ba9c25e7cb4fe41d19eee501e02b2c31 + +I=360 +KEY=05fccea34cd8f7a393ecb92e11ae62c8 +PT=ba9c25e7cb4fe41d19eee501e02b2c31 +CT=61a1479c6c8240dd0d54ef4e81fa0529 + +I=361 +KEY=645d893f205ab77e9eb85660905467e1 +PT=61a1479c6c8240dd0d54ef4e81fa0529 +CT=35677d608830dcc80f0d301fbc5048ff + +I=362 +KEY=513af45fa86a6bb691b5667f2c042f1e +PT=35677d608830dcc80f0d301fbc5048ff +CT=551c151bd41dc9780da1d93f0c943512 + +I=363 +KEY=0426e1447c77a2ce9c14bf4020901a0c +PT=551c151bd41dc9780da1d93f0c943512 +CT=a06c75187875abeee4514811f8671c01 + +I=364 +KEY=a44a945c040209207845f751d8f7060d +PT=a06c75187875abeee4514811f8671c01 +CT=f12c94c5ce8194f08eef9c9066fa8dda + +I=365 +KEY=55660099ca839dd0f6aa6bc1be0d8bd7 +PT=f12c94c5ce8194f08eef9c9066fa8dda +CT=ebaf2112eeb3a49dfd68b9c06338cd35 + +I=366 +KEY=bec9218b2430394d0bc2d201dd3546e2 +PT=ebaf2112eeb3a49dfd68b9c06338cd35 +CT=e79375234873f40ba03394f244fd2ab4 + +I=367 +KEY=595a54a86c43cd46abf146f399c86c56 +PT=e79375234873f40ba03394f244fd2ab4 +CT=1a87a6cab94417c0a253540b9e2e40dd + +I=368 +KEY=43ddf262d507da8609a212f807e62c8b +PT=1a87a6cab94417c0a253540b9e2e40dd +CT=0698d6017a8d44038dd1bad284bd1a2f + +I=369 +KEY=45452463af8a9e858473a82a835b36a4 +PT=0698d6017a8d44038dd1bad284bd1a2f +CT=df9ce06432fd38c6d10eb8c316c3b20d + +I=370 +KEY=9ad9c4079d77a643557d10e9959884a9 +PT=df9ce06432fd38c6d10eb8c316c3b20d +CT=ade417ff698ff33ee286e93268450726 + +I=371 +KEY=373dd3f8f4f8557db7fbf9dbfddd838f +PT=ade417ff698ff33ee286e93268450726 +CT=55e1013034d7b2ffb1cab90b7ccf975c + +I=372 +KEY=62dcd2c8c02fe782063140d0811214d3 +PT=55e1013034d7b2ffb1cab90b7ccf975c +CT=fbbb243f9438ffd313842f3a4ce344af + +I=373 +KEY=9967f6f75417185115b56feacdf1507c +PT=fbbb243f9438ffd313842f3a4ce344af +CT=e72968a7804e264a6663e2d4413ee2e4 + +I=374 +KEY=7e4e9e50d4593e1b73d68d3e8ccfb298 +PT=e72968a7804e264a6663e2d4413ee2e4 +CT=29eeaf33ca0089a642233befbb31fe8c + +I=375 +KEY=57a031631e59b7bd31f5b6d137fe4c14 +PT=29eeaf33ca0089a642233befbb31fe8c +CT=8f88d006e954df4971a84684223280a3 + +I=376 +KEY=d828e165f70d68f4405df05515ccccb7 +PT=8f88d006e954df4971a84684223280a3 +CT=7e4fc66ebb2c4f82a1cb0d33f0820c82 + +I=377 +KEY=a667270b4c212776e196fd66e54ec035 +PT=7e4fc66ebb2c4f82a1cb0d33f0820c82 +CT=243eb64d433cda288332afd7d78ac5e2 + +I=378 +KEY=825991460f1dfd5e62a452b132c405d7 +PT=243eb64d433cda288332afd7d78ac5e2 +CT=6c9e1601af7894006ab078df16ea903c + +I=379 +KEY=eec78747a065695e08142a6e242e95eb +PT=6c9e1601af7894006ab078df16ea903c +CT=6736924f907fa9bea54e04cac54ff3a3 + +I=380 +KEY=89f11508301ac0e0ad5a2ea4e1616648 +PT=6736924f907fa9bea54e04cac54ff3a3 +CT=79f24c2c804a36da6f1c0d9386170364 + +I=381 +KEY=f0035924b050f63ac24623376776652c +PT=79f24c2c804a36da6f1c0d9386170364 +CT=14a9b3a4dd2b07df692830a80abb47c3 + +I=382 +KEY=e4aaea806d7bf1e5ab6e139f6dcd22ef +PT=14a9b3a4dd2b07df692830a80abb47c3 +CT=457e67b9fc38a575e6e785f47b61fc0d + +I=383 +KEY=a1d48d39914354904d89966b16acdee2 +PT=457e67b9fc38a575e6e785f47b61fc0d +CT=1c5154c4d6d1c4781c9beb5fa107e1bb + +I=384 +KEY=bd85d9fd479290e851127d34b7ab3f59 +PT=1c5154c4d6d1c4781c9beb5fa107e1bb +CT=62a09f485c24f575d3c476725d6e5767 + +I=385 +KEY=df2546b51bb6659d82d60b46eac5683e +PT=62a09f485c24f575d3c476725d6e5767 +CT=4a965c7bfc7095d0e9cba2b042fd22e6 + +I=386 +KEY=95b31acee7c6f04d6b1da9f6a8384ad8 +PT=4a965c7bfc7095d0e9cba2b042fd22e6 +CT=3e1601ac5365ec8c8806a35da84237cf + +I=387 +KEY=aba51b62b4a31cc1e31b0aab007a7d17 +PT=3e1601ac5365ec8c8806a35da84237cf +CT=d8640dc9b73c47d10aeb1bf9f8cb0f29 + +I=388 +KEY=73c116ab039f5b10e9f01152f8b1723e +PT=d8640dc9b73c47d10aeb1bf9f8cb0f29 +CT=8c56db660307571e6f4fbb12f8518161 + +I=389 +KEY=ff97cdcd00980c0e86bfaa4000e0f35f +PT=8c56db660307571e6f4fbb12f8518161 +CT=b10c941ff996579a26b0324c90d2cc5c + +I=390 +KEY=4e9b59d2f90e5b94a00f980c90323f03 +PT=b10c941ff996579a26b0324c90d2cc5c +CT=2b8099f5d9931a89fb387206d53d994a + +I=391 +KEY=651bc027209d411d5b37ea0a450fa649 +PT=2b8099f5d9931a89fb387206d53d994a +CT=90dc0b869eb93f11d6a6ac30feaca1e5 + +I=392 +KEY=f5c7cba1be247e0c8d91463abba307ac +PT=90dc0b869eb93f11d6a6ac30feaca1e5 +CT=1781e91e7c34a882e5b8601358779a12 + +I=393 +KEY=e24622bfc210d68e68292629e3d49dbe +PT=1781e91e7c34a882e5b8601358779a12 +CT=84049d1082da0a4fa1042c0b9e2229be + +I=394 +KEY=6642bfaf40cadcc1c92d0a227df6b400 +PT=84049d1082da0a4fa1042c0b9e2229be +CT=54bc31b89ce4700886e713aee936c427 + +I=395 +KEY=32fe8e17dc2eacc94fca198c94c07027 +PT=54bc31b89ce4700886e713aee936c427 +CT=68ae964381f03b48bbdaef9581cc2aae + +I=396 +KEY=5a5018545dde9781f410f619150c5a89 +PT=68ae964381f03b48bbdaef9581cc2aae +CT=f4d2372d1949d00f1d7525fa33c28406 + +I=397 +KEY=ae822f794497478ee965d3e326cede8f +PT=f4d2372d1949d00f1d7525fa33c28406 +CT=1fe5e7a2b852afead22d070c46a4520b + +I=398 +KEY=b167c8dbfcc5e8643b48d4ef606a8c84 +PT=1fe5e7a2b852afead22d070c46a4520b +CT=aba9f3de2facf761d9ccbebd295bd402 + +I=399 +KEY=1ace3b05d3691f05e2846a5249315886 +PT=aba9f3de2facf761d9ccbebd295bd402 +CT=662443ca556f5d9475eb34dec6452eb9 + +KEYSIZE=192 + +I=0 +KEY=000000000000000000000000000000000000000000000000 +PT=00000000000000000000000000000000 +CT=2d8af7b79eb7f21fdb394c77c3fb8c3a + +test + +I=1 +KEY=2d8af7b79eb7f21fdb394c77c3fb8c3a0df7df2c9829f1a1 +PT=2d8af7b79eb7f21fdb394c77c3fb8c3a +CT=d7585ada56f93796161c56cdba61aa3f + +I=2 +KEY=fad2ad6dc84ec589cd251aba799a260573a62b94c14e4a37 +PT=d7585ada56f93796161c56cdba61aa3f +CT=654c5eb1018d6086717b89db97e91a5a + +I=3 +KEY=9f9ef3dcc9c3a50fbc5e9361ee733c5fe6d0c5cbb168c289 +PT=654c5eb1018d6086717b89db97e91a5a +CT=8f55d4952903b480ce9ae1b2fdca07f4 + +I=4 +KEY=10cb2749e0c0118f72c472d313b93babb19cde62a492b64d +PT=8f55d4952903b480ce9ae1b2fdca07f4 +CT=122e10485449687f99562a5b3ce0c022 + +I=5 +KEY=02e53701b48979f0eb9258882f59fb895899f389df32a97c +PT=122e10485449687f99562a5b3ce0c022 +CT=0bef7c642c1728a91e0862c32c7ba03a + +I=6 +KEY=090a4b65989e5159f59a3a4b03225bb3b70ec5c405f53739 +PT=0bef7c642c1728a91e0862c32c7ba03a +CT=48b6fb885b50f097fafe596c834a5e3b + +I=7 +KEY=41bcb0edc3cea1ce0f64632780680588d4896b21b4285aec +PT=48b6fb885b50f097fafe596c834a5e3b +CT=6504c124d3fe3075519c02c27156adde + +I=8 +KEY=24b871c9103091bb5ef861e5f13ea856b0d63071660974f3 +PT=6504c124d3fe3075519c02c27156adde +CT=13045621123c54ff17fe6fada146086b + +I=9 +KEY=37bc27e8020cc54449060e485078a03d98d739b3376089a2 +PT=13045621123c54ff17fe6fada146086b +CT=583cfa6c1c0db91e3663d5645c1c0c21 + +I=10 +KEY=6f80dd841e017c5a7f65db2c0c64ac1cb282bf4cd5a00797 +PT=583cfa6c1c0db91e3663d5645c1c0c21 +CT=3fff7bc2d2e91274ecabd80d3b7c9d52 + +I=11 +KEY=507fa646cce86e2e93ce03213718314e4142628604296c73 +PT=3fff7bc2d2e91274ecabd80d3b7c9d52 +CT=04942897fa1bd6797194b877d118aa83 + +I=12 +KEY=54eb8ed136f3b857e25abb56e6009bcdc071cb2aad7e4d42 +PT=04942897fa1bd6797194b877d118aa83 +CT=4f564bee22cfe0ccdfe3d186e2308ab3 + +I=13 +KEY=1bbdc53f143c589b3db96ad00430117e0f5ef27de9747354 +PT=4f564bee22cfe0ccdfe3d186e2308ab3 +CT=a7fc3fcae5bf84a3ab14e5e9bdb24942 + +I=14 +KEY=bc41faf5f183dc3896ad8f39b982583cf24a5e27f0a0ad22 +PT=a7fc3fcae5bf84a3ab14e5e9bdb24942 +CT=3e9627377333c75504c59712c863d118 + +I=15 +KEY=82d7ddc282b01b6d9268182b71e18924aa7c1232aec9851e +PT=3e9627377333c75504c59712c863d118 +CT=ef52a0844f8bb92efa6a4677ff9f2c33 + +I=16 +KEY=6d857d46cd3ba24368025e5c8e7ea517da55980b2aab983e +PT=ef52a0844f8bb92efa6a4677ff9f2c33 +CT=b0c4441c89c80eed7056b88ec5467f20 + +I=17 +KEY=dd41395a44f3acae1854e6d24b38da375e6c74dd4495116f +PT=b0c4441c89c80eed7056b88ec5467f20 +CT=6b069b2bfba26e56c2362fe38ee626cd + +I=18 +KEY=b647a271bf51c2f8da62c931c5defcfaa68dbbb32fef4a12 +PT=6b069b2bfba26e56c2362fe38ee626cd +CT=e7bce5861d3fe4aa3795a6e084505319 + +I=19 +KEY=51fb47f7a26e2652edf76fd1418eafe335674f060f9df9a1 +PT=e7bce5861d3fe4aa3795a6e084505319 +CT=5719e85e04b4a957a422bc8541e368e6 + +I=20 +KEY=06e2afa9a6da8f0549d5d354006dc70516d028fd0e6ad533 +PT=5719e85e04b4a957a422bc8541e368e6 +CT=dd9e532e2f95fab1aba776f20d14d2eb + +I=21 +KEY=db7cfc87894f75b4e272a5a60d7915ee658d52d2d7fbc801 +PT=dd9e532e2f95fab1aba776f20d14d2eb +CT=b293ed77c7213581ca4a3dfb8dda00b6 + +I=22 +KEY=69ef11f04e6e40352838985d80a3155846046c19df20c8f4 +PT=b293ed77c7213581ca4a3dfb8dda00b6 +CT=5b123cd3bbd0ef91a13359cc1aafdfec + +I=23 +KEY=32fd2d23f5beafa4890bc1919a0ccab483526c7fb36aef77 +PT=5b123cd3bbd0ef91a13359cc1aafdfec +CT=a65624c712c1e3e6f7c463bc56aa11d8 + +I=24 +KEY=94ab09e4e77f4c427ecfa22dcca6db6cceaee44725ed9447 +PT=a65624c712c1e3e6f7c463bc56aa11d8 +CT=df4692912e4b72ed39a943c2ab2581da + +I=25 +KEY=4bed9b75c9343eaf4766e1ef67835ab61bce3c2f9bc249ec +PT=df4692912e4b72ed39a943c2ab2581da +CT=cd14310b565131aaebf95fc208935f8d + +I=26 +KEY=86f9aa7e9f650f05ac9fbe2d6f10053b89925d0f3c153401 +PT=cd14310b565131aaebf95fc208935f8d +CT=a5ef5a092ce0f286fa804696811b4fab + +I=27 +KEY=2316f077b385fd83561ff8bbee0b4a90b4da5d062b15d40f +PT=a5ef5a092ce0f286fa804696811b4fab +CT=804feba06527ac99e61acff97adf5cff + +I=28 +KEY=a3591bd7d6a2511ab005374294d4166f589edd3cebdee3b7 +PT=804feba06527ac99e61acff97adf5cff +CT=273e751a93d25e94ded72c1da5f0f537 + +I=29 +KEY=84676ecd45700f8e6ed21b5f3124e35841754e0703f6097e +PT=273e751a93d25e94ded72c1da5f0f537 +CT=ad1c41a25480b1aa59d66be614d08505 + +I=30 +KEY=297b2f6f11f0be24370470b925f4665da59238049b55afd2 +PT=ad1c41a25480b1aa59d66be614d08505 +CT=4d5b00f3cb325331daca84e1eaa857f5 + +I=31 +KEY=64202f9cdac2ed15edcef458cf5c31a8794888f023d0ef74 +PT=4d5b00f3cb325331daca84e1eaa857f5 +CT=9e376004a932d3d69df02de32ad4c400 + +I=32 +KEY=fa174f9873f03ec3703ed9bbe588f5a8cfaad6b45cc1a33d +PT=9e376004a932d3d69df02de32ad4c400 +CT=9056c673de07bdf5820db6a2f3ddaf01 + +I=33 +KEY=6a4189ebadf78336f2336f1916555aa9d2449dad09c280a2 +PT=9056c673de07bdf5820db6a2f3ddaf01 +CT=822d68d5dadf0e6f251a3fd049b57c15 + +I=34 +KEY=e86ce13e77288d59d72950c95fe026bcff3ef12d7b89098c +PT=822d68d5dadf0e6f251a3fd049b57c15 +CT=2cbf859e611f1aa376b72255ed4214b0 + +I=35 +KEY=c4d364a0163797faa19e729cb2a2320c4c0dfc34d7a9f4ff +PT=2cbf859e611f1aa376b72255ed4214b0 +CT=9bc4de94fae3719fac79450ea22ed0be + +I=36 +KEY=5f17ba34ecd4e6650de73792108ce2b2167da256e05d7f59 +PT=9bc4de94fae3719fac79450ea22ed0be +CT=0b23ae79aa698e1651b2d4e23c0bb23d + +I=37 +KEY=5434144d46bd68735c55e3702c87508f9ae6892ba7d6f28c +PT=0b23ae79aa698e1651b2d4e23c0bb23d +CT=fe810c773a93f9556a90e2a18d3f1f00 + +I=38 +KEY=aab5183a7c2e912636c501d1a1b84f8f3352e8d07806e1e8 +PT=fe810c773a93f9556a90e2a18d3f1f00 +CT=f640986154facbfe7d7dfbe2b520570c + +I=39 +KEY=5cf5805b28d45ad84bb8fa33149818839708192518ab2e1e +PT=f640986154facbfe7d7dfbe2b520570c +CT=18a13c3db51457b9bee20e2a8fbc32d1 + +I=40 +KEY=4454bc669dc00d61f55af4199b242a52964aa1ed496eaf07 +PT=18a13c3db51457b9bee20e2a8fbc32d1 +CT=b61b2b452fbc05a38d1fae5e1739673e + +I=41 +KEY=f24f9723b27c08c278455a478c1d4d6c149412a85e99f6a1 +PT=b61b2b452fbc05a38d1fae5e1739673e +CT=2ed882937117a8c134965b5e90df1566 + +I=42 +KEY=dc9715b0c36ba0034cd301191cc2580a7c5e484b32a99f99 +PT=2ed882937117a8c134965b5e90df1566 +CT=0fbd22a9de209ba60f7b759f150719ea + +I=43 +KEY=d32a37191d4b3ba543a8748609c541e0d8e24e72b0b6b2d4 +PT=0fbd22a9de209ba60f7b759f150719ea +CT=31136e8c1fc90c539e5df3706f5159c6 + +I=44 +KEY=e2395995028237f6ddf587f6669418264571d5f7754a16d3 +PT=31136e8c1fc90c539e5df3706f5159c6 +CT=79ab1d2d435f8a070fcdccfbc8ad4053 + +I=45 +KEY=9b9244b841ddbdf1d2384b0dae39587541fbf6abb0334c20 +PT=79ab1d2d435f8a070fcdccfbc8ad4053 +CT=568805dd0e91e1322f215e1f64c7f2b8 + +I=46 +KEY=cd1a41654f4c5cc3fd191512cafeaacddb6dfa85a3b84bdf +PT=568805dd0e91e1322f215e1f64c7f2b8 +CT=bc5651a905b82db28c96b188fc756dc9 + +I=47 +KEY=714c10cc4af47171718fa49a368bc704d81b1e087b537de5 +PT=bc5651a905b82db28c96b188fc756dc9 +CT=0cffbed1099d976da4de97767f3a5d71 + +I=48 +KEY=7db3ae1d4369e61cd55133ec49b19a75b9a41f105b4846a1 +PT=0cffbed1099d976da4de97767f3a5d71 +CT=f87828097f80f20bf598f0f5b063322c + +I=49 +KEY=85cb86143ce9141720c9c319f9d2a8598a1f93a262942c2b +PT=f87828097f80f20bf598f0f5b063322c +CT=054bebec3140a8e426b7995bacade33a + +I=50 +KEY=80806df80da9bcf3067e5a42557f4b6391cda4320c6e02d5 +PT=054bebec3140a8e426b7995bacade33a +CT=c68e22f403dd3aa990275c7c7bb7dc3d + +I=51 +KEY=460e4f0c0e74865a9659063e2ec8975ef5f8ee79d191f18f +PT=c68e22f403dd3aa990275c7c7bb7dc3d +CT=76931ad8bb53a9459da59c11ce94eec5 + +I=52 +KEY=309d55d4b5272f1f0bfc9a2fe05c799b30e2a7a8dcd7c311 +PT=76931ad8bb53a9459da59c11ce94eec5 +CT=fad4b407833808cdfe66ada1aa5799b0 + +I=53 +KEY=ca49e1d3361f27d2f59a378e4a0be02bda4d43f18481fd2e +PT=fad4b407833808cdfe66ada1aa5799b0 +CT=117179d453e7527a889d8863adc8d3cd + +I=54 +KEY=db38980765f875a87d07bfede7c333e671f73a1663d2f545 +PT=117179d453e7527a889d8863adc8d3cd +CT=48a8a6c13bd387d782ed7cd2fad135db + +I=55 +KEY=93903ec65e2bf27fffeac33f1d12063dfca36dbc9dd5204d +PT=48a8a6c13bd387d782ed7cd2fad135db +CT=263f193a9af45a9b8993a88a5b0b6027 + +I=56 +KEY=b5af27fcc4dfa8e476796bb54619661ac8e3b319c8f9aac1 +PT=263f193a9af45a9b8993a88a5b0b6027 +CT=1341d6977d54bf236776412610393794 + +I=57 +KEY=a6eef16bb98b17c7110f2a935620518ee6d35e2a2414e52b +PT=1341d6977d54bf236776412610393794 +CT=d012ba8869e07d3a6484a7b9ba6248a0 + +I=58 +KEY=76fc4be3d06b6afd758b8d2aec42192e1d17a362c53f9207 +PT=d012ba8869e07d3a6484a7b9ba6248a0 +CT=71d597cf23f2b6808f3b5262c7635e15 + +I=59 +KEY=0729dc2cf399dc7dfab0df482b21473bad1aa5feca8b9ec6 +PT=71d597cf23f2b6808f3b5262c7635e15 +CT=e4e9aec9a4929cd7c95cd09f237a6c85 + +I=60 +KEY=e3c072e5570b40aa33ec0fd7085b2bbed1abec62a8338583 +PT=e4e9aec9a4929cd7c95cd09f237a6c85 +CT=26a057233b30a952e74bb157d814632c + +I=61 +KEY=c56025c66c3be9f8d4a7be80d04f489288d973969122c7a0 +PT=26a057233b30a952e74bb157d814632c +CT=cfafb4e3a6d0d288003e616adc9e0f78 + +I=62 +KEY=0acf9125caeb3b70d499dfea0cd147ea2136c30d034a16c9 +PT=cfafb4e3a6d0d288003e616adc9e0f78 +CT=3ec4f89799ee39297413fd79a062fdc2 + +I=63 +KEY=340b69b253050259a08a2293acb3ba28f0f38b85b0d49f78 +PT=3ec4f89799ee39297413fd79a062fdc2 +CT=96e0d59ea36e48ba508ea95139efd6f2 + +I=64 +KEY=a2ebbc2cf06b4ae3f0048bc2955c6cdab1c3dc0ec893cd04 +PT=96e0d59ea36e48ba508ea95139efd6f2 +CT=3cea642c2f6a27038ac8c857b27a04b3 + +I=65 +KEY=9e01d800df016de07acc439527266869d098b50e915b7634 +PT=3cea642c2f6a27038ac8c857b27a04b3 +CT=725ff0b76076d674c17a0cf4fbbe0ca8 + +I=66 +KEY=ec5e28b7bf77bb94bbb64f61dc9864c186ee99b666e77446 +PT=725ff0b76076d674c17a0cf4fbbe0ca8 +CT=de825e1d9ddc42d86b382f9b9bec088f + +I=67 +KEY=32dc76aa22abf94cd08e60fa47746c4e0024496425b0cbad +PT=de825e1d9ddc42d86b382f9b9bec088f +CT=f253002094b48737ba44dace7df46d7b + +I=68 +KEY=c08f768ab61f7e7b6acaba343a80013590320e90906fe510 +PT=f253002094b48737ba44dace7df46d7b +CT=dc7e2a79b0816d9eb52b0d001795a586 + +I=69 +KEY=1cf15cf3069e13e5dfe1b7342d15a4b3ad013fa75fa415f1 +PT=dc7e2a79b0816d9eb52b0d001795a586 +CT=b42aff8e9f07678651009d2707453ba5 + +I=70 +KEY=a8dba37d999974638ee12a132a509f1611f6979d10becb49 +PT=b42aff8e9f07678651009d2707453ba5 +CT=d5909349ebcf4981cfcf084d1e82e660 + +I=71 +KEY=7d4b303472563de2412e225e34d279765ea31aafcf5e0ca1 +PT=d5909349ebcf4981cfcf084d1e82e660 +CT=c3cb793edc49b02e3864e435f4a7f0b8 + +I=72 +KEY=be80490aae1f8dcc794ac66bc07589cee0dee6b115b33f0b +PT=c3cb793edc49b02e3864e435f4a7f0b8 +CT=60ad3f7b6be100dd7ad42c44c3de34ef + +I=73 +KEY=de2d7671c5fe8d11039eea2f03abbd21a4497d0d48989474 +PT=60ad3f7b6be100dd7ad42c44c3de34ef +CT=62f1e52e954e0dab81904c86d4bb3b66 + +I=74 +KEY=bcdc935f50b080ba820ea6a9d71086471d6fb43949562e2f +PT=62f1e52e954e0dab81904c86d4bb3b66 +CT=96002cb4a56174317318298cb41f60d1 + +I=75 +KEY=2adcbfebf5d1f48bf1168f25630fe69648768812290ce79b +PT=96002cb4a56174317318298cb41f60d1 +CT=be520e63971fdb8b21c0bc549607af6f + +I=76 +KEY=948eb18862ce2f00d0d63371f50849f9febe3fa4c94dcdfa +PT=be520e63971fdb8b21c0bc549607af6f +CT=1d8a29a545a3bfd527c0aa8577f5d33f + +I=77 +KEY=8904982d276d90d5f71699f482fd9ac67369b752d60422d4 +PT=1d8a29a545a3bfd527c0aa8577f5d33f +CT=18f4c6ec622dbdaa66876e84016ac191 + +I=78 +KEY=91f05ec145402d7f9191f77083975b5746b797476e10b751 +PT=18f4c6ec622dbdaa66876e84016ac191 +CT=f1b7e0f4890c65e950fa2b4778951144 + +I=79 +KEY=6047be35cc4c4896c16bdc37fb024a1380b7c674ad4e3efd +PT=f1b7e0f4890c65e950fa2b4778951144 +CT=8bcabd1bcb750df509b567640b4c1bc9 + +I=80 +KEY=eb8d032e07394563c8debb53f04e51da2c7d31b60a415c32 +PT=8bcabd1bcb750df509b567640b4c1bc9 +CT=fa085fa67f8ee4d7ce6cfe445aeab419 + +I=81 +KEY=11855c8878b7a1b406b24517aaa4e5c32f964d0b832db18d +PT=fa085fa67f8ee4d7ce6cfe445aeab419 +CT=2766d1d6d2c8a639f1d8150644262833 + +I=82 +KEY=36e38d5eaa7f078df76a5011ee82cdf03765b7833be4b227 +PT=2766d1d6d2c8a639f1d8150644262833 +CT=3664e3882c874a468d2d3527d5bb6eca + +I=83 +KEY=00876ed686f84dcb7a4765363b39a33a90b14b68f23dc944 +PT=3664e3882c874a468d2d3527d5bb6eca +CT=e8ef4a26769e04fd31871da35de2a2c9 + +I=84 +KEY=e86824f0f06649364bc0789566db01f3802e50f053535a23 +PT=e8ef4a26769e04fd31871da35de2a2c9 +CT=f02afc7be83287fa4d5884eda426fa76 + +I=85 +KEY=1842d88b1854cecc0698fc78c2fdfb85ac5d5c7108f66a55 +PT=f02afc7be83287fa4d5884eda426fa76 +CT=d4a8a29119db67bb2043e07e0fe1a7c4 + +I=86 +KEY=ccea7a1a018fa97726db1c06cd1c5c4176af6c1491fb7428 +PT=d4a8a29119db67bb2043e07e0fe1a7c4 +CT=0a6f80ae19305d3dda6284afb81ba8b8 + +I=87 +KEY=c685fab418bff44afcb998a97507f4f9e949e1857bf6751a +PT=0a6f80ae19305d3dda6284afb81ba8b8 +CT=7f3e290603d2146944b8778057617116 + +I=88 +KEY=b9bbd3b21b6de023b801ef29226685ef5134064f5cf90d4b +PT=7f3e290603d2146944b8778057617116 +CT=67c16fbd9b85528e3f3505bddb3b64bc + +I=89 +KEY=de7abc0f80e8b2ad8734ea94f95de15330a1e5f91815fada +PT=67c16fbd9b85528e3f3505bddb3b64bc +CT=6c24e6b5bf7cb216783c547a9c0fee9a + +I=90 +KEY=b25e5aba3f9400bbff08beee65520fc92b1e19016c04ff53 +PT=6c24e6b5bf7cb216783c547a9c0fee9a +CT=c03950f723756e94e204773c0928725d + +I=91 +KEY=72670a4d1ce16e2f1d0cc9d26c7a7d94916be692f62fb8e6 +PT=c03950f723756e94e204773c0928725d +CT=10d65055ab60a2ce10756e82ba6f8c0f + +I=92 +KEY=62b15a18b781cce10d79a750d615f19b9d03dbf1f7d9457f +PT=10d65055ab60a2ce10756e82ba6f8c0f +CT=5d8b154fe29e91f8fdf730b78daaee66 + +I=93 +KEY=3f3a4f57551f5d19f08e97e75bbf1ffdff458c9ada5f20d8 +PT=5d8b154fe29e91f8fdf730b78daaee66 +CT=db7d86fe22c65a2a537b23622aef7a00 + +I=94 +KEY=e447c9a977d90733a3f5b485715065fdc00b611879ac3fca +PT=db7d86fe22c65a2a537b23622aef7a00 +CT=88064e813d1144e71218203ca0057757 + +I=95 +KEY=6c4187284ac843d4b1ed94b9d15512aa9b1fac74e5e902ce +PT=88064e813d1144e71218203ca0057757 +CT=7e6a815f8acafed8a3aa0bdc7976e83b + +I=96 +KEY=122b0677c002bd0c12479f65a823fa91c4f9e3732e163411 +PT=7e6a815f8acafed8a3aa0bdc7976e83b +CT=a2eb8ea612cc883caab100093bd78f91 + +I=97 +KEY=b0c088d1d2ce3530b8f69f6c93f47500d2bdddd137be4a20 +PT=a2eb8ea612cc883caab100093bd78f91 +CT=b167fe11681eb66011f2befe550f4ecb + +I=98 +KEY=01a776c0bad08350a9042192c6fb3bcb3136054972e5377b +PT=b167fe11681eb66011f2befe550f4ecb +CT=df22dfa28ed230fd916cd7506d1085cd + +I=99 +KEY=de85a9623402b3ad3868f6c2abebbe06f6426aa4c548f9e9 +PT=df22dfa28ed230fd916cd7506d1085cd +CT=ad502f6429d7dffa1f0085aa2f99e482 + +I=100 +KEY=73d586061dd56c572768736884725a84355bcd47bae5ad12 +PT=ad502f6429d7dffa1f0085aa2f99e482 +CT=66c7aed5fb1f70e3cf10c221ebfd9ed0 + +I=101 +KEY=151228d3e6ca1cb4e878b1496f8fc4546bb425da11d6c34c +PT=66c7aed5fb1f70e3cf10c221ebfd9ed0 +CT=def74f923faf663ce9473ecf530db9c9 + +I=102 +KEY=cbe56741d9657a88013f8f863c827d9d1af5c011e5ccb301 +PT=def74f923faf663ce9473ecf530db9c9 +CT=4b194db9a75aeba83bc94041fb746ad1 + +I=103 +KEY=80fc2af87e3f91203af6cfc7c7f6174c4bcbbb0a34b366c4 +PT=4b194db9a75aeba83bc94041fb746ad1 +CT=8de5777eed3c43611ccd94394a8f574c + +I=104 +KEY=0d195d869303d241263b5bfe8d7940009a8a2502989f3379 +PT=8de5777eed3c43611ccd94394a8f574c +CT=1c1e3fdaf4357fa1385e887f9c782dc9 + +I=105 +KEY=1107625c6736ade01e65d38111016dc92908c9216e9539c3 +PT=1c1e3fdaf4357fa1385e887f9c782dc9 +CT=b29604f7d9bbef1df0b7a1ab52a61a0d + +I=106 +KEY=a39166abbe8d42fdeed2722a43a777c4f6a97c1c407ab669 +PT=b29604f7d9bbef1df0b7a1ab52a61a0d +CT=9684b786dc96c387c190d261f810bf71 + +I=107 +KEY=3515d12d621b817a2f42a04bbbb7c8b592876ea63f34ee7b +PT=9684b786dc96c387c190d261f810bf71 +CT=aee573e2c587be0358fd0a34ec8b4b75 + +I=108 +KEY=9bf0a2cfa79c3f7977bfaa7f573c83c0941eeaf0dce4f4a3 +PT=aee573e2c587be0358fd0a34ec8b4b75 +CT=418eb25d06657ec20b85714fea7e63a7 + +I=109 +KEY=da7e1092a1f941bb7c3adb30bd42e067386945d9d65e7d13 +PT=418eb25d06657ec20b85714fea7e63a7 +CT=ffe48be9c493e9b13656e78c8887b55f + +I=110 +KEY=259a9b7b656aa80a4a6c3cbc35c55538adcde19cb6104181 +PT=ffe48be9c493e9b13656e78c8887b55f +CT=61e2f5866417b26074e6b7d9a1bff196 + +I=111 +KEY=44786efd017d1a6a3e8a8b65947aa4aecaff01e9a3ca19c6 +PT=61e2f5866417b26074e6b7d9a1bff196 +CT=3c17c1ca1f2dd90269ea48ddac7426fc + +I=112 +KEY=786faf371e50c3685760c3b8380e825280a3f68bb80f45f5 +PT=3c17c1ca1f2dd90269ea48ddac7426fc +CT=2436388016d0ecf3a2a48203d5867475 + +I=113 +KEY=5c5997b708802f9bf5c441bbed88f627565ed0e871de2671 +PT=2436388016d0ecf3a2a48203d5867475 +CT=72402fa5e1414187d7e296811b4fce48 + +I=114 +KEY=2e19b812e9c16e1c2226d73af6c7386fcf29ae81804876cf +PT=72402fa5e1414187d7e296811b4fce48 +CT=232db6b881fe8d30b1ce6606d3ccf189 + +I=115 +KEY=0d340eaa683fe32c93e8b13c250bc9e6b3b50ad84f78964f +PT=232db6b881fe8d30b1ce6606d3ccf189 +CT=a104d42ced1998f92340673da3b1719e + +I=116 +KEY=ac30da8685267bd5b0a8d60186bab87867a404c0b7f2ff49 +PT=a104d42ced1998f92340673da3b1719e +CT=c6ead00d45765d4c4b13f5f0cc942fe2 + +I=117 +KEY=6ada0a8bc0502699fbbb23f14a2e979adaeffc60cf5af817 +PT=c6ead00d45765d4c4b13f5f0cc942fe2 +CT=2061d53486a6d4a6f5a6aac4c36eda7e + +I=118 +KEY=4abbdfbf46f6f23f0e1d893589404de4f20fea6514167038 +PT=2061d53486a6d4a6f5a6aac4c36eda7e +CT=341bbf3fe1cc4b1d62fad0207d7978db + +I=119 +KEY=7ea06080a73ab9226ce75915f439353f73d97e27387ccfa5 +PT=341bbf3fe1cc4b1d62fad0207d7978db +CT=47678b1ee7aead3c7a85376b2842b20c + +I=120 +KEY=39c7eb9e4094141e16626e7edc7b8733612f36d431f07ac7 +PT=47678b1ee7aead3c7a85376b2842b20c +CT=bed835e5abd4ad2a14eb8742db0e9d3a + +I=121 +KEY=871fde7beb40b9340289e93c07751a09e87b0eab9179ed8d +PT=bed835e5abd4ad2a14eb8742db0e9d3a +CT=26254f226e8137f866286c03c3111c9e + +I=122 +KEY=a13a915985c18ecc64a1853fc4640697c080b8347557cbad +PT=26254f226e8137f866286c03c3111c9e +CT=5c247e1c5e3ce47703ad9f6faea9f07f + +I=123 +KEY=fd1eef45dbfd6abb670c1a506acdf6e80e48f06f5d7ed6af +PT=5c247e1c5e3ce47703ad9f6faea9f07f +CT=d9fbd506212f6a70804009ee3fecf015 + +I=124 +KEY=24e53a43fad200cbe74c13be552106fd2894d5df16062649 +PT=d9fbd506212f6a70804009ee3fecf015 +CT=5714238f59cbc1c67ca9a6b7f4378b19 + +I=125 +KEY=73f119cca319c10d9be5b509a1168de44ab48a10c8c9bdac +PT=5714238f59cbc1c67ca9a6b7f4378b19 +CT=ccb2a981ae243280fa070852798f4d3b + +I=126 +KEY=bf43b04d0d3df38d61e2bd5bd899c0df123cbe0c3fc71832 +PT=ccb2a981ae243280fa070852798f4d3b +CT=8c96eefee656d081930ea60d36adf3f6 + +I=127 +KEY=33d55eb3eb6b230cf2ec1b56ee343329dec50651db3d690a +PT=8c96eefee656d081930ea60d36adf3f6 +CT=c5dc669eba3fbf0ee96e94d413410dad + +I=128 +KEY=f609382d51549c021b828f82fd753e841a7580e3a723e5e9 +PT=c5dc669eba3fbf0ee96e94d413410dad +CT=1a3da1d01c383736e10fea1c82c492c0 + +I=129 +KEY=ec3499fd4d6cab34fa8d659e7fb1ac44a375dd6918ef4482 +PT=1a3da1d01c383736e10fea1c82c492c0 +CT=b6acc0296c711a2a7f9d3a5d0f6feb0e + +I=130 +KEY=5a9859d4211db11e85105fc370de474a17cb94cb8e7216e3 +PT=b6acc0296c711a2a7f9d3a5d0f6feb0e +CT=ffb511f43ff5ee126c17cb825b36b36e + +I=131 +KEY=a52d48201ee85f0ce90794412be8f42411cf5b2f2981bbc8 +PT=ffb511f43ff5ee126c17cb825b36b36e +CT=220a57647ecb8da6af45f461b19acace + +I=132 +KEY=87271f446023d2aa464260209a723eea6589606b4405ef88 +PT=220a57647ecb8da6af45f461b19acace +CT=1ea16a1ca19cea74590927a95e470437 + +I=133 +KEY=99867558c1bf38de1f4b4789c4353add3ff9f4e260119b3f +PT=1ea16a1ca19cea74590927a95e470437 +CT=fa52d3c9ccc352fdac49a2aa160a85b8 + +I=134 +KEY=63d4a6910d7c6a23b302e523d23fbf659d4191ed93ae5d43 +PT=fa52d3c9ccc352fdac49a2aa160a85b8 +CT=dc4f577c399c21a08227436dc2d7c0a7 + +I=135 +KEY=bf9bf1ed34e04b833125a64e10e87fc2b39c829a8f592131 +PT=dc4f577c399c21a08227436dc2d7c0a7 +CT=ae6c915260ad76a06adee653adb30213 + +I=136 +KEY=11f760bf544d3d235bfb401dbd5b7dd1d1e6db5c1ed78971 +PT=ae6c915260ad76a06adee653adb30213 +CT=ccddd83b7a6c4e83eb8160cd732d8adc + +I=137 +KEY=dd2ab8842e2173a0b07a20d0ce76f70d637d58fedd1dbc0a +PT=ccddd83b7a6c4e83eb8160cd732d8adc +CT=edf4554df8de0eaedbdce14e12725093 + +I=138 +KEY=30deedc9d6ff7d0e6ba6c19edc04a79e3256b81d1f0e2b97 +PT=edf4554df8de0eaedbdce14e12725093 +CT=ac6f54391f1e467c38a2842c1d8fa434 + +I=139 +KEY=9cb1b9f0c9e13b72530445b2c18b03aa6a9f7545d3a090a0 +PT=ac6f54391f1e467c38a2842c1d8fa434 +CT=12b450ecdaf0229f1bea0811208e070d + +I=140 +KEY=8e05e91c131119ed48ee4da3e10504a74285dc4d851f6b22 +PT=12b450ecdaf0229f1bea0811208e070d +CT=5b9d566bd128d9342a86e26939e3b6de + +I=141 +KEY=d598bf77c239c0d96268afcad8e6b2791686d621327cb8f1 +PT=5b9d566bd128d9342a86e26939e3b6de +CT=c4b6135d55cd3ef807c0c901c7259351 + +I=142 +KEY=112eac2a97f4fe2165a866cb1fc321285159770ae5e4f30f +PT=c4b6135d55cd3ef807c0c901c7259351 +CT=51c99ecc8f245f7f9633f695d1e8ef9a + +I=143 +KEY=40e732e618d0a15ef39b905ece2bceb2bbcfef8f64009a44 +PT=51c99ecc8f245f7f9633f695d1e8ef9a +CT=d77651de6b31ebc004f144256df2f1b8 + +I=144 +KEY=9791633873e14a9ef76ad47ba3d93f0ac0478fa852484f55 +PT=d77651de6b31ebc004f144256df2f1b8 +CT=d180ec4f66382ed36d9c8e5dc4783bc3 + +I=145 +KEY=46118f7715d9644d9af65a2667a104c9c161977ebaa27684 +PT=d180ec4f66382ed36d9c8e5dc4783bc3 +CT=68180eee2b93bd11dd3444e6394f3afd + +I=146 +KEY=2e0981993e4ad95c47c21ec05eee3e343d6bcb012776c011 +PT=68180eee2b93bd11dd3444e6394f3afd +CT=317e531d8663fb0d8fc4f54220a90315 + +I=147 +KEY=1f77d284b8292251c806eb827e473d218cc8719a5c4a86bf +PT=317e531d8663fb0d8fc4f54220a90315 +CT=4d8dda7b8730311f576de8cde9617b3e + +I=148 +KEY=52fa08ff3f19134e9f6b034f9726461f379763fbb0c3a370 +PT=4d8dda7b8730311f576de8cde9617b3e +CT=6ebdd4c42b8db3c71bf773779222e412 + +I=149 +KEY=3c47dc3b1494a089849c70380504a20df1bb5ebd9b580782 +PT=6ebdd4c42b8db3c71bf773779222e412 +CT=42bd60c3be755d38976dd17961f31db7 + +I=150 +KEY=7efabcf8aae1fdb113f1a14164f7bfba25e0d6dae5bff020 +PT=42bd60c3be755d38976dd17961f31db7 +CT=cf7952f4b115c9685ac569fcd71c81a5 + +I=151 +KEY=b183ee0c1bf434d94934c8bdb3eb3e1f8f8ac20e1c1ec238 +PT=cf7952f4b115c9685ac569fcd71c81a5 +CT=a5aa6276f61261dfe56b4ac5ba13f0b2 + +I=152 +KEY=14298c7aede65506ac5f827809f8cead2fc60a4ec5f4e174 +PT=a5aa6276f61261dfe56b4ac5ba13f0b2 +CT=78c28bd3d80cf4683eba4a11ef1f258c + +I=153 +KEY=6ceb07a935eaa16e92e5c869e6e7eb21c3ee314d5bf5aeb8 +PT=78c28bd3d80cf4683eba4a11ef1f258c +CT=809e3910b3ffe40e7e6ec6254ecff301 + +I=154 +KEY=ec753eb986154560ec8b0e4ca828182008d0d603745ca010 +PT=809e3910b3ffe40e7e6ec6254ecff301 +CT=0cfa73fed2f766207a11f7972c655ce5 + +I=155 +KEY=e08f4d4754e22340969af9db844d44c522b76b3d1feef477 +PT=0cfa73fed2f766207a11f7972c655ce5 +CT=cc2fc3831122def26f17ee4344be6414 + +I=156 +KEY=2ca08ec445c0fdb2f98d1798c0f320d1a3575bf135e50b44 +PT=cc2fc3831122def26f17ee4344be6414 +CT=0b4b48fef52d0a8a86f1c75478c28af5 + +I=157 +KEY=27ebc63ab0edf7387f7cd0ccb831aa24cc3fbcbc36551641 +PT=0b4b48fef52d0a8a86f1c75478c28af5 +CT=ef0ac65d2959f4b8f0b9f2bd61bd3fd4 + +I=158 +KEY=c8e1006799b403808fc52271d98c95f00e0da542328f96ed +PT=ef0ac65d2959f4b8f0b9f2bd61bd3fd4 +CT=f03313397d563cced859d7d4b925b7b3 + +I=159 +KEY=38d2135ee4e23f4e579cf5a560a922430a481ecad3796ef4 +PT=f03313397d563cced859d7d4b925b7b3 +CT=1e29abdff3bc2ced6518257063cb4b29 + +I=160 +KEY=26fbb881175e13a33284d0d50362696a6e078d2ae35f544e +PT=1e29abdff3bc2ced6518257063cb4b29 +CT=2a87429eff9a5b31f9fde86f81f666c6 + +I=161 +KEY=0c7cfa1fe8c44892cb7938ba82940fac4c1192c7b4e96bb7 +PT=2a87429eff9a5b31f9fde86f81f666c6 +CT=30c7664123cf7668c071b1371d08f850 + +I=162 +KEY=3cbb9c5ecb0b3efa0b08898d9f9cf7fcc0d9bd1922055a56 +PT=30c7664123cf7668c071b1371d08f850 +CT=77fffe62eddf06023843d8f084b8958c + +I=163 +KEY=4b44623c26d438f8334b517d1b2462701369c4e90f88ee84 +PT=77fffe62eddf06023843d8f084b8958c +CT=af7ef3fb0a178bf9b23148409a14b2bc + +I=164 +KEY=e43a91c72cc3b301817a193d8130d0cc6f6a32a5e9d9eee1 +PT=af7ef3fb0a178bf9b23148409a14b2bc +CT=013789b17bf14a5ff208e5e4081c4447 + +I=165 +KEY=e50d18765732f95e7372fcd9892c948b596ee0289a9f4058 +PT=013789b17bf14a5ff208e5e4081c4447 +CT=e2f24701e05bfab582956dde3c4a1cc0 + +I=166 +KEY=07ff5f77b76903ebf1e79107b566884b7a7115daccb4fba1 +PT=e2f24701e05bfab582956dde3c4a1cc0 +CT=5fcdd0dc199e5b16211a2514f7227d0e + +I=167 +KEY=58328fabaef758fdd0fdb4134244f545e8a7edaabf61c850 +PT=5fcdd0dc199e5b16211a2514f7227d0e +CT=f0e7d446e3f84112ac8dd5731dbc093e + +I=168 +KEY=a8d55bed4d0f19ef7c7061605ff8fc7b70a164a32b87b82a +PT=f0e7d446e3f84112ac8dd5731dbc093e +CT=56112fcb3ab94aa251fe79bfc0c8d1d2 + +I=169 +KEY=fec4742677b6534d2d8e18df9f302da9a9bb958712f5d1f4 +PT=56112fcb3ab94aa251fe79bfc0c8d1d2 +CT=548b8342dc7abe972545c6ac61e8d6b3 + +I=170 +KEY=aa4ff764abccedda08cbde73fed8fb1a09e1776520ca00a0 +PT=548b8342dc7abe972545c6ac61e8d6b3 +CT=338380e73bb2614056e14f34524494b1 + +I=171 +KEY=99cc7783907e8c9a5e2a9147ac9c6fab9de5e0a70b0c122a +PT=338380e73bb2614056e14f34524494b1 +CT=c772fc108a0bfcf42ef444fd9509f5c2 + +I=172 +KEY=5ebe8b931a75706e70ded5ba39959a69e8c6e075dcca4abb +PT=c772fc108a0bfcf42ef444fd9509f5c2 +CT=7d35c39c2d28fe0e3aa0cc5bb47f1478 + +I=173 +KEY=238b480f375d8e604a7e19e18dea8e11e3aa29f209768bf0 +PT=7d35c39c2d28fe0e3aa0cc5bb47f1478 +CT=f7c7c38f3a613d21146468836e75637f + +I=174 +KEY=d44c8b800d3cb3415e1a7162e39fed6e21b48c2105552b69 +PT=f7c7c38f3a613d21146468836e75637f +CT=7c034adde36cc7b6ee8b69035190e1ab + +I=175 +KEY=a84fc15dee5074f7b0911861b20f0cc54e90db22126b8b4b +PT=7c034adde36cc7b6ee8b69035190e1ab +CT=725fc9635335b3431d2b4e934c3c73ae + +I=176 +KEY=da10083ebd65c7b4adba56f2fe337f6b1674cb959c0bbf64 +PT=725fc9635335b3431d2b4e934c3c73ae +CT=33e917653cfe43f4d8d07c31fb8d2a23 + +I=177 +KEY=e9f91f5b819b8440756a2ac305be55481613f6b9c0ed4f6c +PT=33e917653cfe43f4d8d07c31fb8d2a23 +CT=28206dc7d2a2215501fd2b5b61278d44 + +I=178 +KEY=c1d9729c5339a515749701986499d80c001763214d4ab290 +PT=28206dc7d2a2215501fd2b5b61278d44 +CT=efa952bb1c4d4f463765eb14861e3ef9 + +I=179 +KEY=2e7020274f74ea5343f2ea8ce287e6f5e13e603cbba9d01a +PT=efa952bb1c4d4f463765eb14861e3ef9 +CT=01a97067cb02f4a0539d0284177df5f3 + +I=180 +KEY=2fd9504084761ef3106fe808f5fa1306f0238e91f8eee184 +PT=01a97067cb02f4a0539d0284177df5f3 +CT=7c5e4fa966e76e2934c7c75b84c49841 + +I=181 +KEY=53871fe9e29170da24a82f53713e8b4765d32d95ef8b11d7 +PT=7c5e4fa966e76e2934c7c75b84c49841 +CT=bf6d4f2a1a4f3ed6475040e0488fa8c8 + +I=182 +KEY=ecea50c3f8de4e0c63f86fb339b1238f9af9e3983defed0f +PT=bf6d4f2a1a4f3ed6475040e0488fa8c8 +CT=6c5fecfbb0e7ced715f0b026f291dae1 + +I=183 +KEY=80b5bc38483980db7608df95cb20f96e600cb95352962ec2 +PT=6c5fecfbb0e7ced715f0b026f291dae1 +CT=b2d40916e309afcd8c5b2de75637731c + +I=184 +KEY=3261b52eab302f16fa53f2729d178a72c036854b95907409 +PT=b2d40916e309afcd8c5b2de75637731c +CT=bc8cf1d3f623bbe42cfaca135c1c528a + +I=185 +KEY=8eed44fd5d1394f2d6a93861c10bd8f884b73625025639af +PT=bc8cf1d3f623bbe42cfaca135c1c528a +CT=c60c0007eae4ebc8b41b1df79d5e6ac1 + +I=186 +KEY=48e144fab7f77f3a62b225965c55b2396653a5b0c62f1ac6 +PT=c60c0007eae4ebc8b41b1df79d5e6ac1 +CT=633f53132964be630ffcefb0b3635cbd + +I=187 +KEY=2bde17e99e93c1596d4eca26ef36ee84b3ddddd632e134b6 +PT=633f53132964be630ffcefb0b3635cbd +CT=31571843036771f31df1cf449595b4dd + +I=188 +KEY=1a890faa9df4b0aa70bf05627aa35a590469c491d409324e +PT=31571843036771f31df1cf449595b4dd +CT=f59654eb5425b0397f2eca93b9ed329c + +I=189 +KEY=ef1f5b41c9d100930f91cff1c34e68c5ee075b32d84f360e +PT=f59654eb5425b0397f2eca93b9ed329c +CT=5c5fb08f820e09196b671f9ea231307a + +I=190 +KEY=b340ebce4bdf098a64f6d06f617f58bf7468541ae893b378 +PT=5c5fb08f820e09196b671f9ea231307a +CT=e3dfb074140141de191aa8f1cffb42dc + +I=191 +KEY=509f5bba5fde48547dec789eae841a63d0a108202cfcf395 +PT=e3dfb074140141de191aa8f1cffb42dc +CT=f4a49a84ce3238b18686e7e362a47d35 + +I=192 +KEY=a43bc13e91ec70e5fb6a9f7dcc2067561f0e340f5e71b138 +PT=f4a49a84ce3238b18686e7e362a47d35 +CT=b5aaaff97508f8166f125313c72732db + +I=193 +KEY=11916ec7e4e488f39478cc6e0b07558d1236b8fa520e8725 +PT=b5aaaff97508f8166f125313c72732db +CT=6f758f052b5d52f591dfc5282b9d357d + +I=194 +KEY=7ee4e1c2cfb9da0605a70946209a60f0af78435994cd7d6b +PT=6f758f052b5d52f591dfc5282b9d357d +CT=01c64b6d38d7e7bfb198f7db39272311 + +I=195 +KEY=7f22aaaff76e3db9b43ffe9d19bd43e158541e012ba90d02 +PT=01c64b6d38d7e7bfb198f7db39272311 +CT=93762d16b55eb7b07205fa3b8d18a252 + +I=196 +KEY=ec5487b942308a09c63a04a694a5e1b35e3cac7e70688817 +PT=93762d16b55eb7b07205fa3b8d18a252 +CT=21e1e83dd40c7b1a7479137916abaf30 + +I=197 +KEY=cdb56f84963cf113b24317df820e4e83ce259d49c4b8e635 +PT=21e1e83dd40c7b1a7479137916abaf30 +CT=cab4c2405c7ec9f4d67a44e326d46a7a + +I=198 +KEY=0701adc4ca4238e76439533ca4da24f9f9bec3de7a58ac18 +PT=cab4c2405c7ec9f4d67a44e326d46a7a +CT=c3ce7be2b989ff3e9268e5aebc923569 + +I=199 +KEY=c4cfd62673cbc7d9f651b69218481190a43ebbd36e10c8f3 +PT=c3ce7be2b989ff3e9268e5aebc923569 +CT=a6cff559398a4f318f9c2f6720bfc94d + +I=200 +KEY=6200237f4a4188e879cd99f538f7d8dd5db80bea4220cb06 +PT=a6cff559398a4f318f9c2f6720bfc94d +CT=6f6884b517fc95c035a079e7d549720e + +I=201 +KEY=0d68a7ca5dbd1d284c6de012edbeaad33fcafd685c02dfbd +PT=6f6884b517fc95c035a079e7d549720e +CT=1c2abaaecd641550aaf6d008db90c62b + +I=202 +KEY=11421d6490d90878e69b301a362e6cf817c866ee4a3ed492 +PT=1c2abaaecd641550aaf6d008db90c62b +CT=7677f142aaf197b529972369d0df06f0 + +I=203 +KEY=6735ec263a289fcdcf0c1373e6f16a083ae809f24cb50def +PT=7677f142aaf197b529972369d0df06f0 +CT=b7b9557e18e75458ad61165fb0ab995a + +I=204 +KEY=d08cb95822cfcb95626d052c565af352409334d2440e2d66 +PT=b7b9557e18e75458ad61165fb0ab995a +CT=d24d008a447fb47d5ffc5f2cd084893d + +I=205 +KEY=02c1b9d266b07fe83d915a0086de7a6f31bd90c28549f8b8 +PT=d24d008a447fb47d5ffc5f2cd084893d +CT=6b5e8328860dd74b4990c3b6fb739dbe + +I=206 +KEY=699f3afae0bda8a3740199b67dade7d11821b9471d83eefe +PT=6b5e8328860dd74b4990c3b6fb739dbe +CT=5adab34604ccab7648f579b292ba95bf + +I=207 +KEY=334589bce47103d53cf4e004ef17726ed3e16cb26e9be2e5 +PT=5adab34604ccab7648f579b292ba95bf +CT=63b54f12a385c13d33e7209a1bb6f84d + +I=208 +KEY=50f0c6ae47f4c2e80f13c09ef4a18a23bc6b242aa917b35a +PT=63b54f12a385c13d33e7209a1bb6f84d +CT=ad7087040f667b015359562477417247 + +I=209 +KEY=fd8041aa4892b9e95c4a96ba83e0f8649b7b878fa93a56cd +PT=ad7087040f667b015359562477417247 +CT=a6bfd5ab511692f84fb59a9e9737811f + +I=210 +KEY=5b3f940119842b1113ff0c2414d7797b2571eb1738ba9c70 +PT=a6bfd5ab511692f84fb59a9e9737811f +CT=b0c0907539291c2f4c6e05a27a58b96a + +I=211 +KEY=ebff047420ad373e5f9109866e8fc0118198f10e317ad2a6 +PT=b0c0907539291c2f4c6e05a27a58b96a +CT=04e048267f3c7b5a406fb28617a6daa5 + +I=212 +KEY=ef1f4c525f914c641ffebb0079291ab48802f41f54916bab +PT=04e048267f3c7b5a406fb28617a6daa5 +CT=16978208dc2c6b3ca6996faa88962139 + +I=213 +KEY=f988ce5a83bd2758b967d4aaf1bf3b8defabff8e43225d56 +PT=16978208dc2c6b3ca6996faa88962139 +CT=32d65841c001cf6a7c2c724bf8074c34 + +I=214 +KEY=cb5e961b43bce832c54ba6e109b877b90c6dd5ae8707892c +PT=32d65841c001cf6a7c2c724bf8074c34 +CT=7bf136df0820f26ce4fe00302cf89932 + +I=215 +KEY=b0afa0c44b9c1a5e21b5a6d12540ee8b23700ea897ad74c0 +PT=7bf136df0820f26ce4fe00302cf89932 +CT=ab36b850bb77f4836fe155488bab2e36 + +I=216 +KEY=1b991894f0ebeedd4e54f399aeebc0bd94df79d46a1ef9a0 +PT=ab36b850bb77f4836fe155488bab2e36 +CT=6faa40b365c9f578949bf335b93d155b + +I=217 +KEY=7433582795221ba5dacf00ac17d6d5e6ccee0372ac6c08ed +PT=6faa40b365c9f578949bf335b93d155b +CT=dd0a96facce9ef461de17f55aa08ef0b + +I=218 +KEY=a939cedd59cbf4e3c72e7ff9bdde3aed77f84c5855aa14d0 +PT=dd0a96facce9ef461de17f55aa08ef0b +CT=ef5c45d8b6b503b1292a2ed67306789a + +I=219 +KEY=46658b05ef7ef752ee04512fced84277086608edeae72b8c +PT=ef5c45d8b6b503b1292a2ed67306789a +CT=519b746221be2cda8dfcdbded7f0d495 + +I=220 +KEY=17feff67cec0db8863f88af1192896e2ea0b1df535ffb2df +PT=519b746221be2cda8dfcdbded7f0d495 +CT=0c9d5990a87913213ccea99fffbf2756 + +I=221 +KEY=1b63a6f766b9c8a95f36236ee697b1b4fb4cf984db23a34a +PT=0c9d5990a87913213ccea99fffbf2756 +CT=1bb0167d952c9fdec6e9fb12770cd5aa + +I=222 +KEY=00d3b08af395577799dfd87c919b641eac6f13f48714a0e5 +PT=1bb0167d952c9fdec6e9fb12770cd5aa +CT=510dbf1dec6e3cb5ba79fc4a2b67a483 + +I=223 +KEY=51de0f971ffb6bc223a62436bafcc09dd8e0840a5e94fd33 +PT=510dbf1dec6e3cb5ba79fc4a2b67a483 +CT=fc99d3276f523eb82efdcac10b8e15b8 + +I=224 +KEY=ad47dcb070a9557a0d5beef7b172d525a39a4eb1c1414ad2 +PT=fc99d3276f523eb82efdcac10b8e15b8 +CT=ccb74c442862a1d01b4179125abe8389 + +I=225 +KEY=61f090f458cbf4aa161a97e5ebcc56ac0cc62d407eff0ff4 +PT=ccb74c442862a1d01b4179125abe8389 +CT=171d03be7b9efa25698b80b8cbf2c925 + +I=226 +KEY=76ed934a23550e8f7f91175d203e9f898c281130aa3765f9 +PT=171d03be7b9efa25698b80b8cbf2c925 +CT=2db894d3b79e8c78befc4d26c791de2a + +I=227 +KEY=5b55079994cb82f7c16d5a7be7af41a350f44ef5828c66ca +PT=2db894d3b79e8c78befc4d26c791de2a +CT=087071a460a286e88dde51d4a52d8eb5 + +I=228 +KEY=5325763df469041f4cb30baf4282cf166dcf61d20636117b +PT=087071a460a286e88dde51d4a52d8eb5 +CT=07ddcc0d4a2510156010880ce2df0a97 + +I=229 +KEY=54f8ba30be4c140a2ca383a3a05dc58188f419e192117b75 +PT=07ddcc0d4a2510156010880ce2df0a97 +CT=9250468961c14a72b52cb96cc170e755 + +I=230 +KEY=c6a8fcb9df8d5e78998f3acf612d22d4a130de02d68498b3 +PT=9250468961c14a72b52cb96cc170e755 +CT=8b2c5d5411e8851c25a0357082b6cdcd + +I=231 +KEY=4d84a1edce65db64bc2f0fbfe39bef19064234d2feddcc3e +PT=8b2c5d5411e8851c25a0357082b6cdcd +CT=26d97c71ac15211d739106f06eda2090 + +I=232 +KEY=6b5ddd9c6270fa79cfbe094f8d41cf89856f953b758f04f1 +PT=26d97c71ac15211d739106f06eda2090 +CT=4c9ddd3ccbb811d942596ce8ba82de80 + +I=233 +KEY=27c000a0a9c8eba08de765a737c31109460021f35703fd9d +PT=4c9ddd3ccbb811d942596ce8ba82de80 +CT=00b167914b7d82cdd9a933aadd31732b + +I=234 +KEY=27716731e2b5696d544e560deaf262227ce56a73766d1142 +PT=00b167914b7d82cdd9a933aadd31732b +CT=0ef95f2ba6c24765c97737b30d789fc5 + +I=235 +KEY=2988381a44772e089d3961bee78afde74b59e1005f57b807 +PT=0ef95f2ba6c24765c97737b30d789fc5 +CT=8d7950207b9bae36990eabb816fdf00b + +I=236 +KEY=a4f1683a3fec803e0437ca06f1770dec91d453ee032226fb +PT=8d7950207b9bae36990eabb816fdf00b +CT=7be3b3e0f61c4d6de7d36763ecc41e82 + +I=237 +KEY=df12dbdac9f0cd53e3e4ad651db3136eeb591d956a921b82 +PT=7be3b3e0f61c4d6de7d36763ecc41e82 +CT=21700c21d04910a5c5c28f596dd6dfdf + +I=238 +KEY=fe62d7fb19b9ddf62626223c7065ccb139267d28f846eb59 +PT=21700c21d04910a5c5c28f596dd6dfdf +CT=de33a1ed1f68960dbce5a9811d39e78b + +I=239 +KEY=2051761606d14bfb9ac38bbd6d5c2b3a04f88bbff2f86621 +PT=de33a1ed1f68960dbce5a9811d39e78b +CT=beed462a78ddda7a7643be6aa073ffdc + +I=240 +KEY=9ebc303c7e0c9181ec8035d7cd2fd4e6dd857898277ae280 +PT=beed462a78ddda7a7643be6aa073ffdc +CT=8df7ec9a7b7a416d3946e40e107f517a + +I=241 +KEY=134bdca60576d0ecd5c6d1d9dd50859c7e676d6d9f78af9c +PT=8df7ec9a7b7a416d3946e40e107f517a +CT=821510bc602c35b4b932769214c29492 + +I=242 +KEY=915ecc1a655ae5586cf4a74bc992110e952042a686f256c3 +PT=821510bc602c35b4b932769214c29492 +CT=60de3af7e6d8ad49c58ac49cdca17654 + +I=243 +KEY=f180f6ed83824811a97e63d71533675a0847deb5b454c3d3 +PT=60de3af7e6d8ad49c58ac49cdca17654 +CT=e71c5ebb9fce57f032160f689ca20673 + +I=244 +KEY=169ca8561c4c1fe19b686cbf89916129bd9891078478168f +PT=e71c5ebb9fce57f032160f689ca20673 +CT=db9179d9e47c984665c7796443da72f9 + +I=245 +KEY=cd0dd18ff83087a7feaf15dbca4b13d08d55b5ec0777753b +PT=db9179d9e47c984665c7796443da72f9 +CT=44fb8aa1f85a7112f785c400bd39b040 + +I=246 +KEY=89f65b2e006af6b5092ad1db7772a390016d27b6d4af89a1 +PT=44fb8aa1f85a7112f785c400bd39b040 +CT=6e8815716997ee852917ee93e92f6276 + +I=247 +KEY=e77e4e5f69fd1830203d3f489e5dc1e6c0a073572a54339d +PT=6e8815716997ee852917ee93e92f6276 +CT=21706759dd23bf5bd9c5fbbc747d731b + +I=248 +KEY=c60e2906b4dea76bf9f8c4f4ea20b2fd61888ffc35d285ef +PT=21706759dd23bf5bd9c5fbbc747d731b +CT=2cf9573018096d27b7f6fa66d669e54b + +I=249 +KEY=eaf77e36acd7ca4c4e0e3e923c4957b60192452037fa7065 +PT=2cf9573018096d27b7f6fa66d669e54b +CT=b24614d1e06e13fc47a401f275003f6f + +I=250 +KEY=58b16ae74cb9d9b009aa3f60494968d9ec2d24a4eb3288fb +PT=b24614d1e06e13fc47a401f275003f6f +CT=23aeceba739752d03bacc1e5a3632334 + +I=251 +KEY=7b1fa45d3f2e8b603206fe85ea2a4bed9dca7eb6e38efd92 +PT=23aeceba739752d03bacc1e5a3632334 +CT=a946c3b4e91332d40a0521a51dfa850f + +I=252 +KEY=d25967e9d63db9b43803df20f7d0cee262614dcbe151f496 +PT=a946c3b4e91332d40a0521a51dfa850f +CT=5ffa97420aabe91df33fcad992526665 + +I=253 +KEY=8da3f0abdc9650a9cb3c15f96582a887818a31afe4741b9c +PT=5ffa97420aabe91df33fcad992526665 +CT=b6b880200205149f3a8c10725731c605 + +I=254 +KEY=3b1b708bde934436f1b0058b32b36e82d2a099fec719e16b +PT=b6b880200205149f3a8c10725731c605 +CT=080dd63e728c8dc82706446182f1a150 + +I=255 +KEY=3316a6b5ac1fc9fed6b641eab042cfd2ba5ffbf164988862 +PT=080dd63e728c8dc82706446182f1a150 +CT=b48baa096ccb5677852e0d0f01135d44 + +I=256 +KEY=879d0cbcc0d49f8953984ce5b1519296b118757af7cb02b7 +PT=b48baa096ccb5677852e0d0f01135d44 +CT=7406b50b442efcdf15c20969f1b902b6 + +I=257 +KEY=f39bb9b784fa6356465a458c40e89020bb6e355e28bb8822 +PT=7406b50b442efcdf15c20969f1b902b6 +CT=a73d95e16004c34bc64966e205d69d83 + +I=258 +KEY=54a62c56e4fea01d8013236e453e0da3392959a2143b5650 +PT=a73d95e16004c34bc64966e205d69d83 +CT=135b53a5dc75fc4c11b84356fe16149c + +I=259 +KEY=47fd7ff3388b5c5191ab6038bb28193fb21b40c6d6c5f575 +PT=135b53a5dc75fc4c11b84356fe16149c +CT=b154a43a5b325c262842c1ad0eb17cba + +I=260 +KEY=f6a9dbc963b90077b9e9a195b5996585ba3bd467aa77f59c +PT=b154a43a5b325c262842c1ad0eb17cba +CT=e7f43bafd05815c93294c8dd8da22a87 + +I=261 +KEY=115de066b3e115be8b7d6948383b4f02e2d7ee7c1ecdb6f0 +PT=e7f43bafd05815c93294c8dd8da22a87 +CT=503114f4306f2fd788c8b50f3fb8faea + +I=262 +KEY=416cf492838e3a6903b5dc470783b5e8008c1eb3db390223 +PT=503114f4306f2fd788c8b50f3fb8faea +CT=a56e7bb855246cfb27ecbfa9a3e6e215 + +I=263 +KEY=e4028f2ad6aa5692245963eea46557fd33208fdde453406f +PT=a56e7bb855246cfb27ecbfa9a3e6e215 +CT=10b90673c3de683684f34503c833e3b6 + +I=264 +KEY=f4bb895915743ea4a0aa26ed6c56b44b0357f4482b7536c1 +PT=10b90673c3de683684f34503c833e3b6 +CT=537886c90b014092a75ccc50d8f4bb0a + +I=265 +KEY=a7c30f901e757e3607f6eabdb4a20f41d06f0e28de7d6666 +PT=537886c90b014092a75ccc50d8f4bb0a +CT=7cc8ce1864a8267885f6ea1a4710c930 + +I=266 +KEY=db0bc1887add584e820000a7f3b2c6713be5b5548718f8c8 +PT=7cc8ce1864a8267885f6ea1a4710c930 +CT=17972621fe5daea0b8822aaa9c093822 + +I=267 +KEY=cc9ce7a98480f6ee3a822a0d6fbbfe5370a6181b5b673344 +PT=17972621fe5daea0b8822aaa9c093822 +CT=7ac6bd89babad8a55672409c0090ca12 + +I=268 +KEY=b65a5a203e3a2e4b6cf06a916f2b3441cac89abb15c4a9c3 +PT=7ac6bd89babad8a55672409c0090ca12 +CT=98687e643cc26bc5513636030e88ba29 + +I=269 +KEY=2e32244402f8458e3dc65c9261a38e682b9b7f5f569aa526 +PT=98687e643cc26bc5513636030e88ba29 +CT=ebd85639b34cebb7ee883a6122cc2faf + +I=270 +KEY=c5ea727db1b4ae39d34e66f3436fa1c7582ecbf1ef5222f9 +PT=ebd85639b34cebb7ee883a6122cc2faf +CT=13c893f59d4d34399eb09ba7707bee61 + +I=271 +KEY=d622e1882cf99a004dfefd5433144fa6d22ac49ac3722ca7 +PT=13c893f59d4d34399eb09ba7707bee61 +CT=7013f0f757803d01a5fbe993c731625c + +I=272 +KEY=a631117f7b79a701e80514c7f4252dfa4175203c872a48fa +PT=7013f0f757803d01a5fbe993c731625c +CT=9a82e5797e7241df9b06857dfa0deec8 + +I=273 +KEY=3cb3f406050be6de730391ba0e28c332afd1457b9af89dcf +PT=9a82e5797e7241df9b06857dfa0deec8 +CT=65c6d1954ec5a0388a894340ca0a5d96 + +I=274 +KEY=597525934bce46e6f98ad2fac4229ea427b18d461ab08e96 +PT=65c6d1954ec5a0388a894340ca0a5d96 +CT=2c02b14865b6790a4356837ad300d64d + +I=275 +KEY=757794db2e783fecbadc5180172248e978a98695c30a8db4 +PT=2c02b14865b6790a4356837ad300d64d +CT=a5ffb67f7f473ebb4638546b24ed61bd + +I=276 +KEY=d08822a4513f0157fce405eb33cf2954a0d278f8f21be158 +PT=a5ffb67f7f473ebb4638546b24ed61bd +CT=184f4f6acaf604f4c0be8b3f81c60e61 + +I=277 +KEY=c8c76dce9bc905a33c5a8ed4b209273531af07ce23c884e2 +PT=184f4f6acaf604f4c0be8b3f81c60e61 +CT=d312bd4a813d76e8552abb27b07111ac + +I=278 +KEY=1bd5d0841af4734b697035f302783699ebb99288eed52f76 +PT=d312bd4a813d76e8552abb27b07111ac +CT=1411db09476b37e6fe4c9bfe3c098ec0 + +I=279 +KEY=0fc40b8d5d9f44ad973cae0d3e71b859dddcdb8c1d31ab05 +PT=1411db09476b37e6fe4c9bfe3c098ec0 +CT=4021241e00ca55020b1a61bcac5b1f07 + +I=280 +KEY=4fe52f935d5511af9c26cfb1922aa75eba7ef3ff8575f837 +PT=4021241e00ca55020b1a61bcac5b1f07 +CT=17ade995e83426aeeb5dd1ed33472cee + +I=281 +KEY=5848c606b5613701777b1e5ca16d8bb00df5e23a0451ac01 +PT=17ade995e83426aeeb5dd1ed33472cee +CT=72964810219be3690ec41678baec4c5e + +I=282 +KEY=2ade8e1694fad46879bf08241b81c7ee0d3fa7e912a08516 +PT=72964810219be3690ec41678baec4c5e +CT=89600918cc2bb680209dacb268d4a68c + +I=283 +KEY=a3be870e58d162e85922a4967355616225eda85be07c394d +PT=89600918cc2bb680209dacb268d4a68c +CT=2aadff88072a169c973139fe98d9ace2 + +I=284 +KEY=891378865ffb7474ce139d68eb8ccd80c15b5b52895445e7 +PT=2aadff88072a169c973139fe98d9ace2 +CT=374ca2a8a173f99816530588eb4f8b1b + +I=285 +KEY=be5fda2efe888decd84098e000c3469b873948d86015d44b +PT=374ca2a8a173f99816530588eb4f8b1b +CT=89458cf02b47ea7ad7660637c363a3fe + +I=286 +KEY=371a56ded5cf67960f269ed7c3a0e565d3e6ffe6b466cde3 +PT=89458cf02b47ea7ad7660637c363a3fe +CT=1922e71764ba0239ba6bcadcb50f0691 + +I=287 +KEY=2e38b1c9b17565afb54d540b76afe3f40a54da79d887eece +PT=1922e71764ba0239ba6bcadcb50f0691 +CT=21823f2773b95971c5fd38235ad1ee4a + +I=288 +KEY=0fba8eeec2cc3cde70b06c282c7e0dbe5c02c12332cf4ef4 +PT=21823f2773b95971c5fd38235ad1ee4a +CT=beaca5073152991761fb04a8f625aa3a + +I=289 +KEY=b1162be9f39ea5c9114b6880da5ba78489ab8de263c2b1f7 +PT=beaca5073152991761fb04a8f625aa3a +CT=e6249c3d62f212829885d1a0c7b104a3 + +I=290 +KEY=5732b7d4916cb74b89ceb9201deaa3275609d0ed2c59910e +PT=e6249c3d62f212829885d1a0c7b104a3 +CT=662b2626d865e2c65b6293433ed5a6b2 + +I=291 +KEY=311991f24909558dd2ac2a63233f05951cf5f9b30afbc09a +PT=662b2626d865e2c65b6293433ed5a6b2 +CT=1526aa05d63553a95d9c1704dbc3ebaf + +I=292 +KEY=243f3bf79f3c06248f303d67f8fcee3ac7f7acf0813ba468 +PT=1526aa05d63553a95d9c1704dbc3ebaf +CT=6bcd61516c533071653ec0d89f9d0417 + +I=293 +KEY=4ff25aa6f36f3655ea0efdbf6761ea2ddf97a38ddf39b94e +PT=6bcd61516c533071653ec0d89f9d0417 +CT=fb8c67c40814b33c791a3710d10d989d + +I=294 +KEY=b47e3d62fb7b85699314caafb66c72b0ae6d6e49c904e237 +PT=fb8c67c40814b33c791a3710d10d989d +CT=e60b7efd14d66da4cbc5d95edaeeb1fd + +I=295 +KEY=5275439fefade8cd58d113f16c82c34d64f281dec99b71be +PT=e60b7efd14d66da4cbc5d95edaeeb1fd +CT=e3a8fdab5bf23e80b62301bf2522a962 + +I=296 +KEY=b1ddbe34b45fd64deef2124e49a06a2f83a7c9ef53f91b51 +PT=e3a8fdab5bf23e80b62301bf2522a962 +CT=b2bc44429a49382a9f87a417aef28367 + +I=297 +KEY=0361fa762e16ee677175b659e752e94865e6448c3b90e28a +PT=b2bc44429a49382a9f87a417aef28367 +CT=04da509113279d7ec5ddb4c655082783 + +I=298 +KEY=07bbaae73d317319b4a8029fb25acecbd397f82a4d33082e +PT=04da509113279d7ec5ddb4c655082783 +CT=75b955abdb9effc7ed098be8aea283f1 + +I=299 +KEY=7202ff4ce6af8cde59a189771cf84d3af0d9bd7250327442 +PT=75b955abdb9effc7ed098be8aea283f1 +CT=fd2078e4b9da1ec1535fc1ab887c9335 + +I=300 +KEY=8f2287a85f75921f0afe48dc9484de0f1dd2078223de53f8 +PT=fd2078e4b9da1ec1535fc1ab887c9335 +CT=3da9fd55aecdcb6cbe4d7011e44c6d01 + +I=301 +KEY=b28b7afdf1b85973b4b338cd70c8b30eb6cded83eecf0bc7 +PT=3da9fd55aecdcb6cbe4d7011e44c6d01 +CT=da1f2713098ea752d04d6d16eb4284ff + +I=302 +KEY=68945deef836fe2164fe55db9b8a37f16e4569920fdba489 +PT=da1f2713098ea752d04d6d16eb4284ff +CT=cd4129d8b2788082c3f5e2cb35d3e0a6 + +I=303 +KEY=a5d574364a4e7ea3a70bb710ae59d757e79d8115a1b43833 +PT=cd4129d8b2788082c3f5e2cb35d3e0a6 +CT=9c468a3869770cf374161c71ef23ec5d + +I=304 +KEY=3993fe0e23397250d31dab61417a3b0a43c40fe6ebc47fa7 +PT=9c468a3869770cf374161c71ef23ec5d +CT=c83e0d24a366b0287529727a18e801da + +I=305 +KEY=f1adf32a805fc278a634d91b59923ad074586aa6db6315e5 +PT=c83e0d24a366b0287529727a18e801da +CT=3bf96153819780fcca826f076f22b00b + +I=306 +KEY=ca54927901c842846cb6b61c36b08adbf86959c09b7d3660 +PT=3bf96153819780fcca826f076f22b00b +CT=d7ddc016284f865f29571ac67758bb1d + +I=307 +KEY=1d89526f2987c4db45e1acda41e831c628ff6f963750f41b +PT=d7ddc016284f865f29571ac67758bb1d +CT=5de54d6bc8f1fe5d0fb5b97354acb3c9 + +I=308 +KEY=406c1f04e1763a864a5415a91544820f386fe1e18ff36763 +PT=5de54d6bc8f1fe5d0fb5b97354acb3c9 +CT=e33b7b9683cf8d95858da48a47866599 + +I=309 +KEY=a357649262b9b713cfd9b12352c2e796b25a0f43eef89516 +PT=e33b7b9683cf8d95858da48a47866599 +CT=be52a4a81242b8ed447946617eb88faf + +I=310 +KEY=1d05c03a70fb0ffe8ba0f7422c7a6839b81aa039056aa7b5 +PT=be52a4a81242b8ed447946617eb88faf +CT=91d84e4d1badbf657821d6cc5af92621 + +I=311 +KEY=8cdd8e776b56b09bf381218e76834e187da9974e70f67883 +PT=91d84e4d1badbf657821d6cc5af92621 +CT=0cd45fce6e00cb8a62b4e92fbca62651 + +I=312 +KEY=8009d1b905567b119135c8a1ca256849bbbeab29a2a72da3 +PT=0cd45fce6e00cb8a62b4e92fbca62651 +CT=c3c16359a191396606c0b035c6c44cfe + +I=313 +KEY=43c8b2e0a4c7427797f578940ce124b70b38ee16789576ee +PT=c3c16359a191396606c0b035c6c44cfe +CT=fcb08f04fba7e92ebeb5e294be7a446c + +I=314 +KEY=bf783de45f60ab5929409a00b29b60db522b5a282ba0af52 +PT=fcb08f04fba7e92ebeb5e294be7a446c +CT=2185c0f7e04611c41b2bf5ca4dab49f8 + +I=315 +KEY=9efdfd13bf26ba9d326b6fcaff30292332db6d0bc245650d +PT=2185c0f7e04611c41b2bf5ca4dab49f8 +CT=412de0c8ea68badf80051db1be0786af + +I=316 +KEY=dfd01ddb554e0042b26e727b4137af8cfd00588fce3e1160 +PT=412de0c8ea68badf80051db1be0786af +CT=1934a9694a82aa1a99225d33365e3fb7 + +I=317 +KEY=c6e4b4b21fccaa582b4c2f487769903b07b9b3b32cb9edc9 +PT=1934a9694a82aa1a99225d33365e3fb7 +CT=d2a80a4fe2248c1bbbea2b1cf8695343 + +I=318 +KEY=144cbefdfde8264390a604548f00c37810fb47942c0402ff +PT=d2a80a4fe2248c1bbbea2b1cf8695343 +CT=11a365080acd63e5cda1fb78235b12a7 + +I=319 +KEY=05efdbf5f72545a65d07ff2cac5bd1df5bdf4b359e03159d +PT=11a365080acd63e5cda1fb78235b12a7 +CT=0401618a394feac446a4d7c5357405de + +I=320 +KEY=01eeba7fce6aaf621ba328e9992fd401f392f254a94cc092 +PT=0401618a394feac446a4d7c5357405de +CT=f70371b1986464cf3dc6a8db0cc979bd + +I=321 +KEY=f6edcbce560ecbad2665803295e6adbc565629d8b80db754 +PT=f70371b1986464cf3dc6a8db0cc979bd +CT=e841805b36bea6d504415ea70f1edad8 + +I=322 +KEY=1eac4b9560b06d782224de959af8776438b8a0ad040c5f51 +PT=e841805b36bea6d504415ea70f1edad8 +CT=7a3158b1fc19dec2f26d1ee95e81f22f + +I=323 +KEY=649d13249ca9b3bad049c07cc479854bc46bb9c4f312da22 +PT=7a3158b1fc19dec2f26d1ee95e81f22f +CT=d9a03e92d7e2a3e672451197fe68e66d + +I=324 +KEY=bd3d2db64b4b105ca20cd1eb3a116326b516a0b29a8bb07c +PT=d9a03e92d7e2a3e672451197fe68e66d +CT=b44737b140c20b781755c41872c39ec6 + +I=325 +KEY=097a1a070b891b24b55915f348d2fde0a307af79e580da82 +PT=b44737b140c20b781755c41872c39ec6 +CT=0cd7042434ceaa91dfad3c61cbc737b6 + +I=326 +KEY=05ad1e233f47b1b56af429928315ca56068ffe4404299686 +PT=0cd7042434ceaa91dfad3c61cbc737b6 +CT=772d0999713cd5c7c85096c8afe60591 + +I=327 +KEY=728017ba4e7b6472a2a4bf5a2cf3cfc7291e1176306b343e +PT=772d0999713cd5c7c85096c8afe60591 +CT=8011696b913f7d11f81916e1eb2a1b08 + +I=328 +KEY=f2917ed1df4419635abda9bbc7d9d4cfff894d4184c88f5e +PT=8011696b913f7d11f81916e1eb2a1b08 +CT=47751d401feaed870ff0f409a1e4133f + +I=329 +KEY=b5e46391c0aef4e4554d5db2663dc7f03603bb44f560bef3 +PT=47751d401feaed870ff0f409a1e4133f +CT=752ab268c5cc040adf05ffe3e80a19cc + +I=330 +KEY=c0ced1f90562f0ee8a48a2518e37de3c3bde337345b422aa +PT=752ab268c5cc040adf05ffe3e80a19cc +CT=237de9280a4a38d90d48f87283cd6c8c + +I=331 +KEY=e3b338d10f28c83787005a230dfab2b0c6fc21f86e7242d6 +PT=237de9280a4a38d90d48f87283cd6c8c +CT=4d1015b6a406aa1a5b49cbcf6b6eb054 + +I=332 +KEY=aea32d67ab2e622ddc4991ec669402e4af2c7035421dbd5d +PT=4d1015b6a406aa1a5b49cbcf6b6eb054 +CT=37a58ce4a460fc533ca2aa6a94087435 + +I=333 +KEY=9906a1830f4e9e7ee0eb3b86f29c76d1d4fe1a08e4959399 +PT=37a58ce4a460fc533ca2aa6a94087435 +CT=579ed056569ee8a645b4d3b7436493a5 + +I=334 +KEY=ce9871d559d076d8a55fe831b1f8e5740e242134203d13a3 +PT=579ed056569ee8a645b4d3b7436493a5 +CT=e3e21bc5c720a98409610076f2834e6c + +I=335 +KEY=2d7a6a109ef0df5cac3ee847437bab18a92e02b57972a3ce +PT=e3e21bc5c720a98409610076f2834e6c +CT=dbb6145158a35958a5f0699bac83098e + +I=336 +KEY=f6cc7e41c653860409ce81dceff8a296ed4b7801adc5fd5d +PT=dbb6145158a35958a5f0699bac83098e +CT=e7fa8851f06ee660d001b615fdce8576 + +I=337 +KEY=1136f610363d6064d9cf37c9123627e01991c4c1162af4d0 +PT=e7fa8851f06ee660d001b615fdce8576 +CT=c4660150238e0bc7b5e0670062e8c08b + +I=338 +KEY=d550f74015b36ba36c2f50c970dee76ba2d8f269521d0bd5 +PT=c4660150238e0bc7b5e0670062e8c08b +CT=08e1f6e7a919e603fd4793647ce7a237 + +I=339 +KEY=ddb101a7bcaa8da09168c3ad0c39455c19fbf67f2f6f364b +PT=08e1f6e7a919e603fd4793647ce7a237 +CT=982b3af59998f48741d28ae0a63bf33b + +I=340 +KEY=459a3b5225327927d0ba494daa02b6677aaea3abaee33c10 +PT=982b3af59998f48741d28ae0a63bf33b +CT=adc9163437b5a73a8c83a5802057a589 + +I=341 +KEY=e8532d661287de1d5c39eccd8a5513ee6ea1a219b2adf74e +PT=adc9163437b5a73a8c83a5802057a589 +CT=2246ded6d244a32da711433066964ed2 + +I=342 +KEY=ca15f3b0c0c37d30fb28affdecc35d3cedbb8d47649a9cdf +PT=2246ded6d244a32da711433066964ed2 +CT=cc60e691da29db5276d95dac02535abc + +I=343 +KEY=067515211aeaa6628df1f251ee9007808d9baa33fdc34830 +PT=cc60e691da29db5276d95dac02535abc +CT=f7fde1cc5e2a4f343d58750fd77fa37c + +I=344 +KEY=f188f4ed44c0e956b0a9875e39efa4fcae7ce79f0ac4c83d +PT=f7fde1cc5e2a4f343d58750fd77fa37c +CT=cd06eaf54bdb1e5bfbe43417d8633a48 + +I=345 +KEY=3c8e1e180f1bf70d4b4db349e18c9eb4c61c676fd6489fb0 +PT=cd06eaf54bdb1e5bfbe43417d8633a48 +CT=1f886a92d35f9c29218691ac3af6649a + +I=346 +KEY=2306748adc446b246acb22e5db7afa2ea0765bd3e31304f1 +PT=1f886a92d35f9c29218691ac3af6649a +CT=f84048d0307c69cb1f1c661ddbf720c9 + +I=347 +KEY=db463c5aec3802ef75d744f8008ddae70fbc0c06c4a84adf +PT=f84048d0307c69cb1f1c661ddbf720c9 +CT=8094e1149e86d5e92ea8890998e5437e + +I=348 +KEY=5bd2dd4e72bed7065b7fcdf198689999de08e842f4a2f803 +PT=8094e1149e86d5e92ea8890998e5437e +CT=d8525cf55d9ce4c4ee852ed05ada315d + +I=349 +KEY=838081bb2f2233c2b5fae321c2b2a8c48279ea2b5a7717ac +PT=d8525cf55d9ce4c4ee852ed05ada315d +CT=0c03a556a84a7e1c57b188933b035fab + +I=350 +KEY=8f8324ed87684ddee24b6bb2f9b1f76fd4c761955e1da7ff +PT=0c03a556a84a7e1c57b188933b035fab +CT=14626491a3f4243bdcbc1d6731539ec0 + +I=351 +KEY=9be1407c249c69e53ef776d5c8e269af4f58a376f7563f64 +PT=14626491a3f4243bdcbc1d6731539ec0 +CT=462a5df3c9b00fcb7d1ba773aa634fa0 + +I=352 +KEY=ddcb1d8fed2c662e43ecd1a66281260f89df1ba537b77f71 +PT=462a5df3c9b00fcb7d1ba773aa634fa0 +CT=c7e475f30c7c4ed482635bf887b0e4bd + +I=353 +KEY=1a2f687ce15028fac18f8a5ee531c2b246362864792e9b79 +PT=c7e475f30c7c4ed482635bf887b0e4bd +CT=7f1a45415c14d4cfe3d5f72a53ed8fe0 + +I=354 +KEY=65352d3dbd44fc35225a7d74b6dc4d520a4ab7d7e0022baa +PT=7f1a45415c14d4cfe3d5f72a53ed8fe0 +CT=7f519ecdc545a7da41432dd828ad4712 + +I=355 +KEY=1a64b3f078015bef631950ac9e710a4063261742cbf4019b +PT=7f519ecdc545a7da41432dd828ad4712 +CT=77b57823a6d0172fd907c1b59dcda7d6 + +I=356 +KEY=6dd1cbd3ded14cc0ba1e911903bcad96f2c4a49a7bec1107 +PT=77b57823a6d0172fd907c1b59dcda7d6 +CT=256d9a17db775175133e067a5959b8c6 + +I=357 +KEY=48bc51c405a61db5a92097635ae51550389f923887b8b608 +PT=256d9a17db775175133e067a5959b8c6 +CT=eb2498ad3e833a3759ba07027f87ecbd + +I=358 +KEY=a398c9693b252782f09a90612562f9edf5aa2aab2a7f4fa0 +PT=eb2498ad3e833a3759ba07027f87ecbd +CT=0e95de975a800dacfd41911740111d07 + +I=359 +KEY=ad0d17fe61a52a2e0ddb01766573e4ea1f91414e86da5820 +PT=0e95de975a800dacfd41911740111d07 +CT=3a86b6a5168faa2b516fb18de1efc476 + +I=360 +KEY=978ba15b772a80055cb4b0fb849c209cf60ecbe54019be5b +PT=3a86b6a5168faa2b516fb18de1efc476 +CT=49ce25e060cb2076ebb183bf5c7ae029 + +I=361 +KEY=de4584bb17e1a073b7053344d8e6c0b5022a0f9d4caf78a3 +PT=49ce25e060cb2076ebb183bf5c7ae029 +CT=e5df7511808dd10327304a83380349e0 + +I=362 +KEY=3b9af1aa976c7170903579c7e0e5895597ff90310c856cd7 +PT=e5df7511808dd10327304a83380349e0 +CT=41d2fa5f79363fbac1e5c322c7093893 + +I=363 +KEY=7a480bf5ee5a4eca51d0bae527ecb1c6163ec44ed4ded771 +PT=41d2fa5f79363fbac1e5c322c7093893 +CT=d6f325ab115777196581735d5864b598 + +I=364 +KEY=acbb2e5eff0d39d33451c9b87f88045e48d7a4e35cecdbe4 +PT=d6f325ab115777196581735d5864b598 +CT=049240559ce87f13870ea8de2b567b8f + +I=365 +KEY=a8296e0b63e546c0b35f616654de7fd17102f2683e33de60 +PT=049240559ce87f13870ea8de2b567b8f +CT=777801517fa7e25829235555e803c63d + +I=366 +KEY=df516f5a1c42a4989a7c3433bcddb9ec8e8fb8d01880bf58 +PT=777801517fa7e25829235555e803c63d +CT=bf93b326b0f0b6db6fb0208b814d8743 + +I=367 +KEY=60c2dc7cacb21243f5cc14b83d903eaf8c2fc5df853888e6 +PT=bf93b326b0f0b6db6fb0208b814d8743 +CT=bcc3df16b19c9cf20dfb98b65be69044 + +I=368 +KEY=dc01036a1d2e8eb1f8378c0e6676aeeb2dd2ae8d5748021b +PT=bcc3df16b19c9cf20dfb98b65be69044 +CT=075d4a07dc5c97477372b955ccb175d3 + +I=369 +KEY=db5c496dc17219f68b45355baac7db38f07ba9d64d18a701 +PT=075d4a07dc5c97477372b955ccb175d3 +CT=e58af13396f107529b9ffb923b46de80 + +I=370 +KEY=3ed6b85e57831ea410dacec9918105b8e85bf5017bb74cc9 +PT=e58af13396f107529b9ffb923b46de80 +CT=5495642d5084e8166d822bae43ccf4c9 + +I=371 +KEY=6a43dc730707f6b27d58e567d24df171ad301ee47b78bb0e +PT=5495642d5084e8166d822bae43ccf4c9 +CT=aa6505eba58e0fc4fb067a247a63cbf7 + +I=372 +KEY=c026d998a289f976865e9f43a82e3a86e418b76614d435ce +PT=aa6505eba58e0fc4fb067a247a63cbf7 +CT=b0fbea7a9740f4ed8fbdf315f40d38e3 + +I=373 +KEY=70dd33e235c90d9b09e36c565c230265e1efb3201e636b3e +PT=b0fbea7a9740f4ed8fbdf315f40d38e3 +CT=e04393b3b9e7eff5f8f377f95f6dc80b + +I=374 +KEY=909ea0518c2ee26ef1101baf034eca6eb1c74aec5c4c2aed +PT=e04393b3b9e7eff5f8f377f95f6dc80b +CT=13b5fcdb7d16b4a1965fa14be10ee9eb + +I=375 +KEY=832b5c8af13856cf674fbae4e2402385d0350883da3149e8 +PT=13b5fcdb7d16b4a1965fa14be10ee9eb +CT=d2dd8eef977d1515d809ec1c419c69e1 + +I=376 +KEY=51f6d265664543dabf4656f8a3dc4a6420a3cec95d3d8155 +PT=d2dd8eef977d1515d809ec1c419c69e1 +CT=9407c40bc233ae5df16d76d9cd80e050 + +I=377 +KEY=c5f1166ea476ed874e2b20216e5caa345770ff73b25816eb +PT=9407c40bc233ae5df16d76d9cd80e050 +CT=65d5e1dbfcae689f791c6b1253698d82 + +I=378 +KEY=a024f7b558d8851837374b333d3527b6d1f5bc52c6422799 +PT=65d5e1dbfcae689f791c6b1253698d82 +CT=f2d4f4cf2358ed7181e6c745b41e548f + +I=379 +KEY=52f0037a7b806869b6d18c76892b73393a3706ee39b24d7e +PT=f2d4f4cf2358ed7181e6c745b41e548f +CT=10318a48e2408ddca103ff6b558b550b + +I=380 +KEY=42c1893299c0e5b517d2731ddca02632aae98a01e4b0be5d +PT=10318a48e2408ddca103ff6b558b550b +CT=5b554ce660149b20b17aed5701f1ce4a + +I=381 +KEY=1994c5d4f9d47e95a6a89e4add51e878aa4d73983ceeeaea +PT=5b554ce660149b20b17aed5701f1ce4a +CT=8249fffaca1cc50c58881b60ddd98bbc + +I=382 +KEY=9bdd3a2e33c8bb99fe20852a008863c44550271563865db0 +PT=8249fffaca1cc50c58881b60ddd98bbc +CT=11d005637b20296e747004987fb396e8 + +I=383 +KEY=8a0d3f4d48e892f78a5081b27f3bf52c6cfbd2944df270be +PT=11d005637b20296e747004987fb396e8 +CT=271660bb6b356c81574ee593e116146e + +I=384 +KEY=ad1b5ff623ddfe76dd1e64219e2de142eb307364c167877a +PT=271660bb6b356c81574ee593e116146e +CT=306d895189b78992ab7ce7726fec383b + +I=385 +KEY=9d76d6a7aa6a77e476628353f1c1d9798c77dc4032059b3b +PT=306d895189b78992ab7ce7726fec383b +CT=d1b4ef0ecd30b97171dcf2e95c75fffc + +I=386 +KEY=4cc239a9675ace9507be71baadb4268589855799b16bd266 +PT=d1b4ef0ecd30b97171dcf2e95c75fffc +CT=d527094dce476b3963384072e1d78ff5 + +I=387 +KEY=99e530e4a91da5ac648631c84c63a970def568a915c58c62 +PT=d527094dce476b3963384072e1d78ff5 +CT=f96f4f139f537b953c21166108023993 + +I=388 +KEY=608a7ff7364ede3958a727a9446190e38815f9858017d388 +PT=f96f4f139f537b953c21166108023993 +CT=81f1c39692d82b0caeb1124f2855d4a8 + +I=389 +KEY=e17bbc61a496f535f61635e66c34444b1907a9c49cc0a9ea +PT=81f1c39692d82b0caeb1124f2855d4a8 +CT=94bd8014af1109c77e0f27d63b21a513 + +I=390 +KEY=75c63c750b87fcf2881912305715e15804e6cbad2acad92e +PT=94bd8014af1109c77e0f27d63b21a513 +CT=c9aec14d4255c627c3bf5650157f0221 + +I=391 +KEY=bc68fd3849d23ad54ba64460426ae37950af5610394cd6dd +PT=c9aec14d4255c627c3bf5650157f0221 +CT=e2968db9a57eaa4db61821b3e15223a1 + +I=392 +KEY=5efe7081ecac9098fdbe65d3a338c0d84f60a5dc192813d1 +PT=e2968db9a57eaa4db61821b3e15223a1 +CT=ab0bc3e5b1d877b382332ff6b82ec5ee + +I=393 +KEY=f5f5b3645d74e72b7f8d4a251b160536aa081d8a85a06deb +PT=ab0bc3e5b1d877b382332ff6b82ec5ee +CT=f538d73e4d3b6a12597a1dedae05f101 + +I=394 +KEY=00cd645a104f8d3926f757c8b513f4370c0bf06a33d2427b +PT=f538d73e4d3b6a12597a1dedae05f101 +CT=f4562cc9a09b4f984e2fa8bac32469c8 + +I=395 +KEY=f49b4893b0d4c2a168d8ff7276379dffd5c39418bf4f8ed9 +PT=f4562cc9a09b4f984e2fa8bac32469c8 +CT=447b89f843213d977cea8830bdabb275 + +I=396 +KEY=b0e0c16bf3f5ff3614327742cb9c2f8acd44f153ba15dd25 +PT=447b89f843213d977cea8830bdabb275 +CT=db9f729492a66963d98ffcf056323169 + +I=397 +KEY=6b7fb3ff61539655cdbd8bb29dae1ee311cc026f7bb7b89b +PT=db9f729492a66963d98ffcf056323169 +CT=ab6ea3c4f8bfda8cf9ca7a32da700982 + +I=398 +KEY=c011103b99ec4cd93477f18047de1761aebc739e4b6d03d7 +PT=ab6ea3c4f8bfda8cf9ca7a32da700982 +CT=4f3ed223d8bd6d8eadd40ad0e4ccc2db + +I=399 +KEY=8f2fc2184151215799a3fb50a312d5ba7ed77fd93001cb21 +PT=4f3ed223d8bd6d8eadd40ad0e4ccc2db +CT=c1450acdf315be20ba808590083a9133 + + +KEYSIZE=256 + +I=0 +KEY=0000000000000000000000000000000000000000000000000000000000000000 +PT=00000000000000000000000000000000 +CT=92efa3ca9477794d31f4df7bce23e60a +test + +I=1 +KEY=92efa3ca9477794d31f4df7bce23e60a6038d2d2710373f04fd30aaecea8aa43 +PT=92efa3ca9477794d31f4df7bce23e60a +CT=41133a29b97e3b4231549e8c2d0af27e + +I=2 +KEY=d3fc99e32d09420f00a041f7e32914747731be4d4e5b5da518c2abe0a1239fa8 +PT=41133a29b97e3b4231549e8c2d0af27e +CT=6ee8edc74dcfefd0c7beaee4cbcbc9c2 + +I=3 +KEY=bd14742460c6addfc71eef1328e2ddb6ba5b8798bb66c3c4d380acb055cac569 +PT=6ee8edc74dcfefd0c7beaee4cbcbc9c2 +CT=59dd509f8b303ce5527d20d33bd16697 + +I=4 +KEY=e4c924bbebf6913a9563cfc01333bb21111e9ef31799d3c078823aaaef34737c +PT=59dd509f8b303ce5527d20d33bd16697 +CT=e7c035318d676702fb9be6802459951a + +I=5 +KEY=0309118a6691f6386ef82940376a2e3b2d3ee89dc91ca6f749d10d3238238153 +PT=e7c035318d676702fb9be6802459951a +CT=5a1074dc10f4fe274aab8518c8bb15e4 + +I=6 +KEY=591965567665081f2453ac58ffd13bdfc76410ad51f56409cf1a649482baf893 +PT=5a1074dc10f4fe274aab8518c8bb15e4 +CT=4c7e1a8243f19bd97cb9e882145a105e + +I=7 +KEY=15677fd4359493c658ea44daeb8b2b81b3df3941bfe44d38bc88b5274f750935 +PT=4c7e1a8243f19bd97cb9e882145a105e +CT=4bb65c15e5244df0a02b94aa1f4aaa8b + +I=8 +KEY=5ed123c1d0b0de36f8c1d070f4c1810af734159d8ea121a5a30a218ddd80967e +PT=4bb65c15e5244df0a02b94aa1f4aaa8b +CT=a36403c836e42a4b74d0fc09473f20e4 + +I=9 +KEY=fdb52009e654f47d8c112c79b3fea1eeef87f34e469a81d732d7d11e959504d7 +PT=a36403c836e42a4b74d0fc09473f20e4 +CT=6dfc624ed0ffca738e8e7fe5f1d61d45 + +I=10 +KEY=9049424736ab3e0e029f539c4228bcab7afe62a46f4116774c6e0f2d88a00771 +PT=6dfc624ed0ffca738e8e7fe5f1d61d45 +CT=f169deeaaab1bfc6f9a2ca3e583b5d4f + +I=11 +KEY=61209cad9c1a81c8fb3d99a21a13e1e4cc1cac4f2a37de18c5c937ee9b6bc713 +PT=f169deeaaab1bfc6f9a2ca3e583b5d4f +CT=815d0e3a77ef5337a59270673c09d40d + +I=12 +KEY=e07d9297ebf5d2ff5eafe9c5261a35e99ca0baa363f27655df1db5a2919671bb +PT=815d0e3a77ef5337a59270673c09d40d +CT=2874cf07ba108771b91505dcf4949762 + +I=13 +KEY=c8095d9051e5558ee7baec19d28ea28bfb0e254718abe256525a97f4cbe30ad9 +PT=2874cf07ba108771b91505dcf4949762 +CT=fea4d56c2ac1c79b53da45aa917f9607 + +I=14 +KEY=36ad88fc7b249215b460a9b343f1348cf69bb7c3b28e8c3a9cb6e438a45d040b +PT=fea4d56c2ac1c79b53da45aa917f9607 +CT=fbe4b4f196ad7b3740b4c1f9fadb52c1 + +I=15 +KEY=cd493c0ded89e922f4d4684ab92a664d854de978325f2aa90c7313571e032ac9 +PT=fbe4b4f196ad7b3740b4c1f9fadb52c1 +CT=6a4943fff86ea592a2fd03c9350c60d5 + +I=16 +KEY=a7007ff215e74cb056296b838c2606984640c551e686d0ce0243948698d36de4 +PT=6a4943fff86ea592a2fd03c9350c60d5 +CT=fc5a85e0908daac2e32992bcddf49dba + +I=17 +KEY=5b5afa12856ae672b500f93f51d29b220fb9da66baf4d12250f670b06f5853d5 +PT=fc5a85e0908daac2e32992bcddf49dba +CT=e5267119a2f68cd5526ae2013ab7ae6f + +I=18 +KEY=be7c8b0b279c6aa7e76a1b3e6b65354d5f2da29dccb02680addd8508eaac8845 +PT=e5267119a2f68cd5526ae2013ab7ae6f +CT=662f1b120cf6e9839ddc63e5b07c95c3 + +I=19 +KEY=d85390192b6a83247ab678dbdb19a08e77d9fe68d31742783cc32fab5b095c6f +PT=662f1b120cf6e9839ddc63e5b07c95c3 +CT=ab036bfb34c30e16b860cd90c59dc805 + +I=20 +KEY=7350fbe21fa98d32c2d6b54b1e84688b87efbe98b57056b8d3b8ee85a8afa8ef +PT=ab036bfb34c30e16b860cd90c59dc805 +CT=9fd9869697d57a14c751342f34bce755 + +I=21 +KEY=ec897d74887cf726058781642a388fdead1061845f43bbc5b561c354d18d5eef +PT=9fd9869697d57a14c751342f34bce755 +CT=cdddb3eb356b5521ad9f3c644f95a9fa + +I=22 +KEY=2154ce9fbd17a207a818bd0065ad262477418f647934ddc8fd50364270600776 +PT=cdddb3eb356b5521ad9f3c644f95a9fa +CT=5582e14a70e3de215ba66a39bcacbb4d + +I=23 +KEY=74d62fd5cdf47c26f3bed739d9019d69d81b437a9fd2c5ed3aae5ee880e0a9ca +PT=5582e14a70e3de215ba66a39bcacbb4d +CT=5cbd85bc573f7af09d62149f8eb56c0f + +I=24 +KEY=286baa699acb06d66edcc3a657b4f1660cabeb3c6bc748bbe4abb025b255a6a3 +PT=5cbd85bc573f7af09d62149f8eb56c0f +CT=5720da64bbe37cabb5d89459ef4412c9 + +I=25 +KEY=7f4b700d21287a7ddb0457ffb8f0e3afe139d1f91c5573cd9b76ab6d1b331462 +PT=5720da64bbe37cabb5d89459ef4412c9 +CT=e11ad77c90c9aee0c9bc3288a8bcce69 + +I=26 +KEY=9e51a771b1e1d49d12b86577104c2dc63d452bf5f517fd11e815f1833f085398 +PT=e11ad77c90c9aee0c9bc3288a8bcce69 +CT=18cd6b0c63acb759857d108cc3fb00a0 + +I=27 +KEY=869ccc7dd24d63c497c575fbd3b72d66e49536f7a3a2c5bc6c3f4af3e6e4dfa8 +PT=18cd6b0c63acb759857d108cc3fb00a0 +CT=d486d72b29e89e2c638e0d7918ac34ca + +I=28 +KEY=521a1b56fba5fde8f44b7882cb1b19acd0ae41f2594d03a737bb0b3ad1ab8171 +PT=d486d72b29e89e2c638e0d7918ac34ca +CT=520701a5d321e456bc74fe73e93b6f56 + +I=29 +KEY=001d1af3288419be483f86f1222076fa194046841a350535049ca81c09bf58e4 +PT=520701a5d321e456bc74fe73e93b6f56 +CT=bcb9c6c618f4eba777a3a40e11c4bfe1 + +I=30 +KEY=bca4dc353070f2193f9c22ff33e4c91b8472ea7287312b8bc9d9adb17d73cd82 +PT=bcb9c6c618f4eba777a3a40e11c4bfe1 +CT=46df63991a0dfc959c2ae42ffaa27fad + +I=31 +KEY=fa7bbfac2a7d0e8ca3b6c6d0c946b6b67b1ae648c43b40a3b4ea8717bfcbb512 +PT=46df63991a0dfc959c2ae42ffaa27fad +CT=fc24bbcce65c4fd68b56c9116511d65e + +I=32 +KEY=065f0460cc21415a28e00fc1ac5760e8d2aea1f969048baa6c8ce3e762073fb5 +PT=fc24bbcce65c4fd68b56c9116511d65e +CT=44a801f5b003a026d1b1f7b44f6c88fa + +I=33 +KEY=42f705957c22e17cf951f875e33be8125f00c4b740983a51464b7321127d8702 +PT=44a801f5b003a026d1b1f7b44f6c88fa +CT=8614518a60ad5f667fa864222f335d27 + +I=34 +KEY=c4e3541f1c8fbe1a86f99c57cc08b535c6694ce4ebb6804894aa86a7e2ab5c16 +PT=8614518a60ad5f667fa864222f335d27 +CT=e1c01896f45867751855e226c6d1a464 + +I=35 +KEY=25234c89e8d7d96f9eac7e710ad91151d1b9ff547acec63023d585ae3e3ae128 +PT=e1c01896f45867751855e226c6d1a464 +CT=d1eb0d7ac6a17c4ff17f5c6b876eb012 + +I=36 +KEY=f4c841f32e76a5206fd3221a8db7a14363e9ce5150563a4ad8dc674fb5799652 +PT=d1eb0d7ac6a17c4ff17f5c6b876eb012 +CT=bd2c852731d1d59311fa29045862b6a4 + +I=37 +KEY=49e4c4d41fa770b37e290b1ed5d517e73debf12254aa0e5d8af0f6e4f3afc023 +PT=bd2c852731d1d59311fa29045862b6a4 +CT=d4a83eb160da23adc0601ff35ecca326 + +I=38 +KEY=9d4cfa657f7d531ebe4914ed8b19b4c124ec037ecdbdbbc4221217772bf64613 +PT=d4a83eb160da23adc0601ff35ecca326 +CT=27ac189c5f76948036c236783a8030ce + +I=39 +KEY=bae0e2f9200bc79e888b2295b199840f85fc651c726ff218c059cd318a95ad54 +PT=27ac189c5f76948036c236783a8030ce +CT=ec8cfdfa2ff0db1ee7e87dd84ba08803 + +I=40 +KEY=566c1f030ffb1c806f635f4dfa390c0c87239bfa76a1a4c563357f50445d423a +PT=ec8cfdfa2ff0db1ee7e87dd84ba08803 +CT=8c7b8e6764278ed996a873b38620bd16 + +I=41 +KEY=da1791646bdc9259f9cb2cfe7c19b11a6b8a922bd723108bad10cf9508b92e40 +PT=8c7b8e6764278ed996a873b38620bd16 +CT=ec146b292b44732228514735a8b481a7 + +I=42 +KEY=3603fa4d4098e17bd19a6bcbd4ad30bd19bb4999d7d4d13df31b9e017b56bb90 +PT=ec146b292b44732228514735a8b481a7 +CT=4179a2c907c25aaa2a084a194d1cc0ad + +I=43 +KEY=777a5884475abbd1fb9221d299b1f01023ae593c56aa8cda6625df3b5c7139dc +PT=4179a2c907c25aaa2a084a194d1cc0ad +CT=f4ae27028f8ccb55593ec7811ed29d53 + +I=44 +KEY=83d47f86c8d67084a2ace65387636d43395dedabccced117e0d272f238118342 +PT=f4ae27028f8ccb55593ec7811ed29d53 +CT=f1d37aeed0a230d9b48b872220907d25 + +I=45 +KEY=720705681874405d16276171a7f31066136d0180049f67b38c38a7242ca4dabf +PT=f1d37aeed0a230d9b48b872220907d25 +CT=658bbe14eb6776ca80e3b6a44f6fc319 + +I=46 +KEY=178cbb7cf313369796c4d7d5e89cd37f710954db477cf53114131f1469323472 +PT=658bbe14eb6776ca80e3b6a44f6fc319 +CT=ffea34c183609a622200942b5f5ea44d + +I=47 +KEY=e8668fbd7073acf5b4c443feb7c2773252774a4eca70caef56195574b126d60e +PT=ffea34c183609a622200942b5f5ea44d +CT=d36623dbaae8142d8d6b695cd94162c6 + +I=48 +KEY=3b00ac66da9bb8d839af2aa26e8315f41c3e9318614320e69e328e6fb41cd8a4 +PT=d36623dbaae8142d8d6b695cd94162c6 +CT=28861c82c1454130224a3b99ae3b12c2 + +I=49 +KEY=1386b0e41bdef9e81be5113bc0b80736b10a0468627fadf9661582114e00c6ef +PT=28861c82c1454130224a3b99ae3b12c2 +CT=7198db98b00fa090fcdd6deee193177c + +I=50 +KEY=621e6b7cabd15978e7387cd5212b104a93004a543383ba90fde55bde17e42c57 +PT=7198db98b00fa090fcdd6deee193177c +CT=3ee41f4b2e79b3b84c917c96dca4a3b5 + +I=51 +KEY=5cfa743785a8eac0aba90043fd8fb3ff4bccb4173d9f87a8a0e46d26d597e9c9 +PT=3ee41f4b2e79b3b84c917c96dca4a3b5 +CT=73a0c6bd9c266db25444cbcad1b12bf2 + +I=52 +KEY=2f5ab28a198e8772ffedcb892c3e980d2ca9432c886a6acb3238d2a1babe7fdd +PT=73a0c6bd9c266db25444cbcad1b12bf2 +CT=e2f033def6691528f14f0b07ef5a706c + +I=53 +KEY=cdaa8154efe7925a0ea2c08ec364e8615a878847d9f12576edb3cc8f99986b4a +PT=e2f033def6691528f14f0b07ef5a706c +CT=75812d9f11fbc711ba9a33506e2babd3 + +I=54 +KEY=b82baccbfe1c554bb438f3dead4f43b2e19c9f89103cd932a318b42c8e217a71 +PT=75812d9f11fbc711ba9a33506e2babd3 +CT=83c201cc3639bcac531778027b941994 + +I=55 +KEY=3be9ad07c825e9e7e72f8bdcd6db5a262e5ddb8e093991db4c91a0d0630e9644 +PT=83c201cc3639bcac531778027b941994 +CT=0ef6f3395bace938dd227d354c3a006d + +I=56 +KEY=351f5e3e938900df3a0df6e99ae15a4bdb018d541edb4762fe6cf3f0c5f3f529 +PT=0ef6f3395bace938dd227d354c3a006d +CT=f91c0685c34f32e50f37b7d124afbca0 + +I=57 +KEY=cc0358bb50c6323a353a4138be4ee6eb27ce31ad039c28fb3b42d0a8ddf48803 +PT=f91c0685c34f32e50f37b7d124afbca0 +CT=0f472d28863c373c1060ae027720df9a + +I=58 +KEY=c3447593d6fa0506255aef3ac96e3971569ee072bf35230230ec3f37f64e7f44 +PT=0f472d28863c373c1060ae027720df9a +CT=551fca2f3b04297585e9d0a87c1e37e6 + +I=59 +KEY=965bbfbcedfe2c73a0b33f92b5700e97eb085aa1bab6ad89dbe4ad2f76650fcb +PT=551fca2f3b04297585e9d0a87c1e37e6 +CT=78d8dc4d5e1ef49a3b2b96c4f17b1481 + +I=60 +KEY=ee8363f1b3e0d8e99b98a956440b1a160e3bc66e129bb34c3f3e0070a2902d18 +PT=78d8dc4d5e1ef49a3b2b96c4f17b1481 +CT=617282d4f4d1e9d4fff50890a7bf9478 + +I=61 +KEY=8ff1e1254731313d646da1c6e3b48e6ec1afe43d0d46c3881445574b641d4aed +PT=617282d4f4d1e9d4fff50890a7bf9478 +CT=20ff429a414cda5fb20dd3cd3de96747 + +I=62 +KEY=af0ea3bf067deb62d660720bde5de929737f15d87939d521e89cf080edbf49dd +PT=20ff429a414cda5fb20dd3cd3de96747 +CT=cda11f42b83eb30db4e7705dcb5810b0 + +I=63 +KEY=62afbcfdbe43586f628702561505f999116fa4fc270acc0e3e729622d9645c27 +PT=cda11f42b83eb30db4e7705dcb5810b0 +CT=c8238b0506044496845a485198f32800 + +I=64 +KEY=aa8c37f8b8471cf9e6dd4a078df6d199cadada637f5fd0460a202c0f5ea8848c +PT=c8238b0506044496845a485198f32800 +CT=7ad4fe9e53b430046e5827ac06a240b1 + +I=65 +KEY=d058c966ebf32cfd88856dab8b549128a68e3e3e338c5000d83db88f26e575a3 +PT=7ad4fe9e53b430046e5827ac06a240b1 +CT=2314986d8483910ccd19b7a261142315 + +I=66 +KEY=f34c510b6f70bdf1459cda09ea40b23d717ac553ee8071c18c94ba43dcfda83c +PT=2314986d8483910ccd19b7a261142315 +CT=8a8e83be9bcd532dc6afe6d2a5cafce0 + +I=67 +KEY=79c2d2b5f4bdeedc83333cdb4f8a4eddae4ad17ce07bfae38ad1b899cb0a68e3 +PT=8a8e83be9bcd532dc6afe6d2a5cafce0 +CT=58f884db2fc03ead07073c6d294df043 + +I=68 +KEY=213a566edb7dd071843400b666c7be9e0e3b827e6b80c7d7f658648e04cb8ce9 +PT=58f884db2fc03ead07073c6d294df043 +CT=ea3e8b93eb09ff4b073283a1c5868f8b + +I=69 +KEY=cb04ddfd30742f3a83068317a3413115518e14c8cbbca84bf26644451c821f30 +PT=ea3e8b93eb09ff4b073283a1c5868f8b +CT=182751f122f9ade6689bca4cc743ff01 + +I=70 +KEY=d3238c0c128d82dceb9d495b6402ce14e7aa1f4d0f5b42476036cfa3f0272cd0 +PT=182751f122f9ade6689bca4cc743ff01 +CT=6a863fadf4d32b7900e3917d017a0bba + +I=71 +KEY=b9a5b3a1e65ea9a5eb7ed8266578c5ae5f64669c7febcfc20f2aac6b9279a550 +PT=6a863fadf4d32b7900e3917d017a0bba +CT=ceee21603dbbbf98c3a18fef9f9c05ad + +I=72 +KEY=774b92c1dbe5163d28df57c9fae4c003c0917a103844bece714fc1a2b0e192c5 +PT=ceee21603dbbbf98c3a18fef9f9c05ad +CT=72bf550c8afa8051d6645c558229793f + +I=73 +KEY=05f4c7cd511f966cfebb0b9c78cdb93c36a967c03817dfa78fa8d340ed97ccb5 +PT=72bf550c8afa8051d6645c558229793f +CT=00426f8a0d76bab4d8f986b812461b6f + +I=74 +KEY=05b6a8475c692cd826428d246a8ba2533fab2a5bd18a8f65038ab159da3de998 +PT=00426f8a0d76bab4d8f986b812461b6f +CT=5857895b2e275c4c21aa0f08b6f0847b + +I=75 +KEY=5de1211c724e709407e8822cdc7b26285be6574eea8e82ceb377c0020cc8e18e +PT=5857895b2e275c4c21aa0f08b6f0847b +CT=119d43336431c86c6d60dd65a5321040 + +I=76 +KEY=4c7c622f167fb8f86a885f497949366878d7d3a45c12e8232114900b83b5c9b3 +PT=119d43336431c86c6d60dd65a5321040 +CT=4d4cccac8f1ad0d9251f6b0c5810c746 + +I=77 +KEY=0130ae83996568214f9734452159f12e2de3430be25b77bdb91f7e0ba73592d7 +PT=4d4cccac8f1ad0d9251f6b0c5810c746 +CT=ae4d9d075b0bced19612be781224aa61 + +I=78 +KEY=af7d3384c26ea6f0d9858a3d337d5b4f718603b5c5231cb183bc1db054710613 +PT=ae4d9d075b0bced19612be781224aa61 +CT=8a2f017888eec9892074d5d2149eb7eb + +I=79 +KEY=255232fc4a806f79f9f15fef27e3eca4d1184edd7c7ec386b43801239313ff81 +PT=8a2f017888eec9892074d5d2149eb7eb +CT=79fa4e37a35283c043f5fd94ed164fd5 + +I=80 +KEY=5ca87ccbe9d2ecb9ba04a27bcaf5a371a89ae67e2d47de868f1351b12f9d42bd +PT=79fa4e37a35283c043f5fd94ed164fd5 +CT=4276afd3caef8c7f66808575f89049f7 + +I=81 +KEY=1eded318233d60c6dc84270e3265ea864455def03ee994257ed7a49c64cea8c0 +PT=4276afd3caef8c7f66808575f89049f7 +CT=0bd19c327ac30fbfddd617b008bb3a95 + +I=82 +KEY=150f4f2a59fe6f79015230be3aded0137e62a5bba2d205e78ab7fd712b0c359c +PT=0bd19c327ac30fbfddd617b008bb3a95 +CT=8ef3147782c24cca466cc3dcc11f8794 + +I=83 +KEY=9bfc5b5ddb3c23b3473ef362fbc157876b5fb7e4f7aa7674dddbf80a4b446315 +PT=8ef3147782c24cca466cc3dcc11f8794 +CT=ed589a41ba09e9be158c19fdc9dd8a4e + +I=84 +KEY=76a4c11c6135ca0d52b2ea9f321cddc9cfe2ce662a534e949e7f6ad4efcfb113 +PT=ed589a41ba09e9be158c19fdc9dd8a4e +CT=8edee0f1736e3fc0bdbec7964a95ced0 + +I=85 +KEY=f87a21ed125bf5cdef0c2d0978891319315566575ef73adb179151cb52ee3a0a +PT=8edee0f1736e3fc0bdbec7964a95ced0 +CT=3214228bec5aa4abe5181db645018e70 + +I=86 +KEY=ca6e0366fe0151660a1430bf3d889d69f3e071a56871db60e0df22fbb8d94457 +PT=3214228bec5aa4abe5181db645018e70 +CT=2b26424d04f1a75b439e4a5a23956478 + +I=87 +KEY=e148412bfaf0f63d498a7ae51e1df9117c6953caef557f2ab827f4ea2d66b722 +PT=2b26424d04f1a75b439e4a5a23956478 +CT=2be6bcfb07f81876079ecbda3a3f4890 + +I=88 +KEY=caaefdd0fd08ee4b4e14b13f2422b18110bb98781b030fccdbb9799b325eed9e +PT=2be6bcfb07f81876079ecbda3a3f4890 +CT=f3b1a2a7b5ac9a1ef9e26a6fdf0ccb32 + +I=89 +KEY=391f5f7748a47455b7f6db50fb2e7ab32358ba12feefc901d0cc1568f5cca032 +PT=f3b1a2a7b5ac9a1ef9e26a6fdf0ccb32 +CT=bdcd719022de99b1ea3f31eb62feb828 + +I=90 +KEY=84d22ee76a7aede45dc9eabb99d0c29bef052ba16de9a3dfbe7f914d5eb63dee +PT=bdcd719022de99b1ea3f31eb62feb828 +CT=5c4d8b09ade9f2c9f1680f15f26238ae + +I=91 +KEY=d89fa5eec7931f2daca1e5ae6bb2fa35536e42a8c771a42a26afe34d92b7ccd8 +PT=5c4d8b09ade9f2c9f1680f15f26238ae +CT=8fc562748df56011248424df43129d6d + +I=92 +KEY=575ac79a4a667f3c8825c17128a06758f7c3632cafb503f59c04cf668a73c902 +PT=8fc562748df56011248424df43129d6d +CT=737da09e6589b44fac83c49be5c0f3ba + +I=93 +KEY=242767042fefcb7324a605eacd6094e2d8455b2af7a3c29d86ecd2440ae4b7ce +PT=737da09e6589b44fac83c49be5c0f3ba +CT=d34632c3fc090bb7b1bec2ed127723fa + +I=94 +KEY=f76155c7d3e6c0c49518c707df17b7184a2606b484287b41210e41befa23d138 +PT=d34632c3fc090bb7b1bec2ed127723fa +CT=50605c5106d4376c1a746cc949185383 + +I=95 +KEY=a7010996d532f7a88f6cabce960fe49baf59769d229011b88cf4afb49970ac31 +PT=50605c5106d4376c1a746cc949185383 +CT=f0a24adeba5cd6f64146bbcc8f81e6a3 + +I=96 +KEY=57a343486f6e215ece2a1002198e0238adc966659090a09439ef4951a1f41beb +PT=f0a24adeba5cd6f64146bbcc8f81e6a3 +CT=cfe126a13a5f58b18cf9cd8e32abcfe6 + +I=97 +KEY=984265e9553179ef42d3dd8c2b25cddef8af5aa0e111b744f867e0bb9c7d05ca +PT=cfe126a13a5f58b18cf9cd8e32abcfe6 +CT=bda0dfbca714e71ab5b3cc37b1cdedb2 + +I=98 +KEY=25e2ba55f2259ef5f76011bb9ae8206c186936ce3daaa6a3ced23fc51f35f8b4 +PT=bda0dfbca714e71ab5b3cc37b1cdedb2 +CT=a28e8947a32c20a570fb5018f3159713 + +I=99 +KEY=876c33125109be50879b41a369fdb77f1c939d8fd3933a22e07a5a6b9a971e0b +PT=a28e8947a32c20a570fb5018f3159713 +CT=9dd2b23ef7c31d191799f9fd272a3286 + +I=100 +KEY=1abe812ca6caa3499002b85e4ed785f96126d7d55b24d76d37d687bc65a89eee +PT=9dd2b23ef7c31d191799f9fd272a3286 +CT=33f2f90388c1c3734cbb874b835fddf6 + +I=101 +KEY=294c782f2e0b603adcb93f15cd88580fd855c35e61eab3dd351eb3f3aac19138 +PT=33f2f90388c1c3734cbb874b835fddf6 +CT=22ae75800ae2ca23b93a774045bc8ccd + +I=102 +KEY=0be20daf24e9aa19658348558834d4c27a4747283a3914cefbfbd204a8aea59e +PT=22ae75800ae2ca23b93a774045bc8ccd +CT=07129162ce3b5e32d8c7c529f44da327 + +I=103 +KEY=0cf09ccdead2f42bbd448d7c7c7977e5e55d1bf881855a704d77ff354659c06c +PT=07129162ce3b5e32d8c7c529f44da327 +CT=a90afc5f53e49ab2130574aa79667504 + +I=104 +KEY=a5fa6092b9366e99ae41f9d6051f02e15568cced4a84541dcfdd49883eddc5fb +PT=a90afc5f53e49ab2130574aa79667504 +CT=06f86329d92bd99a08fa737884142be3 + +I=105 +KEY=a30203bb601db703a6bb8aae810b2902832b47aa941e6f9dcdf4204e8ede8dd8 +PT=06f86329d92bd99a08fa737884142be3 +CT=5bba9d55d045c63ca25aa1758bccf13d + +I=106 +KEY=f8b89eeeb058713f04e12bdb0ac7d83fd5830ed773b94b27f6985b897a47c82e +PT=5bba9d55d045c63ca25aa1758bccf13d +CT=34a91d6d5b91c842549de629656a4a4a + +I=107 +KEY=cc118383ebc9b97d507ccdf26fad9275d9f42dde1f44a8aa875a466170ce7121 +PT=34a91d6d5b91c842549de629656a4a4a +CT=a934d7635d04e43bb7ba8526aedcf617 + +I=108 +KEY=652554e0b6cd5d46e7c648d4c171646233007726a3972afff4cbc5a78fc7fa13 +PT=a934d7635d04e43bb7ba8526aedcf617 +CT=c0b67afe70a6dda933caeeee888e4eb5 + +I=109 +KEY=a5932e1ec66b80efd40ca63a49ff2ad7387a85c2ab747372563b5bb39e272fa3 +PT=c0b67afe70a6dda933caeeee888e4eb5 +CT=c57d547e6e34752a6ee9a51fb6da0f02 + +I=110 +KEY=60ee7a60a85ff5c5bae50325ff2525d56b8f9e9d9dbea9b24f96772b00e1722a +PT=c57d547e6e34752a6ee9a51fb6da0f02 +CT=87da985350c63f98c01548a2e067da67 + +I=111 +KEY=e734e233f899ca5d7af04b871f42ffb2eeb6b771a7c9e1a3f7ad4b3218ba680c +PT=87da985350c63f98c01548a2e067da67 +CT=841ca91b571fcd140cf1441c748c0c15 + +I=112 +KEY=63284b28af86074976010f9b6bcef3a748b0f1684eab559e465fa8bb8cfb1aac +PT=841ca91b571fcd140cf1441c748c0c15 +CT=f3e8b4842c01119d755caffc6edfc367 + +I=113 +KEY=90c0ffac838716d4035da067051130c0428319e05d8a7bae1daee89447ba0b7b +PT=f3e8b4842c01119d755caffc6edfc367 +CT=6096b877e8d6e8c216559b70b9a7a9c6 + +I=114 +KEY=f05647db6b51fe1615083b17bcb6990608f1a72089615d165b31cafd51496f9f +PT=6096b877e8d6e8c216559b70b9a7a9c6 +CT=83f0f73f91e55bfb3b44e7dfbf1d9e2e + +I=115 +KEY=73a6b0e4fab4a5ed2e4cdcc803ab07281bab82b4ef5732e2d732830e57524fb8 +PT=83f0f73f91e55bfb3b44e7dfbf1d9e2e +CT=03be9a03438357057163e893c40f2ae5 + +I=116 +KEY=70182ae7b937f2e85f2f345bc7a42dcdcec7242c2b60b603a21326476aaf2529 +PT=03be9a03438357057163e893c40f2ae5 +CT=de851c1ea68bacbed283c78151587542 + +I=117 +KEY=ae9d36f91fbc5e568dacf3da96fc588f6f1a1fa72ba20e311b7d31c117107871 +PT=de851c1ea68bacbed283c78151587542 +CT=d7d5030d4cda8176c29d5a24a6d85cca + +I=118 +KEY=794835f45366df204f31a9fe302404458def188f5f18f5ef86d7ce0448a6dc9e +PT=d7d5030d4cda8176c29d5a24a6d85cca +CT=34031201576d10bf597fe46a3f108aed + +I=119 +KEY=4d4b27f5040bcf9f164e4d940f348ea800d140d90342af3d9e307753f1761bf5 +PT=34031201576d10bf597fe46a3f108aed +CT=24cdfb0b3841b6dab850e7804f8c32a6 + +I=120 +KEY=6986dcfe3c4a7945ae1eaa1440b8bc0ed912a43883de7ae866d700fd0510a85f +PT=24cdfb0b3841b6dab850e7804f8c32a6 +CT=d1353948f17b8e23240e82bd2a927b3d + +I=121 +KEY=b8b3e5b6cd31f7668a1028a96a2ac733aec0c3deb1ca6c42359f481a090215d6 +PT=d1353948f17b8e23240e82bd2a927b3d +CT=7ce072484d12a96d12a3b52723c5a3ba + +I=122 +KEY=c45397fe80235e0b98b39d8e49ef6489c33936cf7cd08cccacc64d7dfc5e4053 +PT=7ce072484d12a96d12a3b52723c5a3ba +CT=5ad92969694e2fba016fdd5d63672be9 + +I=123 +KEY=9e8abe97e96d71b199dc40d32a884f60059c028d866a1f35f84065ab768407bb +PT=5ad92969694e2fba016fdd5d63672be9 +CT=dfbdbb0368a030c060c5c6471fd78ac7 + +I=124 +KEY=4137059481cd4171f9198694355fc5a704aba5fe5333e3b555cf1f9f3cb811d3 +PT=dfbdbb0368a030c060c5c6471fd78ac7 +CT=541f1707383dc9639d213ac7cc5786c1 + +I=125 +KEY=15281293b9f088126438bc53f9084366686c8b19745239b57508411935b901c0 +PT=541f1707383dc9639d213ac7cc5786c1 +CT=8f24a894dd8ed70d9632ada1555dde2f + +I=126 +KEY=9a0cba07647e5f1ff20a11f2ac559d49cd60763f90fc22c228bb0d00893e1d17 +PT=8f24a894dd8ed70d9632ada1555dde2f +CT=b571f305443af103d39431c3ecb9d872 + +I=127 +KEY=2f7d49022044ae1c219e203140ec453b69f98aa1aaa0e8fe76a4dc5280b6dc35 +PT=b571f305443af103d39431c3ecb9d872 +CT=14fab8c9ce671f9ff25e8369a029cbee + +I=128 +KEY=3b87f1cbee23b183d3c0a358e0c58ed51dd550c796d3c63e5fd82aaa39592bc2 +PT=14fab8c9ce671f9ff25e8369a029cbee +CT=ddbca0aada112598d4145c451bf71a4f + +I=129 +KEY=e63b51613432941b07d4ff1dfb32949ac2caa04cd85503e5de9a9bf8b88c181f +PT=ddbca0aada112598d4145c451bf71a4f +CT=f0f06dfe81b0eb67811b29f4557e824a + +I=130 +KEY=16cb3c9fb5827f7c86cfd6e9ae4c16d0392f7d171d7f0281154d62bb4c25b75d +PT=f0f06dfe81b0eb67811b29f4557e824a +CT=945c1ac88a42614f0950884525b62a38 + +I=131 +KEY=829726573fc01e338f9f5eac8bfa3ce8809b942f24a69c5feda0193a317e4fee +PT=945c1ac88a42614f0950884525b62a38 +CT=40acbf52df0441b9af1fc6e687bdc992 + +I=132 +KEY=c23b9905e0c45f8a2080984a0c47f57ae638c4c37a333986fb68bad2c567a5b8 +PT=40acbf52df0441b9af1fc6e687bdc992 +CT=d63cfb1457e8aa78d90c0641f6d40243 + +I=133 +KEY=14076211b72cf5f2f98c9e0bfa93f739d02eb3d1e70ec7e26467ef55c2ddf371 +PT=d63cfb1457e8aa78d90c0641f6d40243 +CT=f99c12a6cda822d7bff1df9665ee65ff + +I=134 +KEY=ed9b70b77a84d725467d419d9f7d92c67143277a8c0eb5bfe34f735fc0a54ef6 +PT=f99c12a6cda822d7bff1df9665ee65ff +CT=519be003a2dc78ee834482991d985bdd + +I=135 +KEY=bc0090b4d858afcbc539c30482e5c91b1a879ae9bfc0303997a279a16bef5f2d +PT=519be003a2dc78ee834482991d985bdd +CT=052c6df1473bc91bb5740229525629ae + +I=136 +KEY=b92cfd459f6366d0704dc12dd0b3e0b57bf23beed04c7d94da1b92a570c5b744 +PT=052c6df1473bc91bb5740229525629ae +CT=08b21250fca78faef326bdac53ce7578 + +I=137 +KEY=b19eef1563c4e97e836b7c81837d95cd9a57e1ae2dce99d3134a6b3f20698e91 +PT=08b21250fca78faef326bdac53ce7578 +CT=700fe4b37a792849634817cb62556973 + +I=138 +KEY=c1910ba619bdc137e0236b4ae128fcbe4c5e00cad5f9ff1be42c0ffd0583dad4 +PT=700fe4b37a792849634817cb62556973 +CT=4fba40be05e789574a2d266a57bb859e + +I=139 +KEY=8e2b4b181c5a4860aa0e4d20b6937920a4f9d79e06b1c308ea0c81137b951674 +PT=4fba40be05e789574a2d266a57bb859e +CT=b9e64ab80d475bb26a553daad4c782af + +I=140 +KEY=37cd01a0111d13d2c05b708a6254fb8fba610b0edd91bd0580932b308afc7bcc +PT=b9e64ab80d475bb26a553daad4c782af +CT=43245c72f5c79f1925f0bd36948d2402 + +I=141 +KEY=74e95dd2e4da8ccbe5abcdbcf6d9df8d15ea38e59416af70a5161ec424e4c10c +PT=43245c72f5c79f1925f0bd36948d2402 +CT=cd9167cfbc6e3665b748ada60950251b + +I=142 +KEY=b9783a1d58b4baae52e3601aff89fa967e583c92c8b0a796b7e516775abf41db +PT=cd9167cfbc6e3665b748ada60950251b +CT=0f73880a985ec84192fa3f146d4bbabf + +I=143 +KEY=b60bb217c0ea72efc0195f0e92c240296851f6b5fd314ff09fca4aab1237c0ef +PT=0f73880a985ec84192fa3f146d4bbabf +CT=5f33b905443e840b71b009831b869348 + +I=144 +KEY=e9380b1284d4f6e4b1a9568d8944d3618149c647391f59e619f7f9d87e1fa1c2 +PT=5f33b905443e840b71b009831b869348 +CT=0d90aba5360be05b6dae15ede97ca668 + +I=145 +KEY=e4a8a0b7b2df16bfdc07436060387509f130ab1f75c95b9e602c091dae1d0aec +PT=0d90aba5360be05b6dae15ede97ca668 +CT=b8ec490b182f56dfb95b21d22af661cc + +I=146 +KEY=5c44e9bcaaf04060655c62b24ace14c5435a8c6046a47a36576f01848511b1c1 +PT=b8ec490b182f56dfb95b21d22af661cc +CT=6f7807b7140f14794cfdf030feaa21c7 + +I=147 +KEY=333cee0bbeff541929a19282b4643502e33c81ebf50f696fff2630d7f581d039 +PT=6f7807b7140f14794cfdf030feaa21c7 +CT=a847c7f9a9300d34bce60c20086a07dc + +I=148 +KEY=9b7b29f217cf592d95479ea2bc0e32de3539969ca009f7d4684565b61dc37c18 +PT=a847c7f9a9300d34bce60c20086a07dc +CT=193d03b7f1260fed072a03a916d3187a + +I=149 +KEY=82462a45e6e956c0926d9d0baadd2aa4fb8ab61c29405843a7fba2882af08c78 +PT=193d03b7f1260fed072a03a916d3187a +CT=e54c5c1949626499fdffdfe8cb956e50 + +I=150 +KEY=670a765caf8b32596f9242e3614844f4b6695c34fe595a285d23e076250c88eb +PT=e54c5c1949626499fdffdfe8cb956e50 +CT=de6b840e8f6f68cf1976c5e82f6b99b3 + +I=151 +KEY=b961f25220e45a9676e4870b4e23dd472c90ed731871185fe3d113c4ea949762 +PT=de6b840e8f6f68cf1976c5e82f6b99b3 +CT=8b4e1bcda1f96309319f908ac063ebc1 + +I=152 +KEY=322fe99f811d399f477b17818e4036861c0143a89b37f8351eaf8f23b6514d95 +PT=8b4e1bcda1f96309319f908ac063ebc1 +CT=243a37cf74b006d29b5683b236ae9a9f + +I=153 +KEY=1615de50f5ad3f4ddc2d9433b8eeac19e0880fb4aff1507cf0c818562ad7259f +PT=243a37cf74b006d29b5683b236ae9a9f +CT=2bda66f3c3854a9c83e0200e2805df95 + +I=154 +KEY=3dcfb8a3362875d15fcdb43d90eb738cd9c14be03429d98ed74a0db5a9063d7d +PT=2bda66f3c3854a9c83e0200e2805df95 +CT=aca1a3ba92def11a704e96ada0aa4edb + +I=155 +KEY=916e1b19a4f684cb2f83229030413d575c3005120f9cd4e37cc89b721e732904 +PT=aca1a3ba92def11a704e96ada0aa4edb +CT=450f9d7f3a2ee035b98088a75bab6684 + +I=156 +KEY=d46186669ed864fe9603aa376bea5bd3d88ce3502b4352ea33f8f665f2b89884 +PT=450f9d7f3a2ee035b98088a75bab6684 +CT=5994de5635ea301bbe62a6ee413c44aa + +I=157 +KEY=8df55830ab3254e528610cd92ad61f793da3a5b0bf1e82adf2fcc0be5920afda +PT=5994de5635ea301bbe62a6ee413c44aa +CT=b1502f1a1905c51e41ca48e624770925 + +I=158 +KEY=3ca5772ab23791fb69ab443f0ea1165cfe84a26efda98386e0cfe5ab3c294b9a +PT=b1502f1a1905c51e41ca48e624770925 +CT=db4635bd3345d1d504aa605c0663a0d6 + +I=159 +KEY=e7e342978172402e6d01246308c2b68adb129c9d58a83a31e8c9b861b0e93a95 +PT=db4635bd3345d1d504aa605c0663a0d6 +CT=575ac8eb5e4d2cce3c3ff42aa7dfd819 + +I=160 +KEY=b0b98a7cdf3f6ce0513ed049af1d6e9315545340c2ddb0a56e36f15bf2b7c6be +PT=575ac8eb5e4d2cce3c3ff42aa7dfd819 +CT=d95774b0a3e7417d78c84935c99f14d0 + +I=161 +KEY=69eefecc7cd82d9d29f6997c66827a43437e85d20024729acf17c6399e2e67f6 +PT=d95774b0a3e7417d78c84935c99f14d0 +CT=2b019830992108862b85f7b3a5f996f5 + +I=162 +KEY=42ef66fce5f9251b02736ecfc37becb621270ce552ccd08cb105c17ea7263fc0 +PT=2b019830992108862b85f7b3a5f996f5 +CT=b755ff6b68bfe8b334f42796f619bcf2 + +I=163 +KEY=f5ba99978d46cda83687495935625044f2332d635db6766b961b5ec0f450827e +PT=b755ff6b68bfe8b334f42796f619bcf2 +CT=b1e6d5cd91086d908c9bd4a2d58bedb4 + +I=164 +KEY=445c4c5a1c4ea038ba1c9dfbe0e9bdf031808ca1954badbfa347961abfb630b9 +PT=b1e6d5cd91086d908c9bd4a2d58bedb4 +CT=626d9a6e13b1d72a0dc45e505f36b478 + +I=165 +KEY=2631d6340fff7712b7d8c3abbfdf0988ebff0330f385566db29c4322e5801a52 +PT=626d9a6e13b1d72a0dc45e505f36b478 +CT=7a795e9caa0917dd78bcff2447172850 + +I=166 +KEY=5c4888a8a5f660cfcf643c8ff8c821d8715f807b5269c078875ec4ddac117dfd +PT=7a795e9caa0917dd78bcff2447172850 +CT=e44d512d94bff3834303102bac25a351 + +I=167 +KEY=b805d9853149934c8c672ca454ed828992516228c924dc941ba1c4e153ec5fd3 +PT=e44d512d94bff3834303102bac25a351 +CT=0eb99d4d8f12a593d25b28450a6deefe + +I=168 +KEY=b6bc44c8be5b36df5e3c04e15e806c77bfde7fce545b3e061314a59f39a5022d +PT=0eb99d4d8f12a593d25b28450a6deefe +CT=3c8cd74e8a90138bb240155de1fc21b3 + +I=169 +KEY=8a30938634cb2554ec7c11bcbf7c4dc4623245d0711994b5e410679d866788a4 +PT=3c8cd74e8a90138bb240155de1fc21b3 +CT=23ce64fc19af9fee3efd3fb691398f60 + +I=170 +KEY=a9fef77a2d64babad2812e0a2e45c2a4deba0102dbc75e686a89f0a33aa2f4a4 +PT=23ce64fc19af9fee3efd3fb691398f60 +CT=271059591ff6f87dd2faee6b31937eba + +I=171 +KEY=8eeeae23329242c7007bc0611fd6bc1eecb4eaf146c0b696c45f3b1d64a8a69a +PT=271059591ff6f87dd2faee6b31937eba +CT=42603531793714e8f8cbfd2497ad846f + +I=172 +KEY=cc8e9b124ba5562ff8b03d45887b38716d32dab2cbe999cfe063a98530bf7b4f +PT=42603531793714e8f8cbfd2497ad846f +CT=283a9a04464c07926b40e9c5c358ef76 + +I=173 +KEY=e4b401160de951bd93f0d4804b23d707ff5be1cea6e033c0841f4346a62af0b9 +PT=283a9a04464c07926b40e9c5c358ef76 +CT=e4c6a4aee8fb0c615f41c379fa59a483 + +I=174 +KEY=0072a5b8e5125ddcccb117f9b17a73849c4ef9e81dae0d7899e9022876976e66 +PT=e4c6a4aee8fb0c615f41c379fa59a483 +CT=e7605934d021f0a004512a2c760a80a2 + +I=175 +KEY=e712fc8c3533ad7cc8e03dd5c770f3266189268a81a2ea4a8e760001b0d18a8e +PT=e7605934d021f0a004512a2c760a80a2 +CT=7e2670fa327b4c247d11889ce82e9700 + +I=176 +KEY=99348c760748e158b5f1b5492f5e642619de05d454cd0da858631dc854a3110c +PT=7e2670fa327b4c247d11889ce82e9700 +CT=bae8ddb214410c00b3c7be497b4562e1 + +I=177 +KEY=23dc51c41309ed5806360b00541b06c7dc6b628209714e0416304fd12a386942 +PT=bae8ddb214410c00b3c7be497b4562e1 +CT=13faf0ea2d565a24d2b687d4d9312547 + +I=178 +KEY=3026a12e3e5fb77cd4808cd48d2a2380f86fb0909e3274e3a0d4276aa846cb55 +PT=13faf0ea2d565a24d2b687d4d9312547 +CT=7784540933d0702814528bed11246020 + +I=179 +KEY=47a2f5270d8fc754c0d207399c0e43a08ee475af1371e1d253c635330b1f81af +PT=7784540933d0702814528bed11246020 +CT=ecb7c1f6132ac570e8b23358c55f1232 + +I=180 +KEY=ab1534d11ea502242860346159515192226b5287072f706c44ba0b006dfab082 +PT=ecb7c1f6132ac570e8b23358c55f1232 +CT=8e8d97960ff2ba421711f702a265455c + +I=181 +KEY=2598a3471157b8663f71c363fb3414ce003b4ebe62fce8310d2a7d4387e65230 +PT=8e8d97960ff2ba421711f702a265455c +CT=6dd0b744a33c22de7e929d06c20bdc5e + +I=182 +KEY=48481403b26b9ab841e35e65393fc890b2f1991300a1f6e42e592d7cfca107f3 +PT=6dd0b744a33c22de7e929d06c20bdc5e +CT=51bf01bce5cacc5e1c9d13b3cd85bdd9 + +I=183 +KEY=19f715bf57a156e65d7e4dd6f4ba7549f880f942e4f803f1a8963efd011e4060 +PT=51bf01bce5cacc5e1c9d13b3cd85bdd9 +CT=632701100bb70369d9c6fd1373ea5f6f + +I=184 +KEY=7ad014af5c16558f84b8b0c587502a266a1d5191b6d9f4e9001ed1a019059e26 +PT=632701100bb70369d9c6fd1373ea5f6f +CT=02f5b8ef99d36563c137d630251f3182 + +I=185 +KEY=7825ac40c5c530ec458f66f5a24f1ba4b52ae624abe43d9aea48f0541e484c1e +PT=02f5b8ef99d36563c137d630251f3182 +CT=c318a0a909ca1bc14ba7412d3ab5e143 + +I=186 +KEY=bb3d0ce9cc0f2b2d0e2827d898fafae7168b4a59ccc05682e79880072ec7c5f9 +PT=c318a0a909ca1bc14ba7412d3ab5e143 +CT=300743ea56b544183f1b52ceac8b1271 + +I=187 +KEY=8b3a4f039aba6f35313375163471e89661f2b5af85678f3570a1ec7314ade60d +PT=300743ea56b544183f1b52ceac8b1271 +CT=a5eaac40b778f51f0ddd60c07e90b8cd + +I=188 +KEY=2ed0e3432dc29a2a3cee15d64ae1505be4a0dd7fa57eee57541f602c5a9cc818 +PT=a5eaac40b778f51f0ddd60c07e90b8cd +CT=9b7fd74688d354eca13c460d69cca546 + +I=189 +KEY=b5af3405a511cec69dd253db232df51d5eb7617e6b9a9293be666c935a9df2be +PT=9b7fd74688d354eca13c460d69cca546 +CT=4d7fd70327dba9ebd3d753a3bbe1df6b + +I=190 +KEY=f8d0e30682ca672d4e05007898cc2a7637cf2a064cb700c291bbd9e383aa37f3 +PT=4d7fd70327dba9ebd3d753a3bbe1df6b +CT=65a178e79e6a469d52bdd8e941cc7722 + +I=191 +KEY=9d719be11ca021b01cb8d891d9005d54bf5aa91e98b5f6a2aae0b9858a8a2653 +PT=65a178e79e6a469d52bdd8e941cc7722 +CT=dd0d076d20d6b82ca6eca1056487e4be + +I=192 +KEY=407c9c8c3c76999cba547994bd87b9ea66e864b49b07b3b9da75e2077849973f +PT=dd0d076d20d6b82ca6eca1056487e4be +CT=c24e21b5f8b8c00992f8249633f88b36 + +I=193 +KEY=8232bd39c4ce599528ac5d028e7f32dc52a3c34421ce1a03282e15b48255f5d6 +PT=c24e21b5f8b8c00992f8249633f88b36 +CT=1dee7658ac1f2a52dfa0b42f5c671bb1 + +I=194 +KEY=9fdccb6168d173c7f70ce92dd218296df3c72d6d6703ed14c4c1e44cf9e0adc5 +PT=1dee7658ac1f2a52dfa0b42f5c671bb1 +CT=b882df08f78b034c964c64354ffbc14e + +I=195 +KEY=275e14699f5a708b61408d189de3e82314755da8207ee49869f846a855360c88 +PT=b882df08f78b034c964c64354ffbc14e +CT=0f50b9535b633527727bfbe1d3dde8c7 + +I=196 +KEY=280ead3ac43945ac133b76f94e3e00e478990d91c149089ba2e7bae9a6bb769b +PT=0f50b9535b633527727bfbe1d3dde8c7 +CT=97ae56c1e8a1337f579a697edb0abc67 + +I=197 +KEY=bfa0fbfb2c9876d344a11f879534bc83cffa44f0dabae339d71e377ebe9ee8e4 +PT=97ae56c1e8a1337f579a697edb0abc67 +CT=c99cc7cbd4a0d7d6e59e94c672493a68 + +I=198 +KEY=763c3c30f838a105a13f8b41e77d86eb6942676fbed3a420b4f5b643d33b520f +PT=c99cc7cbd4a0d7d6e59e94c672493a68 +CT=45b59be9f480955240893c2e583c518c + +I=199 +KEY=3389a7d90cb83457e1b6b76fbf41d7675038f93a7c5e93348ad3c72d86527c1e +PT=45b59be9f480955240893c2e583c518c +CT=ccddd5ee7dc1824f6fbc358a80026913 + +I=200 +KEY=ff5472377179b6188e0a82e53f43be74eda898337372b1d35bd3a7cbdfc632dc +PT=ccddd5ee7dc1824f6fbc358a80026913 +CT=5e60cc5d8baa37d9cbcb955637274216 + +I=201 +KEY=a134be6afad381c145c117b30864fc621cfdb3cce065086ebf2c1428d0b41532 +PT=5e60cc5d8baa37d9cbcb955637274216 +CT=01759c8a23f481af248e1d6cc80edc0f + +I=202 +KEY=a04122e0d927006e614f0adfc06a206d5a9e86857dece7b78f839c27387de166 +PT=01759c8a23f481af248e1d6cc80edc0f +CT=1535407b72bd13e7dbffd61e0c7d5467 + +I=203 +KEY=b574629bab9a1389bab0dcc1cc17740ae534b85568ba0a99eaca5d9ddb1ad585 +PT=1535407b72bd13e7dbffd61e0c7d5467 +CT=d5450689d81c0a2dccc61b20f2427467 + +I=204 +KEY=60316412738619a47676c7e13e55006d7af4cfd6260116be24bd0d0f7b3cbc62 +PT=d5450689d81c0a2dccc61b20f2427467 +CT=1a18e1a95402f27474ff070b012844bd + +I=205 +KEY=7a2985bb2784ebd00289c0ea3f7d44d0cdbab05d5241044d29d029af8a66cd2b +PT=1a18e1a95402f27474ff070b012844bd +CT=41b0f3f0e56f05c68d433ae9f85ae9aa + +I=206 +KEY=3b99764bc2ebee168fcafa03c727ad7af62217aa10bb42daff3fedb2158b283e +PT=41b0f3f0e56f05c68d433ae9f85ae9aa +CT=1cd7c7f7883d2c19a7e73c24cbeafb1b + +I=207 +KEY=274eb1bc4ad6c20f282dc6270ccd56617feb1e2621dd688654a60dee82fb2033 +PT=1cd7c7f7883d2c19a7e73c24cbeafb1b +CT=3bd01d14d96444073c62e41ae83d097d + +I=208 +KEY=1c9eaca893b28608144f223de4f05f1ceb9068f4731ddc86ca9c11a1140a08f0 +PT=3bd01d14d96444073c62e41ae83d097d +CT=ce76ae2239ac37fc9da78df6a369ac91 + +I=209 +KEY=d2e8028aaa1eb1f489e8afcb4799f38d67030f7fa73547fa7857196c28c39a39 +PT=ce76ae2239ac37fc9da78df6a369ac91 +CT=1ce5e5b085418e93746cf148fef02158 + +I=210 +KEY=ce0de73a2f5f3f67fd845e83b969d2d5006d3a6a1fc9bbf909412c764122053f +PT=1ce5e5b085418e93746cf148fef02158 +CT=51fe3109c8ef2bf08f3978c80bc18148 + +I=211 +KEY=9ff3d633e7b0149772bd264bb2a8539d9fbc309a92f853fbd52b3adcad3a7833 +PT=51fe3109c8ef2bf08f3978c80bc18148 +CT=b6eced57e09a6c4778e8ec07a17f7791 + +I=212 +KEY=291f3b64072a78d00a55ca4c13d7240c0b6637a13f1646689a2ac2af5faa6f9a +PT=b6eced57e09a6c4778e8ec07a17f7791 +CT=556c753708a07755085244087b88c4f4 + +I=213 +KEY=7c734e530f8a0f8502078e44685fe0f869aa22c4e03efb05f33ef4bcabb2c394 +PT=556c753708a07755085244087b88c4f4 +CT=df77a310cd1949386a5f91e1271e4de8 + +I=214 +KEY=a304ed43c29346bd68581fa54f41ad101a5ce813a3957081a16114f09f3ad011 +PT=df77a310cd1949386a5f91e1271e4de8 +CT=33f546c1245425d5541c7ccbdf5686a4 + +I=215 +KEY=90f1ab82e6c763683c44636e90172bb4b51ea7825b84b906675d6c5b51ab1080 +PT=33f546c1245425d5541c7ccbdf5686a4 +CT=f2ca0805c876c76d0c39822f15ca110f + +I=216 +KEY=623ba3872eb1a405307de14185dd3abb31f24e1c35b9a8e8ba4cff5a5befe1f7 +PT=f2ca0805c876c76d0c39822f15ca110f +CT=6ae977ae32869e6554b027a20acb53aa + +I=217 +KEY=08d2d4291c373a6064cdc6e38f166911db63709d8488d38c2ee9a075264f0785 +PT=6ae977ae32869e6554b027a20acb53aa +CT=819c9dfc06b983c91b70a7b6dcb7cdb3 + +I=218 +KEY=894e49d51a8eb9a97fbd615553a1a4a2b82c97b47fc3049b1c918535783a2c58 +PT=819c9dfc06b983c91b70a7b6dcb7cdb3 +CT=1f5d3c6c7a3f42260c3e7f81961a75d2 + +I=219 +KEY=961375b960b1fb8f73831ed4c5bbd170346a518e6099ef3cb3e43ac31daa033f +PT=1f5d3c6c7a3f42260c3e7f81961a75d2 +CT=8856f37fc587fb38189fe11595b74e28 + +I=220 +KEY=1e4586c6a53600b76b1cffc1500c9f589f0a39680ef8a4d768dc6b708e446408 +PT=8856f37fc587fb38189fe11595b74e28 +CT=69d4072670654e5d468372aac735a8e2 + +I=221 +KEY=779181e0d5534eea2d9f8d6b973937ba15ef104e4ea016b8e14d1237dc12e182 +PT=69d4072670654e5d468372aac735a8e2 +CT=038b1b239032a0f1126389bce3305f3b + +I=222 +KEY=741a9ac34561ee1b3ffc04d7740968812165c32c7c747a036937d2db06647cca +PT=038b1b239032a0f1126389bce3305f3b +CT=f497398973dda5d758a77b14b4d88636 + +I=223 +KEY=808da34a36bc4bcc675b7fc3c0d1eeb78a3479301048570c478257f8752d6fdb +PT=f497398973dda5d758a77b14b4d88636 +CT=06f4398445ffaabe1062f697387354f4 + +I=224 +KEY=86799ace7343e17277398954f8a2ba43959796718f1f7c5502ab350b77374acb +PT=06f4398445ffaabe1062f697387354f4 +CT=2f83c40e1a5fb288657e06119e54ff5c + +I=225 +KEY=a9fa5ec0691c53fa12478f4566f6451f4d1fc1ae333ef0e9b04c5de7a11d88dd +PT=2f83c40e1a5fb288657e06119e54ff5c +CT=3895cbf19cd7651c6da4f578d4297abf + +I=226 +KEY=916f9531f5cb36e67fe37a3db2df3fa08f12dc2505e2ad68e23cd395c89d87ba +PT=3895cbf19cd7651c6da4f578d4297abf +CT=ef7cd7584de4583bbe5840c30ea695d5 + +I=227 +KEY=7e134269b82f6eddc1bb3afebc79aa750acfa06261a0fc006c14e7db4803cf34 +PT=ef7cd7584de4583bbe5840c30ea695d5 +CT=66dc16e4ab5bc2a8274ca034583c6697 + +I=228 +KEY=18cf548d1374ac75e6f79acae445cce21ca6b5979bc569097f752aa4bdd41b31 +PT=66dc16e4ab5bc2a8274ca034583c6697 +CT=fee309553e3bf9c2708ce6b8aa6bbe48 + +I=229 +KEY=e62c5dd82d4f55b7967b7c724e2e72aa2323583c4391bb6abcf6da2111e7d09f +PT=fee309553e3bf9c2708ce6b8aa6bbe48 +CT=69e8d78cc70862a8df85c8ea9dfd6605 + +I=230 +KEY=8fc48a54ea47371f49feb498d3d314af4d3bed1bf3465b68d24f5b2688cb46e1 +PT=69e8d78cc70862a8df85c8ea9dfd6605 +CT=eed08f36a9bc9bed2a6b987ba13cb6ac + +I=231 +KEY=6114056243fbacf263952ce372efa20347e8ef12aa5234b292204b2c2087ce13 +PT=eed08f36a9bc9bed2a6b987ba13cb6ac +CT=d7d4df5a881f08c75629be87999bc82a + +I=232 +KEY=b6c0da38cbe4a43535bc9264eb746a29c746e08d7aae3ee10479885f64c8ea0f +PT=d7d4df5a881f08c75629be87999bc82a +CT=addda2fca587c840d2e1f17dc7e4850e + +I=233 +KEY=1b1d78c46e636c75e75d63192c90ef27a00dd31624a32e927f13352c74e39a5b +PT=addda2fca587c840d2e1f17dc7e4850e +CT=c822ec434797e36698a020641eb58cb5 + +I=234 +KEY=d33f948729f48f137ffd437d322563928d702b20c99ce68cc2aaf7b743cca5d3 +PT=c822ec434797e36698a020641eb58cb5 +CT=c0ab22e8b883eefabfae21b876c3c8a0 + +I=235 +KEY=1394b66f917761e9c05362c544e6ab3272d3d517609f71dd622f1a3330ee470e +PT=c0ab22e8b883eefabfae21b876c3c8a0 +CT=b0ad1adbecca7d8ee4e253b86804251b + +I=236 +KEY=a339acb47dbd1c6724b1317d2ce28e294445956e7197d6e866e375cca688bcae +PT=b0ad1adbecca7d8ee4e253b86804251b +CT=4986bb6d28e11a89253ff4e5e271ca57 + +I=237 +KEY=eabf17d9555c06ee018ec598ce93447e788f6a30b839add828270adb9e2c047a +PT=4986bb6d28e11a89253ff4e5e271ca57 +CT=22cf5a639ce9c413e66960573e6126eb + +I=238 +KEY=c8704dbac9b5c2fde7e7a5cff0f2629520d7234e85c2d68142294b1c531237dc +PT=22cf5a639ce9c413e66960573e6126eb +CT=99e20d03d7d111ff58db07aefb8d1d25 + +I=239 +KEY=519240b91e64d302bf3ca2610b7f7fb0fc845d0caf823cd1c624e762e3e46f70 +PT=99e20d03d7d111ff58db07aefb8d1d25 +CT=0b49bf68cda1e14c853bea3d490e8cf5 + +I=240 +KEY=5adbffd1d3c5324e3a07485c4271f345e5a60b5ea0ede202e963193848179086 +PT=0b49bf68cda1e14c853bea3d490e8cf5 +CT=5b4ce4e36d538d37f318163e0cbf32c8 + +I=241 +KEY=01971b32be96bf79c91f5e624ecec18df080ef67a430394be5f5c0ca55bdf943 +PT=5b4ce4e36d538d37f318163e0cbf32c8 +CT=568791a9530c460aae304ebbde209a7e + +I=242 +KEY=57108a9bed9af973672f10d990ee5bf3a05a06d5abe5db08d7600597ec2050cc +PT=568791a9530c460aae304ebbde209a7e +CT=3df8ebdb4d244d6bc1bc82b7b51d9b97 + +I=243 +KEY=6ae86140a0beb418a693926e25f3c064757fa3a062dce8ca2ce95958f283c496 +PT=3df8ebdb4d244d6bc1bc82b7b51d9b97 +CT=766b0cac7a96b89c3ff1e777c2fd138d + +I=244 +KEY=1c836decda280c8499627519e70ed3e9c928e1e543e40a1ba83df74b1fdccaba +PT=766b0cac7a96b89c3ff1e777c2fd138d +CT=e9bf2162d779bdd01988549210680869 + +I=245 +KEY=f53c4c8e0d51b15480ea218bf766db8077aa75348bdca6525c950c62b5bb27c9 +PT=e9bf2162d779bdd01988549210680869 +CT=bf4a7edbb5d681afc33fde8c850f25b2 + +I=246 +KEY=4a763255b88730fb43d5ff077269fe325832dc90697fbb08e8e8b3d5bf0022b3 +PT=bf4a7edbb5d681afc33fde8c850f25b2 +CT=8c16edb630972e4e0a65c59c8da40b6f + +I=247 +KEY=c660dfe388101eb549b03a9bffcdf55d8ae13a6ce8f73d6c0cb39e9e1217dff6 +PT=8c16edb630972e4e0a65c59c8da40b6f +CT=59eb0dfc0781c320fda8b4caa6d1070c + +I=248 +KEY=9f8bd21f8f91dd95b4188e51591cf2513c5b0624915aae9b1b59427ab43f4530 +PT=59eb0dfc0781c320fda8b4caa6d1070c +CT=86c4cc012596397f5a67d4a04df020b0 + +I=249 +KEY=194f1e1eaa07e4eaee7f5af114ecd2e16a0389844ae3ccae2529859d3a4fa229 +PT=86c4cc012596397f5a67d4a04df020b0 +CT=fb9e2036f4f31417d06c164b62cc077b + +I=250 +KEY=e2d13e285ef4f0fd3e134cba7620d59a6222e9066636d7f3e6026e63db6dc253 +PT=fb9e2036f4f31417d06c164b62cc077b +CT=6e83994ee9b7707ccd7805dd3a4e0226 + +I=251 +KEY=8c52a766b7438081f36b49674c6ed7bcdf165ae16d7fe06905b60b1384eac390 +PT=6e83994ee9b7707ccd7805dd3a4e0226 +CT=ff3f21528529278c578f6b11bd5f8143 + +I=252 +KEY=736d8634326aa70da4e42276f13156ff2c1c631981962a3bb15fdbbaa8aadcaf +PT=ff3f21528529278c578f6b11bd5f8143 +CT=a35159960a6f25be03c3b3c8496bf28a + +I=253 +KEY=d03cdfa2380582b3a72791beb85aa4755ab65ea9fc012f83e5cb3a86f44134d1 +PT=a35159960a6f25be03c3b3c8496bf28a +CT=fa69e4d64a95c79c17d93ec116cb9526 + +I=254 +KEY=2a553b747290452fb0feaf7fae9131534465b8ea70651d27f23494e05ce64385 +PT=fa69e4d64a95c79c17d93ec116cb9526 +CT=aa9a953bbef667743eca6873fa86d2b1 + +I=255 +KEY=80cfae4fcc66225b8e34c70c5417e3e2ea44e8f4a5c7665642f86ca487b1402f +PT=aa9a953bbef667743eca6873fa86d2b1 +CT=7466eba3255219ca783d7a629103d428 + +I=256 +KEY=f4a945ece9343b91f609bd6ec51437ca7ee904d7cc5b9c801c68f7426c7ef7e9 +PT=7466eba3255219ca783d7a629103d428 +CT=b22d190c6d8254903d88d6de7b4e0496 + +I=257 +KEY=46845ce084b66f01cb816bb0be5a335c33e8326359d5d8ae2fab11d62f07130b +PT=b22d190c6d8254903d88d6de7b4e0496 +CT=cde0c859eca378a59c063883e8332041 + +I=258 +KEY=8b6494b9681517a4578753335669131d95085fdc3aa8a442cca652ce70522926 +PT=cde0c859eca378a59c063883e8332041 +CT=31459cf7b1942902b40374c25f816c2e + +I=259 +KEY=ba21084ed9813ea6e38427f109e87f3332a3add54d6a3b3e216aa2f8ff372fa9 +PT=31459cf7b1942902b40374c25f816c2e +CT=85b2a616da4abe6dde259652549d67ee + +I=260 +KEY=3f93ae5803cb80cb3da1b1a35d7518dd4627b5fc7f2442f35fd30a66682929cb +PT=85b2a616da4abe6dde259652549d67ee +CT=8e090017dabe85d27a1c354d04846048 + +I=261 +KEY=b19aae4fd975051947bd84ee59f17895db0b7a5ef82fa6fcc90675a1468e3ad0 +PT=8e090017dabe85d27a1c354d04846048 +CT=854cf40fe22836c9b86da85037236739 + +I=262 +KEY=34d65a403b5d33d0ffd02cbe6ed21fac2f6008dc987281f7d47669c153c16e64 +PT=854cf40fe22836c9b86da85037236739 +CT=6ec8f83bf0df0fe87706a553f99ecb5f + +I=263 +KEY=5a1ea27bcb823c3888d689ed974cd4f3fbac202fc3482cdc9fb2e305985fedb4 +PT=6ec8f83bf0df0fe87706a553f99ecb5f +CT=40c6ca06afd7b9b01dd0d790798c4203 + +I=264 +KEY=1ad8687d6455858895065e7deec096f0dbbaa8e249313d6dded381a114883172 +PT=40c6ca06afd7b9b01dd0d790798c4203 +CT=cb4ffd54cf1012de4b2427ba5cc57a37 + +I=265 +KEY=d1979529ab459756de2279c7b205ecc77095c3da2d230108c70550aabcfd6bbe +PT=cb4ffd54cf1012de4b2427ba5cc57a37 +CT=fcaaaa7a661f48a5c1053b8ba97ff3b4 + +I=266 +KEY=2d3d3f53cd5adff31f27424c1b7a1f73d1f7cc51021f7a65359fe14dec6681dd +PT=fcaaaa7a661f48a5c1053b8ba97ff3b4 +CT=2a3709e9b8eca361e0b19f7fc31bd1cf + +I=267 +KEY=070a36ba75b67c92ff96dd33d861cebcd9f65ec15c1bda45a9efbb00ac1676f4 +PT=2a3709e9b8eca361e0b19f7fc31bd1cf +CT=ff942984c5ac0cf2113bd96a4340e9b5 + +I=268 +KEY=f89e1f3eb01a7060eead04599b212709a387e10499317eed3f1b90062066dfe7 +PT=ff942984c5ac0cf2113bd96a4340e9b5 +CT=ee9c6c351b04bd9a2dd1f4e78a1dab12 + +I=269 +KEY=1602730bab1ecdfac37cf0be113c8c1b8a879053b44110fcc77e002b25877b31 +PT=ee9c6c351b04bd9a2dd1f4e78a1dab12 +CT=0ac2350d9b46be18b4f26b6a260555d6 + +I=270 +KEY=1cc04606305873e2778e9bd43739d9cdf63df2602905501159b8534ea472f94e +PT=0ac2350d9b46be18b4f26b6a260555d6 +CT=70108e3bc792e1a2588545c33bb9a025 + +I=271 +KEY=6cd0c83df7ca92402f0bde170c8079e8acc171d3a6bf06ddf5762949fcc769cf +PT=70108e3bc792e1a2588545c33bb9a025 +CT=f33082a1a0fe00eecc5923b544d3f111 + +I=272 +KEY=9fe04a9c573492aee352fda2485388f9d519911728856aabbddd22dfb87b8fd6 +PT=f33082a1a0fe00eecc5923b544d3f111 +CT=72e74d4e80da8437bdf43cc92cfaa479 + +I=273 +KEY=ed0707d2d7ee16995ea6c16b64a92c805bf344ca53c11c9b1b59c3a7c7a53884 +PT=72e74d4e80da8437bdf43cc92cfaa479 +CT=486c3445d3cd54424d3c2bf8f6951105 + +I=274 +KEY=a56b3397042342db139aea93923c3d85196d9f66a537656873a61b53e8f5cd88 +PT=486c3445d3cd54424d3c2bf8f6951105 +CT=3c9facac4fc77291446b10a56deeaf74 + +I=275 +KEY=99f49f3b4be4304a57f1fa36ffd292f109b78b289041842a7d389b8cb16fee3e +PT=3c9facac4fc77291446b10a56deeaf74 +CT=726a14c4574ce4a94190434767e73ff0 + +I=276 +KEY=eb9e8bff1ca8d4e31661b9719835ad01e41459808ab0d80d7a66b1df56106b23 +PT=726a14c4574ce4a94190434767e73ff0 +CT=6f57c05e3125775c9f199bf7b132a224 + +I=277 +KEY=84c94ba12d8da3bf8978228629070f2534b2c1384e8d632b42005b20b3c262e9 +PT=6f57c05e3125775c9f199bf7b132a224 +CT=8d2097c78a0e5d70d370e29db4e4bacd + +I=278 +KEY=09e9dc66a783fecf5a08c01b9de3b5e85753f8f999370571bf67cbc7b6c43c34 +PT=8d2097c78a0e5d70d370e29db4e4bacd +CT=be6e96319f1ea4723eaf63c039df1108 + +I=279 +KEY=b7874a57389d5abd64a7a3dba43ca4e069b3c6f9bf8991f5553ba1f84739c043 +PT=be6e96319f1ea4723eaf63c039df1108 +CT=5ae08cd2909c8c2e37b7b91a5cf22d2c + +I=280 +KEY=ed67c685a801d69353101ac1f8ce89cc83fcb2c59be91ebb8f772c8657360bf4 +PT=5ae08cd2909c8c2e37b7b91a5cf22d2c +CT=c6c97b09149637f756d421ccb87859bd + +I=281 +KEY=2baebd8cbc97e16405c43b0d40b6d0713156c7af03e6cf70c6cab41d5ad63672 +PT=c6c97b09149637f756d421ccb87859bd +CT=7a84ebe1cb881a210442ced2f08e4873 + +I=282 +KEY=512a566d771ffb450186f5dfb0389802f953460cbd5d59440300e87818fd5478 +PT=7a84ebe1cb881a210442ced2f08e4873 +CT=b673050db8735f02aa3f2e8c1b6cf9c2 + +I=283 +KEY=e7595360cf6ca447abb9db53ab5461c0e6b8e4063c19ca431132d078c6134bd7 +PT=b673050db8735f02aa3f2e8c1b6cf9c2 +CT=4715a677f08d7be62944c4f7db34d166 + +I=284 +KEY=a04cf5173fe1dfa182fd1fa47060b0a67a7ea2fad18a6e4636923cfc243525b1 +PT=4715a677f08d7be62944c4f7db34d166 +CT=2514282a337f5969c356d15d07fea66e + +I=285 +KEY=8558dd3d0c9e86c841abcef9779e16c86263240f3158997ba8b52c1ace603ee1 +PT=2514282a337f5969c356d15d07fea66e +CT=d45baf17262251506ac3eb116d2b045f + +I=286 +KEY=5103722a2abcd7982b6825e81ab512974258ac49bab31a93bd401081162ab220 +PT=d45baf17262251506ac3eb116d2b045f +CT=59968150384d99bdf6a50cbfd449fbb7 + +I=287 +KEY=0895f37a12f14e25ddcd2957cefce9204174c3adfb3d4dc5d0768b0167e5dd84 +PT=59968150384d99bdf6a50cbfd449fbb7 +CT=6a1b9a4344df1d5d4e592f220c9362d6 + +I=288 +KEY=628e6939562e537893940675c26f8bf6ae6f5d145d1a8714b0ffba35545d502b +PT=6a1b9a4344df1d5d4e592f220c9362d6 +CT=3999d773e0534922fb8d9d2502dccb96 + +I=289 +KEY=5b17be4ab67d1a5a68199b50c0b3406087dc78f4d2729ddc7e1d1a41f6023d52 +PT=3999d773e0534922fb8d9d2502dccb96 +CT=3222a3f4c766ad89c718d2d145a9565c + +I=290 +KEY=69351dbe711bb7d3af014981851a163c90dfd45178331d8ea03782dd069de633 +PT=3222a3f4c766ad89c718d2d145a9565c +CT=b1a02422ed5e3e8d08f9c5cd81bde779 + +I=291 +KEY=d895399c9c45895ea7f88c4c04a7f145f28abb926f51e34030daa1aa25c468bb +PT=b1a02422ed5e3e8d08f9c5cd81bde779 +CT=5985a5f828ba07a98394f18711f79d37 + +I=292 +KEY=81109c64b4ff8ef7246c7dcb15506c72d7d9e271dc4ab6a593302b1d6895e394 +PT=5985a5f828ba07a98394f18711f79d37 +CT=b568eaa12f8dd54541f3f27cdb770299 + +I=293 +KEY=347876c59b725bb2659f8fb7ce276eeb7bf5917b6615482ef0407afe9955ede5 +PT=b568eaa12f8dd54541f3f27cdb770299 +CT=d7925d3ddf9358f68bf97cb1f6d8adac + +I=294 +KEY=e3ea2bf844e10344ee66f30638ffc347b44e98ee0f1078c3ea753f6e10741e06 +PT=d7925d3ddf9358f68bf97cb1f6d8adac +CT=a104ce99b644a3d6fcaf29badff98642 + +I=295 +KEY=42eee561f2a5a09212c9dabce706450565ab0caa277426072fb5ffc282f65171 +PT=a104ce99b644a3d6fcaf29badff98642 +CT=40a8fc2e8249ac27044d88ff4ec63b7e + +I=296 +KEY=0246194f70ec0cb516845243a9c07e7bfa510275cff89591a6c745956b7ad4bd +PT=40a8fc2e8249ac27044d88ff4ec63b7e +CT=3d5073643e7b5919fb2f0dbb7f4f7205 + +I=297 +KEY=3f166a2b4e9755acedab5ff8d68f0c7e879505bb9dc25b6a487358414684325f +PT=3d5073643e7b5919fb2f0dbb7f4f7205 +CT=6bb3343c0cbf40f65baeb02396c381a1 + +I=298 +KEY=54a55e174228155ab605efdb404c8ddf364bf2fba16c1a40fd2e4a7ad01f7084 +PT=6bb3343c0cbf40f65baeb02396c381a1 +CT=32d9b2c7c79f72cd38516fb1382a6eb3 + +I=299 +KEY=667cecd085b767978e54806a7866e36c9ae2ddc8739caa87e4e8c3cb2912f54f +PT=32d9b2c7c79f72cd38516fb1382a6eb3 +CT=49af1a2cd93204ce25c25952e1ec81eb + +I=300 +KEY=2fd3f6fc5c856359ab96d938998a6287ec082e79cb69d84803a51ed7fc848e21 +PT=49af1a2cd93204ce25c25952e1ec81eb +CT=9578e0111bd2efb90b3808062fa3a54f + +I=301 +KEY=baab16ed47578ce0a0aed13eb629c7c83b5ae5f7407df63419bb8af30a7780d7 +PT=9578e0111bd2efb90b3808062fa3a54f +CT=81583da5a9373daf96be9c89082469e9 + +I=302 +KEY=3bf32b48ee60b14f36104db7be0dae218dff18f5576b26904840b97b6d584b90 +PT=81583da5a9373daf96be9c89082469e9 +CT=9394a35e7db2dfcbcc7c07bcd54b1838 + +I=303 +KEY=a867881693d26e84fa6c4a0b6b46b6196004593e568516dbe9c3d67c6f6ad5ba +PT=9394a35e7db2dfcbcc7c07bcd54b1838 +CT=f8f59fe73b7cb55cc905d10835033654 + +I=304 +KEY=509217f1a8aedbd833699b035e45804d7402f02263662fd103db90d87e47e0bc +PT=f8f59fe73b7cb55cc905d10835033654 +CT=65c753afee1f1985dd40ec74654fbd15 + +I=305 +KEY=3555445e46b1c25dee2977773b0a3d588e4294decdf632d4da60079733feef9a +PT=65c753afee1f1985dd40ec74654fbd15 +CT=61b77bfca90ea9a3ffbde3fe4ea29d5e + +I=306 +KEY=54e23fa2efbf6bfe1194948975a8a0062ea4de464abb7eae9ce250dcbe709b20 +PT=61b77bfca90ea9a3ffbde3fe4ea29d5e +CT=216800b8935b7c6f617dbb6f2207084f + +I=307 +KEY=758a3f1a7ce4179170e92fe657afa84912d62380a7d6912b70b399b9ce8ce530 +PT=216800b8935b7c6f617dbb6f2207084f +CT=013a4e0093741a94c2970d40dbda1b77 + +I=308 +KEY=74b0711aef900d05b27e22a68c75b33e98030bd3e649c88fdd1b0e79d1d2b362 +PT=013a4e0093741a94c2970d40dbda1b77 +CT=f67a51a33fe9f610cbd5cb0f4097af87 + +I=309 +KEY=82ca20b9d079fb1579abe9a9cce21cb94b7236f38044991328e628a65bf70f22 +PT=f67a51a33fe9f610cbd5cb0f4097af87 +CT=b376c98c344f0a29a1c58a5078bd83a1 + +I=310 +KEY=31bce935e436f13cd86e63f9b45f9f1805fd684fc2d4ed7003efe093cdf0566a +PT=b376c98c344f0a29a1c58a5078bd83a1 +CT=dfb141ab44db37500fa4ed97ba1c8ff7 + +I=311 +KEY=ee0da89ea0edc66cd7ca8e6e0e4310ef6d7429f7261dc4853d2bb514803b0bd0 +PT=dfb141ab44db37500fa4ed97ba1c8ff7 +CT=53f8b416e6fbac6ab6cfb427f60be3bc + +I=312 +KEY=bdf51c8846166a0661053a49f848f353d6d01d18c4f4efb5db3b64b57ad14c73 +PT=53f8b416e6fbac6ab6cfb427f60be3bc +CT=991301040233883d7484115f1a80e016 + +I=313 +KEY=24e61d8c4425e23b15812b16e2c81345850f3a001c438414cf30efef60334388 +PT=991301040233883d7484115f1a80e016 +CT=647c5f7de6a67b4cc21c29a420041b56 + +I=314 +KEY=409a42f1a2839977d79d02b2c2cc08130564d071a57d34ce06447a36aa345da4 +PT=647c5f7de6a67b4cc21c29a420041b56 +CT=732efa1eb54dc106c6918952e11184fe + +I=315 +KEY=33b4b8ef17ce5871110c8be023dd8ced67339144a7955bdcc32bb7286bb576e7 +PT=732efa1eb54dc106c6918952e11184fe +CT=16b199fabb2f6f077a9eeb511343f5ec + +I=316 +KEY=25052115ace137766b9260b1309e7901b826dafb6623c8a19bd5c22a56bc63fd +PT=16b199fabb2f6f077a9eeb511343f5ec +CT=cda74cb0d65a56a02ebe406b11b4ae10 + +I=317 +KEY=e8a26da57abb61d6452c20da212ad711e5a4191d791c19fb1394ee5299dc91be +PT=cda74cb0d65a56a02ebe406b11b4ae10 +CT=b0b1cdb28f8281db99095da4634c1818 + +I=318 +KEY=5813a017f539e00ddc257d7e4266cf098cff8fd6e61d0792ce4a8e0ade451ccb +PT=b0b1cdb28f8281db99095da4634c1818 +CT=d576a1a030c78d0f785eca0cca07fef8 + +I=319 +KEY=8d6501b7c5fe6d02a47bb772886131f1337885e170dc4da2259778c5078400c5 +PT=d576a1a030c78d0f785eca0cca07fef8 +CT=5979788809e0d89ee7391c93d2db5638 + +I=320 +KEY=d41c793fcc1eb59c4342abe15aba67c96d37f0299e58a6a957f260fd7f1f699d +PT=5979788809e0d89ee7391c93d2db5638 +CT=1cf868aca60b7b511a7cdb88fd0bf04b + +I=321 +KEY=c8e411936a15cecd593e7069a7b1978207a46dc61387ba26322a6a84d7dbed92 +PT=1cf868aca60b7b511a7cdb88fd0bf04b +CT=8d62cf754b663b32a2529d0220b99a48 + +I=322 +KEY=4586dee62173f5fffb6ced6b87080dcaa74f69250f45bf0ea81218baf057f6e8 +PT=8d62cf754b663b32a2529d0220b99a48 +CT=1d5842c6e7cce2709ba29a3227e3f860 + +I=323 +KEY=58de9c20c6bf178f60ce7759a0ebf5aafbfd110d74e683b4348d84329a7f10ce +PT=1d5842c6e7cce2709ba29a3227e3f860 +CT=ba958bb5cc6ad16f2820b23395f0942b + +I=324 +KEY=e24b17950ad5c6e048eec56a351b6181000530b730660be25a6bd0764b021760 +PT=ba958bb5cc6ad16f2820b23395f0942b +CT=6986065aa25054a7d06912e5905474fe + +I=325 +KEY=8bcd11cfa88592479887d78fa54f157f0c66f84f343d332148285636c30da218 +PT=6986065aa25054a7d06912e5905474fe +CT=0ea081d618ae77c0fd2ee448419ec224 + +I=326 +KEY=856d9019b02be58765a933c7e4d1d75b0656468eca7b4030d877c03e0d089f41 +PT=0ea081d618ae77c0fd2ee448419ec224 +CT=e05eedbb4567efbe3e146b216ab79431 + +I=327 +KEY=65337da2f54c0a395bbd58e68e66436a7f0637626fd9835cb351a02f5c3ce3bc +PT=e05eedbb4567efbe3e146b216ab79431 +CT=bb0d16ce08581dca44763320b8191fbe + +I=328 +KEY=de3e6b6cfd1417f31fcb6bc6367f5cd4d7eeb990b854076e0bbb8f3ce9e3ae2c +PT=bb0d16ce08581dca44763320b8191fbe +CT=5fad21cacfb0a39b970b7c7a8f0018a4 + +I=329 +KEY=81934aa632a4b46888c017bcb97f4470769521e9ac670254d470645faaef1c00 +PT=5fad21cacfb0a39b970b7c7a8f0018a4 +CT=fcae3ee9928945ec11b5c23cca81a590 + +I=330 +KEY=7d3d744fa02df1849975d58073fee1e0c49592ec481bee84ae2166cc9e5364b1 +PT=fcae3ee9928945ec11b5c23cca81a590 +CT=78f8970c21fecc1c1353d5ac303a7e30 + +I=331 +KEY=05c5e34381d33d988a26002c43c49fd0a3f2153ff979af5e3e2e1c6f334f59f9 +PT=78f8970c21fecc1c1353d5ac303a7e30 +CT=65f32a1744626c17f5f9ec4106fdf112 + +I=332 +KEY=6036c954c5b1518f7fdfec6d45396ec29afdcb7999f8b8bd2a089f286f9fa256 +PT=65f32a1744626c17f5f9ec4106fdf112 +CT=5a48bd5a8e7a0a891992e0645ec601da + +I=333 +KEY=3a7e740e4bcb5b06664d0c091bff6f1888471ea8c77f0bdfd679936cee3e073c +PT=5a48bd5a8e7a0a891992e0645ec601da +CT=997e678e21242ebdc762a15b0185a9ff + +I=334 +KEY=a30013806aef75bba12fad521a7ac6e7cfc8ac91a40902988bd869ab57a0ab67 +PT=997e678e21242ebdc762a15b0185a9ff +CT=8fd42dc3dcb9c2e540ed0f4b0551efed + +I=335 +KEY=2cd43e43b656b75ee1c2a2191f2b290ae79bb07c16b56a4681ee08981394e873 +PT=8fd42dc3dcb9c2e540ed0f4b0551efed +CT=0b962c8ebdaf7d64fb3f272fa20dcc1d + +I=336 +KEY=274212cd0bf9ca3a1afd8536bd26e5175015fc558cf1579986f399a8d7b56f07 +PT=0b962c8ebdaf7d64fb3f272fa20dcc1d +CT=2ecf634f373d09c802d2fa87ac5aa960 + +I=337 +KEY=098d71823cc4c3f2182f7fb1117c4c777c6018409decb134eac57c137200701e +PT=2ecf634f373d09c802d2fa87ac5aa960 +CT=f1f383c8ec7708996cbcff62b76a76d4 + +I=338 +KEY=f87ef24ad0b3cb6b749380d3a6163aa303f7d19be8c18bf190b6c69e1bfad509 +PT=f1f383c8ec7708996cbcff62b76a76d4 +CT=7aa9efc8aa4700805e525b63ab1768a6 + +I=339 +KEY=82d71d827af4cbeb2ac1dbb00d0152053be91fd704181f26c28a9a02b155504d +PT=7aa9efc8aa4700805e525b63ab1768a6 +CT=2e37e77fbfaa656e955177b4ea0b6bd5 + +I=340 +KEY=ace0fafdc55eae85bf90ac04e70a39d08dc6e8927108ed32640626d079351eb6 +PT=2e37e77fbfaa656e955177b4ea0b6bd5 +CT=f414d9e2c523f5e9c44c4049a4b602e7 + +I=341 +KEY=58f4231f007d5b6c7bdcec4d43bc3b3730dbe0d4e8fff4900e8af6374d8876eb +PT=f414d9e2c523f5e9c44c4049a4b602e7 +CT=f75e73c33546631ec5a081d8d1e55f61 + +I=342 +KEY=afaa50dc353b3872be7c6d95925964564f6908f158fb2e7206ec2c7cf28df83e +PT=f75e73c33546631ec5a081d8d1e55f61 +CT=aa6ef2930678811aa2c64ebc43c228fd + +I=343 +KEY=05c4a24f3343b9681cba2329d19b4cabeb47566beb0adb7adeb83e0ed19cb877 +PT=aa6ef2930678811aa2c64ebc43c228fd +CT=ab4a40b1dfdd20e7f528baf3a062eb85 + +I=344 +KEY=ae8ee2feec9e998fe99299da71f9a72e8cf079c36393d5f91b8d2925b23da159 +PT=ab4a40b1dfdd20e7f528baf3a062eb85 +CT=44aabe0aef83592c9077cae4a09e4802 + +I=345 +KEY=ea245cf4031dc0a379e5533ed167ef2c5f6ee9aa84f49f91d51a6d0ad7696e64 +PT=44aabe0aef83592c9077cae4a09e4802 +CT=afba8b63cfcc72e5cd6aed73b4cf2b0a + +I=346 +KEY=459ed797ccd1b246b48fbe4d65a8c426cb6c87f7c06dfb8f071a84ba63fe8279 +PT=afba8b63cfcc72e5cd6aed73b4cf2b0a +CT=7a5cb5ec01c723ef4bada9395a842d83 + +I=347 +KEY=3fc2627bcd1691a9ff2217743f2ce9a52ddc37de150bfa3e514bb3b482f1f016 +PT=7a5cb5ec01c723ef4bada9395a842d83 +CT=c3b77c4028df0c8359477a90f3dcad81 + +I=348 +KEY=fc751e3be5c99d2aa6656de4ccf0442412556a883f2dda5d6b556707db4483b9 +PT=c3b77c4028df0c8359477a90f3dcad81 +CT=07ad1ccf33d649e692e4498865f80761 + +I=349 +KEY=fbd802f4d61fd4cc3481246ca9084345bb032d42bf0e274f75976f91c0d052f8 +PT=07ad1ccf33d649e692e4498865f80761 +CT=39be8dfa7914ae166e412be68ab45249 + +I=350 +KEY=c2668f0eaf0b7ada5ac00f8a23bc110c32a6f9bfdd9d6839d91e3320ac1d73d9 +PT=39be8dfa7914ae166e412be68ab45249 +CT=e54b7e6fba526d40591cf76b89d65373 + +I=351 +KEY=272df1611559179a03dcf8e1aa6a427fad2556b26fb607622ae50e4b975d48de +PT=e54b7e6fba526d40591cf76b89d65373 +CT=e9c9ffbbe54b74d9103fad3251a75b22 + +I=352 +KEY=cee40edaf012634313e355d3fbcd195d9a80735160315fddbe90201f718e1abe +PT=e9c9ffbbe54b74d9103fad3251a75b22 +CT=148201d2aac05bdf41b12b2c076a609f + +I=353 +KEY=da660f085ad2389c52527efffca779c222d21806c5c7f51479a99d633aa1ac13 +PT=148201d2aac05bdf41b12b2c076a609f +CT=81d4ba0822cc17af0d3ef656bb6007cf + +I=354 +KEY=5bb2b500781e2f335f6c88a947c77e0d8fbb308bccf6501eea49044634086b0f +PT=81d4ba0822cc17af0d3ef656bb6007cf +CT=cb1ca3fe723c304b2a35b6a03b388c63 + +I=355 +KEY=90ae16fe0a221f7875593e097cfff26e334c3da3bcc9a22386dc70b27e632625 +PT=cb1ca3fe723c304b2a35b6a03b388c63 +CT=2d5c95e73c9b6319ddff7cecc5e58fd7 + +I=356 +KEY=bdf2831936b97c61a8a642e5b91a7db9227a5a39a57c6cfba306893da321e29d +PT=2d5c95e73c9b6319ddff7cecc5e58fd7 +CT=1e09bab779788cb88ec46afa4decddb1 + +I=357 +KEY=a3fb39ae4fc1f0d92662281ff4f6a0088ff285f5936aa7cf62d4940628492036 +PT=1e09bab779788cb88ec46afa4decddb1 +CT=5a2e0185ed0a3bcf0449feaafe12bae4 + +I=358 +KEY=f9d5382ba2cbcb16222bd6b50ae41aec55a3e7f3fd7c4884d825869670d5923c +PT=5a2e0185ed0a3bcf0449feaafe12bae4 +CT=2edd9eb6bf09d065c90551b2096350ca + +I=359 +KEY=d708a69d1dc21b73eb2e870703874a269d32728a26dee4e24a976884565ffb2e +PT=2edd9eb6bf09d065c90551b2096350ca +CT=2bae8f9327cd1826a9ef64f918723073 + +I=360 +KEY=fca6290e3a0f035542c1e3fe1bf57a55e195ca6d3cb3a03508eb402ca171cf24 +PT=2bae8f9327cd1826a9ef64f918723073 +CT=492b76bbb904701e5f6620693c455df3 + +I=361 +KEY=b58d5fb5830b734b1da7c39727b027a6ac54c38af96b0c99b34a48611b9276c3 +PT=492b76bbb904701e5f6620693c455df3 +CT=70185906be32d3f110d663fc0882072d + +I=362 +KEY=c59506b33d39a0ba0d71a06b2f32208b8d002cc1f3e7725279e62445b4659428 +PT=70185906be32d3f110d663fc0882072d +CT=5504ce475f166f794feb7f14e27766f8 + +I=363 +KEY=9091c8f4622fcfc3429adf7fcd454673fbf6ae3831ae4796dd96ed6aef2f9492 +PT=5504ce475f166f794feb7f14e27766f8 +CT=90449cc02763db30b09a8b483ab682f5 + +I=364 +KEY=00d55434454c14f3f2005437f7f3c486cf82b26d4ddaf69f7eb32eddf8ef6225 +PT=90449cc02763db30b09a8b483ab682f5 +CT=9456ced5c5ec9616e21510313f486bac + +I=365 +KEY=94839ae180a082e510154406c8bbaf2a832153785ce603339e89efbbfa62ddc8 +PT=9456ced5c5ec9616e21510313f486bac +CT=f8fa779ede94704d1612c80eaa3914bb + +I=366 +KEY=6c79ed7f5e34f2a806078c086282bb912e2a97414234899e7bae64e5ff82dbe3 +PT=f8fa779ede94704d1612c80eaa3914bb +CT=279675a5bffd200ba7768e668cc93a49 + +I=367 +KEY=4bef98dae1c9d2a3a171026eee4b81d859269f7a3368fdee859ad0ba7ce7db00 +PT=279675a5bffd200ba7768e668cc93a49 +CT=ef89fe2c859a3fab7b294823a75def19 + +I=368 +KEY=a46666f66453ed08da584a4d49166ec1d21c4e6ca881e3f768ae793de5540574 +PT=ef89fe2c859a3fab7b294823a75def19 +CT=a5f4cf11ed8b8db49acae8bbc20d9aa9 + +I=369 +KEY=0192a9e789d860bc4092a2f68b1bf46887307e5b62693639cdd893c3c697ac75 +PT=a5f4cf11ed8b8db49acae8bbc20d9aa9 +CT=1beda7dda6d8a9d681e8a828ec9cf7d0 + +I=370 +KEY=1a7f0e3a2f00c96ac17a0ade678703b81fc950ea210b67be7ac3d84a005ba57c +PT=1beda7dda6d8a9d681e8a828ec9cf7d0 +CT=6292de24b42bae086e13120dacc30a5f + +I=371 +KEY=78edd01e9b2b6762af6918d3cb4409e78e83a4024d7c6bdb1340f1d5894e4173 +PT=6292de24b42bae086e13120dacc30a5f +CT=33cbd5a6f0fec3a090dedd175f14f7d2 + +I=372 +KEY=4b2605b86bd5a4c23fb7c5c49450fe359c1c5bb789aae0820873c67ca47bb697 +PT=33cbd5a6f0fec3a090dedd175f14f7d2 +CT=356a8fbbe3bb929c4fafb9f6204189dc + +I=373 +KEY=7e4c8a03886e365e70187c32b41177e96694d007e4226dc130a3f307135331e3 +PT=356a8fbbe3bb929c4fafb9f6204189dc +CT=a1c9d464ce544225e2c11f9beea27174 + +I=374 +KEY=df855e67463a747b92d963a95ab3069dbf71b5c3aa59cfb6d1959a291350524c +PT=a1c9d464ce544225e2c11f9beea27174 +CT=0ed64fd51a25f58358cc77d04c4432bc + +I=375 +KEY=d15311b25c1f81f8ca15147916f734211001148af79803f58655be34e17a9e41 +PT=0ed64fd51a25f58358cc77d04c4432bc +CT=5fa8c745dccac2ba0c68b88aea94a76e + +I=376 +KEY=8efbd6f780d54342c67dacf3fc63934f7c13ee8522c5ebd64dd713295194b337 +PT=5fa8c745dccac2ba0c68b88aea94a76e +CT=f56bcf076ea6adfbbb1fe8a81f643196 + +I=377 +KEY=7b9019f0ee73eeb97d62445be307a2d949f55c09f37827128578be424ec31f65 +PT=f56bcf076ea6adfbbb1fe8a81f643196 +CT=841e8bb17f24ddb4ac852d73f6dd8401 + +I=378 +KEY=ff8e92419157330dd1e7692815da26d88b18124adc65223ee6fb349d018acb71 +PT=841e8bb17f24ddb4ac852d73f6dd8401 +CT=a823a09e162a2bd92c3994670e7c75c5 + +I=379 +KEY=57ad32df877d18d4fddefd4f1ba6531d1f3eb1c77c851c5a44e2e20c2b3ea6fc +PT=a823a09e162a2bd92c3994670e7c75c5 +CT=9acb428066b282ed5e3158ca1b6f24b4 + +I=380 +KEY=cd66705fe1cf9a39a3efa58500c977a902158a9639809c880c5f584878773780 +PT=9acb428066b282ed5e3158ca1b6f24b4 +CT=f386ac5bb8ee37118bf4a71d13d4beca + +I=381 +KEY=3ee0dc045921ad28281b0298131dc9638339ad6e46975a1a672cc93784eb31dd +PT=f386ac5bb8ee37118bf4a71d13d4beca +CT=a24c3c8acb59b268d16a6ca1848525f0 + +I=382 +KEY=9cace08e92781f40f9716e399798ec937a29cb1f506bf385f16648798df94313 +PT=a24c3c8acb59b268d16a6ca1848525f0 +CT=c6b950baf41d9cc4b4292ac8e01af0cc + +I=383 +KEY=5a15b034666583844d5844f177821c5f552f103ad76bad085ee453e9ae6efc6d +PT=c6b950baf41d9cc4b4292ac8e01af0cc +CT=c9f0e86d40b1cd620818a38b68512f68 + +I=384 +KEY=93e5585926d44ee64540e77a1fd33337fd1ac5844f5d4527b8884d785151b5cc +PT=c9f0e86d40b1cd620818a38b68512f68 +CT=e78cd32d5532b74590d23c46dd235daa + +I=385 +KEY=74698b7473e6f9a3d592db3cc2f06e9d04c2fedc31fb8dc05e8c2588e6f8c37a +PT=e78cd32d5532b74590d23c46dd235daa +CT=a269ecae359ee5368232430fbae47f84 + +I=386 +KEY=d60067da46781c9557a0983378141119ea48cef13bb270700616c0a29f08822c +PT=a269ecae359ee5368232430fbae47f84 +CT=0d87950d2221b2476e5dd281e48cee78 + +I=387 +KEY=db87f2d76459aed239fd4ab29c98ff613363709056560c323c440e4702d86846 +PT=0d87950d2221b2476e5dd281e48cee78 +CT=2c5dd3a62a3b57bb70296098e4c4f202 + +I=388 +KEY=f7da21714e62f96949d42a2a785c0d639df374f5a46157ef1f5de405ed5addb7 +PT=2c5dd3a62a3b57bb70296098e4c4f202 +CT=099d067b977c9333b999f22e0804f5ff + +I=389 +KEY=fe47270ad91e6a5af04dd8047058f89c4a97750300d3fe9dd0c198ec0965c324 +PT=099d067b977c9333b999f22e0804f5ff +CT=84e1d72641f8224d26c55a5554046412 + +I=390 +KEY=7aa6f02c98e64817d6888251245c9c8e6ab63a034dbc3cbe136987072eb6479c +PT=84e1d72641f8224d26c55a5554046412 +CT=ac16fee8ee9c01058664f6f2ecccffe8 + +I=391 +KEY=d6b00ec4767a491250ec74a3c89063660332d1badd39d92c7a0fbe65196f01b4 +PT=ac16fee8ee9c01058664f6f2ecccffe8 +CT=e33e5fe9b332035441a5ce66fb4a1e4e + +I=392 +KEY=358e512dc5484a461149bac533da7d2816236e093bd767cd38fec5937eb415da +PT=e33e5fe9b332035441a5ce66fb4a1e4e +CT=2a453baea8389046e3f6fdc8979c6951 + +I=393 +KEY=1fcb6a836d70da00f2bf470da446147979f67cc8dcfcd53b76c4106de59b17d0 +PT=2a453baea8389046e3f6fdc8979c6951 +CT=b5fc033918a4ba5dab5fa3eec06ebcd6 + +I=394 +KEY=aa3769ba75d4605d59e0e4e36428a8afc9f57c321612a862cfded2929078ea57 +PT=b5fc033918a4ba5dab5fa3eec06ebcd6 +CT=008f4acbb4523284d4a98a5afec607e4 + +I=395 +KEY=aab82371c18652d98d496eb99aeeaf4b12e39aaa9a0bb569fa3219656e7a1b43 +PT=008f4acbb4523284d4a98a5afec607e4 +CT=1fb27b01fc7f85c5150890bf538b33e1 + +I=396 +KEY=b50a58703df9d71c9841fe06c9659caa282cf8d8170abd5785c222e7146b0f90 +PT=1fb27b01fc7f85c5150890bf538b33e1 +CT=2b790bb52acac2715e7b7e78c2010940 + +I=397 +KEY=9e7353c51733156dc63a807e0b6495ea2ff760f7e65bc859b692d4cdb1bb8b0b +PT=2b790bb52acac2715e7b7e78c2010940 +CT=403e1263eb5cce8f76fe8ab09e48dc39 + +I=398 +KEY=de4d41a6fc6fdbe2b0c40ace952c49d37626c1e0ec4186f9657d5abf51abfb6d +PT=403e1263eb5cce8f76fe8ab09e48dc39 +CT=2616add8c1ca8db1fecd93ed604e4ef3 + +I=399 +KEY=f85bec7e3da556534e099923f5620720dcab50ec752ca0f75e325ade1b403f10 +PT=2616add8c1ca8db1fecd93ed604e4ef3 +CT=f91b76a583320059eb8ece9797eeee90 + + + + + + + + + + + + + diff -urN lin.2.2.17/crypto/testing/test.sha1 int.2.2.17.x/crypto/testing/test.sha1 --- lin.2.2.17/crypto/testing/test.sha1 Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/test.sha1 Sat Oct 14 00:48:17 2000 @@ -0,0 +1,10 @@ + + +Test Vectors (from FIPS PUB 180-1) +"abc" + A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D +"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 +A million repetitions of "a" + 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F + diff -urN lin.2.2.17/crypto/testing/test_blowfish.c int.2.2.17.x/crypto/testing/test_blowfish.c --- lin.2.2.17/crypto/testing/test_blowfish.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/test_blowfish.c Sat Oct 14 00:48:24 2000 @@ -0,0 +1,58 @@ +/* + * crypto/testing/test_blowfish.c + * + * Written by Raimar Falke 1998-12-17 + * Copied from speed.c. + * + * Copyright 1998 by Raimar Falke. Redistribution of this file + * is permitted under the GNU Public License. + */ + +#define __KERNEL__ + +#define printk printk_dummy + +#include + +#undef memcpy +#undef memset +#undef printk + +#include "libcfuncs.h" +#include "misc.h" + +#define u32 unsigned int + +int main() +{ + struct cipher_implementation *ci; + struct cipher_context *cx; + + unsigned char key1[]={0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00}; + u32 input1[2]={0x00000000, 0x00000000}; + u32 output1[2]; + + /* Register all ciphers */ + cryptoapi_init(); + + ci = find_cipher_by_id(CIPHER_BLOWFISH); + if (!ci) + { + PRINTF("Can't find blowfish\n"); + return 1; + } + + cx = (struct cipher_context *) malloc(sizeof(struct cipher_context)); + cx->ci = ci; + cx->keyinfo = (u32 *) malloc(ci->key_schedule_size); + ci->set_key(cx, key1, sizeof(key1)); + + ci->encrypt(cx,(u8 *)input1,(u8 *)output1,8); + dump_u32_buffer(output1,8); + + ci->decrypt(cx,(u8 *)output1,(u8 *)input1,8); + dump_u32_buffer(input1,8); + + return 0; +} + diff -urN lin.2.2.17/crypto/testing/testapi.c int.2.2.17.x/crypto/testing/testapi.c --- lin.2.2.17/crypto/testing/testapi.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/testapi.c Sat Oct 14 00:57:21 2000 @@ -0,0 +1,129 @@ +/* + * crypto/testing/testapi.c + * + * Written by Alexander Kjeldaas 2000-10-08 + * + * Copyright 2000 by Alexander Kjeldaas. Redistribution of this file + * is permitted under the GNU Public License. + */ + +/* Regression tests for the kernel crypto API */ + +#define __KERNEL__ + +#define printk printk_dummy + +#include +#undef memcpy +#undef memset +#undef printk + +#include "libcfuncs.h" +#include "misc.h" + +u8 plaintext[32+64]; +u8 ciphertext[32+64]; +u8 testres[512]; +u8 key[512]; +int plaintextlen, ciphertextlen, keylen; + +static int test_fence(struct cipher_context *cx); +static void show_usage(); + + +int main(int argc, char **argv) +{ + const char *cipher = "aes-cbc"; + struct cipher_implementation *ci = NULL; + struct cipher_context *cx; + int arg, err; + int i; + + /* Register all ciphers */ + cryptoapi_init(); + + memset(plaintext, 0, sizeof(plaintext)); + memset(ciphertext, 0, sizeof(ciphertext)); + memset(testres, 0, sizeof(testres)); + memset(key, 0, sizeof(key)); + + while((arg = getopt(argc,argv,"hc:k:")) != EOF) { + switch(arg) { + case 'h': + show_usage(); + break; + case 'c': + cipher = strdup(optarg); + if (!(ci = find_cipher_by_name(cipher))) { + PRINTF("no cipher by that name (%s)\n", optarg); + exit(1); + } + break; + } + } + if (!ci && !(ci = find_cipher_by_name(cipher))) { + PRINTF("no cipher by that name (%s)\n", cipher); + exit(1); + } + cx = (struct cipher_context *) malloc(sizeof(struct cipher_context)); + cx->ci = ci; + cx->keyinfo = (u32 *) malloc(ci->key_schedule_size); + make_random_buf(key, sizeof(key)); + if ((err = ci->set_key(cx, (char *)key, 128/8))) { + PRINTF("set_key returned error %d\n", err); + exit(1); + } + err = 0; + for (i = 0; i < 100; i++) { + err = err | test_fence(cx); + } + PRINTF("[%s] Fencepost tests\n", err ? "FAIL" : " OK "); + return 0; +} + +static int test_fence(struct cipher_context *cx) +{ + /* Test that a cipher fills whatever buffer we ask it to fill, + but that it doesn't touch anything else. We have a fence + consisting of 16 bytes at the beginning of the output + buffer, and 16 bytes at the end of the output buffer */ + int enclen = rand() % (sizeof(ciphertext) - 32); + u8 fence[] = {0, 0xff}; + int i, j, err=0; + make_random_buf(ciphertext, sizeof(ciphertext)); + /* Check a few times to avoid false positives */ + for (i = 0; i < sizeof(fence); i++) { + memset(plaintext, fence[i], sizeof(plaintext)); + cx->ci->decrypt(cx, ciphertext, plaintext+16, enclen); + for (j = 0; j < 16; j++) { + if (plaintext[j] != fence[i]) { + PRINTF("fencepost error at beginning of buf" + " idx: %u, cont:%x, not %x, encl:%d\n", + j, plaintext[j], fence[i], enclen); + err++; + break; + } + if (plaintext[16+enclen+j] != fence[i]) { + PRINTF("fencepost error at end of buf" + " idx: %d, cont:%x, not %x, encl:%d\n", + j, plaintext[16+enclen+j], fence[i], + enclen); + dump_u8_buffer(plaintext+16, enclen+16); + err++; + break; + } + } + } + if (err == 1) { + PRINTF("fencepost errors reported are probably false " + "positives\n"); + } + return err; +} + +void show_usage() +{ + printf("Usage: testapi [-h] -c \n"); + exit(1); +} + diff -urN lin.2.2.17/crypto/testing/testcip.c int.2.2.17.x/crypto/testing/testcip.c --- lin.2.2.17/crypto/testing/testcip.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/testcip.c Mon Oct 16 18:28:27 2000 @@ -0,0 +1,130 @@ +/* + * crypto/testing/testcip.c + * + * Written by Alexander Kjeldaas 1998-12-17 + * + * Copyright 1998 by Alexander Kjeldaas. Redistribution of this file + * is permitted under the GNU Public License. + */ + +#define __KERNEL__ + +#define printk printk_dummy + +#include +#undef memcpy +#undef memset +#undef printk + +#include "libcfuncs.h" +#include "misc.h" + +void show_usage(); + +int plaintext[512]; +int ciphertext[512]; +int testres[512]; +char key[512]; +int plaintextlen, ciphertextlen, keylen; + +int main(int argc, char **argv) +{ + struct cipher_implementation *ci = NULL; + struct cipher_context *cx; + int given_args = 0; + int arg, err; + int swap_to_processor = 0; + + /* Register all ciphers */ + cryptoapi_init(); + + memset(plaintext, 0, sizeof(plaintext)); + memset(ciphertext, 0, sizeof(ciphertext)); + memset(testres, 0, sizeof(testres)); + memset(key, 0, sizeof(key)); + + + + while((arg = getopt(argc,argv,"hp:e:c:k:s")) != EOF) { + switch(arg) { + case 'h': + show_usage(); + break; + case 'p': + plaintextlen = parsehex(optarg, (char *)&plaintext); + given_args |= 2; + break; + case 'e': + ciphertextlen = parsehex(optarg, (char *)&ciphertext); + given_args |= 4; + break; + case 'k': + keylen = parsehex(optarg, key); + given_args |= 8; + break; + case 'c': + if (!(ci = find_cipher_by_name(optarg))) { + PRINTF("no cipher by that name (%s)\n", optarg); + exit(1); + } + given_args |= 1; + break; + case 's': + swap_to_processor = 1; + break; + } + } + if (given_args != 15) + show_usage(); + if (ciphertextlen != plaintextlen) { + PRINTF("size of plaintext and ciphertext differ\n"); + exit(1); + } + + if (swap_to_processor) { + swab32_buf((char *)ciphertext, ciphertextlen); + } + + cx = (struct cipher_context *) malloc(sizeof(struct cipher_context)); + cx->ci = ci; + cx->keyinfo = (u32 *) malloc(ci->key_schedule_size); + if ((err = ci->set_key(cx, (char *)key, keylen))) { + PRINTF("set_key returned error %d\n", err); + exit(1); + } + if ((err = ci->encrypt(cx, (u8 *)plaintext, (u8 *)testres, + plaintextlen))) { + PRINTF("encrypt returned error %d\n", err); + } + + + if (memcmp(testres, ciphertext, ciphertextlen)) { + PRINTF("encrypted text and ciphertext differ\n"); + PRINTF("generated ciphertext (%d bytes):\n", ciphertextlen); + dump_buffer((char *)testres, ciphertextlen); + PRINTF("correct ciphertext (%d bytes):\n", ciphertextlen); + dump_buffer((char *)ciphertext, ciphertextlen); + } + + + if ((err = ci->decrypt(cx, (u8 *)ciphertext, (u8 *)testres, + ciphertextlen))) { + PRINTF("decrypt returned error %d\n", err); + } + if (memcmp(testres, plaintext, plaintextlen)) { + PRINTF("decrypted ciphertext and plaintext differ\n"); + PRINTF("generated plaintext (%d bytes):\n", plaintextlen); + dump_buffer((char *)testres, plaintextlen); + PRINTF("correct plaintext (%d bytes):\n", plaintextlen); + dump_buffer((char *)plaintext, plaintextlen); + } + return 0; +} + +void show_usage() +{ + printf("Usage: testcip [-h] -c -p -e <encryptedtext>\n"); + printf(" plaintext and encryptedtext are hex\n"); + exit(1); +} + diff -urN lin.2.2.17/crypto/testing/twofish_ecb_vk.txt int.2.2.17.x/crypto/testing/twofish_ecb_vk.txt --- lin.2.2.17/crypto/testing/twofish_ecb_vk.txt Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/testing/twofish_ecb_vk.txt Mon Oct 16 17:27:04 2000 @@ -0,0 +1,2335 @@ + +========================= + +FILENAME: "ecb_vk.txt" + +Electronic Codebook (ECB) Mode +Variable Key Known Answer Tests + +Algorithm Name: TWOFISH +Principal Submitter: Bruce Schneier, Counterpane Systems + +========== + +KEYSIZE=128 + +PT=00000000000000000000000000000000 + +I=1 +KEY=80000000000000000000000000000000 +CT=6BFD32804A1C3206C4BF85EB11241F89 + +I=2 +KEY=40000000000000000000000000000000 +CT=F097147AE851845984DC97D5FAE40CF9 + +I=3 +KEY=20000000000000000000000000000000 +CT=6117F1977C5ABD9647C56544D9458444 + +I=4 +KEY=10000000000000000000000000000000 +CT=75A6240AAE357DEDDF99936705618284 + +I=5 +KEY=08000000000000000000000000000000 +CT=F026BFDF6BFBC7E50C46C533BD271C24 + +I=6 +KEY=04000000000000000000000000000000 +CT=F3023228D77045D37D1B9CD77437395A + +I=7 +KEY=02000000000000000000000000000000 +CT=F67467BF6B490209809714D50679B2D7 + +I=8 +KEY=01000000000000000000000000000000 +CT=2C8431B922C5F560095E9867B1A41256 + +I=9 +KEY=00800000000000000000000000000000 +CT=1FB76E90D207BA4C770F67284D6B1359 + +I=10 +KEY=00400000000000000000000000000000 +CT=A70AECE1D41DCA9F24BCE8393F6D54BF + +I=11 +KEY=00200000000000000000000000000000 +CT=D4580FC395979689221C57A23598358B + +I=12 +KEY=00100000000000000000000000000000 +CT=35CA62BA8126F015FABFEF8F9119AE6B + +I=13 +KEY=00080000000000000000000000000000 +CT=C81FACB16E087EEFA823CF34E02FE482 + +I=14 +KEY=00040000000000000000000000000000 +CT=07400F04E4CC6625AE3FB41ECC863F2A + +I=15 +KEY=00020000000000000000000000000000 +CT=A0941008068D401DEAB6400C86CA53AD + +I=16 +KEY=00010000000000000000000000000000 +CT=2B63BEF50BA87A58BFFCA4CF44C22927 + +I=17 +KEY=00008000000000000000000000000000 +CT=FD49069AE9F1874A264A7BFD894ED886 + +I=18 +KEY=00004000000000000000000000000000 +CT=232755C754075BB5CC5B85ABFEA38779 + +I=19 +KEY=00002000000000000000000000000000 +CT=41358B9C76E959037E13F7E5050E0B42 + +I=20 +KEY=00001000000000000000000000000000 +CT=8978CD09C054BB1ABDFFBED09D1CF7EC + +I=21 +KEY=00000800000000000000000000000000 +CT=9F2A7CE5FD51FD5D7E2D42407EEF8F6A + +I=22 +KEY=00000400000000000000000000000000 +CT=6AA2F0627F312A77C68D1F15DF0E1379 + +I=23 +KEY=00000200000000000000000000000000 +CT=BCD56984E45DBF087BAC8757FC4EFF5A + +I=24 +KEY=00000100000000000000000000000000 +CT=9D3C6C8ED48C9DE7A64CD05D8BF41D54 + +I=25 +KEY=00000080000000000000000000000000 +CT=FCD577A23F455ACDE3732C262EBD2D86 + +I=26 +KEY=00000040000000000000000000000000 +CT=022E2430D81858888C9E575411D4064F + +I=27 +KEY=00000020000000000000000000000000 +CT=5742CA8CF1193491C1FBC148627D856E + +I=28 +KEY=00000010000000000000000000000000 +CT=88BD93610040DFE248C2FE05EF9F4FE0 + +I=29 +KEY=00000008000000000000000000000000 +CT=29A9D577BB3824209FEA64128247CE6C + +I=30 +KEY=00000004000000000000000000000000 +CT=AC4CDB534844EA86000B845FCDAD605F + +I=31 +KEY=00000002000000000000000000000000 +CT=AAC6098597D46B8145A60F40D4EC5308 + +I=32 +KEY=00000001000000000000000000000000 +CT=3A7DFD0855A5BE0B16CACBD685FACEF5 + +I=33 +KEY=00000000800000000000000000000000 +CT=ACEBA627EBA87AD051C3E0CA0DEF6CD7 + +I=34 +KEY=00000000400000000000000000000000 +CT=F0A55DCDBC513EFDD603EA455EB9228C + +I=35 +KEY=00000000200000000000000000000000 +CT=2176DEBC78D6B4A6D0FB37AFA6B51081 + +I=36 +KEY=00000000100000000000000000000000 +CT=FDB1B57379B85A85392613E8B4597B63 + +I=37 +KEY=00000000080000000000000000000000 +CT=58AB1112E0598586E07FC8359DDFC7EC + +I=38 +KEY=00000000040000000000000000000000 +CT=DD6D1D2629F333528CB66869453BC273 + +I=39 +KEY=00000000020000000000000000000000 +CT=932218D99553BB2D4BFC69F1EA67CAAE + +I=40 +KEY=00000000010000000000000000000000 +CT=399D066426F7FEF66F8983086DC044D8 + +I=41 +KEY=00000000008000000000000000000000 +CT=3E1BC58269B6B8C8C8D00806975F8337 + +I=42 +KEY=00000000004000000000000000000000 +CT=D50A1F966058C6D702D1AFCD700DA0E8 + +I=43 +KEY=00000000002000000000000000000000 +CT=6E7A6BB3554F12AD1F88C289D621CD0F + +I=44 +KEY=00000000001000000000000000000000 +CT=9ED4EA506A0CBA89B246C14D1B5B96A9 + +I=45 +KEY=00000000000800000000000000000000 +CT=C395A92C1A6884857B263F01F43542DB + +I=46 +KEY=00000000000400000000000000000000 +CT=06562AC497C60F802B68B47DB5B86B6A + +I=47 +KEY=00000000000200000000000000000000 +CT=255A726F2106177FEFA7006BDE05D059 + +I=48 +KEY=00000000000100000000000000000000 +CT=B8FD6A8227D0565A4C174AD270EC1205 + +I=49 +KEY=00000000000080000000000000000000 +CT=C2652FDB48B9DDBFC43B3F7CDD831D6F + +I=50 +KEY=00000000000040000000000000000000 +CT=913EB9205DB2E17A96A23A724EDF4C84 + +I=51 +KEY=00000000000020000000000000000000 +CT=9A6694FEB5EA44FF0572124FDB265658 + +I=52 +KEY=00000000000010000000000000000000 +CT=E347498DECA6B211C30E21FD0B47A333 + +I=53 +KEY=00000000000008000000000000000000 +CT=E70F0D4ED829A81E05D42E511EDE9376 + +I=54 +KEY=00000000000004000000000000000000 +CT=140BB7CAD8D6A3553BEF7A3D52347BD8 + +I=55 +KEY=00000000000002000000000000000000 +CT=5FA55360F440DCCA20925A3E15B42764 + +I=56 +KEY=00000000000001000000000000000000 +CT=6D5B969DFC3EA0A6682CC66488D221DA + +I=57 +KEY=00000000000000800000000000000000 +CT=E2799D5C380B49D2F6997009079D03D3 + +I=58 +KEY=00000000000000400000000000000000 +CT=06AFBD8077909E847AF467BB2D47E893 + +I=59 +KEY=00000000000000200000000000000000 +CT=46B1EB96EC9EB10897F1562E59287253 + +I=60 +KEY=00000000000000100000000000000000 +CT=1793F1D4E1A1606F99C7019C19E85129 + +I=61 +KEY=00000000000000080000000000000000 +CT=ED785D0BA19553CE73B69F4D570C3A9D + +I=62 +KEY=00000000000000040000000000000000 +CT=298DF7334670B7391BE203DF7E8890C7 + +I=63 +KEY=00000000000000020000000000000000 +CT=150C12DEF6EDC844B0B45361C2B3AECE + +I=64 +KEY=00000000000000010000000000000000 +CT=06FFB5E13438BA8DBD8A3EDADFAC73A1 + +I=65 +KEY=00000000000000008000000000000000 +CT=6C5E5719D5F31E929FF9C44F086EFADB + +I=66 +KEY=00000000000000004000000000000000 +CT=4C8D0E13996F4D32CB7984B7BB1B34FB + +I=67 +KEY=00000000000000002000000000000000 +CT=C9BDCFFD4B9F3BBBB33A2D2C51BA83F6 + +I=68 +KEY=00000000000000001000000000000000 +CT=929B29DD0D952161FFDA8CB417B166EC + +I=69 +KEY=00000000000000000800000000000000 +CT=87F9DFCB07275916E7A446D3DCE74232 + +I=70 +KEY=00000000000000000400000000000000 +CT=6FDFD0BC8F49BE420CD68A894C7CA4E9 + +I=71 +KEY=00000000000000000200000000000000 +CT=CDDC09DE42DC2CBCD9287A2072A30D23 + +I=72 +KEY=00000000000000000100000000000000 +CT=9B2FF668BA9D77AD1E9F30BA0173EBD4 + +I=73 +KEY=00000000000000000080000000000000 +CT=DEF29890D59A511B32A30322D7471E38 + +I=74 +KEY=00000000000000000040000000000000 +CT=5094EAEC9F23D0DBFAB8240A42ED5BF1 + +I=75 +KEY=00000000000000000020000000000000 +CT=79CB87BC375F58DE8DA780B9BAD3DEA3 + +I=76 +KEY=00000000000000000010000000000000 +CT=7139B3D980B85D3B77A3BBDB6CB79756 + +I=77 +KEY=00000000000000000008000000000000 +CT=148ED6E8FEC02168377C96956AE18D93 + +I=78 +KEY=00000000000000000004000000000000 +CT=0AFED5A710F2BF11C77F152951AE32CB + +I=79 +KEY=00000000000000000002000000000000 +CT=C265AC354817550FAE12A51C2DCD749C + +I=80 +KEY=00000000000000000001000000000000 +CT=A3B089F79D0A07EA0893BB48D508B35B + +I=81 +KEY=00000000000000000000800000000000 +CT=C0A7B6BCE0675A48E95D39A7659CB20A + +I=82 +KEY=00000000000000000000400000000000 +CT=6CE0A0BA02041CB5E6C0A46DE1B71A43 + +I=83 +KEY=00000000000000000000200000000000 +CT=E54045C33A386555C5754ADB0A181244 + +I=84 +KEY=00000000000000000000100000000000 +CT=BB652196955BB7BE7E8CB8E2E992A750 + +I=85 +KEY=00000000000000000000080000000000 +CT=594B2917DE6119B62BE3DDF10A1A47E0 + +I=86 +KEY=00000000000000000000040000000000 +CT=E8B4F95053617F6A10120DB196AAC4D1 + +I=87 +KEY=00000000000000000000020000000000 +CT=79646B1CC19708973215B9891A2C1019 + +I=88 +KEY=00000000000000000000010000000000 +CT=5E7E6175F6B548E5389C1B1C391CBEE2 + +I=89 +KEY=00000000000000000000008000000000 +CT=C0860A7B47544872B9DB5C220088DE5C + +I=90 +KEY=00000000000000000000004000000000 +CT=325163F073E5A27EBAF339B1FA53682D + +I=91 +KEY=00000000000000000000002000000000 +CT=1A0C4583CEFF5810F3AB42A471415A1D + +I=92 +KEY=00000000000000000000001000000000 +CT=F8DDF239D19363957C7C8C9B537893FA + +I=93 +KEY=00000000000000000000000800000000 +CT=D3B9999669509564741F236EEF2401F3 + +I=94 +KEY=00000000000000000000000400000000 +CT=3376DA406D82B76591B610C6C9FC3F9E + +I=95 +KEY=00000000000000000000000200000000 +CT=B6AD728D2970637642723FF06204EEAD + +I=96 +KEY=00000000000000000000000100000000 +CT=0ADF4A82FFE602BC13002AA8AB24EA71 + +I=97 +KEY=00000000000000000000000080000000 +CT=D80D1378E30036D92B4A359F68D0CBFE + +I=98 +KEY=00000000000000000000000040000000 +CT=EDA13B315897290E4ACEB4B513E9749B + +I=99 +KEY=00000000000000000000000020000000 +CT=34589936B79E4F43260DC6CCD1820D6D + +I=100 +KEY=00000000000000000000000010000000 +CT=C7A8FF65CD38D008EC6745897E010122 + +I=101 +KEY=00000000000000000000000008000000 +CT=3AFE23D89E79E9F8A54F103ED51EB14D + +I=102 +KEY=00000000000000000000000004000000 +CT=27994D1AA909806C7CC8E4AC4CD5479B + +I=103 +KEY=00000000000000000000000002000000 +CT=610D5528725B34FD70ADC66E83BAE266 + +I=104 +KEY=00000000000000000000000001000000 +CT=3A3064DFF6E0B54D864E81FA76270065 + +I=105 +KEY=00000000000000000000000000800000 +CT=5E9B5966ED3A2358005C9773F8690AD9 + +I=106 +KEY=00000000000000000000000000400000 +CT=713738F580CED6E358D2CDCEDA64F99F + +I=107 +KEY=00000000000000000000000000200000 +CT=EC7FE3578906291B2DCF0AD7FF8B5358 + +I=108 +KEY=00000000000000000000000000100000 +CT=0F714C096C244BED865A9E064576FE5D + +I=109 +KEY=00000000000000000000000000080000 +CT=B7C226C60B6F3031A1E2160823A62679 + +I=110 +KEY=00000000000000000000000000040000 +CT=5C78C4BC8F15DC964FE9EC75203AD7D8 + +I=111 +KEY=00000000000000000000000000020000 +CT=178FB7443FBD17DCF1AF122D4D117239 + +I=112 +KEY=00000000000000000000000000010000 +CT=C55C99851BD135155A080A9C4E54B919 + +I=113 +KEY=00000000000000000000000000008000 +CT=AD75C80D72EA278B3EDE380DAAB1F708 + +I=114 +KEY=00000000000000000000000000004000 +CT=95054D1ECA74F75515AE8C17941D3A54 + +I=115 +KEY=00000000000000000000000000002000 +CT=8E0B0D4F95C9C9D65420B4B1869A1D3E + +I=116 +KEY=00000000000000000000000000001000 +CT=7712EA2F0598CC8CFB9A934DEC848B5F + +I=117 +KEY=00000000000000000000000000000800 +CT=9D730E0F7450183C0804D6817CBE058E + +I=118 +KEY=00000000000000000000000000000400 +CT=3FA52E9B242F9AF61322FBB6BA583A01 + +I=119 +KEY=00000000000000000000000000000200 +CT=3D47D74F667D60458188922EE8D8A7A0 + +I=120 +KEY=00000000000000000000000000000100 +CT=036B4E4E02D84C56AC61007DAC33EC33 + +I=121 +KEY=00000000000000000000000000000080 +CT=4E171141E51234DE6E4B236643A6DC85 + +I=122 +KEY=00000000000000000000000000000040 +CT=DB720E7B04462829DFA258ED9E7C7F2F + +I=123 +KEY=00000000000000000000000000000020 +CT=8B10E11115FF4336DE57F2EA13AABBFA + +I=124 +KEY=00000000000000000000000000000010 +CT=F0E35BFF226C064E08368AF440298DB9 + +I=125 +KEY=00000000000000000000000000000008 +CT=6C4C8811B4DF74F2A7D7F79A6253CEA7 + +I=126 +KEY=00000000000000000000000000000004 +CT=7DD12AD3BC7A419F92753D8CC39637F0 + +I=127 +KEY=00000000000000000000000000000002 +CT=A465B01EA32B2F4F87C85FD06F9B0A02 + +I=128 +KEY=00000000000000000000000000000001 +CT=8DC902DDAE09F52B1A3A77EE89C1441E + +========== + +KEYSIZE=192 + +PT=00000000000000000000000000000000 + +I=1 +KEY=800000000000000000000000000000000000000000000000 +CT=B5AED133641004F4121B66E7DB8F2FF0 + +I=2 +KEY=400000000000000000000000000000000000000000000000 +CT=998110F200555A32C6C123E66CF87DE9 + +I=3 +KEY=200000000000000000000000000000000000000000000000 +CT=2DBAEEEC682DCC957C2D51B0990E123A + +I=4 +KEY=100000000000000000000000000000000000000000000000 +CT=BAEC0A31F6557D6D13B888A94F63058C + +I=5 +KEY=080000000000000000000000000000000000000000000000 +CT=E51ADC9773E785730586E6812A0F0FA5 + +I=6 +KEY=040000000000000000000000000000000000000000000000 +CT=97067E60FE010AEEA48C0D3224AD0941 + +I=7 +KEY=020000000000000000000000000000000000000000000000 +CT=BB73A7C859E6377A5E42EFCD55CD2C5B + +I=8 +KEY=010000000000000000000000000000000000000000000000 +CT=914BFE25D7FDEE49B46FB5C2B60DACA5 + +I=9 +KEY=008000000000000000000000000000000000000000000000 +CT=EFEF0047892A043A1D594118477CA513 + +I=10 +KEY=004000000000000000000000000000000000000000000000 +CT=BE59CF7C4E4B482843E67B4EB65B3038 + +I=11 +KEY=002000000000000000000000000000000000000000000000 +CT=35FFC8038CB124B8078EC5C7C7928F14 + +I=12 +KEY=001000000000000000000000000000000000000000000000 +CT=086025FC1CC6056367304C51DE871DEA + +I=13 +KEY=000800000000000000000000000000000000000000000000 +CT=950F0B7BDFFC78AE3AFF022F78E1670E + +I=14 +KEY=000400000000000000000000000000000000000000000000 +CT=CADF4568B43C950FB688C6608AAF5FAE + +I=15 +KEY=000200000000000000000000000000000000000000000000 +CT=E2313E3CFCB5E745EBAB983BF2867579 + +I=16 +KEY=000100000000000000000000000000000000000000000000 +CT=B4394412F7B4A1A4A22B73C93BAFD85D + +I=17 +KEY=000080000000000000000000000000000000000000000000 +CT=C014C9A992E6366B3BD2EABDF1508187 + +I=18 +KEY=000040000000000000000000000000000000000000000000 +CT=4344D702AC78A5808F4AB566D5509B75 + +I=19 +KEY=000020000000000000000000000000000000000000000000 +CT=937893DA40E9D7F2ECE9028FAA4DE6A4 + +I=20 +KEY=000010000000000000000000000000000000000000000000 +CT=E77874759C6AACB611B715A52A37234A + +I=21 +KEY=000008000000000000000000000000000000000000000000 +CT=841FC7FC0EF6CE08CFC6056B3C557F23 + +I=22 +KEY=000004000000000000000000000000000000000000000000 +CT=6AC04A6988F1CE601E4C48241D42C1CF + +I=23 +KEY=000002000000000000000000000000000000000000000000 +CT=5254F42B5DD207461693C278B6ABC855 + +I=24 +KEY=000001000000000000000000000000000000000000000000 +CT=F58B1AE230B417541649CB035FB5231C + +I=25 +KEY=000000800000000000000000000000000000000000000000 +CT=5F015060D28C6CCB2E5FDCB5AFDCF309 + +I=26 +KEY=000000400000000000000000000000000000000000000000 +CT=B0DBAA257FEFFE48A688FE247D0460B7 + +I=27 +KEY=000000200000000000000000000000000000000000000000 +CT=1235DF200338F96E39E881484B6B11EE + +I=28 +KEY=000000100000000000000000000000000000000000000000 +CT=671D87102E35609B32F40A91A7E29E04 + +I=29 +KEY=000000080000000000000000000000000000000000000000 +CT=F01FB3FA3E84DEA6057F3D88CD651876 + +I=30 +KEY=000000040000000000000000000000000000000000000000 +CT=B96C1E40D0D407ED90D11892503A296F + +I=31 +KEY=000000020000000000000000000000000000000000000000 +CT=2E27350191DE6C2E9DCC51022A3C96CB + +I=32 +KEY=000000010000000000000000000000000000000000000000 +CT=BDD6CFE5D00E7F8D698143E653A0163B + +I=33 +KEY=000000008000000000000000000000000000000000000000 +CT=FEDABEF20F51910E57CF5ECEF878A8E1 + +I=34 +KEY=000000004000000000000000000000000000000000000000 +CT=EEBF9FE247A78C6FF2A91428C54D70DA + +I=35 +KEY=000000002000000000000000000000000000000000000000 +CT=41714E55E90E0E154802FBBFC0BF58C5 + +I=36 +KEY=000000001000000000000000000000000000000000000000 +CT=69480F26BC5DFF8F6D8A0F10E0959BF1 + +I=37 +KEY=000000000800000000000000000000000000000000000000 +CT=A39E4BE5A7E13BA3C48CFD98A52CFA70 + +I=38 +KEY=000000000400000000000000000000000000000000000000 +CT=95809A16888FB49F5053375A6533CD58 + +I=39 +KEY=000000000200000000000000000000000000000000000000 +CT=5F0DEF37FB14F956BB31703F1FC968EB + +I=40 +KEY=000000000100000000000000000000000000000000000000 +CT=CF0A28C9598D7BBCA6992238B03EF4EB + +I=41 +KEY=000000000080000000000000000000000000000000000000 +CT=7FF241BA32E6878542978957F137856F + +I=42 +KEY=000000000040000000000000000000000000000000000000 +CT=8D489E0496B54F91A0254E4103804145 + +I=43 +KEY=000000000020000000000000000000000000000000000000 +CT=9925949BE93F4A0BF4114CCA2E05B566 + +I=44 +KEY=000000000010000000000000000000000000000000000000 +CT=6ED9A5F014FAFAE3D05C4AE027066873 + +I=45 +KEY=000000000008000000000000000000000000000000000000 +CT=958453307A371EE2D3DA8DD327D9B51B + +I=46 +KEY=000000000004000000000000000000000000000000000000 +CT=1EE0680BF9A798A1C63636EA917B17B5 + +I=47 +KEY=000000000002000000000000000000000000000000000000 +CT=C0CEFB2475B21AA8937E3048604D9928 + +I=48 +KEY=000000000001000000000000000000000000000000000000 +CT=9034DDEFF43C9CC82FADE8DE0A2476BB + +I=49 +KEY=000000000000800000000000000000000000000000000000 +CT=09D32779D0C8D02E0670F377187756FC + +I=50 +KEY=000000000000400000000000000000000000000000000000 +CT=6557BDB19F03E62D823C0613BEA0FAFB + +I=51 +KEY=000000000000200000000000000000000000000000000000 +CT=83505664DED694967F2D9E7853BC4B43 + +I=52 +KEY=000000000000100000000000000000000000000000000000 +CT=0BBABE3B7F381C3B3D8A9D846D8CCEAC + +I=53 +KEY=000000000000080000000000000000000000000000000000 +CT=E3AA0A67CDF79DBAB013103E39E8C822 + +I=54 +KEY=000000000000040000000000000000000000000000000000 +CT=AF3D0C9B673C322355480E8681237D13 + +I=55 +KEY=000000000000020000000000000000000000000000000000 +CT=60D325226EC8DFB9E08DFADB479649A0 + +I=56 +KEY=000000000000010000000000000000000000000000000000 +CT=845B92A3C56880E8007B452B57B73B75 + +I=57 +KEY=000000000000008000000000000000000000000000000000 +CT=76C59CD9185C518D65EC641EB73C6387 + +I=58 +KEY=000000000000004000000000000000000000000000000000 +CT=735567D0B8A52203492220804F3D62E6 + +I=59 +KEY=000000000000002000000000000000000000000000000000 +CT=E74FB07622191A053368131DA36FC299 + +I=60 +KEY=000000000000001000000000000000000000000000000000 +CT=3CFF40E0E9A86F67D938D2483BDD08F0 + +I=61 +KEY=000000000000000800000000000000000000000000000000 +CT=7C502AE730F5A9ABEACB15240EA1E8F6 + +I=62 +KEY=000000000000000400000000000000000000000000000000 +CT=0B3CA10C02E24BA82261E65BE4413512 + +I=63 +KEY=000000000000000200000000000000000000000000000000 +CT=F7D50E95931755A98B143AE254090F9D + +I=64 +KEY=000000000000000100000000000000000000000000000000 +CT=A4E84B8A7B8CC3766307D66A9C6AECB9 + +I=65 +KEY=000000000000000080000000000000000000000000000000 +CT=5298367E93E9B9CB5CF402A8BA9EFC62 + +I=66 +KEY=000000000000000040000000000000000000000000000000 +CT=03D44830C40510CE7866FB86FAC6E1DC + +I=67 +KEY=000000000000000020000000000000000000000000000000 +CT=978E4BA4EEA6739B1769FF4389F0367E + +I=68 +KEY=000000000000000010000000000000000000000000000000 +CT=707EF1166D2F11FD1519B37FB00D23EB + +I=69 +KEY=000000000000000008000000000000000000000000000000 +CT=435088DBDD8646A7FCA8851CA2FA1FB5 + +I=70 +KEY=000000000000000004000000000000000000000000000000 +CT=F3DC32DD6931A302391F9B992A5B6122 + +I=71 +KEY=000000000000000002000000000000000000000000000000 +CT=D93286DD8A05432614FD03169F36ED15 + +I=72 +KEY=000000000000000001000000000000000000000000000000 +CT=59F83FEA4BC9B24BF69A98CA3959CEFC + +I=73 +KEY=000000000000000000800000000000000000000000000000 +CT=A689BC3A8DB36A22763E911370C9DE2B + +I=74 +KEY=000000000000000000400000000000000000000000000000 +CT=04EB5BA604BA64DD112BCAE830C27966 + +I=75 +KEY=000000000000000000200000000000000000000000000000 +CT=7EF653E2D804E80BD678C3A6CB222625 + +I=76 +KEY=000000000000000000100000000000000000000000000000 +CT=A94EC287E7F70C6503DC0B891920C622 + +I=77 +KEY=000000000000000000080000000000000000000000000000 +CT=8A78497E9D18A365599444C972359F0D + +I=78 +KEY=000000000000000000040000000000000000000000000000 +CT=2F1832E285C8D24F226B50CCD71FE46A + +I=79 +KEY=000000000000000000020000000000000000000000000000 +CT=0B6675F4BD4BD6951BB96AF62D3C9B96 + +I=80 +KEY=000000000000000000010000000000000000000000000000 +CT=D6DEDAAAECE52984A261155ED7AF5290 + +I=81 +KEY=000000000000000000008000000000000000000000000000 +CT=7600A0FCF96F24A21419103466B937B5 + +I=82 +KEY=000000000000000000004000000000000000000000000000 +CT=C3E359420C4C4AF445C470AB347B3667 + +I=83 +KEY=000000000000000000002000000000000000000000000000 +CT=D915133DAA11BECB43E020266B709BEC + +I=84 +KEY=000000000000000000001000000000000000000000000000 +CT=A0001FC4E31664ED8C375644D02717AE + +I=85 +KEY=000000000000000000000800000000000000000000000000 +CT=D8E96A3F240666FC02F31E84CD1CEEF1 + +I=86 +KEY=000000000000000000000400000000000000000000000000 +CT=DE0B6B80C40ED4447E36A84A62EB235D + +I=87 +KEY=000000000000000000000200000000000000000000000000 +CT=8B15F04C34FC0F35F96C86837665CB38 + +I=88 +KEY=000000000000000000000100000000000000000000000000 +CT=02DAE104DA462934D87FDC73EB4011A9 + +I=89 +KEY=000000000000000000000080000000000000000000000000 +CT=B1ECC134EB7221CE00EBB977E08020E2 + +I=90 +KEY=000000000000000000000040000000000000000000000000 +CT=9F13CC1BF91C1B49AB6DDD7AF7A05ABA + +I=91 +KEY=000000000000000000000020000000000000000000000000 +CT=414D1178475679525B5EE7ED373E2A0A + +I=92 +KEY=000000000000000000000010000000000000000000000000 +CT=E69F2CC70EF18DBD360DFDD5C6573EBD + +I=93 +KEY=000000000000000000000008000000000000000000000000 +CT=FA45D9E00E4C221A14C359742AC25C35 + +I=94 +KEY=000000000000000000000004000000000000000000000000 +CT=BC2AC98007820862150CC1B1E3E11ED1 + +I=95 +KEY=000000000000000000000002000000000000000000000000 +CT=C7CABAB4D7DFFD44C5943EB8E9441C3D + +I=96 +KEY=000000000000000000000001000000000000000000000000 +CT=6DA6716020FDE292E8ADFB2A31BC6B24 + +I=97 +KEY=000000000000000000000000800000000000000000000000 +CT=9516AE03F102950795E1869E07BE0AFB + +I=98 +KEY=000000000000000000000000400000000000000000000000 +CT=4748E60F70C6172E5D5B0C21E67F366C + +I=99 +KEY=000000000000000000000000200000000000000000000000 +CT=40C7CC6385BB634FB68F73CCB5C446C2 + +I=100 +KEY=000000000000000000000000100000000000000000000000 +CT=7F0CE574F643711ECFC5011C0BCCD49A + +I=101 +KEY=000000000000000000000000080000000000000000000000 +CT=2628849CC2C62FEB305A1287F24B9693 + +I=102 +KEY=000000000000000000000000040000000000000000000000 +CT=6E8C11B5EA12D40CE9F83693314BD836 + +I=103 +KEY=000000000000000000000000020000000000000000000000 +CT=503FCDFCCB2AEBEEE6FB59326D06745E + +I=104 +KEY=000000000000000000000000010000000000000000000000 +CT=69698FE789F29872F0A4116CD8714255 + +I=105 +KEY=000000000000000000000000008000000000000000000000 +CT=3072C09636828285E7135E92B04C3601 + +I=106 +KEY=000000000000000000000000004000000000000000000000 +CT=00C19303036D6D3227B9C7AF806BEBDD + +I=107 +KEY=000000000000000000000000002000000000000000000000 +CT=E6B06BC172CA8892C8A04D6717AB08CE + +I=108 +KEY=000000000000000000000000001000000000000000000000 +CT=F7F08E268646EF8B9D728D422195A88B + +I=109 +KEY=000000000000000000000000000800000000000000000000 +CT=E6C0BEE988E017E708FF1A1DCFE38FC8 + +I=110 +KEY=000000000000000000000000000400000000000000000000 +CT=33D0841FC04A6394056AC82D68DBFA02 + +I=111 +KEY=000000000000000000000000000200000000000000000000 +CT=066AF29F6138FE67D676925DBC375ED1 + +I=112 +KEY=000000000000000000000000000100000000000000000000 +CT=60E1109A80F56DBCBCAC75AF9EE3A982 + +I=113 +KEY=000000000000000000000000000080000000000000000000 +CT=84E692562A2DBE9452CDC7F5F7DCD4E6 + +I=114 +KEY=000000000000000000000000000040000000000000000000 +CT=DA5C0CB7DE7C2A9DEFC76348955FB51B + +I=115 +KEY=000000000000000000000000000020000000000000000000 +CT=26AC1CB6870A598585E211852F9C980A + +I=116 +KEY=000000000000000000000000000010000000000000000000 +CT=49776D30C4A10352FF0FBA170F09F275 + +I=117 +KEY=000000000000000000000000000008000000000000000000 +CT=D02E72C408A05C89F80C9EC450419FBF + +I=118 +KEY=000000000000000000000000000004000000000000000000 +CT=993D122B38640477385BBFC79177C212 + +I=119 +KEY=000000000000000000000000000002000000000000000000 +CT=1482C5D53BE2F16634C22B9294D6E10B + +I=120 +KEY=000000000000000000000000000001000000000000000000 +CT=4B9518E3188D68E20266DCAA5B26337F + +I=121 +KEY=000000000000000000000000000000800000000000000000 +CT=7D6C9C9F375EDDE4A23D83B8B62E198F + +I=122 +KEY=000000000000000000000000000000400000000000000000 +CT=FCCE30A6961099AD269080FF07A24E1E + +I=123 +KEY=000000000000000000000000000000200000000000000000 +CT=C822629D39268498E02E6E4D642E7921 + +I=124 +KEY=000000000000000000000000000000100000000000000000 +CT=B96890D4CC0BD3C41A14D0547F98E077 + +I=125 +KEY=000000000000000000000000000000080000000000000000 +CT=78665BAC269A5DB3FFE165526A42F688 + +I=126 +KEY=000000000000000000000000000000040000000000000000 +CT=5EB1E7293616CD444011950212E53E78 + +I=127 +KEY=000000000000000000000000000000020000000000000000 +CT=FD682F200B2D5D17D177E785EBCE6C08 + +I=128 +KEY=000000000000000000000000000000010000000000000000 +CT=EAAEEA26A8AE037C288DDA6791580418 + +I=129 +KEY=000000000000000000000000000000008000000000000000 +CT=AA525000B28A88169212096B6D5FF58D + +I=130 +KEY=000000000000000000000000000000004000000000000000 +CT=09C8F1F28B94167498D9377CB9909458 + +I=131 +KEY=000000000000000000000000000000002000000000000000 +CT=847E4FFAD40194940A0F7FA0E34739B4 + +I=132 +KEY=000000000000000000000000000000001000000000000000 +CT=50DCE06E775C1A6DDA24B2A926C9EF8E + +I=133 +KEY=000000000000000000000000000000000800000000000000 +CT=3896FB03AF06F69CFDDDFBFCDF8E10A7 + +I=134 +KEY=000000000000000000000000000000000400000000000000 +CT=FED04C2F49DB4BE1D7BC5E187FB1612B + +I=135 +KEY=000000000000000000000000000000000200000000000000 +CT=69E749DFCA9AC8A990444E9FFB6CBA09 + +I=136 +KEY=000000000000000000000000000000000100000000000000 +CT=9B2262EBF59AB552E04D57A72FE6F013 + +I=137 +KEY=000000000000000000000000000000000080000000000000 +CT=8FF0BF7F0088916764CF9FF21E1BDA67 + +I=138 +KEY=000000000000000000000000000000000040000000000000 +CT=5DE1FF41440B4CA0EEF22C8C3F96F23F + +I=139 +KEY=000000000000000000000000000000000020000000000000 +CT=FEBE3209C8D61E85024DEF2122AF0268 + +I=140 +KEY=000000000000000000000000000000000010000000000000 +CT=DB63B702C6E39A283B64B90F36FBD426 + +I=141 +KEY=000000000000000000000000000000000008000000000000 +CT=BB364F05F769FFBFE18288BD782D20EB + +I=142 +KEY=000000000000000000000000000000000004000000000000 +CT=8A929CBDE0CD9A9545A08DA2D16BA838 + +I=143 +KEY=000000000000000000000000000000000002000000000000 +CT=C5AE232EB4F293497E79E20E436B5A4C + +I=144 +KEY=000000000000000000000000000000000001000000000000 +CT=3979A57AB9EB520E1475D745F897A9A9 + +I=145 +KEY=000000000000000000000000000000000000800000000000 +CT=469B440BBD0711C31B9AAA2564ECB68A + +I=146 +KEY=000000000000000000000000000000000000400000000000 +CT=260AC31933A32B75C13364E868FD84DB + +I=147 +KEY=000000000000000000000000000000000000200000000000 +CT=D5A76D2E0D00BE53B401ACB0EE70F8FB + +I=148 +KEY=000000000000000000000000000000000000100000000000 +CT=C3475809C89275DE82F9F22D59A3DA37 + +I=149 +KEY=000000000000000000000000000000000000080000000000 +CT=C9B8FBFBF1A120BF47D0F2F48DD23661 + +I=150 +KEY=000000000000000000000000000000000000040000000000 +CT=C662358CCCD46730D243DEE03B871DC3 + +I=151 +KEY=000000000000000000000000000000000000020000000000 +CT=F5BA874DAE43AD835B3F1344653411B6 + +I=152 +KEY=000000000000000000000000000000000000010000000000 +CT=F0185396A6A69D48BBEADFE5B644EED4 + +I=153 +KEY=000000000000000000000000000000000000008000000000 +CT=DA0DEC6F13B5AEFC056F5D040C5DA310 + +I=154 +KEY=000000000000000000000000000000000000004000000000 +CT=7E1DBDE7B45F9C3E01A285EA575AD5ED + +I=155 +KEY=000000000000000000000000000000000000002000000000 +CT=7A814893FBF78A6F5345F4E250DA454C + +I=156 +KEY=000000000000000000000000000000000000001000000000 +CT=8C8B9E24399A6DF8293B0117307D6084 + +I=157 +KEY=000000000000000000000000000000000000000800000000 +CT=11BB87A542E9135ECEB6143A07E0B65E + +I=158 +KEY=000000000000000000000000000000000000000400000000 +CT=495A92DB6E242E0A878EB4AC4C886802 + +I=159 +KEY=000000000000000000000000000000000000000200000000 +CT=97A5A7E3DAB800B3D4E7D468B4CCB951 + +I=160 +KEY=000000000000000000000000000000000000000100000000 +CT=C74D778D3F0440EB91981C23CC4F5669 + +I=161 +KEY=000000000000000000000000000000000000000080000000 +CT=1B485B0E4A063B844BC2AE8B722D0757 + +I=162 +KEY=000000000000000000000000000000000000000040000000 +CT=BF9D54F977A978797A4268CFC84132C4 + +I=163 +KEY=000000000000000000000000000000000000000020000000 +CT=90C50CB6D84B6A74F3D64A419B0419EA + +I=164 +KEY=000000000000000000000000000000000000000010000000 +CT=776EED1A9849173A7AC46E94C9B2681B + +I=165 +KEY=000000000000000000000000000000000000000008000000 +CT=A42F612CBF53529173E148ABA2B55D63 + +I=166 +KEY=000000000000000000000000000000000000000004000000 +CT=6F8B5F268B3DBEA72BF0D1F92B13684E + +I=167 +KEY=000000000000000000000000000000000000000002000000 +CT=9379DA858CEC7AC58856E7DBF79C4757 + +I=168 +KEY=000000000000000000000000000000000000000001000000 +CT=17FE109D4638A9E1FAF130D621C160CB + +I=169 +KEY=000000000000000000000000000000000000000000800000 +CT=2BCFAD82613FFD8D9BCBC539C1158BC9 + +I=170 +KEY=000000000000000000000000000000000000000000400000 +CT=8EA212BFBBF476CE35939066A7F1757D + +I=171 +KEY=000000000000000000000000000000000000000000200000 +CT=1BFAC7B1B8EB14C26ADA2055E0C9CD36 + +I=172 +KEY=000000000000000000000000000000000000000000100000 +CT=9FCA8C1340C47C586D6A2FAD9FAA6833 + +I=173 +KEY=000000000000000000000000000000000000000000080000 +CT=D22D10708CBA6566DC096B8ABE3F9679 + +I=174 +KEY=000000000000000000000000000000000000000000040000 +CT=1FFC5754FC94465A073B714267DEC18C + +I=175 +KEY=000000000000000000000000000000000000000000020000 +CT=FDED0173236B23DF4DFC1953355AA78E + +I=176 +KEY=000000000000000000000000000000000000000000010000 +CT=FBE9178C4B27E51E24BF17053724AA2F + +I=177 +KEY=000000000000000000000000000000000000000000008000 +CT=F02818D3D58D1F3345594670D3009DF4 + +I=178 +KEY=000000000000000000000000000000000000000000004000 +CT=6E148020BAB1DD04492299F6A9D9BA22 + +I=179 +KEY=000000000000000000000000000000000000000000002000 +CT=8E045AE3022AF7562106681B2B8CB70E + +I=180 +KEY=000000000000000000000000000000000000000000001000 +CT=2C73832593114BF299424E30C5848625 + +I=181 +KEY=000000000000000000000000000000000000000000000800 +CT=127FC7BCF85F44F5041158A5EB3D040C + +I=182 +KEY=000000000000000000000000000000000000000000000400 +CT=B25FABDA9D6E6704F23F33B0D907B762 + +I=183 +KEY=000000000000000000000000000000000000000000000200 +CT=21B968BF3EFFC638F54BC1524D8D378F + +I=184 +KEY=000000000000000000000000000000000000000000000100 +CT=18F3BEB5D5A6B6AC512752AAA65EA3BD + +I=185 +KEY=000000000000000000000000000000000000000000000080 +CT=5588729059256CE49AF2DA14EE4C9D00 + +I=186 +KEY=000000000000000000000000000000000000000000000040 +CT=A6EBD68D0A6F46DA22CD17D4B55BC4FE + +I=187 +KEY=000000000000000000000000000000000000000000000020 +CT=50434829C09BFB7C174E1BE33642FEFB + +I=188 +KEY=000000000000000000000000000000000000000000000010 +CT=682C20B72DDFE4F678B2379FA25715CA + +I=189 +KEY=000000000000000000000000000000000000000000000008 +CT=925721E954372C9EA115BFF97BBE9A12 + +I=190 +KEY=000000000000000000000000000000000000000000000004 +CT=32929E53C8E8D85657B9B55A4911028C + +I=191 +KEY=000000000000000000000000000000000000000000000002 +CT=8EE624F18BF5AA25ACE8667643D0D80D + +I=192 +KEY=000000000000000000000000000000000000000000000001 +CT=30A61DCEB9A951B829DE01414A801807 + +========== + +KEYSIZE=256 + +PT=00000000000000000000000000000000 + +I=1 +KEY=8000000000000000000000000000000000000000000000000000000000000000 +CT=785229B51B515F30A1FCC88B969A4E47 + +I=2 +KEY=4000000000000000000000000000000000000000000000000000000000000000 +CT=B095E0619E70CDF5F4BC6E88079CF22F + +I=3 +KEY=2000000000000000000000000000000000000000000000000000000000000000 +CT=44F32AEAE82516AC8857C1985B7109EC + +I=4 +KEY=1000000000000000000000000000000000000000000000000000000000000000 +CT=B2BBE93B433C8F0415B90282E788C071 + +I=5 +KEY=0800000000000000000000000000000000000000000000000000000000000000 +CT=9E953EBAA3B13F43F90908B53DAA0C09 + +I=6 +KEY=0400000000000000000000000000000000000000000000000000000000000000 +CT=4579140290095FB25B3144444505D203 + +I=7 +KEY=0200000000000000000000000000000000000000000000000000000000000000 +CT=5FD5F687596A9AA9EA105A2F7CF59A94 + +I=8 +KEY=0100000000000000000000000000000000000000000000000000000000000000 +CT=005EA3AF8AFF3DDA323148690537853C + +I=9 +KEY=0080000000000000000000000000000000000000000000000000000000000000 +CT=CD8E33C4F06FC0586E821522B2FEB08D + +I=10 +KEY=0040000000000000000000000000000000000000000000000000000000000000 +CT=CABEC07E46D11086778C3E1937CD0797 + +I=11 +KEY=0020000000000000000000000000000000000000000000000000000000000000 +CT=56BA650835E125201400380C4D2D5D99 + +I=12 +KEY=0010000000000000000000000000000000000000000000000000000000000000 +CT=EB48A1B279E95EBF8FAAC13D70F8F452 + +I=13 +KEY=0008000000000000000000000000000000000000000000000000000000000000 +CT=E52435C29F7C9687B268C539BF6598B1 + +I=14 +KEY=0004000000000000000000000000000000000000000000000000000000000000 +CT=27785BDF6F6258EAC396BFD0F56BEE82 + +I=15 +KEY=0002000000000000000000000000000000000000000000000000000000000000 +CT=CA16B1969FA373F43EF09D19B3379F3F + +I=16 +KEY=0001000000000000000000000000000000000000000000000000000000000000 +CT=6D1B6F14090368034E10CF0C1E4F5744 + +I=17 +KEY=0000800000000000000000000000000000000000000000000000000000000000 +CT=5AE3ABA331C5D765E3D112B1DA09E7BC + +I=18 +KEY=0000400000000000000000000000000000000000000000000000000000000000 +CT=767F9CBDA1BA9914EBA40D7A172A4077 + +I=19 +KEY=0000200000000000000000000000000000000000000000000000000000000000 +CT=8FAE713F677A82075D773DB73D58763E + +I=20 +KEY=0000100000000000000000000000000000000000000000000000000000000000 +CT=616CA9A15D710CA38FCA9A8E0B16A21C + +I=21 +KEY=0000080000000000000000000000000000000000000000000000000000000000 +CT=D36754729DB34ECA1ECAC2CE2B381713 + +I=22 +KEY=0000040000000000000000000000000000000000000000000000000000000000 +CT=E68E3A421462A49AF8D7E544F7789301 + +I=23 +KEY=0000020000000000000000000000000000000000000000000000000000000000 +CT=69B24511DF9BE48CFDB416F08908315F + +I=24 +KEY=0000010000000000000000000000000000000000000000000000000000000000 +CT=1329EA7551CE6C335DB924D563694058 + +I=25 +KEY=0000008000000000000000000000000000000000000000000000000000000000 +CT=74DA788FB7A6172B65FBB62C7ED4FECC + +I=26 +KEY=0000004000000000000000000000000000000000000000000000000000000000 +CT=862703854F75F433135601000CD9363B + +I=27 +KEY=0000002000000000000000000000000000000000000000000000000000000000 +CT=824D4C002C401677D5785D6C6DA96C68 + +I=28 +KEY=0000001000000000000000000000000000000000000000000000000000000000 +CT=7F9F21E8C45D1E8A843060B963CC628B + +I=29 +KEY=0000000800000000000000000000000000000000000000000000000000000000 +CT=3F6F7B1157906913B09BD2AE2627C6B0 + +I=30 +KEY=0000000400000000000000000000000000000000000000000000000000000000 +CT=A1B7E0CC8B69B3C0C6F635F962D0A22F + +I=31 +KEY=0000000200000000000000000000000000000000000000000000000000000000 +CT=6FC34DDFF0C74674CE124D85E8A3447F + +I=32 +KEY=0000000100000000000000000000000000000000000000000000000000000000 +CT=436A5D315AF443DEA9BEF8D1E817E7E0 + +I=33 +KEY=0000000080000000000000000000000000000000000000000000000000000000 +CT=8B0434C9C98CDA4B313DAD6F1E64A943 + +I=34 +KEY=0000000040000000000000000000000000000000000000000000000000000000 +CT=AF9BD15EF1535259C63D688BF67119C4 + +I=35 +KEY=0000000020000000000000000000000000000000000000000000000000000000 +CT=F61EF2509D173E348E01839A26D033FF + +I=36 +KEY=0000000010000000000000000000000000000000000000000000000000000000 +CT=9D37D036C8568D2173654423CC7AAB39 + +I=37 +KEY=0000000008000000000000000000000000000000000000000000000000000000 +CT=A93D98C055DDAA592390CADB0F0C468D + +I=38 +KEY=0000000004000000000000000000000000000000000000000000000000000000 +CT=F19CB2A5067E9FBADBD4F0D103007A54 + +I=39 +KEY=0000000002000000000000000000000000000000000000000000000000000000 +CT=83C5D584511836263D8B0DE7CEF0AD16 + +I=40 +KEY=0000000001000000000000000000000000000000000000000000000000000000 +CT=E09206EB6A5E8AC933BAAB46547E4CD9 + +I=41 +KEY=0000000000800000000000000000000000000000000000000000000000000000 +CT=0A0EBA6ACED7899AA633CE67E8923936 + +I=42 +KEY=0000000000400000000000000000000000000000000000000000000000000000 +CT=C93968EC0EE02DACD3F3EE9AC2320B88 + +I=43 +KEY=0000000000200000000000000000000000000000000000000000000000000000 +CT=64D62934D409F36505EEC3B925BE914D + +I=44 +KEY=0000000000100000000000000000000000000000000000000000000000000000 +CT=BBADB03D5F0FCF375E671F8B009F3AF1 + +I=45 +KEY=0000000000080000000000000000000000000000000000000000000000000000 +CT=DAC60B05A1C3A203C6B4FE882E780079 + +I=46 +KEY=0000000000040000000000000000000000000000000000000000000000000000 +CT=8B650EC280BE261CCED5B5FC7F8A9BA7 + +I=47 +KEY=0000000000020000000000000000000000000000000000000000000000000000 +CT=35EB82F0BB6735E2DE661AE4E9E9EE57 + +I=48 +KEY=0000000000010000000000000000000000000000000000000000000000000000 +CT=40B1042CBE87D64DDBEA4BAC8CF1F08C + +I=49 +KEY=0000000000008000000000000000000000000000000000000000000000000000 +CT=13D46AE35D868401D23C891ED92621EE + +I=50 +KEY=0000000000004000000000000000000000000000000000000000000000000000 +CT=D2C6E9C239B4FA5A1E76D038EA4660F3 + +I=51 +KEY=0000000000002000000000000000000000000000000000000000000000000000 +CT=DE3BC7CDFAF9AB7143E255DC87645F3E + +I=52 +KEY=0000000000001000000000000000000000000000000000000000000000000000 +CT=8FB6CA966B5ACFB180A296EA5D93711F + +I=53 +KEY=0000000000000800000000000000000000000000000000000000000000000000 +CT=59F622ACBBA15E522717A9EAF7047949 + +I=54 +KEY=0000000000000400000000000000000000000000000000000000000000000000 +CT=BB2939FFBD77B308DA93220AD68A21AC + +I=55 +KEY=0000000000000200000000000000000000000000000000000000000000000000 +CT=CEBE5EDD9BACF0A0FB75B259DE7097CD + +I=56 +KEY=0000000000000100000000000000000000000000000000000000000000000000 +CT=3448844E63AC2BD809E254AC3BAA6B3B + +I=57 +KEY=0000000000000080000000000000000000000000000000000000000000000000 +CT=49C27499EEC1989626B1E50435BA0273 + +I=58 +KEY=0000000000000040000000000000000000000000000000000000000000000000 +CT=39E97018F547A8A802578B80952F2457 + +I=59 +KEY=0000000000000020000000000000000000000000000000000000000000000000 +CT=9934453FBAAE1CB362A0012204967AE8 + +I=60 +KEY=0000000000000010000000000000000000000000000000000000000000000000 +CT=E9C98A03713835EB4497346866791190 + +I=61 +KEY=0000000000000008000000000000000000000000000000000000000000000000 +CT=E026C858938B47D28A8758CCFAEF0FA8 + +I=62 +KEY=0000000000000004000000000000000000000000000000000000000000000000 +CT=3A84B0A26CEA6A8D8A94D5B791A0D3E8 + +I=63 +KEY=0000000000000002000000000000000000000000000000000000000000000000 +CT=B054259980B45B9D2D7CD6C13200BAFC + +I=64 +KEY=0000000000000001000000000000000000000000000000000000000000000000 +CT=13645DBEDE21FF7C79C06141AD9E4CD1 + +I=65 +KEY=0000000000000000800000000000000000000000000000000000000000000000 +CT=F29B1370BA8D8CC19AC8DF5DF77F7319 + +I=66 +KEY=0000000000000000400000000000000000000000000000000000000000000000 +CT=6A2C94C488D5BD32742F143B2E8D0659 + +I=67 +KEY=0000000000000000200000000000000000000000000000000000000000000000 +CT=27A0BF748F513F18D4F7831527A3608F + +I=68 +KEY=0000000000000000100000000000000000000000000000000000000000000000 +CT=0B0D61E162A88E04C38C19CA668C2DDC + +I=69 +KEY=0000000000000000080000000000000000000000000000000000000000000000 +CT=4055BA24216EF49FE36E6145A5CD31D4 + +I=70 +KEY=0000000000000000040000000000000000000000000000000000000000000000 +CT=99699B31EBBE6ABE1F7B2AFEC86DC7E2 + +I=71 +KEY=0000000000000000020000000000000000000000000000000000000000000000 +CT=C8D70448CBA770CD94088F60CBF8C5AC + +I=72 +KEY=0000000000000000010000000000000000000000000000000000000000000000 +CT=56C89F1BA6D3AB20465F01F81D00A894 + +I=73 +KEY=0000000000000000008000000000000000000000000000000000000000000000 +CT=919FC5BBFAB8C31F8B2A346FBC2AB282 + +I=74 +KEY=0000000000000000004000000000000000000000000000000000000000000000 +CT=FF57E3AB8751DAA252DD0DD917BEAD8B + +I=75 +KEY=0000000000000000002000000000000000000000000000000000000000000000 +CT=90B94853B317FFA8D41F2A32A3A061AB + +I=76 +KEY=0000000000000000001000000000000000000000000000000000000000000000 +CT=F4A0257D0CF6C8C87D154746C2C94B52 + +I=77 +KEY=0000000000000000000800000000000000000000000000000000000000000000 +CT=03666F848F252B501754773CB68CF3B2 + +I=78 +KEY=0000000000000000000400000000000000000000000000000000000000000000 +CT=F3D0941DDC7412A981C5F6CCAB082DC2 + +I=79 +KEY=0000000000000000000200000000000000000000000000000000000000000000 +CT=21EDD2A11C57EE97AEADFACEC20A8691 + +I=80 +KEY=0000000000000000000100000000000000000000000000000000000000000000 +CT=577CF09B5606F1443E8B57952004C68D + +I=81 +KEY=0000000000000000000080000000000000000000000000000000000000000000 +CT=0CF408A2FBDA07068BDB13A371867FCC + +I=82 +KEY=0000000000000000000040000000000000000000000000000000000000000000 +CT=88542C9E680C27FE8FBE090AD73410B9 + +I=83 +KEY=0000000000000000000020000000000000000000000000000000000000000000 +CT=7A8BA6DC89A1AD4385D0696AFDD89496 + +I=84 +KEY=0000000000000000000010000000000000000000000000000000000000000000 +CT=B84FA0FA046D5D77EA94CF3E8FDED147 + +I=85 +KEY=0000000000000000000008000000000000000000000000000000000000000000 +CT=D73CB079FB7101C933176352A93BB028 + +I=86 +KEY=0000000000000000000004000000000000000000000000000000000000000000 +CT=A7C8C1A59E141D608BC91BB69E7B2859 + +I=87 +KEY=0000000000000000000002000000000000000000000000000000000000000000 +CT=B2DA67AFE49B33E5EDFAF148A17BF06B + +I=88 +KEY=0000000000000000000001000000000000000000000000000000000000000000 +CT=AC2DB35ED86D358616648D22B52DF012 + +I=89 +KEY=0000000000000000000000800000000000000000000000000000000000000000 +CT=662EA9D88A9A2C89581502EAAAD074D5 + +I=90 +KEY=0000000000000000000000400000000000000000000000000000000000000000 +CT=773A30DFDA8EBCE50EDFB925343C9ECC + +I=91 +KEY=0000000000000000000000200000000000000000000000000000000000000000 +CT=10B7242D9C7CA610C20F1183BB949514 + +I=92 +KEY=0000000000000000000000100000000000000000000000000000000000000000 +CT=B7DF971F9C3444EFCC13210292126942 + +I=93 +KEY=0000000000000000000000080000000000000000000000000000000000000000 +CT=13F7406746C6E0CD5666EC04C0E540E2 + +I=94 +KEY=0000000000000000000000040000000000000000000000000000000000000000 +CT=9382384DCAF80CF537E24FC5F2F71A8A + +I=95 +KEY=0000000000000000000000020000000000000000000000000000000000000000 +CT=3D5819934619E09F10E90C4EA7F30F40 + +I=96 +KEY=0000000000000000000000010000000000000000000000000000000000000000 +CT=710446D0A254F68975CD6AAAE92212FD + +I=97 +KEY=0000000000000000000000008000000000000000000000000000000000000000 +CT=0A44FDEAA17E5F3E536A08D7A5B3267B + +I=98 +KEY=0000000000000000000000004000000000000000000000000000000000000000 +CT=BAC72F53EE39296D3A23B126F8D8B20B + +I=99 +KEY=0000000000000000000000002000000000000000000000000000000000000000 +CT=88C342961D0EE83902CB78C29539923D + +I=100 +KEY=0000000000000000000000001000000000000000000000000000000000000000 +CT=CF3B48A6351C4561752D6A209F93A30F + +I=101 +KEY=0000000000000000000000000800000000000000000000000000000000000000 +CT=957B107D23F3694F3FFD9957BBE13168 + +I=102 +KEY=0000000000000000000000000400000000000000000000000000000000000000 +CT=23675E18C1C66B483D55E14AC7F9CC80 + +I=103 +KEY=0000000000000000000000000200000000000000000000000000000000000000 +CT=955B8619F99F7609201CEEB338F32795 + +I=104 +KEY=0000000000000000000000000100000000000000000000000000000000000000 +CT=9F2BCB0C28768DA3B76206979B14EBC2 + +I=105 +KEY=0000000000000000000000000080000000000000000000000000000000000000 +CT=258F95A0E86EE0EE8FC020B4A01900F2 + +I=106 +KEY=0000000000000000000000000040000000000000000000000000000000000000 +CT=FD7B1DD7C7FE279E6A5E2926DD890B5E + +I=107 +KEY=0000000000000000000000000020000000000000000000000000000000000000 +CT=59CF38A7C863C623991B5392944CB43C + +I=108 +KEY=0000000000000000000000000010000000000000000000000000000000000000 +CT=27BCC9206AEC78DA48C1E9AB8D1A7A07 + +I=109 +KEY=0000000000000000000000000008000000000000000000000000000000000000 +CT=62D8460820B18811DEBB617DE7B8EC8C + +I=110 +KEY=0000000000000000000000000004000000000000000000000000000000000000 +CT=782D8A4D30EE841EDB2E7E88C63B851A + +I=111 +KEY=0000000000000000000000000002000000000000000000000000000000000000 +CT=4D10D177334397F49211BCB10F207905 + +I=112 +KEY=0000000000000000000000000001000000000000000000000000000000000000 +CT=C8E608BAFE61254A0DDF866BB4D063DD + +I=113 +KEY=0000000000000000000000000000800000000000000000000000000000000000 +CT=05DDAB3DAEA0C64C1077BE22DA7ACDD4 + +I=114 +KEY=0000000000000000000000000000400000000000000000000000000000000000 +CT=951388F2BE1DD7013A00327FC6DB7905 + +I=115 +KEY=0000000000000000000000000000200000000000000000000000000000000000 +CT=62F8283651EFDF475DE8511EA7256AD6 + +I=116 +KEY=0000000000000000000000000000100000000000000000000000000000000000 +CT=5B259EEE6B19EE12D4CE20D2F38D4BCF + +I=117 +KEY=0000000000000000000000000000080000000000000000000000000000000000 +CT=704414E13DCAD9DF7F593F630E68E13C + +I=118 +KEY=0000000000000000000000000000040000000000000000000000000000000000 +CT=41AD9DAAC24ECCBB454DBAF75D5B9989 + +I=119 +KEY=0000000000000000000000000000020000000000000000000000000000000000 +CT=919C54C126B54D7A570D8ABA9FCE5D08 + +I=120 +KEY=0000000000000000000000000000010000000000000000000000000000000000 +CT=BC665541FF0F2E86DBDF4444C01AC0EA + +I=121 +KEY=0000000000000000000000000000008000000000000000000000000000000000 +CT=FD30E2D851211506C112D5701B859BC6 + +I=122 +KEY=0000000000000000000000000000004000000000000000000000000000000000 +CT=7DB7B15E4ACBDBB0BFF4C4EAEDC2231E + +I=123 +KEY=0000000000000000000000000000002000000000000000000000000000000000 +CT=F0AFDED56AD72D4C1E57A66EEDF4816E + +I=124 +KEY=0000000000000000000000000000001000000000000000000000000000000000 +CT=E53B053D9B2E06656138D4A1EFA58888 + +I=125 +KEY=0000000000000000000000000000000800000000000000000000000000000000 +CT=4DABE13A3E656E95150440F81DD92666 + +I=126 +KEY=0000000000000000000000000000000400000000000000000000000000000000 +CT=175D44DFDE1EAD6E0E6862B511AA7007 + +I=127 +KEY=0000000000000000000000000000000200000000000000000000000000000000 +CT=09B690F493F5C779E8B6ACD09667A997 + +I=128 +KEY=0000000000000000000000000000000100000000000000000000000000000000 +CT=68D0E4CCA0119EED57ABF3C7574BDA8B + +I=129 +KEY=0000000000000000000000000000000080000000000000000000000000000000 +CT=12C00618DA7EBA5EFA5E58D2696D891F + +I=130 +KEY=0000000000000000000000000000000040000000000000000000000000000000 +CT=5DCE21AF0D23BC5AEFD4EA331B16219A + +I=131 +KEY=0000000000000000000000000000000020000000000000000000000000000000 +CT=A5D7135A053B904D44B40E4E21693751 + +I=132 +KEY=0000000000000000000000000000000010000000000000000000000000000000 +CT=3257CEC675BF755FEE67A44D7EDF2731 + +I=133 +KEY=0000000000000000000000000000000008000000000000000000000000000000 +CT=324D30DDC6979F17A3BEAEA3A76AD44C + +I=134 +KEY=0000000000000000000000000000000004000000000000000000000000000000 +CT=A1AA0E04E2B61861796FD2AA30FBEB05 + +I=135 +KEY=0000000000000000000000000000000002000000000000000000000000000000 +CT=90CA81DF4000404B567F5CFA9D193CB3 + +I=136 +KEY=0000000000000000000000000000000001000000000000000000000000000000 +CT=A2E6864259483D059B57BB921B7FBD99 + +I=137 +KEY=0000000000000000000000000000000000800000000000000000000000000000 +CT=545690C09C8C396F1273510DA9065C12 + +I=138 +KEY=0000000000000000000000000000000000400000000000000000000000000000 +CT=16D86FCC5910E2DD0CEA4DD5219B2D03 + +I=139 +KEY=0000000000000000000000000000000000200000000000000000000000000000 +CT=EC4114C19DD5711CD927B0DBE34AAB4B + +I=140 +KEY=0000000000000000000000000000000000100000000000000000000000000000 +CT=A78C62D8FD439E5B10A7EF436714AC22 + +I=141 +KEY=0000000000000000000000000000000000080000000000000000000000000000 +CT=BA5D708CBA34F782DA00C7643C971DB9 + +I=142 +KEY=0000000000000000000000000000000000040000000000000000000000000000 +CT=7DB9ADCFA26C1E784E7F485BD0A0A52C + +I=143 +KEY=0000000000000000000000000000000000020000000000000000000000000000 +CT=8A025CED99AF1047C5345358A291CDBB + +I=144 +KEY=0000000000000000000000000000000000010000000000000000000000000000 +CT=187A1824D390AD2798E4F2264E5F1F21 + +I=145 +KEY=0000000000000000000000000000000000008000000000000000000000000000 +CT=BA28DE5C32353C65B97A59889E7A7A40 + +I=146 +KEY=0000000000000000000000000000000000004000000000000000000000000000 +CT=5D486AB86A883029EC74916851FFFA11 + +I=147 +KEY=0000000000000000000000000000000000002000000000000000000000000000 +CT=F9C79D54CEEE6170B195F4D30FA63FE0 + +I=148 +KEY=0000000000000000000000000000000000001000000000000000000000000000 +CT=96B8429F476485F8CC2E204534A8B64E + +I=149 +KEY=0000000000000000000000000000000000000800000000000000000000000000 +CT=13061D65FEF26F5ACAAF3B55FDB98C36 + +I=150 +KEY=0000000000000000000000000000000000000400000000000000000000000000 +CT=C72DC86F70B40169B3456783A611DAE9 + +I=151 +KEY=0000000000000000000000000000000000000200000000000000000000000000 +CT=82AA2DB6FEE9212968D8282A1BF3242B + +I=152 +KEY=0000000000000000000000000000000000000100000000000000000000000000 +CT=220C8B197F54F8E86DAE575B07A570EF + +I=153 +KEY=0000000000000000000000000000000000000080000000000000000000000000 +CT=873C47F6F75BE9F710F91F2C54A69A7A + +I=154 +KEY=0000000000000000000000000000000000000040000000000000000000000000 +CT=0392FA7BB908FEF23774772F74AC968D + +I=155 +KEY=0000000000000000000000000000000000000020000000000000000000000000 +CT=A94203746A266C5744C16BF4E8DFA6D7 + +I=156 +KEY=0000000000000000000000000000000000000010000000000000000000000000 +CT=D3BA78AD6B01CC7221FA7778699C8316 + +I=157 +KEY=0000000000000000000000000000000000000008000000000000000000000000 +CT=994FDCC09C25400D14C05117B936EECD + +I=158 +KEY=0000000000000000000000000000000000000004000000000000000000000000 +CT=4012F67B2A0BEF2623CA6AC5B054BE62 + +I=159 +KEY=0000000000000000000000000000000000000002000000000000000000000000 +CT=1134AF65E6D3D5E3D3C23A499EE2F677 + +I=160 +KEY=0000000000000000000000000000000000000001000000000000000000000000 +CT=6B35A344BD8DFD4002F5F22EA288F8E6 + +I=161 +KEY=0000000000000000000000000000000000000000800000000000000000000000 +CT=D293D438C563B8EB3FF26E23A7323B74 + +I=162 +KEY=0000000000000000000000000000000000000000400000000000000000000000 +CT=8085B7A7B939FA37BC4E1D746E9F9B37 + +I=163 +KEY=0000000000000000000000000000000000000000200000000000000000000000 +CT=D628AD150E15F413010BE15E391D3F48 + +I=164 +KEY=0000000000000000000000000000000000000000100000000000000000000000 +CT=A5C2AC88B6FD4C57CB4F2C2920A584EF + +I=165 +KEY=0000000000000000000000000000000000000000080000000000000000000000 +CT=D7F5183F6BAB04B87A1ABAA3914DA848 + +I=166 +KEY=0000000000000000000000000000000000000000040000000000000000000000 +CT=3B2116BD2E362FC8985A0F0C618DF58A + +I=167 +KEY=0000000000000000000000000000000000000000020000000000000000000000 +CT=BF31E8DE8342A32BBD80A8F91507BADA + +I=168 +KEY=0000000000000000000000000000000000000000010000000000000000000000 +CT=AA04A56C13507AE5137657546766AE2D + +I=169 +KEY=0000000000000000000000000000000000000000008000000000000000000000 +CT=72B9D7628AB21DF89666E50517C50574 + +I=170 +KEY=0000000000000000000000000000000000000000004000000000000000000000 +CT=2B8DE8D2D3332E6A30215ACC10A69847 + +I=171 +KEY=0000000000000000000000000000000000000000002000000000000000000000 +CT=AC421C73A789D79B452623DAFD3D6D0B + +I=172 +KEY=0000000000000000000000000000000000000000001000000000000000000000 +CT=995207D8CF8C10904C0F47652C9C4287 + +I=173 +KEY=0000000000000000000000000000000000000000000800000000000000000000 +CT=F83BD19A357BD7901C0E8FBEFCF857ED + +I=174 +KEY=0000000000000000000000000000000000000000000400000000000000000000 +CT=F42BB427C894A072C861C1425CBD71BC + +I=175 +KEY=0000000000000000000000000000000000000000000200000000000000000000 +CT=3D1EC73B166DC0120DDF24267907C0F9 + +I=176 +KEY=0000000000000000000000000000000000000000000100000000000000000000 +CT=8EF136AF5D7D1B513FB59FA21F7837A1 + +I=177 +KEY=0000000000000000000000000000000000000000000080000000000000000000 +CT=EB4BBA7F94CE9429255A583D2F9810CD + +I=178 +KEY=0000000000000000000000000000000000000000000040000000000000000000 +CT=5FE1C3BCD24818948514CB5A32FFD0A1 + +I=179 +KEY=0000000000000000000000000000000000000000000020000000000000000000 +CT=A990117E78D1C5BD7833B96A4A180744 + +I=180 +KEY=0000000000000000000000000000000000000000000010000000000000000000 +CT=E63684CDC37E6768C45012EA00D008E4 + +I=181 +KEY=0000000000000000000000000000000000000000000008000000000000000000 +CT=78B711F290DA924CAF1E4F1E11A08F4F + +I=182 +KEY=0000000000000000000000000000000000000000000004000000000000000000 +CT=85B7F0D391AF9268643D9C0B72433A99 + +I=183 +KEY=0000000000000000000000000000000000000000000002000000000000000000 +CT=F51410475B33FBD3DB2117B5C17C82D4 + +I=184 +KEY=0000000000000000000000000000000000000000000001000000000000000000 +CT=A3C5BF72F39940DC7DAFB474A77A6114 + +I=185 +KEY=0000000000000000000000000000000000000000000000800000000000000000 +CT=4EFB0E18FB2F96FB6F81514BCE0A7BBD + +I=186 +KEY=0000000000000000000000000000000000000000000000400000000000000000 +CT=10112F5ABBF246996860B843FC7159F5 + +I=187 +KEY=0000000000000000000000000000000000000000000000200000000000000000 +CT=94A91373701569B8C21487A7BDB164B6 + +I=188 +KEY=0000000000000000000000000000000000000000000000100000000000000000 +CT=A466821BD64F552C0610ADB737C562CD + +I=189 +KEY=0000000000000000000000000000000000000000000000080000000000000000 +CT=511BE2BA9F2A272CA2F5C1D0F3E249C1 + +I=190 +KEY=0000000000000000000000000000000000000000000000040000000000000000 +CT=5578CCF8B92D48363EED4601661EB56E + +I=191 +KEY=0000000000000000000000000000000000000000000000020000000000000000 +CT=BF90E87173A45115C811B6319C24FC4A + +I=192 +KEY=0000000000000000000000000000000000000000000000010000000000000000 +CT=8029EE840D130319330B432D95DB9AA7 + +I=193 +KEY=0000000000000000000000000000000000000000000000008000000000000000 +CT=19D6D9F45582481A573D77917E778F3C + +I=194 +KEY=0000000000000000000000000000000000000000000000004000000000000000 +CT=556D552FDE7C64227E2B72776488D6C1 + +I=195 +KEY=0000000000000000000000000000000000000000000000002000000000000000 +CT=3E81B51A214CC1F1CF6F35F9106A84BC + +I=196 +KEY=0000000000000000000000000000000000000000000000001000000000000000 +CT=4E48243857ECB700F8F16872E0BB4FA9 + +I=197 +KEY=0000000000000000000000000000000000000000000000000800000000000000 +CT=681654DF6668CDDF1D3D604483AB483B + +I=198 +KEY=0000000000000000000000000000000000000000000000000400000000000000 +CT=BD6CEEFD85A336E4F12D42076573ECA2 + +I=199 +KEY=0000000000000000000000000000000000000000000000000200000000000000 +CT=7488F9790FEC8AAE2AADDF6A600629B3 + +I=200 +KEY=0000000000000000000000000000000000000000000000000100000000000000 +CT=669C36695C33B63F16077CAE9AA940AA + +I=201 +KEY=0000000000000000000000000000000000000000000000000080000000000000 +CT=7CE998A357384159C9B34A9A8AC7DF78 + +I=202 +KEY=0000000000000000000000000000000000000000000000000040000000000000 +CT=51BE07BA8106A19CCC2005B8B3932FBF + +I=203 +KEY=0000000000000000000000000000000000000000000000000020000000000000 +CT=2634245A6EC3F17A35B7FE1D3E17F769 + +I=204 +KEY=0000000000000000000000000000000000000000000000000010000000000000 +CT=24D4114760BCE04C0109C06CCE199F6C + +I=205 +KEY=0000000000000000000000000000000000000000000000000008000000000000 +CT=3F055452FCD596C6D588BD48BB5D5080 + +I=206 +KEY=0000000000000000000000000000000000000000000000000004000000000000 +CT=A1D97F66DEF90DE14CC2BFAFF09286BB + +I=207 +KEY=0000000000000000000000000000000000000000000000000002000000000000 +CT=80442DC4EBFB53B86E232D886CA166B9 + +I=208 +KEY=0000000000000000000000000000000000000000000000000001000000000000 +CT=76A593802C6A691152E8A04E5DE2D05A + +I=209 +KEY=0000000000000000000000000000000000000000000000000000800000000000 +CT=F923A147E00807D58FB9C686E01F7E07 + +I=210 +KEY=0000000000000000000000000000000000000000000000000000400000000000 +CT=8EA3B396D561A3CFCE729A0B59647760 + +I=211 +KEY=0000000000000000000000000000000000000000000000000000200000000000 +CT=4AA735D710704790C060BAD696DACABE + +I=212 +KEY=0000000000000000000000000000000000000000000000000000100000000000 +CT=7F7C322D82557737F5407A797069B711 + +I=213 +KEY=0000000000000000000000000000000000000000000000000000080000000000 +CT=5094418C55B7D591EFDB7097CB95B16D + +I=214 +KEY=0000000000000000000000000000000000000000000000000000040000000000 +CT=CC014984ABDFB760A835846668340929 + +I=215 +KEY=0000000000000000000000000000000000000000000000000000020000000000 +CT=18F86EA6C633228579C5728FF070AC21 + +I=216 +KEY=0000000000000000000000000000000000000000000000000000010000000000 +CT=AFCF921E4FA24FDEF85EDAC12CD479F1 + +I=217 +KEY=0000000000000000000000000000000000000000000000000000008000000000 +CT=684085D0BE8AE0D617B2EFEF62CAAC93 + +I=218 +KEY=0000000000000000000000000000000000000000000000000000004000000000 +CT=04C7B0268EAEFED098C815935D868CF9 + +I=219 +KEY=0000000000000000000000000000000000000000000000000000002000000000 +CT=39AE859D255487A68093A376D358BBC2 + +I=220 +KEY=0000000000000000000000000000000000000000000000000000001000000000 +CT=F1218B59E947816041B21AC28685EF36 + +I=221 +KEY=0000000000000000000000000000000000000000000000000000000800000000 +CT=B9BE024D06447F8965E480B33975E36F + +I=222 +KEY=0000000000000000000000000000000000000000000000000000000400000000 +CT=24ECD5B3178150233BD38A4B9F8EBC86 + +I=223 +KEY=0000000000000000000000000000000000000000000000000000000200000000 +CT=7AD12485E896037A8D1A4ABE8A80B9BB + +I=224 +KEY=0000000000000000000000000000000000000000000000000000000100000000 +CT=CEC561C6F4C45CC944371E5D1C18EDF1 + +I=225 +KEY=0000000000000000000000000000000000000000000000000000000080000000 +CT=F4B1088B0858A3737DF2C90FD919D1D4 + +I=226 +KEY=0000000000000000000000000000000000000000000000000000000040000000 +CT=5EA6D1B9881CE230B8EABAC59B7F5393 + +I=227 +KEY=0000000000000000000000000000000000000000000000000000000020000000 +CT=8023134FAC8BF5FDA86368BDA618AEF7 + +I=228 +KEY=0000000000000000000000000000000000000000000000000000000010000000 +CT=D37285234A927061BEC9F8AAE0E796C8 + +I=229 +KEY=0000000000000000000000000000000000000000000000000000000008000000 +CT=68AC18DB2FBF0A4A095A4B3344BF035D + +I=230 +KEY=0000000000000000000000000000000000000000000000000000000004000000 +CT=563868079C5DF91E3B47B370B0BBB820 + +I=231 +KEY=0000000000000000000000000000000000000000000000000000000002000000 +CT=86C3BB221834F7507505434E4F98DC92 + +I=232 +KEY=0000000000000000000000000000000000000000000000000000000001000000 +CT=FD8220818731607D8B69AC5963D0FAC9 + +I=233 +KEY=0000000000000000000000000000000000000000000000000000000000800000 +CT=550726375ABB0F9A7C010DC4E47833F9 + +I=234 +KEY=0000000000000000000000000000000000000000000000000000000000400000 +CT=8AB5E8973A5D6648517D151295091C0E + +I=235 +KEY=0000000000000000000000000000000000000000000000000000000000200000 +CT=338BB4B5569AA06411B9911381F350B2 + +I=236 +KEY=0000000000000000000000000000000000000000000000000000000000100000 +CT=332D696EC49DF4B58C5FA9CC84773F47 + +I=237 +KEY=0000000000000000000000000000000000000000000000000000000000080000 +CT=DEB5AC8F895AFF45BA5815D4912D8371 + +I=238 +KEY=0000000000000000000000000000000000000000000000000000000000040000 +CT=89A49D3AB772D0FDAE05FC692EAF6C7B + +I=239 +KEY=0000000000000000000000000000000000000000000000000000000000020000 +CT=02116E6AEFC21A4D4D64CA27AB7AF31E + +I=240 +KEY=0000000000000000000000000000000000000000000000000000000000010000 +CT=58F79FF1810CA4B0E0178F7D9C24A581 + +I=241 +KEY=0000000000000000000000000000000000000000000000000000000000008000 +CT=686FB1ED659D9BF17DA2BB79AC636C93 + +I=242 +KEY=0000000000000000000000000000000000000000000000000000000000004000 +CT=1C5C176C4F5796B2C34D2A12858EB511 + +I=243 +KEY=0000000000000000000000000000000000000000000000000000000000002000 +CT=2A94B92CC9C4776817C0A77D49E24F22 + +I=244 +KEY=0000000000000000000000000000000000000000000000000000000000001000 +CT=890583A6C9549A3DCAFBD54BF391BC8F + +I=245 +KEY=0000000000000000000000000000000000000000000000000000000000000800 +CT=EA88A883197E483B4AA16316EA97CCBB + +I=246 +KEY=0000000000000000000000000000000000000000000000000000000000000400 +CT=CC5732CEB99A0A0353BABA6432BCBE9F + +I=247 +KEY=0000000000000000000000000000000000000000000000000000000000000200 +CT=88811B506D565779F09DE9BDF8702BD8 + +I=248 +KEY=0000000000000000000000000000000000000000000000000000000000000100 +CT=E11FEE3AD4A9A03956704B58720C92DD + +I=249 +KEY=0000000000000000000000000000000000000000000000000000000000000080 +CT=644555DFB9CE8EDAF888EE142B5577F1 + +I=250 +KEY=0000000000000000000000000000000000000000000000000000000000000040 +CT=716E2BBCBD8FF7E7335784B767F27CA9 + +I=251 +KEY=0000000000000000000000000000000000000000000000000000000000000020 +CT=83588863F183ECE04E95629A322F9A09 + +I=252 +KEY=0000000000000000000000000000000000000000000000000000000000000010 +CT=5E2833EC95ACE6B93AF28C6FCDBCE5D5 + +I=253 +KEY=0000000000000000000000000000000000000000000000000000000000000008 +CT=B3EFCF17F0E1B275D413DD4D3A5CAE68 + +I=254 +KEY=0000000000000000000000000000000000000000000000000000000000000004 +CT=3C943E1A2E7E56E4B185302D2D5C5DBD + +I=255 +KEY=0000000000000000000000000000000000000000000000000000000000000002 +CT=8CB4E2498382B523DCE6F7C17C91400B + +I=256 +KEY=0000000000000000000000000000000000000000000000000000000000000001 +CT=85F345366155D13F8F257734D2CBD6D9 + +========== + diff -urN lin.2.2.17/crypto/twofish.c int.2.2.17.x/crypto/twofish.c --- lin.2.2.17/crypto/twofish.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/twofish.c Sat Oct 14 01:00:49 2000 @@ -0,0 +1,467 @@ +/* NOTE: This implementation has been changed from the original + * source. See ChangeLog for more information. + * Maintained by Marc Mutz <Marc@Mutz.com> + */ + +/* Twofish for GPG + * By Matthew Skala <mskala@ansuz.sooke.bc.ca>, July 26, 1998 + * 256-bit key length added March 20, 1999 + * Some modifications to reduce the text size by Werner Koch, April, 1998 + * + * The original author has disclaimed all copyright interest in this + * code and thus putting it in the public domain. + * + * This code is a "clean room" implementation, written from the paper + * _Twofish: A 128-Bit Block Cipher_ by Bruce Schneier, John Kelsey, + * Doug Whiting, David Wagner, Chris Hall, and Niels Ferguson, available + * through http://www.counterpane.com/twofish.html + * + * For background information on multiplication in finite fields, used for + * the matrix operations in the key schedule, see the book _Contemporary + * Abstract Algebra_ by Joseph A. Gallian, especially chapter 22 in the + * Third Edition. + * + * Only the 128- and 256-bit key sizes are supported. This code is intended + * for GNU C on a 32-bit system, but it should work almost anywhere. Loops + * are unrolled, precomputation tables are used, etc., for maximum speed at + * some cost in memory consumption. */ + +#include <linux/module.h> +#include <linux/init.h> +#include <linux/types.h> +#include <linux/wordops.h> +#include <linux/crypto.h> + +/* what shall twofish_set_key() return on wrong key lengths, resp. who + * checks for correct keysizes? */ +#define TWOFISH_WRONG_KEYLENGTH 1 + +#if 0 /* shouldn't this be #ifdef rotl32 ? + * Look at wordops.h: It includes asm/wordops.h. + * Anyway, we have to search in the macros for rot's, + * since they seem to be defined in a generic way. */ +#define rotl rotl32 +#define rotr rotr32 +#else +#define rotl generic_rotl32 +#define rotr generic_rotr32 +#endif + +/* Structure for an expanded Twofish key. s contains the key-dependent + * S-boxes composed with the MDS matrix; w contains the eight "whitening" + * subkeys, K[0] through K[7]. k holds the remaining, "round" subkeys. Note + * that k[i] corresponds to what the Twofish paper calls K[i+8]. */ +typedef struct { + u32 s[4][256], w[8], k[32]; +} TWOFISH_context; + +#include "2fish_tables.h" + +/* Macro to perform one column of the RS matrix multiplication. The + * parameters a, b, c, and d are the four bytes of output; i is the index + * of the key bytes, and w, x, y, and z, are the column of constants from + * the RS matrix, preprocessed through the poly_to_exp table. */ + +#define CALC_S(a, b, c, d, i, w, x, y, z) \ + if (key[i]) { \ + tmp = poly_to_exp[key[i] - 1]; \ + (a) ^= exp_to_poly[tmp + (w)]; \ + (b) ^= exp_to_poly[tmp + (x)]; \ + (c) ^= exp_to_poly[tmp + (y)]; \ + (d) ^= exp_to_poly[tmp + (z)]; \ + } + +/* Macros to calculate the key-dependent S-boxes for a 128-bit key using + * the S vector from CALC_S. CALC_SB_2 computes a single entry in all + * four S-boxes, where i is the index of the entry to compute, and a and b + * are the index numbers preprocessed through the q0 and q1 tables + * respectively. CALC_SB is simply a convenience to make the code shorter; + * it calls CALC_SB_2 four times with consecutive indices from i to i+3, + * using the remaining parameters two by two. */ + +#define CALC_SB_2(i, a, b) \ + ctx->s[0][i] = mds[0][q0[(a) ^ sa] ^ se]; \ + ctx->s[1][i] = mds[1][q0[(b) ^ sb] ^ sf]; \ + ctx->s[2][i] = mds[2][q1[(a) ^ sc] ^ sg]; \ + ctx->s[3][i] = mds[3][q1[(b) ^ sd] ^ sh] + +#define CALC_SB(i, a, b, c, d, e, f, g, h) \ + CALC_SB_2 (i, a, b); CALC_SB_2 ((i)+1, c, d); \ + CALC_SB_2 ((i)+2, e, f); CALC_SB_2 ((i)+3, g, h) + +/* Macros exactly like CALC_SB and CALC_SB_2, but for 256-bit keys. */ + +#define CALC_SB256_2(i, a, b) \ + ctx->s[0][i] = mds[0][q0[q0[q1[(b) ^ sa] ^ se] ^ si] ^ sm]; \ + ctx->s[1][i] = mds[1][q0[q1[q1[(a) ^ sb] ^ sf] ^ sj] ^ sn]; \ + ctx->s[2][i] = mds[2][q1[q0[q0[(a) ^ sc] ^ sg] ^ sk] ^ so]; \ + ctx->s[3][i] = mds[3][q1[q1[q0[(b) ^ sd] ^ sh] ^ sl] ^ sp]; + +#define CALC_SB256(i, a, b, c, d, e, f, g, h) \ + CALC_SB256_2 (i, a, b); CALC_SB256_2 ((i)+1, c, d); \ + CALC_SB256_2 ((i)+2, e, f); CALC_SB256_2 ((i)+3, g, h) + +/* Macros to calculate the whitening and round subkeys. CALC_K_2 computes the + * last two stages of the h() function for a given index (either 2i or 2i+1). + * a, b, c, and d are the four bytes going into the last two stages. For + * 128-bit keys, this is the entire h() function and a and c are the index + * preprocessed through q0 and q1 respectively; for longer keys they are the + * output of previous stages. j is the index of the first key byte to use. + * CALC_K computes a pair of subkeys for 128-bit Twofish, by calling CALC_K_2 + * twice, doing the Psuedo-Hadamard Transform, and doing the necessary + * rotations. Its parameters are: a, the array to write the results into, + * j, the index of the first output entry, k and l, the preprocessed indices + * for index 2i, and m and n, the preprocessed indices for index 2i+1. + * CALC_K256_2 expands CALC_K_2 to handle 256-bit keys, by doing two + * additional lookup-and-XOR stages. The parameters a and b are the index + * preprocessed through q0 and q1 respectively; j is the index of the first + * key byte to use. CALC_K256 is identical to CALC_K but for using the + * CALC_K256_2 macro instead of CALC_K_2. */ + +#define CALC_K_2(a, b, c, d, j) \ + mds[0][q0[a ^ key[(j) + 8]] ^ key[j]] \ + ^ mds[1][q0[b ^ key[(j) + 9]] ^ key[(j) + 1]] \ + ^ mds[2][q1[c ^ key[(j) + 10]] ^ key[(j) + 2]] \ + ^ mds[3][q1[d ^ key[(j) + 11]] ^ key[(j) + 3]] + +#define CALC_K(a, j, k, l, m, n) \ + x = CALC_K_2 (k, l, k, l, 0); \ + y = CALC_K_2 (m, n, m, n, 4); \ + y = (y << 8) + (y >> 24); \ + x += y; y += x; ctx->a[j] = x; \ + ctx->a[(j) + 1] = (y << 9) + (y >> 23) + +#define CALC_K256_2(a, b, j) \ + CALC_K_2 (q0[q1[b ^ key[(j) + 24]] ^ key[(j) + 16]], \ + q1[q1[a ^ key[(j) + 25]] ^ key[(j) + 17]], \ + q0[q0[a ^ key[(j) + 26]] ^ key[(j) + 18]], \ + q1[q0[b ^ key[(j) + 27]] ^ key[(j) + 19]], j) + +#define CALC_K256(a, j, k, l, m, n) \ + x = CALC_K256_2 (k, l, 0); \ + y = CALC_K256_2 (m, n, 4); \ + y = (y << 8) + (y >> 24); \ + x += y; y += x; ctx->a[j] = x; \ + ctx->a[(j) + 1] = (y << 9) + (y >> 23) + +/* Perform the key setup. Note that this works only with 128- and 256-bit + * keys, despite the API that looks like it might support other sizes. */ + +int twofish_set_key (struct cipher_context *cx, unsigned char *key, int key_len) +{ + TWOFISH_context *ctx = (TWOFISH_context *)cx->keyinfo; + + int i, j, k; + + /* Temporaries for CALC_K. */ + u32 x, y; + + /* The S vector used to key the S-boxes, split up into individual bytes. + * 128-bit keys use only sa through sh; 256-bit use all of them. */ + u8 sa = 0, sb = 0, sc = 0, sd = 0, se = 0, sf = 0, sg = 0, sh = 0; + u8 si = 0, sj = 0, sk = 0, sl = 0, sm = 0, sn = 0, so = 0, sp = 0; + + /* Temporary for CALC_S. */ + u8 tmp; + + /* Check key length. */ + if( ( ( (unsigned int)key_len - 16 ) | 16 ) != 16 ) + return TWOFISH_WRONG_KEYLENGTH; + + + /* Compute the first two words of the S vector. The magic numbers are + * the entries of the RS matrix, preprocessed through poly_to_exp. The + * numbers in the comments are the original (polynomial form) matrix + * entries. */ + CALC_S (sa, sb, sc, sd, 0, 0x00, 0x2D, 0x01, 0x2D); /* 01 A4 02 A4 */ + CALC_S (sa, sb, sc, sd, 1, 0x2D, 0xA4, 0x44, 0x8A); /* A4 56 A1 55 */ + CALC_S (sa, sb, sc, sd, 2, 0x8A, 0xD5, 0xBF, 0xD1); /* 55 82 FC 87 */ + CALC_S (sa, sb, sc, sd, 3, 0xD1, 0x7F, 0x3D, 0x99); /* 87 F3 C1 5A */ + CALC_S (sa, sb, sc, sd, 4, 0x99, 0x46, 0x66, 0x96); /* 5A 1E 47 58 */ + CALC_S (sa, sb, sc, sd, 5, 0x96, 0x3C, 0x5B, 0xED); /* 58 C6 AE DB */ + CALC_S (sa, sb, sc, sd, 6, 0xED, 0x37, 0x4F, 0xE0); /* DB 68 3D 9E */ + CALC_S (sa, sb, sc, sd, 7, 0xE0, 0xD0, 0x8C, 0x17); /* 9E E5 19 03 */ + CALC_S (se, sf, sg, sh, 8, 0x00, 0x2D, 0x01, 0x2D); /* 01 A4 02 A4 */ + CALC_S (se, sf, sg, sh, 9, 0x2D, 0xA4, 0x44, 0x8A); /* A4 56 A1 55 */ + CALC_S (se, sf, sg, sh, 10, 0x8A, 0xD5, 0xBF, 0xD1); /* 55 82 FC 87 */ + CALC_S (se, sf, sg, sh, 11, 0xD1, 0x7F, 0x3D, 0x99); /* 87 F3 C1 5A */ + CALC_S (se, sf, sg, sh, 12, 0x99, 0x46, 0x66, 0x96); /* 5A 1E 47 58 */ + CALC_S (se, sf, sg, sh, 13, 0x96, 0x3C, 0x5B, 0xED); /* 58 C6 AE DB */ + CALC_S (se, sf, sg, sh, 14, 0xED, 0x37, 0x4F, 0xE0); /* DB 68 3D 9E */ + CALC_S (se, sf, sg, sh, 15, 0xE0, 0xD0, 0x8C, 0x17); /* 9E E5 19 03 */ + + if (key_len == 32) { /* 256-bit key */ + /* Calculate the remaining two words of the S vector */ + CALC_S (si, sj, sk, sl, 16, 0x00, 0x2D, 0x01, 0x2D); /* 01 A4 02 A4 */ + CALC_S (si, sj, sk, sl, 17, 0x2D, 0xA4, 0x44, 0x8A); /* A4 56 A1 55 */ + CALC_S (si, sj, sk, sl, 18, 0x8A, 0xD5, 0xBF, 0xD1); /* 55 82 FC 87 */ + CALC_S (si, sj, sk, sl, 19, 0xD1, 0x7F, 0x3D, 0x99); /* 87 F3 C1 5A */ + CALC_S (si, sj, sk, sl, 20, 0x99, 0x46, 0x66, 0x96); /* 5A 1E 47 58 */ + CALC_S (si, sj, sk, sl, 21, 0x96, 0x3C, 0x5B, 0xED); /* 58 C6 AE DB */ + CALC_S (si, sj, sk, sl, 22, 0xED, 0x37, 0x4F, 0xE0); /* DB 68 3D 9E */ + CALC_S (si, sj, sk, sl, 23, 0xE0, 0xD0, 0x8C, 0x17); /* 9E E5 19 03 */ + CALC_S (sm, sn, so, sp, 24, 0x00, 0x2D, 0x01, 0x2D); /* 01 A4 02 A4 */ + CALC_S (sm, sn, so, sp, 25, 0x2D, 0xA4, 0x44, 0x8A); /* A4 56 A1 55 */ + CALC_S (sm, sn, so, sp, 26, 0x8A, 0xD5, 0xBF, 0xD1); /* 55 82 FC 87 */ + CALC_S (sm, sn, so, sp, 27, 0xD1, 0x7F, 0x3D, 0x99); /* 87 F3 C1 5A */ + CALC_S (sm, sn, so, sp, 28, 0x99, 0x46, 0x66, 0x96); /* 5A 1E 47 58 */ + CALC_S (sm, sn, so, sp, 29, 0x96, 0x3C, 0x5B, 0xED); /* 58 C6 AE DB */ + CALC_S (sm, sn, so, sp, 30, 0xED, 0x37, 0x4F, 0xE0); /* DB 68 3D 9E */ + CALC_S (sm, sn, so, sp, 31, 0xE0, 0xD0, 0x8C, 0x17); /* 9E E5 19 03 */ + + /* Compute the S-boxes. */ + for(i=j=0,k=1; i < 256; i++, j += 2, k += 2 ) { + CALC_SB256_2( i, calc_sb_tbl[j], calc_sb_tbl[k] ); + } + + /* Calculate whitening and round subkeys. The constants are + * indices of subkeys, preprocessed through q0 and q1. */ + CALC_K256 (w, 0, 0xA9, 0x75, 0x67, 0xF3); + CALC_K256 (w, 2, 0xB3, 0xC6, 0xE8, 0xF4); + CALC_K256 (w, 4, 0x04, 0xDB, 0xFD, 0x7B); + CALC_K256 (w, 6, 0xA3, 0xFB, 0x76, 0xC8); + CALC_K256 (k, 0, 0x9A, 0x4A, 0x92, 0xD3); + CALC_K256 (k, 2, 0x80, 0xE6, 0x78, 0x6B); + CALC_K256 (k, 4, 0xE4, 0x45, 0xDD, 0x7D); + CALC_K256 (k, 6, 0xD1, 0xE8, 0x38, 0x4B); + CALC_K256 (k, 8, 0x0D, 0xD6, 0xC6, 0x32); + CALC_K256 (k, 10, 0x35, 0xD8, 0x98, 0xFD); + CALC_K256 (k, 12, 0x18, 0x37, 0xF7, 0x71); + CALC_K256 (k, 14, 0xEC, 0xF1, 0x6C, 0xE1); + CALC_K256 (k, 16, 0x43, 0x30, 0x75, 0x0F); + CALC_K256 (k, 18, 0x37, 0xF8, 0x26, 0x1B); + CALC_K256 (k, 20, 0xFA, 0x87, 0x13, 0xFA); + CALC_K256 (k, 22, 0x94, 0x06, 0x48, 0x3F); + CALC_K256 (k, 24, 0xF2, 0x5E, 0xD0, 0xBA); + CALC_K256 (k, 26, 0x8B, 0xAE, 0x30, 0x5B); + CALC_K256 (k, 28, 0x84, 0x8A, 0x54, 0x00); + CALC_K256 (k, 30, 0xDF, 0xBC, 0x23, 0x9D); + } else { + /* Compute the S-boxes. */ + for(i=j=0,k=1; i < 256; i++, j += 2, k += 2 ) { + CALC_SB_2( i, calc_sb_tbl[j], calc_sb_tbl[k] ); + } + + /* Calculate whitening and round subkeys. The constants are + * indices of subkeys, preprocessed through q0 and q1. */ + CALC_K (w, 0, 0xA9, 0x75, 0x67, 0xF3); + CALC_K (w, 2, 0xB3, 0xC6, 0xE8, 0xF4); + CALC_K (w, 4, 0x04, 0xDB, 0xFD, 0x7B); + CALC_K (w, 6, 0xA3, 0xFB, 0x76, 0xC8); + CALC_K (k, 0, 0x9A, 0x4A, 0x92, 0xD3); + CALC_K (k, 2, 0x80, 0xE6, 0x78, 0x6B); + CALC_K (k, 4, 0xE4, 0x45, 0xDD, 0x7D); + CALC_K (k, 6, 0xD1, 0xE8, 0x38, 0x4B); + CALC_K (k, 8, 0x0D, 0xD6, 0xC6, 0x32); + CALC_K (k, 10, 0x35, 0xD8, 0x98, 0xFD); + CALC_K (k, 12, 0x18, 0x37, 0xF7, 0x71); + CALC_K (k, 14, 0xEC, 0xF1, 0x6C, 0xE1); + CALC_K (k, 16, 0x43, 0x30, 0x75, 0x0F); + CALC_K (k, 18, 0x37, 0xF8, 0x26, 0x1B); + CALC_K (k, 20, 0xFA, 0x87, 0x13, 0xFA); + CALC_K (k, 22, 0x94, 0x06, 0x48, 0x3F); + CALC_K (k, 24, 0xF2, 0x5E, 0xD0, 0xBA); + CALC_K (k, 26, 0x8B, 0xAE, 0x30, 0x5B); + CALC_K (k, 28, 0x84, 0x8A, 0x54, 0x00); + CALC_K (k, 30, 0xDF, 0xBC, 0x23, 0x9D); + } + + return 0; +} + +/* Macros to compute the g() function in the encryption and decryption + * rounds. G1 is the straight g() function; G2 includes the 8-bit + * rotation for the high 32-bit word. */ + +#define G1(a) \ + (ctx->s[0][(a) & 0xFF]) ^ (ctx->s[1][((a) >> 8) & 0xFF]) \ + ^ (ctx->s[2][((a) >> 16) & 0xFF]) ^ (ctx->s[3][(a) >> 24]) + +#define G2(b) \ + (ctx->s[1][(b) & 0xFF]) ^ (ctx->s[2][((b) >> 8) & 0xFF]) \ + ^ (ctx->s[3][((b) >> 16) & 0xFF]) ^ (ctx->s[0][(b) >> 24]) + +/* Encryption and decryption Feistel rounds. Each one calls the two g() + * macros, does the PHT, and performs the XOR and the appropriate bit + * rotations. The parameters are the round number (used to select subkeys), + * and the four 32-bit chunks of the text. */ + +#define ENCROUND(n, a, b, c, d) \ + x = G1 (a); y = G2 (b); \ + x += y; y += x + ctx->k[2 * (n) + 1]; \ + (c) ^= x + ctx->k[2 * (n)]; \ + (c) = ((c) >> 1) + ((c) << 31); \ + (d) = (((d) << 1)+((d) >> 31)) ^ y + +#define DECROUND(n, a, b, c, d) \ + x = G1 (a); y = G2 (b); \ + x += y; y += x; \ + (d) ^= y + ctx->k[2 * (n) + 1]; \ + (d) = ((d) >> 1) + ((d) << 31); \ + (c) = (((c) << 1)+((c) >> 31)); \ + (c) ^= (x + ctx->k[2 * (n)]) + +/* Encryption and decryption cycles; each one is simply two Feistel rounds + * with the 32-bit chunks re-ordered to simulate the "swap" */ + +#define ENCCYCLE(n) \ + ENCROUND (2 * (n), a, b, c, d); \ + ENCROUND (2 * (n) + 1, c, d, a, b) + +#define DECCYCLE(n) \ + DECROUND (2 * (n) + 1, c, d, a, b); \ + DECROUND (2 * (n), a, b, c, d) + +/* Macros to convert the input and output bytes into 32-bit words, + * and simultaneously perform the whitening step. INPACK packs word + * number n into the variable named by x, using whitening subkey number m. + * OUTUNPACK unpacks word number n from the variable named by x, using + * whitening subkey number m. */ + +#define INPACK(n, x, m) \ + x = in[4 * (n)] ^ (in[4 * (n) + 1] << 8) \ + ^ (in[4 * (n) + 2] << 16) ^ (in[4 * (n) + 3] << 24) ^ ctx->w[m] + +#define OUTUNPACK(n, x, m) \ + x ^= ctx->w[m]; \ + out[4 * (n)] = x; out[4 * (n) + 1] = x >> 8; \ + out[4 * (n) + 2] = x >> 16; out[4 * (n) + 3] = x >> 24 + +/* Encrypt one block. in and out may be the same. */ + +int twofish_encrypt (struct cipher_context *cx, + const u8 *in, u8 *out, int size) +{ + TWOFISH_context *ctx = (TWOFISH_context *)cx->keyinfo; + + /* The four 32-bit chunks of the text. */ + u32 a, b, c, d; + + /* Temporaries used by the round function. */ + u32 x, y; + + /* Input whitening and packing. */ + INPACK (0, a, 0); + INPACK (1, b, 1); + INPACK (2, c, 2); + INPACK (3, d, 3); + + /* Encryption Feistel cycles. */ + ENCCYCLE (0); + ENCCYCLE (1); + ENCCYCLE (2); + ENCCYCLE (3); + ENCCYCLE (4); + ENCCYCLE (5); + ENCCYCLE (6); + ENCCYCLE (7); + + /* Output whitening and unpacking. */ + OUTUNPACK (0, c, 4); + OUTUNPACK (1, d, 5); + OUTUNPACK (2, a, 6); + OUTUNPACK (3, b, 7); + + return 0; +} + +/* Decrypt one block. in and out may be the same. */ + +int twofish_decrypt (struct cipher_context *cx, + const u8 *in, u8 *out, int size) +{ + TWOFISH_context *ctx = (TWOFISH_context *)cx->keyinfo; + + /* The four 32-bit chunks of the text. */ + u32 a, b, c, d; + + /* Temporaries used by the round function. */ + u32 x, y; + + /* Input whitening and packing. */ + INPACK (0, c, 4); + INPACK (1, d, 5); + INPACK (2, a, 6); + INPACK (3, b, 7); + + /* Encryption Feistel cycles. */ + DECCYCLE (7); + DECCYCLE (6); + DECCYCLE (5); + DECCYCLE (4); + DECCYCLE (3); + DECCYCLE (2); + DECCYCLE (1); + DECCYCLE (0); + + /* Output whitening and unpacking. */ + OUTUNPACK (0, a, 0); + OUTUNPACK (1, b, 1); + OUTUNPACK (2, c, 2); + OUTUNPACK (3, d, 3); + + return 0; +} + +static void twofish_lock(void) +{ + MOD_INC_USE_COUNT; +} + +static void twofish_unlock(void) +{ + MOD_DEC_USE_COUNT; +} + +#define CIPHER_BITS_128 +#define CIPHER_NAME(x) twofish##x +#include "gen-cbc.h" +#include "gen-ecb.h" + + +static struct cipher_implementation twofish = { + {{NULL,NULL},CIPHER_TWOFISH, "twofish"}, + blocksize: 16, + ivsize: 0, + key_schedule_size: TWOFISH_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(twofish_ecb), + INIT_CIPHER_OPS(twofish) +}; + +static struct cipher_implementation twofish_cbc = { + {{NULL,NULL},CIPHER_TWOFISH | CIPHER_CBC, "twofish-cbc"}, + blocksize: 16, + ivsize: 16, + key_schedule_size: TWOFISH_KEY_SCHEDULE_SIZE, + key_size_mask: CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | + CIPHER_KEYSIZE_256, + INIT_CIPHER_BLKOPS(twofish_cbc), + INIT_CIPHER_OPS(twofish) +}; + +#ifdef MODULE + int __init init_module(void) +#else + int __init init_twofish(void) +#endif +{ + if (register_cipher(&twofish)) + printk(KERN_WARNING "Couldn't register twofish encryption\n"); + if (register_cipher(&twofish_cbc)) + printk(KERN_WARNING "Couldn't register twofish-cbc encryption\n"); + + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ + if (unregister_cipher(&twofish)) + printk(KERN_WARNING "Couldn't unregister twofish encryption\n"); + if (unregister_cipher(&twofish_cbc)) + printk(KERN_WARNING "Couldn't unregister twofish-cbc encryption\n"); +} + +#endif diff -urN lin.2.2.17/crypto/twofish3.c int.2.2.17.x/crypto/twofish3.c --- lin.2.2.17/crypto/twofish3.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/crypto/twofish3.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,437 @@ +/* NOTE: This implementation has been changed from the original + source. See ChangeLog for more information. + Maintained by Alexander Kjeldaas <astor@fast.no> + */ + +/* This is an independent implementation of the Twofish encryption */ +/* algorithm designed by Bruce Schneier and colleagues and offered */ +/* as a candidate algorithm for the US NIST Advanced Encryption */ +/* Standard (AES) effort. */ +/* */ +/* Copyright in this implementation is held by Dr B R Gladman but */ +/* I hereby give permission for its free direct or derivative use */ +/* subject to acknowledgment of its origin. */ +/* */ +/* My thanks to Niels Ferguson and the Twofish team for suggesting */ +/* an additional optimisation for this code */ +/* */ +/* Dr Brian Gladman (gladman@seven77.demon.co.uk) 18th October 1998 */ +/* */ +/* Timing data: + +Algorithm: twofish (twofish3.c) +128 bit key: +Key Setup: 16333 cycles +Encrypt: 396 cycles = 64.6 mbits/sec +Decrypt: 397 cycles = 64.5 mbits/sec +Mean: 396 cycles = 64.6 mbits/sec +192 bit key: +Key Setup: 23378 cycles +Encrypt: 396 cycles = 64.6 mbits/sec +Decrypt: 398 cycles = 64.3 mbits/sec +Mean: 397 cycles = 64.5 mbits/sec +256 bit key: +Key Setup: 24791 cycles +Encrypt: 396 cycles = 64.6 mbits/sec +Decrypt: 395 cycles = 64.8 mbits/sec +Mean: 396 cycles = 64.7 mbits/sec + + +*/ + +#include <linux/types.h> +#include <linux/wordops.h> +#include <linux/crypto.h> + +#if 0 +#define rotl rotl32 +#define rotr rotr32 +#else +#define rotl generic_rotl32 +#define rotr generic_rotr32 +#endif + +#define Q_TABLES +#define M_TABLE +#define MK_TABLE +#define ONE_STEP + +u4byte k_len; +u4byte l_key[40]; +u4byte s_key[4]; + +/* finite field arithmetic for GF(2**8) with the modular */ +/* polynomial x**8 + x**6 + x**5 + x**3 + 1 (0x169) */ + +#define G_M 0x0169 + +u1byte tab_5b[4] = { 0, G_M >> 2, G_M >> 1, (G_M >> 1) ^ (G_M >> 2) }; +u1byte tab_ef[4] = { 0, (G_M >> 1) ^ (G_M >> 2), G_M >> 1, G_M >> 2 }; + +#define ffm_01(x) (x) +#define ffm_5b(x) ((x) ^ ((x) >> 2) ^ tab_5b[(x) & 3]) +#define ffm_ef(x) ((x) ^ ((x) >> 1) ^ ((x) >> 2) ^ tab_ef[(x) & 3]) + +u1byte ror4[16] = { 0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15 }; +u1byte ashx[16] = { 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 5, 14, 7 }; + +u1byte qt0[2][16] = +{ { 8, 1, 7, 13, 6, 15, 3, 2, 0, 11, 5, 9, 14, 12, 10, 4 }, + { 2, 8, 11, 13, 15, 7, 6, 14, 3, 1, 9, 4, 0, 10, 12, 5 } +}; + +u1byte qt1[2][16] = +{ { 14, 12, 11, 8, 1, 2, 3, 5, 15, 4, 10, 6, 7, 0, 9, 13 }, + { 1, 14, 2, 11, 4, 12, 3, 7, 6, 13, 10, 5, 15, 9, 0, 8 } +}; + +u1byte qt2[2][16] = +{ { 11, 10, 5, 14, 6, 13, 9, 0, 12, 8, 15, 3, 2, 4, 7, 1 }, + { 4, 12, 7, 5, 1, 6, 9, 10, 0, 14, 13, 8, 2, 11, 3, 15 } +}; + +u1byte qt3[2][16] = +{ { 13, 7, 15, 4, 1, 2, 6, 14, 9, 11, 3, 0, 8, 5, 12, 10 }, + { 11, 9, 5, 1, 12, 3, 13, 14, 6, 4, 7, 15, 2, 0, 8, 10 } +}; + +u1byte qp(const u4byte n, const u1byte x) +{ u1byte a0, a1, a2, a3, a4, b0, b1, b2, b3, b4; + + a0 = x >> 4; b0 = x & 15; + a1 = a0 ^ b0; b1 = ror4[b0] ^ ashx[a0]; + a2 = qt0[n][a1]; b2 = qt1[n][b1]; + a3 = a2 ^ b2; b3 = ror4[b2] ^ ashx[a2]; + a4 = qt2[n][a3]; b4 = qt3[n][b3]; + return (b4 << 4) | a4; +}; + +#ifdef Q_TABLES + +u4byte qt_gen = 0; +u1byte q_tab[2][256]; + +#define q(n,x) q_tab[n][x] + +void gen_qtab(void) +{ u4byte i; + + for(i = 0; i < 256; ++i) + { + q(0,i) = qp(0, (u1byte)i); + q(1,i) = qp(1, (u1byte)i); + } +}; + +#else + +#define q(n,x) qp(n, x) + +#endif + +#ifdef M_TABLE + +u4byte mt_gen = 0; +u4byte m_tab[4][256]; + +void gen_mtab(void) +{ u4byte i, f01, f5b, fef; + + for(i = 0; i < 256; ++i) + { + f01 = q(1,i); f5b = ffm_5b(f01); fef = ffm_ef(f01); + m_tab[0][i] = f01 + (f5b << 8) + (fef << 16) + (fef << 24); + m_tab[2][i] = f5b + (fef << 8) + (f01 << 16) + (fef << 24); + + f01 = q(0,i); f5b = ffm_5b(f01); fef = ffm_ef(f01); + m_tab[1][i] = fef + (fef << 8) + (f5b << 16) + (f01 << 24); + m_tab[3][i] = f5b + (f01 << 8) + (fef << 16) + (f5b << 24); + } +}; + +#define mds(n,x) m_tab[n][x] + +#else + +#define fm_00 ffm_01 +#define fm_10 ffm_5b +#define fm_20 ffm_ef +#define fm_30 ffm_ef +#define q_0(x) q(1,x) + +#define fm_01 ffm_ef +#define fm_11 ffm_ef +#define fm_21 ffm_5b +#define fm_31 ffm_01 +#define q_1(x) q(0,x) + +#define fm_02 ffm_5b +#define fm_12 ffm_ef +#define fm_22 ffm_01 +#define fm_32 ffm_ef +#define q_2(x) q(1,x) + +#define fm_03 ffm_5b +#define fm_13 ffm_01 +#define fm_23 ffm_ef +#define fm_33 ffm_5b +#define q_3(x) q(0,x) + +#define f_0(n,x) ((u4byte)fm_0##n(x)) +#define f_1(n,x) ((u4byte)fm_1##n(x) << 8) +#define f_2(n,x) ((u4byte)fm_2##n(x) << 16) +#define f_3(n,x) ((u4byte)fm_3##n(x) << 24) + +#define mds(n,x) f_0(n,q_##n(x)) ^ f_1(n,q_##n(x)) ^ f_2(n,q_##n(x)) ^ f_3(n,q_##n(x)) + +#endif + +u4byte h_fun(const u4byte x, const u1byte key[]) +{ u1byte b0, b1, b2, b3; + + b0 = byte(x, 0); b1 = byte(x, 1); b2 = byte(x, 2); b3 = byte(x, 3); + + switch(k_len) + { + case 4: + b0 = q(1,b0) ^ key[12]; + b1 = q(0,b1) ^ key[13]; + b2 = q(0,b2) ^ key[14]; + b3 = q(1,b3) ^ key[15]; + case 3: /* fall through */ + b0 = q(1,b0) ^ key[ 8]; + b1 = q(1,b1) ^ key[ 9]; + b2 = q(0,b2) ^ key[10]; + b3 = q(0,b3) ^ key[11]; + case 2: /* fall through */ + b0 = q(0,q(0,b0) ^ key[4]) ^ key[0]; + b1 = q(0,q(1,b1) ^ key[5]) ^ key[1]; + b2 = q(1,q(0,b2) ^ key[6]) ^ key[2]; + b3 = q(1,q(1,b3) ^ key[7]) ^ key[3]; + } + +#ifdef M_TABLE + + return mds(0, b0) ^ mds(1, b1) ^ mds(2, b2) ^ mds(3, b3); + +#else + + b0 = q(1,b0); b1 = q(0,b1); b2 = q(1,b2); b3 = q(0,b3); + + return (u4byte)( b0 ^ ffm_ef(b1) ^ ffm_5b(b2) ^ ffm_5b(b3)) ^ + (u4byte)(ffm_5b(b0) ^ ffm_ef(b1) ^ ffm_ef(b2) ^ b3 ) << 8 ^ + (u4byte)(ffm_ef(b0) ^ ffm_5b(b1) ^ b2 ^ ffm_ef(b3)) << 16 ^ + (u4byte)(ffm_ef(b0) ^ b1 ^ ffm_ef(b2) ^ ffm_5b(b3)) << 24; +#endif +}; + +#ifdef MK_TABLE + +#ifdef ONE_STEP +u4byte mk_tab[4][256]; +#else +u1byte sb[4][256]; +#endif + +gen_mk_tab(u1byte key[]) +{ u1byte b0, b1, b2, b3; + u4byte i; + + for(i = 0; i < 256; ++i) + { + b0 = b1 = b2 = b3 = i; + + switch(k_len) + { + case 4: + b0 = q(1,b0) ^ key[12]; b1 = q(0,b1) ^ key[13]; + b2 = q(0,b2) ^ key[14]; b3 = q(1,b3) ^ key[15]; + case 3: /* fall through */ + b0 = q(1,b0) ^ key[ 8]; b1 = q(1,b1) ^ key[ 9]; + b2 = q(0,b2) ^ key[10]; b3 = q(0,b3) ^ key[11]; + case 2: /* fall through */ + b0 = q(0,q(0,b0) ^ key[4]) ^ key[0]; + b1 = q(0,q(1,b1) ^ key[5]) ^ key[1]; + b2 = q(1,q(0,b2) ^ key[6]) ^ key[2]; + b3 = q(1,q(1,b3) ^ key[7]) ^ key[3]; + } +#ifdef ONE_STEP + mk_tab[0][i] = mds(0, b0); + mk_tab[1][i] = mds(1, b1); + mk_tab[2][i] = mds(2, b2); + mk_tab[3][i] = mds(3, b3); +#else + sb[0][i] = b0; + sb[1][i] = b1; + sb[2][i] = b2; + sb[3][i] = b3; +#endif + } +}; + +# ifdef ONE_STEP +# define g0_fun(x) mk_tab[0][byte(x,0)] ^ mk_tab[1][byte(x,1)] \ + ^ mk_tab[2][byte(x,2)] ^ mk_tab[3][byte(x,3)] +# define g1_fun(x) mk_tab[0][byte(x,3)] ^ mk_tab[1][byte(x,0)] \ + ^ mk_tab[2][byte(x,1)] ^ mk_tab[3][byte(x,2)] +# else +# define g0_fun(x) mds(0, sb[0][byte(x,0)]) ^ mds(1, sb[1][byte(x,1)]) \ + ^ mds(2, sb[2][byte(x,2)]) ^ mds(3, sb[3][byte(x,3)]) +# define g1_fun(x) mds(0, sb[0][byte(x,3)]) ^ mds(1, sb[1][byte(x,0)]) \ + ^ mds(2, sb[2][byte(x,1)]) ^ mds(3, sb[3][byte(x,2)]) +# endif + +#else + +#define g0_fun(x) h_fun(x,(u1byte*)s_key) +#define g1_fun(x) h_fun(rotl(x,8),(u1byte*)s_key) + +#endif + +/* The (12,8) Reed Soloman code has the generator polynomial + + g(x) = x**4 + (a + 1/a) * x**3 + a * x**2 + (a + 1/a) * x + 1 + +where the coefficients are in the finite field GF(2**8) with a +modular polynomial a**8 + a**6 + a**3 + a**2 + 1. To generate the +remainder we have to start with a 12th order polynomial with our +eight input bytes as the coefficients of the 4th to 11th terms. +That is: + + m[7] * x**11 + m[6] * x**10 ... + m[0] * x**4 + 0 * x**3 +... + 0 + +We then multiply the generator polynomial by m[7] * x**7 and subtract +it - xor in GF(2**8) - from the above to eliminate the x**7 term (the +artihmetic on the coefficients is done in GF(2**8). We then multiply +the generator polynomial by x**6 * coeff(x**10) and use this to remove +the x**10 term. We carry on in this way until the x**4 term is removed +so that we are left with: + + r[3] * x**3 + r[2] * x**2 + r[1] 8 x**1 + r[0] + +which give the resulting 4 bytes of the remainder. This is equivalent +to the matrix multiplication in the Twofish description but much faster +to implement. + +*/ + +#define G_MOD 0x0000014d + +u4byte mds_rem(u4byte p0, u4byte p1) +{ u4byte i, t, u; + + for(i = 0; i < 8; ++i) + { + t = p1 >> 24; + + p1 = (p1 << 8) | (p0 >> 24); p0 <<= 8; + + u = (t << 1) ^ (t & 0x80 ? G_MOD : 0); + + p1 ^= t ^ (u << 16); + + u ^= (t >> 1) ^ (t & 0x01 ? G_MOD >> 1 : 0); + + p1 ^= (u << 8) | (u << 24); + } + + return p1; +}; + +/* initialise the key schedule from the user supplied key */ + +u4byte *set_key(const u4byte in_key[], const u4byte key_len) +{ u4byte i, a, b, me_key[4], mo_key[4]; + +#ifdef Q_TABLES + if(!qt_gen) + { + gen_qtab(); qt_gen = 1; + } +#endif + +#ifdef M_TABLE + if(!mt_gen) + { + gen_mtab(); mt_gen = 1; + } +#endif + + k_len = key_len / 64; /* 2, 3 or 4 */ + + for(i = 0; i < k_len; ++i) + { + a = in_key[i + i]; me_key[i] = a; + b = in_key[i + i + 1]; mo_key[i] = b; + s_key[k_len - i - 1] = mds_rem(a, b); + } + + for(i = 0; i < 40; i += 2) + { + a = 0x01010101 * i; b = a + 0x01010101; + a = h_fun(a, (u1byte*)me_key); + b = rotl(h_fun(b, (u1byte*)mo_key), 8); + l_key[i] = a + b; + l_key[i + 1] = rotl(a + 2 * b, 9); + } + +#ifdef MK_TABLE + gen_mk_tab((u1byte*)s_key); +#endif + + return l_key; +}; + +/* encrypt a block of text */ + +#define f_rnd(i) \ + t0 = g0_fun(blk[0]); t1 = g1_fun(blk[1]); \ + blk[2] = rotr(blk[2] ^ (t0 + t1 + l_key[4 * (i) + 8]), 1); \ + blk[3] = rotl(blk[3], 1) ^ (t0 + 2 * t1 + l_key[4 * (i) + 9]); \ + t0 = g0_fun(blk[2]); t1 = g1_fun(blk[3]); \ + blk[0] = rotr(blk[0] ^ (t0 + t1 + l_key[4 * (i) + 10]), 1); \ + blk[1] = rotl(blk[1], 1) ^ (t0 + 2 * t1 + l_key[4 * (i) + 11]) + +void encrypt(const u4byte in_blk[4], u4byte out_blk[]) +{ u4byte t0, t1, blk[4]; + + blk[0] = in_blk[0] ^ l_key[0]; + blk[1] = in_blk[1] ^ l_key[1]; + blk[2] = in_blk[2] ^ l_key[2]; + blk[3] = in_blk[3] ^ l_key[3]; + + f_rnd(0); f_rnd(1); f_rnd(2); f_rnd(3); + f_rnd(4); f_rnd(5); f_rnd(6); f_rnd(7); + + out_blk[0] = blk[2] ^ l_key[4]; + out_blk[1] = blk[3] ^ l_key[5]; + out_blk[2] = blk[0] ^ l_key[6]; + out_blk[3] = blk[1] ^ l_key[7]; +}; + +/* decrypt a block of text */ + +#define i_rnd(i) \ + t0 = g0_fun(blk[0]); t1 = g1_fun(blk[1]); \ + blk[2] = rotl(blk[2], 1) ^ (t0 + t1 + l_key[4 * (i) + 10]); \ + blk[3] = rotr(blk[3] ^ (t0 + 2 * t1 + l_key[4 * (i) + 11]), 1); \ + t0 = g0_fun(blk[2]); t1 = g1_fun(blk[3]); \ + blk[0] = rotl(blk[0], 1) ^ (t0 + t1 + l_key[4 * (i) + 8]); \ + blk[1] = rotr(blk[1] ^ (t0 + 2 * t1 + l_key[4 * (i) + 9]), 1) + +void decrypt(const u4byte in_blk[4], u4byte out_blk[4]) +{ u4byte t0, t1, blk[4]; + + blk[0] = in_blk[0] ^ l_key[4]; + blk[1] = in_blk[1] ^ l_key[5]; + blk[2] = in_blk[2] ^ l_key[6]; + blk[3] = in_blk[3] ^ l_key[7]; + + i_rnd(7); i_rnd(6); i_rnd(5); i_rnd(4); + i_rnd(3); i_rnd(2); i_rnd(1); i_rnd(0); + + out_blk[0] = blk[2] ^ l_key[0]; + out_blk[1] = blk[3] ^ l_key[1]; + out_blk[2] = blk[0] ^ l_key[2]; + out_blk[3] = blk[1] ^ l_key[3]; +}; diff -urN lin.2.2.17/drivers/block/Config.in int.2.2.17.x/drivers/block/Config.in --- lin.2.2.17/drivers/block/Config.in Wed Jun 7 23:26:42 2000 +++ int.2.2.17.x/drivers/block/Config.in Sat Oct 14 00:48:17 2000 @@ -97,6 +97,22 @@ comment 'Additional Block Devices' tristate 'Loopback device support' CONFIG_BLK_DEV_LOOP +if [ "$CONFIG_BLK_DEV_LOOP" != "n" ]; then + bool ' Use relative block numbers as basis for transfer functions (RECOMMENDED)' CONFIG_BLK_DEV_LOOP_USE_REL_BLOCK + + # GONFIG_BLK_DEV_LOOP_GEN is dependent on two other variables that + # each could be compiled as a module. + if [ "$CONFIG_CIPHERS" != "n" ]; then + if [ "$CONFIG_CIPHERS" = "m" ]; then + define_string CONFIG_BLK_DEV_LOOP_GEN_SEL $CONFIG_CIPHERS + else + define_string CONFIG_BLK_DEV_LOOP_GEN_SEL $CONFIG_BLK_DEV_LOOP + fi + dep_tristate ' General encryption support (EXPERIMENTAL)' CONFIG_BLK_DEV_LOOP_GEN $CONFIG_BLK_DEV_LOOP_GEN_SEL + fi + dep_tristate ' CAST 128 encryption (EXPERIMENTAL)' CONFIG_BLK_DEV_LOOP_CAST $CONFIG_BLK_DEV_LOOP + dep_tristate ' Twofish encryption (EXPERIMENTAL)' CONFIG_BLK_DEV_LOOP_FISH2 $CONFIG_BLK_DEV_LOOP +fi if [ "$CONFIG_NET" = "y" ]; then tristate 'Network block device support' CONFIG_BLK_DEV_NBD fi diff -urN lin.2.2.17/drivers/block/Makefile int.2.2.17.x/drivers/block/Makefile --- lin.2.2.17/drivers/block/Makefile Thu May 4 02:16:32 2000 +++ int.2.2.17.x/drivers/block/Makefile Sat Oct 14 00:48:17 2000 @@ -94,6 +94,30 @@ endif endif +ifeq ($(CONFIG_BLK_DEV_LOOP_GEN),y) +LX_OBJS += loop_gen.o +else + ifeq ($(CONFIG_BLK_DEV_LOOP_GEN),m) + MX_OBJS += loop_gen.o + endif +endif + +ifeq ($(CONFIG_BLK_DEV_LOOP_CAST),y) + L_OBJS += loop_cast.o +else + ifeq ($(CONFIG_BLK_DEV_LOOP_CAST),m) + M_OBJS += loop_cast.o + endif +endif + +ifeq ($(CONFIG_BLK_DEV_LOOP_FISH2),y) + L_OBJS += loop_fish2.o +else + ifeq ($(CONFIG_BLK_DEV_LOOP_FISH2),m) + M_OBJS += loop_fish2.o + endif +endif + ifeq ($(CONFIG_BLK_DEV_HD),y) L_OBJS += hd.o endif diff -urN lin.2.2.17/drivers/block/ll_rw_blk.c int.2.2.17.x/drivers/block/ll_rw_blk.c --- lin.2.2.17/drivers/block/ll_rw_blk.c Wed Jun 7 23:26:42 2000 +++ int.2.2.17.x/drivers/block/ll_rw_blk.c Sat Oct 14 00:48:17 2000 @@ -1024,8 +1024,26 @@ #ifdef CONFIG_BLK_DEV_RAM rd_init(); #endif +#ifdef CONFIG_BLK_DEV_LOOP_GEN + loop_gen_init(); +#endif #ifdef CONFIG_BLK_DEV_LOOP loop_init(); +#endif +#ifdef CONFIG_BLK_DEV_LOOP_SERPENT + loop_serpent_init(); +#endif +#ifdef CONFIG_BLK_DEV_LOOP_CAST + loop_cast_init(); +#endif +#ifdef CONFIG_BLK_DEV_LOOP_IDEA + loop_idea_init(); +#endif +#ifdef CONFIG_BLK_DEV_LOOP_BLOW + loop_blow_init(); +#endif +#ifdef CONFIG_BLK_DEV_LOOP_FISH2 + loop_fish2_init(); #endif #ifdef CONFIG_ISP16_CDI isp16_init(); diff -urN lin.2.2.17/drivers/block/loop.c int.2.2.17.x/drivers/block/loop.c --- lin.2.2.17/drivers/block/loop.c Tue Jan 4 19:12:14 2000 +++ int.2.2.17.x/drivers/block/loop.c Sat Oct 14 00:48:17 2000 @@ -37,6 +37,10 @@ #include <linux/module.h> +#ifdef CONFIG_KMOD +#include <linux/kmod.h> +#endif /* CONFIG_KMOD */ + #include <linux/sched.h> #include <linux/fs.h> #include <linux/file.h> @@ -238,6 +242,8 @@ } if (block_present) { + int transfer_result; + int transfer_block = real_block; bh = getblk(lo->lo_device, real_block, blksize); if (!bh) { printk(KERN_ERR "loop: device %s: getblk(-, %d, %d) returned NULL", @@ -254,9 +260,13 @@ goto error_out_lock; } } - - if ((lo->transfer)(lo, current_request->cmd, bh->b_data + offset, - dest_addr, size, real_block)) { +#ifdef CONFIG_BLK_DEV_LOOP_USE_REL_BLOCK + transfer_block = block; +#endif + transfer_result = (lo->transfer) + (lo, current_request->cmd, bh->b_data + offset, + dest_addr, size, transfer_block); + if (transfer_result) { printk(KERN_ERR "loop: transfer error block %d\n", block); brelse(bh); goto error_out_lock; @@ -447,22 +457,54 @@ return err; } -static int loop_init_xfer(struct loop_device *lo, int type,struct loop_info *i) +static int loop_init_xfer(struct loop_device *lo, int type, struct loop_info *i) { int err = 0; + if (type) { struct loop_func_table *xfer = xfer_funcs[type]; + if (xfer->lock) + xfer->lock(lo); + if (xfer->init) err = xfer->init(lo, i); - if (!err) { - lo->lo_encrypt_type = type; - if (xfer->lock) - xfer->lock(lo); + + if (!err) + lo->lo_encrypt_type = i->lo_encrypt_type; + else { + if (xfer->unlock) + xfer->unlock(lo); } } return err; } +static int loop_request_xfer(int type) +{ + char module_name[50]; + + if (type >= MAX_LO_CRYPT) + return -EINVAL; + if (xfer_funcs[type]) { + return 0; + } + +#ifdef CONFIG_KMOD + sprintf(module_name, "loop-xfer-%d", type); + request_module(module_name); + if (xfer_funcs[type]) { + return 0; + } + + sprintf(module_name, "loop-xfer-gen-%x", type & ~0xf); + request_module(module_name); + if (xfer_funcs[type]) { + return 0; + } +#endif + return -EINVAL; +} + static int loop_clr_fd(struct loop_device *lo, kdev_t dev) { struct dentry *dentry = lo->lo_dentry; @@ -514,8 +556,9 @@ if ((unsigned int) info.lo_encrypt_key_size > LO_KEY_SIZE) return -EINVAL; type = info.lo_encrypt_type; - if (type >= MAX_LO_CRYPT || xfer_funcs[type] == NULL) - return -EINVAL; + err = loop_request_xfer(type); + if (err) + return err; err = loop_release_xfer(lo); if (!err) err = loop_init_xfer(lo, type, &info); @@ -604,7 +647,7 @@ static int lo_open(struct inode *inode, struct file *file) { struct loop_device *lo; - int dev, type; + int dev; if (!inode) @@ -619,9 +662,6 @@ } lo = &loop_dev[dev]; - type = lo->lo_encrypt_type; - if (type && xfer_funcs[type] && xfer_funcs[type]->lock) - xfer_funcs[type]->lock(lo); lo->lo_refcnt++; MOD_INC_USE_COUNT; return 0; @@ -646,10 +686,7 @@ if (lo->lo_refcnt <= 0) printk(KERN_ERR "lo_release: refcount(%d) <= 0\n", lo->lo_refcnt); else { - int type = lo->lo_encrypt_type; --lo->lo_refcnt; - if (xfer_funcs[type] && xfer_funcs[type]->unlock) - xfer_funcs[type]->unlock(lo); MOD_DEC_USE_COUNT; } return err; @@ -701,8 +738,26 @@ return 0; } +struct loop_func_table *loop_find_xfer_funcs(int number) +{ + struct loop_device *lo; + struct loop_func_table *funcs = NULL; + + if ((unsigned)number >= MAX_LO_CRYPT) + return NULL; + for (lo = &loop_dev[0]; lo < &loop_dev[MAX_LOOP]; lo++) { + int type = lo->lo_encrypt_type; + if (type == number) { + funcs = xfer_funcs[type]; + break; + } + } + return funcs; +} + EXPORT_SYMBOL(loop_register_transfer); EXPORT_SYMBOL(loop_unregister_transfer); +EXPORT_SYMBOL(loop_find_xfer_funcs); int __init loop_init(void) { diff -urN lin.2.2.17/drivers/block/loop_cast.c int.2.2.17.x/drivers/block/loop_cast.c --- lin.2.2.17/drivers/block/loop_cast.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/drivers/block/loop_cast.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,1335 @@ +/* + * linux/drivers/block/loop_cast.c + * + * PURPOSE + * CAST-128 encryption loop data transformation ("cast"). + * + * DESCRIPTION + * + * HISTORY + * May 23, 1997 - Andrew E. Mileski + * Written, tested, and released. + */ +#include <linux/blkdev.h> +#include <linux/fs.h> +#include <linux/init.h> +#include <linux/locks.h> +#include <linux/loop.h> +#include <linux/module.h> +#include <linux/string.h> +#include <linux/slab.h> + +/* Optimize the CAST-128 code */ +#if !defined(i386) && !defined(i486) +#if defined(CONFIG_M386) +#define i386 +#endif +#if defined(CONFIG_M486) || defined(CONFIG_M586) || defined(CONFIG_M686) +#define i486 +#endif +#endif /* !i386 && !i486 */ + +typedef __u32 U32; +typedef __u8 U8; + +/* Internal Prototypes */ +static void cast_keySchedule(U32 *, U32 *); +static U32 cast_decrypt(U32 *, U32 *, U32 *, U32); +static U32 cast_encrypt(U32 *, U32 *, U32 *, U32); +static int cast_release(struct loop_device *lo); +static int cast_init(struct loop_device *lo, struct loop_info *info); +static int cast_transfer(struct loop_device *lo, int cmd, char *raw_buf, + char *loop_buf, int size, int real_block); + +/* Loop device specific data */ +struct cast_public { + U32 key[LO_KEY_SIZE >> 2]; +}; +struct cast_private { + U32 skeys[32]; +}; +struct cast_data { + struct cast_public public; + struct cast_private private; +}; + + +static void cast_lock(struct loop_device *lo) +{ + MOD_INC_USE_COUNT; +} + +static void cast_unlock(struct loop_device *lo) +{ + MOD_DEC_USE_COUNT; +} + +/* Loop data transformation entry for "cast" */ +static struct loop_func_table cast_funcs = +{ + number: LO_CRYPT_CAST128, + transfer: cast_transfer, + init: cast_init, + release: cast_release, + lock: cast_lock, + unlock: cast_unlock +}; + +/* + * loop_cast_init / init_module + * + * PURPOSE + * Register the loop data transformation "cast". + * + * HISTORY + * May 3, 1997 - Andrew E. Mileski + * Written, tested, and released. + */ +#if defined(MODULE) +extern int init_module(void) +#else +int __init loop_cast_init(void) +#endif defined(MODULE) +{ + int err; + + if ((err=loop_register_transfer(&cast_funcs))) { + printk(KERN_WARNING "Couldn't register cast-128 encryption\n"); + return err; + } + + printk(KERN_INFO "loop: registered cast-128 encryption \n"); + + return 0; +} + +#if defined(MODULE) +/* + * cleanup_module + * + * PURPOSE + * Unregister the loop data transformation "cast". + * + * HISTORY + * May 3, 1997 - Andrew E. Mileski + * Written, tested, and released. + */ +extern +void cleanup_module (void) +{ + loop_unregister_transfer(LO_CRYPT_CAST128); +} +#endif defined(MODULE) + +static int cast_init(struct loop_device *lo, struct loop_info *info) +{ + struct cast_data *key; + if (info->lo_encrypt_key_size != 16) + return -EINVAL; + + key=(struct cast_data *)kmalloc(sizeof(struct cast_data),GFP_KERNEL); + if (key == NULL) + return -ENOMEM; + + lo->key_data=key; + memcpy(key->public.key, info->lo_encrypt_key, 16); + cast_keySchedule(key->public.key, key->private.skeys); + MOD_INC_USE_COUNT; + return 0; +} + +static int cast_release(struct loop_device *lo) +{ + if (lo->key_data != NULL) + { + kfree(lo->key_data); + lo->key_data=NULL; + MOD_DEC_USE_COUNT; + } + return (0); +} + +static int cast_transfer(struct loop_device *lo, int cmd, char *raw_buf, + char *loop_buf, int size, int real_block) +{ + register U32 *K, *M, *C, result; + K = ((struct cast_data *) (lo->key_data))->private.skeys; + M = (U32 *)loop_buf; + C = (U32 *)raw_buf; + if (cmd == READ) { + /* Decrypt */ + result = cast_decrypt(K, M, C, size); + + /* Pad if necessary */ + if (result) { + C = C + ((size - result) >> 2); + M = M + ((size - result) >> 2); + memcpy(M, C, result); + memset(((U8 *)M) + result, 0, 8 - result); + cast_decrypt(K, M, M, size); + } + } else { + /* Encrypt */ + result = cast_encrypt(K, M, C, size); + + /* Pad if necessary */ + if (result) { + C = C + ((size - result) >> 2); + M = M + ((size - result) >> 2); + memcpy(C, M, result); + memset(((U8 *)C) + result, 0, 8 - result); + cast_decrypt(K, C, C, size); + } + } + return 0; +} + + +/* + * cast.c + * + * PURPOSE + * The CAST-128 data encryption/decryption algorithm. + * + * DESCRIPTION + * The following code should be completely portable. + * Refer to RFC 2144 for complete details on the algorithm. + * + * This code _only_ implements keys of 128 bits in length, though the + * CAST algorithm supports keys of lengths 40 bits to 128 bits in steps + * of 8 bits. + * + * Make sure that the type U32 is a 32 bit unsigned integer, and that + * U8 is an 8 bit unsigned integer. + * + * For best performance, define as many of the following as possible: + * BIG_ENDIAN - Native byte order is 1234. + * These only apply when using GNU C: + * __GNUC__ - GNU C defines this. + * i386 - Reduce cast_rol() to "roll". + * i486 - Reduce htonl() and ntohl() to "bswapl". + * + * To run a full maintenance test (Appendix B, section 2), and a + * processing speed test, uncomment the line "#define DO_TESTS". + * + * EXPORT INFO + * This software is 100% of Canadian origin (both the algorithm and + * the code), and is NOT subject to U.S. ITAR export restrictions. + * Only Canadian export restictions apply. + * + * Both the algorithm and this code are both "in the public domain", + * with the restriction that the algorithm and code authors maintain + * the copyrights to their work. + * + * HISTORY + * May 23, 1997 - Andrew E. Mileski <aem@netcom.ca> + * Implemented RFC 2144 in C, tested, and released. + */ + +/* #define BIG_ENDIAN */ +/* #define DO_TESTS */ +/* #define i386 */ +/* #define i486 */ + +/* These should be adjusted to the machine used */ +/* typedef unsigned U32; */ +/* typedef unsigned char U8; */ + +#if !defined(__GNUC__) +#if defined(__STDC__) +#define __inline__ inline +#else /* !defined(__STDC__) */ +#error For speed, you should rewrite all the inline functions as macros. +#endif /* !defined(__STDC__) */ +#endif /* !defined(__GNUC__) */ + +#define EXTERNAL_LINKAGE static +#define INTERNAL_LINKAGE static + +/* Prototypes */ +EXTERNAL_LINKAGE void cast_keySchedule(U32 *, U32 *); +EXTERNAL_LINKAGE U32 cast_encrypt(U32 *, U32 *, U32 *, U32); +EXTERNAL_LINKAGE U32 cast_decrypt(U32 *, U32 *, U32 *, U32); + +/* First substitution box (S box) */ +INTERNAL_LINKAGE U32 S1[256] = { + 0x30fb40d4U, 0x9fa0ff0bU, 0x6beccd2fU, 0x3f258c7aU, + 0x1e213f2fU, 0x9c004dd3U, 0x6003e540U, 0xcf9fc949U, + 0xbfd4af27U, 0x88bbbdb5U, 0xe2034090U, 0x98d09675U, + 0x6e63a0e0U, 0x15c361d2U, 0xc2e7661dU, 0x22d4ff8eU, + 0x28683b6fU, 0xc07fd059U, 0xff2379c8U, 0x775f50e2U, + 0x43c340d3U, 0xdf2f8656U, 0x887ca41aU, 0xa2d2bd2dU, + 0xa1c9e0d6U, 0x346c4819U, 0x61b76d87U, 0x22540f2fU, + 0x2abe32e1U, 0xaa54166bU, 0x22568e3aU, 0xa2d341d0U, + 0x66db40c8U, 0xa784392fU, 0x004dff2fU, 0x2db9d2deU, + 0x97943facU, 0x4a97c1d8U, 0x527644b7U, 0xb5f437a7U, + 0xb82cbaefU, 0xd751d159U, 0x6ff7f0edU, 0x5a097a1fU, + 0x827b68d0U, 0x90ecf52eU, 0x22b0c054U, 0xbc8e5935U, + 0x4b6d2f7fU, 0x50bb64a2U, 0xd2664910U, 0xbee5812dU, + 0xb7332290U, 0xe93b159fU, 0xb48ee411U, 0x4bff345dU, + 0xfd45c240U, 0xad31973fU, 0xc4f6d02eU, 0x55fc8165U, + 0xd5b1caadU, 0xa1ac2daeU, 0xa2d4b76dU, 0xc19b0c50U, + 0x882240f2U, 0x0c6e4f38U, 0xa4e4bfd7U, 0x4f5ba272U, + 0x564c1d2fU, 0xc59c5319U, 0xb949e354U, 0xb04669feU, + 0xb1b6ab8aU, 0xc71358ddU, 0x6385c545U, 0x110f935dU, + 0x57538ad5U, 0x6a390493U, 0xe63d37e0U, 0x2a54f6b3U, + 0x3a787d5fU, 0x6276a0b5U, 0x19a6fcdfU, 0x7a42206aU, + 0x29f9d4d5U, 0xf61b1891U, 0xbb72275eU, 0xaa508167U, + 0x38901091U, 0xc6b505ebU, 0x84c7cb8cU, 0x2ad75a0fU, + 0x874a1427U, 0xa2d1936bU, 0x2ad286afU, 0xaa56d291U, + 0xd7894360U, 0x425c750dU, 0x93b39e26U, 0x187184c9U, + 0x6c00b32dU, 0x73e2bb14U, 0xa0bebc3cU, 0x54623779U, + 0x64459eabU, 0x3f328b82U, 0x7718cf82U, 0x59a2cea6U, + 0x04ee002eU, 0x89fe78e6U, 0x3fab0950U, 0x325ff6c2U, + 0x81383f05U, 0x6963c5c8U, 0x76cb5ad6U, 0xd49974c9U, + 0xca180dcfU, 0x380782d5U, 0xc7fa5cf6U, 0x8ac31511U, + 0x35e79e13U, 0x47da91d0U, 0xf40f9086U, 0xa7e2419eU, + 0x31366241U, 0x051ef495U, 0xaa573b04U, 0x4a805d8dU, + 0x548300d0U, 0x00322a3cU, 0xbf64cddfU, 0xba57a68eU, + 0x75c6372bU, 0x50afd341U, 0xa7c13275U, 0x915a0bf5U, + 0x6b54bfabU, 0x2b0b1426U, 0xab4cc9d7U, 0x449ccd82U, + 0xf7fbf265U, 0xab85c5f3U, 0x1b55db94U, 0xaad4e324U, + 0xcfa4bd3fU, 0x2deaa3e2U, 0x9e204d02U, 0xc8bd25acU, + 0xeadf55b3U, 0xd5bd9e98U, 0xe31231b2U, 0x2ad5ad6cU, + 0x954329deU, 0xadbe4528U, 0xd8710f69U, 0xaa51c90fU, + 0xaa786bf6U, 0x22513f1eU, 0xaa51a79bU, 0x2ad344ccU, + 0x7b5a41f0U, 0xd37cfbadU, 0x1b069505U, 0x41ece491U, + 0xb4c332e6U, 0x032268d4U, 0xc9600accU, 0xce387e6dU, + 0xbf6bb16cU, 0x6a70fb78U, 0x0d03d9c9U, 0xd4df39deU, + 0xe01063daU, 0x4736f464U, 0x5ad328d8U, 0xb347cc96U, + 0x75bb0fc3U, 0x98511bfbU, 0x4ffbcc35U, 0xb58bcf6aU, + 0xe11f0abcU, 0xbfc5fe4aU, 0xa70aec10U, 0xac39570aU, + 0x3f04442fU, 0x6188b153U, 0xe0397a2eU, 0x5727cb79U, + 0x9ceb418fU, 0x1cacd68dU, 0x2ad37c96U, 0x0175cb9dU, + 0xc69dff09U, 0xc75b65f0U, 0xd9db40d8U, 0xec0e7779U, + 0x4744ead4U, 0xb11c3274U, 0xdd24cb9eU, 0x7e1c54bdU, + 0xf01144f9U, 0xd2240eb1U, 0x9675b3fdU, 0xa3ac3755U, + 0xd47c27afU, 0x51c85f4dU, 0x56907596U, 0xa5bb15e6U, + 0x580304f0U, 0xca042cf1U, 0x011a37eaU, 0x8dbfaadbU, + 0x35ba3e4aU, 0x3526ffa0U, 0xc37b4d09U, 0xbc306ed9U, + 0x98a52666U, 0x5648f725U, 0xff5e569dU, 0x0ced63d0U, + 0x7c63b2cfU, 0x700b45e1U, 0xd5ea50f1U, 0x85a92872U, + 0xaf1fbda7U, 0xd4234870U, 0xa7870bf3U, 0x2d3b4d79U, + 0x42e04198U, 0x0cd0ede7U, 0x26470db8U, 0xf881814cU, + 0x474d6ad7U, 0x7c0c5e5cU, 0xd1231959U, 0x381b7298U, + 0xf5d2f4dbU, 0xab838653U, 0x6e2f1e23U, 0x83719c9eU, + 0xbd91e046U, 0x9a56456eU, 0xdc39200cU, 0x20c8c571U, + 0x962bda1cU, 0xe1e696ffU, 0xb141ab08U, 0x7cca89b9U, + 0x1a69e783U, 0x02cc4843U, 0xa2f7c579U, 0x429ef47dU, + 0x427b169cU, 0x5ac9f049U, 0xdd8f0f00U, 0x5c8165bfU +}; + +/* Second substitution box (S box) */ +INTERNAL_LINKAGE U32 S2[256] = { + 0x1f201094U, 0xef0ba75bU, 0x69e3cf7eU, 0x393f4380U, + 0xfe61cf7aU, 0xeec5207aU, 0x55889c94U, 0x72fc0651U, + 0xada7ef79U, 0x4e1d7235U, 0xd55a63ceU, 0xde0436baU, + 0x99c430efU, 0x5f0c0794U, 0x18dcdb7dU, 0xa1d6eff3U, + 0xa0b52f7bU, 0x59e83605U, 0xee15b094U, 0xe9ffd909U, + 0xdc440086U, 0xef944459U, 0xba83ccb3U, 0xe0c3cdfbU, + 0xd1da4181U, 0x3b092ab1U, 0xf997f1c1U, 0xa5e6cf7bU, + 0x01420ddbU, 0xe4e7ef5bU, 0x25a1ff41U, 0xe180f806U, + 0x1fc41080U, 0x179bee7aU, 0xd37ac6a9U, 0xfe5830a4U, + 0x98de8b7fU, 0x77e83f4eU, 0x79929269U, 0x24fa9f7bU, + 0xe113c85bU, 0xacc40083U, 0xd7503525U, 0xf7ea615fU, + 0x62143154U, 0x0d554b63U, 0x5d681121U, 0xc866c359U, + 0x3d63cf73U, 0xcee234c0U, 0xd4d87e87U, 0x5c672b21U, + 0x071f6181U, 0x39f7627fU, 0x361e3084U, 0xe4eb573bU, + 0x602f64a4U, 0xd63acd9cU, 0x1bbc4635U, 0x9e81032dU, + 0x2701f50cU, 0x99847ab4U, 0xa0e3df79U, 0xba6cf38cU, + 0x10843094U, 0x2537a95eU, 0xf46f6ffeU, 0xa1ff3b1fU, + 0x208cfb6aU, 0x8f458c74U, 0xd9e0a227U, 0x4ec73a34U, + 0xfc884f69U, 0x3e4de8dfU, 0xef0e0088U, 0x3559648dU, + 0x8a45388cU, 0x1d804366U, 0x721d9bfdU, 0xa58684bbU, + 0xe8256333U, 0x844e8212U, 0x128d8098U, 0xfed33fb4U, + 0xce280ae1U, 0x27e19ba5U, 0xd5a6c252U, 0xe49754bdU, + 0xc5d655ddU, 0xeb667064U, 0x77840b4dU, 0xa1b6a801U, + 0x84db26a9U, 0xe0b56714U, 0x21f043b7U, 0xe5d05860U, + 0x54f03084U, 0x066ff472U, 0xa31aa153U, 0xdadc4755U, + 0xb5625dbfU, 0x68561be6U, 0x83ca6b94U, 0x2d6ed23bU, + 0xeccf01dbU, 0xa6d3d0baU, 0xb6803d5cU, 0xaf77a709U, + 0x33b4a34cU, 0x397bc8d6U, 0x5ee22b95U, 0x5f0e5304U, + 0x81ed6f61U, 0x20e74364U, 0xb45e1378U, 0xde18639bU, + 0x881ca122U, 0xb96726d1U, 0x8049a7e8U, 0x22b7da7bU, + 0x5e552d25U, 0x5272d237U, 0x79d2951cU, 0xc60d894cU, + 0x488cb402U, 0x1ba4fe5bU, 0xa4b09f6bU, 0x1ca815cfU, + 0xa20c3005U, 0x8871df63U, 0xb9de2fcbU, 0x0cc6c9e9U, + 0x0beeff53U, 0xe3214517U, 0xb4542835U, 0x9f63293cU, + 0xee41e729U, 0x6e1d2d7cU, 0x50045286U, 0x1e6685f3U, + 0xf33401c6U, 0x30a22c95U, 0x31a70850U, 0x60930f13U, + 0x73f98417U, 0xa1269859U, 0xec645c44U, 0x52c877a9U, + 0xcdff33a6U, 0xa02b1741U, 0x7cbad9a2U, 0x2180036fU, + 0x50d99c08U, 0xcb3f4861U, 0xc26bd765U, 0x64a3f6abU, + 0x80342676U, 0x25a75e7bU, 0xe4e6d1fcU, 0x20c710e6U, + 0xcdf0b680U, 0x17844d3bU, 0x31eef84dU, 0x7e0824e4U, + 0x2ccb49ebU, 0x846a3baeU, 0x8ff77888U, 0xee5d60f6U, + 0x7af75673U, 0x2fdd5cdbU, 0xa11631c1U, 0x30f66f43U, + 0xb3faec54U, 0x157fd7faU, 0xef8579ccU, 0xd152de58U, + 0xdb2ffd5eU, 0x8f32ce19U, 0x306af97aU, 0x02f03ef8U, + 0x99319ad5U, 0xc242fa0fU, 0xa7e3ebb0U, 0xc68e4906U, + 0xb8da230cU, 0x80823028U, 0xdcdef3c8U, 0xd35fb171U, + 0x088a1bc8U, 0xbec0c560U, 0x61a3c9e8U, 0xbca8f54dU, + 0xc72feffaU, 0x22822e99U, 0x82c570b4U, 0xd8d94e89U, + 0x8b1c34bcU, 0x301e16e6U, 0x273be979U, 0xb0ffeaa6U, + 0x61d9b8c6U, 0x00b24869U, 0xb7ffce3fU, 0x08dc283bU, + 0x43daf65aU, 0xf7e19798U, 0x7619b72fU, 0x8f1c9ba4U, + 0xdc8637a0U, 0x16a7d3b1U, 0x9fc393b7U, 0xa7136eebU, + 0xc6bcc63eU, 0x1a513742U, 0xef6828bcU, 0x520365d6U, + 0x2d6a77abU, 0x3527ed4bU, 0x821fd216U, 0x095c6e2eU, + 0xdb92f2fbU, 0x5eea29cbU, 0x145892f5U, 0x91584f7fU, + 0x5483697bU, 0x2667a8ccU, 0x85196048U, 0x8c4baceaU, + 0x833860d4U, 0x0d23e0f9U, 0x6c387e8aU, 0x0ae6d249U, + 0xb284600cU, 0xd835731dU, 0xdcb1c647U, 0xac4c56eaU, + 0x3ebd81b3U, 0x230eabb0U, 0x6438bc87U, 0xf0b5b1faU, + 0x8f5ea2b3U, 0xfc184642U, 0x0a036b7aU, 0x4fb089bdU, + 0x649da589U, 0xa345415eU, 0x5c038323U, 0x3e5d3bb9U, + 0x43d79572U, 0x7e6dd07cU, 0x06dfdf1eU, 0x6c6cc4efU, + 0x7160a539U, 0x73bfbe70U, 0x83877605U, 0x4523ecf1U +}; + +/* Third substitution box (S box) */ +INTERNAL_LINKAGE U32 S3[256] = { + 0x8defc240U, 0x25fa5d9fU, 0xeb903dbfU, 0xe810c907U, + 0x47607fffU, 0x369fe44bU, 0x8c1fc644U, 0xaececa90U, + 0xbeb1f9bfU, 0xeefbcaeaU, 0xe8cf1950U, 0x51df07aeU, + 0x920e8806U, 0xf0ad0548U, 0xe13c8d83U, 0x927010d5U, + 0x11107d9fU, 0x07647db9U, 0xb2e3e4d4U, 0x3d4f285eU, + 0xb9afa820U, 0xfade82e0U, 0xa067268bU, 0x8272792eU, + 0x553fb2c0U, 0x489ae22bU, 0xd4ef9794U, 0x125e3fbcU, + 0x21fffceeU, 0x825b1bfdU, 0x9255c5edU, 0x1257a240U, + 0x4e1a8302U, 0xbae07fffU, 0x528246e7U, 0x8e57140eU, + 0x3373f7bfU, 0x8c9f8188U, 0xa6fc4ee8U, 0xc982b5a5U, + 0xa8c01db7U, 0x579fc264U, 0x67094f31U, 0xf2bd3f5fU, + 0x40fff7c1U, 0x1fb78dfcU, 0x8e6bd2c1U, 0x437be59bU, + 0x99b03dbfU, 0xb5dbc64bU, 0x638dc0e6U, 0x55819d99U, + 0xa197c81cU, 0x4a012d6eU, 0xc5884a28U, 0xccc36f71U, + 0xb843c213U, 0x6c0743f1U, 0x8309893cU, 0x0feddd5fU, + 0x2f7fe850U, 0xd7c07f7eU, 0x02507fbfU, 0x5afb9a04U, + 0xa747d2d0U, 0x1651192eU, 0xaf70bf3eU, 0x58c31380U, + 0x5f98302eU, 0x727cc3c4U, 0x0a0fb402U, 0x0f7fef82U, + 0x8c96fdadU, 0x5d2c2aaeU, 0x8ee99a49U, 0x50da88b8U, + 0x8427f4a0U, 0x1eac5790U, 0x796fb449U, 0x8252dc15U, + 0xefbd7d9bU, 0xa672597dU, 0xada840d8U, 0x45f54504U, + 0xfa5d7403U, 0xe83ec305U, 0x4f91751aU, 0x925669c2U, + 0x23efe941U, 0xa903f12eU, 0x60270df2U, 0x0276e4b6U, + 0x94fd6574U, 0x927985b2U, 0x8276dbcbU, 0x02778176U, + 0xf8af918dU, 0x4e48f79eU, 0x8f616ddfU, 0xe29d840eU, + 0x842f7d83U, 0x340ce5c8U, 0x96bbb682U, 0x93b4b148U, + 0xef303cabU, 0x984faf28U, 0x779faf9bU, 0x92dc560dU, + 0x224d1e20U, 0x8437aa88U, 0x7d29dc96U, 0x2756d3dcU, + 0x8b907ceeU, 0xb51fd240U, 0xe7c07ce3U, 0xe566b4a1U, + 0xc3e9615eU, 0x3cf8209dU, 0x6094d1e3U, 0xcd9ca341U, + 0x5c76460eU, 0x00ea983bU, 0xd4d67881U, 0xfd47572cU, + 0xf76cedd9U, 0xbda8229cU, 0x127dadaaU, 0x438a074eU, + 0x1f97c090U, 0x081bdb8aU, 0x93a07ebeU, 0xb938ca15U, + 0x97b03cffU, 0x3dc2c0f8U, 0x8d1ab2ecU, 0x64380e51U, + 0x68cc7bfbU, 0xd90f2788U, 0x12490181U, 0x5de5ffd4U, + 0xdd7ef86aU, 0x76a2e214U, 0xb9a40368U, 0x925d958fU, + 0x4b39fffaU, 0xba39aee9U, 0xa4ffd30bU, 0xfaf7933bU, + 0x6d498623U, 0x193cbcfaU, 0x27627545U, 0x825cf47aU, + 0x61bd8ba0U, 0xd11e42d1U, 0xcead04f4U, 0x127ea392U, + 0x10428db7U, 0x8272a972U, 0x9270c4a8U, 0x127de50bU, + 0x285ba1c8U, 0x3c62f44fU, 0x35c0eaa5U, 0xe805d231U, + 0x428929fbU, 0xb4fcdf82U, 0x4fb66a53U, 0x0e7dc15bU, + 0x1f081fabU, 0x108618aeU, 0xfcfd086dU, 0xf9ff2889U, + 0x694bcc11U, 0x236a5caeU, 0x12deca4dU, 0x2c3f8cc5U, + 0xd2d02dfeU, 0xf8ef5896U, 0xe4cf52daU, 0x95155b67U, + 0x494a488cU, 0xb9b6a80cU, 0x5c8f82bcU, 0x89d36b45U, + 0x3a609437U, 0xec00c9a9U, 0x44715253U, 0x0a874b49U, + 0xd773bc40U, 0x7c34671cU, 0x02717ef6U, 0x4feb5536U, + 0xa2d02fffU, 0xd2bf60c4U, 0xd43f03c0U, 0x50b4ef6dU, + 0x07478cd1U, 0x006e1888U, 0xa2e53f55U, 0xb9e6d4bcU, + 0xa2048016U, 0x97573833U, 0xd7207d67U, 0xde0f8f3dU, + 0x72f87b33U, 0xabcc4f33U, 0x7688c55dU, 0x7b00a6b0U, + 0x947b0001U, 0x570075d2U, 0xf9bb88f8U, 0x8942019eU, + 0x4264a5ffU, 0x856302e0U, 0x72dbd92bU, 0xee971b69U, + 0x6ea22fdeU, 0x5f08ae2bU, 0xaf7a616dU, 0xe5c98767U, + 0xcf1febd2U, 0x61efc8c2U, 0xf1ac2571U, 0xcc8239c2U, + 0x67214cb8U, 0xb1e583d1U, 0xb7dc3e62U, 0x7f10bdceU, + 0xf90a5c38U, 0x0ff0443dU, 0x606e6dc6U, 0x60543a49U, + 0x5727c148U, 0x2be98a1dU, 0x8ab41738U, 0x20e1be24U, + 0xaf96da0fU, 0x68458425U, 0x99833be5U, 0x600d457dU, + 0x282f9350U, 0x8334b362U, 0xd91d1120U, 0x2b6d8da0U, + 0x642b1e31U, 0x9c305a00U, 0x52bce688U, 0x1b03588aU, + 0xf7baefd5U, 0x4142ed9cU, 0xa4315c11U, 0x83323ec5U, + 0xdfef4636U, 0xa133c501U, 0xe9d3531cU, 0xee353783U +}; + +/* Fourth substitution box (S box) */ +INTERNAL_LINKAGE U32 S4[256] = { + 0x9db30420U, 0x1fb6e9deU, 0xa7be7befU, 0xd273a298U, + 0x4a4f7bdbU, 0x64ad8c57U, 0x85510443U, 0xfa020ed1U, + 0x7e287affU, 0xe60fb663U, 0x095f35a1U, 0x79ebf120U, + 0xfd059d43U, 0x6497b7b1U, 0xf3641f63U, 0x241e4adfU, + 0x28147f5fU, 0x4fa2b8cdU, 0xc9430040U, 0x0cc32220U, + 0xfdd30b30U, 0xc0a5374fU, 0x1d2d00d9U, 0x24147b15U, + 0xee4d111aU, 0x0fca5167U, 0x71ff904cU, 0x2d195ffeU, + 0x1a05645fU, 0x0c13fefeU, 0x081b08caU, 0x05170121U, + 0x80530100U, 0xe83e5efeU, 0xac9af4f8U, 0x7fe72701U, + 0xd2b8ee5fU, 0x06df4261U, 0xbb9e9b8aU, 0x7293ea25U, + 0xce84ffdfU, 0xf5718801U, 0x3dd64b04U, 0xa26f263bU, + 0x7ed48400U, 0x547eebe6U, 0x446d4ca0U, 0x6cf3d6f5U, + 0x2649abdfU, 0xaea0c7f5U, 0x36338cc1U, 0x503f7e93U, + 0xd3772061U, 0x11b638e1U, 0x72500e03U, 0xf80eb2bbU, + 0xabe0502eU, 0xec8d77deU, 0x57971e81U, 0xe14f6746U, + 0xc9335400U, 0x6920318fU, 0x081dbb99U, 0xffc304a5U, + 0x4d351805U, 0x7f3d5ce3U, 0xa6c866c6U, 0x5d5bcca9U, + 0xdaec6feaU, 0x9f926f91U, 0x9f46222fU, 0x3991467dU, + 0xa5bf6d8eU, 0x1143c44fU, 0x43958302U, 0xd0214eebU, + 0x022083b8U, 0x3fb6180cU, 0x18f8931eU, 0x281658e6U, + 0x26486e3eU, 0x8bd78a70U, 0x7477e4c1U, 0xb506e07cU, + 0xf32d0a25U, 0x79098b02U, 0xe4eabb81U, 0x28123b23U, + 0x69dead38U, 0x1574ca16U, 0xdf871b62U, 0x211c40b7U, + 0xa51a9ef9U, 0x0014377bU, 0x041e8ac8U, 0x09114003U, + 0xbd59e4d2U, 0xe3d156d5U, 0x4fe876d5U, 0x2f91a340U, + 0x557be8deU, 0x00eae4a7U, 0x0ce5c2ecU, 0x4db4bba6U, + 0xe756bdffU, 0xdd3369acU, 0xec17b035U, 0x06572327U, + 0x99afc8b0U, 0x56c8c391U, 0x6b65811cU, 0x5e146119U, + 0x6e85cb75U, 0xbe07c002U, 0xc2325577U, 0x893ff4ecU, + 0x5bbfc92dU, 0xd0ec3b25U, 0xb7801ab7U, 0x8d6d3b24U, + 0x20c763efU, 0xc366a5fcU, 0x9c382880U, 0x0ace3205U, + 0xaac9548aU, 0xeca1d7c7U, 0x041afa32U, 0x1d16625aU, + 0x6701902cU, 0x9b757a54U, 0x31d477f7U, 0x9126b031U, + 0x36cc6fdbU, 0xc70b8b46U, 0xd9e66a48U, 0x56e55a79U, + 0x026a4cebU, 0x52437effU, 0x2f8f76b4U, 0x0df980a5U, + 0x8674cde3U, 0xedda04ebU, 0x17a9be04U, 0x2c18f4dfU, + 0xb7747f9dU, 0xab2af7b4U, 0xefc34d20U, 0x2e096b7cU, + 0x1741a254U, 0xe5b6a035U, 0x213d42f6U, 0x2c1c7c26U, + 0x61c2f50fU, 0x6552daf9U, 0xd2c231f8U, 0x25130f69U, + 0xd8167fa2U, 0x0418f2c8U, 0x001a96a6U, 0x0d1526abU, + 0x63315c21U, 0x5e0a72ecU, 0x49bafefdU, 0x187908d9U, + 0x8d0dbd86U, 0x311170a7U, 0x3e9b640cU, 0xcc3e10d7U, + 0xd5cad3b6U, 0x0caec388U, 0xf73001e1U, 0x6c728affU, + 0x71eae2a1U, 0x1f9af36eU, 0xcfcbd12fU, 0xc1de8417U, + 0xac07be6bU, 0xcb44a1d8U, 0x8b9b0f56U, 0x013988c3U, + 0xb1c52fcaU, 0xb4be31cdU, 0xd8782806U, 0x12a3a4e2U, + 0x6f7de532U, 0x58fd7eb6U, 0xd01ee900U, 0x24adffc2U, + 0xf4990fc5U, 0x9711aac5U, 0x001d7b95U, 0x82e5e7d2U, + 0x109873f6U, 0x00613096U, 0xc32d9521U, 0xada121ffU, + 0x29908415U, 0x7fbb977fU, 0xaf9eb3dbU, 0x29c9ed2aU, + 0x5ce2a465U, 0xa730f32cU, 0xd0aa3fe8U, 0x8a5cc091U, + 0xd49e2ce7U, 0x0ce454a9U, 0xd60acd86U, 0x015f1919U, + 0x77079103U, 0xdea03af6U, 0x78a8565eU, 0xdee356dfU, + 0x21f05cbeU, 0x8b75e387U, 0xb3c50651U, 0xb8a5c3efU, + 0xd8eeb6d2U, 0xe523be77U, 0xc2154529U, 0x2f69efdfU, + 0xafe67afbU, 0xf470c4b2U, 0xf3e0eb5bU, 0xd6cc9876U, + 0x39e4460cU, 0x1fda8538U, 0x1987832fU, 0xca007367U, + 0xa99144f8U, 0x296b299eU, 0x492fc295U, 0x9266beabU, + 0xb5676e69U, 0x9bd3dddaU, 0xdf7e052fU, 0xdb25701cU, + 0x1b5e51eeU, 0xf65324e6U, 0x6afce36cU, 0x0316cc04U, + 0x8644213eU, 0xb7dc59d0U, 0x7965291fU, 0xccd6fd43U, + 0x41823979U, 0x932bcdf6U, 0xb657c34dU, 0x4edfd282U, + 0x7ae5290cU, 0x3cb9536bU, 0x851e20feU, 0x9833557eU, + 0x13ecf0b0U, 0xd3ffb372U, 0x3f85c5c1U, 0x0aef7ed2U +}; + +/* Fifth substitution box (S box) */ +INTERNAL_LINKAGE U32 S5[256] = { + 0x7ec90c04U, 0x2c6e74b9U, 0x9b0e66dfU, 0xa6337911U, + 0xb86a7fffU, 0x1dd358f5U, 0x44dd9d44U, 0x1731167fU, + 0x08fbf1faU, 0xe7f511ccU, 0xd2051b00U, 0x735aba00U, + 0x2ab722d8U, 0x386381cbU, 0xacf6243aU, 0x69befd7aU, + 0xe6a2e77fU, 0xf0c720cdU, 0xc4494816U, 0xccf5c180U, + 0x38851640U, 0x15b0a848U, 0xe68b18cbU, 0x4caadeffU, + 0x5f480a01U, 0x0412b2aaU, 0x259814fcU, 0x41d0efe2U, + 0x4e40b48dU, 0x248eb6fbU, 0x8dba1cfeU, 0x41a99b02U, + 0x1a550a04U, 0xba8f65cbU, 0x7251f4e7U, 0x95a51725U, + 0xc106ecd7U, 0x97a5980aU, 0xc539b9aaU, 0x4d79fe6aU, + 0xf2f3f763U, 0x68af8040U, 0xed0c9e56U, 0x11b4958bU, + 0xe1eb5a88U, 0x8709e6b0U, 0xd7e07156U, 0x4e29fea7U, + 0x6366e52dU, 0x02d1c000U, 0xc4ac8e05U, 0x9377f571U, + 0x0c05372aU, 0x578535f2U, 0x2261be02U, 0xd642a0c9U, + 0xdf13a280U, 0x74b55bd2U, 0x682199c0U, 0xd421e5ecU, + 0x53fb3ce8U, 0xc8adedb3U, 0x28a87fc9U, 0x3d959981U, + 0x5c1ff900U, 0xfe38d399U, 0x0c4eff0bU, 0x062407eaU, + 0xaa2f4fb1U, 0x4fb96976U, 0x90c79505U, 0xb0a8a774U, + 0xef55a1ffU, 0xe59ca2c2U, 0xa6b62d27U, 0xe66a4263U, + 0xdf65001fU, 0x0ec50966U, 0xdfdd55bcU, 0x29de0655U, + 0x911e739aU, 0x17af8975U, 0x32c7911cU, 0x89f89468U, + 0x0d01e980U, 0x524755f4U, 0x03b63cc9U, 0x0cc844b2U, + 0xbcf3f0aaU, 0x87ac36e9U, 0xe53a7426U, 0x01b3d82bU, + 0x1a9e7449U, 0x64ee2d7eU, 0xcddbb1daU, 0x01c94910U, + 0xb868bf80U, 0x0d26f3fdU, 0x9342ede7U, 0x04a5c284U, + 0x636737b6U, 0x50f5b616U, 0xf24766e3U, 0x8eca36c1U, + 0x136e05dbU, 0xfef18391U, 0xfb887a37U, 0xd6e7f7d4U, + 0xc7fb7dc9U, 0x3063fcdfU, 0xb6f589deU, 0xec2941daU, + 0x26e46695U, 0xb7566419U, 0xf654efc5U, 0xd08d58b7U, + 0x48925401U, 0xc1bacb7fU, 0xe5ff550fU, 0xb6083049U, + 0x5bb5d0e8U, 0x87d72e5aU, 0xab6a6ee1U, 0x223a66ceU, + 0xc62bf3cdU, 0x9e0885f9U, 0x68cb3e47U, 0x086c010fU, + 0xa21de820U, 0xd18b69deU, 0xf3f65777U, 0xfa02c3f6U, + 0x407edac3U, 0xcbb3d550U, 0x1793084dU, 0xb0d70ebaU, + 0x0ab378d5U, 0xd951fb0cU, 0xded7da56U, 0x4124bbe4U, + 0x94ca0b56U, 0x0f5755d1U, 0xe0e1e56eU, 0x6184b5beU, + 0x580a249fU, 0x94f74bc0U, 0xe327888eU, 0x9f7b5561U, + 0xc3dc0280U, 0x05687715U, 0x646c6bd7U, 0x44904db3U, + 0x66b4f0a3U, 0xc0f1648aU, 0x697ed5afU, 0x49e92ff6U, + 0x309e374fU, 0x2cb6356aU, 0x85808573U, 0x4991f840U, + 0x76f0ae02U, 0x083be84dU, 0x28421c9aU, 0x44489406U, + 0x736e4cb8U, 0xc1092910U, 0x8bc95fc6U, 0x7d869cf4U, + 0x134f616fU, 0x2e77118dU, 0xb31b2be1U, 0xaa90b472U, + 0x3ca5d717U, 0x7d161bbaU, 0x9cad9010U, 0xaf462ba2U, + 0x9fe459d2U, 0x45d34559U, 0xd9f2da13U, 0xdbc65487U, + 0xf3e4f94eU, 0x176d486fU, 0x097c13eaU, 0x631da5c7U, + 0x445f7382U, 0x175683f4U, 0xcdc66a97U, 0x70be0288U, + 0xb3cdcf72U, 0x6e5dd2f3U, 0x20936079U, 0x459b80a5U, + 0xbe60e2dbU, 0xa9c23101U, 0xeba5315cU, 0x224e42f2U, + 0x1c5c1572U, 0xf6721b2cU, 0x1ad2fff3U, 0x8c25404eU, + 0x324ed72fU, 0x4067b7fdU, 0x0523138eU, 0x5ca3bc78U, + 0xdc0fd66eU, 0x75922283U, 0x784d6b17U, 0x58ebb16eU, + 0x44094f85U, 0x3f481d87U, 0xfcfeae7bU, 0x77b5ff76U, + 0x8c2302bfU, 0xaaf47556U, 0x5f46b02aU, 0x2b092801U, + 0x3d38f5f7U, 0x0ca81f36U, 0x52af4a8aU, 0x66d5e7c0U, + 0xdf3b0874U, 0x95055110U, 0x1b5ad7a8U, 0xf61ed5adU, + 0x6cf6e479U, 0x20758184U, 0xd0cefa65U, 0x88f7be58U, + 0x4a046826U, 0x0ff6f8f3U, 0xa09c7f70U, 0x5346aba0U, + 0x5ce96c28U, 0xe176eda3U, 0x6bac307fU, 0x376829d2U, + 0x85360fa9U, 0x17e3fe2aU, 0x24b79767U, 0xf5a96b20U, + 0xd6cd2595U, 0x68ff1ebfU, 0x7555442cU, 0xf19f06beU, + 0xf9e0659aU, 0xeeb9491dU, 0x34010718U, 0xbb30cab8U, + 0xe822fe15U, 0x88570983U, 0x750e6249U, 0xda627e55U, + 0x5e76ffa8U, 0xb1534546U, 0x6d47de08U, 0xefe9e7d4U +}; +/* Sixth substitution box (S box) */ +INTERNAL_LINKAGE U32 S6[256] = { + 0xf6fa8f9dU, 0x2cac6ce1U, 0x4ca34867U, 0xe2337f7cU, + 0x95db08e7U, 0x016843b4U, 0xeced5cbcU, 0x325553acU, + 0xbf9f0960U, 0xdfa1e2edU, 0x83f0579dU, 0x63ed86b9U, + 0x1ab6a6b8U, 0xde5ebe39U, 0xf38ff732U, 0x8989b138U, + 0x33f14961U, 0xc01937bdU, 0xf506c6daU, 0xe4625e7eU, + 0xa308ea99U, 0x4e23e33cU, 0x79cbd7ccU, 0x48a14367U, + 0xa3149619U, 0xfec94bd5U, 0xa114174aU, 0xeaa01866U, + 0xa084db2dU, 0x09a8486fU, 0xa888614aU, 0x2900af98U, + 0x01665991U, 0xe1992863U, 0xc8f30c60U, 0x2e78ef3cU, + 0xd0d51932U, 0xcf0fec14U, 0xf7ca07d2U, 0xd0a82072U, + 0xfd41197eU, 0x9305a6b0U, 0xe86be3daU, 0x74bed3cdU, + 0x372da53cU, 0x4c7f4448U, 0xdab5d440U, 0x6dba0ec3U, + 0x083919a7U, 0x9fbaeed9U, 0x49dbcfb0U, 0x4e670c53U, + 0x5c3d9c01U, 0x64bdb941U, 0x2c0e636aU, 0xba7dd9cdU, + 0xea6f7388U, 0xe70bc762U, 0x35f29adbU, 0x5c4cdd8dU, + 0xf0d48d8cU, 0xb88153e2U, 0x08a19866U, 0x1ae2eac8U, + 0x284caf89U, 0xaa928223U, 0x9334be53U, 0x3b3a21bfU, + 0x16434be3U, 0x9aea3906U, 0xefe8c36eU, 0xf890cdd9U, + 0x80226daeU, 0xc340a4a3U, 0xdf7e9c09U, 0xa694a807U, + 0x5b7c5eccU, 0x221db3a6U, 0x9a69a02fU, 0x68818a54U, + 0xceb2296fU, 0x53c0843aU, 0xfe893655U, 0x25bfe68aU, + 0xb4628abcU, 0xcf222ebfU, 0x25ac6f48U, 0xa9a99387U, + 0x53bddb65U, 0xe76ffbe7U, 0xe967fd78U, 0x0ba93563U, + 0x8e342bc1U, 0xe8a11be9U, 0x4980740dU, 0xc8087dfcU, + 0x8de4bf99U, 0xa11101a0U, 0x7fd37975U, 0xda5a26c0U, + 0xe81f994fU, 0x9528cd89U, 0xfd339fedU, 0xb87834bfU, + 0x5f04456dU, 0x22258698U, 0xc9c4c83bU, 0x2dc156beU, + 0x4f628daaU, 0x57f55ec5U, 0xe2220abeU, 0xd2916ebfU, + 0x4ec75b95U, 0x24f2c3c0U, 0x42d15d99U, 0xcd0d7fa0U, + 0x7b6e27ffU, 0xa8dc8af0U, 0x7345c106U, 0xf41e232fU, + 0x35162386U, 0xe6ea8926U, 0x3333b094U, 0x157ec6f2U, + 0x372b74afU, 0x692573e4U, 0xe9a9d848U, 0xf3160289U, + 0x3a62ef1dU, 0xa787e238U, 0xf3a5f676U, 0x74364853U, + 0x20951063U, 0x4576698dU, 0xb6fad407U, 0x592af950U, + 0x36f73523U, 0x4cfb6e87U, 0x7da4cec0U, 0x6c152daaU, + 0xcb0396a8U, 0xc50dfe5dU, 0xfcd707abU, 0x0921c42fU, + 0x89dff0bbU, 0x5fe2be78U, 0x448f4f33U, 0x754613c9U, + 0x2b05d08dU, 0x48b9d585U, 0xdc049441U, 0xc8098f9bU, + 0x7dede786U, 0xc39a3373U, 0x42410005U, 0x6a091751U, + 0x0ef3c8a6U, 0x890072d6U, 0x28207682U, 0xa9a9f7beU, + 0xbf32679dU, 0xd45b5b75U, 0xb353fd00U, 0xcbb0e358U, + 0x830f220aU, 0x1f8fb214U, 0xd372cf08U, 0xcc3c4a13U, + 0x8cf63166U, 0x061c87beU, 0x88c98f88U, 0x6062e397U, + 0x47cf8e7aU, 0xb6c85283U, 0x3cc2acfbU, 0x3fc06976U, + 0x4e8f0252U, 0x64d8314dU, 0xda3870e3U, 0x1e665459U, + 0xc10908f0U, 0x513021a5U, 0x6c5b68b7U, 0x822f8aa0U, + 0x3007cd3eU, 0x74719eefU, 0xdc872681U, 0x073340d4U, + 0x7e432fd9U, 0x0c5ec241U, 0x8809286cU, 0xf592d891U, + 0x08a930f6U, 0x957ef305U, 0xb7fbffbdU, 0xc266e96fU, + 0x6fe4ac98U, 0xb173ecc0U, 0xbc60b42aU, 0x953498daU, + 0xfba1ae12U, 0x2d4bd736U, 0x0f25faabU, 0xa4f3fcebU, + 0xe2969123U, 0x257f0c3dU, 0x9348af49U, 0x361400bcU, + 0xe8816f4aU, 0x3814f200U, 0xa3f94043U, 0x9c7a54c2U, + 0xbc704f57U, 0xda41e7f9U, 0xc25ad33aU, 0x54f4a084U, + 0xb17f5505U, 0x59357cbeU, 0xedbd15c8U, 0x7f97c5abU, + 0xba5ac7b5U, 0xb6f6deafU, 0x3a479c3aU, 0x5302da25U, + 0x653d7e6aU, 0x54268d49U, 0x51a477eaU, 0x5017d55bU, + 0xd7d25d88U, 0x44136c76U, 0x0404a8c8U, 0xb8e5a121U, + 0xb81a928aU, 0x60ed5869U, 0x97c55b96U, 0xeaec991bU, + 0x29935913U, 0x01fdb7f1U, 0x088e8dfaU, 0x9ab6f6f5U, + 0x3b4cbf9fU, 0x4a5de3abU, 0xe6051d35U, 0xa0e1d855U, + 0xd36b4cf1U, 0xf544edebU, 0xb0e93524U, 0xbebb8fbdU, + 0xa2d762cfU, 0x49c92f54U, 0x38b5f331U, 0x7128a454U, + 0x48392905U, 0xa65b1db8U, 0x851c97bdU, 0xd675cf2fU +}; + +/* Seventh substitution box (S box) */ +INTERNAL_LINKAGE U32 S7[256] = { + 0x85e04019U, 0x332bf567U, 0x662dbfffU, 0xcfc65693U, + 0x2a8d7f6fU, 0xab9bc912U, 0xde6008a1U, 0x2028da1fU, + 0x0227bce7U, 0x4d642916U, 0x18fac300U, 0x50f18b82U, + 0x2cb2cb11U, 0xb232e75cU, 0x4b3695f2U, 0xb28707deU, + 0xa05fbcf6U, 0xcd4181e9U, 0xe150210cU, 0xe24ef1bdU, + 0xb168c381U, 0xfde4e789U, 0x5c79b0d8U, 0x1e8bfd43U, + 0x4d495001U, 0x38be4341U, 0x913cee1dU, 0x92a79c3fU, + 0x089766beU, 0xbaeeadf4U, 0x1286becfU, 0xb6eacb19U, + 0x2660c200U, 0x7565bde4U, 0x64241f7aU, 0x8248dca9U, + 0xc3b3ad66U, 0x28136086U, 0x0bd8dfa8U, 0x356d1cf2U, + 0x107789beU, 0xb3b2e9ceU, 0x0502aa8fU, 0x0bc0351eU, + 0x166bf52aU, 0xeb12ff82U, 0xe3486911U, 0xd34d7516U, + 0x4e7b3affU, 0x5f43671bU, 0x9cf6e037U, 0x4981ac83U, + 0x334266ceU, 0x8c9341b7U, 0xd0d854c0U, 0xcb3a6c88U, + 0x47bc2829U, 0x4725ba37U, 0xa66ad22bU, 0x7ad61f1eU, + 0x0c5cbafaU, 0x4437f107U, 0xb6e79962U, 0x42d2d816U, + 0x0a961288U, 0xe1a5c06eU, 0x13749e67U, 0x72fc081aU, + 0xb1d139f7U, 0xf9583745U, 0xcf19df58U, 0xbec3f756U, + 0xc06eba30U, 0x07211b24U, 0x45c28829U, 0xc95e317fU, + 0xbc8ec511U, 0x38bc46e9U, 0xc6e6fa14U, 0xbae8584aU, + 0xad4ebc46U, 0x468f508bU, 0x7829435fU, 0xf124183bU, + 0x821dba9fU, 0xaff60ff4U, 0xea2c4e6dU, 0x16e39264U, + 0x92544a8bU, 0x009b4fc3U, 0xaba68cedU, 0x9ac96f78U, + 0x06a5b79aU, 0xb2856e6eU, 0x1aec3ca9U, 0xbe838688U, + 0x0e0804e9U, 0x55f1be56U, 0xe7e5363bU, 0xb3a1f25dU, + 0xf7debb85U, 0x61fe033cU, 0x16746233U, 0x3c034c28U, + 0xda6d0c74U, 0x79aac56cU, 0x3ce4e1adU, 0x51f0c802U, + 0x98f8f35aU, 0x1626a49fU, 0xeed82b29U, 0x1d382fe3U, + 0x0c4fb99aU, 0xbb325778U, 0x3ec6d97bU, 0x6e77a6a9U, + 0xcb658b5cU, 0xd45230c7U, 0x2bd1408bU, 0x60c03eb7U, + 0xb9068d78U, 0xa33754f4U, 0xf430c87dU, 0xc8a71302U, + 0xb96d8c32U, 0xebd4e7beU, 0xbe8b9d2dU, 0x7979fb06U, + 0xe7225308U, 0x8b75cf77U, 0x11ef8da4U, 0xe083c858U, + 0x8d6b786fU, 0x5a6317a6U, 0xfa5cf7a0U, 0x5dda0033U, + 0xf28ebfb0U, 0xf5b9c310U, 0xa0eac280U, 0x08b9767aU, + 0xa3d9d2b0U, 0x79d34217U, 0x021a718dU, 0x9ac6336aU, + 0x2711fd60U, 0x438050e3U, 0x069908a8U, 0x3d7fedc4U, + 0x826d2befU, 0x4eeb8476U, 0x488dcf25U, 0x36c9d566U, + 0x28e74e41U, 0xc2610acaU, 0x3d49a9cfU, 0xbae3b9dfU, + 0xb65f8de6U, 0x92aeaf64U, 0x3ac7d5e6U, 0x9ea80509U, + 0xf22b017dU, 0xa4173f70U, 0xdd1e16c3U, 0x15e0d7f9U, + 0x50b1b887U, 0x2b9f4fd5U, 0x625aba82U, 0x6a017962U, + 0x2ec01b9cU, 0x15488aa9U, 0xd716e740U, 0x40055a2cU, + 0x93d29a22U, 0xe32dbf9aU, 0x058745b9U, 0x3453dc1eU, + 0xd699296eU, 0x496cff6fU, 0x1c9f4986U, 0xdfe2ed07U, + 0xb87242d1U, 0x19de7eaeU, 0x053e561aU, 0x15ad6f8cU, + 0x66626c1cU, 0x7154c24cU, 0xea082b2aU, 0x93eb2939U, + 0x17dcb0f0U, 0x58d4f2aeU, 0x9ea294fbU, 0x52cf564cU, + 0x9883fe66U, 0x2ec40581U, 0x763953c3U, 0x01d6692eU, + 0xd3a0c108U, 0xa1e7160eU, 0xe4f2dfa6U, 0x693ed285U, + 0x74904698U, 0x4c2b0eddU, 0x4f757656U, 0x5d393378U, + 0xa132234fU, 0x3d321c5dU, 0xc3f5e194U, 0x4b269301U, + 0xc79f022fU, 0x3c997e7eU, 0x5e4f9504U, 0x3ffafbbdU, + 0x76f7ad0eU, 0x296693f4U, 0x3d1fce6fU, 0xc61e45beU, + 0xd3b5ab34U, 0xf72bf9b7U, 0x1b0434c0U, 0x4e72b567U, + 0x5592a33dU, 0xb5229301U, 0xcfd2a87fU, 0x60aeb767U, + 0x1814386bU, 0x30bcc33dU, 0x38a0c07dU, 0xfd1606f2U, + 0xc363519bU, 0x589dd390U, 0x5479f8e6U, 0x1cb8d647U, + 0x97fd61a9U, 0xea7759f4U, 0x2d57539dU, 0x569a58cfU, + 0xe84e63adU, 0x462e1b78U, 0x6580f87eU, 0xf3817914U, + 0x91da55f4U, 0x40a230f3U, 0xd1988f35U, 0xb6e318d2U, + 0x3ffa50bcU, 0x3d40f021U, 0xc3c0bdaeU, 0x4958c24cU, + 0x518f36b2U, 0x84b1d370U, 0x0fedce83U, 0x878ddadaU, + 0xf2a279c7U, 0x94e01be8U, 0x90716f4bU, 0x954b8aa3U +}; + +/* Eighth substitution box (S box) */ +INTERNAL_LINKAGE U32 S8[256] = { + 0xe216300dU, 0xbbddfffcU, 0xa7ebdabdU, 0x35648095U, + 0x7789f8b7U, 0xe6c1121bU, 0x0e241600U, 0x052ce8b5U, + 0x11a9cfb0U, 0xe5952f11U, 0xece7990aU, 0x9386d174U, + 0x2a42931cU, 0x76e38111U, 0xb12def3aU, 0x37ddddfcU, + 0xde9adeb1U, 0x0a0cc32cU, 0xbe197029U, 0x84a00940U, + 0xbb243a0fU, 0xb4d137cfU, 0xb44e79f0U, 0x049eedfdU, + 0x0b15a15dU, 0x480d3168U, 0x8bbbde5aU, 0x669ded42U, + 0xc7ece831U, 0x3f8f95e7U, 0x72df191bU, 0x7580330dU, + 0x94074251U, 0x5c7dcdfaU, 0xabbe6d63U, 0xaa402164U, + 0xb301d40aU, 0x02e7d1caU, 0x53571daeU, 0x7a3182a2U, + 0x12a8ddecU, 0xfdaa335dU, 0x176f43e8U, 0x71fb46d4U, + 0x38129022U, 0xce949ad4U, 0xb84769adU, 0x965bd862U, + 0x82f3d055U, 0x66fb9767U, 0x15b80b4eU, 0x1d5b47a0U, + 0x4cfde06fU, 0xc28ec4b8U, 0x57e8726eU, 0x647a78fcU, + 0x99865d44U, 0x608bd593U, 0x6c200e03U, 0x39dc5ff6U, + 0x5d0b00a3U, 0xae63aff2U, 0x7e8bd632U, 0x70108c0cU, + 0xbbd35049U, 0x2998df04U, 0x980cf42aU, 0x9b6df491U, + 0x9e7edd53U, 0x06918548U, 0x58cb7e07U, 0x3b74ef2eU, + 0x522fffb1U, 0xd24708ccU, 0x1c7e27cdU, 0xa4eb215bU, + 0x3cf1d2e2U, 0x19b47a38U, 0x424f7618U, 0x35856039U, + 0x9d17dee7U, 0x27eb35e6U, 0xc9aff67bU, 0x36baf5b8U, + 0x09c467cdU, 0xc18910b1U, 0xe11dbf7bU, 0x06cd1af8U, + 0x7170c608U, 0x2d5e3354U, 0xd4de495aU, 0x64c6d006U, + 0xbcc0c62cU, 0x3dd00db3U, 0x708f8f34U, 0x77d51b42U, + 0x264f620fU, 0x24b8d2bfU, 0x15c1b79eU, 0x46a52564U, + 0xf8d7e54eU, 0x3e378160U, 0x7895cda5U, 0x859c15a5U, + 0xe6459788U, 0xc37bc75fU, 0xdb07ba0cU, 0x0676a3abU, + 0x7f229b1eU, 0x31842e7bU, 0x24259fd7U, 0xf8bef472U, + 0x835ffcb8U, 0x6df4c1f2U, 0x96f5b195U, 0xfd0af0fcU, + 0xb0fe134cU, 0xe2506d3dU, 0x4f9b12eaU, 0xf215f225U, + 0xa223736fU, 0x9fb4c428U, 0x25d04979U, 0x34c713f8U, + 0xc4618187U, 0xea7a6e98U, 0x7cd16efcU, 0x1436876cU, + 0xf1544107U, 0xbedeee14U, 0x56e9af27U, 0xa04aa441U, + 0x3cf7c899U, 0x92ecbae6U, 0xdd67016dU, 0x151682ebU, + 0xa842eedfU, 0xfdba60b4U, 0xf1907b75U, 0x20e3030fU, + 0x24d8c29eU, 0xe139673bU, 0xefa63fb8U, 0x71873054U, + 0xb6f2cf3bU, 0x9f326442U, 0xcb15a4ccU, 0xb01a4504U, + 0xf1e47d8dU, 0x844a1be5U, 0xbae7dfdcU, 0x42cbda70U, + 0xcd7dae0aU, 0x57e85b7aU, 0xd53f5af6U, 0x20cf4d8cU, + 0xcea4d428U, 0x79d130a4U, 0x3486ebfbU, 0x33d3cddcU, + 0x77853b53U, 0x37effcb5U, 0xc5068778U, 0xe580b3e6U, + 0x4e68b8f4U, 0xc5c8b37eU, 0x0d809ea2U, 0x398feb7cU, + 0x132a4f94U, 0x43b7950eU, 0x2fee7d1cU, 0x223613bdU, + 0xdd06caa2U, 0x37df932bU, 0xc4248289U, 0xacf3ebc3U, + 0x5715f6b7U, 0xef3478ddU, 0xf267616fU, 0xc148cbe4U, + 0x9052815eU, 0x5e410fabU, 0xb48a2465U, 0x2eda7fa4U, + 0xe87b40e4U, 0xe98ea084U, 0x5889e9e1U, 0xefd390fcU, + 0xdd07d35bU, 0xdb485694U, 0x38d7e5b2U, 0x57720101U, + 0x730edebcU, 0x5b643113U, 0x94917e4fU, 0x503c2fbaU, + 0x646f1282U, 0x7523d24aU, 0xe0779695U, 0xf9c17a8fU, + 0x7a5b2121U, 0xd187b896U, 0x29263a4dU, 0xba510cdfU, + 0x81f47c9fU, 0xad1163edU, 0xea7b5965U, 0x1a00726eU, + 0x11403092U, 0x00da6d77U, 0x4a0cdd61U, 0xad1f4603U, + 0x605bdfb0U, 0x9eedc364U, 0x22ebe6a8U, 0xcee7d28aU, + 0xa0e736a0U, 0x5564a6b9U, 0x10853209U, 0xc7eb8f37U, + 0x2de705caU, 0x8951570fU, 0xdf09822bU, 0xbd691a6cU, + 0xaa12e4f2U, 0x87451c0fU, 0xe0f6a27aU, 0x3ada4819U, + 0x4cf1764fU, 0x0d771c2bU, 0x67cdb156U, 0x350d8384U, + 0x5938fa0fU, 0x42399ef3U, 0x36997b07U, 0x0e84093dU, + 0x4aa93e61U, 0x8360d87bU, 0x1fa98b0cU, 0x1149382cU, + 0xe97625a5U, 0x0614d1b7U, 0x0e25244bU, 0x0c768347U, + 0x589e8d82U, 0x0d2059d1U, 0xa466bb1eU, 0xf8da0a82U, + 0x04f19130U, 0xba6e4ec0U, 0x99265164U, 0x1ee7230dU, + 0x50b2ad80U, 0xeaee6801U, 0x8db2a283U, 0xea8bf59eU +}; + +#if defined(BIG_ENDIAN) +#define cast_htonl(H) (H) +#define cast_ntohl(N) (N) +#else /* !defined(BIG_ENDIAN) */ + +/* + * htonl + * + * PURPOSE + * Convert from the host machine byte order to the byte order used + * by by the CAST algorithm (big-endian = network order = 1234). + * + * HISTORY + * May 23, 1997 - Andrew E. Mileski + * Written, tested, and released. + */ +INTERNAL_LINKAGE __inline__ +U32 cast_htonl(U32 data) +{ +#if defined(__GNUC__) && defined(i486) + __asm__ ( + "bswapl %0" + : "=r" (data) + : "0" (data) + ); + return data; +#else /* !(defined(__GNUC__) && defined(i486)) */ + union { U8 b[4]; U32 l; } u; + u.b[3] = (U8) data; + u.b[2] = (U8)(data >> 8); + u.b[1] = (U8)(data >> 16); + u.b[0] = (U8)(data >> 24); + return u.l; +#endif /* !(defined(__GNUC__) && defined(i486)) */ +} + +/* + * ntohl + * + * PURPOSE + * Convert to the host machine byte order from the byte order used + * by by the CAST algorithm (big-endian = network order = 1234). + * + * HISTORY + * May 23, 1997 - Andrew E. Mileski + * Written, tested, and released. + */ +INTERNAL_LINKAGE __inline__ +U32 cast_ntohl(U32 data) +{ +#if defined(__GNUC__) && defined(i486) + __asm__ ( + "bswapl %0" + : "=r" (data) + : "0" (data) + ); + return data; +#else /* !(defined(__GNUC__) && defined(i486)) */ + union { U8 b[4]; U32 l; } u; + u.l = data; + return (u.b[0] << 24) | (u.b[1] << 16) | (u.b[2] << 8) | u.b[3]; +#endif /* !(defined(__GNUC__) && defined(i486)) */ +} +#endif /* !defined(BIG_ENDIAN) */ + +/* + * cast_rol + * + * PURPOSE + * Perform a left rotation. + * + * DESCRIPTION + * The portable code is SLOW. The ix86 code is a single instruction! + * + * Note: This is a macro. + * + * HISTORY + * May 21, 1997 - Andrew E. Mileski + * Written, tested, and released. + */ +INTERNAL_LINKAGE __inline__ +U32 cast_rol(U32 data, U32 count) +{ +#if defined(__GNUC__) && (defined(i386) || defined(i486)) + U32 _d; + __asm__ ( + "roll %%cl,%0" + : "=r" (data), "=c" (_d) + : "0" (data), "1" (count) + ); + return data; +#else /* !(defined(__GNUC__) && defined(i386)) */ + return (count &= 31) ? (data << count) | ((data >> (32 - count)) + & (0xffffffff >> (32 - count))): data; +#endif /* !(defined(__GNUC__) && defined(i386)) */ +} + +/* + * cast_encrypt + * + * PURPOSE + * Apply the CAST-128 algorithm to encrypt the specified plaintext. + * + * DESCRIPTION + * Refer to RFC 2144 for complete details on CAST. + * + * Note that CAST is a block cipher of size 64 bits (8 bytes). + * + * PRE-CONDITIONS + * K Pointer to subkeys - see cast_keySchedule(). + * M Pointer to plaintext. + * size Bytes in the plaintext. + * + * POST-CONDITIONS + * C Pointer to ciphertext. + * <return> Number of bytes plaintext not processed. + * + * HISTORY + * May 23, 1997 - Andrew E. Mileski + * Implemented RFC 2144 in C, tested, and released. + */ +#define Ia ((U8)(I >> 24)) +#define Ib ((U8)(I >> 16)) +#define Ic ((U8)(I >> 8)) +#define Id ((U8) I) + +#define ROUND1(X) \ + T = L; \ + L = R; \ + I = cast_rol(K[X] + R, K[(X) + 16]); \ + R = T ^ (((S1[Ia] ^ S2[Ib]) - S3[Ic]) + S4[Id]); + +#define ROUND2(X) \ + T = L; \ + L = R; \ + I = cast_rol(K[X] ^ R, K[(X) + 16]); \ + R = T ^ (((S1[Ia] - S2[Ib]) + S3[Ic]) ^ S4[Id]); + +#define ROUND3(X) \ + T = L; \ + L = R; \ + I = cast_rol(K[X] - R, K[(X) + 16]); \ + R = T ^ (((S1[Ia] + S2[Ib]) ^ S3[Ic]) - S4[Id]); + +EXTERNAL_LINKAGE +U32 cast_encrypt(U32 * K, U32 * M, U32 * C, U32 size) +{ + register U32 I, L, R, T; + + for (; size >= 8; size -= 8) { + + /* Split the plain-text */ + L = cast_htonl(*(M++)); + R = cast_htonl(*(M++)); + + /* Do rounds */ + ROUND1(0); + ROUND2(1); + ROUND3(2); + ROUND1(3); + ROUND2(4); + ROUND3(5); + ROUND1(6); + ROUND2(7); + ROUND3(8); + ROUND1(9); + ROUND2(10); + ROUND3(11); + ROUND1(12); + ROUND2(13); + ROUND3(14); + ROUND1(15); + + /* Swap halves */ + *(C++) = cast_ntohl(R); + *(C++) = cast_ntohl(L); + } + return size; +} + +/* + * cast_decrypt + * + * PURPOSE + * Apply the CAST-128 algorithm to decrypt the specified ciphertext. + * + * DESCRIPTION + * Refer to RFC 2144 for complete details on CAST. + * + * Note that CAST is a block cipher of size 64 bits (8 bytes). + * + * PRE-CONDITIONS + * K Pointer to subkeys - see cast_keySchedule(). + * C Pointer to ciphertext. + * size Bytes in the ciphertext. + * + * POST-CONDITIONS + * M Pointer to plaintext. + * <return> Number of bytes ciphertext not processed. + * + * HISTORY + * May 23, 1997 - Andrew E. Mileski + * Implemented RFC 2144 in C, tested, and released. + */ +EXTERNAL_LINKAGE +U32 cast_decrypt(U32 * K, U32 * M, U32 * C, U32 size) +{ + register U32 I, L, R, T; + + for (; size >= 8; size -= 8) { + + /* Split the ciphertext */ + L = cast_htonl(*(C++)); + R = cast_htonl(*(C++)); + + /* Do rounds */ + ROUND1(15); + ROUND3(14); + ROUND2(13); + ROUND1(12); + ROUND3(11); + ROUND2(10); + ROUND1(9); + ROUND3(8); + ROUND2(7); + ROUND1(6); + ROUND3(5); + ROUND2(4); + ROUND1(3); + ROUND3(2); + ROUND2(1); + ROUND1(0); + + /* Swap halves */ + *(M++) = cast_ntohl(R); + *(M++) = cast_ntohl(L); + } + return size; +} + +/* Cleanup the defines */ +#undef Ia +#undef Ib +#undef Ic +#undef Id +#undef ROUND1 +#undef ROUND2 +#undef ROUND3 + +/* + * cast_keySchedule + * + * PURPOSE + * Create the subkeys which are used in each round. + * + * DESCRIPTION + * Refer to RFC 2144, section 2.4. + * + * IMPORTANT - the macros are required for portability to machines + * with different byte ordering (endian-ness), but they badly pollute + * the namespace. + * + * PRE-CONDITIONS + * X Pointer to a key. + * + * POST-CONDITIONS + * K Pointer to sub-keys. + * + * HISTORY + * May 23, 1997 - Andrew E. Mileski + * Implemented RFC 2144 in C, tested, and released. + */ +#define x0 ((U8)(X0 >> 24)) +#define x1 ((U8)(X0 >> 16)) +#define x2 ((U8)(X0 >> 8)) +#define x3 ((U8) X0) +#define x4 ((U8)(X1 >> 24)) +#define x5 ((U8)(X1 >> 16)) +#define x6 ((U8)(X1 >> 8)) +#define x7 ((U8) X1) +#define x8 ((U8)(X2 >> 24)) +#define x9 ((U8)(X2 >> 16)) +#define xa ((U8)(X2 >> 8)) +#define xb ((U8) X2) +#define xc ((U8)(X3 >> 24)) +#define xd ((U8)(X3 >> 16)) +#define xe ((U8)(X3 >> 8)) +#define xf ((U8) X3) +#define z0 ((U8)(Z0 >> 24)) +#define z1 ((U8)(Z0 >> 16)) +#define z2 ((U8)(Z0 >> 8)) +#define z3 ((U8) Z0) +#define z4 ((U8)(Z1 >> 24)) +#define z5 ((U8)(Z1 >> 16)) +#define z6 ((U8)(Z1 >> 8)) +#define z7 ((U8) Z1) +#define z8 ((U8)(Z2 >> 24)) +#define z9 ((U8)(Z2 >> 16)) +#define za ((U8)(Z2 >> 8)) +#define zb ((U8) Z2) +#define zc ((U8)(Z3 >> 24)) +#define zd ((U8)(Z3 >> 16)) +#define ze ((U8)(Z3 >> 8)) +#define zf ((U8) Z3) + +EXTERNAL_LINKAGE +void cast_keySchedule(U32 * x, U32 * K) +{ + U32 X0, X1, X2, X3; + U32 Z0, Z1, Z2, Z3; + + /* Preserve the passed key */ + X0 = cast_htonl(*(x++)); + X1 = cast_htonl(*(x++)); + X2 = cast_htonl(*(x++)); + X3 = cast_htonl(*(x++)); + + Z0 = X0 ^ S5[xd] ^ S6[xf] ^ S7[xc] ^ S8[xe] ^ S7[x8]; + Z1 = X2 ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xa]; + Z2 = X3 ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9]; + Z3 = X1 ^ S5[za] ^ S6[z9] ^ S7[zb] ^ S8[z8] ^ S6[xb]; + + K[0] = S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2]; + K[1] = S5[za] ^ S6[zb] ^ S7[z5] ^ S8[z4] ^ S6[z6]; + K[2] = S5[zc] ^ S6[zd] ^ S7[z3] ^ S8[z2] ^ S7[z9]; + K[3] = S5[ze] ^ S6[zf] ^ S7[z1] ^ S8[z0] ^ S8[zc]; + + X0 = Z2 ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0]; + X1 = Z0 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2]; + X2 = Z1 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1]; + X3 = Z3 ^ S5[xa] ^ S6[x9] ^ S7[xb] ^ S8[x8] ^ S6[z3]; + + K[4] = S5[x3] ^ S6[x2] ^ S7[xc] ^ S8[xd] ^ S5[x8]; + K[5] = S5[x1] ^ S6[x0] ^ S7[xe] ^ S8[xf] ^ S6[xd]; + K[6] = S5[x7] ^ S6[x6] ^ S7[x8] ^ S8[x9] ^ S7[x3]; + K[7] = S5[x5] ^ S6[x4] ^ S7[xa] ^ S8[xb] ^ S8[x7]; + + Z0 = X0 ^ S5[xd] ^ S6[xf] ^ S7[xc] ^ S8[xe] ^ S7[x8]; + Z1 = X2 ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xa]; + Z2 = X3 ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9]; + Z3 = X1 ^ S5[za] ^ S6[z9] ^ S7[zb] ^ S8[z8] ^ S6[xb]; + + K[ 8] = S5[z3] ^ S6[z2] ^ S7[zc] ^ S8[zd] ^ S5[z9]; + K[ 9] = S5[z1] ^ S6[z0] ^ S7[ze] ^ S8[zf] ^ S6[zc]; + K[10] = S5[z7] ^ S6[z6] ^ S7[z8] ^ S8[z9] ^ S7[z2]; + K[11] = S5[z5] ^ S6[z4] ^ S7[za] ^ S8[zb] ^ S8[z6]; + + X0 = Z2 ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0]; + X1 = Z0 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2]; + X2 = Z1 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1]; + X3 = Z3 ^ S5[xa] ^ S6[x9] ^ S7[xb] ^ S8[x8] ^ S6[z3]; + + K[12] = S5[x8] ^ S6[x9] ^ S7[x7] ^ S8[x6] ^ S5[x3]; + K[13] = S5[xa] ^ S6[xb] ^ S7[x5] ^ S8[x4] ^ S6[x7]; + K[14] = S5[xc] ^ S6[xd] ^ S7[x3] ^ S8[x2] ^ S7[x8]; + K[15] = S5[xe] ^ S6[xf] ^ S7[x1] ^ S8[x0] ^ S8[xd]; + + Z0 = X0 ^ S5[xd] ^ S6[xf] ^ S7[xc] ^ S8[xe] ^ S7[x8]; + Z1 = X2 ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xa]; + Z2 = X3 ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9]; + Z3 = X1 ^ S5[za] ^ S6[z9] ^ S7[zb] ^ S8[z8] ^ S6[xb]; + + K[16] = S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2]; + K[17] = S5[za] ^ S6[zb] ^ S7[z5] ^ S8[z4] ^ S6[z6]; + K[18] = S5[zc] ^ S6[zd] ^ S7[z3] ^ S8[z2] ^ S7[z9]; + K[19] = S5[ze] ^ S6[zf] ^ S7[z1] ^ S8[z0] ^ S8[zc]; + + X0 = Z2 ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0]; + X1 = Z0 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2]; + X2 = Z1 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1]; + X3 = Z3 ^ S5[xa] ^ S6[x9] ^ S7[xb] ^ S8[x8] ^ S6[z3]; + + K[20] = S5[x3] ^ S6[x2] ^ S7[xc] ^ S8[xd] ^ S5[x8]; + K[21] = S5[x1] ^ S6[x0] ^ S7[xe] ^ S8[xf] ^ S6[xd]; + K[22] = S5[x7] ^ S6[x6] ^ S7[x8] ^ S8[x9] ^ S7[x3]; + K[23] = S5[x5] ^ S6[x4] ^ S7[xa] ^ S8[xb] ^ S8[x7]; + + Z0 = X0 ^ S5[xd] ^ S6[xf] ^ S7[xc] ^ S8[xe] ^ S7[x8]; + Z1 = X2 ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xa]; + Z2 = X3 ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9]; + Z3 = X1 ^ S5[za] ^ S6[z9] ^ S7[zb] ^ S8[z8] ^ S6[xb]; + + K[24] = S5[z3] ^ S6[z2] ^ S7[zc] ^ S8[zd] ^ S5[z9]; + K[25] = S5[z1] ^ S6[z0] ^ S7[ze] ^ S8[zf] ^ S6[zc]; + K[26] = S5[z7] ^ S6[z6] ^ S7[z8] ^ S8[z9] ^ S7[z2]; + K[27] = S5[z5] ^ S6[z4] ^ S7[za] ^ S8[zb] ^ S8[z6]; + + X0 = Z2 ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0]; + X1 = Z0 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2]; + X2 = Z1 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1]; + X3 = Z3 ^ S5[xa] ^ S6[x9] ^ S7[xb] ^ S8[x8] ^ S6[z3]; + + K[28] = S5[x8] ^ S6[x9] ^ S7[x7] ^ S8[x6] ^ S5[x3]; + K[29] = S5[xa] ^ S6[xb] ^ S7[x5] ^ S8[x4] ^ S6[x7]; + K[30] = S5[xc] ^ S6[xd] ^ S7[x3] ^ S8[x2] ^ S7[x8]; + K[31] = S5[xe] ^ S6[xf] ^ S7[x1] ^ S8[x0] ^ S8[xd]; +} + +/* Cleanup the defines */ +#undef x0 +#undef x1 +#undef x2 +#undef x3 +#undef x4 +#undef x5 +#undef x6 +#undef x7 +#undef x8 +#undef x9 +#undef xa +#undef xb +#undef xc +#undef xd +#undef xe +#undef xf +#undef z0 +#undef z1 +#undef z2 +#undef z3 +#undef z4 +#undef z5 +#undef z6 +#undef z7 +#undef z8 +#undef z9 +#undef za +#undef zb +#undef zc +#undef zd +#undef ze +#undef zf + +/*****************************************************************************/ + +#if defined(DO_TESTS) + +#include <stdio.h> +#include <time.h> + +void speed_test(void) +{ + U8 a[] = { + 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, + 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9a + }; + time_t start; + double elapsed; + U32 K[32]; + register int i; + + cast_keySchedule((U32 * ) a, K); + + printf("Performing Processing speed test..."); + fflush(stdout); + start = clock(); + for (i = 1; i <= 1000000; i++) + cast_encrypt(K, (U32 * ) a, (U32 * ) a, 16); + elapsed = clock() - start; + printf("Done.\nProcessed 16,000,000 bytes.\n"); + + printf("Elapsed time = %f\n", elapsed / CLOCKS_PER_SEC); + printf("Processing speed (million bytes/sec) = %.6f\n", + (CLOCKS_PER_SEC * 16) / elapsed); +} + +INTERNAL_LINKAGE __inline__ +int cmp(U8 *a, U8 *b) +{ + register int i; + + for (i = 0; i < 16 && *(a++) == *(b++); i++) { + ; + } + + return (i == 16); +} + +INTERNAL_LINKAGE __inline__ +void maintenance_test(void) +{ + U8 a[] = { + 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, + 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9a + }; + U8 b[] = { + 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, + 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9a + }; + U8 r1_a[] = { + 0xee, 0xa9, 0xd0, 0xa2, 0x49, 0xfd, 0x3b, 0xa6, + 0xb3, 0x43, 0x6f, 0xb8, 0x9d, 0x6d, 0xca, 0x92 + }; + U8 r1_b[] = { + 0xb2, 0xc9, 0x5e, 0xb0, 0x0c, 0x31, 0xad, 0x71, + 0x80, 0xac, 0x05, 0xb8, 0xe8, 0x3d, 0x69, 0x6e + }; + U8 r2_ab[] = { + 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, + 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9a + }; + U32 K[32]; + register int i; + + printf("Testing encryption..."); + fflush(stdout); + for (i = 1; i <= 1000000; i++) { + cast_keySchedule((U32 *) b, K); + cast_encrypt(K, (U32 *) a, (U32 *) a, 16); + + cast_keySchedule((U32 *) a, K); + cast_encrypt(K, (U32 *) b, (U32 *) b, 16); + } + if (cmp(a, r1_a) && cmp(b, r1_b)) + printf("Passed!\n"); + else + printf("Failed!\n"); + + printf("Testing decryption..."); + fflush(stdout); + for (i = 1; i <= 1000000; i++) { + cast_keySchedule((U32 *) a, K); + cast_decrypt(K, (U32 *) b, (U32 *) b, 16); + + cast_keySchedule((U32 *) b, K); + cast_decrypt(K, (U32 *) a, (U32 *) a, 16); + } + if (cmp(a, r2_ab) && cmp(b, r2_ab)) + printf("Passed!\n"); + else + printf("Failed!\n"); +} + +int main(void) +{ + maintenance_test(); + speed_test(); + return 0; +} +#endif /* defined(DO_TESTS) */ diff -urN lin.2.2.17/drivers/block/loop_fish2.c int.2.2.17.x/drivers/block/loop_fish2.c --- lin.2.2.17/drivers/block/loop_fish2.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/drivers/block/loop_fish2.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,629 @@ +#include <linux/module.h> +#include <linux/errno.h> +#include <linux/init.h> +#include <linux/fs.h> +#include <linux/string.h> +#include <linux/mm.h> +#include <linux/slab.h> +#include <asm/byteorder.h> +#include <linux/loop.h> + +#define ROL(x,c) (((x) << (c)) | ((x) >> (32-(c)))) +#define ROR(x,c) (((x) >> (c)) | ((x) << (32-(c)))) +#define Bswap(x) __le32_to_cpu(x) + +#define DWORD __u32 +#define BYTE unsigned char + +typedef struct fish2_key +{ int keyLen; /* Key Length in Bit */ + DWORD sboxKeys[4]; + DWORD subKeys[40]; + BYTE key[32]; + DWORD sbox_full[1024]; /* This have to be 1024 DWORDs */ +} fish2_key; + + +/* Mul_5B[i] is 0x5B * i in GF(256), whatever that means... */ + +static unsigned char Mul_5B[256] = { + 0x00,0x5B,0xB6,0xED,0x05,0x5E,0xB3,0xE8, + 0x0A,0x51,0xBC,0xE7,0x0F,0x54,0xB9,0xE2, + 0x14,0x4F,0xA2,0xF9,0x11,0x4A,0xA7,0xFC, + 0x1E,0x45,0xA8,0xF3,0x1B,0x40,0xAD,0xF6, + 0x28,0x73,0x9E,0xC5,0x2D,0x76,0x9B,0xC0, + 0x22,0x79,0x94,0xCF,0x27,0x7C,0x91,0xCA, + 0x3C,0x67,0x8A,0xD1,0x39,0x62,0x8F,0xD4, + 0x36,0x6D,0x80,0xDB,0x33,0x68,0x85,0xDE, + 0x50,0x0B,0xE6,0xBD,0x55,0x0E,0xE3,0xB8, + 0x5A,0x01,0xEC,0xB7,0x5F,0x04,0xE9,0xB2, + 0x44,0x1F,0xF2,0xA9,0x41,0x1A,0xF7,0xAC, + 0x4E,0x15,0xF8,0xA3,0x4B,0x10,0xFD,0xA6, + 0x78,0x23,0xCE,0x95,0x7D,0x26,0xCB,0x90, + 0x72,0x29,0xC4,0x9F,0x77,0x2C,0xC1,0x9A, + 0x6C,0x37,0xDA,0x81,0x69,0x32,0xDF,0x84, + 0x66,0x3D,0xD0,0x8B,0x63,0x38,0xD5,0x8E, + 0xA0,0xFB,0x16,0x4D,0xA5,0xFE,0x13,0x48, + 0xAA,0xF1,0x1C,0x47,0xAF,0xF4,0x19,0x42, + 0xB4,0xEF,0x02,0x59,0xB1,0xEA,0x07,0x5C, + 0xBE,0xE5,0x08,0x53,0xBB,0xE0,0x0D,0x56, + 0x88,0xD3,0x3E,0x65,0x8D,0xD6,0x3B,0x60, + 0x82,0xD9,0x34,0x6F,0x87,0xDC,0x31,0x6A, + 0x9C,0xC7,0x2A,0x71,0x99,0xC2,0x2F,0x74, + 0x96,0xCD,0x20,0x7B,0x93,0xC8,0x25,0x7E, + 0xF0,0xAB,0x46,0x1D,0xF5,0xAE,0x43,0x18, + 0xFA,0xA1,0x4C,0x17,0xFF,0xA4,0x49,0x12, + 0xE4,0xBF,0x52,0x09,0xE1,0xBA,0x57,0x0C, + 0xEE,0xB5,0x58,0x03,0xEB,0xB0,0x5D,0x06, + 0xD8,0x83,0x6E,0x35,0xDD,0x86,0x6B,0x30, + 0xD2,0x89,0x64,0x3F,0xD7,0x8C,0x61,0x3A, + 0xCC,0x97,0x7A,0x21,0xC9,0x92,0x7F,0x24, + 0xC6,0x9D,0x70,0x2B,0xC3,0x98,0x75,0x2E }; + + +/* Mul_EF[i] is 0xEF * i in GF(256), whatever that means... */ + +static unsigned char Mul_EF[256] = { + 0x00,0xEF,0xB7,0x58,0x07,0xE8,0xB0,0x5F, + 0x0E,0xE1,0xB9,0x56,0x09,0xE6,0xBE,0x51, + 0x1C,0xF3,0xAB,0x44,0x1B,0xF4,0xAC,0x43, + 0x12,0xFD,0xA5,0x4A,0x15,0xFA,0xA2,0x4D, + 0x38,0xD7,0x8F,0x60,0x3F,0xD0,0x88,0x67, + 0x36,0xD9,0x81,0x6E,0x31,0xDE,0x86,0x69, + 0x24,0xCB,0x93,0x7C,0x23,0xCC,0x94,0x7B, + 0x2A,0xC5,0x9D,0x72,0x2D,0xC2,0x9A,0x75, + 0x70,0x9F,0xC7,0x28,0x77,0x98,0xC0,0x2F, + 0x7E,0x91,0xC9,0x26,0x79,0x96,0xCE,0x21, + 0x6C,0x83,0xDB,0x34,0x6B,0x84,0xDC,0x33, + 0x62,0x8D,0xD5,0x3A,0x65,0x8A,0xD2,0x3D, + 0x48,0xA7,0xFF,0x10,0x4F,0xA0,0xF8,0x17, + 0x46,0xA9,0xF1,0x1E,0x41,0xAE,0xF6,0x19, + 0x54,0xBB,0xE3,0x0C,0x53,0xBC,0xE4,0x0B, + 0x5A,0xB5,0xED,0x02,0x5D,0xB2,0xEA,0x05, + 0xE0,0x0F,0x57,0xB8,0xE7,0x08,0x50,0xBF, + 0xEE,0x01,0x59,0xB6,0xE9,0x06,0x5E,0xB1, + 0xFC,0x13,0x4B,0xA4,0xFB,0x14,0x4C,0xA3, + 0xF2,0x1D,0x45,0xAA,0xF5,0x1A,0x42,0xAD, + 0xD8,0x37,0x6F,0x80,0xDF,0x30,0x68,0x87, + 0xD6,0x39,0x61,0x8E,0xD1,0x3E,0x66,0x89, + 0xC4,0x2B,0x73,0x9C,0xC3,0x2C,0x74,0x9B, + 0xCA,0x25,0x7D,0x92,0xCD,0x22,0x7A,0x95, + 0x90,0x7F,0x27,0xC8,0x97,0x78,0x20,0xCF, + 0x9E,0x71,0x29,0xC6,0x99,0x76,0x2E,0xC1, + 0x8C,0x63,0x3B,0xD4,0x8B,0x64,0x3C,0xD3, + 0x82,0x6D,0x35,0xDA,0x85,0x6A,0x32,0xDD, + 0xA8,0x47,0x1F,0xF0,0xAF,0x40,0x18,0xF7, + 0xA6,0x49,0x11,0xFE,0xA1,0x4E,0x16,0xF9, + 0xB4,0x5B,0x03,0xEC,0xB3,0x5C,0x04,0xEB, + 0xBA,0x55,0x0D,0xE2,0xBD,0x52,0x0A,0xE5 }; + +static inline DWORD mds_mul(BYTE *y) +{ DWORD z; + + z=Mul_EF[y[0]] ^ y[1] ^ Mul_EF[y[2]] ^ Mul_5B[y[3]]; + z<<=8; + z|=Mul_EF[y[0]] ^ Mul_5B[y[1]] ^ y[2] ^ Mul_EF[y[3]]; + z<<=8; + z|=Mul_5B[y[0]] ^ Mul_EF[y[1]] ^ Mul_EF[y[2]] ^ y[3]; + z<<=8; + z|=y[0] ^ Mul_EF[y[1]] ^ Mul_5B[y[2]] ^ Mul_5B[y[3]]; + + return z; +} + +/* q0 and q1 are the lookup substitutions done in twofish */ + +static unsigned char q0[256] = +{ 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, + 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38, + 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C, + 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, + 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23, + 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82, + 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, + 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61, + 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, + 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, + 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66, + 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, + 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, + 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71, + 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, + 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, + 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2, + 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90, + 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, + 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF, + 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B, + 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, + 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A, + 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, + 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, + 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D, + 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, + 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, + 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8, + 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, + 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, + 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0}; + +static unsigned char q1[256] = +{ 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, + 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B, + 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1, + 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, + 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D, + 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5, + 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, + 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51, + 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, + 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, + 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70, + 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, + 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, + 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2, + 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, + 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, + 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3, + 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E, + 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, + 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9, + 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01, + 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, + 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19, + 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64, + 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, + 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69, + 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, + 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, + 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB, + 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, + 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, + 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91 + }; + + +static DWORD f32(DWORD x, const DWORD * k32, int keyLen) +{ + BYTE b[4]; + + /* Run each byte thru 8x8 S-boxes, xoring with key byte at each stage. */ + /* Note that each byte goes through a different combination of S-boxes. */ + + *((DWORD *) b) = Bswap(x); /* make b[0] = LSB, b[3] = MSB */ + + switch (((keyLen + 63) / 64) & 3) + { + case 0: /* 256 bits of key */ + b[0] = q1[b[0]]; + b[1] = q0[b[1]]; + b[2] = q0[b[2]]; + b[3] = q1[b[3]]; + + *((DWORD *) b) ^= k32[3]; + + /* fall thru, having pre-processed b[0]..b[3] with k32[3] */ + case 3: /* 192 bits of key */ + b[0] = q1[b[0]]; + b[1] = q1[b[1]]; + b[2] = q0[b[2]]; + b[3] = q0[b[3]]; + + *((DWORD *) b) ^= k32[2]; + + /* fall thru, having pre-processed b[0]..b[3] with k32[2] */ + case 2: /* 128 bits of key */ + b[0] = q0[b[0]]; + b[1] = q1[b[1]]; + b[2] = q0[b[2]]; + b[3] = q1[b[3]]; + + *((DWORD *) b) ^= k32[1]; + + b[0] = q0[b[0]]; + b[1] = q0[b[1]]; + b[2] = q1[b[2]]; + b[3] = q1[b[3]]; + + *((DWORD *) b) ^= k32[0]; + + b[0] = q1[b[0]]; + b[1] = q0[b[1]]; + b[2] = q1[b[2]]; + b[3] = q0[b[3]]; + } + + + /* Now perform the MDS matrix multiply inline. */ + return mds_mul(b); +} + + +static void init_sbox(fish2_key *key) +{ DWORD x,*sbox,z,*k32; + int i,keyLen; + BYTE b[4]; + + k32=key->sboxKeys; + keyLen=key->keyLen; + sbox=key->sbox_full; + + x=0; + for (i=0;i<256;i++,x+=0x01010101) + { + *((DWORD *) b) = Bswap(x); /* make b[0] = LSB, b[3] = MSB */ + + switch (((keyLen + 63) / 64) & 3) + { + case 0: /* 256 bits of key */ + b[0] = q1[b[0]]; + b[1] = q0[b[1]]; + b[2] = q0[b[2]]; + b[3] = q1[b[3]]; + + *((DWORD *) b) ^= k32[3]; + + /* fall thru, having pre-processed b[0]..b[3] with k32[3] */ + case 3: /* 192 bits of key */ + b[0] = q1[b[0]]; + b[1] = q1[b[1]]; + b[2] = q0[b[2]]; + b[3] = q0[b[3]]; + + *((DWORD *) b) ^= k32[2]; + + /* fall thru, having pre-processed b[0]..b[3] with k32[2] */ + case 2: /* 128 bits of key */ + b[0] = q0[b[0]]; + b[1] = q1[b[1]]; + b[2] = q0[b[2]]; + b[3] = q1[b[3]]; + + *((DWORD *) b) ^= k32[1]; + + b[0] = q0[b[0]]; + b[1] = q0[b[1]]; + b[2] = q1[b[2]]; + b[3] = q1[b[3]]; + + *((DWORD *) b) ^= k32[0]; + + b[0] = q1[b[0]]; + b[1] = q0[b[1]]; + b[2] = q1[b[2]]; + b[3] = q0[b[3]]; + } + + z=Mul_EF[b[0]]; + z<<=8; + z|=Mul_EF[b[0]]; + z<<=8; + z|=Mul_5B[b[0]]; + z<<=8; + z|=b[0]; + + sbox[i]=z; + + z=b[1]; + z<<=8; + z|=Mul_5B[b[1]]; + z<<=8; + z|=Mul_EF[b[1]]; + z<<=8; + z|=Mul_EF[b[1]]; + + sbox[i+256]=z; + + z=Mul_EF[b[2]]; + z<<=8; + z|=b[2]; + z<<=8; + z|=Mul_EF[b[2]]; + z<<=8; + z|=Mul_5B[b[2]]; + + sbox[i+512]=z; + + z=Mul_5B[b[3]]; + z<<=8; + z|=Mul_EF[b[3]]; + z<<=8; + z|=b[3]; + z<<=8; + z|=Mul_5B[b[3]]; + + sbox[i+768]=z; + } +} + + +/* Reed-Solomon code parameters: (12,8) reversible code + g(x) = x**4 + (a + 1/a) x**3 + a x**2 + (a + 1/a) x + 1 + where a = primitive root of field generator 0x14D */ +#define RS_GF_FDBK 0x14D /* field generator */ +#define RS_rem(x) \ + { BYTE b = x >> 24; \ + DWORD g2 = ((b << 1) ^ ((b & 0x80) ? RS_GF_FDBK : 0 )) & 0xFF; \ + DWORD g3 = ((b >> 1) & 0x7F) ^ ((b & 1) ? RS_GF_FDBK >> 1 : 0 ) ^ g2 ; \ + x = (x << 8) ^ (g3 << 24) ^ (g2 << 16) ^ (g3 << 8) ^ b; \ + } + +static DWORD rs_mds(DWORD k0, DWORD k1) +{ + int i, j; + DWORD r; + + for (i = r = 0; i < 2; i++) + { + r ^= (i) ? k0 : k1; /* merge in 32 more key bits */ + for (j = 0; j < 4; j++) /* shift one byte at a time */ + RS_rem(r); + } + return r; +} + + +#define INPUT_WHITEN 0 /* subkey array indices */ +#define OUTPUT_WHITEN 4 +#define ROUND_SUBKEYS 8 /* use 2 * (# rounds) */ +#define TOTAL_SUBKEYS 40 + +static void init_key(fish2_key * key) +{ + int i, k64Cnt; + int keyLen = key->keyLen; + int subkeyCnt = TOTAL_SUBKEYS; + DWORD A, B; + DWORD k32e[4], k32o[4]; /* even/odd key dwords */ + + k64Cnt = (keyLen + 63) / 64; /* round up to next multiple of 64 bits */ + for (i = 0; i < k64Cnt; i++) + { /* split into even/odd key dwords */ + k32e[i] = ((DWORD *)key->key)[2 * i]; + k32o[i] = ((DWORD *)key->key)[2 * i + 1]; + /* compute S-box keys using (12,8) Reed-Solomon code over GF(256) */ + /* store in reverse order */ + key->sboxKeys[k64Cnt - 1 - i] = + Bswap(rs_mds(Bswap(k32e[i]), Bswap(k32o[i]))); + + } + + for (i = 0; i < subkeyCnt / 2; i++) /* compute round subkeys for PHT */ + { + A = f32(i * 0x02020202, k32e, keyLen); /* A uses even key dwords */ + B = f32(i * 0x02020202 + 0x01010101, k32o, keyLen); /* B uses odd key + dwords */ + B = ROL(B, 8); + key->subKeys[2 * i] = A + B; /* combine with a PHT */ + key->subKeys[2 * i + 1] = ROL(A + 2 * B, 9); + } + + init_sbox(key); +} + + +static inline DWORD f32_sbox(DWORD x,DWORD *sbox) +{ + /* Run each byte thru 8x8 S-boxes, xoring with key byte at each stage. */ + /* Note that each byte goes through a different combination of S-boxes. */ + + return (sbox[ (x) &0xff]^ + sbox[256 + (((x)>> 8)&0xff)]^ + sbox[512 + (((x)>>16)&0xff)]^ + sbox[768 + (((x)>>24)&0xff)]); +} + +#define roundE_m(x0,x1,x2,x3,rnd) \ + t0 = f32_sbox( x0, key->sbox_full ) ; \ + t1 = f32_sbox( ROL(x1,8), key->sbox_full ); \ + x2 ^= t0 + t1 + key->subKeys[2*rnd+8]; \ + x3 = ROL(x3,1); \ + x3 ^= t0 + 2*t1 + key->subKeys[2*rnd+9]; \ + x2 = ROR(x2,1); + + +static int blockEncrypt_CBC(fish2_key *key,BYTE *src,BYTE *dst,int len) +{ DWORD xx0,xx1,xx2,xx3,t0,t1,iv0,iv1,iv2,iv3; + + if (len & 0xF) return -1; + + iv0=0; + iv1=0; + iv2=0; + iv3=0; + for (;len>=16;len-=16) + + { + if ( ( len & 0x1FF) == 0) + { iv0=0; + iv1=0; + iv2=0; + iv3=0; + } + + xx0=Bswap(((DWORD *)src)[0]) ^ key->subKeys[0] ^ iv0; + xx1=Bswap(((DWORD *)src)[1]) ^ key->subKeys[1] ^ iv1; + xx2=Bswap(((DWORD *)src)[2]) ^ key->subKeys[2] ^ iv2; + xx3=Bswap(((DWORD *)src)[3]) ^ key->subKeys[3] ^ iv3; + + src+=16; + + roundE_m(xx0,xx1,xx2,xx3,0); + roundE_m(xx2,xx3,xx0,xx1,1); + roundE_m(xx0,xx1,xx2,xx3,2); + roundE_m(xx2,xx3,xx0,xx1,3); + roundE_m(xx0,xx1,xx2,xx3,4); + roundE_m(xx2,xx3,xx0,xx1,5); + roundE_m(xx0,xx1,xx2,xx3,6); + roundE_m(xx2,xx3,xx0,xx1,7); + roundE_m(xx0,xx1,xx2,xx3,8); + roundE_m(xx2,xx3,xx0,xx1,9); + roundE_m(xx0,xx1,xx2,xx3,10); + roundE_m(xx2,xx3,xx0,xx1,11); + roundE_m(xx0,xx1,xx2,xx3,12); + roundE_m(xx2,xx3,xx0,xx1,13); + roundE_m(xx0,xx1,xx2,xx3,14); + roundE_m(xx2,xx3,xx0,xx1,15); + + iv0=xx2 ^ key->subKeys[4]; + iv1=xx3 ^ key->subKeys[5]; + iv2=xx0 ^ key->subKeys[6]; + iv3=xx1 ^ key->subKeys[7]; + + ((DWORD *)dst)[0] = Bswap(iv0); + ((DWORD *)dst)[1] = Bswap(iv1); + ((DWORD *)dst)[2] = Bswap(iv2); + ((DWORD *)dst)[3] = Bswap(iv3); + dst+=16; + } + return len; +} + +#define roundD_m(x0,x1,x2,x3,rnd) \ + t0 = f32_sbox( x0, key->sbox_full); \ + t1 = f32_sbox( ROL(x1,8),key->sbox_full); \ + x2 = ROL(x2,1); \ + x3 ^= t0 + 2*t1 + key->subKeys[rnd*2+9]; \ + x3 = ROR(x3,1); \ + x2 ^= t0 + t1 + key->subKeys[rnd*2+8]; + + +static int blockDecrypt_CBC(fish2_key *key,BYTE *src,BYTE *dst,int len) +{ DWORD xx0,xx1,xx2,xx3,t0,t1,lx0,lx1,lx2,lx3,iv0,iv1,iv2,iv3; + + if (len & 0xF) return -1; + + iv0=0; + iv1=0; + iv2=0; + iv3=0; + + for (;len>=16;len-=16) + { + if ( ( len & 0x1FF) == 0) + { iv0=0; + iv1=0; + iv2=0; + iv3=0; + } + + lx0=iv0;iv0=Bswap(((DWORD *)src)[0]);xx0=iv0 ^ key->subKeys[4]; + lx1=iv1;iv1=Bswap(((DWORD *)src)[1]);xx1=iv1 ^ key->subKeys[5]; + lx2=iv2;iv2=Bswap(((DWORD *)src)[2]);xx2=iv2 ^ key->subKeys[6]; + lx3=iv3;iv3=Bswap(((DWORD *)src)[3]);xx3=iv3 ^ key->subKeys[7]; + src+=16; + + roundD_m(xx0,xx1,xx2,xx3,15); + roundD_m(xx2,xx3,xx0,xx1,14); + roundD_m(xx0,xx1,xx2,xx3,13); + roundD_m(xx2,xx3,xx0,xx1,12); + roundD_m(xx0,xx1,xx2,xx3,11); + roundD_m(xx2,xx3,xx0,xx1,10); + roundD_m(xx0,xx1,xx2,xx3,9); + roundD_m(xx2,xx3,xx0,xx1,8); + roundD_m(xx0,xx1,xx2,xx3,7); + roundD_m(xx2,xx3,xx0,xx1,6); + roundD_m(xx0,xx1,xx2,xx3,5); + roundD_m(xx2,xx3,xx0,xx1,4); + roundD_m(xx0,xx1,xx2,xx3,3); + roundD_m(xx2,xx3,xx0,xx1,2); + roundD_m(xx0,xx1,xx2,xx3,1); + roundD_m(xx2,xx3,xx0,xx1,0); + + ((DWORD *)dst)[0] = Bswap(xx2 ^ key->subKeys[0] ^ lx0); + ((DWORD *)dst)[1] = Bswap(xx3 ^ key->subKeys[1] ^ lx1); + ((DWORD *)dst)[2] = Bswap(xx0 ^ key->subKeys[2] ^ lx2); + ((DWORD *)dst)[3] = Bswap(xx1 ^ key->subKeys[3] ^ lx3); + dst+=16; + } + return len; +} + + +int transfer_fish2(struct loop_device *lo, int cmd, char *raw_buf, + char *loop_buf, int size, int real_block) +{ if (cmd == READ) + blockDecrypt_CBC((fish2_key *)lo->key_data,raw_buf,loop_buf,size); + else + blockEncrypt_CBC((fish2_key *)lo->key_data,loop_buf,raw_buf,size); + return 0; +} + +int fish2_init(struct loop_device *lo,struct loop_info *info) +{ fish2_key *key; + + if (info->lo_encrypt_key_size<16 || info->lo_encrypt_key_size>32) + return -EINVAL; + + key=(fish2_key *)kmalloc(sizeof(fish2_key),GFP_KERNEL); + + if (key==NULL) + return -ENOMEM; + + lo->key_data=key; + + memset(key->key,0,32); + + key->keyLen=info->lo_encrypt_key_size << 3; + memcpy(key->key,info->lo_encrypt_key,info->lo_encrypt_key_size); + + init_key(key); + + return 0; +} + +static int fish2_release(struct loop_device *lo) +{ if (lo->key_data!=NULL) + { + kfree(lo->key_data); + lo->key_data=NULL; + } + return(0); +} + +static void fish2_lock(struct loop_device *lo) +{ + MOD_INC_USE_COUNT; +} + +static void fish2_unlock(struct loop_device *lo) +{ + MOD_DEC_USE_COUNT; +} + + + +static struct loop_func_table fish2_funcs = +{ number: LO_CRYPT_FISH2, + transfer: transfer_fish2, + init: fish2_init, + release: fish2_release, + lock: fish2_lock, + unlock: fish2_unlock +}; + +#ifdef MODULE +int __init init_module(void) +#else +int __init loop_fish2_init(void) +#endif +{ + int err; + + if ((err=loop_register_transfer(&fish2_funcs))) + { + printk(KERN_WARNING "Couldn't register Twofish encryption\n"); + return err; + } + printk(KERN_INFO "loop: registered Twofish encryption \n"); + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ + if (loop_unregister_transfer(LO_CRYPT_FISH2)) + printk(KERN_WARNING "Couldn't unregister Twofish encryption\n"); + printk(KERN_INFO "loop: unregistered Twofish encryption \n"); +} +#endif diff -urN lin.2.2.17/drivers/block/loop_gen.c int.2.2.17.x/drivers/block/loop_gen.c --- lin.2.2.17/drivers/block/loop_gen.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/drivers/block/loop_gen.c Mon Oct 16 17:46:18 2000 @@ -0,0 +1,169 @@ +#include <linux/module.h> +#include <linux/errno.h> +#include <linux/init.h> +#include <linux/fs.h> +#include <linux/string.h> +#include <linux/mm.h> +#include <linux/slab.h> +#include <asm/byteorder.h> +#include <linux/loop.h> +#include <linux/crypto.h> + + +static char loop_gen_xfers[MAX_CIPHER] = {0}; + +static int loop_gen_transfer(struct loop_device *lo, int cmd, char *raw_buf, + char *loop_buf, int size, int real_block) +{ + struct cipher_context * cx = (struct cipher_context *) lo->key_data; + struct cipher_implementation *ci = cx->ci; + int (*encdecfunc)(struct cipher_context *cx, const u8 *in, u8 *out, int size); + char *in, *out; + + if (cmd == READ) { + encdecfunc = ci->decrypt; + in = raw_buf; + out = loop_buf; + } else { + encdecfunc = ci->encrypt; + in = loop_buf; + out = raw_buf; + } + if (!encdecfunc) { + printk("ouch! encdecfunc == NULL!\n"); + return -EINVAL; + } + ((u32 *)cx->iv)[0] = cpu_to_le32(real_block); + encdecfunc(cx, in, out, size); + return 0; +} + + +static int loop_gen_init2(struct loop_device *lo, struct loop_info *info) +{ + int cipher,err = -EINVAL; + int mode = CIPHER_CBC; + struct cipher_implementation *ci; + struct cipher_context *cx; + + switch (info->lo_encrypt_type) { + case LO_CRYPT_NONE: cipher = CIPHER_NONE; break; + case LO_CRYPT_XOR: cipher = CIPHER_XOR; break; + case LO_CRYPT_DES: cipher = CIPHER_DES | CIPHER_CBC; break; + case LO_CRYPT_FISH2: cipher = CIPHER_FISH2 | CIPHER_CBC; break; + default: cipher = info->lo_encrypt_type | mode; break; + } + + ci = find_cipher_by_id(cipher); + if (!ci) + goto out; + + if (ci->trans.t_id != cipher) { + printk("find_cipher_by_id gave me the wrong cipher!\n"); + goto out; + } + + ci->lock(); + err = -ENOMEM; + cx = (struct cipher_context *) kmalloc(sizeof(struct cipher_context), + GFP_KERNEL); + if (!cx) + goto out_ci; + cx->ci = ci; + memset(&cx->iv, 0, cx->ci->ivsize); + cx->keyinfo = (u32 *) kmalloc(ci->key_schedule_size, GFP_KERNEL); + if (!cx->keyinfo) + goto out_cx; + if (!ci->set_key) { + printk("Invalid cipher - set_key is NULL\n"); + err = -EINVAL; + goto out_key; + } + if (ci->set_key(cx, info->lo_encrypt_key, + info->lo_encrypt_key_size)) { + err = -EINVAL; + goto out_key; + } + lo->key_data = cx; + return 0; + + out_key: + kfree(cx->keyinfo); + out_cx: + kfree(cx); + out_ci: + ci->unlock(); + out: + return err; +} + + +static int loop_gen_release(struct loop_device *lo) +{ + struct cipher_context *cx = (struct cipher_context *) lo->key_data; + if (cx != NULL) { + memset(cx->keyinfo, 0, cx->ci->key_schedule_size); + kfree(cx->keyinfo); + cx->ci->unlock(); + memset(cx, 0, sizeof(*cx)); + kfree(cx); + lo->key_data=NULL; + } + return 0; +} + + +static void loop_gen_lock(struct loop_device *lo) +{ + MOD_INC_USE_COUNT; +} + +static void loop_gen_unlock(struct loop_device *lo) +{ + MOD_DEC_USE_COUNT; +} + +#ifdef MODULE +int __init init_module(void) +#else +int __init loop_gen_init(void) +#endif +{ + int i, n=0, err; + struct loop_func_table *funcs; + + for (i=0; i<MAX_CIPHER; i++) { + funcs = kmalloc(sizeof (struct loop_func_table), GFP_KERNEL); + memset(funcs, 0, sizeof(*funcs)); + if (funcs) { + funcs->number = i; + funcs->transfer = loop_gen_transfer; + funcs->init = loop_gen_init2; + funcs->release = loop_gen_release; + funcs->lock = loop_gen_lock; + funcs->unlock = loop_gen_unlock; + + err = loop_register_transfer(funcs); + if (!err) { + loop_gen_xfers[i] = 1; + n++; + } + } + } + return 0; +} + +#ifdef MODULE +void cleanup_module(void) +{ + int i; + + for (i=0; i<MAX_CIPHER; i++) { + if (loop_gen_xfers[i]) { + loop_unregister_transfer(i); + loop_gen_xfers[i] = 0; + } + } +} +#endif + diff -urN lin.2.2.17/include/asm-alpha/wordops.h int.2.2.17.x/include/asm-alpha/wordops.h --- lin.2.2.17/include/asm-alpha/wordops.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/include/asm-alpha/wordops.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,7 @@ +#ifndef _ALPHA_WORDOPS_H +#define _ALPHA_WORDOPS_H + +#define rotr32(x,n) generic_rotr32(x,n) +#define rotl32(x,n) generic_rotl32(x,n) + +#endif diff -urN lin.2.2.17/include/asm-arm/wordops.h int.2.2.17.x/include/asm-arm/wordops.h --- lin.2.2.17/include/asm-arm/wordops.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/include/asm-arm/wordops.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,7 @@ +#ifndef _ARM_WORDOPS_H +#define _ARM_WORDOPS_H + +#define rotr32(x,n) generic_rotr32(x,n) +#define rotl32(x,n) generic_rotl32(x,n) + +#endif diff -urN lin.2.2.17/include/asm-i386/wordops.h int.2.2.17.x/include/asm-i386/wordops.h --- lin.2.2.17/include/asm-i386/wordops.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/include/asm-i386/wordops.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,20 @@ +#ifndef _I386_WORDOPS_H +#define _I386_WORDOPS_H + +extern __inline__ int rotr32(__u32 x, int n) +{ + if (n == 32 || n == 0 || n == -32) + return x; + __asm__("rorl %1,%0" : "=r"(x) : "ir"(n)); + return x; +} + +extern __inline__ int rotl32(__u32 x, int n) +{ + if (n == 32 || n == 0 || n == -32) + return x; + __asm__("roll %1,%0" : "=r"(x) : "ir"(n)); + return x; +} + +#endif diff -urN lin.2.2.17/include/asm-m68k/wordops.h int.2.2.17.x/include/asm-m68k/wordops.h --- lin.2.2.17/include/asm-m68k/wordops.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/include/asm-m68k/wordops.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,8 @@ +#ifndef _M68K_WORDOPS_H +#define _M68K_WORDOPS_H + +#define rotr32(x,n) generic_rotr32(x,n) +#define rotl32(x,n) generic_rotl32(x,n) + +#endif + diff -urN lin.2.2.17/include/asm-mips/wordops.h int.2.2.17.x/include/asm-mips/wordops.h --- lin.2.2.17/include/asm-mips/wordops.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/include/asm-mips/wordops.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,8 @@ +#ifndef _MIPS_WORDOPS_H +#define _MIPS_WORDOPS_H + +#define rotr32(x,n) generic_rotr32(x,n) +#define rotl32(x,n) generic_rotl32(x,n) + +#endif + diff -urN lin.2.2.17/include/asm-ppc/wordops.h int.2.2.17.x/include/asm-ppc/wordops.h --- lin.2.2.17/include/asm-ppc/wordops.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/include/asm-ppc/wordops.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,41 @@ +#ifndef _PPC_WORDOPS_H +#define _PPC_WORDOPS_H + +#if 0 +/* The following is implemented from datasheets. If you have a + * PowerPC and can test the code, send me a note + * Alexander Kjeldaas <astor@guardian.no> + */ + +extern __inline__ rotr32(__u32 x, int n) +{ + int r; + if (n == 32 || n == 0 || n == -32) + return x; + if (__builtin_const_p(x)) + __asm__("rotrwi %0,%1,%2" : "=r"(r) : "r"(x), "i"(n)); + else + __asm__("rotrw %0,%1,%2" : "=r"(r) : "r"(x), "r"(n)); + return r; +} + +extern __inline__ rotl32(__u32 x, int n) +{ + int r; + if (n == 32 || n == 0 || n == -32) + return x; + if (__builtin_const_p(x)) + __asm__("rotlwi %0,%1,%2" : "=r"(r) : "r"(x), "i"(n)); + else + __asm__("rotlw %0,%1,%2" : "=r"(r) : "r"(x), "r"(n)); + return r; +} + +#else + +#define rotr32(x,n) generic_rotr32(x,n) +#define rotl32(x,n) generic_rotl32(x,n) + +#endif + +#endif diff -urN lin.2.2.17/include/asm-sparc/wordops.h int.2.2.17.x/include/asm-sparc/wordops.h --- lin.2.2.17/include/asm-sparc/wordops.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/include/asm-sparc/wordops.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,7 @@ +#ifndef _SPARC_WORDOPS_H +#define _SPARC_WORDOPS_H + +#define rotr32(x,n) generic_rotr32(x,n) +#define rotl32(x,n) generic_rotl32(x,n) + +#endif diff -urN lin.2.2.17/include/asm-sparc64/wordops.h int.2.2.17.x/include/asm-sparc64/wordops.h --- lin.2.2.17/include/asm-sparc64/wordops.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/include/asm-sparc64/wordops.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,7 @@ +#ifndef _SPARC9_WORDOPS_H +#define _SPARC9_WORDOPS_H + +#define rotr32(x,n) generic_rotr32(x,n) +#define rotl32(x,n) generic_rotl32(x,n) + +#endif diff -urN lin.2.2.17/include/linux/blk.h int.2.2.17.x/include/linux/blk.h --- lin.2.2.17/include/linux/blk.h Wed Jun 7 23:26:44 2000 +++ int.2.2.17.x/include/linux/blk.h Mon Oct 16 15:35:16 2000 @@ -52,6 +52,11 @@ extern int xd_init(void); extern int mfm_init(void); extern int loop_init(void); +extern int loop_serpent_init(void); +extern int loop_cast_init(void); +extern int loop_idea_init(void); +extern int loop_blow_init(void); +extern int loop_fish2_init(void); extern int md_init(void); extern int ap_init(void); extern int ddv_init(void); diff -urN lin.2.2.17/include/linux/crypto.h int.2.2.17.x/include/linux/crypto.h --- lin.2.2.17/include/linux/crypto.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/include/linux/crypto.h Mon Oct 16 18:02:38 2000 @@ -0,0 +1,404 @@ +#ifndef _LINUX_CRYPTO_H +#define _LINUX_CRYPTO_H + +/* + * include/linux/crypto.h + * + * Written by Alexander Kjeldaas <astor@fast.no> 1998-10-13 + * + * Copyright 1998 by Alexander Kjeldaas. This code is licensed under + * an X11-like license. See LICENSE.crypto for details. + * + */ + +#define TRANSFORM_DIGEST 0 +#define TRANSFORM_CIPHER 1 +#define MAX_TRANSFORM 2 + +#define DIGEST_NONE 0 +#define DIGEST_SUM 1 +#define DIGEST_CRC_CCITT16 2 +#define DIGEST_CRC_CCITT32 3 +#define DIGEST_MD4 4 +#define DIGEST_MD5 5 +#define DIGEST_SHA1 6 +#define MAX_DIGEST 20 + +#define CIPHER_NONE 0 +#define CIPHER_XOR 1 +#define CIPHER_DES 2 +#define CIPHER_FISH2 3 +#define CIPHER_BLOWFISH 4 +#define CIPHER_CAST128 5 +#define CIPHER_IDEA 6 +#define CIPHER_SERPENT 7 +#define CIPHER_MARS 8 +#define CIPHER_TWOFISH 9 +#define CIPHER_SKIPJACK 10 +#define CIPHER_RC6 11 +#define CIPHER_DES_EDE3 12 +#define CIPHER_E2 13 +#define CIPHER_CAST256 14 +#define CIPHER_DFC 15 +#define CIPHER_RIJNDAEL 16 +#define CIPHER_RC5 17 +#define CIPHER_AES 18 +#define MAX_CIPHER 20 +#define CIPHER_CBC 0x00010000 + + +#define CIPHER_KEYSIZE_ANY 0xFFFFFFFF +#define CIPHER_KEYSIZE_NONE 0x00000000 + +#define CIPHER_KEYSIZE_40 0x00000010 +#define CIPHER_KEYSIZE_56 0x00000040 +#define CIPHER_KEYSIZE_64 0x00000080 +#define CIPHER_KEYSIZE_80 0x00000200 +#define CIPHER_KEYSIZE_96 0x00000800 +#define CIPHER_KEYSIZE_112 0x00002000 +#define CIPHER_KEYSIZE_128 0x00008000 +#define CIPHER_KEYSIZE_160 0x00080000 +#define CIPHER_KEYSIZE_168 0x00100000 +#define CIPHER_KEYSIZE_192 0x00800000 +#define CIPHER_KEYSIZE_256 0x80000000 + + +#ifdef __KERNEL__ + +#include <linux/list.h> +#include <linux/kernel.h> +#include <linux/proc_fs.h> +#include <asm/page.h> +#include <asm/semaphore.h> +#include <asm/spinlock.h> + +typedef u32 u4byte; +typedef u8 u1byte; + + +/* A transform group is a group of transforms that behave in a similar + * fashion */ + +struct transform_group { + int tg_id; + char *tg_name; /* "cipher" or "digest" */ + spinlock_t tg_lock; + struct list_head *tg_head; +#ifdef CONFIG_PROC_FS + struct proc_dir_entry *tg_proc_parent_dir; + int (*read_proc)(char *page, char **start, off_t off, + int count, int *eof, void *data); +#endif +}; + +/* A transform is something that can be found by id or name. Ciphers + and digests are types of transforms. */ + +struct transform_implementation { + struct list_head t_list; + int t_id; + char *t_name; + struct transform_group *t_group; +#ifdef CONFIG_PROC_FS + /* keep track of the allocated proc_dir_entry */ + struct proc_dir_entry *t_proc; +#endif +}; + +/* Cipher data structures */ + +struct cipher_context; +struct cipher_implementation { + struct transform_implementation trans; + int blocksize; /* in bytes */ + int ivsize; /* in bytes */ + int key_schedule_size; /* in bytes */ + u32 key_size_mask; /* bit 0 set = 8 bit, ... , + * bit 31 set = 256 bit */ + + /* + * Encrypt the plaintext pointed to by "in". Write output to + * "out". Size of plaintext is "size". Output buffer must be + * able to hold "size" bytes plus padding necessary to make it + * a multiple of the cipher blocksize. size <= 0 is + * undefined. Returns 0 on success, non-zero on + * failure. Function might sleep. + * + */ + int (*encrypt)(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + + /* + * Decrypt the ciphertext pointed to by "in". Write output to + * "out". Size of plaintext is "size". Input buffer is "size" + * bytes plus padding necessary to make it a multiple of the + * cipher blocksize. size <= 0 is undefined. Returns 0 on + * success, non-zero on failure. Function might sleep. + * + */ + int (*decrypt)(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + + int (*set_key)(struct cipher_context *cx, + unsigned char *key, int key_len); + + /* lock and unlock manage the module use counts */ + void (*lock)(void); + void (*unlock)(void); +}; + +#define MAX_IV_SIZE 32 /* 32 byte - 256 bit */ + +struct cipher_context { + struct cipher_implementation *ci; + u32 *keyinfo; + int key_length; /* in bytes */ + u8 iv[MAX_IV_SIZE]; +}; + + +/* Digest data structures */ + +struct digest_context; +struct digest_implementation { + struct transform_implementation trans; + int blocksize; /* in bytes */ + int working_size; /* in bytes */ + + int (*open)(struct digest_context *cx); + int (*update)(struct digest_context *cx, u8 *in, int size); + int (*digest)(struct digest_context *cx, u8 *out); + int (*close)(struct digest_context *cx, u8 *out); + + /* lock and unlock manage the module use counts */ + void (*lock)(void); + void (*unlock)(void); +}; + +struct digest_context { + struct digest_implementation *di; + u32 *digest_info; +}; + + +struct transform_implementation *find_transform_by_id(int id, int tgroup); +struct transform_implementation *find_transform_by_name(const char *name, + int tgroup); + +static inline struct cipher_implementation *find_cipher_by_id(int id) +{ + return (struct cipher_implementation *) + find_transform_by_id(id, TRANSFORM_CIPHER); +} + +static inline struct cipher_implementation * +find_cipher_by_name(const char *name) +{ + return (struct cipher_implementation *) + find_transform_by_name(name, TRANSFORM_CIPHER); +} + +static inline struct digest_implementation *find_digest_by_id(int id) +{ + return (struct digest_implementation *) + find_transform_by_id(id, TRANSFORM_DIGEST); +} + +static inline struct digest_implementation * +find_digest_by_name(const char *name) +{ + return (struct digest_implementation *) + find_transform_by_name(name, TRANSFORM_DIGEST); +} + +int register_transform(struct transform_implementation *ti, int tgroup); +int unregister_transform(struct transform_implementation *ti); + +static inline int register_cipher(struct cipher_implementation *ci) +{ + return register_transform((struct transform_implementation *)ci, + TRANSFORM_CIPHER); +} + +static inline int register_digest(struct digest_implementation *di) +{ + return register_transform((struct transform_implementation *)di, + TRANSFORM_DIGEST); +} + +static inline int unregister_cipher(struct cipher_implementation *ci) +{ + return unregister_transform((struct transform_implementation *)ci); +} + +static inline int unregister_digest(struct digest_implementation *ci) +{ + return unregister_transform((struct transform_implementation *)ci); +} + + + +/* System initialization */ +extern int cryptoapi_init(void); + +/* Cipher implementations */ + +extern int init_cast256(void); +#define CAST256_KEY_SCHEDULE_SIZE (96*sizeof(u32)) +extern int cast256_set_key(struct cipher_context *cx, unsigned char *key, + int key_len); +extern int cast256_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); +extern int cast256_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + +extern int init_crypton(void); +#define CRYPTON_KEY_SCHEDULE_SIZE (104*sizeof(u32)) +extern int crypton_set_key(struct cipher_context *cx, unsigned char *key, + int key_len); +extern int crypton_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); +extern int crypton_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + +extern int init_serpent(void); +#define SERPENT_KEY_SCHEDULE_SIZE (140*sizeof(u32)) +extern int serpent_set_key(struct cipher_context *cx, unsigned char *key, + int key_len); +extern int serpent_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); +extern int serpent_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + +extern int init_mars(void); +#define MARS_KEY_SCHEDULE_SIZE (40*sizeof(u32)) +extern int mars_set_key(struct cipher_context *cx, unsigned char *key, + int key_len); +extern int mars_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); +extern int mars_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + +extern int init_rc5(void); +#define RC5_KEY_SCHEDULE_SIZE (34*sizeof(u32)) +extern int rc5_set_key(struct cipher_context *cx, unsigned char *key, + int key_len); +extern int rc5_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); +extern int rc5_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + +extern int init_rc6(void); +#define RC6_KEY_SCHEDULE_SIZE (44*sizeof(u32)) +extern int rc6_set_key(struct cipher_context *cx, unsigned char *key, + int key_len); +extern int rc6_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); +extern int rc6_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + +extern int init_dfc(void); +#define DFC_KEY_SCHEDULE_SIZE (32*sizeof(u32)) +extern int dfc_set_key(struct cipher_context *cx, unsigned char *key, + int key_len); +extern int dfc_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); +extern int dfc_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + +extern int init_rijndael(void); +#define RIJNDAEL_KEY_SCHEDULE_SIZE ((60+60)*sizeof(u32)) +extern int rijndael_set_key(struct cipher_context *cx, unsigned char *key, + int key_len); +extern int rijndael_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); +extern int rijndael_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + +extern int init_blowfish(void); +#define BLOWFISH_KEY_SCHEDULE_SIZE ((18+1024)*sizeof(u32)) +extern int blowfish_set_key(struct cipher_context *cx, + unsigned char *key, int key_len); +extern int blowfish_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); +extern int blowfish_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + +extern int init_twofish(void); +#define TWOFISH_KEY_SCHEDULE_SIZE ((4*256+8+32)*sizeof(u32)) +extern int twofish_set_key(struct cipher_context *cx, + unsigned char *key, int key_len); +extern int twofish_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); +extern int twofish_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + +extern int init_idea(void); +#define IDEA_KEY_SCHEDULE_SIZE (104*2) +extern int idea_set_key(struct cipher_context *cx, unsigned char *key, + int key_len); +extern int idea_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); +extern int idea_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + +extern int init_des(void); +#define DES_KEY_SCHEDULE_SIZE (32*sizeof(u32)) +extern int des_set_key(struct cipher_context *cx, unsigned char *key, + int key_len); +extern int des_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); +extern int des_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + +extern int init_des_ede3(void); +#define DES_EDE3_KEY_SCHEDULE_SIZE (3*32*sizeof(u32)) +extern int des_ede3_set_key(struct cipher_context *cx, unsigned char *key, + int key_len); +extern int des_ede3_encrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); +extern int des_ede3_decrypt(struct cipher_context *cx, + const u8 *in, u8 *out, int size); + +/* Digest implementations */ + +extern int init_md5(void); +#define MD5_WORKING_SIZE ((4+2+16)*sizeof(u32)) +extern int md5_open(struct digest_context *cx); +extern int md5_update(struct digest_context *cx, u8 *in, int size); +extern int md5_current(struct digest_context *cx, u8 *out); +extern int md5_close(struct digest_context *cx, u8 *out); + +extern int init_sha1(void); +#define SHA1_WORKING_SIZE ((5+2+16)*sizeof(u32)) +extern int sha1_open(struct digest_context *cx); +extern int sha1_update(struct digest_context *cx, u8 *in, int size); +extern int sha1_current(struct digest_context *cx, u8 *out); +extern int sha1_close(struct digest_context *cx, u8 *out); + + +/* Utility macros */ + +#define INIT_CIPHER_BLKOPS(name) \ + encrypt: name##_encrypt, \ + decrypt: name##_decrypt + +#define INIT_CIPHER_OPS(name) \ + set_key: name##_set_key, \ + lock: name##_lock, \ + unlock: name##_unlock + +#define INIT_DIGEST_OPS(name) \ + open: name##_open, \ + update: name##_update, \ + digest: name##_digest, \ + close: name##_close, \ + lock: name##_lock, \ + unlock: name##_unlock + + +#define byte(x, nr) ((unsigned char)((x) >> (nr*8))) + +#endif /* __KERNEL__ */ + +#endif diff -urN lin.2.2.17/include/linux/loop.h int.2.2.17.x/include/linux/loop.h --- lin.2.2.17/include/linux/loop.h Mon Nov 23 06:29:54 1998 +++ int.2.2.17.x/include/linux/loop.h Mon Oct 16 18:02:49 2000 @@ -2,6 +2,7 @@ #define _LINUX_LOOP_H #include <linux/kdev_t.h> +#include <linux/crypto.h> /* * include/linux/loop.h @@ -90,12 +91,21 @@ #define LO_CRYPT_NONE 0 #define LO_CRYPT_XOR 1 #define LO_CRYPT_DES 2 -#define LO_CRYPT_FISH2 3 /* Brand new Twofish encryption */ +#define LO_CRYPT_FISH2 3 #define LO_CRYPT_BLOW 4 #define LO_CRYPT_CAST128 5 #define LO_CRYPT_IDEA 6 +#define LO_CRYPT_SERPENT 7 +#define LO_CRYPT_MARS 8 #define LO_CRYPT_DUMMY 9 #define LO_CRYPT_SKIPJACK 10 +#define LO_CRYPT_RC6 11 +#define LO_CRYPT_DES_EDE3 12 +#define LO_CRYPT_E2 13 +#define LO_CRYPT_CAST256 14 +#define LO_CRYPT_DFC 15 +#define LO_CRYPT_RIJNDAEL 16 +#define LO_CRYPT_RC5 17 #define MAX_LO_CRYPT 20 #ifdef __KERNEL__ @@ -116,6 +126,9 @@ int loop_register_transfer(struct loop_func_table *funcs); int loop_unregister_transfer(int number); +struct loop_func_table *loop_find_xfer_funcs(int number); + + #endif /* diff -urN lin.2.2.17/include/linux/wordops.h int.2.2.17.x/include/linux/wordops.h --- lin.2.2.17/include/linux/wordops.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/include/linux/wordops.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,12 @@ +#ifndef _LINUX_WORDOPS_H +#define _LINUX_WORDOPS_H + +#include <linux/types.h> + +#define generic_rotr32(x,n) (((x) >> ((int)(n))) | ((x) << (32 - (int)(n)))) + +#define generic_rotl32(x, n) (((x) << ((int)(n))) | ((x) >> (32 - (int)(n)))) + +#include <asm/wordops.h> + +#endif diff -urN lin.2.2.17/include/net/sock.h int.2.2.17.x/include/net/sock.h --- lin.2.2.17/include/net/sock.h Thu Sep 14 18:18:22 2000 +++ int.2.2.17.x/include/net/sock.h Mon Oct 16 15:35:38 2000 @@ -536,6 +536,14 @@ int (*backlog_rcv) (struct sock *sk, struct sk_buff *skb); void (*destruct)(struct sock *sk); + +#ifdef CONFIG_NET_SECURITY + /* + * Security + */ + short authentication; + short encryption; +#endif }; /* IP protocol blocks we attach to sockets. diff -urN lin.2.2.17/init/main.c int.2.2.17.x/init/main.c --- lin.2.2.17/init/main.c Thu Sep 14 18:18:22 2000 +++ int.2.2.17.x/init/main.c Sat Oct 14 00:48:17 2000 @@ -60,6 +60,10 @@ extern int irda_device_init(void); +#ifdef CONFIG_CRYPTO +#include <linux/crypto.h> +#endif + /* * Versions of gcc older than that listed below may actually compile * and link okay, but the end product can have subtle run time bugs. @@ -1557,6 +1561,12 @@ /* .. filesystems .. */ filesystem_setup(); + + +#ifdef CONFIG_CRYPTO + /* .. crypto .. */ + cryptoapi_init(); +#endif #ifdef CONFIG_IRDA irda_device_init(); /* Must be done after protocol initialization */ diff -urN lin.2.2.17/net/Config.in int.2.2.17.x/net/Config.in --- lin.2.2.17/net/Config.in Tue Jan 4 19:12:26 2000 +++ int.2.2.17.x/net/Config.in Sat Oct 14 00:48:17 2000 @@ -3,6 +3,7 @@ # mainmenu_option next_comment comment 'Networking options' +source net/cipe/Config.in tristate 'Packet socket' CONFIG_PACKET bool 'Kernel/User netlink socket' CONFIG_NETLINK if [ "$CONFIG_NETLINK" = "y" ]; then @@ -10,6 +11,9 @@ tristate 'Netlink device emulation' CONFIG_NETLINK_DEV fi bool 'Network firewalls' CONFIG_FIREWALL +if [ "$CONFIG_FIREWALL" = "y" ]; then + bool 'Network security (ENskip support)' CONFIG_NET_SECURITY +fi bool 'Socket Filtering' CONFIG_FILTER tristate 'Unix domain sockets' CONFIG_UNIX bool 'TCP/IP networking' CONFIG_INET diff -urN lin.2.2.17/net/Makefile int.2.2.17.x/net/Makefile --- lin.2.2.17/net/Makefile Mon Mar 22 20:18:17 1999 +++ int.2.2.17.x/net/Makefile Sat Oct 14 00:48:17 2000 @@ -161,6 +161,14 @@ endif endif +ifeq ($(CONFIG_CIPE),y) +MOD_SUB_DIRS += cipe +else + ifeq ($(CONFIG_CIPE),m) + MOD_SUB_DIRS += cipe + endif +endif + # We must attach netsyms.o to socket.o, as otherwise there is nothing # to pull the object file from the archive. diff -urN lin.2.2.17/net/cipe/CHANGES int.2.2.17.x/net/cipe/CHANGES --- lin.2.2.17/net/cipe/CHANGES Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/CHANGES Sat Oct 14 00:48:17 2000 @@ -0,0 +1,25 @@ + User visible changes of this version since 1.2: + +- Build uses an autoconf script. Poking around in the Makefile is + unnecessary now. Installing: ./configure; make. + Options are set on the command line of ./configure. + configure script looks for kernel headers in default location. +- Compilation happens in separate object directory, it is possible to + have different configurations (e.g. IDEA/Blowfish) at once in + different object directories. +- ciped has been renamed to ciped-XY, with XY as in cipXY.o. +- ip-up, ip-down get passed the configuration parameters in environment. +- Options to send internal keepalive pings and timeout on them. + + User visible changes of this version since 1.0: + +- Runs under Linux 2.1.x, at least with x>=109, and 2.2.x. +- Device names have changed: protocol version is now a letter. 1=a, + 2=b etc., so cip3b->cipcb. +- Channels are allocated and deallocated dynamically. This enables the + default for cipe_maxdev to be set to 100. + (Compilation option NO_DYNDEV to remove this feature.) +- Statistics are logged upon close and then cleared. The log is simply + one line from /proc/net/dev. +- ciped waits for completion of ip-up before daemonizing. +- New configuration option for using key exchange timestamps. diff -urN lin.2.2.17/net/cipe/COPYING int.2.2.17.x/net/cipe/COPYING --- lin.2.2.17/net/cipe/COPYING Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/COPYING Sat Oct 14 00:48:17 2000 @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) 19yy <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff -urN lin.2.2.17/net/cipe/Checksums int.2.2.17.x/net/cipe/Checksums --- lin.2.2.17/net/cipe/Checksums Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/Checksums Sat Oct 14 00:48:17 2000 @@ -0,0 +1,62 @@ +# This file contains a list of the files in this package with checksums. +# If you run this as a /bin/sh script, it will verify the PGP signature on +# this file and verify the individual files' checksums. +# +# Packaged by olaf@bigred, Mon Jun 14 23:09:37 CEST 1999 +:<<'_marker_' +-----BEGIN PGP SIGNED MESSAGE----- + +___size _____________date ____________________md5-checksum name_______________ + 796 Sep 19 1997 00:49 c8cae8576a04fe01557742ad420b1bea README + 1255 Apr 28 1999 21:14 14f771fb085446ec8d9a171fa3ccd6b5 CHANGES + 17982 Sep 22 1998 20:26 8ca43cbc842c2336e835926c2166c28b COPYING + 429 Jun 14 1999 22:52 260336ed7c9295f8e49036d8dd1dd1d1 cipe.lsm + 46949 Jun 14 1999 23:09 20c60ed1ef1d1e4cae2d7795c849eacc configure + 5487 Jun 14 1999 23:09 de4a4ac8c3efad0b4935ad3a8b64ffc8 configure.in + 53596 Jun 14 1999 23:09 61ecdfbaa7feeaaeb8d9408cbc0562d0 cipe.info + 1427 May 21 1998 12:42 14269b217687faf1243394174aa0f3b5 tcpdump.patch + 2082 Apr 29 1999 11:32 50721551ee83d4f9e8d0fafb1f97ef3c conf/Makefile-top.in + 2500 May 07 1999 12:40 94768955f3caadc009e5f4dea13a057b conf/Makefile-obj.in + 405 Apr 22 1999 01:54 b418e463c0d66adcb8c488f61f363e7a conf/aclocal.m4 + 621 Apr 25 1999 22:09 81fdffd2c5134eddc66a7eb3d117d8a9 conf/config.h.in + 8185 Apr 27 1999 23:53 065069ae2d73c6838c52b72b15e5e71a cipe.h + 2206 Apr 25 1999 18:42 6c75bffa52e891c84487242066845b0c crypto.h + 25052 Jun 07 1999 21:08 6e79e09fc30653daddfce93c5c05eea5 ciped.c + 822 Apr 27 1999 23:53 b6c4f529b040bc451f933cd2623bd248 ciped.h + 1645 Nov 14 1998 21:48 ad260b21470f08cf072fe3d045bf2668 ioctl.c + 931 Aug 22 1998 18:05 ff64d954d85cc28272a0c15af658847c ioctl.h + 3624 Apr 27 1999 23:53 6187fea2b16955a47088bcffd185347b socks5.c + 1289 Oct 18 1998 17:38 141cf05740d734fbbde97a6be9457314 module.c + 13767 Apr 25 1999 18:42 9133f382480d95c4b969d01268c3606d device.c + 17553 Apr 29 1999 11:32 bef1c79a0f694b2f57ff2f6e08cae291 sock.c + 16174 Jun 07 1999 21:08 433453aba5c21fed46f6e90e1efca07a output.c + 6902 Apr 27 1999 23:53 82298747b64acd87975b9bf49efc9f0d encaps.c + 5034 Oct 13 1996 18:25 9af2477ad5d09f437e3f5d4ef504b1db idea0.h + 8750 Nov 14 1998 21:48 dc3dac9ebae60063883d6ec9e315ad7a idea0.c + 858 Mar 21 1997 00:28 dfc61571400df91153f88cb8c1494fd7 bf.h + 2968 Apr 01 1997 00:04 0c9ad0d1d34108a13be183abd0173ce6 crc.c + 7081 May 30 1997 00:20 5de39024b25f15fc6c2e2c63a29c9d6c crc32.c + 1014 Apr 25 1999 18:42 080d5886fcac5fb8b659810cba4c34d4 crcgen.c + 2588 Apr 01 1997 00:07 7106989d997a72788054ed910db7815e idea-i386.S + 18787 Apr 01 1997 00:00 1ee296728023dcfc1e87dc712431a4a7 bf-i386.S + 2178 Oct 13 1996 18:19 607f582afdf7cb5f99d20b0b9137477f thruput.c + 55 Oct 09 1996 01:16 3e202bcd35450045391894a1b85077a8 samples/README + 682 Mar 03 1999 12:53 5ce6004ee6a973b6d6c556fb08724dff samples/options + 1690 Mar 03 1999 12:53 0f7e1dc601ae95f391405e48b8477432 samples/ip-up + 459 Oct 18 1998 17:38 3c3431b0c54ab8011fc6069ef08a984e samples/ip-down +___size _____________date ____________________md5-checksum name_______________ +_ +_marker_ +echo "No output after the PGP signature check means everything is okay." +pgp -tf <$0 | sed -e '/^_marker_/q' -e '/^_/d' | cut -b27- | md5sum -c +exit $? +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v0.9.5 (GNU/Linux) +Comment: For info see http://www.gnupg.org + +iQCVAwUBN2VvlcDBbWIyVM0dAQG/hQP/V3KOdo9cpwvd5X0zYQtGmJwoRPwOTGQf +ymD+KMrsrY8Z1poOa1qBtqXJMFkfaeKy4NQbimFoFIMTnvWD72HLm03pKPhzAt4n +kl2KI82EyTyHoDazfenZNQ2xnlqbCz2mDA72mBA0NoyMQ+2J+waw1HWV+2np+L1e +rDNBnfuGse0= +=J9lR +-----END PGP SIGNATURE----- diff -urN lin.2.2.17/net/cipe/Config.in int.2.2.17.x/net/cipe/Config.in --- lin.2.2.17/net/cipe/Config.in Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/Config.in Sat Oct 14 00:48:17 2000 @@ -0,0 +1,14 @@ +# +# CIPE configuration +# +if [ "$CONFIG_MODULES" != "y" ]; then + comment 'CIPE can only be compiled as a module' +fi +dep_tristate 'CIPE: encrypted IP-in-UDP tunneling' CONFIG_CIPE $CONFIG_MODULES +if [ "$CONFIG_CIPE" = "y" ]; then + int 'CIPE: version' CONFIG_CIPE_VERSION 3 + bool 'CIPE: IDEA encryption' CONFIG_CIPE_IDEA n + if [ "$CONFIG_CIPE_IDEA" = "n" ]; then + bool 'CIPE: Blowfish encryption' CONFIG_CIPE_BLOWFISH y + fi +fi diff -urN lin.2.2.17/net/cipe/Makefile int.2.2.17.x/net/cipe/Makefile --- lin.2.2.17/net/cipe/Makefile Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/Makefile Sat Oct 14 00:48:17 2000 @@ -0,0 +1,73 @@ +# +# Makefile for the Linux cipe driver. +# +# Note! Dependencies are done automagically by 'make dep', which also +# removes any old dependencies. DON'T put your own dependencies here +# unless it's something special (ie not a .c file). +# +# Note 2! The CFLAGS definition is now in the main makefile... + +O_TARGET = +O_OBJS := module.o device.o sock.o output.o encaps.o +M_OBJS = $(O_TARGET) + +VERSION := 1.2.0 +CFG := -DProtocolVersion=$(CONFIG_CIPE_VERSION) -DVERSION=\"$(VERSION)\" +DEFS := -DDEBUG -DLOGFAC=LOG_DAEMON # -DNO_DYNDEV + +ifeq ($(CONFIG_CIPE_IDEA),y) +CFG += -DCrypto_IDEA +CRYPTO=IDEA +else +ifeq ($(CONFIG_CIPE_BLOWFISH),y) +CFG += -DCrypto_Blowfish +CRYPTO=Blowfish +endif +endif + +ifeq ($(CONFIG_CIPE_VERSION),1) +VERSC=a +O_OBJS += crc.o +endif +ifeq ($(CONFIG_CIPE_VERSION),2) +VERSC=b +O_OBJS += crc.o +endif +ifeq ($(CONFIG_CIPE_VERSION),3) +VERSC=c +O_OBJS += crc32.o +endif + +ifeq ($(ARCH),i386) +ifeq ($(CONFIG_CIPE_IDEA),y) +CFG += -DASM_Idea_Crypt +O_OBJS += idea-i386.o idea0.o +O_TARGET = cip$(VERSC)i.o +endif +ifeq ($(CONFIG_CIPE_BLOWFISH),y) +CFG += -DASM_BF_Crypt +O_OBJS += bf-i386.o +O_TARGET = cip$(VERSC)b.o +endif +else +ifeq ($(CONFIG_CIPE_IDEA),y) +O_OBJS += idea0.o +O_TARGET = cip$(VERSC)i.o +endif +endif + +EXTRA_CFLAGS = $(CFG) $(DEFS) +EXTRA_ASFLAGS = $(CFG) $(DEFS) + +version.h: Makefile crcgen + ./crcgen "$(VERSION)$(CRYPTO)$(CONFIG_CIPE_VERSION)$(DEFS)" >$@ + +crcgen: crc32.o crcgen.o + $(CC) $(LDFLAGS) -o crcgen crc32.o crcgen.o + +device.o: version.h + +%.o: %.S + $(CC) $(ASFLAGS) $(EXTRA_ASFLAGS) -c -o $@ $< + +include $(TOPDIR)/Rules.make diff -urN lin.2.2.17/net/cipe/README int.2.2.17.x/net/cipe/README --- lin.2.2.17/net/cipe/README Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/README Sat Oct 14 00:48:17 2000 @@ -0,0 +1,21 @@ + CIPE - encrypted IP over UDP tunneling + Copyright 1996-1997 Olaf Titz <olaf@bigred.inka.de> + + Version 0.5 + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. + +Documentation for this package is in the file "cipe.info", to be read +with Emacs or the "info" program. + +The newest version of CIPE is available on + http://www.inka.de/~bigred/devel/cipe.html + or ftp://ftp.inka.de/sites/bigred/cipe.html +(always just an index page). +In case you want a hardcopy printout of the manual, you can also get +the Texinfo source for the manual there. + +$Id: README,v 1.7 1997/09/18 22:49:22 olaf Exp $ diff -urN lin.2.2.17/net/cipe/bf-i386.S int.2.2.17.x/net/cipe/bf-i386.S --- lin.2.2.17/net/cipe/bf-i386.S Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/bf-i386.S Sat Oct 14 00:48:17 2000 @@ -0,0 +1,492 @@ +/* + Bruce Schneier's Blowfish in i386 assembler (for linux/gcc) + Author: Olaf Titz <olaf@bigred.inka.de> + + This code is in the public domain. + + $Id: bf-i386.S,v 1.2 1997/03/31 22:00:06 olaf Exp $ +*/ + +#ifdef ASM_BF_Crypt + +#ifndef __ASSEMBLY__ +#define __ASSEMBLY__ +#endif +#include <linux/linkage.h> +/* this header just defines ENTRY to make an appropriate global symbol */ + +#define PosP0 0 +#define PosP17 68 +#define PosS0 72 +#define PosS1 1096 +#define PosS2 2120 +#define PosS3 3144 +#define KeyLenL 1042 +#define KeyLenB 521 + +/* This code is optimized for speed rather than size - loops unrolled. etc. */ + +/* + Endian-ness is taken care of by (a) the order of shifts in the Round + macro and (b) the order of shifts below under the ukx label. + The key tables and user data are stored and processed in the CPU + byte order. +*/ + +/* Do one round */ +#define Round(lw,rw) \ + movl rw, %edx; \ + shrl $24, %edx; \ + movl PosS0(%edi,%edx,4), %eax; \ + movl rw, %edx; \ + shrl $16, %edx; \ + andl $0xFF, %edx; \ + addl PosS1(%edi,%edx,4), %eax; \ + movl rw, %edx; \ + shrl $8, %edx; \ + andl $0xFF, %edx; \ + xorl PosS2(%edi,%edx,4), %eax; \ + movl rw, %edx; \ + andl $0xFF, %edx; \ + addl PosS3(%edi,%edx,4), %eax; \ + xorl %eax, lw; \ + lodsl; \ + xorl %eax, lw + +/* Words in %ebx, %ecx - Key in %edi - P-index in %esi - result swapped */ +blowfish: + lodsl + xorl %eax, %ebx + Round(%ecx,%ebx); Round(%ebx,%ecx) + Round(%ecx,%ebx); Round(%ebx,%ecx) + Round(%ecx,%ebx); Round(%ebx,%ecx) + Round(%ecx,%ebx); Round(%ebx,%ecx) + Round(%ecx,%ebx); Round(%ebx,%ecx) + Round(%ecx,%ebx); Round(%ebx,%ecx) + Round(%ecx,%ebx); Round(%ebx,%ecx) + Round(%ecx,%ebx); Round(%ebx,%ecx) + lodsl + xorl %eax, %ecx + ret + +/* + void Blowfish_Encrypt(Blowfish_Data dataIn, Blowfish_Data dataOut, + Blowfish_Key key); +*/ + +ENTRY(Blowfish_Encrypt) + pushl %ebx + pushl %ebp + pushl %esi + pushl %edi +#define SAVE 16 /* no. of bytes the saved registers occupy */ +/* arguments relative to %esp */ +#define dataIn SAVE+4 +#define dataOut SAVE+8 +#define key SAVE+12 + + movl dataIn(%esp), %esi + movl (%esi), %ebx + movl 4(%esi), %ecx + movl key(%esp), %edi + movl %edi, %esi + cld + call blowfish + movl dataOut(%esp), %edi + movl %ebx, 4(%edi) + movl %ecx, (%edi) + popl %edi + popl %esi + popl %ebp + popl %ebx + ret +#undef dataIn +#undef dataOut +#undef key + +/* + void Blowfish_Decrypt(Blowfish_Data dataIn, Blowfish_Data dataOut, + Blowfish_Key key); +*/ + +ENTRY(Blowfish_Decrypt) + pushl %ebx + pushl %ebp + pushl %esi + pushl %edi +#define SAVE 16 /* no. of bytes the saved registers occupy */ +/* arguments relative to %esp */ +#define dataIn SAVE+4 +#define dataOut SAVE+8 +#define key SAVE+12 + + movl dataIn(%esp), %esi + movl (%esi), %ebx + movl 4(%esi), %ecx + movl key(%esp), %edi + movl %edi, %esi + leal PosP17(%edi), %esi + std + call blowfish + movl dataOut(%esp), %edi + movl %ebx, 4(%edi) + movl %ecx, (%edi) + popl %edi + popl %esi + popl %ebp + popl %ebx + ret +#undef dataIn +#undef dataOut +#undef key + +/* load byte from key, start over if exhausted */ +#define lodsbw(base,len) \ + lodsb; \ + decl %ecx; \ + cmpl $0, %ecx; \ + jg 1f; \ + movl base, %esi; \ + movl len, %ecx; \ +1: + +/* + void Blowfish_ExpandUserKey(Blowfish_UserKey userKey, int userKeyLen, + Blowfish_Key key); +*/ + +ENTRY(Blowfish_ExpandUserKey) + pushl %ebx + pushl %ebp + pushl %esi + pushl %edi +#define SAVE 16 /* no. of bytes the saved registers occupy */ +/* arguments relative to %esp */ +#define userKey SAVE+4 +#define userKeyLen SAVE+8 +#define key SAVE+12 + + /* Copy the init vector into key */ + leal bftab0, %esi + movl key(%esp), %edi + movl $KeyLenL, %ecx + cld + rep; movsl + /* XOR the user key into the P table */ + movl key(%esp), %edi + movl $18, %ebp + movl userKey(%esp), %esi + movl userKeyLen(%esp), %ecx +ukx: + /* process one 32-bit word swapped */ + lodsbw(userKey(%esp), userKeyLen(%esp)) + shll $8, %eax + lodsbw(userKey(%esp), userKeyLen(%esp)) + shll $8, %eax + lodsbw(userKey(%esp), userKeyLen(%esp)) + shll $8, %eax + lodsbw(userKey(%esp), userKeyLen(%esp)) + xorl %eax, (%edi) + addl $4, %edi + decl %ebp + cmpl $0, %ebp + jg ukx + + /* Now do the repeated encryption process */ + xorl %ebx, %ebx + xorl %ecx, %ecx + movl $KeyLenB, %ebp + movl key(%esp), %edi +ukb: + pushl %edi + movl key+4(%esp), %edi + movl %edi, %esi + call blowfish + popl %edi + xchgl %ebx, %ecx + movl %ebx, (%edi) + movl %ecx, 4(%edi) + addl $8, %edi + decl %ebp + cmpl $0, %ebp + jg ukb + + popl %edi + popl %esi + popl %ebp + popl %ebx + ret +#undef dataIn +#undef dataOut +#undef key + +/* The initialization key. According to Schneier, this is not a magic + pattern but simply the first 33344 (after point) bits of "pi". */ + +.align 4 +bftab0: +/* The eighteen P boxes @ 1 word */ +.long 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344 +.long 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89 +.long 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c +.long 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917 +.long 0x9216d5d9, 0x8979fb1b +/* The four S boxes @ 256 words */ +.long 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7 +.long 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99 +.long 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16 +.long 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e +.long 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee +.long 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013 +.long 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef +.long 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e +.long 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60 +.long 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440 +.long 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce +.long 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a +.long 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e +.long 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677 +.long 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193 +.long 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032 +.long 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88 +.long 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239 +.long 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e +.long 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0 +.long 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3 +.long 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98 +.long 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88 +.long 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe +.long 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6 +.long 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d +.long 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b +.long 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7 +.long 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba +.long 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463 +.long 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f +.long 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09 +.long 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3 +.long 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb +.long 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279 +.long 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8 +.long 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab +.long 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82 +.long 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db +.long 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573 +.long 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0 +.long 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b +.long 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790 +.long 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8 +.long 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4 +.long 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0 +.long 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7 +.long 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c +.long 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad +.long 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1 +.long 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299 +.long 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9 +.long 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477 +.long 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf +.long 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49 +.long 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af +.long 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa +.long 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5 +.long 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41 +.long 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915 +.long 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400 +.long 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915 +.long 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664 +.long 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a +.long 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623 +.long 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266 +.long 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1 +.long 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e +.long 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6 +.long 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1 +.long 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e +.long 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1 +.long 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737 +.long 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8 +.long 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff +.long 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd +.long 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701 +.long 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7 +.long 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41 +.long 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331 +.long 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf +.long 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af +.long 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e +.long 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87 +.long 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c +.long 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2 +.long 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16 +.long 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd +.long 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b +.long 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509 +.long 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e +.long 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3 +.long 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f +.long 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a +.long 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4 +.long 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960 +.long 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66 +.long 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28 +.long 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802 +.long 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84 +.long 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510 +.long 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf +.long 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14 +.long 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e +.long 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50 +.long 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7 +.long 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8 +.long 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281 +.long 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99 +.long 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696 +.long 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128 +.long 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73 +.long 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0 +.long 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0 +.long 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105 +.long 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250 +.long 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3 +.long 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285 +.long 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00 +.long 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061 +.long 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb +.long 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e +.long 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735 +.long 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc +.long 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9 +.long 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340 +.long 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20 +.long 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 +.long 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934 +.long 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068 +.long 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af +.long 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840 +.long 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45 +.long 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504 +.long 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a +.long 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb +.long 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee +.long 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6 +.long 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42 +.long 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b +.long 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2 +.long 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb +.long 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527 +.long 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b +.long 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33 +.long 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c +.long 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3 +.long 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc +.long 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17 +.long 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564 +.long 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b +.long 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115 +.long 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922 +.long 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728 +.long 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0 +.long 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e +.long 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37 +.long 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d +.long 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804 +.long 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b +.long 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3 +.long 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb +.long 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d +.long 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c +.long 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350 +.long 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9 +.long 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a +.long 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe +.long 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d +.long 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc +.long 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f +.long 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61 +.long 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2 +.long 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9 +.long 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2 +.long 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c +.long 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e +.long 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633 +.long 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10 +.long 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169 +.long 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52 +.long 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027 +.long 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5 +.long 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62 +.long 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634 +.long 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76 +.long 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24 +.long 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc +.long 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4 +.long 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c +.long 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837 +.long 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 +.long 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b +.long 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe +.long 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b +.long 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4 +.long 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8 +.long 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6 +.long 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304 +.long 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22 +.long 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4 +.long 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6 +.long 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9 +.long 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59 +.long 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593 +.long 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51 +.long 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28 +.long 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c +.long 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b +.long 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28 +.long 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c +.long 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd +.long 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a +.long 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319 +.long 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb +.long 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f +.long 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991 +.long 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32 +.long 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680 +.long 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166 +.long 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae +.long 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb +.long 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5 +.long 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47 +.long 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370 +.long 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d +.long 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84 +.long 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048 +.long 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8 +.long 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd +.long 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9 +.long 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7 +.long 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38 +.long 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f +.long 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c +.long 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525 +.long 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1 +.long 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442 +.long 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964 +.long 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e +.long 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8 +.long 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d +.long 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f +.long 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299 +.long 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02 +.long 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc +.long 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614 +.long 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a +.long 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6 +.long 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b +.long 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0 +.long 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060 +.long 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e +.long 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9 +.long 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f +.long 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + +#endif /* ASM_BF_Crypt */ diff -urN lin.2.2.17/net/cipe/bf.h int.2.2.17.x/net/cipe/bf.h --- lin.2.2.17/net/cipe/bf.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/bf.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,20 @@ + +/* The data block processed by the encryption algorithm - 64 bits */ +typedef unsigned long Blowfish_Data[2]; +/* The key as entered by the user - size may vary */ +typedef char Blowfish_UserKey[16]; +/* The expanded key for internal use - 18+4*256 words*/ +typedef unsigned long Blowfish_Key[1042]; + +#ifdef Strict_Type_Check +extern void Blowfish_Encrypt(Blowfish_Data dataIn, Blowfish_Data dataOut, + Blowfish_Key key); +extern void Blowfish_Decrypt(Blowfish_Data dataIn, Blowfish_Data dataOut, + Blowfish_Key key); +extern void Blowfish_ExpandUserKey(Blowfish_UserKey userKey, int userKeyLen, + Blowfish_Key key); +#else +extern void Blowfish_Encrypt(void *dataIn, void *dataOut, void *key); +extern void Blowfish_Decrypt(void *dataIn, void *dataOut, void *key); +extern void Blowfish_ExpandUserKey(void *userKey, int userKeyLen, void *key); +#endif diff -urN lin.2.2.17/net/cipe/cipe.h int.2.2.17.x/net/cipe/cipe.h --- lin.2.2.17/net/cipe/cipe.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/cipe.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,303 @@ +/* + CIPE - encrypted IP over UDP tunneling + + cipe.h - contains definitions, includes etc. common to all modules + + Copyright 1996 Olaf Titz <olaf@bigred.inka.de> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ +/* $Id: cipe.h,v 1.19.2.1 1999/04/27 21:53:21 olaf Exp $ */ + +#ifndef _CIPE_H_ +#define _CIPE_H_ + +#include "crypto.h" + + +/*** The kernel/user IOCTL interface ***/ + +/* ioctls for setup and key exchange */ +/* #define SIOCxIFCIPxxx (SIOCDEVPRIVATE+x) */ +/* All ioctls are passed a struct ifreq <net/if.h> which contains the + device name in ifr_name and a pointer to the actual control struct + in ifr_data. */ + +/* Get interface parameters. */ +#define SIOCGIFCIPPAR (SIOCDEVPRIVATE+0) +struct siocgifcippar { + unsigned long magic; + /* SOCKS5 relayer */ + unsigned long sockshost; + unsigned short socksport; + /* Timeouts (in seconds) */ + int tmo_keyxchg; + int tmo_keylife; + /* Flags */ + int mayclear; + int cttl; +}; + +/* Set interface parameters. */ +#define SIOCSIFCIPPAR (SIOCDEVPRIVATE+1) +struct siocsifcippar { + unsigned long magic; + /* SOCKS5 relayer */ + unsigned long sockshost; + unsigned short socksport; + /* Timeouts (in seconds) */ + int tmo_keyxchg; + int tmo_keylife; + /* Flags */ + int mayclear; + int cttl; +}; + +/* Set a key. */ +#define SIOCSIFCIPKEY (SIOCDEVPRIVATE+2) +#define KEY_STATIC 1 +#define KEY_SEND 2 +#define KEY_RECV 3 +#define KEY_INVAL 8 +struct siocsifcipkey { + unsigned long magic; + int which; + UserKey thekey; +}; + +/* Attach a socket. */ +#define SIOCSIFCIPATT (SIOCDEVPRIVATE+3) +struct siocsifcipatt { + unsigned long magic; + int fd; +}; + +/* Allocate/deallocate a device. */ +#define SIOCSIFCIPALL (SIOCDEVPRIVATE+4) +#define SIOCSIFCIPUNA (SIOCDEVPRIVATE+5) +struct siocsifcipall { + unsigned long magic; + int num; + char name[16]; +}; + + +/*** Key exchange related definitions ***/ + +/* Minimum kxc block. */ +#define KEYXCHGBLKMIN 64 +/* Maximum kxc block, padded with random bytes */ +#define KEYXCHGBLKMAX (KEYXCHGBLKMIN+256) +/* Position of the timestamp */ +#define KEYXCHGTSPOS 56 +/* Type words. Only 4 are possible. */ +#define TW_DATA 0 +#define TW_NEWKEY 2 +#define TW_CTRL 4 +#define TW_RSVD2 6 +/* error indication, no valid type word */ +#define TW_ERROR 1 + +/* NEWKEY (key exchange mode 1) subtypes. */ +#define NK_RREQ 0 /* not used in protocol */ +#define NK_REQ 1 /* send me your new key */ +#define NK_IND 2 /* this is my new key */ +#define NK_ACK 3 /* i have your new key */ + +/* CTRL subtypes. By now sent in a TW_NEWKEY packet. */ +#define CT_DUMMY 0x70 /* ignore */ +#define CT_DEBUG 0x71 /* log */ +#define CT_PING 0x72 /* send PONG */ +#define CT_PONG 0x73 +#define CT_KILL 0x74 /* exit */ + +/*** Kernel-module internal stuff ***/ + +#ifdef __KERNEL__ + +#include <asm/byteorder.h> +#include <linux/types.h> +#include <linux/netdevice.h> +#include <linux/sockios.h> +#include <linux/sched.h> +#include <linux/if_ether.h> +#include <linux/net.h> +#include <linux/ip.h> +#include <linux/udp.h> +#include <net/sock.h> +#include <linux/version.h> +#ifndef KERNEL_VERSION +#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) +#endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0) +#define LINUX_21 +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,127) +#define timeout_t unsigned long +#else +#define timeout_t long +#endif + +/* The header we add to each packet */ +#ifdef VER_SHORT +#define cipehdrlen (sizeof(struct iphdr)+sizeof(struct udphdr)) +#else +#define cipehdrlen (sizeof(struct iphdr)+sizeof(struct udphdr)+blockSize) +#endif +/* ...plus a real hardware header (common case) */ +#define cipexhdrl (cipehdrlen+((ETH_HLEN+15)&~15)) +/* max. padding at the end */ +#if ProtocolVersion == 3 +#define cipefootlen 12 /* 7 bytes pad, 1 byte type, 4 bytes CRC */ +#else +#define cipefootlen 10 /* 8 bytes pad, 2 bytes CRC */ +#endif + +/* A CIPE device's parameter block */ + +#define CIPE_MAGIC (htonl(0x43495045)) +struct cipe { + __u32 magic; + struct device *dev; + /* Set by user process */ + __u32 peeraddr; + __u32 myaddr; + __u16 peerport; + __u16 myport; + __u32 sockshost; + __u16 socksport; + short cttl; +#ifdef Crypto_IDEA + Key key_e, key_d, skey_e, rkey_d; +#endif +#ifdef Crypto_Blowfish + Key key, skey, rkey; + #define key_e key + #define key_d key + #define skey_e skey + #define rkey_d rkey +#endif + unsigned long tmo_keyxchg; + unsigned long tmo_keylife; + /* Internal */ + unsigned long timekx; + unsigned long timeskey; + unsigned long timerkey; + int cntskey; + int cntrkey; + struct sock *sock; + /* Flags */ + char mayclear; + char havekey; + char haveskey; + char haverkey; +#ifdef LINUX_21 + char recursion; +#endif + pid_t owner; + /* Statistics */ +#ifdef LINUX_21 + struct net_device_stats stat; +#else + struct enet_statistics stat; +#endif + /* Socket interface stuff */ + struct proto *udp_prot; + struct proto cipe_proto; +}; + +#define MAXBLKS 32767 /* max # blocks to encrypt using one key */ + +/* Define, init and check a struct cipe * variable. */ +#define DEVTOCIPE(dev,c,err) \ + struct cipe *c = (struct cipe*)(dev->priv); \ + if (!c || c->magic!=CIPE_MAGIC) return err; + +/* Master control struct */ +struct cipe_ctrl { + char name[16]; + struct cipe cipe; + struct device dev; +}; + +extern struct cipe_ctrl **cipe_ctrls; +extern int cipe_maxdev; + +/* SOCKS5 encapsulation header */ +struct sockshdr { + char rsv[2]; + char frag; + char atyp; + __u32 dstaddr __attribute__((packed)); + __u16 dstport __attribute__((packed)); +}; + +#ifdef DEBUG +extern int cipe_debug; +#define DEB_CALL 1 +#define DEB_INP 2 +#define DEB_OUT 4 +#define DEB_CRYPT 8 +#define DEB_KXC 16 +#define DEB_PKIN 32 +#define DEB_PKOU 32 +#define dprintk(l,p) if(cipe_debug&l){printk p;} +#define dprintk1(l,s,f,a) if(cipe_debug&l){printk(s f,a);} +#define dprintk2(l,s,f,a,b) if(cipe_debug&l){printk(s f,a,b);} +#define dprintk3(l,s,f,a,b,c) if(cipe_debug&l){printk(s f,a,b,c);} +#define dprintk4(l,s,f,a,b,c,d) if(cipe_debug&l){printk(s f,a,b,c,d);} +#define dprintk5(l,s,f,a,b,c,d,e) if(cipe_debug&l){printk(s f,a,b,c,d,e);} +#else +#define dprintk(l,p) +#define dprintk1(l,s,f,a) +#define dprintk2(l,s,f,a,b) +#define dprintk3(l,s,f,a,b,c) +#define dprintk4(l,s,f,a,b,c,d) +#define dprintk5(l,s,f,a,b,c,d,e) +#endif /* DEBUG */ + +/* internal routines */ +/* module.c */ +extern void cipe_use_module(void); +extern void cipe_unuse_module(void); +/* device.c */ +extern void cipe_prnpad(unsigned char *buf, int len); +extern void cipe_close(struct cipe *c); +/* sock.c */ +extern int cipe_attach(struct device *dev, struct siocsifcipatt *parm); +void cipe_fakenkey(struct cipe *c, char typ); +/* output.c */ +#ifdef DEBUG +void cipe_dump_packet(char *title, struct sk_buff *skb); +#endif +extern int cipe_xmit(struct sk_buff *skb, struct device *dev); +/* encaps.c */ +extern void cipe_encrypt(struct cipe *c, unsigned char *buf, + int *len, int typcode); +extern unsigned short cipe_decrypt(struct cipe *c, unsigned char *buf, + int *len); +#ifndef VER_SHORT +void cipe_cryptpad(unsigned char *buf); +#endif + +#endif /* __KERNEL__ */ + +#ifdef VER_CRC32 +/* crc32.c */ +extern unsigned long crc32(const unsigned char *s, unsigned int len); +#else +/* crc.c */ +extern unsigned short block_crc(unsigned char *d, int len); +#endif + +#define MIN(a,b) (((a)<(b))?(a):(b)) + +#ifndef DEVNAME +#define DEVNAME "cip" VERNAME CRNAME +#endif + +#endif _CIPE_H_ diff -urN lin.2.2.17/net/cipe/cipe.info int.2.2.17.x/net/cipe/cipe.info --- lin.2.2.17/net/cipe/cipe.info Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/cipe.info Sat Oct 14 00:48:17 2000 @@ -0,0 +1,1204 @@ +This is Info file cipe.info, produced by Makeinfo version 1.68 from the +input file cipe.texinfo. + + +File: cipe.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir) + +CIPE +**** + +CIPE (the name is shortened from *Crypto IP Encapsulation*) is a +package for an encrypting IP tunnel device. This can be used to build +encrypting routers for VPN (Virtual Private Networks) and similar +applications. + + Copyright (C) 1996--1998 Olaf Titz. All rights reserved. + + This program including its documentation is free software; you can + redistribute it and/or modify it under the terms of the GNU General + Public License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The author can be contacted through the electronic mail address + <Olaf.Titz@inka.de>. + +* Menu: + +* Introduction:: About routing, VPNs and encryption. +* Installation:: Installing the CIPE software package. +* Configuration:: Configuration. +* Examples:: Examples of CIPE configurations. +* Protocol:: Description of the protocol used. +* Misc:: Odds and ends. +* Concept Index:: Index. + + -- The Detailed Node Listing -- + +Introduction + +* Network layers:: Where encryption takes place. +* Routing:: About IP routing and VPNs. +* How CIPE works:: The encapsulation method employed here. +* Components:: Which pieces of software CIPE consists of. +* Internals:: A look under the hood of CIPE. + +Installing the CIPE software package + +* Prerequisites:: What you need before installing. +* Advanced compiling:: Compile configuration for special needs. +* Install:: Compiling and installing the software. +* Run:: Running the software. + +Running CIPE + +* Program Names:: How the components of CIPE are named. +* insmod:: Loading the kernel module. +* ciped:: Running the daemon. + +Configuration of the CIPE software + +* Specifying options:: How CIPE gets its parameters. +* Parameter list:: All valid and needed parameters. +* SOCKS:: Routing with CIPE over a SOCKS5 relayer. +* Error handling:: How ciped deals with errors. + +Usage examples + +* Tips:: General useful tips on CIPE configuration. +* Example 1:: The classic VPN setups. + +`$Id: cipe.texinfo,v 1.6.2.3 1999/06/14 21:09:21 olaf Exp $' + + +File: cipe.info, Node: Introduction, Next: Installation, Prev: Top, Up: Top + +Introduction +************ + +* Menu: + +* Network layers:: Where encryption takes place. +* Routing:: About IP routing and VPNs. +* How CIPE works:: The encapsulation method employed here. +* Components:: Which pieces of software CIPE consists of. +* Internals:: A look under the hood of CIPE. + + +File: cipe.info, Node: Network layers, Next: Routing, Prev: Introduction, Up: Introduction + +Network layers and encryption +============================= + +There are several different places where encryption can be built into +an existing network infrastructure, corresponding to the different +protocol layers: + + 1. On the "network level": Packets travelling between hosts on the + network are encrypted. The encryption engine is placed near the + driver which sends and receives packets. An implementation is + found in CIPE. + + 2. On the "socket level": A logical connection between programs + running on different hosts (TCP connection; transport or session + layer in OSI) is encrypted. The encryption engine intercepts or + proxies connections. SSH and SSL work this way. + + 3. On the "application level": Applications contain their own + encryption engine and encrypt data themselves. The best known + example is PGP for encrypting mail. + +Low-level encryption as implemented with CIPE has the advantage that it +can be made to work transparently, without any change to application +software. In the case of encrypting IP packets, it can be built into IP +routers which usually act as "black boxes" that only route traffic +between hosts, the hosts themselves don't see at all how the routing +works. So an "encrypting router" looks exactly like a non-encrypting +one, without any difference seen by other hosts and applications. It +can thus be used in places where software changes at higher levels are +not feasible. + +Low-level encryption has the disadvantage that it does not guard against +intruders on a higher level, e.g. Trojaned applications, bug exploits +in system software or rogue administrators "sniffing" on terminal +devices. + + +File: cipe.info, Node: Routing, Next: How CIPE works, Prev: Network layers, Up: Introduction + +IP routing and Virtual Private Networks +======================================= + +A "virtual private network" (VPN for short) is a network (1) belonging +to one organization, using its own address range, but overlayed on +existing network infrastructure. "IP-in-IP tunneling" makes it +possible to build IP-based VPNs on top of other IP-based "carrier +networks", such as the Internet. "Encrypted tunneling" guards against +passive (sniffing) and active (faked message injection) attacks on the +carrier network. The carrier network sees only encrypted data. + +Depending on the choice of protocol, all information the original +packets carry can be encrypted. This includes not only the actual +(payload) data but also the TCP/IP headers, leaving no trace as to +which addresses and services are actually used. "Traffic analysis" +attacks, which attempt to gain useful information out of sniffing by +"who contacts whom", are thus made unfeasible. An even more +sophisticated technique to thwart traffic analysis employs the +injection of dummy packets into the network which carry no useful +information at all but are (at the carrier level) indistinguishable +from real data packets. + +IP routing in a VPN situation consists of the routing of the carrier +network, which in most situations is just a standard Internet setup, +and routing of the overlayed VPN. This is easiest when the address +ranges of carrier and VPN do not overlap in any way. It is common for +VPNs to use the 10.0.0.0/8 and 192.168.0.0/16 address ranges, which are +not part of the Internet and thus do never conflict with actual +Internet routing: any address in this range must be local to the +organization using it. *Note Example 1::, for a typical example. + +The IPSEC standards define a set of protocols which can be used (among +other things) to build encrypted VPNs. However, IPSEC is a rather +heavyweight and complicated protocol set with a lot of options, +implementations of the full protocol set are still rarely used and some +issues (such as key management) are still not fully resolved. CIPE +uses a simpler approach, in which many things which can be +parameterized (such as the choice of the actual encryption algorithm +used) are an install-time fixed choice. This limits flexibility but +allows for a simple (and therefore efficient, easy to debug...) +implementation. + +---------- Footnotes ---------- + +(1) As CIPE is an IP routing application, this manual talks only about +IP-based networks. + + +File: cipe.info, Node: How CIPE works, Next: Components, Prev: Routing, Up: Introduction + +How CIPE works +============== + +CIPE encapsulates encrypted IP datagrams in UDP datagrams and sends +them via the normal UDP mechanism. This is different from standard +IPIP encapsulation. UDP was chosen because this way many different +endpoints can easily be distinguished by port numbers; because an IP +protocol number would warrant a formal registration; and because +handling of UDP datagrams is easier than using a separate IP protocol +number, especially in firewalled setups. Specifically, UDP can be +handled by user-level applications such as a SOCKS5 relayer. *Note +SOCKS::. + +A CIPE "link" always connects exactly two endpoints. In many ways, the +link works like a PPP dial-up link. At present, each link has its own +secret 128-bit key which has to be known by both ends (and nobody +else). This "link key" (called "static key" in the protocol +description) is used to negotiate a frequently changed "dynamic key", +which encrypts the actual data. + +It is planned that future versions of CIPE will negotiate their keys +via a "public key" mechanism, similar to the SSH package. This would +remove the need for shared secret keys. + + +File: cipe.info, Node: Components, Next: Internals, Prev: How CIPE works, Up: Introduction + +CIPEs software components +========================= + +The CIPE package consists of a kernel module and a driver program. The +kernel module does the IP packet handling: sending and receiving +packets, encapsulation including encryption. It implements a "network +device" which is mostly handled like any other network device. +Configuration and the whole key exchange process is done by the user +level program `ciped'. *Note Program Names:: + +`ciped' looks and behaves rather similar to `pppd'. In particular, +opening and closing a CIPE device is tied to starting and ending a +`ciped' process (one per device), the specification of options to the +daemon mimics `pppd''s setup and `ciped' invokes scripts on opening and +closing a device. + + +File: cipe.info, Node: Internals, Prev: Components, Up: Introduction + +Notes on internals +================== + +(This section is only relevant to readers who want to understand the +source, not to the regular user.) + +The module consists of an output driver, an input driver, the +encapsulation routines and some stuff to keep it all together. The +output driver is largely an adapted version of `new_tunnel' from the +Linux distribution. (1) In Linux 2.0 its actual packet sending is done +via the kernel IP forwarding engine. This implies that (a) forwarding +must be enabled in the kernel and (b) the encrypted packets, being UDP +packets with the source/dest addresses given as "me" and "peer", are +checked against the forwarding (as well as the output) firewall. (If it +doesn't work for you, first make sure that your firewall rules let the +packets pass!) + +The input driver is an adaptation from the kernel UDP receiver. To +activate it, ciped has to set a socket into a special mode with an +`ioctl' call. This has to be a connected UDP socket. The +`ioctl_attach(2cipe)' call replaces the socket's `sendto(2)' and +`recvfrom(2)' operations with special versions that do decryption of +traffic internally and only pass key exchange blocks to the user layer. +The whole work of decrypting and rerouting incoming traffic is done +inside a blocking `recvfrom(2)'. This means that unlike normal IP +forwarding, it is called from user mode and the needed CPU time is +charged to the ciped process, although the data never passes into user +mode. `sendto(2)' encodes the block as a key exchange block and sends +it to the peer. The socket should not use `read(2)', `write(2)', +`select(2)' or nonblocking mode (yet). + +Before attaching the socket, the operational parameters of the device +have to be set using a `ioctl_setpar(2cipe)' call. The key exchange +process supplies keys to the kernel via `ioctl_setkey(2cipe)'. + +The netdevice can only be opened (configured "UP") if it has a +controlling socket. When the controlling socket is closed, the netdevice +gets closed. Conversely, closing the netdevice (with `ifconfig(8)') +closes the socket too. Closing deletes all information that is set by +ciped on the device. + +---------- Footnotes ---------- + +(1) For Linux 2.2, this has been merged into the `ipip' module, but the +functionality is the same. + + +File: cipe.info, Node: Installation, Next: Configuration, Prev: Introduction, Up: Top + +Installing the CIPE software package +************************************ + +The CIPE software package is available via +`http://sites.inka.de/~bigred/devel/cipe.html'. It is distributed in a +`tar.gz' file, currently about 88k in size. After unpacking the +distribution, run the `configure' script, possibly specifying options +there. Then run `make'. + +* Menu: + +* Prerequisites:: What you need before installing. +* Advanced compiling:: Configuring the compile for different targets. +* Install:: Compiling and installing the software. +* Run:: Running the software. + + +File: cipe.info, Node: Prerequisites, Next: Advanced compiling, Prev: Installation, Up: Installation + +Prerequisites +============= + +CIPE runs under Linux 2.0.* since 2.0.12, 2.1.* since about 2.1.103, +and 2.2.*. It was developed for the i386 architecture; other +architectures *should* work, but only with the IDEA algorithm (no C +version of Blowfish included by now). + +Make sure you have the source, or at least the complete include tree, +of the running kernel installed (usually in `/usr/src/linux'). The +version *and configuration* of the kernel sources must match the kernel +on which it will run exactly, or else you risk building a module which +crashes. After reconfiguring and rebuilding the kernel, don't forget to +rebuild the CIPE module too. (This applies to all externally compiled +modules.) Enabling "versioned symbols" on the kernel is strongly +recommended, because it protects against version skew between kernel +and modules. + +The kernel needs "IP Forwarding/Gatewaying" enabled in the configuration +for 2.0 kernels. Make sure to enable IP forwarding with `echo 1 > +/proc/sys/net/ipv4/ip_forward' on system boot with 2.2 and recent 2.0 +kernels. It needs the `urandom' device available. + +A suited version of the module utilities (`modprobe' and friends) needs +to be installed. When in doubt, consult the documentation in the kernel +source. + +As of version 1.3, CIPE uses an autoconf-generated configure script to +configure its Makefiles. This script takes the following parameters on +the command line. All of the parameters have defaults which should +suffice for a simple installation. +`--with-linux=dir' + Path to the Linux source tree (e.g., `/usr/src/linux'). + +`--with-linux-include=dir' + Path to the Linux include tree, if you don't have the complete + source. + +`--enable-protocol=n' + Use encapsulation protocol `n'. Currently the only supported value + is 3. + +`--enable-idea' + Use the IDEA cipher (default is Blowfish). + +`--disable-debug' + Disable debugging code in kernel module. Not really useful. + +`--disable-dyndev' + Disable dynamic device allocation. Not really useful. + +`--enable-logfacility=x' + Set syslog facility for ciped (default is LOG_DAEMON). + +`--disable-asm' + Disable use of assembler code. Not really useful. + +The script then looks for certain parameters (like whether compiling for +an SMP system) in the kernel headers, and it creates a new directory +named like `2.2.6-i386-cb' in which compilation will take place. (This +would be for Linux 2.2.6 on i386, protocol 3 [the "c"], Blowfish [the +"b"].) + + +File: cipe.info, Node: Advanced compiling, Next: Install, Prev: Prerequisites, Up: Installation + +Advanced compiling +================== + +The use of a separate object directory means it is possible to compile +CIPE for separate targets in the same directory. An example would be a +machine running different kernels for testing, etc. In that case you +would have kernel directories like `/usr/src/linux-2.0.36', +`/usr/src/linux-2.2.6', and so on. Running `configure +--with-linux=/usr/src/linux-2.0.36' and after that `configure +--with-linux=/usr/src/linux-2.2.6' leaves two directories +`2.0.36-i386-cb' and `2.2.6-i386-cb'. You can run `make' *in each of +the object directories* separately. + +Another common case is a setup where one central box compiles kernels +for different machines. You can rename CIPE's compilation directories +after the configure run, perhaps name them after the target machine: + ./configure --with-linux=/usr/src/linux-2.2.6-bigbox + mv 2.2.6-i386-cb 2.2.6-bigbox + (cd 2.2.6-bigbox; touch Makefile; make) + ./configure --with-linux=/usr/src/linux-2.2.6-satellite + mv 2.2.6-i386-cb 2.2.6-satellite + (cd 2.2.6-satellite; touch Makefile; make) + ./configure --with-linux=/usr/src/linux-2.0.36-laptop + mv 2.0.36-i386-cb 2.0.36-laptop + (cd 2.0.36-laptop; touch Makefile; make) + +(The touch is to avoid a recheck of the configure script. Perhaps the +rule for that in the Makefile should be removed.) + +In the same way distribution maintainers could prepare a set of +differently configured CIPE modules (IDEA vs. Blowfish) for one target. +The names of the module and driver are chosen so that different +configurations can coexist on one target, *Note Program Names::. + +Note that real cross-compilation is not possible for now, because the +configure script always assumes the CPU architecture of the system where +it runs. + + +File: cipe.info, Node: Install, Next: Run, Prev: Advanced compiling, Up: Installation + +Installation +============ + +A simple `make' command compiles everything. Compiler warnings should +not occur. Do `make install' as *root* to install the software +components in their final location. These are a kernel module, named +according to the protocol version and encryption algorithm selected, +and the driver program, which is (as of CIPE 1.3) also named after the +protocol version and encryption algorithm. *Note Program Names:: The +Makefiles accept the semi-standard options `BINDIR, MODDIR, INFODIR' to +specify where the stuff gets installed. + +You need to create a directory `/etc/cipe' which contains at least two +files, `options' and `ip-up'. You can copy the files from the `samples' +directory in the distribution here, and edit them to suit your needs. +*Note Configuration::. + +If Compiling doesn't work: + +There is a known problem in that the various 2.0.30 and 2.0.31 +pre-releases disagree on whether they have a certain feature +(`SO_BINDTODEVICE'), and detecting this version dependency via the +version number is not foolproof. Apparently, since 2.0.32, this problem +is resolved. If `output.c' doesn't compile, change the line + #ifdef SO_BINDTODEVICE +to `#if 1' or `#if 0' as needed. + + +File: cipe.info, Node: Run, Prev: Install, Up: Installation + +Running CIPE +============ + +Once installed, the CIPE software is run by loading the module and +running the `ciped' daemon. + +* Menu: + +* Program Names:: How the components of CIPE are named. +* insmod:: Loading the kernel module. +* ciped:: Running the daemon. + + +File: cipe.info, Node: Program Names, Next: insmod, Prev: Run, Up: Run + +Program Names +------------- + +The module name is `cip' followed by the protocol version as a letter +and the first letter of the encryption algorithm. E.g. `cipcb' for +version 3 (i.e. "c"), Blowfish (the default). The device names which +this module manages are the module name followed by a number, e.g. +`cipcb0'. + +Since CIPE 1.3, the daemon program is named `ciped-' followed by the +protocol and encryption letters, likewise. E.g. `ciped-cb'. Where this +manual refers to `ciped', assume the real name as given here. + +The configuration parameters of kernel module and daemon must match (the +module checks this), but the daemon does not depend (at least not in +theory) on the kernel version. The naming scheme is chosen so that all +possible modules and daemons on one machine can coexist. + + +File: cipe.info, Node: insmod, Next: ciped, Prev: Program Names, Up: Run + +Loading the module +------------------ + +The kernel module is loaded into the kernel via the command + modprobe modulename parameter=value... + +The CIPE module accepts the following additional parameters: +`cipe_debug=(number)' + Set the debugging level. The file `cipe.h' defines different + debugging levels which are ORed. Set this to 0 if you don't need + debugging output. Debugging output is emitted via kernel messages, + which means it usually winds up in the syslog somewhere. + +`cipe_maxdev=(number)' + Set the number of channels this module manages. E.g. with + `cipe_maxdev=4' the devices `cip3b0' through `cip3b3' are + available. Maximum is 99. Since CIPE 1.2, there is no need to set + this, since channels are allocated dynamically. + +The module can be autoloaded via `kerneld'/`kmod'. Advanced users will +recognize the following options in `/etc/conf.modules' necessary to +make it work correctly: + alias cipcb0 cipcb + alias cipcb1 cipcb + options cipcb cipe_debug=0 + + +File: cipe.info, Node: ciped, Prev: insmod, Up: Run + +Running the `ciped' daemon +-------------------------- + +The `ciped' daemon must be run as "root". (*Do not* make it setuid.) It +takes as command line arguments an optional `-o file' parameter +specifying an options file followed by any number of individual option +arguments. *Note Specifying options::. + +Except in debugging mode, the daemon puts itself in the background and +uses `syslog(3)' for logging messages. Normal operation causes no log +messages except for errors and a notice when the daemon terminates. + +Shutting down (with `ifconfig(8)') a CIPE device terminates its `ciped' +process, and vice-versa terminating a `ciped' closes the device. When a +device is closed, its configuration parameters including all keys and +statistics are erased. (This is different from earlier CIPE versions!) +`ciped' does not keep any keys in memory. + +When the device comes up, `ciped' spawns `/etc/cipe/ip-up' with the +parameters described in the sample version. It waits for completion of +this script before data can be sent over the device and before it goes +into the background. The script is called with standard input, output +and error to `/dev/null'. It typically sets routes and does some +logging. Likewise, when a CIPE device goes down, `/etc/cipe/ip-down' is +invoked. `ciped' logs the interface statistics when closing. + +`ciped' will terminate when an error occurs. This includes a +"connection refused" message from the peer, to be able to detect +non-working peers. This default error handling implies that no data may +be sent over a link unless *both* ends are up and running, or the first +one to come up will go down again immediately. In particular, the +"ping" command in the sample `ip-up' should not be activated on both +ends of a link. This behaviour can be customized. *Note Error +handling::, for more details. + + +File: cipe.info, Node: Configuration, Next: Examples, Prev: Installation, Up: Top + +Configuration of the CIPE software +********************************** + +* Menu: + +* Specifying options:: How CIPE gets its parameters. +* Parameter list:: All valid and needed parameters. +* SOCKS:: Routing with CIPE over a SOCKS5 relayer. +* Error handling:: How ciped deals with errors. + + +File: cipe.info, Node: Specifying options, Next: Parameter list, Prev: Configuration, Up: Configuration + +Specifying options +================== + +All configuration parameters are processed by the `ciped' daemon. It +takes parameters from + 1. the default options file (`/etc/cipe/options'), + + 2. an options file specified as `-o file' on the command line, + + 3. single options given on the command line, + +in that order. Which means, parameters on the command line override +those from files, and parameters from an explicit options file override +those from the default options file. + +Options are one of the types: boolean, integer, IP address, IP address +with port number. Booleans are default false and specifying them as +option makes them true. IP addresses are given as dot-quad notation or +domain names which can be resolved using `gethostbyname(3)'. UDP or +TCP addresses are given as `ip:port', where the port is a number or a +name resolvable by `getservbyname(3)'. + +The syntax for specifying options is `name=value' on the command line, +and `name value' (one option per line) in the options file. + + +File: cipe.info, Node: Parameter list, Next: SOCKS, Prev: Specifying options, Up: Configuration + +List of all parameters +====================== + +Name Type Required +`device' string no Name of the CIPE device. If not given, the + system picks a free one. +`debug' bool no Debug mode: Don't go background, use stderr + instead of syslog. (Independent of the + kernel driver debug option.) +`ipaddr' IP yes IP address of the CIPE device. +`ptpaddr' IP yes IP address of the peer device (i.e. the CIPE + device on the other end). +`mtu' int no Device MTU (default: ethernet standard MTU + minus all necessary headers) +`metric' int no Device metric (not sure if this is used + anywhere...) +`cttl' int no Carrier TTL value. If not specified or 0, + use the payload packet's TTL. Default + recommendation is 64. +`me' UDP no Our carrier UDP address. If either IP or + port are not given, the system picks one and + reports it via `ip-up'. +`peer' UDP yes The other end's carrier UDP address. +`key' string (yes) The link key. For security reasons, the key + has to be set via an options file and + options files must be owned by root, + unreadable by anyone else. The key should be + 128 bits in hexadecimal encoding. (To + generate such a beast from random, try `ps + -auxw | md5sum'.) +`nokey' bool no Don't encrypt at all, just encapsulate in + UDP. With this option, `key' is not needed. +`socks' TCP no Address (port required!) of the SOCKS5 + server. *Note SOCKS::. +`tokxc' int no Timeout (seconds) for key exchange. Default: + 10. +`tokey' int no Dynamic key lifetime. Default: 600 (10 + minutes). +`ipup' string no Script to run instead of `/etc/cipe/ip-up'. +`ipdown' string no Script to run instead of `/etc/cipe/ip-down'. +`arg' string no Argument to supply to ip-up. +`maxerr' int no Maximum number of errors before ciped exits. + *Note Error handling::. +`tokxts' int no Key exchange timestamp timeout. Default: 0 + (no timestamps). Set this to 30 to prevent + key exchange replay attacks, but only if the + peer runs CIPE 1.2 or later and both system + clocks are reasonably synchronized. +`ping' int no Frequency (in seconds) for keep-alive pings. + Default is don't send any pings. The "ping" + used here is internal to CIPE, not ICMP ping. +`toping' int no Timeout for pings. If no answer is received + on a keep-alive ping in this time, it counts + as an error, *Note Error handling::. Default + is no check for answers. + + +File: cipe.info, Node: SOCKS, Next: Error handling, Prev: Parameter list, Up: Configuration + +Working with SOCKS +================== + +With the `socks' option, CIPE uses a SOCKS5 server for sending and +receiving the encrypted data. Since this is UDP, SOCKS4 (which doesn't +support UDP) can not be used. SOCKS5 has a number of authentication +methods. CIPE can use either no authentication or Username/Password. +(1) Username and password are taken from the environment variables +`SOCKS5_USER' and `SOCKS5_PASSWD'. + +The implementation is not based on a SOCKS library, don't attempt to +link `ciped' with it. + +When one end of a CIPE link uses SOCKS, the other one must run a CIPE +version 0.5.1 or newer. Reason: as the IP and port number of the SOCKS5 +relayer get known only at run time, and there is no way for the +SOCKS-using part to get this information at all, it needs to determine +its peer dynamically. Older CIPE modules don't have this capability. + +When both ends use SOCKS (this is not tested), exactly one of them +should have a "ping" in its ip-up script, as described in the sample +ip-up. + +`ciped' periodically checks whether the SOCKS server has closed the +control connection. If the SOCKS server goes down, there is no way to +recover without restarting the client (in this case, `ciped'). This is +a limitation in the SOCKS5 protocol. *Note Error handling::. + +---------- Footnotes ---------- + +(1) GSSAPI/Kerberos authentication is not supported because (a) I don't +have the environment to test it, and (b) it can specify that UDP +packets be encrypted with its own method, which is unnecessary and +causes only additional load here, and (c) it makes the implementation +much more complicated. + + +File: cipe.info, Node: Error handling, Prev: SOCKS, Up: Configuration + +Error handling in `ciped' +========================= + +When the remote `ciped' is down or not available, the local `ciped' +will get a "connection refused" error. Older versions always exited on +this error. This has proven impractical in some situations, so an extra +option has been added: `maxerr' determines how many network errors +`ciped' will tolerate before exiting. This counter is reset when the +connection proves OK (more precisely: when a key exchange packet is +received). The default for `maxerr' is 8, like the non-changeable +default in version 0.5.1. A value of -1 will cause `ciped' to ignore +any network errors. In this case, it can only be brought down manually. + +If keep-alive pings are enabled, a failure to respond to a ping counts +as one error in this picture. This means that for maxerr=5 and ping=60, +a dead link will take ciped down after five minutes. + +Error handling for SOCKS is independent of this option, however. When an +error occurs on the SOCKS control connection (e.g., the SOCKS server +goes down), `ciped' will exit. This behaviour is mandated by the SOCKS5 +protocol. + + +File: cipe.info, Node: Examples, Next: Protocol, Prev: Configuration, Up: Top + +Usage examples +************** + +Here are some examples on how to design a network structure with CIPE +and configure the devices accordingly. + +* Menu: + +* Tips:: General useful tips on CIPE configuration. +* Example 1:: The classic VPN setups. + + +File: cipe.info, Node: Tips, Next: Example 1, Prev: Examples, Up: Examples + +General tips +============ + + * The IP address of a CIPE device and it's UDP carrier *must* be + different. Chose a "transit network" (e.g. 192.168 address) for + the CIPE devices if these don't fit into existing structures. + + * The route to the UDP carrier ("peer" address) *can not* go through + the CIPE device. If both are on the same route (e.g. both are on + the same network, IP-address-wise), add a host route to the "peer" + address through the right device or gateway. + + * In Linux 2.0, the `route add -host $5 dev $1' in ip-up is required. + Without it the link won't work. This also means the ip-up script + itself is mandatory. + + * Routes through a CIPE device should be set only in the ip-up + script. Use case selections on $1 or $5 if you have several CIPE + links. Use `route add ... gw $5', not `route add ... dev $1'. + Remember that Linux deletes any routes through a device when this + device goes down. + + * If you have a default route, the addresses reachable via the CIPE + link are routed via the default when the link is down. This can + defeat the purpose of an encrypted link. To guard against this, + set a reject route to the affected addresses with higher metric in + the system startup script. + + * On a system running `gated', gated is the only thing responsible + for setting any routes and the routes through the CIPE device + routes belong in gated.conf as static routes, or are to be set via + routing protocol. To gated, a CIPE link looks and behaves exactly + like a dial-up link. It is strongly recommended to put `gdc + interface' in `ip-up' as well as `ip-down' to tell gated about + status changes. + + * The configuration of both ends of a link is symmetric. One side's + `ipaddr' is the other's `ptpaddr', and one side's `me' is the + other's `peer'. Since CIPE 0.5, `peer' is picked up dynamically + and the real peer may be different from that set in the config + file (but this config item must still be present, it should + specify the other end's reverse as a reasonable default). + + * When designing a network structure, draw the CIPE links as if they + were SLIP/PPP links. Build the routing with these links enabled. + Then look at the picture as if the CIPE links weren't there, so + you can see the routing needed for the UDP adresses. + + +File: cipe.info, Node: Example 1, Prev: Tips, Up: Examples + +Example 1 +========= + +This basic example shows how to connect hosts and networks with +unofficial network numbers through the Internet. Uses for this are +classic VPN setups: + + 1. Connecting two unofficial subnets through an Internet link + + 2. Connecting a branch office to the head office through a + one-address dialup + + 3. Connecting a mobile host with varying access points + + + Internet Internet + ^ ^ + | | hostz + |ppp0 |eth1 200.0.24.3 + |200.0.24.65 |200.0.24.1 | + +---------routera routerb eth0 200.0.24.1 | + | eth0 \_ _ _ _ _ _ _ _/ \---------------+-------+---+ + | 10.0.1.1 cip3b0 cip3b0 eth0 | | + hosta 10.0.1.1 10.0.2.1 10.0.2.1 | | + 10.0.1.88 hostx hosty + 10.0.2.5 10.0.2.6 + +As can be seen from the picture, a CIPE device and another network +device can have the same IP address if there are no overlapping routes +between them. + +The CIPE devices are configured like this: + + routera routerb + cip3b0 cip3b0 +ipaddr 10.0.1.1 10.0.2.1 +ptpaddr 10.0.2.1 10.0.1.1 +me 200.0.24.65:9999 200.0.24.1:9999 +peer 200.0.24.1:9999 200.0.24.65:9999 +static routes 10.0.1.0/24 dev eth0 10.0.2.0/24 dev eth0 + default dev ppp0 200.0.24.0/26 dev eth0 + default dev eth1 +routes in ip-up 10.0.2.0/24 gw 10.0.2.1 10.0.1.0/24 gw 10.0.1.1 + +For case 3, assume `routera' to be the mobile host, think of `eth0' +missing and `ppp0' having a dynamic address. The `routerb' config +remains unchanged. For `routera' simply omit the `eth0' stuff. +`routerb' picks up its peer dynamically. This even works when `routerb' +is plugged behind a firewall and has to rely on a SOCKS5 server for +outside access. (Yes, this can be used to punch holes into firewalls. +No, it's not my intention to do anything about it. Local policy issues +have to be dealt with locally.) + + +File: cipe.info, Node: Protocol, Next: Misc, Prev: Examples, Up: Top + +CIPE protocol description +************************* + + This chapter is copied verbatim from the earlier documentation texts + and will be Texinfo-ized later. The text assumes some familiarity with + cryptography basics. + +The primary goal of this software is to provide a facility for secure +(against eavesdropping, including traffic analsyis, and faked message +injection) subnetwork interconnection across an insecure packet network +such as the Internet. + +1. Overview + +This protocol was designed to be simple and efficient, and to work over +existing communication facilities, especially by encapsulation in UDP +packets. Compatibility with existing protocols such as the IPSEC RFCs +were not a concern. The first test implementation was done entirely on +the user level, while the now published one consists of a kernel module +and a user level program. + +The CIPE model assumes a fixed link between two peers which exchange +datagrams (packetwise, not necessarily reliable). The most common way +of implementing such a thing is sending UDP messages between them. +(Another would be encapsulation in PPP, etc.) + +Nothing that can be parameterized is inside the scope of this protocol +and implementation. This is delegated to either prior arrangement or a +yet-to-be-defined application level protocol. Most notably, this +involves exchanging a shared secret key by now, and it involves choice +of encryption algorithm. + +The CIPE protocol consists of two parts: Encryption and checksumming of +the data packets and dynamic key exchange. + +2. Packet encryption + +Each IP datagram is taken as a whole, including headers. It is padded +at the end with zero to seven random octets so that the total length in +octets is congruent three modulo eight. The padded packet is appended +with one octet of the value P described below and the CRC-32 over the +packet built up so far, up to and including P. (This makes the complete +packet length a multiple of eight octets.) + +This packet is then encrypted through a 64-bit block cipher in CBC mode +with an IV as described below using either the static or the sending +dynamic key of the outbound interface (for definition of keys see +below). The default cipher algorithm is IDEA. The current +implementation also supports Blowfish with 128 bit key. + +The encrypted packet is prepended with the IV block. The highest order +bit of the first octet of the IV is zero if the static key is used, one +if the dynamic key is used. The remaining 63 bits are random, but the +first 15 of them should not be all zeros (i.e. an IV/packet that starts +with hex 0000 0000 or 8000 0000 is not allowed). Such packets are +reserved for later protocol extensions. + +The CRC is over the polynomial + + X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 +and represented in network byte order. + +The value P is given as follows: bits 6,5,4 indicate the length of the +padding between the original packet end and P. Bits 2,1 are a type +code, indicating which kind of packet this is. The remaining bits 7,3,0 +are reserved and must be zero. + +The type codes are: 00 - data 01 - key exchange 10 - reserved 11 - +reserved + +For decryption, first check the highest bit of the first octet and use +it to select the key. Decrypt the packet, calculate the CRC over the +packet minus the last four octets, compare that with the last four +octets. If valid, strip off the last octet as value P, strip off the +padding as given by bits 6,5,4 of P and process the packet as indicated +by bits 2,1 of P. + +3. Key exchange + +Every interface is associated with a static key, a sending dynamic key +and a receiving dynamic key. (An interface is an endpoint of a +connection, which may use protocols like UDP for transport but for the +purpose of CIPE are always point-to-point links.) On startup, only the +static key is valid. Encryption uses the static key if and only if the +sending dynamic key is invalid. The value 0 (all bits zero) for the +static key is reserved for future extensions and should not be used. + +The dynamic key is set by a dialogue procedure involving messages with +type code bits 01. These are encrypted just like above. The packets +consist of a type octet followed by protocol data followed by a random +amount of padding random data, so that the packet is at least 64 octets +long. A key consists of 16 octets, a key CRC is the CRC-32 over the +key, transferred in network order. + +The following messages exist: + +NK_REQ: Type code 1, no data: Requests the peer to immediately start a +key negotiation (send NK_IND). This should be sent when a packet is +received encrypted with a dynamic key but no dynamic receive key is +valid. (Which can happen when the receiving side of a connection is +rebooted while the sending side remains running.) + +NK_IND: Type code 2, data is new key followed by key CRC. Specifies a +new sending dynamic key for this sender. Requests the peer to +immediately answer with NK_ACK. + +NK_ACK: Type code 3, data is CRC of the previously accepted key. +Confirms receipt of NK_IND. + +The key negotiation procedure normally runs as follows: The sender +sends a NK_IND with the new key, then invalidates its own sending key. +Upon receipt of NK_IND, the receiver starts using this key as its +receiving key and sends a NK_ACK. When the sender receives NK_ACK, it +starts using the new key as its sending key. If either of NK_IND or +NK_ACK is lost in transmission, no new key will be used. The sender +should send a new NK_IND (with new key) if no matching NK_ACK is +received within a reasonable amount of time (current specification: 10 +seconds). + +If any of the checksums contained in the key negotiation data +mismatches the contained or stored key, this packet is ignored and no +further action taken. + +A sending dynamic key should be invalidated after being used for a +certain period of time or amount of data and a new NK_IND sent. The +process is symmetric and both sides act independently for their own +sending key. The dynamic key lifetime should not exceed 15 minutes and +the amount of data sent using one dynamic key should not exceed 2^32 +packets. + +Optionally, the key exchange packets can be timestamped. The timestamp +is a 32bit unsigned integer in network order representing the UNIX time +of the sending host, placed in octets 56-59 (starting at zero) of the +key exchange packets. The receiver may be configured to ignore the +timestamp, or it may be configured to reject all key exchange packets +whose timestamp differs from the current UNIX time of the receiving host +by more than a defined amount. It is recommended that this timeout not +exceeds 30 seconds. + +4. Security considerations + +The packets that actually get transmitted don't carry any usable +information related to the original IP datagram other than its length, +padded to a multiple of 8. This should effectively guard against most +aspects of traffic analysis. The only information visible prior +(attempt) to decrypting the packet is the bit that tells whether the +static or dynamic key was used. Because the static key has a +potentially long lifetime it is expected to be used as rarely as +possible. It is normally used only in the short period of time during a +key exchange. The dynamic key is changed often. These precautions are +there because the application is prone to known and chosen plaintext +attacks and the intention is to inhibit feeding of large amounts of +data through one key. + +Because the type code and padding length are encrypted with the packet, +they can not be deduced from the ciphertext. Especially, it is not +possible to determine whether the packet is a data or key exchange +packet. (Usually, the last packet of a sequence of dynamic key packets +followed by a sequence of static key packets is a NK_IND, but the +NK_ACK and a possible second NK_IND can't be guessed this way, so there +is no provision to tell whether the key exchange succeeded. However, +this is a small but real weakness.) + +The CRC serves as a check whether the encryption key was valid - i.e. +some sort of signature for authenticity of the packet. Additionally, +data packets should still have to form valid IP headers (with their own +16-bit checksum) and key exchange packets carry their own checksum as +defined above. + +IP packets carry some known or easily guessable plaintext in certain +positions of their header. Potential exploitation of this fact should +be mitigated by the limited key usage described above. The use of a +random IV for each packet means at least that identical (retransmitted) +packets encrypt to different ciphertexts. + +The protocol gives only limited protection against replay attacks. A +packet remains valid as long as the key it is encrypted with remains +valid. However, active exploitation is unlikely as the packet carries +no indication of its meaning. (Except for the note about sequences and +NK_IND above. Replay of NK_IND could be dangerous. Possible remedy: +store the last N accepted key CRCs [for large-ish N] and refuse to +accept NK_INDs with the same CRC as an already stored one.) + +If the timestamp of key exchange packets is used, it should guard +against replay of key exchange packets. However, this requires that the +clocks of both machines are in sync. + +Denial of service attacks are possible e.g. by sending large amounts of +bogus packets, which should affect performance only. A vulnerability +against disruption of the key generation process exists if the sender +is overrun with bogus packets so that it fails to process the NK_ACK, +effectively being forced to use its static sending key for a prolonged +period of time. A possible way out of this problem is to stop sending +data completely after a long burst of static key sends, sending only +NK_INDs and resuming only after a valid NK_ACK has been processed. +Then this attack would become a simple denial-of-service. + +5. Practical test, Conclusion + +The mentioned prototype implementations, one on the user level and one +as a kernel module, have been in use for several months now on a live +network, where they provide a transparent connection between +subnetworks through an insecure transit network based on UDP +encapsulation. This does work flawlessly. However, it is too early to +draw final conclusions about the feasibility of this approach. + +It is planned to replace the simple secret key based key exchange +process described above by a signed Diffie-Hellman scheme, which would +eliminate the need for secret keys. + +6. Appendix: New protocol for control messages in CIPE 1.3 + +CIPE 1.3 has added control messages. These are transmitted as key +exchange messages with a type code of 0x70 or higher. They may, but +don't need to carry a timestamp. + +CT_DUMMY: Type code 0x70. Dummy/keepalive message, should be ignored by +the receiver. + +CT_DEBUG: Type code 0x71. Debug message. The data is a string which the +receiver should log. + +CT_PING: Type code 0x72. Echo request. Receiver should immediately +answer with a CT_PONG. + +CT_PONG: Type code 0x73. Echo reply. Data should be copied from the +CT_PING message. + +CT_KILL: Type code 0x74. Requests the peer to exit. Data is a string +which should be logged, indicating the reason. + +Strings sent in control packets should not exceed 254 octets in length. +They should be terminated with a zero octet, after which random padding +may follow. If the messages are timestamped, the string must not exceed +a length of 54 octets, so a timestamp can be placed at octet 56. + + +File: cipe.info, Node: Misc, Next: Concept Index, Prev: Protocol, Up: Top + +Odds and ends +************* + + * Ideas and code for this project came from various parts of the + Linux 2.0.12 kernel, most notably the `ipip' protocol, the + `new_tunnel' driver, and the `udp' protocol. + + * NOTE: This software contains a data encryption facility. Use of it + is restricted by law in some countries including France and + Russia. In the United States of America it is not allowed to + export such systems without special permission. The IDEA algorithm + included herein is patented and subject to licensing conditions at + least in parts of Europe and America (see + `http://www.ascom.ch/systec'). + + * To Do list for future development: + - Add C version of Blowfish algorithm. + + - Profiling and optimization for speed. Check C implementation + of IDEA for possible optimization. + + - Make IDEA run in constant time to harden against timing + attack? This would impose a serious performance penalty. It + is at least possible in C and i486 and higher; probably not + for the i386. The Blowfish algorithm always runs in constant + time. + + - Test various combinations of crypto algorithm and + implementation selected. + + - Implement all of the attack protections outlined in the + protocol chapter. (Keeping log of recent keys and + timestamping is implemented.) + + - Implement dummy packet generation. + + * There is a mailing list for CIPE users and development. To + subscribe, send mail to <majordomo@inka.de> containing the line + subscribe cipe-l + in the message body. Please subscribe before posting to the list. + + +File: cipe.info, Node: Concept Index, Prev: Misc, Up: Top + +Concept Index +************* + +* Menu: + +* /etc/cipe directory: Install. +* autoloading of modules: insmod. +* Blowfish: Protocol. +* Branch office -- head office: Example 1. +* carrier network: Routing. +* CIPE link: How CIPE works. +* ciped: Components. +* Classic VPN setup: Example 1. +* command line options: Specifying options. +* Compilation errors: Install. +* Compiling modules: Prerequisites. +* CRC: Protocol. +* daemon name: Program Names. +* debugging level: insmod. +* Denial of service attack: Protocol. +* Designing network structure: Tips. +* device names: Program Names. +* devices, number of: insmod. +* Encrypted tunneling: Routing. +* firewall rules: Internals. +* gated: Tips. +* Hole in firewall: Example 1. +* IDEA: Protocol. +* IP address syntax: Specifying options. +* IP-in-IP tunneling: Routing. +* IPIP: How CIPE works. +* IPSEC <1>: Protocol. +* IPSEC: Routing. +* Kernel IP forwarding option <1>: Prerequisites. +* Kernel IP forwarding option: Internals. +* Kernel versions: Prerequisites. +* Key exchange: Protocol. +* Legal issues: Misc. +* link key: How CIPE works. +* Mailing list: Misc. +* Mobile host: Example 1. +* modprobe command: insmod. +* module name: Program Names. +* module parameters: insmod. +* network device: Components. +* Network layers: Network layers. +* Obtaining the CIPE package: Installation. +* options file: Specifying options. +* Packet encryption: Protocol. +* PGP: Network layers. +* pppd: Components. +* reject route: Tips. +* Setting routes: Tips. +* SO_BINDTODEVICE: Install. +* SOCKS: SOCKS. +* SSH: Network layers. +* SSL: Network layers. +* To Do list: Misc. +* traffic analysis: Routing. +* transit network: Tips. +* tunnel driver: Internals. +* UDP: How CIPE works. +* Unofficial subnets: Example 1. +* VPN: Routing. + + + +Tag Table: +Node: Top98 +Node: Introduction2889 +Node: Network layers3300 +Node: Routing5064 +Node: How CIPE works7620 +Node: Components8847 +Node: Internals9678 +Node: Installation12009 +Node: Prerequisites12697 +Node: Advanced compiling15273 +Node: Install17143 +Node: Run18438 +Node: Program Names18794 +Node: insmod19661 +Node: ciped20757 +Node: Configuration22632 +Node: Specifying options23031 +Node: Parameter list24140 +Node: SOCKS28294 +Node: Error handling29996 +Node: Examples31170 +Node: Tips31521 +Node: Example 133992 +Node: Protocol36583 +Node: Misc48032 +Node: Concept Index49797 + +End Tag Table diff -urN lin.2.2.17/net/cipe/cipe.lsm int.2.2.17.x/net/cipe/cipe.lsm --- lin.2.2.17/net/cipe/cipe.lsm Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/cipe.lsm Sat Oct 14 00:48:17 2000 @@ -0,0 +1,12 @@ +Begin3 +Title: cipe +Version: 1.3.0 +Entered-date: 14JUN99 +Description: A network device that does encrypted IP-in-UDP tunneling. + Useful for building virtual private networks, etc. + The package consists of a kernel module and driver program. +Keywords: encryption, routing, tunnel, VPN +Author: olaf@bigred.inka.de (Olaf Titz) +Primary-site: http://sites.inka.de/~bigred/sw/cipe-1.3.0.tar.gz +Copying-policy: GPL +End diff -urN lin.2.2.17/net/cipe/ciped.c int.2.2.17.x/net/cipe/ciped.c --- lin.2.2.17/net/cipe/ciped.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/ciped.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,1048 @@ +/* + CIPE - encrypted IP over UDP tunneling + + ciped.c - the user mode driver + + Copyright 1996 Olaf Titz <olaf@bigred.inka.de> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ +/* $Id: ciped.c,v 1.22.2.3 1999/06/07 19:08:24 olaf Exp $ */ + +#define CTLDIR "/etc/cipe" + +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <netdb.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#define __USE_GNU +#include <string.h> +#include <syslog.h> +#include <unistd.h> +#include <arpa/inet.h> +#include <net/if.h> +#include <sys/ioctl.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/wait.h> +#include <values.h> +#include "ciped.h" +#include "ioctl.h" + +#ifndef LOGFAC +#define LOGFAC LOG_DAEMON +#endif + +static const char daemon_version[]=VERSION; + +void usage(const char *p) +{ + fprintf(stderr, "usage: %s [-o file ] [options] device=name\n", p); + exit(1); +} + +/* FIXME: places marked *#* have byteorder conversion missing */ +/* This is corrected in version 3 protocol */ + +/*** The global options structure ***/ + +struct options { + const char * const oname; + const char otyp; + union { + int ovint; + char *ovstr; + struct sockaddr_in *ovsaddr; + } ov; +} opts[] = { +#define Opt(x,t) { #x, T##t, {0} }, +#define Tbool 0 +#define Tint 1 +#define Tstr 2 +#define Taddr 3 +#define Tuaddr 4 +#define Ttaddr 5 + +#define Okey 0 /* The interface secret key + - set via options file only */ +Opt(key,str) +#define Odebug 1 /* Debug mode - don't detach, verbose messages */ +Opt(debug,bool) +#define Oipaddr 2 /* This CIPE device's IP address */ +Opt(ipaddr,addr) +#define Optpaddr 3 /* The peer CIPE device's IP address */ +Opt(ptpaddr,addr) +#define Omtu 4 /* Device MTU */ +Opt(mtu,int) +#define Ometric 5 /* Device metric */ +Opt(metric,int) +#define Ome 6 /* My UDP address */ +Opt(me,uaddr) +#define Opeer 7 /* The peer's UDP address, + i.e. where to send packets */ +Opt(peer,uaddr) +#define Odevice 8 /* name of the CIPE device, e.g. cip3b0 */ +Opt(device,str) +#define Onokey 9 /* Don't encrypt */ +Opt(nokey,bool) +#define Osocks 10 /* SOCKS5 server (ip:port) */ +Opt(socks,taddr) +#define Otokxc 11 /* Timeout for key exchange (secs) */ +Opt(tokxc,int) +#define Otokey 12 /* Dynamic key lifetime (secs) */ +Opt(tokey,int) +#define Oipup 13 /* Name of the ip-up script */ +Opt(ipup,str) +#define Oipdown 14 /* Name of the ip-down script */ +Opt(ipdown,str) +#define Oarg 15 /* Extra argument to ip-up script */ +Opt(arg,str) +#define Octtl 16 /* TTL value for carrier */ +Opt(cttl,int) +#define Omaxerr 17 /* Maximum ECONNREFUSED tolerance */ +Opt(maxerr,int) +#define Otokxts 18 /* Timeout for key exchange timestamps */ +Opt(tokxts,int) +#define Oping 19 /* Keepalive ping interval */ +Opt(ping,int) +#define Otoping 20 /* Keepalive ping timeout */ +Opt(toping,int) + +#undef Opt +{ NULL, 0, {0} }}; + +#define OI(x) (opts[O##x].ov.ovint) +#define OS(x) (opts[O##x].ov.ovstr) +#define OA(x) (opts[O##x].ov.ovsaddr) +#define OAaddr(x) (OA(x)->sin_addr) +#define OAport(x) (OA(x)->sin_port) + +/* Statistics */ +struct kstat { + int rreq, req, ind, indb, ack, ackb, bogus; +} ks = { 0, 0, 0, 0, 0, 0, 0 }; + +char device[16] = ""; +int devnum = -1; + +/*** Option parser ***/ + +/* Resolve a host:port address */ +int getaddr(char *c, struct sockaddr_in *sa, const char *prot) +{ + struct hostent *h; + struct servent *s; + char *q=strchr(c, ':'); + + sa->sin_family=AF_INET; + sa->sin_port=0; + sa->sin_addr.s_addr=INADDR_ANY; + if (q) { + if (!prot) { + fprintf(stderr, "raw IP address has no port number\n"); + return -1; + } + *q++='\0'; + if (!(sa->sin_port=htons(atoi(q)))) { + if ((s=getservbyname(q, prot))) + sa->sin_port=s->s_port; + else { + fprintf(stderr, "port '%s' invalid/not found\n", q); + return -1; + } + } + } + if ((sa->sin_addr.s_addr=inet_addr(c))==-1) { + if ((h=gethostbyname(c))) + memcpy(&sa->sin_addr.s_addr, h->h_addr_list[0], + sizeof(sa->sin_addr.s_addr)); + else { + fprintf(stderr, "host '%s' invalid/not found\n", c); + return -1; + } + } + return 0; +} + +/* Set an option */ +int setopt(const char *n, char *v) +{ + struct options *o=opts; + static const char * const protos[]={NULL, "udp", "tcp"}; + + while (o->oname) { + if (!strcmp(o->oname, n)) { + if ((!v) && (o->otyp!=Tbool)) { + fprintf(stderr, "missing value for %s\n", n); return -1; + } + switch(o->otyp) { + case Tbool: + o->ov.ovint=1; break; + case Tint: + o->ov.ovint=atoi(v); break; + case Tstr: + if (!(o->ov.ovstr=strdup(v))) { + fprintf(stderr, "setopt: out of memory\n"); return -1; + } + break; + case Taddr: + case Tuaddr: + case Ttaddr: + if (!(o->ov.ovsaddr=malloc(sizeof(*o->ov.ovsaddr)))) { + fprintf(stderr, "setopt: out of memory\n"); return -1; + } + if (getaddr(v, o->ov.ovsaddr, protos[o->otyp-Taddr])<0) { + return -1; + } + break; + default: + fprintf(stderr, "internal error: %d\n", __LINE__); return -1; + } + return 0; + } + ++o; + } + fprintf(stderr, "unknown option: %s\n", n); + return -1; +} + +/* Set options from command line */ +void setopt_cmdline(int argc, char *argv[]) +{ + int i; + char *q; + for (i=0; i<argc; ++i) { + if ((q=strchr(argv[i], '='))) + *q++='\0'; + if (!strcmp(argv[i], "key")) { + fprintf(stderr, "Refused to set key from command line!\n"); + continue; + } + (void) setopt(argv[i], q); + } +} + +/* Set options from file, report file not found if (v) */ +void setopt_file(const char *n, int v) +{ + int d; + FILE *f; + char b[128]; + char *p, *q; + struct stat s; + + if ((d=open(n, O_RDONLY))<0) { + if (v) + perror("setopt_file: open"); + return; + } + if (fstat(d, &s)<0) { + perror("setopt_file: stat"); + return; + } + if (!S_ISREG(s.st_mode) || (s.st_mode&(S_IRWXG|S_IRWXO)) || + (s.st_uid!=0)) { + fprintf(stderr, "file %s has incorrect permissions\n", n); + return; + } + + if (!(f=fdopen(d, "r"))) { + if (v) + perror("setopt_file: fdopen"); + return; + } + while (fgets(b, sizeof(b), f)) { + p=b; + if ((q=strchr(p, '\n'))) + *q='\0'; + while ((*p) && strchr(" \t", *p)) + ++p; + if ((!*p) || strchr("#;:!", *p)) + continue; + if ((q=strpbrk(p, " \t="))) { + while ((*q) && strchr(" \t=", *q)) + *q++='\0'; + if (!*q) + q=NULL; + } + (void) setopt(p, q); + } + fclose(f); +} + +/* Make a "name=value" string of option */ +char *optstr(struct options *o) +{ + static char buf[1024]; + switch(o->otyp) { + case Tbool: + snprintf(buf, sizeof(buf), "%s=%s", o->oname, + o->ov.ovint?"yes":"no"); + break; + case Tint: + snprintf(buf, sizeof(buf), "%s=%d", o->oname, o->ov.ovint); + break; + case Tstr: + snprintf(buf, sizeof(buf), "%s=%s", o->oname, + o->ov.ovstr?o->ov.ovstr:"(none)"); + break; + case Taddr: + if (o->ov.ovsaddr) + snprintf(buf, sizeof(buf), "%s=%s", o->oname, + inet_ntoa(o->ov.ovsaddr->sin_addr)); + else + snprintf(buf, sizeof(buf), "%s=", o->oname); + break; + case Tuaddr: + case Ttaddr: + if (o->ov.ovsaddr) + snprintf(buf, sizeof(buf), "%s=%s:%d", o->oname, + inet_ntoa(o->ov.ovsaddr->sin_addr), + ntohs(o->ov.ovsaddr->sin_port)); + else + snprintf(buf, sizeof(buf), "%s=", o->oname); + break; + default: fprintf(stderr, "internal error: %d\n", __LINE__); + } + return buf; +} + +/* Print out all options */ +void dumpopt(void) +{ + struct options *o; + for (o=opts; o->oname; ++o) + printf("%s\n", optstr(o)); +} + +/*** Logging ***/ + +void logd(int lev, const char *f, int d) +{ + if (OI(debug)) { + fprintf(stderr, f, d); + fputc('\n', stderr); + } else + syslog(lev, f, d); +} + +void logs(int lev, const char *f, const char *s) +{ + if (OI(debug)) { + fprintf(stderr, f, s); + fputc('\n', stderr); + } else + syslog(lev, f, s); +} + +/* perror replacement */ +void logerr(int lev, const char *s) +{ + if (OI(debug)) + perror(s); + else + syslog(lev, "%s: %s", s, strerror(errno)); +} + +/* missing option */ +void argmiss(const char *s) +{ + logs(LOG_ERR, "missing argument: %s", s); +} + +/* print if debugging */ +#define dprintf(f) if(OI(debug)){printf f;} + +void dumppacket(const char *hdr, int f, const unsigned char *buf, int len) +{ + int i=999; + printf("%s %d", hdr, f); + while (len-->0) { + if (++i>15) { + printf("\n "); + i=0; + } + printf("%02x ", *buf++); + } + printf("\n"); +} + +/*** Initialize, open and attach the CIPE device. ***/ + +int opendev(void) +{ + int f, i; +#ifndef NO_DYNDEV + struct siocsifcipall d; +#endif + struct siocsifcippar p; + struct siocsifcipkey k; + struct siocsifcipatt a; + struct ifreq r; + +#define amiss(s) { argmiss(s); goto error; } +#define err(s) { logerr(LOG_ERR, s); goto error; } + + /* Initialize, bind and connect the socket */ + if ((f=socket(AF_INET, SOCK_DGRAM, 0))<0) { + logerr(LOG_ERR, "opendev: socket"); + return -1; + } + i=65536; /* we need much to receive fast */ + if (setsockopt(f, SOL_SOCKET, SO_RCVBUF, &i, sizeof(i))) + /* not fatal */ + logerr(LOG_NOTICE, "opendev: setsockopt"); + if (!OA(me)) { + if (!(OA(me)=malloc(sizeof(*OA(me))))) + err("opendev: malloc"); + OA(me)->sin_family=AF_INET; + OAaddr(me).s_addr=INADDR_ANY; + OAport(me)=0; + } + if (bind(f, (struct sockaddr *)OA(me), sizeof(*OA(me)))<0) + err("opendev: bind"); + if (OA(peer)) { + if (connect(f, (struct sockaddr *)OA(peer), sizeof(*OA(peer)))<0) + err("opendev: bind"); + } else + amiss("peer"); + i=sizeof(*OA(me)); + if (getsockname(f, (struct sockaddr *)OA(me), &i)<0) + /* not fatal */ + logerr(LOG_NOTICE, "opendev: getsockname"); + +#ifdef NO_DYNDEV + if (!OS(device)) + amiss("device"); +#else + /* Allocate the device name */ + if (OS(device)) { + char *x=OS(device)+strlen(OS(device))-1; + while (x>=OS(device) && isdigit(*x)) + --x; + d.num=atoi(++x); + } else { + d.num=-1; + } + if (ioctl_alloc(f, DEVNAME "0", &d)<0) + err("opendev: alloc"); + strcpy(device, d.name); + devnum=d.num; + dprintf(("Using %s index %d\n", device, devnum)); +#endif + + /* Set the CIPE operation parameters */ + memset(&p, 0, sizeof(p)); + if (OA(socks)) { + p.sockshost=OAaddr(socks).s_addr; + p.socksport=OAport(socks); + } + p.tmo_keyxchg=OI(tokxc); + p.tmo_keylife=OI(tokey); + p.mayclear=OI(nokey); + p.cttl=OI(cttl); + if (ioctl_setpar(f, device, &p)<0) + err("opendev: setpar"); + + /* Set the key */ + if (OS(key)) { + unsigned char *c=OS(key); + unsigned char *x=(unsigned char *)&k.thekey; + i=0; + k.which=KEY_STATIC; + /* primitive hex decoder */ + while(*c) { + x[i]=((*c)<<4)&0xF0; + *c++='\0'; /* clear after use */ + if (!*c) break; + x[i++]|=(*c)&0x0F; + *c++='\0'; + if (i>=userKeySize) break; + } + if (ioctl_setkey(f, device, &k)<0) + err("opendev: setkey"); + memset(&k, 0, sizeof(k)); + } else { + if (!OI(nokey)) + amiss("key"); + } + + /* Perform attach */ + a.fd=f; + if (ioctl_attach(f, device, &a)<0) + err("opendev: attach"); + + /* Perform ifconfig */ + strcpy(r.ifr_name, device); + if (OA(ipaddr)) { + memcpy(&r.ifr_addr, OA(ipaddr), sizeof(*OA(ipaddr))); + if (ioctl(f, SIOCSIFADDR, &r)<0) + err("opendev: SIOCSIFADDR"); + } else + amiss("ipaddr"); + if (OA(ptpaddr)) { + memcpy(&r.ifr_dstaddr, OA(ptpaddr), sizeof(*OA(ptpaddr))); + if (ioctl(f, SIOCSIFDSTADDR, &r)<0) + err("opendev: SIOCSIFDSTADDR"); + } + if (OI(mtu)) { + r.ifr_mtu=OI(mtu); + if (ioctl(f, SIOCSIFMTU, &r)<0) + err("opendev: SIOCSIFMTU"); + } + if (OI(metric)) { + r.ifr_metric=OI(metric); + if (ioctl(f, SIOCSIFMETRIC, &r)<0) + err("opendev: SIOCSIFMETRIC"); + } + r.ifr_flags=IFF_UP|IFF_RUNNING|IFF_NOARP|IFF_NOTRAILERS|IFF_POINTOPOINT; + if (ioctl(f, SIOCSIFFLAGS, &r)<0) + err("opendev: SIOCSIFFLAGS"); + + return f; + + error: + close(f); + return -1; + +#undef amiss +#undef err +} + +/* Close the device. */ + +void closedev(int f) +{ + struct ifreq r; + strcpy(r.ifr_name, device); + if (ioctl(f, SIOCGIFFLAGS, &r)<0) + logerr(LOG_ERR, "closedev: SIOCGIFFLAGS"); + r.ifr_flags&=~(IFF_UP|IFF_RUNNING); + if (ioctl(f, SIOCSIFFLAGS, &r)<0) + logerr(LOG_ERR, "closedev: SIOCSIFFLAGS"); + close(f); +#ifndef NO_DYNDEV + if (devnum>0) { + struct siocsifcipall x; + if ((f=socket(AF_INET, SOCK_DGRAM, 0))<0) { + logerr(LOG_ERR, "closedev: socket"); + return; + } + x.num=devnum; + if (ioctl_unalloc(f, device, &x)<0) + logerr(LOG_ERR, "closedev: alloc"); + close(f); + } +#endif +} + +/* Fetch the device statistics. */ + +char *getstats(void) +{ + static char b[256]; + char *p, *q; + FILE *f=fopen("/proc/net/dev/", "r"); + if (!f) + return NULL; + while (fgets(b, sizeof(b), f)) { + for (p=b; *p==' '; ++p); + for (q=p; *q && *q!=':'; ++q); + if (!*q) + continue; + *q++='\0'; + if (strcmp(p, device)) + continue; + fclose(f); + return(q); + } + fclose(f); + return NULL; +} + + +/*** Open a SOCKS5 connection ***/ + +int opensocks(void) { + struct sockaddr_in a; + int fd=socks5_open(OA(socks)); + if (fd>=0) { + /* 3rd par of socks5_cmd is in: my address, out: relayer */ + a=*OA(me); + fd=socks5_cmd(fd, S5_UDP, &a); + /* Swap peer and socks addresses. + Use the SOCKS relayer as "peer" and the real peer as "socks" + parameter. See output.c why. */ + *OA(socks)=*OA(peer); + *OA(peer)=a; + } + return fd; +} + +/* Check whether the SOCKS5 server has closed the connection */ + +const char *eofsocks_str[] = {"no error", "exception", "read error", "EOF"}; + +int eofsocks(int fd) { + fd_set ifd, efd; + struct timeval t={0,0}; + FD_ZERO(&ifd); + FD_ZERO(&efd); + FD_SET(fd, &ifd); + FD_SET(fd, &efd); + if (select(fd+1, &ifd, NULL, &efd, &t)>0) { + if (FD_ISSET(fd, &efd)) { + return 1; + } + if (FD_ISSET(fd, &ifd)) { + int e; + char c; + if ((e=read(fd, &c, 1))<=0) { + return e<0 ? 2 : 3; + } + } + } + return 0; +} + +/*** Signal handler ***/ + +sig_atomic_t gotsig=0; + +void sighand(int s) +{ + gotsig=s; +} + +void sigignore(int s) +{ + /* Dummy */ +} + +void setsig(int sig, void (*fun)(int)) +{ + struct sigaction sa; + sa.sa_handler = fun; + sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); + sigaction(sig, &sa, NULL); +} + +time_t pingtime=MAXINT, pongtime=MAXINT; + +/*** Control message handling ***/ + +void dprintct(const char *h, char c) +{ + switch(c) { + case CT_DUMMY: dprintf(("%s CT_DUMMY\n", h)); break; + case CT_DEBUG: dprintf(("%s CT_DEBUG\n", h)); break; + case CT_PING: dprintf(("%s CT_PING\n", h)); break; + case CT_PONG: dprintf(("%s CT_PONG\n", h)); break; + case CT_KILL: dprintf(("%s CT_KILL\n",h)); break; + default: dprintf(("%s %d\n", h, c)); + } +} + +/* send a control */ +int sendctl(int f, const char *msg, int len) +{ + int e; + dprintct("sending", msg[0]); + if (OI(nokey)) + return -1; /* unencrypted cant handle controls */ + if ((e=send(f, msg, len, 0))<0) + logerr(LOG_ERR, "sendctl"); + return e; +} + +/* handle control message */ +void ctrl(int f, char *msg, int len) +{ + if (OI(nokey)) + return; /* unencrypted cant handle controls */ + dprintct("received", msg[0]); + switch (msg[0]) { + case CT_DUMMY: + /* ignore it */ + break; + case CT_DEBUG: + /* Log it */ + logs(LOG_NOTICE, "peer: %s", msg+1); + break; + case CT_PING: + msg[0]=CT_PONG; + sendctl(f, msg, len); + break; + case CT_PONG: + pongtime=MAXINT; + break; + case CT_KILL: + logs(LOG_NOTICE, "Shutting down at peer request %s", msg+1); + gotsig=SIGHUP; + break; + default: + logd(LOG_NOTICE, "unknown control %d", msg[0]); + } +} + +/*** The key exchange procedure ***/ + +#ifdef VER_CRC32 +typedef unsigned long crc; +#define CRCFORM "%08lX" +#else +typedef unsigned short crc; +#define CRCFORM "%04X" +#endif + +#define REM 256 /* How many keys to remember */ + +/* Cache last valid key CRCs. */ + +static int dupcheck(crc c) +{ + static crc ca[REM]; + static int caf=0, cal=0; + int i; + + for (i=cal; i<caf; ++i) + if (ca[i%REM]==c) + return 1; + if (caf-cal>=REM) + if (++cal>REM) { + caf-=REM; + cal-=REM; + } + ca[caf%REM]=c; + ++caf; + return 0; +} + +int errcnt; + +int kxchg(int f, int r) +{ + int x=0, e=0; + unsigned char kx[KEYXCHGBLKMIN+2]; + #define kx_typ (kx[0]) + #define kx_nkind_key (kx+1) + #define kx_ts (*(time_t *)(kx+KEYXCHGTSPOS)) +#ifdef VER_CRC32 + #define kx_nkind_crc (*(unsigned long *)(kx+1+userKeySize)) + #define kx_nkack_crc (*(unsigned long *)(kx+1)) +#else + #define kx_nkind_crc (*(unsigned short *)(kx+1+userKeySize)) + #define kx_nkack_crc (*(unsigned short *)(kx+1)) +#endif + static crc scrc=0; + static unsigned char skey[userKeySize]; + +/* + struct msghdr hdr; + struct iovec iov; + + iov.iov_base=&kx; + iov.iov_len=sizeof(kx)-1; + hdr.msg_name=hdr.msg_control=NULL; + hdr.msg_iov=&iov; + hdr.msg_iovlen=1; + hdr.msg_flags=0; +*/ + if ((x=recv(f, kx, KEYXCHGBLKMIN, 0))<=0) { + if (errno==EAGAIN || errno==EINTR) + /* This is normal, would be even after select */ + return 0; + logerr(LOG_INFO, "kxchg: recv"); + if (errno==ENXIO) + /* Device was closed */ + return -1; + /* allow for some amount of ECONNREFUSED etc. */ + return (OI(maxerr)<0 ? 0 : --errcnt); + } + errcnt=OI(maxerr); + /* dumppacket("recvmsg", hdr.msg_flags, kx, x); */ + if (kx[0]>=CT_DUMMY) { + kx[55]='\0'; /* max length of message */ + ctrl(f, kx, x); + return 0; + } + if (OI(tokxts) && (abs(time(0)-kx_ts)>OI(tokxts))) { + dprintf(("KX: timestamp error\n")); + return 0; + } + switch(kx_typ) { + case NK_RREQ: + kx_typ=NK_REQ; + dprintf(("KX: [NK_RREQ] sending NK_REQ\n")); + x=send(f, &kx, sizeof(kx), 0); e=errno; + ++ks.rreq; + break; + case NK_REQ: + kx_typ=NK_IND; + if (read(r, &skey, userKeySize)!=userKeySize) { + logerr(LOG_ERR, "kxchg: read(r)"); + return -1; + } + memcpy(kx_nkind_key, skey, userKeySize); +#ifdef VER_CRC32 + kx_nkind_crc=(scrc=htonl(crc32(skey, userKeySize))); +#else + kx_nkind_crc=(scrc=block_crc(skey, userKeySize)); /*#*/ +#endif + dprintf(("KX: [NK_REQ] sending NK_IND " CRCFORM "\n", scrc)); + x=send(f, &kx, sizeof(kx), 0); e=errno; + { + struct siocsifcipkey sk; + sk.which=KEY_INVAL+KEY_SEND; + if (ioctl_setkey(f, device, &sk)<0) + logerr(LOG_ERR, "setkey"); + memset(&sk, 0, sizeof(sk)); + } + ++ks.req; + break; + case NK_IND: + if ( +#ifdef VER_CRC32 + crc32(kx_nkind_key, userKeySize)==ntohl(kx_nkind_crc) +#else + block_crc(kx_nkind_key, userKeySize)==(kx_nkind_crc) /*#*/ +#endif + ) { + struct siocsifcipkey sk; + if (dupcheck(kx_nkind_crc)) { + dprintf(("KX: [NK_IND] duplicate\n")); + ++ks.indb; + } else { + sk.which=KEY_RECV; + memcpy(&sk.thekey, kx_nkind_key, userKeySize); + if (ioctl_setkey(f, device, &sk)<0) + perror("setkey"); + else { + kx_typ=NK_ACK; + kx_nkack_crc=kx_nkind_crc; /* XX */ + dprintf(("KX: [NK_IND] sending NK_ACK " CRCFORM "\n", + (kx_nkack_crc))); /*#*/ + x=send(f, &kx, sizeof(kx), 0); e=errno; + } + ++ks.ind; + } + memset(&sk, 0, sizeof(sk)); + } else { + dprintf(("KX: [NK_IND] invalid\n")); + ++ks.indb; + } + break; + case NK_ACK: + if (scrc==(kx_nkack_crc)) { /*#*/ + struct siocsifcipkey sk; + sk.which=KEY_SEND; + memcpy(&sk.thekey, &skey, userKeySize); + dprintf(("KX: [NK_ACK] got " CRCFORM "\n", scrc)); + if (ioctl_setkey(f, device, &sk)<0) + perror("setkey"); + ++ks.ack; + memset(&sk, 0, sizeof(sk)); + memset(&skey, 0, sizeof(skey)); + } else { + dprintf(("KX: [NK_ACK] unknown " CRCFORM "\n", scrc)); + ++ks.ackb; + } + break; + default: + dprintf(("KX: invalid type %02X\n", kx_typ)); + ++ks.bogus; + } + memset(kx, 0, sizeof(kx)); + if (x<0) { + errno=e; + logerr(LOG_NOTICE, "kxchg: send"); + if (e==ENXIO) + return -1; + x=(OI(maxerr)<0 ? 0 : --errcnt); + } + return x; +} + +/*** Call the ip-up, ip-down scripts ***/ + +void pspawn(char *s) +{ + int p, c; + p=getpid(); + if ((c=fork())<0) { + logerr(LOG_ERR, "pspawn: fork"); + return; + } + if (c) { + (void) wait(NULL); /* exactly one child is active */ + } else { + /* call <interface> <my-addr> <daemon-pid> <local> <remote> <arg> */ + char bufa[32], bufb[32], bufc[32], bufd[32]; + char *na[]={s, device, bufa, bufb, bufc, bufd, OS(arg), NULL}; + struct options *o = opts; + sprintf(bufa, "%s:%d", inet_ntoa(OAaddr(me)), ntohs(OAport(me))); + sprintf(bufb, "%d", p); + sprintf(bufc, "%s", inet_ntoa(OAaddr(ipaddr))); + sprintf(bufd, "%s", inet_ntoa(OAaddr(ptpaddr))); + /* put all options but the first (key) into environment */ + for (o=opts+1; o->oname; ++o) + putenv(strdup(optstr(o))); + close(0); close(1); close(2); + (void) open("/dev/null", O_RDWR); + (void) dup(0); (void) dup(0); + execv(s, na); + logerr(LOG_WARNING, "pspawn: exec"); + exit(1); + } +} + +/*** Main program ***/ + +int main(int argc, char *argv[]) +{ + int i, ur, fd, sd=-1, pi[2]; + time_t t; + char *st; + char *pn=strrchr(argv[0], '/'); + if (pn) + ++pn; + else + pn=argv[0]; + + if (getuid() || geteuid()) { + fprintf(stderr, "This program must be run by root.\n"); + exit(1); + /* DO NOT remove this check */ + } + /* Snarf options from: standard options file, user-supplied file and + finally, command line */ + setopt_file(CTLDIR "/options", 0); + if ((argc>1) && (!strcmp(argv[1], "-o"))) { + if (argc>2) { + setopt_file(argv[2], 1); + argc-=2; argv+=2; + } else { + usage(pn); + } + } + setopt_cmdline(--argc, ++argv); + if (!OI(maxerr)) + OI(maxerr)=8; /* compatibility */ + + for (i=getdtablesize()-1; i>2; --i) + (void) close(i); + if (!OI(debug)) { + /* daemonize */ + if (pipe(pi)<0) { + perror("pipe"); exit(1); + } + if ((i=fork())<0) { + perror("fork"); exit(1); + } + if (i) { + /* wait until the child is ready */ + close(pi[1]); + (void) read(pi[0], &i, 1); + exit(0); + } + close(pi[0]); + openlog(pn, LOG_PID, LOGFAC); + /* don't let the syslog socket get in the way of the standard fds */ + close(0); close(1); close(2); + setsid(); + syslog(LOG_INFO, "CIPE daemon vers %s (c) Olaf Titz 1996-1998", + daemon_version); + } else { + printf("CIPE daemon vers %s (c) Olaf Titz 1996-1998\n", + daemon_version); + dumpopt(); + } + + setsig(SIGHUP, sighand); + setsig(SIGINT, sighand); + setsig(SIGTERM, sighand); + errcnt=OI(maxerr); + if ((ur=open("/dev/urandom", O_RDONLY))<0) { + logerr(LOG_ERR, "open(/dev/urandom)"); exit(1); + } + i=MAXINT; + if (OA(socks)) { + i=30; /* set timeout for control socket check */ + if ((sd=opensocks())<0) + exit(1); + } + if ((fd=opendev())<0) + exit(1); + pspawn(OS(ipup) ? OS(ipup) : CTLDIR "/ip-up"); + + /* Set timer for periodic checks: ping, ping-timeout */ + if (OI(ping)) { + pingtime=time(0); + if (OI(ping)<i) + i=OI(ping); + } + if (OI(toping)) { + if (OI(toping)<i) + i=OI(toping); + } + if (i<MAXINT) { + struct itimerval t; + setsig(SIGALRM, sigignore); + t.it_interval.tv_sec = i; + t.it_interval.tv_usec = 0; + t.it_value.tv_sec = i+10; + t.it_value.tv_usec = 0; + setitimer(ITIMER_REAL, &t, 0); + } + + if (!OI(debug)) + close(pi[1]); + /* sendctl(fd, "\x71starting up", 13); */ + + /* Main loop */ + while (kxchg(fd, ur)>=0) { + if (gotsig) { + logs(LOG_NOTICE, "got %s", strsignal(gotsig)); + break; + } + if ((sd>=0) && ((i=eofsocks(sd)))) { + logs(LOG_NOTICE, "%s on socks connection", eofsocks_str[i]); + break; + } + t=time(0); + if (t>=pongtime) { + logs(LOG_NOTICE, "keepalive timeout", NULL); + if (OI(maxerr)>=0 && (--errcnt<0)) + break; + } + if (t>=pingtime) { + char buf=CT_PING; + sendctl(fd, &buf, 1); + pingtime=t+OI(ping); + pongtime=t+OI(toping); + } + } + sendctl(fd, "\x71going down", 12); + if ((st=getstats())) + logs(LOG_INFO, "Interface stats %s\n", st); + closedev(fd); + if (OI(debug)) + printf("KX stats: rreq=%d, req=%d, ind=%d, indb=%d, ack=%d," + " ackb=%d, unknown=%d\n", ks.rreq, ks.req, ks.ind, ks.indb, + ks.ack, ks.ackb, ks.bogus); + else + syslog(LOG_INFO, "KX stats: rreq=%d, req=%d, ind=%d, indb=%d, ack=%d," + " ackb=%d, unknown=%d\n", ks.rreq, ks.req, ks.ind, ks.indb, + ks.ack, ks.ackb, ks.bogus); + pspawn(OS(ipdown) ? OS(ipdown) : CTLDIR "/ip-down"); + logs(LOG_INFO, "%s: daemon exiting", device); + return 0; +} diff -urN lin.2.2.17/net/cipe/ciped.h int.2.2.17.x/net/cipe/ciped.h --- lin.2.2.17/net/cipe/ciped.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/ciped.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,27 @@ +/* + CIPE - encrypted IP over UDP tunneling + + ciped.h - prototypes for user level routines + + Copyright 1997 Olaf Titz <olaf@bigred.inka.de> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ +/* $Id: ciped.h,v 1.2.2.1 1999/04/27 21:53:22 olaf Exp $ */ + +#include "cipe.h" + +/* ciped.c */ +extern void logd(int lev, const char *f, int d); +extern void logs(int lev, const char *f, const char *s); +extern void logerr(int lev, const char *s); + +/* socks5.c */ +#define S5_CONN 1 +#define S5_BIND 2 +#define S5_UDP 3 +extern int socks5_open(struct sockaddr_in *so); +int socks5_cmd(int fd, int cmd, struct sockaddr_in *so); diff -urN lin.2.2.17/net/cipe/conf/Makefile-obj.in int.2.2.17.x/net/cipe/conf/Makefile-obj.in --- lin.2.2.17/net/cipe/conf/Makefile-obj.in Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/conf/Makefile-obj.in Sat Oct 14 00:48:17 2000 @@ -0,0 +1,96 @@ +# -*-Makefile-*- template for the CIPE kernel module and driver. +# +# Copyright 1996 Olaf Titz <olaf@bigred.inka.de> +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version +# 2 of the License, or (at your option) any later version. + +# $Id: Makefile-obj.in,v 1.1.2.2 1999/04/27 21:53:53 olaf Exp $ + +BINDIR= /usr/local/sbin +MODDIR= /lib/modules/@KVERS@/misc + +CC= @CC@ +KCPPFLAGS= @KCPPFLAGS@ +KCFLAGS= @KCFLAGS@ +KDEFS= @KDEFS@ +KLDFLAGS= @KLDFLAGS@ +UCPPFLAGS= @UCPPFLAGS@ +UCFLAGS= @UCFLAGS@ +UDEFS= @UDEFS@ +ULDFLAGS= @ULDFLAGS@ +ULIBS= @ULIBS@ +KINC= @KINC@ + +CIPED= @CIPED@ +MODULE= @MODULE@ +ASMOBJS= @ASMOBJS@ +CCOBJS= @CCOBJS@ +CRCOBJS= @CRCOBJS@ +CRC32OBJS= @CRC32OBJS@ + +src=../@SRC@ + +ifeq ($(WHAT), ) +WHAT=all +endif +default: $(WHAT) + +.PHONY: all install clean depend + +all:: $(MODULE) $(CIPED) + +install:: all + -mkdir -p $(MODDIR) $(BINDIR) + install -m 644 $(MODULE) $(MODDIR) + install -m 755 $(CIPED) $(BINDIR) + -depmod -a + +KOBJS= module.o device.o sock.o output.o encaps.o $(CCOBJS) +OBJS= ciped.o ioctl.o socks5.o +SOBJS= crcgen.o $(CRC32OBJS) +KSRCS= $(KOBJS:%.o=$(src)/%.c) $(ASMOBJS:%.o=$(src)/%.S) +USRCS= $(OBJS:%.o=$(src)/%.c) $(CRCOBJS:%.o=$(src)/%.c) $(SOBJS:%.o=$(src)/%.c) + +$(MODULE): $(KOBJS) $(ASMOBJS) $(CRCOBJS) + ld $(KLDFLAGS) -o $@ $(KOBJS) $(ASMOBJS) $(CRCOBJS) + +$(CIPED): $(OBJS) $(CRCOBJS) + $(CC) $(ULDFLAGS) -o $@ $(OBJS) $(CRCOBJS) $(ULIBS) + +$(ASMOBJS): %.o: $(src)/%.S + $(CC) $(KDEFS) $(KCPPFLAGS) -o $@ -c $< + +$(KOBJS): %.o: $(src)/%.c + $(CC) $(KDEFS) $(KCPPFLAGS) $(KCFLAGS) -o $@ -c $< + +$(KOBJS:.o=.s): %.s: $(src)/%.c + $(CC) $(KDEFS) $(KCPPFLAGS) $(KCFLAGS) -fverbose-asm -o $@ -S $< + +$(KOBJS:.o=.i): %.i: $(src)/%.c + $(CC) $(KDEFS) $(KCPPFLAGS) $(KCFLAGS) -o $@ -E $< + +$(OBJS) $(CRCOBJS) $(SOBJS): %.o: $(src)/%.c + $(CC) $(UDEFS) $(UCPPFLAGS) $(UCFLAGS) -o $@ -c $< + +version.h: config.h crcgen + egrep '#(define|undef)' config.h | ./crcgen - >$@ + +crcgen: crc32.o crcgen.o + $(CC) $(ULDFLAGS) -o crcgen crc32.o crcgen.o $(ULIBS) + +clean:: + rm -f core *.out *.tmp *.o *.s *.i version.h crcgen $(CIPED) + +Makefile: ../conf/Makefile-obj.in ../config.status $(KINC)/linux/version.h + (cd ..; ./config.status --recheck; ./config.status) + +.depend: Makefile config.h + $(CC) -MM -MG $(KDEFS) $(KCPPFLAGS) $(KSRCS) >$@ + $(CC) -MM -MG $(UDEFS) $(UCPPFLAGS) $(USRCS) >>$@ + +ifneq ($(WHAT), clean) +-include .depend +endif diff -urN lin.2.2.17/net/cipe/conf/Makefile-top.in int.2.2.17.x/net/cipe/conf/Makefile-top.in --- lin.2.2.17/net/cipe/conf/Makefile-top.in Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/conf/Makefile-top.in Sat Oct 14 00:48:17 2000 @@ -0,0 +1,84 @@ +# -*-Makefile-*- template for the CIPE package. +# +# Copyright 1996 Olaf Titz <olaf@bigred.inka.de> +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version +# 2 of the License, or (at your option) any later version. + +# $Id: Makefile-top.in,v 1.1.2.3 1999/04/29 09:32:51 olaf Exp $ + +INFODIR=/usr/local/info + +SRC= @SRC@ +VERSION=@VERSION@ +BUILD= @BUILD@ +CC= @CC@ +TEXINFO=@TEXINFO@ +MAKEINFO=@MAKEINFO@ + +default: all + +SRCS= cipe.h crypto.h \ + ciped.c ciped.h ioctl.c ioctl.h socks5.c \ + module.c device.c sock.c output.c encaps.c \ + idea0.h idea0.c bf.h crc.c crc32.c crcgen.c \ + idea-i386.S bf-i386.S thruput.c +CONF= Makefile-top.in Makefile-obj.in aclocal.m4 config.h.in +SMPL= README options ip-up ip-down +MISC= configure configure.in cipe.info tcpdump.patch +DIST= README CHANGES COPYING cipe.lsm $(MISC) \ + $(CONF:%=conf/%) $(SRCS:%=$(SRC)/%) $(SMPL:%=samples/%) + +TEXAUX=cipe.cp cipe.fn cipe.ky cipe.pg cipe.tp cipe.vr + +.PHONY: all install clean realclean dvi tgz depend +.EXPORT_ALL_VARIABLES: + +all install clean depend:: + $(MAKE) -C $(BUILD) WHAT=$@ + +dvi: cipe.dvi + +$(TEXAUX): cipe.texinfo + $(TEXINFO) $< + +cipe.info: cipe.texinfo + $(MAKEINFO) $< + +cipe.dvi: cipe.cp + texindex $(TEXAUX) + $(TEXINFO) cipe.texinfo + +thruput: $(SRC)/thruput.c + $(CC) -Wall -O3 -s -o $@ $< + +Checksums: $(DIST) + makechecksums $(DIST) > Checksums + +tgz: $(DIST) Checksums + cd .. && ln -sf cipe-linux cipe-$(VERSION) && \ + tar czf cipe-$(VERSION).tar.gz \ + $(DIST:%=cipe-$(VERSION)/%) cipe-$(VERSION)/Checksums + +install:: + -mkdir -p $(INFODIR) + install -m 644 cipe.info* $(INFODIR) + +clean realclean:: + rm -f core *.out *.tmp *.o *.s *.i thruput + +realclean:: + rm -rf $(BUILD) + rm -f config.cache config.log config.status Makefile + rm -f *~ *.bak *.dvi *.aux *.log *.toc *.html $(TEXAUX) $(TEXAUX:%=%s) + +configure: configure.in conf/aclocal.m4 + autoconf -l conf + +config.status: configure + ./configure + +Makefile: config.status conf/Makefile-top.in + ./config.status diff -urN lin.2.2.17/net/cipe/conf/aclocal.m4 int.2.2.17.x/net/cipe/conf/aclocal.m4 --- lin.2.2.17/net/cipe/conf/aclocal.m4 Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/conf/aclocal.m4 Sat Oct 14 00:48:17 2000 @@ -0,0 +1,19 @@ +dnl AX_MSG_RESULT_YN(a) +dnl results "yes" iff a==1, "no" else +AC_DEFUN(AX_MSG_RESULT_YN, [x=no +test "x$1" = "x1" && x=yes +AC_MSG_RESULT($x)]) + +dnl AX_EGREP(expr, file, action-if-found, action-if-not-found) +dnl egrep for expr in file +AC_DEFUN(AX_EGREP, [dnl +changequote(, )dnl + if egrep "$1" $2 >/dev/null 2>&1; then +changequote([, ])dnl + ifelse([$3], , :, [$3]) +ifelse([$4], , , [else + $4 +])dnl +fi +]) + diff -urN lin.2.2.17/net/cipe/conf/config.h.in int.2.2.17.x/net/cipe/conf/config.h.in --- lin.2.2.17/net/cipe/conf/config.h.in Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/conf/config.h.in Sat Oct 14 00:48:17 2000 @@ -0,0 +1,31 @@ +/* Version of the CIPE package */ +#undef VERSION + +/* Encapsulation protocol version */ +#undef ProtocolVersion + +/* Cipher algorithm selection */ +#undef Crypto_IDEA +#undef Crypto_Blowfish + +/* Assembler module selection */ +#undef ASM_Idea_Crypt +#undef ASM_BF_Crypt + +/* Kernel config dependencies */ +#undef __SMP__ +#undef MODVERSIONS + +/* Debug code in kernel */ +#undef DEBUG + +/* Dynamic device allocation */ +#undef NO_DYNDEV + +/* Syslog facility */ +#undef LOGFAC + +/* Include the symbol versions if needed. This must be the first include */ +#if defined(__KERNEL__) && defined(MODVERSIONS) +#include <linux/modversions.h> +#endif diff -urN lin.2.2.17/net/cipe/configure int.2.2.17.x/net/cipe/configure --- lin.2.2.17/net/cipe/configure Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/configure Sat Oct 14 00:48:17 2000 @@ -0,0 +1,1522 @@ +#! /bin/sh + +# From configure.in Id: configure.in + + + + + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_help="$ac_help + --with-linux=dir Path to Linux source tree" +ac_help="$ac_help + --with-linux-include=dir + Path to Linux include tree" +ac_help="$ac_help + --enable-protocol=n Use protocol n (should remain at 3)" +ac_help="$ac_help + --enable-idea Use the IDEA cipher (default is Blowfish)" +ac_help="$ac_help + --disable-debug Disable debugging code in kernel module" +ac_help="$ac_help + --disable-dyndev Disable dynamic device allocation" +ac_help="$ac_help + --enable-logfacility=x Set syslog facility for ciped" +ac_help="$ac_help + --disable-asm Disable use of assembler code" + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +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=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -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 ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$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" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$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) + # 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 << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$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" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + 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) + 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" ;; + + -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 ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=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" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=./ciped.c + +# 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 its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + 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 + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + + +VERSION=1.3.0 + +SRC=. +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:556: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +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 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:586: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_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 $# -gt 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 + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:637: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:669: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 680 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:685: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:711: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:716: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <<EOF +#ifdef __GNUC__ + yes; +#endif +EOF +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:725: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:744: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&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 + +test "$GCC" || { echo "configure: error: You would not have much luck compiling kernel code with non-gcc..." 1>&2; exit 1; } +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:777: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext <<EOF +#line 792 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:798: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext <<EOF +#line 809 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:815: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext <<EOF +#line 826 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:832: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +for ac_prog in texinfo tex +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:861: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_TEXINFO'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$TEXINFO"; then + ac_cv_prog_TEXINFO="$TEXINFO" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_TEXINFO="$ac_prog" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +TEXINFO="$ac_cv_prog_TEXINFO" +if test -n "$TEXINFO"; then + echo "$ac_t""$TEXINFO" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$TEXINFO" && break +done +test -n "$TEXINFO" || TEXINFO=":" + +for ac_prog in makeinfo +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:896: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_MAKEINFO'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$MAKEINFO"; then + ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_MAKEINFO="$ac_prog" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +MAKEINFO="$ac_cv_prog_MAKEINFO" +if test -n "$MAKEINFO"; then + echo "$ac_t""$MAKEINFO" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$MAKEINFO" && break +done +test -n "$MAKEINFO" || MAKEINFO=":" + + +CFLAGS="-O3 -Wall -Wstrict-prototypes -fomit-frame-pointer $CFLAGS" + KCPPFLAGS="$CPPFLAGS" + KCFLAGS="-funroll-loops $CFLAGS" + KDEFS="-D__KERNEL__ -DMODULE $DEFS" + KLDFLAGS="-r -S" + UCPPFLAGS="$CPPFLAGS" + UCFLAGS="-fno-inline-functions $CFLAGS" + UDEFS="$DEFS" + ULDFLAGS="$LDFLAGS" + ULIBS="$LIBS" + + + +KSRC=/usr/src/linux +# Check whether --with-linux or --without-linux was given. +if test "${with_linux+set}" = set; then + withval="$with_linux" + KSRC=$withval +fi + + +# Check whether --with-linux-include or --without-linux-include was given. +if test "${with_linux_include+set}" = set; then + withval="$with_linux_include" + KINC=$withval +fi + +if test -d $KSRC -a -f $KSRC/include/linux/autoconf.h ; then + KINC=$KSRC/include +fi +if test ! -d $KSRC; then + if test -f $KINC/include/linux/autoconf.h; then + KINC=$KINC/include; elif test -f $KINC/linux/autoconf.h; then + KSRC=; + else + { echo "configure: error: no suitable configured kernel include tree found" 1>&2; exit 1; } + fi +fi + + + +echo $ac_n "checking for kernel version""... $ac_c" 1>&6 +echo "configure:969: checking for kernel version" >&5 +KVERS=`sed -n 's:^#define *UTS_RELEASE *\"\([^"]*\).*$:\1:p' $KINC/linux/version.h` +echo "$ac_t""$KVERS" 1>&6 +case "$KVERS" in +2.0.*|2.1.*|2.2.*) ;; +*) { echo "configure: error: Unsupported kernel version" 1>&2; exit 1; } +esac + +echo $ac_n "checking for architecture""... $ac_c" 1>&6 +echo "configure:978: checking for architecture" >&5 +ARCH=`uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/` +echo "$ac_t""$ARCH" 1>&6 + +echo $ac_n "checking for SMP""... $ac_c" 1>&6 +echo "configure:983: checking for SMP" >&5 +smp=0 +case "$KVERS" in +2.0.*|2.1.*) if egrep "^ *SMP *= *1" $KSRC/Makefile >/dev/null 2>&1; then + smp=1 +fi + ;; +2.2.*) if egrep "^ *\#define *CONFIG_SMP" $KINC/linux/autoconf.h >/dev/null 2>&1; then + smp=1 +fi + +esac +test "$smp" = 1 && cat >> confdefs.h <<\EOF +#define __SMP__ 1 +EOF + +x=no +test "x$smp" = "x1" && x=yes +echo "$ac_t""$x" 1>&6 + +echo $ac_n "checking for versioned modules""... $ac_c" 1>&6 +echo "configure:1004: checking for versioned modules" >&5 +mv=0 + if egrep "^ *\#define *CONFIG_MODVERSIONS" $KINC/linux/autoconf.h >/dev/null 2>&1; then + mv=1 +fi + +x=no +test "x$mv" = "x1" && x=yes +echo "$ac_t""$x" 1>&6 +test "$mv" = 1 && cat >> confdefs.h <<\EOF +#define MODVERSIONS 1 +EOF + + + + +# Check whether --enable-protocol or --disable-protocol was given. +if test "${enable_protocol+set}" = set; then + enableval="$enable_protocol" + VERS=$enableval +else + VERS=3 +fi + +test "$VERS" -lt 3 && echo "configure: warning: Protocols less than 3 are deprecated" 1>&2 +verl=`expr substr abcdef $VERS 1` + +# Check whether --enable-idea or --disable-idea was given. +if test "${enable_idea+set}" = set; then + enableval="$enable_idea" + CRYPTO=IDEA;crypt=i +else + CRYPTO=Blowfish;crypt=b +fi + + +MODULE=cip$verl$crypt.o + +CIPED=ciped-$verl$crypt +# Check whether --enable-debug or --disable-debug was given. +if test "${enable_debug+set}" = set; then + enableval="$enable_debug" + test "$enableval" = "no" && e=0 +else + e=1 +fi + +test "$e" = "1" && cat >> confdefs.h <<\EOF +#define DEBUG 1 +EOF + +# Check whether --enable-dyndev or --disable-dyndev was given. +if test "${enable_dyndev+set}" = set; then + enableval="$enable_dyndev" + test "$enableval" = "no" && e=0 +else + e=1 +fi + +test "$e" = "0" && cat >> confdefs.h <<\EOF +#define NO_DYNDEV 1 +EOF + +# Check whether --enable-logfacility or --disable-logfacility was given. +if test "${enable_logfacility+set}" = set; then + enableval="$enable_logfacility" + cat >> confdefs.h <<\EOF +#define LOGFAC $enableval +EOF + +else + cat >> confdefs.h <<\EOF +#define LOGFAC LOG_DAEMON +EOF + +fi + +cat >> confdefs.h <<EOF +#define ProtocolVersion $VERS +EOF + +cat >> confdefs.h <<EOF +#define VERSION "$VERSION" +EOF + + + + + +ASMOBJS= +CCOBJS= +# Check whether --enable-asm or --disable-asm was given. +if test "${enable_asm+set}" = set; then + enableval="$enable_asm" + test "$enableval" = "no" && e=0 +else + e=1 +fi + +if test "$e" = 1; then + echo $ac_n "checking for assembler parts""... $ac_c" 1>&6 +echo "configure:1105: checking for assembler parts" >&5 + case "$CRYPTO" in + Blowfish) cat >> confdefs.h <<\EOF +#define Crypto_Blowfish 1 +EOF + + if test -f $SRC/bf-$ARCH.S; then + cat >> confdefs.h <<\EOF +#define ASM_BF_Crypt 1 +EOF + + ASMOBJS=bf-$ARCH.o + else + CCOBJS=blowfish.o + fi ;; + IDEA) cat >> confdefs.h <<\EOF +#define Crypto_IDEA 1 +EOF + + if test -f $SRC/idea-$ARCH.S; then + cat >> confdefs.h <<\EOF +#define ASM_Idea_Crypt 1 +EOF + + ASMOBJS=idea-$ARCH.o + else + CCOBJS=idea0.o + fi ;; + esac + if test "$ASMOBJS" ; then echo "$ac_t""$ASMOBJS" 1>&6 ; else echo "$ac_t""none" 1>&6 ; fi +fi + + +case "$VERS" in +1|2) CRCOBJS=crc.o ; CRC32OBJS=crc32.o ;; +*) CRCOBJS=crc32.o ; CRC32OBJS= ;; +esac + +KCPPFLAGS="-I. -I../$SRC -I$KINC -include ./config.h $KCPPFLAGS" +UCPPFLAGS="-I. -I../$SRC -I$KINC -include ./config.h $UCPPFLAGS" + +if test "$smp" = "1"; then + BUILD=$KVERS-$ARCH-SMP-$verl$crypt +else + BUILD=$KVERS-$ARCH-$verl$crypt +fi +trap '' 1 2 15 +cat > confcache <<\EOF +# 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. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# 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. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS <<EOF +#! /bin/sh +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# This directory was configured as follows, +# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir + +trap 'rm -fr `echo "Makefile:conf/Makefile-top.in $BUILD/Makefile:conf/Makefile-obj.in $BUILD/config.h:conf/config.h.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS <<EOF + +# Protect against being on the right side of a sed subst in config.status. +sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; + s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@VERSION@%$VERSION%g +s%@SRC@%$SRC%g +s%@CC@%$CC%g +s%@CPP@%$CPP%g +s%@TEXINFO@%$TEXINFO%g +s%@MAKEINFO@%$MAKEINFO%g +s%@KCPPFLAGS@%$KCPPFLAGS%g +s%@KCFLAGS@%$KCFLAGS%g +s%@KDEFS@%$KDEFS%g +s%@KLDFLAGS@%$KLDFLAGS%g +s%@UCPPFLAGS@%$UCPPFLAGS%g +s%@UCFLAGS@%$UCFLAGS%g +s%@UDEFS@%$UDEFS%g +s%@ULDFLAGS@%$ULDFLAGS%g +s%@ULIBS@%$ULIBS%g +s%@KSRC@%$KSRC%g +s%@KINC@%$KINC%g +s%@KVERS@%$KVERS%g +s%@VERS@%$VERS%g +s%@CRYPTO@%$CRYPTO%g +s%@MODULE@%$MODULE%g +s%@CIPED@%$CIPED%g +s%@ASMOBJS@%$ASMOBJS%g +s%@CCOBJS@%$CCOBJS%g +s%@CRCOBJS@%$CRCOBJS%g +s%@CRC32OBJS@%$CRC32OBJS%g +s%@BUILD@%$BUILD%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <<EOF + +CONFIG_FILES=\${CONFIG_FILES-"Makefile:conf/Makefile-top.in $BUILD/Makefile:conf/Makefile-obj.in"} +EOF +cat >> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <<EOF + CONFIG_HEADERS="$BUILD/config.h:conf/config.h.in" +EOF +cat >> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #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. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF +cat >> $CONFIG_STATUS <<EOF + +EOF +cat >> $CONFIG_STATUS <<\EOF + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff -urN lin.2.2.17/net/cipe/configure.in int.2.2.17.x/net/cipe/configure.in --- lin.2.2.17/net/cipe/configure.in Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/configure.in Sat Oct 14 00:48:17 2000 @@ -0,0 +1,171 @@ +# Autoconf script for CIPE, -*-fundamental-*- +# +# Copyright 1999 Olaf Titz <olaf@bigred.inka.de> +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version +# 2 of the License, or (at your option) any later version. +# +AC_REVISION($Id: configure.in,v 1.1.2.4 1999/06/14 21:09:21 olaf Exp $) +dnl +dnl Process this file with autoconf to produce a configure script. +dnl +AC_PREREQ(2.13) +AC_INIT(./ciped.c) +AC_CONFIG_HEADER($BUILD/config.h:conf/config.h.in) +dnl $BUILD is set below - this works for autoconf 2.13, somewhat undocumented +AC_SUBST(VERSION) +VERSION=1.3.0 +AC_SUBST(SRC) +SRC=. dnl will be moved later + +AC_PROG_CC +test "$GCC" || AC_ERROR(You would not have much luck compiling kernel code with non-gcc...) +AC_PROG_CPP +AC_CHECK_PROGS(TEXINFO, texinfo tex, :) +AC_CHECK_PROGS(MAKEINFO, makeinfo, :) + +CFLAGS="-O3 -Wall -Wstrict-prototypes -fomit-frame-pointer $CFLAGS" +dnl We separate compilation parameters in kernel and user part +AC_SUBST(KCPPFLAGS) KCPPFLAGS="$CPPFLAGS" +AC_SUBST(KCFLAGS) KCFLAGS="-funroll-loops $CFLAGS" +AC_SUBST(KDEFS) KDEFS="-D__KERNEL__ -DMODULE $DEFS" +AC_SUBST(KLDFLAGS) KLDFLAGS="-r -S" +dnl For user part. no-inline because egcs plays havoc with logs() in ciped +AC_SUBST(UCPPFLAGS) UCPPFLAGS="$CPPFLAGS" +AC_SUBST(UCFLAGS) UCFLAGS="-fno-inline-functions $CFLAGS" +AC_SUBST(UDEFS) UDEFS="$DEFS" +AC_SUBST(ULDFLAGS) ULDFLAGS="$LDFLAGS" +AC_SUBST(ULIBS) ULIBS="$LIBS" + +dnl --- Find the Linux kernel, at least the headers --- + +AC_SUBST(KSRC) +KSRC=/usr/src/linux +AC_ARG_WITH(linux, +[ --with-linux=dir Path to Linux source tree], KSRC=$withval) +AC_SUBST(KINC) +AC_ARG_WITH(linux-include, +[ --with-linux-include=dir + Path to Linux include tree], KINC=$withval) +if test -d $KSRC -a -f $KSRC/include/linux/autoconf.h ; then + KINC=$KSRC/include +fi +if test ! -d $KSRC; then + if test -f $KINC/include/linux/autoconf.h; then + KINC=$KINC/include; dnl test for obvious mis-specification + elif test -f $KINC/linux/autoconf.h; then + KSRC=; + else + AC_MSG_ERROR(no suitable configured kernel include tree found) + fi +fi + +dnl --- Get Linux kernel version and compile parameters --- + +AC_SUBST(KVERS) +AC_MSG_CHECKING(for kernel version) +KVERS=`sed -n 's:^#define *UTS_RELEASE *\"\([^"]*\).*$:\1:p' $KINC/linux/version.h` +AC_MSG_RESULT($KVERS) +case "$KVERS" in +2.0.*|2.1.*|2.2.*) ;; +*) AC_MSG_ERROR(Unsupported kernel version) +esac + +AC_MSG_CHECKING(for architecture) +ARCH=`uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/` +AC_MSG_RESULT($ARCH) + +AC_MSG_CHECKING(for SMP) +smp=0 +case "$KVERS" in +2.0.*|2.1.*) AX_EGREP([^ *SMP *= *1], $KSRC/Makefile, smp=1) ;; +2.2.*) AX_EGREP([^ *\#define *CONFIG_SMP], $KINC/linux/autoconf.h, smp=1) +esac +test "$smp" = 1 && AC_DEFINE(__SMP__) +AX_MSG_RESULT_YN($smp) + +AC_MSG_CHECKING(for versioned modules) +mv=0 +AX_EGREP([^ *\#define *CONFIG_MODVERSIONS], $KINC/linux/autoconf.h, mv=1) +AX_MSG_RESULT_YN($mv) +test "$mv" = 1 && AC_DEFINE(MODVERSIONS) + +dnl --- Configuration parameters --- + +AC_SUBST(VERS) +AC_ARG_ENABLE(protocol, +[ --enable-protocol=n Use protocol n (should remain at 3)], +VERS=$enableval, VERS=3) +test "$VERS" -lt 3 && AC_MSG_WARN(Protocols less than 3 are deprecated) +verl=`expr substr abcdef $VERS 1` +AC_SUBST(CRYPTO) +AC_ARG_ENABLE(idea, +[ --enable-idea Use the IDEA cipher (default is Blowfish)], +CRYPTO=IDEA;crypt=i, CRYPTO=Blowfish;crypt=b) +AC_SUBST(MODULE) +MODULE=cip$verl$crypt.o +AC_SUBST(CIPED) +CIPED=ciped-$verl$crypt +AC_ARG_ENABLE(debug, +[ --disable-debug Disable debugging code in kernel module], +test "$enableval" = "no" && e=0, e=1) +test "$e" = "1" && AC_DEFINE(DEBUG) +AC_ARG_ENABLE(dyndev, +[ --disable-dyndev Disable dynamic device allocation], +test "$enableval" = "no" && e=0, e=1) +test "$e" = "0" && AC_DEFINE(NO_DYNDEV) +AC_ARG_ENABLE(logfacility, +[ --enable-logfacility=x Set syslog facility for ciped], +AC_DEFINE(LOGFAC, $enableval), AC_DEFINE(LOGFAC, LOG_DAEMON)) +AC_DEFINE_UNQUOTED(ProtocolVersion, $VERS) +AC_DEFINE_UNQUOTED(VERSION, "$VERSION") + +dnl --- Determine assembler modules --- + +AC_SUBST(ASMOBJS) +AC_SUBST(CCOBJS) +ASMOBJS= +CCOBJS= +AC_ARG_ENABLE(asm, +[ --disable-asm Disable use of assembler code], +test "$enableval" = "no" && e=0, e=1) +if test "$e" = 1; then + AC_MSG_CHECKING(for assembler parts) + case "$CRYPTO" in + Blowfish) AC_DEFINE(Crypto_Blowfish) + if test -f $SRC/bf-$ARCH.S; then + AC_DEFINE(ASM_BF_Crypt) + ASMOBJS=bf-$ARCH.o + else + CCOBJS=blowfish.o + fi ;; + IDEA) AC_DEFINE(Crypto_IDEA) + if test -f $SRC/idea-$ARCH.S; then + AC_DEFINE(ASM_Idea_Crypt) + ASMOBJS=idea-$ARCH.o + else + CCOBJS=idea0.o + fi ;; + esac + if test "$ASMOBJS" ; then AC_MSG_RESULT($ASMOBJS) ; else AC_MSG_RESULT(none) ; fi +fi +dnl sort out which CRC modules to use +AC_SUBST(CRCOBJS) +AC_SUBST(CRC32OBJS) +case "$VERS" in +1|2) CRCOBJS=crc.o ; CRC32OBJS=crc32.o ;; +*) CRCOBJS=crc32.o ; CRC32OBJS= ;; +esac + +dnl make sure the config includes come first +KCPPFLAGS="-I. -I../$SRC -I$KINC -include ./config.h $KCPPFLAGS" +UCPPFLAGS="-I. -I../$SRC -I$KINC -include ./config.h $UCPPFLAGS" +AC_SUBST(BUILD) +if test "$smp" = "1"; then + BUILD=$KVERS-$ARCH-SMP-$verl$crypt +else + BUILD=$KVERS-$ARCH-$verl$crypt +fi +AC_OUTPUT(Makefile:conf/Makefile-top.in $BUILD/Makefile:conf/Makefile-obj.in) diff -urN lin.2.2.17/net/cipe/crc.c int.2.2.17.x/net/cipe/crc.c --- lin.2.2.17/net/cipe/crc.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/crc.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,62 @@ +/* crctab calculated by Mark G. Mendel, Network Systems Corporation */ +static unsigned short crctab[256] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 +}; + +/* + * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell. + * NOTE: First argument must be in range 0 to 255. + * Second argument is referenced twice. + * + * Programmers may incorporate any or all code into their programs, + * giving proper credit within the source. Publication of the + * source routines is permitted so long as proper credit is given + * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg, + * Omen Technology. + */ + +#define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp) + +unsigned short block_crc(unsigned char *d, int len) +{ + unsigned short crc = 0; + while (len-->0) + crc = updcrc((*d++), crc); + return crc; +} + +unsigned short update_crc(unsigned short old, unsigned char c) +{ + return updcrc(c, old); +} diff -urN lin.2.2.17/net/cipe/crc32.c int.2.2.17.x/net/cipe/crc32.c --- lin.2.2.17/net/cipe/crc32.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/crc32.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,111 @@ + /* ============================================================= */ + /* COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or */ + /* code or tables extracted from it, as desired without restriction. */ + /* */ + /* First, the polynomial itself and its table of feedback terms. The */ + /* polynomial is */ + /* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */ + /* */ + /* Note that we take it "backwards" and put the highest-order term in */ + /* the lowest-order bit. The X^32 term is "implied"; the LSB is the */ + /* X^31 term, etc. The X^0 term (usually shown as "+1") results in */ + /* the MSB being 1. */ + /* */ + /* Note that the usual hardware shift register implementation, which */ + /* is what we're using (we're merely optimizing it by doing eight-bit */ + /* chunks at a time) shifts bits into the lowest-order term. In our */ + /* implementation, that means shifting towards the right. Why do we */ + /* do it this way? Because the calculated CRC must be transmitted in */ + /* order from highest-order term to lowest-order term. UARTs transmit */ + /* characters in order from LSB to MSB. By storing the CRC this way, */ + /* we hand it to the UART in the order low-byte to high-byte; the UART */ + /* sends each low-bit to hight-bit; and the result is transmission bit */ + /* by bit from highest- to lowest-order term without requiring any bit */ + /* shuffling on our part. Reception works similarly. */ + /* */ + /* The feedback terms table consists of 256, 32-bit entries. Notes: */ + /* */ + /* The table can be generated at runtime if desired; code to do so */ + /* is shown later. It might not be obvious, but the feedback */ + /* terms simply represent the results of eight shift/xor opera- */ + /* tions for all combinations of data and CRC register values. */ + /* */ + /* The values must be right-shifted by eight bits by the "updcrc" */ + /* logic; the shift must be unsigned (bring in zeroes). On some */ + /* hardware you could probably optimize the shift in assembler by */ + /* using byte-swap instructions. */ + /* polynomial $edb88320 */ + /* */ + /* -------------------------------------------------------------------- */ + +static unsigned long crc32_tab[] = { + 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, + 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, + 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, + 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, + 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, + 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, + 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, + 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, + 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, + 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, + 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, + 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, + 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, + 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, + 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, + 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, + 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, + 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, + 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, + 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, + 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, + 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, + 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, + 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, + 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, + 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, + 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, + 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, + 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, + 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, + 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, + 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, + 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, + 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, + 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, + 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, + 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, + 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, + 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, + 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, + 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, + 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, + 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, + 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, + 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, + 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, + 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, + 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, + 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, + 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, + 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, + 0x2d02ef8dL + }; + +/* Return a 32-bit CRC of the contents of the buffer. */ + +unsigned long crc32(const unsigned char *s, unsigned int len) +{ + unsigned int i; + unsigned long crc32val; + + crc32val = 0; + for (i = 0; i < len; i ++) + { + crc32val = + crc32_tab[(crc32val ^ s[i]) & 0xff] ^ + (crc32val >> 8); + } + return crc32val; +} diff -urN lin.2.2.17/net/cipe/crcgen.c int.2.2.17.x/net/cipe/crcgen.c --- lin.2.2.17/net/cipe/crcgen.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/crcgen.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,41 @@ +/* + CIPE - encrypted IP over UDP tunneling + + crcgen.c - run a CRC32 over the input + + Copyright 1999 Olaf Titz <olaf@bigred.inka.de> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ +/* $Id: crcgen.c,v 1.2 1999/04/25 16:42:59 olaf Exp $ */ + +#include <stdio.h> +#include <unistd.h> + +#define BUFS 4096 + +extern unsigned long crc32(const unsigned char *s, unsigned int len); + +int main(int argc, char *argv[]) +{ + unsigned long crc=0UL; + if (argc<2) + exit(1); + if (argv[1][0]=='-') { + char buf[BUFS]; + int n; + n=read(0, buf, BUFS); + if (n<0) + exit(2); + if (n>=BUFS) + exit(3); + crc=crc32(buf, n); + } else { + crc=crc32(argv[1], strlen(argv[1])); + } + printf("#define VERSION_MAGIC 0x%08lXUL\n", crc); + return 0; +} diff -urN lin.2.2.17/net/cipe/crypto.h int.2.2.17.x/net/cipe/crypto.h --- lin.2.2.17/net/cipe/crypto.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/crypto.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,84 @@ +/* + CIPE - encrypted IP over UDP tunneling + + crypto.h - configuration of the crypto algorithm + + Copyright 1996 Olaf Titz <olaf@bigred.inka.de> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ +/* $Id: crypto.h,v 1.5 1999/04/25 16:42:59 olaf Exp $ */ + +#ifndef _CRYPTO_H_ +#define _CRYPTO_H_ + +typedef unsigned long part; +/* the longest integer so that sizeof(part) divides blockSize. + Used only for optimizing block-copy and block-XOR operations. */ + +#if ProtocolVersion == 1 + +#ifdef OLDNAMES +#define VERNAME "1" +#else +#define VERNAME "a" +#endif +#define VER_BACK /* encryption progress backwards */ +#define VER_SHORT /* no IV in packet */ + +#elif ProtocolVersion == 2 + +#ifdef OLDNAMES +#define VERNAME "2" +#else +#define VERNAME "b" +#endif + +#elif ProtocolVersion == 3 + +#ifdef OLDNAMES +#define VERNAME "3" +#else +#define VERNAME "c" +#endif +#define VER_CRC32 /* checksums are 32bit */ + +#else +#error "Must specify correct ProtocolVersion" +#endif + + +#ifdef Crypto_IDEA +#define CRYPTO "IDEA" +#define CRNAME "i" +#include "idea0.h" +#define Key Idea_Key +#define keySize Idea_keySize +#define UserKey Idea_UserKey +#define userKeySize Idea_userKeySize +#define ExpandUserKey Idea_ExpandUserKey +#define InvertKey Idea_InvertKey +#define blockSize Idea_dataSize + +#else +#ifdef Crypto_Blowfish +#define CRYPTO "Blowfish" +#define CRNAME "b" +#include "bf.h" +#define Key Blowfish_Key +#define keySize sizeof(Blowfish_Key) +#define UserKey Blowfish_UserKey +#define userKeySize 16 /* arbitrary, but matches IDEA */ +#define ExpandUserKey(u,k) Blowfish_ExpandUserKey(&u,userKeySize,&k) +#define InvertKey(x,y) /* noop */ +#define blockSize sizeof(Blowfish_Data) + +#else +#error "Must specify Crypto_IDEA or CryptoBlowfish" +#endif +#endif + +#endif diff -urN lin.2.2.17/net/cipe/device.c int.2.2.17.x/net/cipe/device.c --- lin.2.2.17/net/cipe/device.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/device.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,513 @@ +/* + CIPE - encrypted IP over UDP tunneling + + device.c - the net device driver + + Copyright 1996 Olaf Titz <olaf@bigred.inka.de> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ +/* $Id: device.c,v 1.22 1999/04/25 16:42:59 olaf Exp $ */ + +#include "cipe.h" +#include "version.h" +#include <stddef.h> +#include <linux/if.h> +#include <linux/if_arp.h> +#include <linux/sched.h> + +#ifdef LINUX_21 +#include <asm/uaccess.h> +#include <linux/rtnetlink.h> +#else +#define register_netdevice register_netdev +#define unregister_netdevice unregister_netdev +#endif + +/*** Globals ***/ + +static const char driver_version[]=VERSION; + +struct cipe_ctrl **cipe_ctrls = NULL; +#ifdef NO_DYNDEV +int cipe_maxdev = 4; /* changeable via insmod */ +#else +int cipe_maxdev = 100; /* changeable via insmod */ +#endif +#ifdef DEBUG +int cipe_debug = DEB_CALL; /* changeable via insmod */ +#endif + +/* clear all potentially sensitive info and stats */ +static void cipe_zero_c(struct cipe *c) +{ + memset(&(c->peeraddr), 0, + offsetof(struct cipe, udp_prot)-offsetof(struct cipe, peeraddr)); + /* reset these to sensible values */ + c->tmo_keyxchg = 10*HZ; + c->tmo_keylife = 10*60*HZ; +} + +/* weak but fast PRNG, used for padding only */ +static __u32 prnseed; +void cipe_prnpad(unsigned char *buf, int len) +{ + while (len>0) { + prnseed=prnseed*0x01001001+1; + if (len>=2) { + *(__u16 *)buf=prnseed>>16; + len-=2; buf+=2; + } else { + *buf=(prnseed>>24)^jiffies; return; + } + } +} + + +/*** IOCTL handlers ***/ + +static int cipe_getpar(struct device *dev, struct siocgifcippar *parm) +{ + DEVTOCIPE(dev,c,-ENODEV); + + parm->sockshost=c->sockshost; + parm->socksport=c->socksport; + parm->tmo_keyxchg=c->tmo_keyxchg/HZ; + parm->tmo_keylife=c->tmo_keylife/HZ; + parm->mayclear=c->mayclear; + parm->cttl=c->cttl; + return 0; +} + +static int cipe_setpar(struct device *dev, struct siocsifcippar *parm) +{ + DEVTOCIPE(dev,c,-ENODEV); + + if (parm->sockshost) + c->sockshost=parm->sockshost; + if (parm->socksport) + c->socksport=parm->socksport; + if (parm->tmo_keyxchg>10*60*HZ) + return -EINVAL; + if (parm->tmo_keyxchg) + c->tmo_keyxchg=parm->tmo_keyxchg*HZ; + if (parm->tmo_keylife>24*60*60*HZ) + return -EINVAL; + if (parm->tmo_keylife) + c->tmo_keylife=parm->tmo_keylife*HZ; + c->mayclear=parm->mayclear; + c->cttl=parm->cttl; + c->dev->hard_header_len=cipexhdrl+ + ((c->sockshost) ? sizeof(struct sockshdr) : 0); + return 0; +} + +static int cipe_setkey(struct device *dev, struct siocsifcipkey *parm) +{ + DEVTOCIPE(dev,c,-ENODEV); + + dprintk(DEB_KXC, (KERN_INFO "%s: setkey %d\n", dev->name, parm->which)); + switch (parm->which) { + case KEY_STATIC: + ExpandUserKey(parm->thekey, c->key_e); + InvertKey(c->key_e, c->key_d); + c->havekey=1; + break; + case KEY_SEND: + ExpandUserKey(parm->thekey, c->skey_e); + c->timeskey=jiffies+c->tmo_keylife; + c->cntskey=0; + c->haveskey=1; + break; + case KEY_RECV: + ExpandUserKey(parm->thekey, c->rkey_d); + InvertKey(c->rkey_d, c->rkey_d); + c->timerkey=jiffies+2*c->tmo_keylife; /* allow for fuzz */ + c->cntrkey=0; + c->haverkey=1; + break; + case KEY_STATIC+KEY_INVAL: + c->havekey=c->haveskey=c->haverkey=0; + memset(&(c->key_e), 0, sizeof(c->key_e)); + memset(&(c->key_d), 0, sizeof(c->key_d)); + break; + case KEY_SEND+KEY_INVAL: + c->haveskey=0; + memset(&(c->skey_e), 0, sizeof(c->skey_e)); + c->timeskey=jiffies+c->tmo_keyxchg; + break; + case KEY_RECV+KEY_INVAL: + c->haverkey=0; + memset(&(c->rkey_d), 0, sizeof(c->rkey_d)); + c->timerkey=jiffies+c->tmo_keyxchg; + break; + default: + return -EINVAL; + } + return 0; +} + +static int cipe_alloc_dev(int n); +static void cipe_unalloc_dev(int n); + +#ifndef NO_DYNDEV +static int cipe_hasowner(int n) +{ + struct task_struct *p=current; + pid_t pid=cipe_ctrls[n]->cipe.owner; + if (!pid) + return 0; + do { + if (p->pid==pid) + return 1; + p=p->next_task; + } while (p!=current); + return 0; +} +#endif + +#ifdef LINUX_21 +/* In 2.1 the ioctl operations are run under lock. Beware of deadlocks. */ +#define cipe_alloc_LOCK() 0 +#define cipe_alloc_UNLOCK() +#else +static struct semaphore cipe_alloc_sem=MUTEX; +#define cipe_alloc_LOCK() down_interruptible(&cipe_alloc_sem) +#define cipe_alloc_UNLOCK() up(&cipe_alloc_sem) +#endif + +static int cipe_alloc(struct device *dev, struct siocsifcipall *parm) +{ +#ifdef NO_DYNDEV + return -ENOSYS; +#else + int n=parm->num; + int e; + if (n>=cipe_maxdev) + return -EINVAL; + if ((e=cipe_alloc_LOCK())) + return e; + if (n>=0) { + if (cipe_ctrls[n]) { + if (cipe_ctrls[n]->cipe.sock || cipe_hasowner(n)) + e=-EBUSY; + else + cipe_ctrls[n]->cipe.owner=current->pid; + } else { + e=cipe_alloc_dev(n); + } + } else { + e=-EMFILE; + for (n=0; n<cipe_maxdev; ++n) { + if (!cipe_ctrls[n]) { + e=cipe_alloc_dev(n); + break; + } + if (!cipe_hasowner(n)) { + cipe_ctrls[n]->cipe.owner=current->pid; + e=0; + break; + } + } + } + if (!e) { + parm->num=n; + strncpy(parm->name, cipe_ctrls[n]->name, sizeof(parm->name)-1); + parm->name[sizeof(parm->name)-1]='\0'; + } + cipe_alloc_UNLOCK(); + return e; +#endif +} + +static int cipe_unalloc(struct device *dev, struct siocsifcipall *parm) +{ +#ifdef NO_DYNDEV + return -ENOSYS; +#else + int e; + if (parm->num<0 || parm->num>=cipe_maxdev) + return -EINVAL; + if ((e=cipe_alloc_LOCK())) + return e; + if (cipe_ctrls[parm->num]->cipe.sock) { + e=-EBUSY; + } else { + if (parm->num>0) + cipe_unalloc_dev(parm->num); + } + cipe_alloc_UNLOCK(); + return e; +#endif +} + + +/*** Device operation handlers ***/ + +int cipe_dev_ioctl(struct device *dev, struct ifreq *ifr, int cmd) +{ + int e; + +#ifdef LINUX_21 + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + +#define doioctl(nam,fun,str) { \ + struct str parm; \ + dprintk(DEB_CALL, (KERN_INFO "%s: " nam "\n", dev->name)); \ + if ((e=copy_from_user((void*)&parm,(void*)ifr->ifr_data, \ + sizeof(parm)))<0) \ + return e; \ + if (parm.magic!=VERSION_MAGIC) { \ + printk(KERN_WARNING "%s: ciped version mismatch", dev->name); \ + return -EINVAL; } \ + if ((e=fun(dev, &parm))<0) \ + return e; \ + if ((e=copy_to_user((void*)ifr->ifr_data, (void*)&parm, \ + sizeof(parm)))<0) \ + return e; \ + return 0; } + +#else + + if (!suser()) + return -EPERM; + +#define doioctl(nam,fun,str) { \ + struct str parm; \ + dprintk(DEB_CALL, (KERN_INFO "%s: " nam "\n", dev->name)); \ + if ((e=verify_area(VERIFY_READ, ifr->ifr_data, sizeof(parm)))<0) \ + return e; \ + memcpy_fromfs((void*)&parm, (void*)ifr->ifr_data, sizeof(parm)); \ + if (parm.magic!=VERSION_MAGIC) { \ + printk(KERN_WARNING "%s: ciped version mismatch", dev->name); \ + return -EINVAL; } \ + if ((e=fun(dev, &parm))<0) \ + return e; \ + if ((e=verify_area(VERIFY_WRITE, ifr->ifr_data, sizeof(parm)))<0) \ + return e; \ + memcpy_tofs((void*)ifr->ifr_data, (void*)&parm, sizeof(parm)); \ + return 0; } + +#endif + + switch (cmd) { + case SIOCGIFCIPPAR: + doioctl("getpar", cipe_getpar, siocgifcippar); + case SIOCSIFCIPPAR: + doioctl("setpar", cipe_setpar, siocsifcippar); + case SIOCSIFCIPKEY: + doioctl("setkey", cipe_setkey, siocsifcipkey); + case SIOCSIFCIPATT: + doioctl("attach", cipe_attach, siocsifcipatt); + case SIOCSIFCIPALL: + doioctl("alloc", cipe_alloc, siocsifcipall); + case SIOCSIFCIPUNA: + doioctl("unalloc", cipe_unalloc, siocsifcipall); + default: + return -EINVAL; + } + +#undef doioctl +} + +int cipe_dev_open(struct device *dev) +{ + DEVTOCIPE(dev,c,-ENODEV); + if (!c->sock) + return -ENXIO; + dprintk(DEB_CALL, (KERN_INFO "%s: opened\n", dev->name)); + return 0; +} + +void cipe_close(struct cipe *c) +{ + cipe_zero_c(c); + dprintk(DEB_CALL, (KERN_INFO "%s: closed\n", c->dev->name)); +} + +int cipe_dev_close(struct device *dev) +{ + struct cipe *c = (struct cipe*)(dev->priv); + if ((!c) || (c->magic!=CIPE_MAGIC)) { + printk(KERN_WARNING "%s: cipe_dev_close(): no valid struct\n", + dev->name); + return 0; + } + if (c->sock) { + dprintk(DEB_CALL, (KERN_INFO "%s: closing\n", c->dev->name)); + /* Tell the attached socket we're going down */ + c->sock->shutdown=SHUTDOWN_MASK; + c->sock->zapped=1; + c->sock->err=ENXIO; + c->sock->error_report(c->sock); + } else { + cipe_close(c); + } + return 0; +} + +struct enet_statistics *cipe_get_stats(struct device *dev) +{ + DEVTOCIPE(dev,c,NULL); + return &(c->stat); +} + + +/*** Initialization and finalization stuff ***/ + +#ifndef LINUX_21 +static inline void dev_init_buffers(struct device *dev) +{ + int i; + for (i = 0; i < DEV_NUMBUFFS; i++) { + skb_queue_head_init(&dev->buffs[i]); + } +} +#endif + +static int cipe_init_dev(struct device *dev) +{ + struct cipe *c = (struct cipe*)(dev->priv); + if (!c) + return -ENODEV; + + memset(c, 0, sizeof(struct cipe)); /* zero the device struct along */ + c->magic = CIPE_MAGIC; + c->dev = dev; + cipe_zero_c(c); + + /* Device parameters. */ + /* Procedural */ + dev->open = cipe_dev_open; + dev->stop = cipe_dev_close; + dev->hard_start_xmit = cipe_xmit; + dev->get_stats = cipe_get_stats; + dev->hard_header = NULL; + dev->rebuild_header = NULL; + dev->do_ioctl = cipe_dev_ioctl; + + /* "Hardware" */ + dev->type = ARPHRD_TUNNEL; + dev->hard_header_len = cipexhdrl; + dev->mtu = ETH_DATA_LEN + -sizeof(struct sockshdr) + -cipehdrlen + -cipefootlen; + + dev->addr_len = 4; /* Dummy? */ + dev->tx_queue_len = 100; /* matches ethernet */ + +#ifdef LINUX_21 + dev->iflink = -1; +#else + dev->family = AF_INET; + dev->pa_alen = 4; + dev->metric = 1; +#endif + dev_init_buffers(dev); + + /* New-style flags */ + dev->flags = IFF_POINTOPOINT|IFF_NOTRAILERS|IFF_NOARP; + + return 0; +} + +static int cipe_alloc_dev(int n) +{ + int e=0; + struct cipe_ctrl *cc; + + dprintk(DEB_CALL, (KERN_INFO DEVNAME ": cipe_alloc_dev %d\n", n)); + if (!(cc=kmalloc(sizeof(struct cipe_ctrl), GFP_KERNEL))) { + cipe_ctrls[n]=NULL; + return -ENOMEM; + } + + memset((void *)cc, 0, sizeof(struct cipe_ctrl)); + sprintf(cc->name, DEVNAME "%d", n); + cc->dev.name = cc->name; + cc->dev.base_addr = n; /* dummy */ + cc->dev.priv = (void*)&(cc->cipe); + cc->dev.next = NULL; + cc->dev.init = cipe_init_dev; /* called by register_netdevice */ + + e=register_netdevice(&(cc->dev)); + if (e<0) { + kfree(cc); + printk(KERN_ERR + "%s: register_netdevice() failed\n", cc->name); + cc=NULL; + } else { + cc->cipe.owner=current->pid; + } + cipe_ctrls[n]=cc; + return e; +} + +static void cipe_unalloc_dev(int n) +{ + struct cipe_ctrl *cc=cipe_ctrls[n]; + if (!cc) + return; + dprintk(DEB_CALL, (KERN_INFO DEVNAME ": cipe_unalloc_dev %d\n", n)); + if (cc->cipe.magic!=CIPE_MAGIC) { + printk(KERN_WARNING DEVNAME ": Ouch: cipe_unalloc_dev() wrong struct\n"); + return; + } + unregister_netdevice(&(cc->dev)); + cipe_ctrls[n]=NULL; + kfree(cc); +} + + +int init_module(void) +{ + /* sanity check on insmod-provided data */ + if (cipe_maxdev<1) cipe_maxdev=1; + if (cipe_maxdev>100) cipe_maxdev=100; + +#ifdef DEBUG + printk(KERN_INFO + DEVNAME ": CIPE driver vers %s (c) Olaf Titz 1996-1998, %d channels, debug=%d\n", + driver_version, cipe_maxdev, cipe_debug); +#else + printk(KERN_INFO + DEVNAME ": CIPE driver vers %s (c) Olaf Titz 1996-1998, %d channels\n", + driver_version, cipe_maxdev); +#endif + + prnseed=~jiffies; + cipe_ctrls = (struct cipe_ctrl **) kmalloc(sizeof(void*)*cipe_maxdev, + GFP_KERNEL); + if (!cipe_ctrls) { + printk(KERN_ERR + DEVNAME ": failed to allocate master control structure\n"); + return -ENOMEM; + } + memset(cipe_ctrls, 0, sizeof(void*)*cipe_maxdev); +#ifdef NO_DYNDEV + { + int i, e; + for (i=0; i<cipe_maxdev; ++i) + if ((e=cipe_alloc_dev(i))) + return e; + return 0; + } +#else + return cipe_alloc_dev(0); +#endif +} + +void cleanup_module(void) +{ + int i; + for (i=0; i<cipe_maxdev; ++i) + cipe_unalloc_dev(i); + kfree(cipe_ctrls); +} + diff -urN lin.2.2.17/net/cipe/encaps.c int.2.2.17.x/net/cipe/encaps.c --- lin.2.2.17/net/cipe/encaps.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/encaps.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,287 @@ +/* + CIPE - encrypted IP over UDP tunneling + + encaps.c - do encryption + + Copyright 1996 Olaf Titz <olaf@bigred.inka.de> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ +/* $Id: encaps.c,v 1.11.2.1 1999/04/27 21:53:22 olaf Exp $ */ + +#include "cipe.h" +#include <string.h> +#include <linux/socket.h> + +static inline void xorbuf(part *dst, part *src) +{ + int i; + for (i=0; i<blockSize/sizeof(part); ++i) + *dst++^=*src++; +} + +#ifdef Crypto_IDEA +/* This seems to be the only way to typecast an array. + Important: GCC is able to swallow the overhead when optimizing. */ +static inline void ecb_enc(part *src, part *dst, Idea_Key *k) +{ + Idea_Data *s=(Idea_Data *)src; + Idea_Data *d=(Idea_Data *)dst; + Idea_Crypt(*s, *d, *k); +} +#define ecb_dec(s,d,k) ecb_enc(s,d,k) +#endif + +#ifdef Crypto_Blowfish +#define ecb_enc(s,d,k) Blowfish_Encrypt(s,d,k) +#define ecb_dec(s,d,k) Blowfish_Decrypt(s,d,k) +#endif + +#ifdef VER_BACK + +/* Encrypt/decrypt message in CBC mode backwards. + Key must be set up accordingly */ +static void cbc_b(unsigned char *msg, int len, Idea_Key *key, int dec) +{ + int i=len/blockSize; + unsigned char iv[blockSize], iw[blockSize]; + part *p=(part*)(msg+len-blockSize); + part *q=(part*)iv; + part *r=(part*)iw; + part *s; + + memset(iv, 0, blockSize); + if (dec) { + while (i-->0) { + memcpy(r, p, blockSize); + ecb_dec(p, p, key); + xorbuf(p, q); + s=q; q=r; r=s; + p-=blockSize/sizeof(part); + } + } else { + while (i-->0) { + xorbuf(p, q); + ecb_enc(p, p, key); + q=p; + p-=blockSize/sizeof(part); + } + } +} + +#else + +/* + CBC encryption/decryption routines. + Note: the block to encrypt includes the IV, while decryption swallows + the IV. Length is always including IV. +*/ + +#define partinc(p) ((p)+blockSize/sizeof(part)) + +static void cbc_enc(unsigned char *msg, int len, Key *key) +{ + part *p=(part *)msg; + int i=len/blockSize; + + while (--i>0) { + xorbuf(partinc(p), p); + p=partinc(p); + ecb_enc(p, p, key); + } +} + +static void cbc_dec(unsigned char *msg, int len, Key *key) +{ + part *p=(part *)msg; + int i=len/blockSize; + part r[blockSize/sizeof(part)]; + + while (--i>0) { + ecb_dec(partinc(p), r, key); + xorbuf(p, r); + p=partinc(p); + } +} + +#endif + +#ifndef VER_SHORT +/* Fill a block of length blockSize with strong random numbers. + Used for generating IVs. */ +void cipe_cryptpad(unsigned char *buf) +{ + static int padcnt=MAXBLKS; + static Key padkey; + + if (++padcnt>MAXBLKS) { + /* make a new random key */ + UserKey k; + dprintk1(DEB_CRYPT, KERN_INFO, "%s: re-keying cryptpad\n", DEVNAME); + cipe_prnpad((unsigned char*)k, sizeof(UserKey)); + ExpandUserKey(k, padkey); + padcnt=0; + } + *(int *)(buf)=padcnt; + cipe_prnpad(buf+sizeof(int), blockSize-sizeof(int)); + ecb_enc((part*)buf, (part*)buf, &padkey); +} +#endif + + +void cipe_checkskey(struct cipe *c) +{ + if ((++c->cntskey>MAXBLKS) || (jiffies>c->timeskey)) { + /* make the control process send an NK_IND */ + cipe_fakenkey(c, NK_REQ); + c->timeskey=jiffies+c->tmo_keyxchg; + if (c->cntskey>MAXBLKS) + c->cntskey-=1000; + } +} + +void cipe_checkrkey(struct cipe *c) +{ + if ((c->haverkey) && + ((++c->cntrkey>MAXBLKS*2) || (jiffies>c->timerkey))) { + /* make the control process send an NK_REQ */ + cipe_fakenkey(c, NK_RREQ); + c->haverkey=0; + c->timerkey=jiffies+c->tmo_keyxchg; + if (c->cntrkey>MAXBLKS*2) + c->cntrkey-=1000; + } +} + +void cipe_nodynkey(struct cipe *c) +{ + if (jiffies>c->timerkey) { + /* make the control process send an NK_REQ */ + cipe_fakenkey(c, NK_RREQ); + c->timerkey=jiffies+c->tmo_keyxchg; + } + dprintk1(DEB_CRYPT, KERN_INFO, "%s: missing dynamic key\n", + c->dev->name); +} + +#if ProtocolVersion == 3 + +/* Encryption/decryption version 3 */ + +void cipe_encrypt(struct cipe *c, unsigned char *buf, int *len, int typ) +{ + unsigned char p=7-(((*len)+4)&7); + /* merge key flag in IV */ + *buf&=0x7F; + if (c->haveskey) + *buf|=0x80; + /* pad */ + cipe_prnpad(buf+(*len), p); + (*len)+=p+5; + /* set type and crc */ + *(buf+(*len)-5)=typ|(p<<4); + *((unsigned long *)(buf+(*len)-4))= + htonl(crc32(buf+blockSize, (*len)-blockSize-4)); + + dprintk(DEB_CRYPT, (KERN_INFO "%s: encrypt typ %d pad %d len %d\n", + c->dev->name, typ, p, *len)); + cbc_enc(buf, *len, c->haveskey ? &c->skey_e : &c->key_e); + cipe_checkskey(c); +} + +unsigned short cipe_decrypt(struct cipe *c, unsigned char *buf, int *len) +{ + unsigned char p; + + if (((*buf)&0x80) && !(c->haverkey)) { + cipe_nodynkey(c); + return TW_ERROR; /* can't decrypt - no valid key */ + } + cbc_dec(buf, *len, ((*buf)&0x80) ? &c->rkey_d : &c->key_d); + (*len)-=blockSize; + if (*((unsigned long *)(buf+(*len)-4)) != htonl(crc32(buf, (*len)-4))) { + dprintk1(DEB_CRYPT, KERN_INFO, + "%s: decrypt CRC error\n", c->dev->name); + return TW_ERROR; + } + p=*(buf+(*len)-5); + (*len)-=(p>>4)&7; + cipe_checkrkey(c); +#define CTLBITS 0x06 + dprintk(DEB_CRYPT, (KERN_INFO "%s: decrypt len=%d pad=%d typ=%02X\n", + c->dev->name, (*len), (p>>4)&7, p&CTLBITS)); + return (p&CTLBITS); +} + +#else + +/* Encryption/decryption version 1 and 2 */ + +void cipe_encrypt(struct cipe *c, unsigned char *buf, int *len, int typ) +{ + unsigned short x; + unsigned char p; + + p=8-((*len)&7); + cipe_prnpad(buf+(*len), p); + (*len)+=p; + +#ifdef VER_SHORT + x=((block_crc(buf, *len)&0xFFFE)^((p&7)<<8)^typ)|(c->haveskey); +#else + x=((block_crc(buf+blockSize, (*len)-blockSize)&0xFFFE) + ^((p&7)<<8)^typ)|(c->haveskey); +#endif +#ifdef VER_BACK + cbc_b(buf, *len, c->haveskey ? &c->skey_e : &c->key_e, 0); +#else + cbc_enc(buf, *len, c->haveskey ? &c->skey_e : &c->key_e); +#endif + + dprintk2(DEB_CRYPT, KERN_INFO, "%s: encrypt pad %d\n", c->dev->name, p); + buf[(*len)++]=x>>8; + buf[(*len)++]=x&255; + cipe_checkskey(c); +} + +unsigned short cipe_decrypt(struct cipe *c, unsigned char *buf, int *len) +{ + unsigned short x=(buf[(*len)-1])+(buf[(*len)-2]<<8); + unsigned char p; + + if ((x&1) && !(c->haverkey)) { + cipe_nodynkey(c); + return TW_ERROR; /* can't decrypt - no valid key */ + } + (*len)-=2; + if (*len<9 +#ifndef VER_SHORT + +blockSize +#endif + ) + return TW_ERROR; /* short packet */ + +#ifdef VER_BACK + cbc_b(buf, *len, (x&1) ? &c->rkey_d : &c->key_d, 1); +#else + cbc_dec(buf, *len, (x&1) ? &c->rkey_d : &c->key_d); +#endif +#ifndef VER_SHORT + (*len)-=blockSize; +#endif + + x^=block_crc(buf, *len); + p=(x>>8)&7; if (!p) p=8; + (*len)-=p; + cipe_checkrkey(c); + +#define CTLBITS 0xF8FE + dprintk3(DEB_CRYPT, KERN_INFO, "%s: decrypt pad %d typ %04X\n", + c->dev->name, (x>>8)&7, x&CTLBITS); + return (x&CTLBITS); /* delete the control bits */ +} + +#endif diff -urN lin.2.2.17/net/cipe/idea-i386.S int.2.2.17.x/net/cipe/idea-i386.S --- lin.2.2.17/net/cipe/idea-i386.S Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/idea-i386.S Sat Oct 14 00:48:17 2000 @@ -0,0 +1,150 @@ +/* + IDEA in i386 assembler (for gcc) + Author: Olaf Titz <olaf@bigred.inka.de> + + Follows the API defined in Richard De Moliner's reference + implementation. + + Provides function Idea_Crypt. + $Id: idea-i386.S,v 1.3 1997/03/31 22:07:01 olaf Exp $ +*/ + +#define Idea_nofRound 8 + +#ifdef ASM_Idea_Crypt + +#ifndef __ASSEMBLY__ +#define __ASSEMBLY__ +#endif +#include <linux/linkage.h> + +/* + IDEA is completely 16-bit operations. In a 32-bit segment, this + means the code gets bulky from the many size prefixes. Perhaps + this should be optimized a bit. +*/ + +/* + Primitive operations: add/multiply in the next key element. + I'm taking advantage of the fact that the multiply operation is only + used for key material, and key material is used sequentially. + Key is in (%esi). +*/ + +/* add key into x */ +#define AddK(x) \ + lodsw; \ + addw %ax, x + +/* multiply key with x, result in %ax */ +#define MulK0(x) \ + lodsw; \ + mulw x; \ + subw %dx, %ax; \ + jz 1f; \ + adcw $0, %ax; \ + jmp 2f; \ +1: movw $1, %ax; \ + subw x, %ax; \ + subw -2(%esi), %ax; \ +2: + +/* multiply key into x */ +#define MulK(x) \ + MulK0(x); \ + movw %ax, x + +/* + load/store data operations in correct byte order. i386 is little-endian. + For the key, the byte order is set by Idea_ExpandUserKey(). +*/ + +/* load data element into x */ +#define LodX(x) \ + lodsw; \ + xchgb %al, %ah; \ + movw %ax, x + +/* store %ax into data element */ +#define StoX \ + xchgb %al, %ah; \ + stosw + +/* + void Idea_Crypt (Idea_Data dataIn, Idea_Data dataOut, Idea_Key key); +*/ + +ENTRY(Idea_Crypt) + pushl %ebx + pushl %ebp + pushl %esi + pushl %edi +#define SAVE 16 /* no. of bytes the saved registers occupy */ + +/* arguments relative to %esp */ +#define dataIn SAVE+4 +#define dataOut SAVE+8 +#define key SAVE+12 +/* local variables */ +#define X0 (%edi) +#define X1 %bx +#define X2 %cx +#define X3 %bp +#define RC dataIn(%esp) /* abuse this */ + + cld + movl dataIn(%esp), %esi + movl dataOut(%esp), %edi + LodX(X0) + LodX(X1) + LodX(X2) + LodX(X3) + movl key(%esp), %esi + movw $Idea_nofRound, RC + .align 2,0x90 + + /* Rounds 0-7 */ +7: + MulK(X0) + AddK(X1) + AddK(X2) + MulK(X3) + pushw X1 /* T0 */ + pushw X2 /* T1 */ + xorw X0, X2 + xorw X3, X1 + MulK(X2) + addw X2, X1 + MulK(X1) + addw X1, X2 + xorw X1, X0 + xorw X2, X3 + popw %ax /* T1 */ + xorw %ax, X1 + popw %ax /* T0 */ + xorw %ax, X2 + decw RC + jnz 7b + + /* Round 8 */ + MulK0(X0) + StoX + lodsw + addw X2, %ax + StoX + lodsw + addw X1, %ax + StoX + MulK0(X3) + StoX + + popl %edi + popl %esi + popl %ebp + popl %ebx + ret +#undef dataIn +#undef dataOut +#undef key + +#endif ASM_Idea_Crypt diff -urN lin.2.2.17/net/cipe/idea0.c int.2.2.17.x/net/cipe/idea0.c --- lin.2.2.17/net/cipe/idea0.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/idea0.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,215 @@ +/******************************************************************************/ +/* */ +/* I N T E R N A T I O N A L D A T A E N C R Y P T I O N A L G O R I T H M */ +/* */ +/******************************************************************************/ +/* Author: Richard De Moliner (demoliner@isi.ee.ethz.ch) */ +/* Signal and Information Processing Laboratory */ +/* Swiss Federal Institute of Technology */ +/* CH-8092 Zuerich, Switzerland */ +/* Created: April 23, 1992 */ +/* Changes: November 16, 1993 (support of ANSI-C and C++) */ +/* System: SUN SPARCstation, SUN acc ANSI-C-Compiler, SUN-OS 4.1.3 */ +/******************************************************************************/ +#include "idea0.h" +#include <asm/byteorder.h> +#include <netinet/in.h> + +#define mulMod 0x10001 /* 2**16 + 1 */ +#define ones 0xFFFF /* 2**16 - 1 */ + +/******************************************************************************/ +/* Multiplication in the multiplicative group, a = a * b */ +/* pre: 0 <= a <= 0xFFFF. */ +/* 0 <= b <= 0xFFFF. */ +/* post: 'a' and 'b' have been modified. */ +/* a = a * b; where '*' is multiplication in the multiplicative group. */ +/* note: This implementation of '*' is not complete. To bee complete the */ +/* result has to bee masked (MUL(a, b); a &= ones;). */ + +#define Mul(a, b) \ + if (a == 0) a = mulMod - b; \ + else if (b == 0) a = mulMod - a; \ + else { \ + a *= b; \ + if ((a & ones) >= (b = a >> 16)) a -= b; \ + else a += mulMod - b; \ + } /* Mul */ + +/******************************************************************************/ +/* Encryption and decryption algorithm IDEA. Depending on the value of 'key' */ +/* 'Idea_Crypt' either encrypts or decrypts 'dataIn'. The result is stored */ +/* in 'dataOut'. */ +/* pre: 'dataIn' contains the plain/cipher-text block. */ +/* 'key' contains the encryption/decryption key. */ +/* post: 'dataOut' contains the cipher/plain-text block. */ + +#ifndef ASM_Idea_Crypt +#ifdef ANSI_C + void Idea_Crypt (Idea_Data dataIn, Idea_Data dataOut, Idea_Key key) +#else + Idea_Crypt (dataIn, dataOut, key) + Idea_Data dataIn; + Idea_Data dataOut; + Idea_Key key; +#endif + +{ register u_int32 x0, x1, x2, x3, t0, t1, t2; + int round; + + x0 = (u_int32)ntohs(*dataIn++); x1 = (u_int32)ntohs(*dataIn++); + x2 = (u_int32)ntohs(*dataIn++); x3 = (u_int32)ntohs(*dataIn); + for (round = Idea_nofRound; round > 0; round--) { + t1 = (u_int32)*key++; + x1 += (u_int32)*key++; + x2 += (u_int32)*key++; x2 &= ones; + t2 = (u_int32)*key++; + Mul(x0, t1); x0 &= ones; + Mul(x3, t2); + t0 = (u_int32)*key++; + t1 = x0 ^ x2; + Mul(t0, t1); t0 &= ones; + t1 = (u_int32)*key++; + t2 = ((x1 ^ x3) + t0) & ones; + Mul(t1, t2); t1 &= ones; + t0 += t1; + x0 ^= t1; x3 ^= t0; x3 &= ones; + t0 ^= x1; x1 = x2 ^ t1; x2 = t0; + } + t0 = (u_int32)*key++; + Mul(x0, t0); + *dataOut++ = htons((u_int16)(x0 & ones)); + *dataOut++ = htons((u_int16)(((u_int32)*key++ + x2) & ones)); + *dataOut++ = htons((u_int16)(((u_int32)*key++ + x1) & ones)); + t0 = (u_int32)*key; + Mul(x3, t0); + *dataOut = htons((u_int16)(x3 & ones)); +} /* Idea_Crypt */ +#endif + +/******************************************************************************/ +/* Multiplicative Inverse by Extended Stein Greatest Common Divisor Algorithm.*/ +/* pre: 0 <= x <= 0xFFFF. */ +/* post: x * MulInv(x) == 1, where '*' is multiplication in the */ +/* multiplicative group. */ + +#ifndef ASM_MulInv +#ifdef ANSI_C + static u_int16 MulInv (u_int16 x) +#else + static u_int16 MulInv (x) + u_int16 x; +#endif + +{ register int32 n1, n2, N, a1, a2, b1, b2; + + if (x <= 1) return x; + n1 = N = (int32)x; n2 = mulMod; + a1 = b2 = 1; a2 = b1 = 0; + do { + while ((n1 & 1) == 0) { + if (a1 & 1) + if (a1 < 0) { a1 += mulMod; b1 -= N; } + else { a1 -= mulMod; b1 += N; } + n1 >>= 1; a1 >>= 1; b1 >>= 1; + } + if (n1 < n2) + do { + n2 -= n1; a2 -= a1; b2 -= b1; + if (n2 == 0) return (u_int16)(a1 < 0 ? a1 + mulMod : a1); + while ((n2 & 1) == 0) { + if (a2 & 1) + if (a2 < 0) { a2 += mulMod; b2 -= N; } + else { a2 -= mulMod; b2 += N; } + n2 >>= 1; a2 >>= 1; b2 >>= 1; + } + } while (n1 <= n2); + n1 -= n2; a1 -= a2; b1 -= b2; + } while (n1); + return (u_int16)(a2 < 0 ? a2 + mulMod : a2); +} /* MulInv */ +#endif + +/******************************************************************************/ +/* Additive Inverse. */ +/* pre: 0 <= x <= 0xFFFF. */ +/* post: x + AddInv(x) == 0, where '+' is addition in the additive group. */ + +#define AddInv(x) (-x & ones) + +/******************************************************************************/ +/* Inverts a decryption/encrytion key to a encrytion/decryption key. */ +/* pre: 'key' contains the encryption/decryption key. */ +/* post: 'invKey' contains the decryption/encryption key. */ + +#ifndef ASM_Idea_InvertKey +#ifdef ANSI_C + void Idea_InvertKey (Idea_Key key, Idea_Key invKey) +#else + Idea_InvertKey (key, invKey) + Idea_Key key; + Idea_Key invKey; +#endif + +{ register u_int16 t, *in, *out; + register int lo, hi, i; + + in = key; out = invKey; + lo = 0; hi = 6 * Idea_nofRound; + t = MulInv(in[lo]); out[lo++] = MulInv(in[hi]); out[hi++] = t; + t = AddInv(in[lo]); out[lo++] = AddInv(in[hi]); out[hi++] = t; + t = AddInv(in[lo]); out[lo++] = AddInv(in[hi]); out[hi++] = t; + t = MulInv(in[lo]); out[lo++] = MulInv(in[hi]); out[hi] = t; + for (i = (Idea_nofRound - 1) / 2 ; i != 0 ; i --) { + t = in[lo]; out[lo++] = in[hi -= 5]; out[hi ++] = t; + t = in[lo]; out[lo++] = in[hi]; out[hi] = t; + t = MulInv(in[lo]); out[lo++] = MulInv(in[hi -= 5]); out[hi++] = t; + t = AddInv(in[lo]); out[lo++] = AddInv(in[++hi]); out[hi--] = t; + t = AddInv(in[lo]); out[lo++] = AddInv(in[hi]); out[hi++] = t; + t = MulInv(in[lo]); out[lo++] = MulInv(in[++hi]); out[hi] = t; + } +#if (Idea_nofRound % 2 == 0) + t = in[lo]; out[lo++] = in[hi -= 5]; out[hi++] = t; + t = in[lo]; out[lo++] = in[hi]; out[hi] = t; + out[lo] = MulInv(in[lo]); lo++; + t = AddInv(in[lo]); out[lo] = AddInv(in[lo + 1]); lo++; out[lo++] = t; + out[lo] = MulInv(in[lo]); +#else + out[lo] = in[lo]; lo++; + out[lo] = in[lo]; +#endif +} /* Idea_InvertKey */ +#endif + +/******************************************************************************/ +/* Expands a user key of 128 bits to a full encryption key */ +/* pre: 'userKey' contains the 128 bit user key */ +/* post: 'key' contains the encryption key */ + +#ifndef ASM_Idea_ExpandUserKey +#ifdef ANSI_C + void Idea_ExpandUserKey (Idea_UserKey userKey, Idea_Key key) +#else + Idea_ExpandUserKey (userKey, key) + Idea_UserKey userKey; + Idea_Key key; +#endif + +{ register int i; + +#if (Idea_keyLen <= Idea_userKeyLen) + for (i = 0; i < Idea_keyLen; i++) key[i] = ntohs(userKey[i]); +#else + for (i = 0; i < Idea_userKeyLen; i++) key[i] = ntohs(userKey[i]); + for (i = Idea_userKeyLen; i < Idea_keyLen; i++) + if ((i & 7) < 6) + key[i] = (key[i - 7] & 127) << 9 | key[i - 6] >> 7; + else if ((i & 7) == 6) + key[i] = (key[i - 7] & 127) << 9 | key[i - 14] >> 7; + else + key[i] = (key[i - 15] & 127) << 9 | key[i - 14] >> 7; +#endif +} /* Idea_ExpandUserKey */ +#endif + +/******************************************************************************/ diff -urN lin.2.2.17/net/cipe/idea0.h int.2.2.17.x/net/cipe/idea0.h --- lin.2.2.17/net/cipe/idea0.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/idea0.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,79 @@ +/******************************************************************************/ +/* */ +/* I N T E R N A T I O N A L D A T A E N C R Y P T I O N A L G O R I T H M */ +/* */ +/******************************************************************************/ +/* Author: Richard De Moliner (demoliner@isi.ee.ethz.ch) */ +/* Signal and Information Processing Laboratory */ +/* Swiss Federal Institute of Technology */ +/* CH-8092 Zuerich, Switzerland */ +/* Created: April 23, 1992 */ +/* Changes: November 16, 1993 (support of ANSI-C and C++) */ +/* System: SUN SPARCstation, SUN acc ANSI-C-Compiler, SUN-OS 4.1.3 */ +/******************************************************************************/ +/* Change this type definitions to the representations in your computer. */ + +typedef long int32; /* signed 32-bit integer (or larger) */ +typedef unsigned long u_int32; /* unsigned 32-bit integer (or larger)*/ +typedef unsigned short u_int16; /* unsigned 16-bit integer (or larger)*/ +typedef unsigned char u_int8; /* unsigned 8-bit integer */ + +#define ANSI_C /* If 'ANSI_C' is defined the preprocessed */ + /* source code is ANSI-C or C++ code, other- */ + /* wise it is Kerninghan & Ritchie C code. */ + +/******************************************************************************/ +/* It is possible to change this values. */ + +#define Idea_nofRound 8 /* number of rounds */ +#define Idea_userKeyLen 8 /* user key length (8 or larger) */ + +/******************************************************************************/ +/* Do not change the lines below. */ + +#define Idea_dataLen 4 /* plain-/ciphertext block length*/ +#define Idea_keyLen (Idea_nofRound * 6 + 4) /* en-/decryption key length */ + +#define Idea_dataSize (Idea_dataLen * 2) /* 8 bytes = 64 bits */ +#define Idea_userKeySize (Idea_userKeyLen * 2) /* 16 bytes = 128 bits */ +#define Idea_keySize (Idea_keyLen * 2) /* 104 bytes = 832 bits */ + +typedef u_int16 Idea_Data[Idea_dataLen]; +typedef u_int16 Idea_UserKey[Idea_userKeyLen]; +typedef u_int16 Idea_Key[Idea_keyLen]; + +/******************************************************************************/ +/* void Idea_Crypt (Idea_Data dataIn, Idea_Data dataOut, Idea_Key key) */ +/* */ +/* Encryption and decryption algorithm IDEA. Depending on the value of 'key' */ +/* 'Idea_Crypt' either encrypts or decrypts 'dataIn'. The result is stored */ +/* in 'dataOut'. */ +/* pre: 'dataIn' contains the plain/cipher-text block. */ +/* 'key' contains the encryption/decryption key. */ +/* post: 'dataOut' contains the cipher/plain-text block. */ +/* */ +/******************************************************************************/ +/* void Idea_InvertKey (Idea_Key key, Idea_Key invKey) */ +/* */ +/* Inverts a decryption/encrytion key to a encrytion/decryption key. */ +/* pre: 'key' contains the encryption/decryption key. */ +/* post: 'invKey' contains the decryption/encryption key. */ +/* */ +/******************************************************************************/ +/* void Idea_ExpandUserKey (Idea_UserKey userKey, Idea_Key key) */ +/* */ +/* Expands a user key of 128 bits to a full encryption key */ +/* pre: 'userKey' contains the 128 bit user key */ +/* post: 'key' contains the encryption key */ +/* */ +/******************************************************************************/ + +#ifdef ANSI_C + void Idea_Crypt (Idea_Data dataIn, Idea_Data dataOut, Idea_Key key); + void Idea_InvertKey (Idea_Key key, Idea_Key invKey); + void Idea_ExpandUserKey (Idea_UserKey userKey, Idea_Key key); +#else + Idea_Crypt (); + Idea_InvertKey (); + Idea_ExpandUserKey (); +#endif diff -urN lin.2.2.17/net/cipe/ioctl.c int.2.2.17.x/net/cipe/ioctl.c --- lin.2.2.17/net/cipe/ioctl.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/ioctl.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,61 @@ +/* + CIPE - encrypted IP over UDP tunneling + + ioctl.c - ioctl interface, user side + + Copyright 1996 Olaf Titz <olaf@bigred.inka.de> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ +/* $Id: ioctl.c,v 1.3 1998/11/14 20:48:02 olaf Exp $ */ + +#include "cipe.h" +#include "ioctl.h" +#include "version.h" +#include <net/if.h> +#include <sys/ioctl.h> + +#define IFRSETUP \ + struct ifreq ifr; \ + strcpy(ifr.ifr_name, ifname); \ + sio->magic=VERSION_MAGIC; \ + ifr.ifr_data=(void*)sio; + +int ioctl_getpar(int fd, char *ifname, struct siocgifcippar *sio) +{ + IFRSETUP; + return ioctl(fd, SIOCGIFCIPPAR, &ifr); +} + +int ioctl_setpar(int fd, char *ifname, struct siocsifcippar *sio) +{ + IFRSETUP; + return ioctl(fd, SIOCSIFCIPPAR, &ifr); +} + +int ioctl_setkey(int fd, char *ifname, struct siocsifcipkey *sio) +{ + IFRSETUP; + return ioctl(fd, SIOCSIFCIPKEY, &ifr); +} + +int ioctl_attach(int fd, char *ifname, struct siocsifcipatt *sio) +{ + IFRSETUP; + return ioctl(fd, SIOCSIFCIPATT, &ifr); +} + +int ioctl_alloc(int fd, char *ifname, struct siocsifcipall *sio) +{ + IFRSETUP; + return ioctl(fd, SIOCSIFCIPALL, &ifr); +} + +int ioctl_unalloc(int fd, char *ifname, struct siocsifcipall *sio) +{ + IFRSETUP; + return ioctl(fd, SIOCSIFCIPUNA, &ifr); +} diff -urN lin.2.2.17/net/cipe/ioctl.h int.2.2.17.x/net/cipe/ioctl.h --- lin.2.2.17/net/cipe/ioctl.h Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/ioctl.h Sat Oct 14 00:48:17 2000 @@ -0,0 +1,22 @@ +/* + CIPE - encrypted IP over UDP tunneling + + ioctl.h - prototype for the ioctl interface, user part + + Copyright 1996 Olaf Titz <olaf@bigred.inka.de> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ +/* $Id: ioctl.h,v 1.2 1998/08/22 16:05:51 olaf Exp $ */ + +#include "cipe.h" + +extern int ioctl_getpar(int fd, char *ifname, struct siocgifcippar *sio); +extern int ioctl_setpar(int fd, char *ifname, struct siocsifcippar *sio); +extern int ioctl_setkey(int fd, char *ifname, struct siocsifcipkey *sio); +extern int ioctl_attach(int fd, char *ifname, struct siocsifcipatt *sio); +extern int ioctl_alloc(int fd, char *ifname, struct siocsifcipall *sio); +extern int ioctl_unalloc(int fd, char *ifname, struct siocsifcipall *sio); diff -urN lin.2.2.17/net/cipe/module.c int.2.2.17.x/net/cipe/module.c --- lin.2.2.17/net/cipe/module.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/module.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,51 @@ +/* + CIPE - encrypted IP over UDP tunneling + + module.c - kernel module interface stuff + + Copyright 1996 Olaf Titz <olaf@bigred.inka.de> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ +/* $Id: module.c,v 1.3 1998/10/18 15:38:41 olaf Exp $ */ + +#include "cipe.h" +#include <linux/module.h> + +/* We put this all here so that none of the other source files needs + to include <linux/module.h>, which could lead to collisions. */ + +#ifdef LINUX_21 +MODULE_AUTHOR("Olaf Titz <olaf@bigred.inka.de>"); +MODULE_DESCRIPTION("Encrypting IP-over-UDP tunnel"); +MODULE_SUPPORTED_DEVICE(DEVNAME); +MODULE_PARM(cipe_maxdev,"i"); +MODULE_PARM_DESC(cipe_maxdev,"Maximum device number supported"); +#ifdef DEBUG +MODULE_PARM(cipe_debug,"i"); +MODULE_PARM_DESC(cipe_debug,"Debugging level"); +#endif +#endif + +void cipe_use_module(void) +{ + MOD_INC_USE_COUNT; +} + +void cipe_unuse_module(void) +{ + MOD_DEC_USE_COUNT; +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,0,30) +/* older kernel not always exported this */ + +int bad_user_access_length(void) +{ + panic("bad_user_access_length in " DEVNAME); +} + +#endif diff -urN lin.2.2.17/net/cipe/output.c int.2.2.17.x/net/cipe/output.c --- lin.2.2.17/net/cipe/output.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/output.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,537 @@ +/* + CIPE - encrypted IP over UDP tunneling + + output.c - the sending part of the CIPE device + + Copyright 1996 Olaf Titz <olaf@bigred.inka.de> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ +/* $Id: output.c,v 1.20.2.1 1999/06/07 19:08:24 olaf Exp $ */ + +#include "cipe.h" + +#include <net/ip.h> +#include <net/icmp.h> +#include <linux/if.h> +#include <linux/if_arp.h> +#include <linux/socket.h> +#include <linux/version.h> + +#ifdef DEBUG +void cipe_dump_packet(char *title, struct sk_buff *skb) +{ + short i; + unsigned char *bp=(unsigned char*)skb->data; + char b[60]; + static __u16 p[16]={0,2,5,7,10,12,15,17,21,23,26,28,31,33,36,38}; + static char h[16]="0123456789abcdef"; + + printk(KERN_DEBUG +#ifdef LINUX_21 + "%s: packet len=%x dev=%s\n", +#else + "%s: packet len=%lx dev=%s\n", +#endif + title, skb->len, skb->dev?skb->dev->name:"<none>"); + i = 0; + memset(b, ' ', sizeof(b)); + b[sizeof(b)-1]=0; + while (bp<(unsigned char *)skb->tail) { + if (i>15) { + printk(KERN_DEBUG " %s\n", b); + memset(b, ' ', sizeof(b)); + b[sizeof(b)-1]=0; + i=0; + } + b[p[i]]=h[*bp>>4]; b[p[i]+1]=h[*bp&15]; + b[i+42]=(((*bp)&0x60)==0)?'.':*bp; + ++bp; ++i; + } + printk(KERN_DEBUG " %s\n", b); +} +#endif + +#ifdef LINUX_21 + +/* An adapted version of Linux 2.1 net/ipv4/ipip.c output routine. */ + +int cipe_xmit(struct sk_buff *skb, struct device *dev) +{ + struct cipe *tunnel = (struct cipe*)(dev->priv); + struct rtable *rt = NULL; /* Route to the other host */ + struct device *tdev; /* Device to other host */ + struct iphdr *old_iph = skb->nh.iph; + u8 tos = old_iph->tos; + struct iphdr *iph; /* Our new IP header */ + struct udphdr *udph; + int max_headroom; /* The extra header space needed */ + int max_tailroom; + u32 dst = tunnel->peeraddr; + int mtu; + int length = ntohs(skb->nh.iph->tot_len); + + dprintk(DEB_OUT, (KERN_INFO "%s: cipe_xmit() len=%d(%d)\n", dev->name, + length, skb->len)); + if (tunnel->magic!=CIPE_MAGIC) { + printk(KERN_ERR DEVNAME + ": cipe_xmit() called with wrong struct\n"); + return 0; + } + + if (tunnel->recursion++) { + printk(KERN_ERR "%s: cipe_xmit() reentrance\n", dev->name); + tunnel->stat.collisions++; + goto tx_error; + } + + if (skb->protocol != __constant_htons(ETH_P_IP)) + goto tx_error; + +#if 0 + dprintk(DEB_OUT, (KERN_DEBUG "routing dst=%08lX src=%08lX tos=%x oif=%d\n", + dst, tunnel->myaddr, RT_TOS(tos), tunnel->sock->bound_dev_if)); +#endif + if (ip_route_output(&rt, dst, tunnel->myaddr, RT_TOS(tos), + tunnel->sock->bound_dev_if)) { + dprintk(DEB_OUT, (KERN_NOTICE "%s: no route\n", dev->name)); + tunnel->stat.tx_carrier_errors++; + goto tx_error_icmp; + } + tdev = rt->u.dst.dev; + dprintk(DEB_OUT, (KERN_DEBUG "route dev=%s flags=%x type=%x\n", + tdev->name, rt->rt_flags, rt->rt_type)); + + if (tdev == dev) { + printk(KERN_ERR "%s: looped route\n", dev->name); + tunnel->stat.collisions++; + goto tx_error; + } + + mtu = rt->u.dst.pmtu - (cipehdrlen+cipefootlen); + if (tunnel->sockshost) + mtu -= sizeof(struct sockshdr); + + dprintk(DEB_OUT, (KERN_DEBUG "pmtu=%d dmtu=%d size=%d\n", + mtu, tdev->mtu, skb->len)); + + if (mtu < 68) { + printk(KERN_ERR "%s: MTU too small\n", dev->name); + tunnel->stat.collisions++; + goto tx_error; + } + if (skb->dst && mtu < skb->dst->pmtu) { + skb->dst->pmtu = mtu; + dprintk(DEB_OUT, (KERN_NOTICE "%s: adjusting PMTU\n", dev->name)); +#if 0 + /* TEST: is this OK? */ + icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); + goto tx_error; +#endif + } + + if ((old_iph->frag_off&__constant_htons(IP_DF)) && mtu < ntohs(old_iph->tot_len)) { + dprintk(DEB_OUT, (KERN_NOTICE "%s: fragmentation needed\n", dev->name)); + icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); + goto tx_error; + } + +#if 0 + if (tunnel->err_count > 0) { + if (jiffies - tunnel->err_time < IPTUNNEL_ERR_TIMEO) { + tunnel->err_count--; + dst_link_failure(skb); + } else + tunnel->err_count = 0; + } +#endif + +#ifdef DEBUG + if (cipe_debug&DEB_PKOU) + cipe_dump_packet("original", skb); +#endif + + max_headroom = (((tdev->hard_header_len+15)&~15)+cipehdrlen+ + ((tunnel->sockshost) ? sizeof(struct sockshdr) : 0)); + max_tailroom = (tunnel->havekey) ? cipefootlen : 0; + { + unsigned long offset; + struct sk_buff *n= + alloc_skb(skb->len+max_headroom+max_tailroom, GFP_ATOMIC); + if (!n) { + printk(KERN_INFO "%s: Out of memory, dropped packet\n", + dev->name); + goto tx_error; + } + skb_reserve(n, max_headroom); + /* Copy the packet over. From skb_realloc_headroom() */ + offset=n->data-skb->data; + skb_put(n,skb->len); + /* Copy the bytes */ + memcpy(n->data,skb->data,skb->len); + n->list=NULL; + n->sk=NULL; + n->priority=skb->priority; + n->protocol=skb->protocol; + n->dev=skb->dev; + n->dst=dst_clone(skb->dst); + n->h.raw=skb->h.raw+offset; + n->nh.raw=skb->nh.raw+offset; + n->mac.raw=skb->mac.raw+offset; + memcpy(n->cb, skb->cb, sizeof(skb->cb)); + n->used=skb->used; + n->is_clone=0; + atomic_set(&n->users, 1); + n->pkt_type=skb->pkt_type; + n->stamp=skb->stamp; + n->destructor = NULL; + n->security=skb->security; + + dev_kfree_skb(skb); + skb = n; + } + + memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); + dst_release(skb->dst); + skb->dst = &rt->u.dst; + skb->protocol = htons(ETH_P_IP); + + if (tunnel->havekey) { +#ifndef VER_SHORT + /* Add an IV */ + cipe_cryptpad(skb_push(skb, blockSize)); + length+=blockSize; +#endif + cipe_encrypt(tunnel, skb->data, &length, TW_DATA); + /* This is incorrect - the tail room gets first used and then + reserved. Doesn't matter in the current (2.0.29) implementation + of skb_put though. Alternative solution would ruin the nice + module separation - we don't need to know the real amount + of padding here. */ + (void) skb_put(skb, length-skb->len); + } else if (!tunnel->mayclear) { + goto tx_error; + } + + if (tunnel->sockshost) { + /* Install a SOCKS header */ + struct sockshdr *sh = (struct sockshdr *) + skb_push(skb, sizeof(struct sockshdr)); + memset(sh, 0, 4); + sh->atyp=1; + /* sockshost and socksport contain the real peer's address + and the configured/guessed peer is really the socks relayer! */ + sh->dstaddr=tunnel->sockshost; + sh->dstport=tunnel->socksport; + length+=sizeof(struct sockshdr); + } + + /* Install our new headers */ + udph = (struct udphdr *) skb_push(skb, sizeof(struct udphdr)); + /*** skb->nh.raw = */ + iph = skb->nh.iph = (struct iphdr *) skb_push(skb, sizeof(struct iphdr)); + + /* + * Push down and install the CIPE/UDP header. + */ + iph->version = 4; + iph->ihl = sizeof(struct iphdr)>>2; + iph->tos = tos; + iph->tot_len = htons(skb->len); + iph->id = htons(ip_id_count++); + iph->frag_off = old_iph->frag_off&__constant_htons(IP_DF); + iph->ttl = tunnel->cttl ? tunnel->cttl : old_iph->ttl; + iph->protocol = IPPROTO_UDP; + iph->saddr = rt->rt_src; + iph->daddr = rt->rt_dst; + + ip_send_check(iph); + + udph->source = tunnel->myport; + udph->dest = tunnel->peerport; + udph->len = htons(length+sizeof(struct udphdr)); + /* Encrypted packets are checksummed already, so we can safely + ignore the UDP checksum */ + udph->check = 0; + + tunnel->stat.tx_bytes += skb->len; + tunnel->stat.tx_packets++; + dprintk(DEB_OUT, (KERN_INFO + "%s: sending %d from %08lX:%d to %08lX:%d\n", + dev->name, skb->len, + ntohl(iph->saddr), ntohs(udph->source), + ntohl(iph->daddr), ntohs(udph->dest))); +#if 0 + dprintk(DEB_OUT, (KERN_INFO "dst: (%d,%d) %s %d %d\n", + skb->dst->refcnt, skb->dst->use, + skb->dst->dev->name, skb->dst->pmtu, + skb->dst->error)); +#endif +#ifdef DEBUG + if (cipe_debug&DEB_PKOU) + cipe_dump_packet("sending", skb); +#endif + ip_send(skb); + ip_rt_put(rt); + tunnel->recursion--; + return 0; + + tx_error_icmp: + dst_link_failure(skb); + tx_error: + ip_rt_put(rt); + tunnel->stat.tx_errors++; + dev_kfree_skb(skb); + tunnel->recursion--; + return 0; +} + +#else /* LINUX_21 */ + +/* An adapted version of Linux 2.0 drivers/net/new_tunnel.c. */ + +#ifdef SO_BINDTODEVICE + #define iproute(t,o,d) ip_rt_route(t,o,d) +#else + #define iproute(t,o,d) ip_rt_route(t,o) +#endif + +#if LINUX_VERSION_CODE < 131102 /* < 2.0.30 */ + #include <linux/config.h> + #ifdef CONFIG_IP_FORWARD + #define ipforward(s,d,o,t) ip_forward(s,d,o,t) + #else + #error "Requires IP forwarding enabled in kernel" + #endif +#else /* >= 2.0.30 */ + #define ipforward(s,d,o,t) (sysctl_ip_forward ? ip_forward(s,d,o,t) : -1) +#endif + +int cipe_xmit(struct sk_buff *skb, struct device *dev) +{ + struct enet_statistics *stats; /* This device's statistics */ + struct rtable *rt; /* Route to the other host */ + struct device *tdev; /* Device to other host */ + struct iphdr *iph; /* Our new IP header */ + struct udphdr *udph; + __u32 target; /* The other host's IP address */ + int max_headroom; /* The extra header space needed */ + int max_tailroom; + int tos, ttl, length; + DEVTOCIPE(dev,c,0); + + if (skb == NULL || dev == NULL) { + dprintk1(DEB_OUT, KERN_INFO, "%s: nothing to do\n", dev->name); + return 0; + } + + /* + * Make sure we are not busy (check lock variable) + */ + stats = &(c->stat); + if (dev->tbusy != 0) + { + printk(KERN_WARNING "%s: device timeout (really possible?)\n", + dev->name); + dev->tbusy=0; + stats->tx_errors++; + return(1); + } + +#ifdef DEBUG + if (cipe_debug&DEB_PKOU) + cipe_dump_packet("original", skb); +#endif + /* + * First things first. Look up the destination address in the + * routing tables + */ + target = c->peeraddr; + if ((!target) || (!c->peerport) || (!c->myport)) { + /* unconfigured device */ + printk(KERN_INFO "%s: unconfigured\n", dev->name); + goto error; + } + if ((rt = iproute(target, 0, skb->sk?skb->sk->bound_device:NULL)) == NULL) + { + /* No route to host */ + printk(KERN_INFO "%s: target unreachable\n", dev->name); + goto error; + } + dprintk5(DEB_OUT, KERN_INFO, + "%s: routing to %08lX from %08lX via %08lX dev %s\n", + dev->name, ntohl(rt->rt_dst), ntohl(rt->rt_src), + ntohl(rt->rt_gateway), rt->rt_dev->name); + + tdev = rt->rt_dev; + ip_rt_put(rt); + + if (tdev == dev) + { + /* Tunnel to ourselves? -- I don't think so. */ + printk ( KERN_INFO "%s: Packet targetted at myself!\n" , dev->name); + goto error; + } + + /* + * Okay, now see if we can stuff it in the buffer as-is. We can not. + */ + max_headroom = (((tdev->hard_header_len+15)&~15)+cipehdrlen+ + ((c->sockshost) ? sizeof(struct sockshdr) : 0)); + max_tailroom = (c->havekey) ? cipefootlen : 0; + { + struct sk_buff *new_skb; + + if ( !(new_skb = + dev_alloc_skb(skb->len+max_headroom+max_tailroom)) ) + { + printk(KERN_INFO "%s: Out of memory, dropped packet\n", + dev->name); + dev->tbusy = 0; + stats->tx_dropped++; + dev_kfree_skb(skb, FREE_WRITE); + return 0; + } + new_skb->free = 1; + + /* + * Reserve space for our header and the lower device header + */ + skb_reserve(new_skb, max_headroom); + + /* + * Copy the old packet to the new buffer. + * Note that new_skb->h.iph will be our (tunnel driver's) header + * and new_skb->ip_hdr is the IP header of the old packet. + */ + new_skb->ip_hdr = (struct iphdr *) skb_put(new_skb, skb->len); + new_skb->mac.raw = new_skb->data; + new_skb->dev = skb->dev; + memcpy(new_skb->ip_hdr, skb->data, skb->len); + memset(new_skb->proto_priv, 0, sizeof(skb->proto_priv)); + + /* Free the old packet, we no longer need it */ + dev_kfree_skb(skb, FREE_WRITE); + skb = new_skb; + } + + tos = skb->ip_hdr->tos; + ttl = skb->ip_hdr->ttl; + length = skb->len; + if (c->havekey) { +#ifndef VER_SHORT + /* Add an IV */ + cipe_cryptpad(skb_push(skb, blockSize)); + length+=blockSize; +#endif + cipe_encrypt(c, skb->data, &length, TW_DATA); + /* This is incorrect - the tail room gets first used and then + reserved. Doesn't matter in the current (2.0.29) implementation + of skb_put though. Alternative solution would ruin the nice + module separation - we don't need to know the real amount + of padding here. */ + (void) skb_put(skb, length-skb->len); + } else if (!c->mayclear) { + goto error; + } + + if (c->sockshost) { + /* Install a SOCKS header */ + struct sockshdr *sh = (struct sockshdr *) + skb_push(skb, sizeof(struct sockshdr)); + memset(sh, 0, 4); + sh->atyp=1; + /* sockshost and socksport contain the real peer's address + and the configured/guessed peer is really the socks relayer! */ + sh->dstaddr=c->sockshost; + sh->dstport=c->socksport; + length+=sizeof(struct sockshdr); + } + + /* Install our new headers */ + udph = (struct udphdr *) skb_push(skb, sizeof(struct udphdr)); + skb->h.iph = (struct iphdr *) skb_push(skb, sizeof(struct iphdr)); + + /* + * Push down and install the CIPE/UDP header. + */ + + iph = skb->h.iph; + iph->version = 4; + iph->tos = tos; + + /* In new_tunnel.c, we use the original packet's TTL here. + Setting a new TTL behaves better to the user, and RFC2003 + recommends it too. But this doesn't fully protect against + routing loops. So make it configurable via an argument: + "cttl" gives the TTL value; if 0 use the packet's + value. Default should be 64, as with the other protocols + (ip_statistics.IpDefaultTTL, but this variable is not + available for modules). */ + + iph->ttl = c->cttl ? c->cttl : ttl; + + iph->frag_off = 0; + iph->daddr = target; + iph->saddr = c->myaddr; /* tdev->pa_addr; */ + iph->protocol = IPPROTO_UDP; + iph->ihl = 5; + iph->tot_len = htons(skb->len); + iph->id = htons(ip_id_count++); /* Race condition here? */ + ip_send_check(iph); + + udph->source = c->myport; + udph->dest = c->peerport; + udph->len = htons(length+sizeof(struct udphdr)); + /* Encrypted packets are checksummed already, so we can safely + ignore the UDP checksum */ + udph->check = 0; + + skb->ip_hdr = skb->h.iph; + skb->protocol = htons(ETH_P_IP); + + /* + * Send the packet on its way! + * Note that dev_queue_xmit() will eventually free the skb. + * If ip_forward() made a copy, it will return 1 so we can free. + */ + + dprintk3(DEB_OUT, KERN_INFO, "%s: send to %08lX via %s\n", + dev->name, ntohl(target), tdev->name); + +#ifdef DEBUG + if (cipe_debug&DEB_PKOU) + cipe_dump_packet("sending", skb); +#endif + switch (ipforward(skb, dev, IPFWD_NOTTLDEC, target)) { + case -1: + printk(KERN_INFO "%s: forwarding failed\n", dev->name); + /* fall thru */ + case 1: + dev_kfree_skb(skb, FREE_WRITE); + /* Does it really need dev_ here? I think so. */ + break; + default: + /* nothing to do */ + } + + /* + * Clean up: We're done with the route and the packet + */ + + /* Record statistics and return */ + stats->tx_packets++; + dev->tbusy=0; + return 0; + + error: + stats->tx_errors++; + dev_kfree_skb(skb, FREE_WRITE); + dev->tbusy=0; + return 0; +} + +#endif /* LINUX_21 */ diff -urN lin.2.2.17/net/cipe/samples/README int.2.2.17.x/net/cipe/samples/README --- lin.2.2.17/net/cipe/samples/README Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/samples/README Sat Oct 14 00:48:17 2000 @@ -0,0 +1 @@ +Here are samples for the files that go into /etc/cipe. diff -urN lin.2.2.17/net/cipe/samples/ip-down int.2.2.17.x/net/cipe/samples/ip-down --- lin.2.2.17/net/cipe/samples/ip-down Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/samples/ip-down Sat Oct 14 00:48:17 2000 @@ -0,0 +1,18 @@ +#!/bin/sh +# ip-down <interface> <myaddr> <daemon-pid> <local> <remote> <arg> + +# Sample of the ip-down script. +# This is called with the same arguments as ip-up after the device was +# closed. It can be used for removing proxyarps, or (like here) +# for logging purposes, etc. + +# Logging example +echo "DOWN $*" >> /var/adm/cipe.log + +# remove the daemon pid file +rm -f /var/run/$1.pid + +# If the system runs gated, tell it what has happened +#gdc interface + +exit 0 diff -urN lin.2.2.17/net/cipe/samples/ip-up int.2.2.17.x/net/cipe/samples/ip-up --- lin.2.2.17/net/cipe/samples/ip-up Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/samples/ip-up Sat Oct 14 00:48:17 2000 @@ -0,0 +1,59 @@ +#!/bin/sh +# ip-up <interface> <myaddr> <daemon-pid> <local> <remote> <arg> + +# Sample of the ip-up script. +# This is called when the CIPE interface is opened. +# Arguments: +# $1 interface the CIPE interface +# $2 myaddr our UDP address +# $3 daemon-pid the daemon's process ID +# $4 local IP address of our CIPE device +# $5 remote IP address of the remote CIPE device +# $6 arg argument supplied via options + +# Purposes for this script: set up routes, set up proxy-arps, etc. +# start daemons, logging... + +umask 022 +PATH=/sbin:/bin:/usr/sbin:/usr/bin + +case `uname -r` in +2.0*) + # Under Linux 2.0, a minimal route to the remote CIPE is needed. + # 2.1/2.2 sets this one by itself. + route add -host $5 dev $1 + ;; +esac + +# If this becomes our default route... +#route add default gw $5 + +# just a logging example +echo "UP $*" >> /var/adm/cipe.log + +# many systems like these pid files +echo $3 > /var/run/$1.pid + +# Trigger the key exchange procedure, useful when we're using SOCKS +# This _must_ run delayed and in the background +#(sleep 10; ping -c5 $5) & + +# If the system runs gated, tell it what has happened +#gdc interface + +# The following are just ideas for further consideration + +# Interconnect two 10. subnets through the Internet! +# Assuming $4 is in 10.1 and $5 in 10.2 +#route add -net 10.2.0.0 netmask 255.255.0.0 gw $5 + +# Proxy-ARP the peer's address on eth0 +#arp -i eth0 -Ds $5 eth0 pub + +# Evil tricks department: masquerade the CIPE peer's /24 network to our IP +#NA=`expr $5 : '\([0-9]*\.[0-9]*\.[0-9]*\.\)'` +#ipfwadm -F -a accept -m -b -S $NA.0/24 -D 0.0.0.0/0 +# the usual way for this would be a case selection on $5 or $6, however + + +exit 0 diff -urN lin.2.2.17/net/cipe/samples/options int.2.2.17.x/net/cipe/samples/options --- lin.2.2.17/net/cipe/samples/options Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/samples/options Sat Oct 14 00:48:17 2000 @@ -0,0 +1,18 @@ +# Surprise, this file allows comments (but only on a line by themselves) + +# This is probably the minimal set of options that has to be set + +# Without a "device" line, the device is picked dynamically + +# the peer's IP address +ptpaddr 6.5.4.3 +# our CIPE device's IP address +ipaddr 6.7.8.9 +# my UDP address. Note: if you set port 0 here, the system will pick +# one and tell it to you via the ip-up script. Same holds for IP 0.0.0.0. +me bigred.inka.de:6789 +# ...and the UDP address we connect to. Of course no wildcards here. +peer blackforest.inka.de:6543 +# The static key. Keep this file secret! +# The key is 128 bits in hexadecimal notation. +key 3248fd20adf9c00ccf9ecc2393bbb3e4 diff -urN lin.2.2.17/net/cipe/sock.c int.2.2.17.x/net/cipe/sock.c --- lin.2.2.17/net/cipe/sock.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/sock.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,650 @@ +/* + CIPE - encrypted IP over UDP tunneling + + sock.c - socket/input interface + + Copyright 1996 Olaf Titz <olaf@bigred.inka.de> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ +/* $Id: sock.c,v 1.18.2.2 1999/04/29 09:32:43 olaf Exp $ */ + +#include "cipe.h" + +#include <linux/config.h> +#include <linux/if.h> +#include <linux/sched.h> +#include <net/sock.h> +#include <net/ip.h> +#ifdef LINUX_21 +#include <asm/uaccess.h> +#else +typedef unsigned short mm_segment_t; +#endif + +#ifdef LINUX_21 +#define kfreeskb(s,t) kfree_skb(s) +#define saddr(skb) ((skb)->nh.iph->saddr) +#define daddr(skb) ((skb)->nh.iph->daddr) +#else +#define kfreeskb(s,t) kfree_skb(s,t) +#define saddr(skb) ((skb)->saddr) +#define daddr(skb) ((skb)->daddr) +#endif + +/* Rewire generic socket operations to our device-specific ones. + We have new routines for close, sendmsg, recvmsg. */ + +/* init struct cipe *c based on struct sock *sk */ +#ifdef LINUX_21 + +#define SOCKTOC(nam,sk,c,r) \ + struct cipe *c=(struct cipe *)sk->user_data; \ + if ((!c) || (c->magic!=CIPE_MAGIC)) { \ + printk(KERN_ERR "Ouch: SOCKTOC" nam "\n"); return r; } \ + else { \ + dprintk(DEB_CALL, (KERN_INFO "%s: " nam "\n", c->dev->name)); } + +#else + +#define SOCKTOC(nam,sk,c,r) \ + struct cipe *c=(struct cipe *)sk->protinfo.af_packet.bound_dev; \ + if ((!c) || (c->magic!=CIPE_MAGIC)) { \ + printk(KERN_ERR "Ouch: SOCKTOC" nam "\n"); return r; } \ + else { \ + dprintk(DEB_CALL, (KERN_INFO "%s: " nam "\n", c->dev->name)); } + +#endif + +/* Close the socket */ +void cipe_sock_close(struct sock *sock, timeout_t timeout) +{ + SOCKTOC("sock_close",sock,c,); + c->sock=NULL; + + /* Put back the old protocol block and let it do the close */ + sock->prot=c->udp_prot; + sock->prot->close(sock, timeout); + if (c->dev->flags&IFF_UP) + dev_close(c->dev); + else + cipe_close(c); + cipe_unuse_module(); +} + +/* Anything we send to this socket is in fact a key exchange block. + Encode and encrypt it accordingly. +*/ +int cipe_sendmsg(struct sock *sock, struct msghdr *msg, int len +#ifndef LINUX_21 + , int nonblock, int flags +#endif + ) +{ + struct msghdr mymsg; + struct iovec myio[2]; + struct sockaddr_in sa; + struct sockshdr sh; + int e, n=0; + unsigned char buf[KEYXCHGBLKMAX+blockSize]; + SOCKTOC("cipe_sendmsg",sock,c,-ENOSYS); + + if (len>KEYXCHGBLKMAX) + return -EMSGSIZE; + cipe_prnpad(buf, sizeof(buf)); +#ifdef VER_SHORT + memcpy_fromiovec(buf, msg->msg_iov, len); +#else + memcpy_fromiovec(buf+blockSize, msg->msg_iov, len); + len+=blockSize; +#endif + if (buf[0 +#ifndef VER_SHORT + +blockSize +#endif + ]>=CT_DUMMY) { + if (!c->havekey) + return -EINVAL; + buf[KEYXCHGTSPOS-1]='\0'; + } else { + if (len<KEYXCHGBLKMIN) + return -EINVAL; + } + (*(__u32 *)(buf+KEYXCHGTSPOS))=htonl(CURRENT_TIME); /* timestamp */ + len=KEYXCHGBLKMIN+buf[sizeof(buf)-1]; /* random */ + cipe_encrypt(c, buf, &len, TW_NEWKEY); + + sa.sin_family=AF_INET; + sa.sin_addr.s_addr=c->peeraddr; + sa.sin_port=c->peerport; + + if (c->sockshost) { + /* Prepend a socks header. */ + memset(&sh, 0, 4); + sh.atyp=1; + sh.dstaddr=c->sockshost; + sh.dstport=c->socksport; + myio[n].iov_base=&sh; + myio[n].iov_len=sizeof(sh); + ++n; + } + myio[n].iov_base=&buf; + myio[n].iov_len=len; + /* mymsg=*msg; */ + mymsg.msg_name=&sa; + mymsg.msg_namelen=sizeof(sa); + mymsg.msg_iov=myio; + mymsg.msg_iovlen=n+1; + /* just to be sure */ + mymsg.msg_control=NULL; + mymsg.msg_controllen=0; + mymsg.msg_flags=0; + + /* Call the real thing. Pretend this is user space segment. */ + { + mm_segment_t fs=get_fs(); + set_fs(get_ds()); + if (c->sockshost) + len+=sizeof(struct sockshdr); + dprintk(DEB_KXC, (KERN_INFO "%s: real sendmsg len %d text=%04x...\n", + c->dev->name, len, + ntohs(*((unsigned short *)(myio[n].iov_base))))); + e=c->udp_prot->sendmsg(sock, &mymsg, len +#ifndef LINUX_21 + , nonblock, flags +#endif + ); + set_fs(fs); + } + return e; +} + +/* Check if we have a new peer (socks relayer changed, etc) */ +static void checkpeer(struct cipe *c, __u32 saddr, __u16 sport) +{ + if (c->peeraddr!=saddr || c->peerport!=sport) { + unsigned char *x=(unsigned char *)&saddr; + c->peeraddr=saddr; + c->peerport=sport; + printk(KERN_NOTICE "%s: new peer %d.%d.%d.%d:%d\n", + c->dev->name, x[0], x[1], x[2], x[3], ntohs(sport)); + } +} + +/* Decrypt a received packet. Requeue it or return kxc block. */ +/* On entry the packet starts with the original IP header (?), + ip_hdr and h.uh are set to the IP and UDP headers. */ +struct sk_buff *cipe_decrypt_skb(struct cipe *c, struct sock *sk, + struct sk_buff *skb, int *offset, + int *msgflag) +{ + struct sk_buff *n; + int length; + __u32 rsaddr; + __u16 rsport; + +#ifdef DEBUG + if (cipe_debug&DEB_PKIN) + cipe_dump_packet("received", skb); +#endif + n=alloc_skb(skb->len, GFP_KERNEL); + if (!n) { + printk(KERN_WARNING "%s: cipe_decrypt_skb(): out of memory\n", + c->dev->name); + ++c->stat.rx_dropped; + return NULL; + } + n->sk=NULL; +#ifndef LINUX_21 + n->free=1; +#endif + n->dev=c->dev; + + length=ntohs(skb->h.uh->len)-sizeof(struct udphdr); +#if 0 /* UDP should check this */ + if (length!=skb->len-sizeof(struct udphdr)) { + dprintk(DEB_INP, (KERN_INFO "%s: bogus UDP length (%d/%d)\n", + c->dev->name, length, + skb->len-sizeof(struct udphdr))); + goto framerr; + } +#endif + + /* Copy the datagram into new buffer, skip IP header */ + /* We must copy here because raw sockets get only a clone of the + skbuff, so they would receive the plaintext */ + dprintk(DEB_INP, (KERN_INFO DEVNAME + ": sa=%08lX da=%08lX us=%d ud=%d ul=%d\n", + ntohl(saddr(skb)), ntohl(daddr(skb)), + ntohs(skb->h.uh->source), ntohs(skb->h.uh->dest), + ntohs(skb->h.uh->len))); + + /* why did this get swapped?? */ +#ifdef LINUX_21 + rsaddr=saddr(skb); +#else + rsaddr=daddr(skb); +#endif + rsport=skb->h.uh->source; + skb_put(n,skb->len); + memcpy(n->data, skb->h.raw, skb->len); + /*n->ip_hdr=NULL;*/ + n->h.uh=(struct udphdr *)n->data; +#if 0 + dprintk4(DEB_INP, KERN_INFO, "UDP: s=%d d=%d l=%d c=%04X\n", + ntohs(n->h.uh->source), ntohs(n->h.uh->dest), + ntohs(n->h.uh->len), n->h.uh->check); +#endif + + if (c->sockshost) { + /* Pull out the SOCKS header and correct the peer's address. */ + struct sockshdr *sh; + sh=(struct sockshdr *)skb_pull(n, sizeof(struct udphdr)); + dprintk(DEB_INP, (KERN_INFO "socks: fr=%d at=%d da=%08lX dp=%d\n", + sh->frag, sh->atyp, + ntohl(sh->dstaddr), ntohs(sh->dstport))); + if (sh->frag || (sh->atyp!=1)) + goto error; + /* Pull out UDP header */ +#ifdef LINUX_21 + n->nh.iph=(struct iphdr *)skb_pull(n, sizeof(struct sockshdr)); +#else + n->ip_hdr=(struct iphdr *)skb_pull(n, sizeof(struct sockshdr)); +#endif + /***saddr(n)=sh->dstaddr;*/ + n->h.uh->source=sh->dstport; + length-=sizeof(struct sockshdr); + *offset=sizeof(struct sockshdr)+sizeof(struct udphdr); + } else { + /* Pull out UDP header */ +#ifdef LINUX_21 + n->nh.iph=(struct iphdr *) skb_pull(n, sizeof(struct udphdr)); +#else + n->ip_hdr=(struct iphdr *) skb_pull(n, sizeof(struct udphdr)); +#endif + /***saddr(n)=rsaddr;*/ + n->h.uh->source=rsport; + *offset=sizeof(struct udphdr); + } + + if (c->havekey) { + switch (cipe_decrypt(c, n->data, &length)) { + case TW_DATA: + break; + case TW_CTRL: + /* return it as a control block - out of band datagram */ + *msgflag|=MSG_OOB; + /* fall thru */ + case TW_NEWKEY: + /* return it as key exchange block - proper UDP datagram */ + skb_trim(n, length); + checkpeer(c, rsaddr, rsport); +#if 0 + n->saddr=c->myaddr; + n->daddr=c->peeraddr; +#endif + n->h.uh->check=0; + return n; + default: + /* Bogus packet etc. */ + ++c->stat.rx_crc_errors; + goto error; + } + } else if (!c->mayclear) { + goto error; + } + + skb_trim(n, length); + checkpeer(c, rsaddr, rsport); + /* adjust pointers */ +#ifdef LINUX_21 + n->nh.iph=(struct iphdr *)n->data; + memset(&(IPCB(n)->opt), 0, sizeof(IPCB(n)->opt)); +#else + n->h.iph=(struct iphdr *)n->data; + memset(n->proto_priv, 0, sizeof(struct options)); +#endif + + n->mac.raw=n->data; /* no hardware header */ + n->protocol = htons(ETH_P_IP); + n->ip_summed = 0; +#ifdef DEBUG + if (cipe_debug&DEB_INP) { +#ifdef LINUX_21 + unsigned char *x=(unsigned char *)&(saddr(n)); +#else + unsigned char *x=n->data; +#endif + printk(KERN_INFO + "%s: real src %d.%d.%d.%d dst %d.%d.%d.%d len %d\n", + n->dev->name, + x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], length); + } +#endif + +#ifdef DEBUG + if (cipe_debug&DEB_PKIN) + cipe_dump_packet("decrypted", n); +#endif + /* requeue */ + netif_rx(n); +#ifdef LINUX_21 + c->stat.rx_bytes+=skb->len; /* count carrier-level bytes */ +#endif + c->stat.rx_packets++; + return NULL; + +#if 0 + framerr: + ++c->stat.rx_frame_errors; /* slightly abuse this */ +#endif + error: + ++c->stat.rx_errors; + /*n->sk=NULL;*/ + kfreeskb(n, FREE_READ); + return NULL; +} + +/* Receive message. If encrypted, put it through the mill. + If decrypted, return it as key exchange block. + This is mostly from net/ipv4/udp.c, but cipe_decrypt_skb pulls the + UDP header. +*/ + +int cipe_recvmsg(struct sock *sk, struct msghdr *msg, int len, + int noblock, int flags,int *addr_len) +{ + int copied; + struct sk_buff *skb, *skn; + int er=0, of; + struct sockaddr_in *sin=(struct sockaddr_in *)msg->msg_name; + SOCKTOC("cipe_recvmsg",sk,c,-ENOSYS); + + /* + * Check any passed addresses + */ + + if (addr_len) + *addr_len=sizeof(*sin); + + /* + * From here the generic datagram does a lot of the work. Come + * the finished NET3, it will do _ALL_ the work! + */ + + do { + /* CIPE: look if the packet is encrypted, repeat until + a decrypted one is found */ + skn=NULL; + skb=skb_recv_datagram(sk,flags,noblock,&er); + if(skb==NULL) { + dprintk(DEB_KXC, (KERN_INFO "%s: skb_recv_datagram: %d\n", + c->dev->name, er)); + return er; + } + + if (!skb->h.uh->source) { + /* Synthetic KXC packets are marked by source port 0. + Correct this - we know the truth from our structure. + Perhaps it would be better to not correct it so the + user level daemon can spot the difference? */ + skb->h.uh->source=c->peerport; + of=skb->data-skb->head+sizeof(struct udphdr); + break; + } + skn=cipe_decrypt_skb(c, sk, skb, &of, &(msg->msg_flags)); + dprintk(DEB_INP, (KERN_INFO "%s: returning %d flags %d\n", + c->dev->name, skb->len, msg->msg_flags)); + skb_free_datagram(sk, skb); + skb=skn; + } while (skb==NULL); + + copied = skb->len; + if (copied > len) + { + copied = len; +#ifdef LINUX_21 + msg->msg_flags |= MSG_TRUNC; +#endif + } + + /* + * FIXME : should use udp header size info value + */ +#ifdef LINUX_21 + er = skb_copy_datagram_iovec(skb,of,msg->msg_iov,copied); + if (er<0) + goto out_free; +#else + skb_copy_datagram_iovec(skb,of,msg->msg_iov,copied); +#endif + sk->stamp=skb->stamp; + + /* Copy the address. */ + if (sin +#ifdef LINUX_21 + && skb->nh.iph /* Fake KXC has no address */ +#endif + ) { + sin->sin_family = AF_INET; + sin->sin_port = skb->h.uh->source; + sin->sin_addr.s_addr = daddr(skb); +#ifdef CONFIG_IP_TRANSPARENT_PROXY + /* Does this ever apply here? */ + if (flags&MSG_PROXY) + { + /* + * We map the first 8 bytes of a second sockaddr_in + * into the last 8 (unused) bytes of a sockaddr_in. + * This _is_ ugly, but it's the only way to do it + * easily, without adding system calls. + */ + struct sockaddr_in *sinto = + (struct sockaddr_in *) sin->sin_zero; + + sinto->sin_family = AF_INET; + sinto->sin_port = skb->h.uh->dest; + sinto->sin_addr.s_addr = saddr(skb); + } +#endif + } + er=copied; + +#ifdef LINUX_21 + out_free: +#endif + if (skb==skn) + /* the buffer was a copy made by decryption */ + kfreeskb(skb, FREE_READ); + else + skb_free_datagram(sk, skb); + + return(er); +} + +#ifdef LINUX_21 + +#include <linux/file.h> + +int cipe_attach(struct device *dev, struct siocsifcipatt *parm) +{ + struct file *file; + struct inode *inode; + struct socket *sock; + struct sock *sk; + struct cipe *c0; + DEVTOCIPE(dev,c,-ENODEV); + + if (c->sock) + return -EBUSY; + if (!(file=fget(parm->fd))) + return(-EBADF); + inode = file->f_dentry->d_inode; + if (!inode || !inode->i_sock || !(sock=&inode->u.socket_i)) { + fput(file); + return(-ENOTSOCK); + } + if (sock->file != file) { + printk(KERN_ERR DEVNAME ": socki_lookup: socket file changed!\n"); + sock->file = file; + } + + fput(file); + if (sock->type!=SOCK_DGRAM) + return(-ESOCKTNOSUPPORT); + if (sock->ops->family!=AF_INET) + return(-EAFNOSUPPORT); + + sk=sock->sk; + if (sk->state!=TCP_ESTABLISHED) + return(-ENOTCONN); + if (((c0=(struct cipe *)sk->user_data)) && + (c0->magic==CIPE_MAGIC)) + return(-EBUSY); /* socket is already attached */ + + cipe_use_module(); + c->sock=sk; + c->peeraddr=sk->daddr; + c->peerport=sk->dport; + c->myaddr=sk->saddr; + c->myport=htons(sk->num); + /* Disconnect socket, we might receive from somewhere else */ + sk->daddr=0; + sk->dport=0; + + /* Fill an otherwise unused field in the sock struct with this info. + This field is conveniently named and the kernel uses it only for RPC. */ + sk->user_data=c; + sk->no_check=1; /* our packets are checksummed internally */ + + /* Set up new socket operations */ + c->udp_prot=sk->prot; + c->cipe_proto=*sk->prot; + c->cipe_proto.close=cipe_sock_close; + c->cipe_proto.sendmsg=cipe_sendmsg; + c->cipe_proto.recvmsg=cipe_recvmsg; + sk->prot=&c->cipe_proto; + + return(0); +} + + +#else /* LINUX_21 */ + +#define sreturn(x) {sti(); return((x));} + +int cipe_attach(struct device *dev, struct siocsifcipatt *parm) +{ + struct file *file; + struct inode *inode; + struct socket *sock; + struct sock *sk; + int fd=parm->fd; + struct cipe *c0; + DEVTOCIPE(dev,c,-ENODEV); + cli(); + if (c->sock) + sreturn(-EBUSY); + + /* Find the socket (from net/socket.c) */ + if (fd < 0 || fd >= NR_OPEN || !(file = current->files->fd[fd])) + sreturn(-EBADF); + inode = file->f_inode; + if (!inode || !inode->i_sock) + sreturn(-ENOTSOCK); + sock=&inode->u.socket_i; + if (sock->type!=SOCK_DGRAM) + sreturn(-ESOCKTNOSUPPORT); + if (sock->ops->family!=AF_INET) + sreturn(-EAFNOSUPPORT); + sk=(struct sock *)sock->data; + if (sk->state!=TCP_ESTABLISHED) + sreturn(-ENOTCONN); + if (((c0=(struct cipe *)sk->protinfo.af_packet.bound_dev)) && + (c0->magic==CIPE_MAGIC)) + sreturn(-EBUSY); /* socket is already attached */ + + cipe_use_module(); + c->sock=sk; + c->peeraddr=sk->daddr; + c->peerport=sk->dummy_th.dest; + c->myaddr=sk->saddr; + c->myport=sk->dummy_th.source; + /* Disconnect socket, we might receive from somewhere else */ + sk->daddr=0; + sk->dummy_th.dest=0; + + /* Set up new socket operations */ + c->udp_prot=sk->prot; + c->cipe_proto=*sk->prot; + c->cipe_proto.close=cipe_sock_close; + c->cipe_proto.sendmsg=cipe_sendmsg; + c->cipe_proto.recvmsg=cipe_recvmsg; + sk->prot=&c->cipe_proto; + + /* Fill an otherwise unused field in the sock struct with this info. + Actually, this is very similar to a packet socket! + The ugly cast saves us one deref in the actual ops */ + sk->protinfo.af_packet.bound_dev=(struct device *)c; + sk->no_check=1; /* our packets are checksummed internally */ + + sti(); + return 0; +} + +#endif + + +/* Build and enqueue a fake UDP packet to receive. + Note that these are neither encrypted nor SOCKSed. +*/ +void cipe_fakenkey(struct cipe *c, char typ) +{ + int len=sizeof(struct udphdr)+1; + struct sk_buff *skb=alloc_skb(len, GFP_ATOMIC); + + if (!skb) { + printk(KERN_WARNING "%s: cipe_fakenkey(): out of memory\n", + c->dev->name); + return; /* not much we can do */ + } + + dprintk(DEB_KXC, (KERN_INFO "%s: fake kxc block typ=%d\n", + c->dev->name, typ)); + + skb->sk=NULL; + skb->dev=c->dev; + + skb->h.uh=(struct udphdr *)skb->data; + skb->len=len; +#ifdef LINUX_21 + skb->nh.iph=NULL; +#else + saddr(skb)=c->myaddr; + daddr(skb)=c->peeraddr; + skb->free=1; /* Discard after use */ + skb->ip_hdr=NULL; +#endif + skb->mac.raw=NULL; + + skb->h.uh->source=0; /* mark as KXC packet */ + skb->h.uh->dest=c->myport; + len-=sizeof(struct udphdr); + skb->h.uh->len=len; + skb->h.uh->check=0; + skb->mac.raw=skb->data; /* no hardware header */ + + /* All those contortions for just one byte of payload data. + Since we generate only NK_RREQ and NK_REQ it's effectively + one _bit_... */ + skb->data[sizeof(struct udphdr)]=typ; + + if (sock_queue_rcv_skb(c->sock, skb)<0) { + printk(KERN_WARNING "%s: cipe_fakenkey(): enqueuing failed\n", + c->dev->name); + kfreeskb(skb, FREE_WRITE); + } +} diff -urN lin.2.2.17/net/cipe/socks5.c int.2.2.17.x/net/cipe/socks5.c --- lin.2.2.17/net/cipe/socks5.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/socks5.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,158 @@ +/* + CIPE - encrypted IP over UDP tunneling + + socks5.c - talk to a SOCKS5 server + + Copyright 1997 Olaf Titz <olaf@bigred.inka.de> + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ +/* $Id: socks5.c,v 1.2.2.1 1999/04/27 21:53:22 olaf Exp $ */ + +#include <stdlib.h> +#include <syslog.h> +#include <unistd.h> +#include <netinet/in.h> +#include <sys/socket.h> +#include "ciped.h" + +struct socksrq { + char ver; + char cmd; + char rsv; + char atyp; + unsigned int dstaddr __attribute__((packed)); + unsigned short dstport __attribute__((packed)); +}; + +const char * const socks_errlist[] = { + "Succeeded", + "Server failure", + "Connection not allowed", + "Network unreachable", + "Host unreachable", + "Connection refused", + "TTL expired", + "Command not supported", + "Address type not supported" +}; + +static int readn(int fd, char *b, int n, const char *m) +{ + int p=0, e; + while (p<n) { + if ((e=read(fd, b+p, n-p))<=0) { + logerr(LOG_ERR, m); + return -1; + } + p+=e; + } + return n; +} + +static int writen(int fd, const char *b, int n, const char *m) +{ + int p=0, e; + while (p<n) { + if ((e=write(fd, b+p, n-p))<0) { + logerr(LOG_ERR, m); + return e; + } + p+=e; + } + return n; +} + +int socks5_open(struct sockaddr_in *so) +{ + int e; + char *su=getenv("SOCKS5_USER"); + char *sp=getenv("SOCKS5_PASSWD"); + char buf[520]; + + int fd=socket(AF_INET, SOCK_STREAM, 0); + if (fd<0) { + logerr(LOG_ERR, "socks5_open: socket"); return -1; + } + if (connect(fd, (struct sockaddr *)so, sizeof(*so))<0) { + logerr(LOG_ERR, "socks5_open: connect"); + goto error; + } + if (su) + e=writen(fd, "\005\002\000\002", 4, "socks5_open: winit"); + else + e=writen(fd, "\005\001\000", 3, "socks5_open: winit"); + if (e<0) + goto error; + if (readn(fd, buf, 2, "socks5_open: rinit")<2) + goto error; + + switch (buf[1]) { + case '\000': + break; + case '\002': + { + unsigned char l; + int lu, lp; + + if (!su) su=""; + if (!sp) sp=""; + lu=strlen(su); lu=MIN(lu, 255); + lp=strlen(sp); lp=MIN(lp, 255); + if ((writen(fd, "\001", 1, "socks5_open: wauth1")<0) || + (l=lu, writen(fd, &l, 1, "socks5_open: wauth2")<0) || + (writen(fd, su, lu, "socks5_open: wauth3")<0) || + (l=lp, writen(fd, &l, 1, "socks5_open: wauth4")<0) || + (writen(fd, sp, lp, "socks5_open: wauth5")<0)) + goto error; + if (readn(fd, buf, 2, "socks5_open: rauth")<0) + goto error; + if (buf[1]!=0) { + logs(LOG_ERR, "socks5_open: authentication failed", NULL); + goto error; + } + break; + } + default: + logs(LOG_ERR, "socks5_open: authentication required", NULL); + goto error; + } + return fd; + + error: + close(fd); + return -1; +} + +int socks5_cmd(int fd, int cmd, struct sockaddr_in *so) +{ + struct socksrq r; + r.ver=5; + r.cmd=cmd; + r.rsv=0; + r.atyp=1; + r.dstaddr=so->sin_addr.s_addr; + r.dstport=so->sin_port; + if (writen(fd, (char *)&r, sizeof(r), "socks5_cmd: wcmd")<0) + goto error; + if (readn(fd, (char *)&r, sizeof(r), "socks5_cmd: rreply")<0) + goto error; + if (r.cmd==0) { + if (r.atyp!=1) { + logd(LOG_ERR, "socks5_cmd: unknown address type %d", r.atyp); + goto error; + } + so->sin_addr.s_addr=r.dstaddr; + so->sin_port=r.dstport; + return fd; + } + logs(LOG_ERR, "socks5_cmd: server: %s", + (r.cmd>=sizeof(socks_errlist)) ? + "Unknown error" : socks_errlist[(int)r.cmd]); + error: + close(fd); + return -1; +} diff -urN lin.2.2.17/net/cipe/tcpdump.patch int.2.2.17.x/net/cipe/tcpdump.patch --- lin.2.2.17/net/cipe/tcpdump.patch Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/tcpdump.patch Sat Oct 14 00:48:17 2000 @@ -0,0 +1,39 @@ +With this patch (in libpcap), tcpdump can be used on the CIPE device +so that it shows the traffic going over that device in unencrypted +form. (tcpdump on the device which holds the UDP address will show the +encrypted packets, for obvious reasons.) Similarly, on a conventional +IPIP tunnel, it will show the contents of the packets. + +These are two different patches, one for libpcap 0.3 and one for +libpcap 0.4. Look which one your version of tcpdump uses. + +--- libpcap-0.3/pcap-linux.c.orig Wed Dec 11 08:15:00 1996 ++++ libpcap-0.3/pcap-linux.c Thu Jul 31 10:39:42 1997 +@@ -160,6 +160,10 @@ + p->linktype = DLT_NULL; + p->md.pad = 2; + p->md.skip = 12; ++ } else if (strncmp("tunl", device, 4) == 0) { ++ p->linktype = DLT_RAW; ++ } else if (strncmp("cip", device, 3) == 0) { ++ p->linktype = DLT_RAW; + } else { + sprintf(ebuf, "linux: unknown physical layer type"); + goto bad; + + +--- libpcap-0.4a6/pcap-linux.c.orig Fri Oct 3 07:39:53 1997 ++++ libpcap-0.4a6/pcap-linux.c Mon May 18 11:15:35 1998 +@@ -235,6 +235,11 @@ + break; + #endif + ++ case ARPHRD_TUNNEL: ++ /* XXX I dont know if this is correct but it works for CIPE */ ++ p->linktype = DLT_RAW; ++ break; ++ + #ifdef notdef + case ARPHRD_LOCALTLK: + case ARPHRD_NETROM: + diff -urN lin.2.2.17/net/cipe/thruput.c int.2.2.17.x/net/cipe/thruput.c --- lin.2.2.17/net/cipe/thruput.c Thu Jan 1 01:00:00 1970 +++ int.2.2.17.x/net/cipe/thruput.c Sat Oct 14 00:48:17 2000 @@ -0,0 +1,101 @@ +/* + Primitive TCP speedometer: blast data through the echo port and + count the bytes read and written in a specified amount of time + + One point of data on a 386/25, Linux 2.0.12: 619 kb/s to 127.0.0.1 +*/ + +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <arpa/inet.h> +#include <sys/socket.h> +#include <sys/signal.h> +#include <sys/time.h> + +#define BLKS 65536 + +extern char *optarg; +extern int optind; + +void usage(char *s) +{ + fprintf(stderr, "usage: %s [-t secs] [-u] [-n] addr\n", s); + exit(1); +} + +long rb=0, wb=0; +time_t st; +char rbuf[BLKS], wbuf[BLKS]; +int pr=SOCK_STREAM; + +void shand(int s) +{ + long t=time(0); + printf("Sent %ld bytes, received %ld bytes in %ld seconds\n", wb, rb, + t-st); + if (pr==SOCK_DGRAM) + wb=rb; /* disregard lost datagrams */ + if (t-st) + printf("%ld bytes/sec\n", (wb+rb)/(t-st)); + exit(0); +} + +int main(int argc, char *argv[]) +{ + int sec=60; + int max=BLKS; + int nb=0; + int fd, i; + struct sockaddr_in sa; + fd_set rs, ws; + + while((i=getopt(argc, argv, "t:un"))!=EOF) { + switch(i) { + case 't': sec=atoi(optarg); break; + case 'u': pr=SOCK_DGRAM; max=512; break; + case 'n': ++nb; break; + default: usage(argv[0]); + } + } + if (optind>=argc) + usage(argv[0]); + if ((fd=socket(AF_INET, pr, 0))<0) { + perror("socket"); exit(1); + } + sa.sin_family=AF_INET; + sa.sin_port=htons(7); /* echo */ + sa.sin_addr.s_addr=inet_addr(argv[optind]); + if (connect(fd, (struct sockaddr *)&sa, sizeof(sa))<0) { + perror("connect"); exit(1); + } + if (nb) { + if ((i=fcntl(fd, F_GETFL))<0) + perror("F_GETFL"); + else if (fcntl(fd, F_SETFL, i|O_NONBLOCK)<0) + perror("F_SETFL"); + } + + for (i=0; i<BLKS; ++i) + wbuf[i]=(i&0x3F)+0x20; + st=time(0); + signal(SIGINT, shand); + signal(SIGTERM, shand); + signal(SIGALRM, shand); + signal(SIGHUP, shand); + alarm(sec); + + while(1) { + FD_ZERO(&rs); FD_ZERO(&ws); + FD_SET(fd, &rs); FD_SET(fd, &ws); + if (select(fd+1, &rs, &ws, NULL, NULL)>0) { + if (FD_ISSET(fd, &rs)) + rb+=recv(fd, rbuf, max, 0); + if (FD_ISSET(fd, &ws)) + wb+=send(fd, wbuf, max, 0); + } + } + return 0; +} diff -urN lin.2.2.17/net/core/sock.c int.2.2.17.x/net/core/sock.c --- lin.2.2.17/net/core/sock.c Thu Sep 14 18:18:22 2000 +++ int.2.2.17.x/net/core/sock.c Sat Oct 14 00:48:17 2000 @@ -284,6 +284,16 @@ sk->bsdism = valbool; break; +#ifdef CONFIG_NET_SECURITY + case SO_SECURITY_AUTHENTICATION: + sk->authentication = val; + break; + + case SO_SECURITY_ENCRYPTION_TRANSPORT: + sk->encryption = val; + break; +#endif + case SO_PASSCRED: sock->passcred = valbool; break; @@ -443,6 +453,16 @@ v.val = sk->bsdism; break; +#ifdef CONFIG_NET_SECURITY + case SO_SECURITY_AUTHENTICATION: + v.val = sk->authentication; + break; + + case SO_SECURITY_ENCRYPTION_TRANSPORT: + v.val = sk->encryption; + break; +#endif + case SO_RCVTIMEO: case SO_SNDTIMEO: lv=sizeof(struct timeval); diff -urN lin.2.2.17/net/ipv4/ip_forward.c int.2.2.17.x/net/ipv4/ip_forward.c --- lin.2.2.17/net/ipv4/ip_forward.c Tue Jan 4 19:12:26 2000 +++ int.2.2.17.x/net/ipv4/ip_forward.c Sat Oct 14 00:48:17 2000 @@ -109,7 +109,15 @@ goto local_pkt; #endif +#ifdef CONFIG_NET_SECURITY + /* + * Have to do this before skb_cow() due to + * possibility of interception by ipsec. + */ + if (ip_decrease_ttl(iph) <= 0) +#else if (iph->ttl <= 1) +#endif goto too_many_hops; if (opt->is_strictroute && rt->rt_dst != rt->rt_gateway) @@ -125,9 +133,10 @@ mtu = rt->u.dst.pmtu; #ifdef CONFIG_NET_SECURITY - call_fw_firewall(PF_SECURITY, dev2, NULL, &mtu, NULL); + if (call_fw_firewall(PF_SECURITY, dev2, NULL, &mtu, NULL) < FW_ACCEPT) + return -1; #endif - + /* * We now generate an ICMP HOST REDIRECT giving the route * we calculated. @@ -135,14 +144,21 @@ if (rt->rt_flags&RTCF_DOREDIRECT && !opt->srr) ip_rt_send_redirect(skb); +#ifdef CONFIG_NET_SECURITY + if (call_out_firewall(PF_SECURITY, dev2, NULL, (void *)2, &skb) < FW_ACCEPT) + return -1; +#endif + /* We are about to mangle packet. Copy it! */ if ((skb = skb_cow(skb, dev2->hard_header_len)) == NULL) return -1; iph = skb->nh.iph; opt = &(IPCB(skb)->opt); +#ifndef CONFIG_NET_SECURITY /* Decrease ttl after skb cow done */ ip_decrease_ttl(iph); +#endif /* * We now may allocate a new buffer, and copy the datagram into it. diff -urN lin.2.2.17/net/ipv4/ip_input.c int.2.2.17.x/net/ipv4/ip_input.c --- lin.2.2.17/net/ipv4/ip_input.c Tue Jan 4 19:12:26 2000 +++ int.2.2.17.x/net/ipv4/ip_input.c Sat Oct 14 00:48:17 2000 @@ -148,6 +148,7 @@ #include <linux/firewall.h> #include <linux/mroute.h> #include <linux/netlink.h> +#include <linux/ipsec.h> /* * SNMP management statistics @@ -317,7 +318,10 @@ skb1 = skb_clone(skb, GFP_ATOMIC); if(skb1) { - raw_rcv(raw_sk, skb1); + if(ipsec_sk_policy(raw_sk,skb1)) + raw_rcv(raw_sk, skb1); + else + kfree_skb(skb1); } } raw_sk = sknext; @@ -377,8 +381,10 @@ if(raw_sk!=NULL) /* Shift to last raw user */ { - raw_rcv(raw_sk, skb); - + if(ipsec_sk_policy(raw_sk, skb)) + raw_rcv(raw_sk, skb); + else + kfree_skb(skb); } else if (!flag) /* Free and report errors */ { diff -urN lin.2.2.17/net/ipv4/ip_output.c int.2.2.17.x/net/ipv4/ip_output.c --- lin.2.2.17/net/ipv4/ip_output.c Wed Oct 27 02:53:42 1999 +++ int.2.2.17.x/net/ipv4/ip_output.c Sat Oct 14 00:48:17 2000 @@ -76,6 +76,7 @@ #include <linux/firewall.h> #include <linux/mroute.h> #include <linux/netlink.h> +#include <linux/ipsec.h> /* * Shall we try to damage output packets if routing dev changes? @@ -145,6 +146,13 @@ ip_send_check(iph); +#ifdef CONFIG_NET_SECURITY + if (call_out_firewall(PF_SECURITY, dev, NULL, (void *) 7, &skb) < FW_ACCEPT) { + kfree_skb(skb); + return; + } +#endif + /* Send it out. */ skb->dst->output(skb); return; @@ -307,6 +315,16 @@ } #endif +#ifdef CONFIG_NET_SECURITY + /* Add an IP checksum (must do this before SECurity because + * of possible tunneling). + */ + ip_send_check(iph); + if (call_out_firewall(PF_SECURITY, dev, NULL, (void *) 4, &skb) < FW_ACCEPT) + goto drop; + iph = skb->nh.iph; + /* Don't update tot_len, as the dev->mtu is already decreased. */ +#endif /* This can happen when the transport layer has segments queued * with a cached route, and by the time we get here things are * re-routed to a device with a different MTU than the original @@ -412,6 +430,9 @@ int nfrags=0; struct ip_options *opt = ipc->opt; int df = 0; +#ifdef CONFIG_NET_SECURITY + int fw_res; +#endif mtu = rt->u.dst.pmtu; if (ip_dont_fragment(sk, &rt->u.dst)) @@ -577,6 +598,18 @@ err = -EPERM; goto error; } +#ifdef CONFIG_NET_SECURITY + switch(call_out_firewall(PF_SECURITY, rt->u.dst.dev, NULL, (void *) 6, &skb)) { + case FW_QUEUE: + kfree_skb(skb); + continue; + case FW_BLOCK: + case FW_REJECT: + kfree_skb(skb); + err = -EPERM; + goto error; + } +#endif #endif err = -ENETDOWN; @@ -616,6 +649,9 @@ struct sk_buff *skb; int df; struct iphdr *iph; +#ifdef CONFIG_NET_SECURITY + int fw_res; +#endif /* * Try the simple case first. This leaves fragmented frames, and by @@ -700,6 +736,18 @@ err = -EPERM; goto error; } +#ifdef CONFIG_NET_SECURITY + switch (call_out_firewall(PF_SECURITY, rt->u.dst.dev, NULL, (void *) 5, &skb)) { + case FW_QUEUE: + kfree_skb(skb); + return 0; + case FW_BLOCK: + case FW_REJECT: + kfree_skb(skb); + err = -EPERM; + goto error; + } +#endif #endif return rt->u.dst.output(skb); diff -urN lin.2.2.17/net/ipv4/udp.c int.2.2.17.x/net/ipv4/udp.c --- lin.2.2.17/net/ipv4/udp.c Wed Jun 7 23:26:44 2000 +++ int.2.2.17.x/net/ipv4/udp.c Sat Oct 14 00:48:17 2000 @@ -114,6 +114,7 @@ #include <net/icmp.h> #include <net/route.h> #include <net/checksum.h> +#include <linux/ipsec.h> /* * Snmp MIB for the UDP layer @@ -963,6 +964,16 @@ static int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb) { + /* + * Check the security clearance + */ + + if(!ipsec_sk_policy(sk,skb)) + { + kfree_skb(skb); + return(0); + } + /* * Charge it to the socket, dropping if the queue is full. */ diff -urN lin.2.2.17/net/netsyms.c int.2.2.17.x/net/netsyms.c --- lin.2.2.17/net/netsyms.c Wed Jun 7 23:26:44 2000 +++ int.2.2.17.x/net/netsyms.c Sat Oct 14 00:48:17 2000 @@ -237,6 +237,7 @@ EXPORT_SYMBOL(arp_broken_ops); EXPORT_SYMBOL(ip_id_count); EXPORT_SYMBOL(ip_send_check); +EXPORT_SYMBOL(ip_forward); EXPORT_SYMBOL(ip_fragment); EXPORT_SYMBOL(inet_family_ops); EXPORT_SYMBOL(in_aton);