"Fossies" - the Fresh Open Source Software Archive

Member "libmcrypt-2.5.8/modules/algorithms/blowfish-compat.c" (19 Jan 2003, 20222 Bytes) of package /linux/privat/old/libmcrypt-2.5.8.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "blowfish-compat.c" see the Fossies "Dox" file reference documentation.

    1 /* The blowfish algorithm 
    2  * As described in the Schneier's book. Minor changes only 
    3  * Changed to conform to the "new" blowfish posted in 30 Oct 1994
    4  */
    5 
    6 /* modified in order to use the libmcrypt API by Nikos Mavroyanopoulos 
    7  * All modifications are placed under the license of libmcrypt.
    8  */
    9 
   10 /* $Id: blowfish-compat.c,v 1.11 2003/01/19 17:48:27 nmav Exp $ */
   11 
   12 #include <libdefs.h>
   13 
   14 #include <mcrypt_modules.h>
   15 #include "blowfish.h"
   16 
   17 #define _mcrypt_set_key blowfish_compat_LTX__mcrypt_set_key
   18 #define _mcrypt_encrypt blowfish_compat_LTX__mcrypt_encrypt
   19 #define _mcrypt_decrypt blowfish_compat_LTX__mcrypt_decrypt
   20 #define _mcrypt_get_size blowfish_compat_LTX__mcrypt_get_size
   21 #define _mcrypt_get_block_size blowfish_compat_LTX__mcrypt_get_block_size
   22 #define _is_block_algorithm blowfish_compat_LTX__is_block_algorithm
   23 #define _mcrypt_get_key_size blowfish_compat_LTX__mcrypt_get_key_size
   24 #define _mcrypt_get_supported_key_sizes blowfish_compat_LTX__mcrypt_get_supported_key_sizes
   25 #define _mcrypt_get_algorithms_name blowfish_compat_LTX__mcrypt_get_algorithms_name
   26 #define _mcrypt_self_test blowfish_compat_LTX__mcrypt_self_test
   27 #define _mcrypt_algorithm_version blowfish_compat_LTX__mcrypt_algorithm_version
   28 
   29 /*
   30 typedef struct {
   31          word32 S[4][256],P[18];
   32 } blf_ctx;
   33 */
   34 
   35 #define MAXKEYBYTES 56      /* 448 bits */
   36 
   37 #define BF_N         16
   38 #define KEYBYTES   8
   39 
   40 #define F(bc, x) ( ((bc->S[0][(x >> 24) & 0xff] + bc->S[1][(x >> 16) & 0xff]) ^ bc->S[2][(x >>  8) & 0xff]) + bc->S[3][x & 0xff] )
   41 
   42 /* x should be a 64 bit integer */
   43 WIN32DLL_DEFINE void _mcrypt_encrypt(blf_ctx * c, word32 * x)
   44 {
   45     word32 Xl;
   46     word32 Xr, temp;
   47     short i;
   48 
   49 #ifndef WORDS_BIGENDIAN
   50     Xl = x[0];
   51     Xr = x[1];
   52 #else
   53     Xl = byteswap32(x[0]);
   54     Xr = byteswap32(x[1]);
   55 #endif
   56 
   57     for (i = 0; i < BF_N; ++i) {
   58         Xl ^= c->P[i];
   59         Xr ^= F(c, Xl);
   60 
   61         temp = Xl;
   62         Xl = Xr;
   63         Xr = temp;
   64     }
   65 
   66     temp = Xl;
   67     Xl = Xr;
   68     Xr = temp;
   69 
   70     Xr ^= c->P[BF_N];
   71     Xl ^= c->P[BF_N + 1];
   72 
   73 #ifndef WORDS_BIGENDIAN
   74     x[0] = Xl;
   75     x[1] = Xr;
   76 #else
   77     x[0] = byteswap32(Xl);
   78     x[1] = byteswap32(Xr);
   79 #endif
   80 
   81 }
   82 
   83 /* x should be a 64 bit integer */
   84 static void enblf_noswap(blf_ctx * c, word32 * x)
   85 {               /* Used internally */
   86     word32 Xl;
   87     word32 Xr, temp;
   88     short i;
   89 
   90     Xl = x[0];
   91     Xr = x[1];
   92 
   93     for (i = 0; i < BF_N; ++i) {
   94         Xl ^= c->P[i];
   95         Xr ^= F(c, Xl);
   96 
   97         temp = Xl;
   98         Xl = Xr;
   99         Xr = temp;
  100     }
  101 
  102     temp = Xl;
  103     Xl = Xr;
  104     Xr = temp;
  105 
  106     Xr ^= c->P[BF_N];
  107     Xl ^= c->P[BF_N + 1];
  108 
  109     x[0] = Xl;
  110     x[1] = Xr;
  111 }
  112 
  113 WIN32DLL_DEFINE void _mcrypt_decrypt(blf_ctx * c, word32 * x)
  114 {
  115     word32 Xl, Xr, temp;
  116     short i;
  117 
  118 #ifndef WORDS_BIGENDIAN
  119     Xl = x[0];
  120     Xr = x[1];
  121 #else
  122     Xl = byteswap32(x[0]);
  123     Xr = byteswap32(x[1]);
  124 #endif
  125 
  126     for (i = BF_N + 1; i > 1; --i) {
  127         Xl ^= c->P[i];
  128         Xr ^= F(c, Xl);
  129 
  130         temp = Xl;
  131         Xl = Xr;
  132         Xr = temp;
  133     }
  134 
  135     temp = Xl;
  136     Xl = Xr;
  137     Xr = temp;
  138 
  139     Xr ^= c->P[1];
  140     Xl ^= c->P[0];
  141 
  142 #ifndef WORDS_BIGENDIAN
  143     x[0] = Xl;
  144     x[1] = Xr;
  145 #else
  146     x[0] = byteswap32(Xl);
  147     x[1] = byteswap32(Xr);
  148 #endif
  149 }
  150 
  151 
  152 static short initialize_blowfish(blf_ctx * c, byte key[], short keybytes)
  153 {
  154     short i, j;
  155     word32 data, datarl[2];
  156 
  157     word32 ks0[] = {
  158         0xd1310ba6L, 0x98dfb5acL, 0x2ffd72dbL, 0xd01adfb7L,
  159         0xb8e1afedL, 0x6a267e96L,
  160         0xba7c9045L, 0xf12c7f99L, 0x24a19947L, 0xb3916cf7L,
  161         0x0801f2e2L, 0x858efc16L,
  162         0x636920d8L, 0x71574e69L, 0xa458fea3L, 0xf4933d7eL,
  163         0x0d95748fL, 0x728eb658L,
  164         0x718bcd58L, 0x82154aeeL, 0x7b54a41dL, 0xc25a59b5L,
  165         0x9c30d539L, 0x2af26013L,
  166         0xc5d1b023L, 0x286085f0L, 0xca417918L, 0xb8db38efL,
  167         0x8e79dcb0L, 0x603a180eL,
  168         0x6c9e0e8bL, 0xb01e8a3eL, 0xd71577c1L, 0xbd314b27L,
  169         0x78af2fdaL, 0x55605c60L,
  170         0xe65525f3L, 0xaa55ab94L, 0x57489862L, 0x63e81440L,
  171         0x55ca396aL, 0x2aab10b6L,
  172         0xb4cc5c34L, 0x1141e8ceL, 0xa15486afL, 0x7c72e993L,
  173         0xb3ee1411L, 0x636fbc2aL,
  174         0x2ba9c55dL, 0x741831f6L, 0xce5c3e16L, 0x9b87931eL,
  175         0xafd6ba33L, 0x6c24cf5cL,
  176         0x7a325381L, 0x28958677L, 0x3b8f4898L, 0x6b4bb9afL,
  177         0xc4bfe81bL, 0x66282193L,
  178         0x61d809ccL, 0xfb21a991L, 0x487cac60L, 0x5dec8032L,
  179         0xef845d5dL, 0xe98575b1L,
  180         0xdc262302L, 0xeb651b88L, 0x23893e81L, 0xd396acc5L,
  181         0x0f6d6ff3L, 0x83f44239L,
  182         0x2e0b4482L, 0xa4842004L, 0x69c8f04aL, 0x9e1f9b5eL,
  183         0x21c66842L, 0xf6e96c9aL,
  184         0x670c9c61L, 0xabd388f0L, 0x6a51a0d2L, 0xd8542f68L,
  185         0x960fa728L, 0xab5133a3L,
  186         0x6eef0b6cL, 0x137a3be4L, 0xba3bf050L, 0x7efb2a98L,
  187         0xa1f1651dL, 0x39af0176L,
  188         0x66ca593eL, 0x82430e88L, 0x8cee8619L, 0x456f9fb4L,
  189         0x7d84a5c3L, 0x3b8b5ebeL,
  190         0xe06f75d8L, 0x85c12073L, 0x401a449fL, 0x56c16aa6L,
  191         0x4ed3aa62L, 0x363f7706L,
  192         0x1bfedf72L, 0x429b023dL, 0x37d0d724L, 0xd00a1248L,
  193         0xdb0fead3L, 0x49f1c09bL,
  194         0x075372c9L, 0x80991b7bL, 0x25d479d8L, 0xf6e8def7L,
  195         0xe3fe501aL, 0xb6794c3bL,
  196         0x976ce0bdL, 0x04c006baL, 0xc1a94fb6L, 0x409f60c4L,
  197         0x5e5c9ec2L, 0x196a2463L,
  198         0x68fb6fafL, 0x3e6c53b5L, 0x1339b2ebL, 0x3b52ec6fL,
  199         0x6dfc511fL, 0x9b30952cL,
  200         0xcc814544L, 0xaf5ebd09L, 0xbee3d004L, 0xde334afdL,
  201         0x660f2807L, 0x192e4bb3L,
  202         0xc0cba857L, 0x45c8740fL, 0xd20b5f39L, 0xb9d3fbdbL,
  203         0x5579c0bdL, 0x1a60320aL,
  204         0xd6a100c6L, 0x402c7279L, 0x679f25feL, 0xfb1fa3ccL,
  205         0x8ea5e9f8L, 0xdb3222f8L,
  206         0x3c7516dfL, 0xfd616b15L, 0x2f501ec8L, 0xad0552abL,
  207         0x323db5faL, 0xfd238760L,
  208         0x53317b48L, 0x3e00df82L, 0x9e5c57bbL, 0xca6f8ca0L,
  209         0x1a87562eL, 0xdf1769dbL,
  210         0xd542a8f6L, 0x287effc3L, 0xac6732c6L, 0x8c4f5573L,
  211         0x695b27b0L, 0xbbca58c8L,
  212         0xe1ffa35dL, 0xb8f011a0L, 0x10fa3d98L, 0xfd2183b8L,
  213         0x4afcb56cL, 0x2dd1d35bL,
  214         0x9a53e479L, 0xb6f84565L, 0xd28e49bcL, 0x4bfb9790L,
  215         0xe1ddf2daL, 0xa4cb7e33L,
  216         0x62fb1341L, 0xcee4c6e8L, 0xef20cadaL, 0x36774c01L,
  217         0xd07e9efeL, 0x2bf11fb4L,
  218         0x95dbda4dL, 0xae909198L, 0xeaad8e71L, 0x6b93d5a0L,
  219         0xd08ed1d0L, 0xafc725e0L,
  220         0x8e3c5b2fL, 0x8e7594b7L, 0x8ff6e2fbL, 0xf2122b64L,
  221         0x8888b812L, 0x900df01cL,
  222         0x4fad5ea0L, 0x688fc31cL, 0xd1cff191L, 0xb3a8c1adL,
  223         0x2f2f2218L, 0xbe0e1777L,
  224         0xea752dfeL, 0x8b021fa1L, 0xe5a0cc0fL, 0xb56f74e8L,
  225         0x18acf3d6L, 0xce89e299L,
  226         0xb4a84fe0L, 0xfd13e0b7L, 0x7cc43b81L, 0xd2ada8d9L,
  227         0x165fa266L, 0x80957705L,
  228         0x93cc7314L, 0x211a1477L, 0xe6ad2065L, 0x77b5fa86L,
  229         0xc75442f5L, 0xfb9d35cfL,
  230         0xebcdaf0cL, 0x7b3e89a0L, 0xd6411bd3L, 0xae1e7e49L,
  231         0x00250e2dL, 0x2071b35eL,
  232         0x226800bbL, 0x57b8e0afL, 0x2464369bL, 0xf009b91eL,
  233         0x5563911dL, 0x59dfa6aaL,
  234         0x78c14389L, 0xd95a537fL, 0x207d5ba2L, 0x02e5b9c5L,
  235         0x83260376L, 0x6295cfa9L,
  236         0x11c81968L, 0x4e734a41L, 0xb3472dcaL, 0x7b14a94aL,
  237         0x1b510052L, 0x9a532915L,
  238         0xd60f573fL, 0xbc9bc6e4L, 0x2b60a476L, 0x81e67400L,
  239         0x08ba6fb5L, 0x571be91fL,
  240         0xf296ec6bL, 0x2a0dd915L, 0xb6636521L, 0xe7b9f9b6L,
  241         0xff34052eL, 0xc5855664L,
  242         0x53b02d5dL, 0xa99f8fa1L, 0x08ba4799L, 0x6e85076aL
  243     };
  244 
  245     word32 ks1[] = {
  246         0x4b7a70e9L, 0xb5b32944L, 0xdb75092eL, 0xc4192623L,
  247         0xad6ea6b0L, 0x49a7df7dL,
  248         0x9cee60b8L, 0x8fedb266L, 0xecaa8c71L, 0x699a17ffL,
  249         0x5664526cL, 0xc2b19ee1L,
  250         0x193602a5L, 0x75094c29L, 0xa0591340L, 0xe4183a3eL,
  251         0x3f54989aL, 0x5b429d65L,
  252         0x6b8fe4d6L, 0x99f73fd6L, 0xa1d29c07L, 0xefe830f5L,
  253         0x4d2d38e6L, 0xf0255dc1L,
  254         0x4cdd2086L, 0x8470eb26L, 0x6382e9c6L, 0x021ecc5eL,
  255         0x09686b3fL, 0x3ebaefc9L,
  256         0x3c971814L, 0x6b6a70a1L, 0x687f3584L, 0x52a0e286L,
  257         0xb79c5305L, 0xaa500737L,
  258         0x3e07841cL, 0x7fdeae5cL, 0x8e7d44ecL, 0x5716f2b8L,
  259         0xb03ada37L, 0xf0500c0dL,
  260         0xf01c1f04L, 0x0200b3ffL, 0xae0cf51aL, 0x3cb574b2L,
  261         0x25837a58L, 0xdc0921bdL,
  262         0xd19113f9L, 0x7ca92ff6L, 0x94324773L, 0x22f54701L,
  263         0x3ae5e581L, 0x37c2dadcL,
  264         0xc8b57634L, 0x9af3dda7L, 0xa9446146L, 0x0fd0030eL,
  265         0xecc8c73eL, 0xa4751e41L,
  266         0xe238cd99L, 0x3bea0e2fL, 0x3280bba1L, 0x183eb331L,
  267         0x4e548b38L, 0x4f6db908L,
  268         0x6f420d03L, 0xf60a04bfL, 0x2cb81290L, 0x24977c79L,
  269         0x5679b072L, 0xbcaf89afL,
  270         0xde9a771fL, 0xd9930810L, 0xb38bae12L, 0xdccf3f2eL,
  271         0x5512721fL, 0x2e6b7124L,
  272         0x501adde6L, 0x9f84cd87L, 0x7a584718L, 0x7408da17L,
  273         0xbc9f9abcL, 0xe94b7d8cL,
  274         0xec7aec3aL, 0xdb851dfaL, 0x63094366L, 0xc464c3d2L,
  275         0xef1c1847L, 0x3215d908L,
  276         0xdd433b37L, 0x24c2ba16L, 0x12a14d43L, 0x2a65c451L,
  277         0x50940002L, 0x133ae4ddL,
  278         0x71dff89eL, 0x10314e55L, 0x81ac77d6L, 0x5f11199bL,
  279         0x043556f1L, 0xd7a3c76bL,
  280         0x3c11183bL, 0x5924a509L, 0xf28fe6edL, 0x97f1fbfaL,
  281         0x9ebabf2cL, 0x1e153c6eL,
  282         0x86e34570L, 0xeae96fb1L, 0x860e5e0aL, 0x5a3e2ab3L,
  283         0x771fe71cL, 0x4e3d06faL,
  284         0x2965dcb9L, 0x99e71d0fL, 0x803e89d6L, 0x5266c825L,
  285         0x2e4cc978L, 0x9c10b36aL,
  286         0xc6150ebaL, 0x94e2ea78L, 0xa5fc3c53L, 0x1e0a2df4L,
  287         0xf2f74ea7L, 0x361d2b3dL,
  288         0x1939260fL, 0x19c27960L, 0x5223a708L, 0xf71312b6L,
  289         0xebadfe6eL, 0xeac31f66L,
  290         0xe3bc4595L, 0xa67bc883L, 0xb17f37d1L, 0x018cff28L,
  291         0xc332ddefL, 0xbe6c5aa5L,
  292         0x65582185L, 0x68ab9802L, 0xeecea50fL, 0xdb2f953bL,
  293         0x2aef7dadL, 0x5b6e2f84L,
  294         0x1521b628L, 0x29076170L, 0xecdd4775L, 0x619f1510L,
  295         0x13cca830L, 0xeb61bd96L,
  296         0x0334fe1eL, 0xaa0363cfL, 0xb5735c90L, 0x4c70a239L,
  297         0xd59e9e0bL, 0xcbaade14L,
  298         0xeecc86bcL, 0x60622ca7L, 0x9cab5cabL, 0xb2f3846eL,
  299         0x648b1eafL, 0x19bdf0caL,
  300         0xa02369b9L, 0x655abb50L, 0x40685a32L, 0x3c2ab4b3L,
  301         0x319ee9d5L, 0xc021b8f7L,
  302         0x9b540b19L, 0x875fa099L, 0x95f7997eL, 0x623d7da8L,
  303         0xf837889aL, 0x97e32d77L,
  304         0x11ed935fL, 0x16681281L, 0x0e358829L, 0xc7e61fd6L,
  305         0x96dedfa1L, 0x7858ba99L,
  306         0x57f584a5L, 0x1b227263L, 0x9b83c3ffL, 0x1ac24696L,
  307         0xcdb30aebL, 0x532e3054L,
  308         0x8fd948e4L, 0x6dbc3128L, 0x58ebf2efL, 0x34c6ffeaL,
  309         0xfe28ed61L, 0xee7c3c73L,
  310         0x5d4a14d9L, 0xe864b7e3L, 0x42105d14L, 0x203e13e0L,
  311         0x45eee2b6L, 0xa3aaabeaL,
  312         0xdb6c4f15L, 0xfacb4fd0L, 0xc742f442L, 0xef6abbb5L,
  313         0x654f3b1dL, 0x41cd2105L,
  314         0xd81e799eL, 0x86854dc7L, 0xe44b476aL, 0x3d816250L,
  315         0xcf62a1f2L, 0x5b8d2646L,
  316         0xfc8883a0L, 0xc1c7b6a3L, 0x7f1524c3L, 0x69cb7492L,
  317         0x47848a0bL, 0x5692b285L,
  318         0x095bbf00L, 0xad19489dL, 0x1462b174L, 0x23820e00L,
  319         0x58428d2aL, 0x0c55f5eaL,
  320         0x1dadf43eL, 0x233f7061L, 0x3372f092L, 0x8d937e41L,
  321         0xd65fecf1L, 0x6c223bdbL,
  322         0x7cde3759L, 0xcbee7460L, 0x4085f2a7L, 0xce77326eL,
  323         0xa6078084L, 0x19f8509eL,
  324         0xe8efd855L, 0x61d99735L, 0xa969a7aaL, 0xc50c06c2L,
  325         0x5a04abfcL, 0x800bcadcL,
  326         0x9e447a2eL, 0xc3453484L, 0xfdd56705L, 0x0e1e9ec9L,
  327         0xdb73dbd3L, 0x105588cdL,
  328         0x675fda79L, 0xe3674340L, 0xc5c43465L, 0x713e38d8L,
  329         0x3d28f89eL, 0xf16dff20L,
  330         0x153e21e7L, 0x8fb03d4aL, 0xe6e39f2bL, 0xdb83adf7L
  331     };
  332 
  333     word32 ks2[] = {
  334         0xe93d5a68L, 0x948140f7L, 0xf64c261cL, 0x94692934L,
  335         0x411520f7L, 0x7602d4f7L,
  336         0xbcf46b2eL, 0xd4a20068L, 0xd4082471L, 0x3320f46aL,
  337         0x43b7d4b7L, 0x500061afL,
  338         0x1e39f62eL, 0x97244546L, 0x14214f74L, 0xbf8b8840L,
  339         0x4d95fc1dL, 0x96b591afL,
  340         0x70f4ddd3L, 0x66a02f45L, 0xbfbc09ecL, 0x03bd9785L,
  341         0x7fac6dd0L, 0x31cb8504L,
  342         0x96eb27b3L, 0x55fd3941L, 0xda2547e6L, 0xabca0a9aL,
  343         0x28507825L, 0x530429f4L,
  344         0x0a2c86daL, 0xe9b66dfbL, 0x68dc1462L, 0xd7486900L,
  345         0x680ec0a4L, 0x27a18deeL,
  346         0x4f3ffea2L, 0xe887ad8cL, 0xb58ce006L, 0x7af4d6b6L,
  347         0xaace1e7cL, 0xd3375fecL,
  348         0xce78a399L, 0x406b2a42L, 0x20fe9e35L, 0xd9f385b9L,
  349         0xee39d7abL, 0x3b124e8bL,
  350         0x1dc9faf7L, 0x4b6d1856L, 0x26a36631L, 0xeae397b2L,
  351         0x3a6efa74L, 0xdd5b4332L,
  352         0x6841e7f7L, 0xca7820fbL, 0xfb0af54eL, 0xd8feb397L,
  353         0x454056acL, 0xba489527L,
  354         0x55533a3aL, 0x20838d87L, 0xfe6ba9b7L, 0xd096954bL,
  355         0x55a867bcL, 0xa1159a58L,
  356         0xcca92963L, 0x99e1db33L, 0xa62a4a56L, 0x3f3125f9L,
  357         0x5ef47e1cL, 0x9029317cL,
  358         0xfdf8e802L, 0x04272f70L, 0x80bb155cL, 0x05282ce3L,
  359         0x95c11548L, 0xe4c66d22L,
  360         0x48c1133fL, 0xc70f86dcL, 0x07f9c9eeL, 0x41041f0fL,
  361         0x404779a4L, 0x5d886e17L,
  362         0x325f51ebL, 0xd59bc0d1L, 0xf2bcc18fL, 0x41113564L,
  363         0x257b7834L, 0x602a9c60L,
  364         0xdff8e8a3L, 0x1f636c1bL, 0x0e12b4c2L, 0x02e1329eL,
  365         0xaf664fd1L, 0xcad18115L,
  366         0x6b2395e0L, 0x333e92e1L, 0x3b240b62L, 0xeebeb922L,
  367         0x85b2a20eL, 0xe6ba0d99L,
  368         0xde720c8cL, 0x2da2f728L, 0xd0127845L, 0x95b794fdL,
  369         0x647d0862L, 0xe7ccf5f0L,
  370         0x5449a36fL, 0x877d48faL, 0xc39dfd27L, 0xf33e8d1eL,
  371         0x0a476341L, 0x992eff74L,
  372         0x3a6f6eabL, 0xf4f8fd37L, 0xa812dc60L, 0xa1ebddf8L,
  373         0x991be14cL, 0xdb6e6b0dL,
  374         0xc67b5510L, 0x6d672c37L, 0x2765d43bL, 0xdcd0e804L,
  375         0xf1290dc7L, 0xcc00ffa3L,
  376         0xb5390f92L, 0x690fed0bL, 0x667b9ffbL, 0xcedb7d9cL,
  377         0xa091cf0bL, 0xd9155ea3L,
  378         0xbb132f88L, 0x515bad24L, 0x7b9479bfL, 0x763bd6ebL,
  379         0x37392eb3L, 0xcc115979L,
  380         0x8026e297L, 0xf42e312dL, 0x6842ada7L, 0xc66a2b3bL,
  381         0x12754cccL, 0x782ef11cL,
  382         0x6a124237L, 0xb79251e7L, 0x06a1bbe6L, 0x4bfb6350L,
  383         0x1a6b1018L, 0x11caedfaL,
  384         0x3d25bdd8L, 0xe2e1c3c9L, 0x44421659L, 0x0a121386L,
  385         0xd90cec6eL, 0xd5abea2aL,
  386         0x64af674eL, 0xda86a85fL, 0xbebfe988L, 0x64e4c3feL,
  387         0x9dbc8057L, 0xf0f7c086L,
  388         0x60787bf8L, 0x6003604dL, 0xd1fd8346L, 0xf6381fb0L,
  389         0x7745ae04L, 0xd736fcccL,
  390         0x83426b33L, 0xf01eab71L, 0xb0804187L, 0x3c005e5fL,
  391         0x77a057beL, 0xbde8ae24L,
  392         0x55464299L, 0xbf582e61L, 0x4e58f48fL, 0xf2ddfda2L,
  393         0xf474ef38L, 0x8789bdc2L,
  394         0x5366f9c3L, 0xc8b38e74L, 0xb475f255L, 0x46fcd9b9L,
  395         0x7aeb2661L, 0x8b1ddf84L,
  396         0x846a0e79L, 0x915f95e2L, 0x466e598eL, 0x20b45770L,
  397         0x8cd55591L, 0xc902de4cL,
  398         0xb90bace1L, 0xbb8205d0L, 0x11a86248L, 0x7574a99eL,
  399         0xb77f19b6L, 0xe0a9dc09L,
  400         0x662d09a1L, 0xc4324633L, 0xe85a1f02L, 0x09f0be8cL,
  401         0x4a99a025L, 0x1d6efe10L,
  402         0x1ab93d1dL, 0x0ba5a4dfL, 0xa186f20fL, 0x2868f169L,
  403         0xdcb7da83L, 0x573906feL,
  404         0xa1e2ce9bL, 0x4fcd7f52L, 0x50115e01L, 0xa70683faL,
  405         0xa002b5c4L, 0x0de6d027L,
  406         0x9af88c27L, 0x773f8641L, 0xc3604c06L, 0x61a806b5L,
  407         0xf0177a28L, 0xc0f586e0L,
  408         0x006058aaL, 0x30dc7d62L, 0x11e69ed7L, 0x2338ea63L,
  409         0x53c2dd94L, 0xc2c21634L,
  410         0xbbcbee56L, 0x90bcb6deL, 0xebfc7da1L, 0xce591d76L,
  411         0x6f05e409L, 0x4b7c0188L,
  412         0x39720a3dL, 0x7c927c24L, 0x86e3725fL, 0x724d9db9L,
  413         0x1ac15bb4L, 0xd39eb8fcL,
  414         0xed545578L, 0x08fca5b5L, 0xd83d7cd3L, 0x4dad0fc4L,
  415         0x1e50ef5eL, 0xb161e6f8L,
  416         0xa28514d9L, 0x6c51133cL, 0x6fd5c7e7L, 0x56e14ec4L,
  417         0x362abfceL, 0xddc6c837L,
  418         0xd79a3234L, 0x92638212L, 0x670efa8eL, 0x406000e0L
  419     };
  420 
  421     word32 ks3[] = {
  422         0x3a39ce37L, 0xd3faf5cfL, 0xabc27737L, 0x5ac52d1bL,
  423         0x5cb0679eL, 0x4fa33742L,
  424         0xd3822740L, 0x99bc9bbeL, 0xd5118e9dL, 0xbf0f7315L,
  425         0xd62d1c7eL, 0xc700c47bL,
  426         0xb78c1b6bL, 0x21a19045L, 0xb26eb1beL, 0x6a366eb4L,
  427         0x5748ab2fL, 0xbc946e79L,
  428         0xc6a376d2L, 0x6549c2c8L, 0x530ff8eeL, 0x468dde7dL,
  429         0xd5730a1dL, 0x4cd04dc6L,
  430         0x2939bbdbL, 0xa9ba4650L, 0xac9526e8L, 0xbe5ee304L,
  431         0xa1fad5f0L, 0x6a2d519aL,
  432         0x63ef8ce2L, 0x9a86ee22L, 0xc089c2b8L, 0x43242ef6L,
  433         0xa51e03aaL, 0x9cf2d0a4L,
  434         0x83c061baL, 0x9be96a4dL, 0x8fe51550L, 0xba645bd6L,
  435         0x2826a2f9L, 0xa73a3ae1L,
  436         0x4ba99586L, 0xef5562e9L, 0xc72fefd3L, 0xf752f7daL,
  437         0x3f046f69L, 0x77fa0a59L,
  438         0x80e4a915L, 0x87b08601L, 0x9b09e6adL, 0x3b3ee593L,
  439         0xe990fd5aL, 0x9e34d797L,
  440         0x2cf0b7d9L, 0x022b8b51L, 0x96d5ac3aL, 0x017da67dL,
  441         0xd1cf3ed6L, 0x7c7d2d28L,
  442         0x1f9f25cfL, 0xadf2b89bL, 0x5ad6b472L, 0x5a88f54cL,
  443         0xe029ac71L, 0xe019a5e6L,
  444         0x47b0acfdL, 0xed93fa9bL, 0xe8d3c48dL, 0x283b57ccL,
  445         0xf8d56629L, 0x79132e28L,
  446         0x785f0191L, 0xed756055L, 0xf7960e44L, 0xe3d35e8cL,
  447         0x15056dd4L, 0x88f46dbaL,
  448         0x03a16125L, 0x0564f0bdL, 0xc3eb9e15L, 0x3c9057a2L,
  449         0x97271aecL, 0xa93a072aL,
  450         0x1b3f6d9bL, 0x1e6321f5L, 0xf59c66fbL, 0x26dcf319L,
  451         0x7533d928L, 0xb155fdf5L,
  452         0x03563482L, 0x8aba3cbbL, 0x28517711L, 0xc20ad9f8L,
  453         0xabcc5167L, 0xccad925fL,
  454         0x4de81751L, 0x3830dc8eL, 0x379d5862L, 0x9320f991L,
  455         0xea7a90c2L, 0xfb3e7bceL,
  456         0x5121ce64L, 0x774fbe32L, 0xa8b6e37eL, 0xc3293d46L,
  457         0x48de5369L, 0x6413e680L,
  458         0xa2ae0810L, 0xdd6db224L, 0x69852dfdL, 0x09072166L,
  459         0xb39a460aL, 0x6445c0ddL,
  460         0x586cdecfL, 0x1c20c8aeL, 0x5bbef7ddL, 0x1b588d40L,
  461         0xccd2017fL, 0x6bb4e3bbL,
  462         0xdda26a7eL, 0x3a59ff45L, 0x3e350a44L, 0xbcb4cdd5L,
  463         0x72eacea8L, 0xfa6484bbL,
  464         0x8d6612aeL, 0xbf3c6f47L, 0xd29be463L, 0x542f5d9eL,
  465         0xaec2771bL, 0xf64e6370L,
  466         0x740e0d8dL, 0xe75b1357L, 0xf8721671L, 0xaf537d5dL,
  467         0x4040cb08L, 0x4eb4e2ccL,
  468         0x34d2466aL, 0x0115af84L, 0xe1b00428L, 0x95983a1dL,
  469         0x06b89fb4L, 0xce6ea048L,
  470         0x6f3f3b82L, 0x3520ab82L, 0x011a1d4bL, 0x277227f8L,
  471         0x611560b1L, 0xe7933fdcL,
  472         0xbb3a792bL, 0x344525bdL, 0xa08839e1L, 0x51ce794bL,
  473         0x2f32c9b7L, 0xa01fbac9L,
  474         0xe01cc87eL, 0xbcc7d1f6L, 0xcf0111c3L, 0xa1e8aac7L,
  475         0x1a908749L, 0xd44fbd9aL,
  476         0xd0dadecbL, 0xd50ada38L, 0x0339c32aL, 0xc6913667L,
  477         0x8df9317cL, 0xe0b12b4fL,
  478         0xf79e59b7L, 0x43f5bb3aL, 0xf2d519ffL, 0x27d9459cL,
  479         0xbf97222cL, 0x15e6fc2aL,
  480         0x0f91fc71L, 0x9b941525L, 0xfae59361L, 0xceb69cebL,
  481         0xc2a86459L, 0x12baa8d1L,
  482         0xb6c1075eL, 0xe3056a0cL, 0x10d25065L, 0xcb03a442L,
  483         0xe0ec6e0eL, 0x1698db3bL,
  484         0x4c98a0beL, 0x3278e964L, 0x9f1f9532L, 0xe0d392dfL,
  485         0xd3a0342bL, 0x8971f21eL,
  486         0x1b0a7441L, 0x4ba3348cL, 0xc5be7120L, 0xc37632d8L,
  487         0xdf359f8dL, 0x9b992f2eL,
  488         0xe60b6f47L, 0x0fe3f11dL, 0xe54cda54L, 0x1edad891L,
  489         0xce6279cfL, 0xcd3e7e6fL,
  490         0x1618b166L, 0xfd2c1d05L, 0x848fd2c5L, 0xf6fb2299L,
  491         0xf523f357L, 0xa6327623L,
  492         0x93a83531L, 0x56cccd02L, 0xacf08162L, 0x5a75ebb5L,
  493         0x6e163697L, 0x88d273ccL,
  494         0xde966292L, 0x81b949d0L, 0x4c50901bL, 0x71c65614L,
  495         0xe6c6c7bdL, 0x327a140aL,
  496         0x45e1d006L, 0xc3f27b9aL, 0xc9aa53fdL, 0x62a80f00L,
  497         0xbb25bfe2L, 0x35bdd2f6L,
  498         0x71126905L, 0xb2040222L, 0xb6cbcf7cL, 0xcd769c2bL,
  499         0x53113ec0L, 0x1640e3d3L,
  500         0x38abbd60L, 0x2547adf0L, 0xba38209cL, 0xf746ce76L,
  501         0x77afa1c5L, 0x20756060L,
  502         0x85cbfe4eL, 0x8ae88dd8L, 0x7aaaf9b0L, 0x4cf9aa7eL,
  503         0x1948c25cL, 0x02fb8a8cL,
  504         0x01c36ae4L, 0xd6ebe1f9L, 0x90d4f869L, 0xa65cdea0L,
  505         0x3f09252dL, 0xc208e69fL,
  506         0xb74e6132L, 0xce77e25bL, 0x578fdfe3L, 0x3ac372e6L
  507     };
  508 
  509 
  510     word32 pi[] = {
  511         0x243f6a88L, 0x85a308d3L, 0x13198a2eL, 0x03707344L,
  512         0xa4093822L, 0x299f31d0L,
  513         0x082efa98L, 0xec4e6c89L, 0x452821e6L, 0x38d01377L,
  514         0xbe5466cfL, 0x34e90c6cL,
  515         0xc0ac29b7L, 0xc97c50ddL, 0x3f84d5b5L, 0xb5470917L,
  516         0x9216d5d9L, 0x8979fb1bL
  517     };
  518 
  519 
  520 /* Initialize s-boxes without file read. */
  521     for (i = 0; i < 256; i++) {
  522         c->S[0][i] = ks0[i];
  523         c->S[1][i] = ks1[i];
  524         c->S[2][i] = ks2[i];
  525         c->S[3][i] = ks3[i];
  526     }
  527 
  528 /* P-boxes */
  529     for (i = 0; i < 18; i++) {
  530         c->P[i] = pi[i];
  531     }
  532 
  533     j = 0;
  534     for (i = 0; i < BF_N + 2; ++i) {
  535         data = 0x00000000;
  536         data = (data << 8) | key[(j) % keybytes];
  537         data = (data << 8) | key[(j + 1) % keybytes];
  538         data = (data << 8) | key[(j + 2) % keybytes];
  539         data = (data << 8) | key[(j + 3) % keybytes];
  540 
  541         c->P[i] ^= data;
  542         j = (j + 4) % keybytes;
  543     }
  544 
  545     datarl[0] = 0x000000000;
  546     datarl[1] = 0x000000000;
  547 
  548     for (i = 0; i < BF_N + 2; i += 2) {
  549         enblf_noswap(c, datarl);
  550         c->P[i] = datarl[0];
  551         c->P[i + 1] = datarl[1];
  552     }
  553 
  554 
  555     for (i = 0; i < 4; ++i) {
  556         for (j = 0; j < 256; j += 2) {
  557 
  558             enblf_noswap(c, datarl);
  559             c->S[i][j] = datarl[0];
  560             c->S[i][j + 1] = datarl[1];
  561         }
  562     }
  563 
  564     return 0;
  565 }
  566 
  567 WIN32DLL_DEFINE int _mcrypt_set_key(blf_ctx * c, char *k, int len)
  568 {
  569     initialize_blowfish(c, k, len);
  570     return 0;
  571 }
  572 
  573 WIN32DLL_DEFINE int _mcrypt_get_size()
  574 {
  575     return sizeof(blf_ctx);
  576 }
  577 WIN32DLL_DEFINE int _mcrypt_get_block_size()
  578 {
  579     return 8;
  580 }
  581 WIN32DLL_DEFINE int _is_block_algorithm()
  582 {
  583     return 1;
  584 }
  585 WIN32DLL_DEFINE int _mcrypt_get_key_size()
  586 {
  587     return 56;
  588 }
  589 WIN32DLL_DEFINE const int *_mcrypt_get_supported_key_sizes(int *len)
  590 {
  591     *len = 0;
  592     return NULL;
  593 }
  594 WIN32DLL_DEFINE const char *_mcrypt_get_algorithms_name()
  595 {
  596 return "Blowfish";
  597 }
  598 
  599 #define CIPHER "de8e9a3a9cd44280"
  600 
  601 WIN32DLL_DEFINE int _mcrypt_self_test()
  602 {
  603     char *keyword;
  604     unsigned char plaintext[16];
  605     unsigned char ciphertext[16];
  606     int blocksize = _mcrypt_get_block_size(), j;
  607     void *key;
  608     unsigned char cipher_tmp[200];
  609 
  610     keyword = calloc(1, _mcrypt_get_key_size());
  611     if (keyword == NULL)
  612         return -1;
  613 
  614     for (j = 0; j < _mcrypt_get_key_size(); j++) {
  615         keyword[j] = ((j * 2 + 10) % 256);
  616     }
  617 
  618     for (j = 0; j < blocksize; j++) {
  619         plaintext[j] = j % 256;
  620     }
  621     key = malloc(_mcrypt_get_size());
  622     if (key == NULL)
  623         return -1;
  624 
  625     memcpy(ciphertext, plaintext, blocksize);
  626 
  627     _mcrypt_set_key(key, (void *) keyword, _mcrypt_get_key_size());
  628     free(keyword);
  629     _mcrypt_encrypt(key, (void *) ciphertext);
  630 
  631     for (j = 0; j < blocksize; j++) {
  632         sprintf(&((char *) cipher_tmp)[2 * j], "%.2x",
  633             ciphertext[j]);
  634     }
  635 
  636     if (strcmp((char *) cipher_tmp, CIPHER) != 0) {
  637         printf("failed compatibility\n");
  638         printf("Expected: %s\nGot: %s\n", CIPHER,
  639                (char *) cipher_tmp);
  640         free(key);
  641         return -1;
  642     }
  643     _mcrypt_decrypt(key, (void *) ciphertext);
  644     free(key);
  645 
  646     if (strcmp(ciphertext, plaintext) != 0) {
  647         printf("failed internally\n");
  648         return -1;
  649     }
  650 
  651     return 0;
  652 }
  653 
  654 WIN32DLL_DEFINE word32 _mcrypt_algorithm_version()
  655 {
  656     return 20010801;
  657 }
  658 
  659 #ifdef WIN32
  660 # ifdef USE_LTDL
  661 WIN32DLL_DEFINE int main (void)
  662 {
  663        /* empty main function to avoid linker error (see cygwin FAQ) */
  664 }
  665 # endif
  666 #endif