CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_1/src/CondCore/DBCommon/src/blowfish.cc

Go to the documentation of this file.
00001 /*
00002  * Author     :  Paul Kocher
00003  * E-mail     :  pck@netcom.com
00004  * Date       :  1997
00005  * Description:  C implementation of the Blowfish algorithm.
00006  */
00007 
00008 #include "blowfish.h"
00009 #define N               16
00010 
00011 static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x);
00012 static const uInt32 ORIG_P[16 + 2] = {
00013         0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,
00014         0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,
00015         0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,
00016         0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,
00017         0x9216D5D9L, 0x8979FB1BL
00018 };
00019 
00020 static const uInt32 ORIG_S[4][256] = {
00021     {   0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L,
00022         0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L,
00023         0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L,
00024         0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL,
00025         0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL,
00026         0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L,
00027         0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL,
00028         0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL,
00029         0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L,
00030         0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L,
00031         0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL,
00032         0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL,
00033         0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL,
00034         0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L,
00035         0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L,
00036         0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L,
00037         0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L,
00038         0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L,
00039         0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL,
00040         0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L,
00041         0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L,
00042         0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L,
00043         0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L,
00044         0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL,
00045         0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L,
00046         0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL,
00047         0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL,
00048         0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L,
00049         0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL,
00050         0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L,
00051         0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL,
00052         0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L,
00053         0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L,
00054         0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL,
00055         0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L,
00056         0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L,
00057         0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL,
00058         0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L,
00059         0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL,
00060         0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L,
00061         0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L,
00062         0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL,
00063         0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L,
00064         0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L,
00065         0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L,
00066         0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L,
00067         0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L,
00068         0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL,
00069         0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL,
00070         0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L,
00071         0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L,
00072         0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L,
00073         0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L,
00074         0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL,
00075         0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L,
00076         0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL,
00077         0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL,
00078         0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L,
00079         0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L,
00080         0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L,
00081         0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L,
00082         0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L,
00083         0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L,
00084         0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL   },
00085 
00086     {   0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L,
00087         0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L,
00088         0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L,
00089         0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL,
00090         0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L,
00091         0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L,
00092         0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL,
00093         0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L,
00094         0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L,
00095         0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L,
00096         0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL,
00097         0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL,
00098         0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L,
00099         0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L,
00100         0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L,
00101         0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L,
00102         0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL,
00103         0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL,
00104         0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL,
00105         0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L,
00106         0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL,
00107         0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L,
00108         0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L,
00109         0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL,
00110         0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL,
00111         0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L,
00112         0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL,
00113         0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L,
00114         0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL,
00115         0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL,
00116         0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L,
00117         0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L,
00118         0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L,
00119         0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L,
00120         0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L,
00121         0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L,
00122         0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L,
00123         0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL,
00124         0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L,
00125         0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL,
00126         0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L,
00127         0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L,
00128         0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L,
00129         0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L,
00130         0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L,
00131         0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L,
00132         0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L,
00133         0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L,
00134         0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L,
00135         0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L,
00136         0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L,
00137         0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L,
00138         0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L,
00139         0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L,
00140         0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L,
00141         0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L,
00142         0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL,
00143         0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL,
00144         0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L,
00145         0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL,
00146         0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L,
00147         0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L,
00148         0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L,
00149         0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L   },
00150 
00151     {   0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L,
00152         0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L,
00153         0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL,
00154         0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L,
00155         0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L,
00156         0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L,
00157         0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL,
00158         0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL,
00159         0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL,
00160         0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L,
00161         0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L,
00162         0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL,
00163         0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L,
00164         0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL,
00165         0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L,
00166         0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL,
00167         0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L,
00168         0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL,
00169         0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L,
00170         0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL,
00171         0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L,
00172         0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L,
00173         0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL,
00174         0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L,
00175         0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L,
00176         0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L,
00177         0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L,
00178         0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL,
00179         0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L,
00180         0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL,
00181         0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L,
00182         0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL,
00183         0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L,
00184         0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL,
00185         0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL,
00186         0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL,
00187         0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L,
00188         0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L,
00189         0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL,
00190         0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL,
00191         0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL,
00192         0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL,
00193         0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL,
00194         0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L,
00195         0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L,
00196         0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L,
00197         0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L,
00198         0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL,
00199         0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL,
00200         0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L,
00201         0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L,
00202         0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L,
00203         0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L,
00204         0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L,
00205         0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L,
00206         0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L,
00207         0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L,
00208         0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L,
00209         0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L,
00210         0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL,
00211         0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L,
00212         0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL,
00213         0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L,
00214         0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L  },
00215 
00216     {   0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL,
00217         0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL,
00218         0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL,
00219         0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L,
00220         0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L,
00221         0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L,
00222         0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L,
00223         0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L,
00224         0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L,
00225         0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L,
00226         0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L,
00227         0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L,
00228         0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L,
00229         0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L,
00230         0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L,
00231         0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL,
00232         0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL,
00233         0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L,
00234         0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL,
00235         0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL,
00236         0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL,
00237         0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L,
00238         0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL,
00239         0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL,
00240         0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L,
00241         0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L,
00242         0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L,
00243         0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L,
00244         0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL,
00245         0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL,
00246         0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L,
00247         0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L,
00248         0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L,
00249         0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL,
00250         0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L,
00251         0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L,
00252         0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L,
00253         0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL,
00254         0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L,
00255         0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L,
00256         0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L,
00257         0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL,
00258         0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL,
00259         0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L,
00260         0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L,
00261         0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L,
00262         0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L,
00263         0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL,
00264         0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L,
00265         0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL,
00266         0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL,
00267         0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L,
00268         0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L,
00269         0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL,
00270         0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L,
00271         0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL,
00272         0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L,
00273         0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL,
00274         0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L,
00275         0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L,
00276         0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL,
00277         0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L,
00278         0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL,
00279         0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L  }
00280 };
00281 uInt32 F(BLOWFISH_CTX *ctx, uInt32 x) {
00282    unsigned short a, b, c, d;
00283    uInt32  y;
00284 
00285    d = x & 0x00FF;
00286    x >>= 8;
00287    c = x & 0x00FF;
00288    x >>= 8;
00289    b = x & 0x00FF;
00290    x >>= 8;
00291    a = x & 0x00FF;
00292 
00293    y = ctx->S[0][a] + ctx->S[1][b];
00294    y = y ^ ctx->S[2][c];
00295    y = y + ctx->S[3][d];
00296    return y;
00297 }
00298 
00299 void Blowfish_Encrypt(BLOWFISH_CTX *ctx, uInt32 *xl, uInt32
00300 *xr) {
00301   uInt32  Xl;
00302   uInt32  Xr;
00303   uInt32  temp;
00304   short       i;
00305 
00306   Xl = *xl;
00307   Xr = *xr;
00308 
00309   for (i = 0; i < N; ++i) {
00310     Xl = Xl ^ ctx->P[i];
00311     Xr = F(ctx, Xl) ^ Xr;
00312     temp = Xl;
00313     Xl = Xr;
00314     Xr = temp;
00315   }
00316 
00317   temp = Xl;
00318   Xl = Xr;
00319   Xr = temp;
00320   Xr = Xr ^ ctx->P[N];
00321   Xl = Xl ^ ctx->P[N + 1];
00322   *xl = Xl;
00323   *xr = Xr;
00324 }
00325 
00326 void Blowfish_Decrypt(BLOWFISH_CTX *ctx, uInt32 *xl, uInt32
00327 *xr) {
00328   uInt32  Xl;
00329   uInt32  Xr;
00330   uInt32  temp;
00331   short       i;
00332 
00333   Xl = *xl;
00334   Xr = *xr;
00335 
00336   for (i = N + 1; i > 1; --i) {
00337     Xl = Xl ^ ctx->P[i];
00338     Xr = F(ctx, Xl) ^ Xr;
00339     /* Exchange Xl and Xr */
00340     temp = Xl;
00341     Xl = Xr;
00342     Xr = temp;
00343   }
00344 
00345   /* Exchange Xl and Xr */
00346   temp = Xl;
00347   Xl = Xr;
00348   Xr = temp;
00349   Xr = Xr ^ ctx->P[1];
00350   Xl = Xl ^ ctx->P[0];
00351   *xl = Xl;
00352   *xr = Xr;
00353 }
00354 
00355 void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen) {
00356   int i, j, k;
00357   uInt32 data, datal, datar;
00358 
00359   for (i = 0; i < 4; i++) {
00360 
00361     for (j = 0; j < 256; j++)
00362       ctx->S[i][j] = ORIG_S[i][j];
00363   }
00364 
00365   j = 0;
00366 
00367   for (i = 0; i < N + 2; ++i) {
00368     data = 0x00000000;
00369 
00370     for (k = 0; k < 4; ++k) {
00371       data = (data << 8) | key[j];
00372       j = j + 1;
00373       if (j >= keyLen)
00374         j = 0;
00375     }
00376 
00377     ctx->P[i] = ORIG_P[i] ^ data;
00378   }
00379 
00380   datal = 0x00000000;
00381   datar = 0x00000000;
00382 
00383   for (i = 0; i < N + 2; i += 2) {
00384     Blowfish_Encrypt(ctx, &datal, &datar);
00385     ctx->P[i] = datal;
00386     ctx->P[i + 1] = datar;
00387   }
00388 
00389   for (i = 0; i < 4; ++i) {
00390 
00391     for (j = 0; j < 256; j += 2) {
00392       Blowfish_Encrypt(ctx, &datal, &datar);
00393       ctx->S[i][j] = datal;
00394       ctx->S[i][j + 1] = datar;
00395     }
00396   }
00397 }