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