Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

/ray/src/lib/crypto/blowfishcipher.cc

Go to the documentation of this file.
00001 /*
00002  * lib/crypto/blowfishcipher.cc 
00003  * 
00004  * Implementation of the blowfish cipher. 
00005  * 
00006  * This is heavily adapted source from the international patch 
00007  * for the linux kernel. Sorry, cipher-blowfish.c did not include an 
00008  * author, so if you are the guy and feel that this should be fixed, 
00009  * drop me an e-mail. 
00010  * 
00011  * Adapted and maintained for HLIB by Wolfgang Wieser ] wwieser (a) gmx <*> de [. 
00012  * (Yes, and I fixed up the need to do some nonstandard byte swaps. 
00013  * The test vectors now work as expected.)
00014  * 
00015  * This file may be distributed and/or modified under the terms of the 
00016  * GNU General Public License version 2 as published by the Free Software 
00017  * Foundation. (See COPYING.GPL for details.)
00018  * 
00019  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00020  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00021  * 
00022  */
00023 
00024 #include "blowfishcipher.h"
00025 
00026 static uint32 bf_pbox[16+2] = {
00027     0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
00028     0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
00029     0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
00030     0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
00031     0x9216d5d9, 0x8979fb1b
00032 };
00033 
00034 // These are actually digits of PI in hexadecimal notation. 
00035 static uint32 bf_sbox[256*4] = {
00036     0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
00037     0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
00038     0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
00039     0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
00040     0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
00041     0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
00042     0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
00043     0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
00044     0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
00045     0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
00046     0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
00047     0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
00048     0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
00049     0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
00050     0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
00051     0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
00052     0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
00053     0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
00054     0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
00055     0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
00056     0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
00057     0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
00058     0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
00059     0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
00060     0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
00061     0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
00062     0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
00063     0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
00064     0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
00065     0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
00066     0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
00067     0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
00068     0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
00069     0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
00070     0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
00071     0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
00072     0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
00073     0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
00074     0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
00075     0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
00076     0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
00077     0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
00078     0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
00079     0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
00080     0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
00081     0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
00082     0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
00083     0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
00084     0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
00085     0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
00086     0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
00087     0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
00088     0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
00089     0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
00090     0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
00091     0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
00092     0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
00093     0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
00094     0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
00095     0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
00096     0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
00097     0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
00098     0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
00099     0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,
00100     0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
00101     0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
00102     0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
00103     0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
00104     0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
00105     0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
00106     0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
00107     0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
00108     0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
00109     0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
00110     0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
00111     0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
00112     0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
00113     0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
00114     0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
00115     0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
00116     0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
00117     0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
00118     0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
00119     0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
00120     0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
00121     0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
00122     0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
00123     0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
00124     0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
00125     0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
00126     0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
00127     0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
00128     0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
00129     0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
00130     0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
00131     0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
00132     0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
00133     0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
00134     0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
00135     0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
00136     0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
00137     0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
00138     0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
00139     0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
00140     0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
00141     0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
00142     0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
00143     0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
00144     0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
00145     0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
00146     0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
00147     0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
00148     0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
00149     0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
00150     0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
00151     0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
00152     0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
00153     0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
00154     0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
00155     0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
00156     0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
00157     0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
00158     0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
00159     0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
00160     0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
00161     0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
00162     0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
00163     0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,
00164     0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
00165     0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
00166     0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
00167     0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
00168     0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
00169     0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
00170     0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
00171     0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
00172     0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
00173     0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
00174     0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
00175     0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
00176     0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
00177     0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
00178     0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
00179     0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
00180     0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
00181     0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
00182     0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
00183     0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
00184     0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
00185     0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
00186     0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
00187     0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
00188     0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
00189     0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
00190     0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
00191     0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
00192     0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
00193     0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
00194     0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
00195     0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
00196     0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
00197     0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
00198     0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
00199     0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
00200     0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
00201     0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
00202     0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
00203     0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
00204     0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
00205     0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
00206     0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
00207     0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
00208     0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
00209     0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
00210     0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
00211     0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
00212     0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
00213     0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
00214     0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
00215     0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
00216     0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
00217     0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
00218     0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
00219     0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
00220     0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
00221     0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
00222     0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
00223     0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
00224     0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
00225     0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
00226     0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
00227     0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
00228     0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
00229     0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
00230     0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
00231     0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
00232     0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
00233     0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
00234     0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
00235     0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
00236     0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
00237     0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
00238     0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
00239     0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
00240     0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
00241     0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
00242     0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
00243     0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
00244     0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
00245     0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
00246     0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
00247     0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
00248     0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
00249     0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
00250     0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
00251     0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
00252     0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
00253     0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
00254     0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
00255     0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
00256     0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
00257     0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
00258     0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
00259     0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
00260     0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
00261     0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
00262     0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
00263     0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
00264     0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
00265     0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
00266     0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
00267     0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
00268     0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
00269     0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
00270     0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
00271     0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
00272     0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
00273     0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
00274     0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
00275     0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
00276     0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
00277     0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
00278     0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
00279     0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
00280     0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
00281     0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
00282     0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
00283     0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
00284     0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
00285     0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
00286     0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
00287     0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
00288     0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
00289     0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
00290     0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
00291     0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
00292 };
00293 
00294 
00295 /* 
00296  * Round loop macro, c_S is a pointer to a S-Box array
00297  * organized in 4 uint32 at a row.
00298  */
00299 
00300 #define ROUND(a,b,c_Pptr) \
00301     b^=*c_Pptr; \
00302     a^=((( c_S0[  b >> 24          ] + \
00303            c_S1[((b >> 16) & 0xff)]) ^ \
00304            c_S2[((b >>  8) & 0xff)]) + \
00305            c_S3[( b        & 0xff)])
00306 
00307 
00308 // Encryption core function only used by SetKey(). 
00309 inline void BlowFishCipher::_EncryptRounds(uint32 *_yl,uint32 *_yr)
00310 {
00311     uint32 yl=*_yl,yr=*_yr;
00312     
00313     uint32 *c_Pptr=c_P;
00314     uint32 *c_Pend=c_Pptr+16;   // 16 rounds
00315     
00316     uint32 *c_S0=c_S;
00317     uint32 *c_S1=c_S+256;
00318     uint32 *c_S2=c_S+512;
00319     uint32 *c_S3=c_S+768;
00320     do
00321     {
00322         ROUND(yr,yl,c_Pptr);  ++c_Pptr;
00323         ROUND(yl,yr,c_Pptr);  ++c_Pptr;
00324     }
00325     while(c_Pptr<c_Pend);
00326     
00327     /* yl and yr are switched */
00328     *_yr=yl^(*(c_Pptr++));
00329     *_yl=yr^(*(c_Pptr  ));
00330 }
00331 
00332 
00333 /* Perform the key setup.  Note that this works only with 128-bit
00334  * keys, despite the API that looks like it might support other sizes. */
00335 int BlowFishCipher::SetKey(char *_key,size_t keylen)
00336 {
00337     if(keylen<8 || keylen>56 || keylen%8)
00338     {  return(-2);  }
00339     
00340     unsigned char *key=(unsigned char*)_key;
00341     
00342     /* Copy the initialization s-boxes */
00343     for(uint32 *src=bf_sbox,*srcend=&bf_sbox[1024],*dest=c_S; 
00344         src<srcend; src++,dest++)
00345     {  *dest=*src;  }
00346     
00347     /* Set the p-boxes */
00348     for(uint32 *src=bf_pbox,*srcend=&bf_pbox[16+2],*dest=c_P; 
00349         src<srcend; src++,dest++)
00350     {  *dest=*src;  }
00351     
00352     unsigned char *keyp=key,*keypend=&key[keylen];
00353     for(uint32 *dest=c_P,*destend=&c_P[16+2]; dest<destend; dest++)
00354     {
00355         // This assumes that keylen%4 == 0. 
00356         uint32 tmp;
00357         tmp =uint32(*(keyp++)) << 24;
00358         tmp|=uint32(*(keyp++)) << 16;
00359         tmp|=uint32(*(keyp++)) <<  8;
00360         tmp|=uint32(*(keyp++))      ;
00361         
00362         (*dest)^=tmp;
00363         if(keyp>=keypend)
00364         {  keyp=key;  }
00365     }
00366     
00367     uint32 yl=0x00000000,yr=0x00000000;
00368     
00369     for(uint32 *dest=c_P,*destend=&c_P[16+2]; dest<destend; )
00370     {
00371         _EncryptRounds(&yl,&yr);  // length: 8
00372         *(dest++)=yl;
00373         *(dest++)=yr;
00374     }
00375     
00376     for(uint32 *dest=c_S,*destend=&c_S[1024]; dest<destend; )
00377     {
00378         _EncryptRounds(&yl,&yr);  // length: 8
00379         *(dest++)=yl;
00380         *(dest++)=yr;
00381     }
00382     
00383     return(0);
00384 }
00385 
00386 
00387 int BlowFishCipher::CheckWeakKey()
00388 {
00389     // Must check if a value appears twice 
00390     // in one of the 4 S-Boxes. 
00391     for(int sn=0; sn<4; sn++)
00392     {
00393         // sbs, sbe: S-Box start/end pointer. 
00394         uint32 *sbs=&c_S[sn*256];
00395         uint32 *sbe=sbs+256;
00396         for(uint32 *i=sbs; i<sbe; i++)
00397         {
00398             for(uint32 *j=i+1; j<sbe; j++)
00399             {
00400                 if(*i==*j)  // weak key criteria
00401                 {  return(1);  }
00402             }
00403         }
00404     }
00405     
00406     return(0);
00407 }
00408 
00409 
00410 #define INPACK(a,in) \
00411     a =uint32(*(in++)) << 24; \
00412     a|=uint32(*(in++)) << 16; \
00413     a|=uint32(*(in++)) <<  8; \
00414     a|=uint32(*(in++))      ;
00415 
00416 #define OUTPACK(a,out) \
00417     *(out++) = a >> 24; \
00418     *(out++) = a >> 16; \
00419     *(out++) = a >>  8; \
00420     *(out++) = a      ; 
00421 
00422 
00423 /* Encrypt one block.  ibuf and obuf may be the same. */
00424 void BlowFishCipher::EncryptBlock(char *ibuf,char *obuf)
00425 {
00426     unsigned char *in=(unsigned char*)ibuf;
00427     unsigned char *out=(unsigned char*)obuf;
00428     
00429     uint32 yl; INPACK(yl,in);
00430     uint32 yr; INPACK(yr,in);
00431     // BE CAREFUL: in pointer changed. 
00432     
00433     uint32 *c_Pptr=c_P;
00434     uint32 *c_Pend=c_Pptr+16;   // 16 rounds
00435     
00436     uint32 *c_S0=c_S;
00437     uint32 *c_S1=c_S+256;
00438     uint32 *c_S2=c_S+512;
00439     uint32 *c_S3=c_S+768;
00440     do
00441     {
00442         ROUND(yr,yl,c_Pptr);  ++c_Pptr;
00443         ROUND(yl,yr,c_Pptr);  ++c_Pptr;
00444     }
00445     while(c_Pptr<c_Pend);
00446     
00447     /* yl and yr are switched */
00448     yl^=*(c_Pptr++);
00449     yr^=*(c_Pptr  );
00450     
00451     OUTPACK(yr,out);
00452     OUTPACK(yl,out);
00453 }
00454 
00455 
00456 /* Decrypt one block.  ibuf and obuf may be the same. */
00457 void BlowFishCipher::DecryptBlock(char *ibuf,char *obuf)
00458 {
00459     unsigned char *in=(unsigned char*)ibuf;
00460     unsigned char *out=(unsigned char*)obuf;
00461     
00462     uint32 yl; INPACK(yl,in);
00463     uint32 yr; INPACK(yr,in);
00464     // BE CAREFUL: in pointer changed. 
00465     
00466     uint32 *c_Pend=&c_P[1];
00467     uint32 *c_Pptr=c_Pend+16;   // 16 rounds
00468     
00469     uint32 *c_S0=c_S;
00470     uint32 *c_S1=c_S+256;
00471     uint32 *c_S2=c_S+512;
00472     uint32 *c_S3=c_S+768;
00473     do
00474     {
00475         ROUND(yr,yl,c_Pptr);  --c_Pptr;
00476         ROUND(yl,yr,c_Pptr);  --c_Pptr;
00477     }
00478     while(c_Pptr>c_Pend);
00479     
00480     /* yl and yr are switched */
00481     yl^=*(c_Pptr--);
00482     yr^=*(c_Pptr  );
00483     
00484     OUTPACK(yr,out);
00485     OUTPACK(yl,out);
00486 }
00487 
00488 
00489 void BlowFishCipher::_reset()
00490 {
00491     uint32 *p,*pend;
00492     for(p=&(c_P[0]),pend=&(c_P[18]); p<pend; p++)
00493     {  *p=uint32(0U);  }
00494     for(p=&(c_S[0]),pend=&(c_S[1024]); p<pend; p++)
00495     {  *p=uint32(0U);  }
00496 }
00497 
00498 
00499 int BlowFishCipher::CopyFrom(BlockCipherBase *_from)
00500 {
00501     if(!_from || _from->GetPar()->cipher_ID!=par.cipher_ID)  return(-2);
00502     
00503     BlowFishCipher *from=(BlowFishCipher *)_from;
00504     memcpy(c_P,from->c_P,18*sizeof(uint32));
00505     memcpy(c_S,from->c_S,1024*sizeof(uint32));
00506     
00507     return(0);
00508 }
00509 
00510 
00511 static const size_t blowfish_par_kl[7]={8,16,24,32,40,48,56};
00512 
00513 const BlockCipherBase::Parameters BlowFishCipher::par = 
00514 {
00515     INIT_FIELD(block_size) 8,
00516     INIT_FIELD(n_key_lengths) 7,
00517     INIT_FIELD(key_length) blowfish_par_kl,
00518     INIT_FIELD(cipher_ID) 0xBF15,
00519     INIT_FIELD(name) "blowfish"
00520 };
00521 
00522 
00523 #if 0   /* SIMPLE FILE ENCRYPTION PROGRAM */
00524 
00525 #include <unistd.h>
00526 
00527 char *prg_name="test_blowfish";
00528 int main()
00529 {
00530     size_t keylen=32;
00531     size_t blocksize=8;
00532     char buf[256*blocksize*2];
00533     
00534     /*{
00535         BlowFishCipher bfc;
00536         for(int i=0; i<1000; i++)
00537         {  bfc.SetKey("thisIsth3s3ct1tkEywitScHs967&&#",keylen);  }
00538     }*/
00539     
00540     BlowFishCipher bfc;
00541     fprintf(stderr,"setkey=%d\n",
00542         bfc.SetKey("thisIsth3s3ct1tkEywitScHs967&&#",keylen));
00543     
00544     for(;;)
00545     {
00546         int rd=read(0,buf,256*blocksize);
00547         if(rd<int(blocksize))  break;
00548         while(rd%blocksize) --rd;
00549         char *iob=buf,*endiob=&buf[rd];
00550         for(;iob<endiob;iob+=blocksize)
00551         {
00552             // Benchmark modus: encrypt & decrypt it. 
00553             bfc.EncryptBlock(iob,iob);
00554             bfc.DecryptBlock(iob,iob);
00555         }
00556         write(1,buf,rd);
00557     }
00558     
00559     return(0);
00560 }
00561 #endif
00562 

Generated on Sat Feb 19 22:33:45 2005 for Ray by doxygen 1.3.5