File Coverage

blowfish.h
Criterion Covered Total %
statement 170 229 74.2
branch 81 88 92.0
condition n/a
subroutine n/a
pod n/a
total 251 317 79.1


line stmt bran cond sub pod time code
1             /* blowfish.h */
2             #ifndef _H_BLOWFISH
3             #define _H_BLOWFISH
4             #include
5              
6             #ifndef INTEL
7             #include
8             #endif
9              
10             #include
11             #define MAXKEYBYTES 56 /* 448 bits */
12             #define bf_N 16
13             #define noErr 0
14             #define DATAERROR -1
15             #define KEYBYTES 8
16             #define UBYTE_08bits unsigned char
17             #define UWORD_16bits unsigned short
18             #define nmalloc(x) n_malloc((x),__FILE__,__LINE__)
19             #define SIZEOF_INT 4
20             #define SIZEOF_LONG 4
21             #if SIZEOF_INT==4
22             # define UWORD_32bits unsigned int
23             #else
24             # if SIZEOF_LONG==4
25             # define UWORD_32bits unsigned long
26             # endif
27             #endif
28              
29             /* choose a byte order for your hardware */
30             union aword_big {
31             UWORD_32bits word;
32             UBYTE_08bits byte [4];
33             struct {
34             unsigned int byte0:8;
35             unsigned int byte1:8;
36             unsigned int byte2:8;
37             unsigned int byte3:8;
38             } w;
39             };
40              
41             /* DCBA - little endian - intel */
42             union aword_little {
43             UWORD_32bits word;
44             UBYTE_08bits byte [4];
45             struct {
46             unsigned int byte3:8;
47             unsigned int byte2:8;
48             unsigned int byte1:8;
49             unsigned int byte0:8;
50             } w;
51             };
52             #endif
53              
54             /* bf_tab.h: Blowfish P-box and S-box tables */
55             #ifndef _H_TAB_BF
56             #define _H_TAB_BF
57             static UWORD_32bits initbf_P[bf_N + 2] = {
58             0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
59             0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
60             0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
61             0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
62             0x9216d5d9, 0x8979fb1b,
63             };
64             static UWORD_32bits initbf_S[4][256] = {
65             {
66             0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
67             0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
68             0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
69             0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
70             0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
71             0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
72             0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
73             0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
74             0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
75             0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
76             0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
77             0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
78             0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
79             0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
80             0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
81             0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
82             0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
83             0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
84             0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
85             0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
86             0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
87             0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
88             0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
89             0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
90             0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
91             0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
92             0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
93             0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
94             0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
95             0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
96             0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
97             0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
98             0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
99             0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
100             0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
101             0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
102             0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
103             0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
104             0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
105             0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
106             0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
107             0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
108             0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
109             0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
110             0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
111             0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
112             0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
113             0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
114             0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
115             0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
116             0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
117             0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
118             0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
119             0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
120             0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
121             0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
122             0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
123             0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
124             0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
125             0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
126             0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
127             0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
128             0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
129             0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a },
130             {
131             0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
132             0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
133             0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
134             0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
135             0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
136             0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
137             0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
138             0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
139             0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
140             0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
141             0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
142             0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
143             0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
144             0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
145             0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
146             0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
147             0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
148             0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
149             0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
150             0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
151             0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
152             0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
153             0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
154             0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
155             0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
156             0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
157             0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
158             0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
159             0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
160             0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
161             0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
162             0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
163             0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
164             0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
165             0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
166             0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
167             0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
168             0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
169             0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
170             0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
171             0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
172             0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
173             0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
174             0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
175             0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
176             0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
177             0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
178             0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
179             0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
180             0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
181             0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
182             0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
183             0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
184             0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
185             0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
186             0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
187             0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
188             0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
189             0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
190             0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
191             0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
192             0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
193             0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
194             0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 },
195             {
196             0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
197             0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
198             0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
199             0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
200             0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
201             0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
202             0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
203             0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
204             0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
205             0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
206             0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
207             0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
208             0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
209             0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
210             0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
211             0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
212             0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
213             0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
214             0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
215             0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
216             0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
217             0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
218             0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
219             0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
220             0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
221             0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
222             0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
223             0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
224             0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
225             0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
226             0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
227             0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
228             0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
229             0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
230             0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
231             0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
232             0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
233             0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
234             0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
235             0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
236             0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
237             0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
238             0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
239             0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
240             0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
241             0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
242             0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
243             0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
244             0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
245             0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
246             0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
247             0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
248             0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
249             0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
250             0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
251             0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
252             0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
253             0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
254             0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
255             0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
256             0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
257             0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
258             0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
259             0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 },
260             {
261             0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
262             0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
263             0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
264             0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
265             0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
266             0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
267             0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
268             0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
269             0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
270             0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
271             0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
272             0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
273             0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
274             0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
275             0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
276             0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
277             0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
278             0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
279             0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
280             0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
281             0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
282             0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
283             0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
284             0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
285             0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
286             0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
287             0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
288             0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
289             0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
290             0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
291             0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
292             0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
293             0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
294             0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
295             0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
296             0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
297             0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
298             0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
299             0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
300             0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
301             0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
302             0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
303             0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
304             0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
305             0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
306             0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
307             0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
308             0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
309             0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
310             0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
311             0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
312             0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
313             0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
314             0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
315             0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
316             0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
317             0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
318             0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
319             0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
320             0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
321             0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
322             0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
323             0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
324             0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
325             }
326             };
327             #endif
328              
329             #include
330             #include
331             #include
332             #include
333             #include
334             #define BOXES 3
335              
336             #define S0(x) (bf_S[0][x.w.byte0])
337             #define S1(x) (bf_S[1][x.w.byte1])
338             #define S2(x) (bf_S[2][x.w.byte2])
339             #define S3(x) (bf_S[3][x.w.byte3])
340             #define bf_F(x) (((S0(x) + S1(x)) ^ S2(x)) + S3(x))
341             #define ROUND(a,b,n) (a.word ^= bf_F(b) ^ bf_P[n])
342              
343             struct box_t {
344             UWORD_32bits *P;
345             UWORD_32bits **S;
346             char key[81];
347             char keybytes;
348             } box[BOXES];
349              
350              
351             UWORD_32bits *bf_P;
352             UWORD_32bits **bf_S;
353              
354              
355 0           void encipher_big (UWORD_32bits * xl, UWORD_32bits * xr)
356             {
357             union aword_big check1;
358             union aword_big check2;
359 0           check1.word = *xl;
360 0           check2.word = *xr;
361             /* This is where the data is enciphered, it goes through 16 rounds of encipherment */
362 0           check1.word ^= bf_P[0];
363 0           ROUND(check2, check1, 1);
364 0           ROUND(check1, check2, 2);
365 0           ROUND(check2, check1, 3);
366              
367 0           ROUND(check1, check2, 4);
368 0           ROUND(check2, check1, 5);
369 0           ROUND(check1, check2, 6);
370 0           ROUND(check2, check1, 7);
371 0           ROUND(check1, check2, 8);
372 0           ROUND(check2, check1, 9);
373 0           ROUND(check1, check2, 10);
374 0           ROUND(check2, check1, 11);
375 0           ROUND(check1, check2, 12);
376 0           ROUND(check2, check1, 13);
377 0           ROUND(check1, check2, 14);
378 0           ROUND(check2, check1, 15);
379 0           ROUND(check1, check2, 16);
380 0           check2.word ^= bf_P[17];
381 0           *xr = check1.word;
382 0           *xl = check2.word;
383 0           }
384              
385 2764606           void encipher_little (UWORD_32bits * xl, UWORD_32bits * xr)
386             {
387             union aword_little check1;
388             union aword_little check2;
389 2764606           check1.word = *xl;
390 2764606           check2.word = *xr;
391             /* This is where the data is enciphered, it goes through 16 rounds of encipherment */
392 2764606           check1.word ^= bf_P[0];
393 2764606           ROUND(check2, check1, 1);
394 2764606           ROUND(check1, check2, 2);
395 2764606           ROUND(check2, check1, 3);
396              
397 2764606           ROUND(check1, check2, 4);
398 2764606           ROUND(check2, check1, 5);
399 2764606           ROUND(check1, check2, 6);
400 2764606           ROUND(check2, check1, 7);
401 2764606           ROUND(check1, check2, 8);
402 2764606           ROUND(check2, check1, 9);
403 2764606           ROUND(check1, check2, 10);
404 2764606           ROUND(check2, check1, 11);
405 2764606           ROUND(check1, check2, 12);
406 2764606           ROUND(check2, check1, 13);
407 2764606           ROUND(check1, check2, 14);
408 2764606           ROUND(check2, check1, 15);
409 2764606           ROUND(check1, check2, 16);
410 2764606           check2.word ^= bf_P[17];
411 2764606           *xr = check1.word;
412 2764606           *xl = check2.word;
413 2764606           }
414              
415 0           void decipher_big (UWORD_32bits *xl, UWORD_32bits *xr)
416             {
417             union aword_big check1;
418             union aword_big check2;
419 0           check1.word = *xl;
420 0           check2.word = *xr;
421             /* This is where data is deciphered, and it goes through 16 rounds of decipherment */
422 0           check1.word ^= bf_P[17];
423 0           ROUND(check2, check1, 16);
424 0           ROUND(check1, check2, 15);
425 0           ROUND(check2, check1, 14);
426 0           ROUND(check1, check2, 13);
427 0           ROUND(check2, check1, 12);
428 0           ROUND(check1, check2, 11);
429 0           ROUND(check2, check1, 10);
430 0           ROUND(check1, check2, 9);
431 0           ROUND(check2, check1, 8);
432 0           ROUND(check1, check2, 7);
433 0           ROUND(check2, check1, 6);
434 0           ROUND(check1, check2, 5);
435 0           ROUND(check2, check1, 4);
436 0           ROUND(check1, check2, 3);
437 0           ROUND(check2, check1, 2);
438 0           ROUND(check1, check2, 1);
439 0           check2.word ^= bf_P[0];
440 0           *xl = check2.word;
441 0           *xr = check1.word;
442 0           }
443              
444 2762516           void decipher_little (UWORD_32bits *xl, UWORD_32bits *xr)
445             {
446             union aword_little check1;
447             union aword_little check2;
448 2762516           check1.word = *xl;
449 2762516           check2.word = *xr;
450             /* This is where data is deciphered, and it goes through 16 rounds of decipherment */
451 2762516           check1.word ^= bf_P[17];
452 2762516           ROUND(check2, check1, 16);
453 2762516           ROUND(check1, check2, 15);
454 2762516           ROUND(check2, check1, 14);
455 2762516           ROUND(check1, check2, 13);
456 2762516           ROUND(check2, check1, 12);
457 2762516           ROUND(check1, check2, 11);
458 2762516           ROUND(check2, check1, 10);
459 2762516           ROUND(check1, check2, 9);
460 2762516           ROUND(check2, check1, 8);
461 2762516           ROUND(check1, check2, 7);
462 2762516           ROUND(check2, check1, 6);
463 2762516           ROUND(check1, check2, 5);
464 2762516           ROUND(check2, check1, 4);
465 2762516           ROUND(check1, check2, 3);
466 2762516           ROUND(check2, check1, 2);
467 2762516           ROUND(check1, check2, 1);
468 2762516           check2.word ^= bf_P[0];
469 2762516           *xl = check2.word;
470 2762516           *xr = check1.word;
471 2762516           }
472              
473 116           void init (UBYTE_08bits * key, short keybytes, int bxtouse, short big)
474             {
475             /* This function initializes the sub keys for the blowfish algorithm */
476             int i, j, bx;
477             time_t lowest;
478             UWORD_32bits data;
479             UWORD_32bits datal;
480             UWORD_32bits datar;
481             union aword_big temp_big;
482             union aword_little temp_little;
483 128 100         for (i = 0; i < BOXES; i++)
484 124 100         if (box[i].P != NULL) {
485 121 100         if ((box[i].keybytes == keybytes) &&
    50          
486 112           (memcmp((char *) (box[i].key), (char *) key, keybytes) == 0)) {
487 112           bf_P = box[i].P;
488 112           bf_S = box[i].S;
489 112           return;
490             }
491             }
492 4           bx = (-1);
493              
494 14 100         for (i = 0; i < BOXES; i++) {
495 10 100         if (box[i].P == NULL) {
496 1           bx = i;
497 1           i = BOXES + 1;
498             }
499             }
500 4 100         if (bx < 0) {
501 3           bx = bxtouse;
502 3           free(box[bx].P);
503 15 100         for (i = 0; i < 4; i++)
504 12           free(box[bx].S[i]);
505 3           free(box[bx].S);
506             }
507 4           box[bx].P = (UWORD_32bits *) malloc((bf_N + 2) * sizeof(UWORD_32bits));
508 4           box[bx].S = (UWORD_32bits **) malloc(4 * sizeof(UWORD_32bits *));
509 20 100         for (i = 0; i < 4; i++)
510 16           box[bx].S[i] = (UWORD_32bits *) malloc(256 * sizeof(UWORD_32bits));
511 4           bf_P = box[bx].P;
512 4           bf_S = box[bx].S;
513 4           box[bx].keybytes = keybytes;
514 4           memcpy(box[bx].key, key, keybytes);
515 76 100         for (i = 0; i < bf_N + 2; i++)
516 72           bf_P[i] = initbf_P[i];
517 20 100         for (i = 0; i < 4; i++)
518 4112 100         for (j = 0; j < 256; j++)
519 4096           bf_S[i][j] = initbf_S[i][j];
520 4           j = 0;
521 76 100         for (i = 0; i < bf_N + 2; ++i) {
522 72 50         if( big == 1 ) {
523 0           temp_big.word = 0;
524 0           temp_big.w.byte0 = key[j];
525 0           temp_big.w.byte1 = key[(j + 1) % keybytes];
526 0           temp_big.w.byte2 = key[(j + 2) % keybytes];
527 0           temp_big.w.byte3 = key[(j + 3) % keybytes];
528 0           data = temp_big.word;
529             } else {
530 72           temp_little.word = 0;
531 72           temp_little.w.byte0 = key[j];
532 72           temp_little.w.byte1 = key[(j + 1) % keybytes];
533 72           temp_little.w.byte2 = key[(j + 2) % keybytes];
534 72           temp_little.w.byte3 = key[(j + 3) % keybytes];
535 72           data = temp_little.word;
536             }
537 72           bf_P[i] = bf_P[i] ^ data;
538 72           j = (j + 4) % keybytes;
539             }
540 4           datal = 0x00000000;
541 4           datar = 0x00000000;
542 40 100         for (i = 0; i < bf_N + 2; i += 2) {
543 36 50         if( big == 1 )
544 0           encipher_big(&datal, &datar);
545             else
546 36           encipher_little(&datal, &datar);
547 36           bf_P[i] = datal;
548 36           bf_P[i + 1] = datar;
549             }
550 20 100         for (i = 0; i < 4; ++i) {
551 2064 100         for (j = 0; j < 256; j += 2) {
552 2048 50         if( big == 1 )
553 0           encipher_big(&datal, &datar);
554             else
555 2048           encipher_little(&datal, &datar);
556 2048           bf_S[i][j] = datal;
557 2048           bf_S[i][j + 1] = datar;
558             }
559             }
560             }
561              
562             /* char *base64 = "./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; */
563             char *base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
564              
565 33150192           int base64dec (char c)
566             {
567             int i;
568 881242732 50         for (i = 0; i < 64; i++)
569 881242732 100         if (base64[i] == c)
570 33150192           return i;
571 0           return 0;
572             }
573              
574 59           char *b_encrypt (UBYTE_08bits *key, char *str, short big, short b_signed)
575             {
576             UWORD_32bits left, right;
577             char *p, *s, *dest, *d;
578             int i;
579              
580 59 100         if(!b_signed)
581 57           b_signed = 0;
582              
583 59           dest = (char *) malloc((strlen(str) + 9) * 2);
584 59           s = (char *) malloc(strlen(str) + 9);
585 59           strcpy(s, str);
586 59           p = s;
587              
588 22100207 100         while (*p)
589 22100148           p++;
590              
591 531 100         for (i = 0; i < 8; i++)
592 472           *p++ = 0;
593              
594 59           init(key, (short) strlen((char *) key), 0, big);
595              
596 59           p = s;
597 59           d = dest;
598              
599 2762581 100         while (*p) {
600 2762522 100         left = (( b_signed == 0 ? (unsigned char)(*p++) : (*p++) ) << 24);
601 2762522 100         left += (( b_signed == 0 ? (unsigned char)(*p++) : (*p++) ) << 16);
602 2762522 100         left += (( b_signed == 0 ? (unsigned char)(*p++) : (*p++) ) << 8);
603 2762522 100         left += ( b_signed == 0 ? (unsigned char)(*p++) : (*p++) );
604              
605 2762522 100         right = (( b_signed == 0 ? (unsigned char)(*p++) : (*p++) ) << 24);
606 2762522 100         right += (( b_signed == 0 ? (unsigned char)(*p++) : (*p++) ) << 16);
607 2762522 100         right += (( b_signed == 0 ? (unsigned char)(*p++) : (*p++) ) << 8);
608 2762522 100         right += ( b_signed == 0 ? (unsigned char)(*p++) : (*p++) );
609              
610 2762522 50         if( big == 1 )
611 0           encipher_big(&left, &right);
612             else
613 2762522           encipher_little(&left, &right);
614              
615 19337654 100         for (i = 0; i < 6; i++) {
616 16575132           *d++ = base64[right & 0x3f];
617 16575132           right = (right >> 6);
618             }
619 19337654 100         for (i = 0; i < 6; i++) {
620 16575132           *d++ = base64[left & 0x3f];
621 16575132           left = (left >> 6);
622             }
623             }
624 59           *d = 0;
625 59           free(s);
626 59           return dest;
627             }
628              
629 57           char *b_decrypt (UBYTE_08bits *key, char *str, short big)
630             {
631             UWORD_32bits left, right;
632              
633             char *p, *s, *dest, *d;
634             int i;
635 57           dest = (char *) malloc(strlen(str) + 12);
636 57           s = (char *) malloc(strlen(str) + 12);
637 57           strcpy(s, str);
638 57           p = s;
639              
640 33150249 100         while (*p)
641 33150192           p++;
642              
643 741 100         for (i = 0; i < 12; i++)
644 684           *p++ = 0;
645              
646 57           init(key, (short) strlen((char *) key), 0, big);
647              
648 57           p = s;
649 57           d = dest;
650              
651 2762573 100         while (*p) {
652 2762516           right = 0L;
653 2762516           left = 0L;
654              
655 19337612 100         for (i = 0; i < 6; i++)
656 16575096           right |= (base64dec(*p++)) << (i * 6);
657              
658 19337612 100         for (i = 0; i < 6; i++)
659 16575096           left |= (base64dec(*p++)) << (i * 6);
660              
661 2762516 50         if( big == 1 )
662 0           decipher_big(&left, &right);
663             else
664 2762516           decipher_little(&left, &right);
665              
666 13812580 100         for (i = 0; i < 4; i++)
667 11050064           *d++ = (left & (0xff << ((3 - i) * 8))) >> ((3 - i) * 8);
668 13812580 100         for (i = 0; i < 4; i++)
669 11050064           *d++ = (right & (0xff << ((3 - i) * 8))) >> ((3 - i) * 8);
670             }
671 57           *d = 0;
672 57           free(s);
673 57           return dest;
674             }