Main Page   Modules   Data Structures   File List   Data Fields   Globals   Related Pages  

beecrypt/blowfish.c

Go to the documentation of this file.
00001 
00014 /*
00015  * Copyright (c) 1999, 2000 Virtual Unlimited B.V.
00016  *
00017  * Author: Bob Deblier <bob@virtualunlimited.com>
00018  *
00019  * This library is free software; you can redistribute it and/or
00020  * modify it under the terms of the GNU Lesser General Public
00021  * License as published by the Free Software Foundation; either
00022  * version 2.1 of the License, or (at your option) any later version.
00023  *
00024  * This library is distributed in the hope that it will be useful,
00025  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00026  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00027  * Lesser General Public License for more details.
00028  *
00029  * You should have received a copy of the GNU Lesser General Public
00030  * License along with this library; if not, write to the Free Software
00031  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00032  *
00033  */
00034 
00035 #include "system.h"
00036 #include "beecrypt.h"
00037 #include "blowfishopt.h"
00038 #include "blowfish.h"
00039 #include "endianness.h"
00040 #include "debug.h"
00041 
00044 /*@observer@*/ /*@unchecked@*/
00045 static uint32 _bf_p[BLOWFISHPSIZE] = {
00046         0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
00047         0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
00048         0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
00049         0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
00050         0x9216d5d9, 0x8979fb1b
00051 };
00052 
00055 /*@observer@*/ /*@unchecked@*/
00056 static uint32 _bf_s[1024] = {
00057         0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
00058         0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
00059         0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
00060         0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
00061         0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
00062         0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
00063         0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
00064         0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
00065         0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
00066         0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
00067         0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
00068         0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
00069         0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
00070         0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
00071         0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
00072         0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
00073         0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
00074         0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
00075         0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
00076         0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
00077         0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
00078         0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
00079         0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
00080         0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
00081         0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
00082         0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
00083         0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
00084         0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
00085         0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
00086         0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
00087         0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
00088         0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
00089         0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
00090         0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
00091         0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
00092         0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
00093         0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
00094         0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
00095         0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
00096         0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
00097         0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
00098         0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
00099         0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
00100         0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
00101         0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
00102         0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
00103         0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
00104         0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
00105         0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
00106         0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
00107         0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
00108         0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
00109         0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
00110         0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
00111         0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
00112         0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
00113         0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
00114         0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
00115         0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
00116         0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
00117         0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
00118         0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
00119         0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
00120         0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,
00121         0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
00122         0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
00123         0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
00124         0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
00125         0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
00126         0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
00127         0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
00128         0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
00129         0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
00130         0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
00131         0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
00132         0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
00133         0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
00134         0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
00135         0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
00136         0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
00137         0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
00138         0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
00139         0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
00140         0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
00141         0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
00142         0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
00143         0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
00144         0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
00145         0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
00146         0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
00147         0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
00148         0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
00149         0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
00150         0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
00151         0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
00152         0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
00153         0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
00154         0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
00155         0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
00156         0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
00157         0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
00158         0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
00159         0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
00160         0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
00161         0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
00162         0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
00163         0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
00164         0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
00165         0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
00166         0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
00167         0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
00168         0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
00169         0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
00170         0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
00171         0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
00172         0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
00173         0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
00174         0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
00175         0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
00176         0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
00177         0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
00178         0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
00179         0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
00180         0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
00181         0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
00182         0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
00183         0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
00184         0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,
00185         0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
00186         0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
00187         0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
00188         0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
00189         0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
00190         0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
00191         0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
00192         0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
00193         0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
00194         0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
00195         0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
00196         0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
00197         0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
00198         0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
00199         0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
00200         0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
00201         0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
00202         0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
00203         0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
00204         0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
00205         0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
00206         0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
00207         0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
00208         0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
00209         0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
00210         0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
00211         0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
00212         0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
00213         0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
00214         0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
00215         0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
00216         0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
00217         0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
00218         0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
00219         0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
00220         0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
00221         0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
00222         0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
00223         0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
00224         0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
00225         0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
00226         0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
00227         0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
00228         0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
00229         0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
00230         0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
00231         0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
00232         0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
00233         0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
00234         0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
00235         0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
00236         0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
00237         0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
00238         0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
00239         0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
00240         0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
00241         0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
00242         0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
00243         0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
00244         0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
00245         0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
00246         0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
00247         0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
00248         0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
00249         0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
00250         0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
00251         0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
00252         0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
00253         0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
00254         0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
00255         0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
00256         0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
00257         0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
00258         0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
00259         0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
00260         0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
00261         0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
00262         0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
00263         0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
00264         0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
00265         0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
00266         0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
00267         0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
00268         0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
00269         0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
00270         0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
00271         0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
00272         0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
00273         0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
00274         0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
00275         0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
00276         0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
00277         0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
00278         0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
00279         0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
00280         0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
00281         0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
00282         0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
00283         0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
00284         0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
00285         0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
00286         0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
00287         0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
00288         0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
00289         0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
00290         0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
00291         0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
00292         0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
00293         0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
00294         0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
00295         0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
00296         0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
00297         0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
00298         0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
00299         0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
00300         0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
00301         0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
00302         0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
00303         0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
00304         0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
00305         0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
00306         0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
00307         0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
00308         0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
00309         0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
00310         0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
00311         0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
00312         0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
00313 };
00314 
00315 #define EROUND(l,r) l ^= *(p++); r ^= ((s[((l>>24)&0xff)+0x000]+s[((l>>16)&0xff)+0x100])^s[((l>>8)&0xff)+0x200])+s[((l>>0)&0xff)+0x300]
00316 #define DROUND(l,r) l ^= *(p--); r ^= ((s[((l>>24)&0xff)+0x000]+s[((l>>16)&0xff)+0x100])^s[((l>>8)&0xff)+0x200])+s[((l>>0)&0xff)+0x300]
00317 
00320 /*@observer@*/ /*@unchecked@*/
00321 static const blockMode blowfishModes[2] =
00322 {
00323         { /* ECB */ (blockModeEncrypt) blowfishECBEncrypt, (blockModeDecrypt) blowfishECBDecrypt },
00324         { /* CBC */ (blockModeEncrypt) blowfishCBCEncrypt, (blockModeDecrypt) blowfishCBCDecrypt }
00325 };
00326 
00327 /*@-sizeoftype@*/
00328 const blockCipher blowfish = { "Blowfish", sizeof(blowfishParam), 8, 64, 448, 32, (blockCipherSetup) blowfishSetup, (blockCipherSetIV) blowfishSetIV, (blockCipherEncrypt) blowfishEncrypt, (blockCipherDecrypt) blowfishDecrypt, blowfishModes };
00329 /*@=sizeoftype@*/
00330 
00331 /*@-boundsread@*/
00332 int blowfishSetup(blowfishParam* bp, const uint32* key, int keybits, /*@unused@*/ cipherOperation op)
00333 {
00334         if (((keybits & 7) == 0) && (keybits >= 64) && (keybits <= 448))
00335         {
00336                 register uint32* p = bp->p;
00337                 register uint32* s = bp->s;
00338                 register int i;
00339 
00340                 uint32 work[2];
00341 
00342                 memcpy(p, _bf_p, BLOWFISHPSIZE * sizeof(*p));
00343                 memcpy(s, _bf_s, 1024 * sizeof(*s));
00344 
00345                 if ((keybits & 31) == 0)
00346                 {
00347                         register int keywords = (((uint32)keybits) >> 5); /* i.e. in 32 bit words */
00348 
00349                         for (i = 0; i < BLOWFISHPSIZE; i++)
00350                         {
00351                                 /* key is stored in 32 bit words in host-endian format; no swap necessary */
00352                                 p[i] ^= key[i % keywords];
00353                         }
00354                 }
00355                 else
00356                         return -1;
00357 
00358                 work[0] = work[1] = 0;
00359 
00360                 for (i = 0; i < BLOWFISHPSIZE; i += 2, p += 2)
00361                 {
00362                         (void) blowfishEncrypt(bp, work, work);
00363                         #if WORDS_BIGENDIAN
00364                         p[0] = work[0];
00365                         p[1] = work[1];
00366                         #else
00367                         p[0] = swapu32(work[0]);
00368                         p[1] = swapu32(work[1]);
00369                         #endif
00370                 }
00371 
00372                 for (i = 0; i < 1024; i += 2, s += 2)
00373                 {
00374                         (void) blowfishEncrypt(bp, work, work);
00375                         #if WORDS_BIGENDIAN
00376                         s[0] = work[0];
00377                         s[1] = work[1];
00378                         #else
00379                         s[0] = swapu32(work[0]);
00380                         s[1] = swapu32(work[1]);
00381                         #endif
00382                 }
00383 
00384                 /* clear fdback/iv */
00385                 bp->fdback[0] = 0;
00386                 bp->fdback[1] = 0;
00387 
00388                 return 0;
00389         }
00390         return -1;
00391 }
00392 /*@=boundsread@*/
00393 
00394 #ifndef ASM_BLOWFISHSETIV
00395 /*@-boundsread@*/
00396 int blowfishSetIV(blowfishParam* bp, const uint32* iv)
00397 {
00398         if (iv)
00399         {
00400                 bp->fdback[0] = iv[0];
00401                 bp->fdback[1] = iv[1];
00402         }
00403         else
00404         {
00405                 bp->fdback[0] = 0;
00406                 bp->fdback[1] = 0;
00407         }
00408 
00409         return 0;
00410 }
00411 /*@=boundsread@*/
00412 #endif
00413 
00414 #ifndef ASM_BLOWFISHENCRYPT
00415 /*@-boundswrite@*/
00416 int blowfishEncrypt(blowfishParam* bp, uint32* dst, const uint32* src)
00417 {
00418         #if WORDS_BIGENDIAN
00419         register uint32 xl = src[0], xr = src[1];
00420         #else
00421         register uint32 xl = swapu32(src[0]), xr = swapu32(src[1]);
00422         #endif
00423         register uint32* p = bp->p;
00424         register uint32* s = bp->s;
00425 
00426         EROUND(xl, xr); EROUND(xr, xl);
00427         EROUND(xl, xr); EROUND(xr, xl);
00428         EROUND(xl, xr); EROUND(xr, xl);
00429         EROUND(xl, xr); EROUND(xr, xl);
00430         EROUND(xl, xr); EROUND(xr, xl);
00431         EROUND(xl, xr); EROUND(xr, xl);
00432         EROUND(xl, xr); EROUND(xr, xl);
00433         EROUND(xl, xr); EROUND(xr, xl);
00434 
00435         #if WORDS_BIGENDIAN
00436         dst[1] = xl ^ *(p++);
00437         dst[0] = xr ^ *(p++);
00438         #else
00439         dst[1] = swapu32(xl ^ *(p++));
00440         dst[0] = swapu32(xr ^ *(p++));
00441         #endif
00442 
00443         return 0;
00444 }
00445 /*@=boundswrite@*/
00446 #endif
00447 
00448 #ifndef ASM_BLOWFISHDECRYPT
00449 /*@-boundswrite@*/
00450 int blowfishDecrypt(blowfishParam* bp, uint32* dst, const uint32* src)
00451 {
00452         #if WORDS_BIGENDIAN
00453         register uint32 xl = src[0], xr = src[1];
00454         #else
00455         register uint32 xl = swapu32(src[0]), xr = swapu32(src[1]);
00456         #endif
00457         register uint32* p = bp->p+BLOWFISHPSIZE-1;
00458         register uint32* s = bp->s;
00459 
00460         DROUND(xl, xr); DROUND(xr, xl);
00461         DROUND(xl, xr); DROUND(xr, xl);
00462         DROUND(xl, xr); DROUND(xr, xl);
00463         DROUND(xl, xr); DROUND(xr, xl);
00464         DROUND(xl, xr); DROUND(xr, xl);
00465         DROUND(xl, xr); DROUND(xr, xl);
00466         DROUND(xl, xr); DROUND(xr, xl);
00467         DROUND(xl, xr); DROUND(xr, xl);
00468 
00469         #if WORDS_BIGENDIAN
00470         dst[1] = xl ^ *(p--);
00471         dst[0] = xr ^ *(p--);
00472         #else
00473         dst[1] = swapu32(xl ^ *(p--));
00474         dst[0] = swapu32(xr ^ *(p--));
00475         #endif
00476 
00477         return 0;
00478 }
00479 /*@=boundswrite@*/
00480 #endif
00481 
00482 #ifndef ASM_BLOWFISHECBENCRYPT
00483 int blowfishECBEncrypt(blowfishParam* bp, int count, uint32* dst, const uint32* src)
00484 {
00485         while (count > 0)
00486         {
00487                 (void) blowfishEncrypt(bp, dst, src);
00488 
00489                 dst += 2;
00490                 src += 2;
00491 
00492                 count--;
00493         }
00494         return 0;
00495 }
00496 #endif
00497 
00498 #ifndef ASM_BLOWFISHECBDECRYPT
00499 int blowfishECBDecrypt(blowfishParam* bp, int count, uint32* dst, const uint32* src)
00500 {
00501         while (count > 0)
00502         {
00503                 (void) blowfishDecrypt(bp, dst, src);
00504 
00505                 dst += 2;
00506                 src += 2;
00507 
00508                 count--;
00509         }
00510         return 0;
00511 }
00512 #endif
00513 
00514 #ifndef ASM_BLOWFISHCBCENCRYPT
00515 /*@-boundswrite@*/
00516 int blowfishCBCEncrypt(blowfishParam* bp, int count, uint32* dst, const uint32* src)
00517 {
00518         if (count > 0)
00519         {
00520                 dst[0] = src[0] ^ bp->fdback[0];
00521                 dst[1] = src[1] ^ bp->fdback[1];
00522 
00523                 (void) blowfishEncrypt(bp, dst, dst);
00524 
00525                 dst += 2;
00526                 src += 2;
00527 
00528                 count--;
00529 
00530                 while (count > 0)
00531                 {
00532                         dst[0] = src[0] ^ dst[-2];
00533                         dst[1] = src[1] ^ dst[-1];
00534 
00535                         (void) blowfishEncrypt(bp, dst, dst);
00536 
00537                         dst += 2;
00538                         src += 2;
00539 
00540                         count--;
00541                 }
00542 
00543                 bp->fdback[0] = dst[-2];
00544                 bp->fdback[1] = dst[-1];
00545         }
00546         return 0;
00547 }
00548 /*@=boundswrite@*/
00549 #endif
00550 
00551 #ifndef ASM_BLOWFISHCBCDECRYPT
00552 /*@-boundsread@*/
00553 int blowfishCBCDecrypt(blowfishParam* bp, int count, uint32* dst, const uint32* src)
00554 {
00555         if (count > 0)
00556         {
00557                 if (src == dst)
00558                 {
00559                         register uint32 fb0 = src[0];
00560                         register uint32 fb1 = src[1];
00561 
00562                         (void) blowfishDecrypt(bp, dst, src);
00563 
00564                         dst[0] ^= bp->fdback[0];
00565                         dst[1] ^= bp->fdback[1];
00566 
00567                         dst += 2;
00568                         src += 2;
00569 
00570                         count--;
00571 
00572                         while (count > 0)
00573                         {
00574                                 register int src0 = src[0];
00575                                 register int src1 = src[1];
00576 
00577                                 (void) blowfishDecrypt(bp, dst, src);
00578 
00579                                 dst[0] ^= fb0;
00580                                 dst[1] ^= fb1;
00581 
00582                                 fb0 = src0;
00583                                 fb1 = src1;
00584 
00585                                 dst += 2;
00586                                 src += 2;
00587 
00588                                 count--;
00589                         }
00590 
00591                         bp->fdback[0] = fb0;
00592                         bp->fdback[1] = fb1;
00593                 }
00594                 else
00595                 {
00596                         (void) blowfishDecrypt(bp, dst, src);
00597 
00598                         dst[0] ^= bp->fdback[0];
00599                         dst[1] ^= bp->fdback[1];
00600 
00601                         dst += 2;
00602                         src += 2;
00603 
00604                         count--;
00605 
00606                         while (count > 0)
00607                         {
00608                                 (void) blowfishDecrypt(bp, dst, src);
00609 
00610                                 dst[0] ^= src[-2];
00611                                 dst[1] ^= src[-1];
00612 
00613                                 dst += 2;
00614                                 src += 2;
00615 
00616                                 count--;
00617                         }
00618 
00619                         bp->fdback[0] = src[-2];
00620                         bp->fdback[1] = src[-1];
00621                 }
00622         }
00623         return 0;
00624 }
00625 /*@=boundsread@*/
00626 #endif

Generated on Tue Sep 17 15:59:44 2002 for rpm by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002