Pol  Revision:cb584c9
Go to the documentation of this file.
1 #include <string.h>
3 #include "blowfish.h"
4 #include "cryptbase.h"
6 // Crypt Boxes
7 namespace Pol
8 {
9 namespace Crypt
10 {
11 static unsigned int p_box[18] = {0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822,
12  0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377,
13  0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5,
14  0xb5470917, 0x9216d5d9, 0x8979fb1b};
16 static unsigned int s_box[1024] = {
17  0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
18  0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
19  0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
20  0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
21  0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
22  0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
23  0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
24  0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
25  0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
26  0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
27  0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
28  0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
29  0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
30  0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
31  0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
32  0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
33  0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
34  0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
35  0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
36  0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
37  0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
38  0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
39  0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
40  0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
41  0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
42  0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
43  0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
44  0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
45  0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
46  0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
47  0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
48  0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,
49  0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
50  0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
51  0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
52  0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
53  0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
54  0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
55  0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
56  0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
57  0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
58  0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
59  0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
60  0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
61  0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
62  0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
63  0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
64  0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
65  0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
66  0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
67  0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
68  0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
69  0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
70  0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
71  0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
72  0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
73  0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
74  0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
75  0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
76  0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
77  0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
78  0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
79  0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
80  0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,
81  0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
82  0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
83  0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
84  0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
85  0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
86  0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
87  0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
88  0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
89  0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
90  0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
91  0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
92  0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
93  0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
94  0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
95  0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
96  0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
97  0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
98  0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
99  0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
100  0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
101  0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
102  0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
103  0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
104  0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
105  0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
106  0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
107  0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
108  0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
109  0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
110  0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
111  0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
112  0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
113  0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
114  0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
115  0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
116  0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
117  0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
118  0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
119  0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
120  0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
121  0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
122  0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
123  0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
124  0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
125  0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
126  0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
127  0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
128  0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
129  0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
130  0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
131  0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
132  0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
133  0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
134  0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
135  0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
136  0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
137  0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
138  0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
139  0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
140  0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
141  0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
142  0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
143  0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
144  0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6};
146 // Key Table
148  {0x91, 0x3C, 0x2B, 0x0F, 0x44, 0xC6}, {0x0C, 0x96, 0xD2, 0x40, 0x93, 0x21},
149  {0xF2, 0x12, 0xA5, 0xAA, 0xDA, 0xE9}, {0x9A, 0xD4, 0xF7, 0x14, 0x97, 0xD0},
150  {0xFC, 0xC9, 0xC7, 0xD6, 0xA8, 0xA3}, {0x7B, 0x67, 0x36, 0x9B, 0x0B, 0x1A},
151  {0x03, 0xAC, 0xF9, 0x02, 0xAE, 0x2D}, {0x01, 0x77, 0x79, 0x6B, 0x0C, 0x67},
152  {0xA4, 0xB4, 0x1E, 0xD7, 0xAA, 0x51}, {0xD6, 0xE1, 0xBC, 0x27, 0x15, 0x25},
153  {0x17, 0x17, 0x47, 0x65, 0x40, 0x8B}, {0xB8, 0x19, 0xDB, 0x4E, 0x17, 0x74},
154  {0xAA, 0x63, 0xAC, 0x37, 0xA0, 0x8F}, {0x77, 0xCD, 0x5D, 0x23, 0xEF, 0xB7},
155  {0x13, 0x2B, 0x83, 0xBF, 0x0F, 0x8C}, {0xB1, 0x0B, 0xC8, 0x6F, 0x39, 0x4D},
156  {0xA1, 0xA5, 0xFA, 0x2B, 0xC6, 0xE2}, {0x9C, 0x29, 0xCC, 0x26, 0xE9, 0x2D},
157  {0xCD, 0x6F, 0xD2, 0xCA, 0xBE, 0x47}, {0x9B, 0x21, 0xAE, 0x3E, 0x31, 0x69},
158  {0xE7, 0x0B, 0xE6, 0x6F, 0xCF, 0x91}, {0x88, 0x59, 0xAF, 0x90, 0xC5, 0x2D},
159  {0xAE, 0xD2, 0x52, 0xB5, 0x28, 0x98}, {0x3B, 0x7F, 0x65, 0xED, 0x5E, 0x93},
160  {0x30, 0xBF, 0x0A, 0x34, 0xDB, 0x3D}};
162 // Seed Table
163 static unsigned char seed_table[2][CRYPT_GAMESEED_COUNT][2][CRYPT_GAMESEED_LENGTH] = {
164  {{{0x9E, 0xEC, 0x5B, 0x3C, 0x8F, 0xA8, 0x8C, 0x55},
165  {0xB6, 0x21, 0x71, 0x98, 0xA4, 0x47, 0x22, 0x58}},
166  {{0xF8, 0xC4, 0xD8, 0x72, 0x54, 0xFC, 0xF9, 0xDE},
167  {0x2D, 0x53, 0xDB, 0x32, 0x03, 0x10, 0x5A, 0x18}},
168  {{0x89, 0x9F, 0x5C, 0x53, 0x06, 0x7F, 0x44, 0x38},
169  {0x32, 0xCE, 0xAC, 0xDB, 0x91, 0x44, 0x4E, 0x1E}},
170  {{0x29, 0x78, 0x5A, 0xF0, 0xAB, 0x00, 0x7F, 0x91},
171  {0xE6, 0xB6, 0xD2, 0xE7, 0xA0, 0x05, 0xC2, 0xF2}},
172  {{0x8D, 0x46, 0xA9, 0xBB, 0x52, 0x1B, 0x41, 0xDF},
173  {0xF0, 0x4A, 0xC9, 0x14, 0x27, 0xA9, 0x6B, 0x4A}},
174  {{0x91, 0x4B, 0x8A, 0x80, 0xF5, 0xCF, 0xBB, 0x3C},
175  {0xBC, 0xF4, 0xC9, 0xD5, 0x42, 0x7A, 0xFA, 0xB7}},
176  {{0xD5, 0x8C, 0x01, 0xC0, 0xFD, 0x1E, 0xAA, 0x57},
177  {0xC1, 0x20, 0x7A, 0x38, 0x2C, 0xB7, 0xCD, 0x14}},
178  {{0x55, 0x9F, 0xD1, 0x5B, 0xFB, 0x70, 0xC0, 0x77},
179  {0xA4, 0x15, 0xB3, 0x9F, 0x6B, 0xBB, 0x10, 0x5A}},
180  {{0x80, 0x9D, 0x16, 0x54, 0x6B, 0x7C, 0x5F, 0xAD},
181  {0x35, 0xCB, 0x92, 0x24, 0x08, 0x11, 0xD9, 0x61}},
182  {{0x24, 0xA7, 0x75, 0xBF, 0x4D, 0x7E, 0x70, 0x0C},
183  {0x90, 0xCF, 0x9C, 0x04, 0xAC, 0x53, 0x89, 0xEF}},
184  {{0x99, 0x22, 0xF6, 0x89, 0x10, 0xE6, 0x72, 0x23},
185  {0x0A, 0x5C, 0xA5, 0xFF, 0x9C, 0x78, 0xDA, 0x7F}},
186  {{0xDF, 0xFF, 0xBB, 0x11, 0x6B, 0x75, 0xF0, 0x29},
187  {0xA5, 0x86, 0xD0, 0x53, 0x77, 0xE7, 0xB1, 0x0D}},
188  {{0x4C, 0x06, 0xDA, 0x55, 0x4E, 0x50, 0x1B, 0x7A},
189  {0x1C, 0x90, 0xCE, 0x64, 0xD6, 0x17, 0x52, 0xFB}},
190  {{0x00, 0x26, 0x75, 0x25, 0xCD, 0x95, 0x15, 0x0F},
191  {0x13, 0xD8, 0xAB, 0x30, 0xF1, 0xC5, 0xC5, 0xFA}},
192  {{0x0C, 0x8E, 0x86, 0x1E, 0x3F, 0xCB, 0x8B, 0xD1},
193  {0xEC, 0xCE, 0xA9, 0x96, 0x91, 0x11, 0xB4, 0x97}},
194  {{0x1E, 0x65, 0x5F, 0xA4, 0x55, 0xEB, 0xEC, 0xCF},
195  {0x19, 0xD9, 0x9F, 0xE0, 0x5E, 0x57, 0x45, 0x73}},
196  {{0x0E, 0x2D, 0x18, 0xE1, 0x55, 0x05, 0x04, 0xBF},
197  {0x5E, 0x81, 0x1F, 0xDD, 0xFF, 0x5C, 0xC3, 0xF4}},
198  {{0xF2, 0x06, 0x56, 0x54, 0x4D, 0xFB, 0x96, 0x54},
199  {0x33, 0x97, 0x07, 0x43, 0x4F, 0x39, 0xC4, 0xA8}},
200  {{0x5E, 0x02, 0x37, 0x17, 0x7B, 0x64, 0xE6, 0xA2},
201  {0x2E, 0x24, 0x13, 0x07, 0xFE, 0xA1, 0x88, 0xB7}},
202  {{0x60, 0xDD, 0x4C, 0xE0, 0xA1, 0xDC, 0xBA, 0x6C},
203  {0x81, 0x5C, 0x3F, 0x93, 0x7A, 0x1F, 0x2A, 0x1C}},
204  {{0xAE, 0x5C, 0xBE, 0x9D, 0x84, 0x6F, 0xCB, 0x51},
205  {0x4D, 0x13, 0xC6, 0x81, 0x28, 0xC3, 0x03, 0x34}},
206  {{0xB0, 0x5D, 0xCB, 0x8D, 0x69, 0x1C, 0xDE, 0x29},
207  {0x31, 0xF1, 0x22, 0xC3, 0x1C, 0x82, 0x8A, 0x57}},
208  {{0x08, 0x32, 0x8B, 0xA2, 0x1E, 0x12, 0xC9, 0xB9},
209  {0xCD, 0xA8, 0xE6, 0x1C, 0x59, 0xAC, 0x0C, 0xF6}},
210  {{0xA5, 0x3B, 0xE4, 0x64, 0x2F, 0x45, 0x33, 0xA2},
211  {0x4A, 0xDA, 0x39, 0xE2, 0x0E, 0x94, 0xF2, 0xAA}},
212  {{0xB0, 0x82, 0xB7, 0x33, 0xD2, 0x6F, 0xC0, 0x00},
213  {0xD7, 0x8D, 0x1F, 0x8E, 0x79, 0x85, 0x3E, 0x2A}}},
214  {{{0xD2, 0xB7, 0xF6, 0x9C, 0xCF, 0x06, 0xE8, 0xC1},
215  {0xAE, 0xEB, 0x7F, 0xE9, 0x87, 0x28, 0x1C, 0x9B}},
216  {{0xE8, 0x8C, 0x2A, 0x97, 0xD1, 0xD2, 0xA6, 0x76},
217  {0xAD, 0x23, 0x69, 0xA0, 0xEF, 0x1F, 0x8C, 0xBA}},
218  {{0x24, 0x62, 0x40, 0x0B, 0x21, 0xC6, 0x07, 0x89},
219  {0xBA, 0x60, 0x9E, 0x26, 0x98, 0x18, 0xAF, 0x01}},
220  {{0xDF, 0x2B, 0x56, 0xC9, 0xB3, 0x72, 0x35, 0x8D},
221  {0x1D, 0x4F, 0x61, 0xAF, 0x53, 0x12, 0x6E, 0x49}},
222  {{0x1C, 0x87, 0x6C, 0xB1, 0xD4, 0x1B, 0xA2, 0xB2},
223  {0xD4, 0xA1, 0x2C, 0xE2, 0x2F, 0xE9, 0xA4, 0x62}},
224  {{0x17, 0x83, 0x1C, 0x68, 0xB3, 0xD6, 0x65, 0x2D},
225  {0x81, 0x5B, 0x4D, 0x9B, 0x15, 0x6F, 0x0B, 0xDF}},
226  {{0xCE, 0x91, 0xB9, 0x8A, 0x61, 0x20, 0xB1, 0xF9},
227  {0xCA, 0x0A, 0xC4, 0x76, 0x5B, 0x4B, 0xAB, 0x16}},
228  {{0x5B, 0xD2, 0x4A, 0xFD, 0x44, 0xB7, 0xDF, 0x1F},
229  {0x8B, 0x6F, 0xAB, 0x0C, 0xAB, 0x3D, 0x0C, 0x7A}},
230  {{0x35, 0x6C, 0xBD, 0xFF, 0x62, 0x53, 0x77, 0x44},
231  {0xF2, 0x44, 0x5F, 0x8C, 0x59, 0x25, 0x5F, 0x6B}},
232  {{0xB5, 0x27, 0x0D, 0xD2, 0x23, 0xBE, 0x40, 0xB3},
233  {0x3E, 0x8B, 0x92, 0xB1, 0x78, 0x57, 0xCB, 0xB0}},
234  {{0xB3, 0xB4, 0xB6, 0xD5, 0xB6, 0xA7, 0x66, 0x6E},
235  {0xFB, 0xA7, 0x32, 0x93, 0xEE, 0x79, 0x61, 0x45}},
236  {{0x49, 0xD7, 0x93, 0x34, 0x90, 0x1A, 0xAD, 0x2C},
237  {0x84, 0x3E, 0xE9, 0x0B, 0x2C, 0xC6, 0xB3, 0xB1}},
238  {{0x82, 0xFB, 0x86, 0xEC, 0xA8, 0x76, 0x55, 0x98},
239  {0x7E, 0xE3, 0xA2, 0x47, 0xB6, 0x72, 0x05, 0x61}},
240  {{0x0B, 0xA5, 0x72, 0x17, 0xCB, 0x18, 0xAE, 0x03},
241  {0x8C, 0x61, 0x32, 0xD9, 0x2B, 0x42, 0xEF, 0xF2}},
242  {{0x3F, 0x0A, 0x06, 0x82, 0x09, 0xC9, 0x76, 0xF2},
243  {0x3D, 0x54, 0x50, 0xFD, 0x25, 0xA2, 0x2F, 0x2E}},
244  {{0xF1, 0x34, 0x64, 0x94, 0xDC, 0x90, 0x58, 0x5D},
245  {0x1E, 0x6F, 0xB4, 0xEF, 0x73, 0xE8, 0xB0, 0xED}},
246  {{0xC0, 0xD2, 0xE1, 0x42, 0xEC, 0x04, 0x69, 0xA8},
247  {0x27, 0x9C, 0x7C, 0x79, 0x87, 0x9A, 0xB2, 0x48}},
248  {{0x50, 0x73, 0xEC, 0x1E, 0x4D, 0xD0, 0x80, 0x51},
249  {0x46, 0x21, 0xC9, 0xF8, 0x93, 0xCC, 0xE8, 0x41}},
250  {{0x70, 0xC9, 0xE4, 0x78, 0x8F, 0x6B, 0x2C, 0x27},
251  {0x4C, 0x7E, 0x2C, 0x5A, 0x15, 0x69, 0x64, 0xDD}},
252  {{0x00, 0xC7, 0x09, 0xCD, 0xF6, 0x2D, 0x2D, 0x31},
253  {0x6F, 0x01, 0x01, 0x3E, 0xCD, 0x60, 0x16, 0xB4}},
254  {{0xE7, 0xE8, 0x76, 0xC4, 0x50, 0x4F, 0x08, 0x5B},
255  {0x62, 0x28, 0x24, 0x42, 0x7D, 0x9A, 0x19, 0x26}},
256  {{0x2F, 0xD4, 0x67, 0xB9, 0x24, 0x0C, 0xBB, 0x14},
257  {0x7D, 0x19, 0xC8, 0x73, 0x79, 0xA7, 0x70, 0xCF}},
258  {{0x2D, 0x53, 0xDC, 0x91, 0x83, 0xF2, 0x0C, 0x12},
259  {0x3B, 0xAF, 0x1B, 0x6B, 0x02, 0x99, 0x8B, 0x61}},
260  {{0xE3, 0x2C, 0xA2, 0x54, 0xCD, 0x51, 0xAF, 0xE5},
261  {0x18, 0x58, 0x11, 0x7F, 0xF0, 0x50, 0x9C, 0x15}},
262  {{0x6E, 0x26, 0x01, 0xE9, 0xDB, 0x50, 0x13, 0xEA},
263  {0x22, 0x59, 0x30, 0x3B, 0xE4, 0x5F, 0x43, 0x1E}}}};
265 static unsigned int p_table[CRYPT_GAMEKEY_COUNT][18];
266 static unsigned int s_table[CRYPT_GAMEKEY_COUNT][1024];
268 bool BlowFish::tables_ready = false;
270 // Constructor / Destructor
271 BlowFish::BlowFish() : table_index( 0 ), block_pos( 0 ), stream_pos( 0 )
272 {
273  memset( &game_seed, 0, sizeof( game_seed ) );
274 }
277 // Public Member Functions
280 {
281  if ( !tables_ready )
282  InitTables();
285  memcpy( game_seed, seed_table[0][table_index][0], CRYPT_GAMESEED_LENGTH );
286  stream_pos = 0;
287  block_pos = 0;
288 }
290 void BlowFish::Decrypt( unsigned char* in, unsigned char* out, int len )
291 {
292  if ( stream_pos + len > CRYPT_GAMETABLE_TRIGGER )
293  {
294  int len_rem = CRYPT_GAMETABLE_TRIGGER - stream_pos;
296  Decrypt( in, out, len_rem );
299  memcpy( game_seed, seed_table[1][table_index][0], CRYPT_GAMESEED_LENGTH );
300  stream_pos = 0;
301  block_pos = 0;
303  in += len_rem;
304  out += len_rem;
305  len -= len_rem;
306  }
307  for ( int tempPos = 0; tempPos < len; tempPos++ )
308  {
309  if ( !block_pos )
310  {
311  unsigned int values[2];
313  unsigned char* pKey = game_seed;
314  N2L( pKey, values[0] );
315  N2L( pKey, values[1] );
317  RawDecrypt( (unsigned int*)values, table_index );
319  pKey = game_seed;
320  L2N( values[0], pKey );
321  L2N( values[1], pKey );
322  }
324  block_pos &= 0x07;
325  unsigned char c = *in++;
326  *out++ = game_seed[block_pos] ^ c;
327  game_seed[block_pos] = c;
329  block_pos = ( block_pos + 1 ) & 0x07;
330  }
332  stream_pos += len;
333 }
335 // Protected Member Functions
338 {
339  for ( int tempKey = 0; tempKey < CRYPT_GAMEKEY_COUNT; tempKey++ )
340  {
341  memcpy( p_table[tempKey], p_box, sizeof( p_box ) );
342  memcpy( s_table[tempKey], s_box, sizeof( s_box ) );
344  unsigned char* pAct = key_table[tempKey];
345  int j = 0;
347  for ( int i = 0; i < 18; i++ )
348  {
349  unsigned int mask = 0x00000000;
350  for ( int k = 0; k < 4; ++k )
351  {
352  mask = ( mask << 8 ) | *pAct++;
353  if ( ++j >= CRYPT_GAMEKEY_LENGTH )
354  {
355  j = 0;
356  pAct = key_table[tempKey];
357  }
358  }
359  p_table[tempKey][i] ^= mask;
360  }
362  unsigned int value[2];
363  value[0] = value[1] = 0;
365  for ( int i = 0; i < 18; i += 2 )
366  {
367  RawDecrypt( value, tempKey );
368  p_table[tempKey][i] = value[0];
369  p_table[tempKey][i + 1] = value[1];
370  }
372  for ( int i = 0; i < 1024; i += 2 )
373  {
374  RawDecrypt( value, tempKey );
375  s_table[tempKey][i] = value[0];
376  s_table[tempKey][i + 1] = value[1];
377  }
378  }
380  tables_ready = true;
381 }
383 void BlowFish::RawDecrypt( unsigned int* values, int table )
384 {
385  unsigned int left = values[0];
386  unsigned int right = values[1];
388  left ^= p_table[table][0];
390  for ( int i = 1; i < 16; i += 2 )
391  {
392  ROUND( right, left, s_table[table], p_table[table][i] );
393  ROUND( left, right, s_table[table], p_table[table][i + 1] );
394  }
395  right ^= p_table[table][17];
397  values[1] = left;
398  values[0] = right;
399 }
400 }
401 }
Definition: cryptbase.h:55
static unsigned int s_box[1024]
Definition: blowfish.cpp:16
static void RawDecrypt(unsigned int *values, int table)
Definition: blowfish.cpp:383
static unsigned int s_table[CRYPT_GAMEKEY_COUNT][1024]
Definition: blowfish.cpp:266
Definition: cryptbase.h:54
#define ROUND(LL, R, S, P)
Definition: cryptbase.cpp:66
static unsigned char key_table[CRYPT_GAMEKEY_COUNT][CRYPT_GAMEKEY_LENGTH]
Definition: blowfish.cpp:147
#define N2L(C, LL)
Definition: cryptbase.cpp:58
Definition: cryptbase.h:50
static bool tables_ready
Definition: blowfish.h:29
Definition: cryptbase.h:47
unsigned char game_seed[CRYPT_GAMESEED_LENGTH]
Definition: blowfish.h:30
static void InitTables()
Definition: blowfish.cpp:337
Definition: cryptbase.h:52
static unsigned int p_table[CRYPT_GAMEKEY_COUNT][18]
Definition: blowfish.cpp:265
Definition: cryptbase.h:49
Definition: cryptbase.h:53
static unsigned int p_box[18]
Definition: blowfish.cpp:11
#define L2N(LL, C)
Definition: cryptbase.cpp:61
static unsigned char seed_table[2][CRYPT_GAMESEED_COUNT][2][CRYPT_GAMESEED_LENGTH]
Definition: blowfish.cpp:163
Definition: berror.cpp:12
void Decrypt(unsigned char *in, unsigned char *out, int len)
Definition: blowfish.cpp:290
Definition: cryptbase.h:46