blob: e449da38fcd0ce609f6ecc49b57797774952a9a3 [file] [log] [blame]
Bram Moolenaar40e6a712010-05-16 22:32:54 +02001/* vi:set ts=8 sts=4 sw=4:
2 *
Bram Moolenaar0bbabe82010-05-17 20:32:55 +02003 * VIM - Vi IMproved by Bram Moolenaar
4 *
5 * Do ":help uganda" in Vim to read copying and usage conditions.
6 * Do ":help credits" in Vim to see a list of people who contributed.
7 * See README.txt for an overview of the Vim source code.
8 *
Bram Moolenaar823a1652010-05-16 23:02:33 +02009 * Blowfish encryption for Vim; in Blowfish output feedback mode.
Bram Moolenaar0bbabe82010-05-17 20:32:55 +020010 * Contributed by Mohsin Ahmed, http://www.cs.albany.edu/~mosh
Bram Moolenaar40e6a712010-05-16 22:32:54 +020011 * Based on http://www.schneier.com/blowfish.html by Bruce Schneier.
12 */
13
14#include "vim.h"
15
16#if defined(FEAT_CRYPT)
17
18#define ARRAY_LENGTH(A) (sizeof(A)/sizeof(A[0]))
19
20#define BF_BLOCK 8
21#define BF_OFB_LEN (8*(BF_BLOCK))
22
23typedef union {
Bram Moolenaarfa7584c2010-05-19 21:57:45 +020024 UINT32_T ul[2];
Bram Moolenaar0bbabe82010-05-17 20:32:55 +020025 char_u uc[8];
Bram Moolenaar40e6a712010-05-16 22:32:54 +020026} block8;
27
Bram Moolenaar442b4222010-05-24 21:34:22 +020028#if defined(WIN3264) || defined(DOS32)
Bram Moolenaar0bbabe82010-05-17 20:32:55 +020029 /* MS-Windows is always little endian */
Bram Moolenaar40e6a712010-05-16 22:32:54 +020030#else
Bram Moolenaar0bbabe82010-05-17 20:32:55 +020031# ifdef HAVE_CONFIG_H
32 /* in configure.in AC_C_BIGENDIAN() defines WORDS_BIGENDIAN when needed */
33# else
34 error!
35 Please change this code to define WORDS_BIGENDIAN for big-endian machines.
Bram Moolenaar40e6a712010-05-16 22:32:54 +020036# endif
37#endif
38
Bram Moolenaarfa7584c2010-05-19 21:57:45 +020039static void bf_e_block __ARGS((UINT32_T *p_xl, UINT32_T *p_xr));
Bram Moolenaar40e6a712010-05-16 22:32:54 +020040static void bf_e_cblock __ARGS((char_u *block));
Bram Moolenaarfa7584c2010-05-19 21:57:45 +020041static int bf_check_tables __ARGS((UINT32_T ipa[18], UINT32_T sbi[4][256], UINT32_T val));
Bram Moolenaar40e6a712010-05-16 22:32:54 +020042static int bf_self_test __ARGS((void));
43
Bram Moolenaar4a9b19a2010-05-18 21:17:10 +020044/* Blowfish code */
Bram Moolenaarfa7584c2010-05-19 21:57:45 +020045static UINT32_T pax[18];
46static UINT32_T ipa[18] = {
Bram Moolenaar40e6a712010-05-16 22:32:54 +020047 0x243f6a88u, 0x85a308d3u, 0x13198a2eu,
48 0x03707344u, 0xa4093822u, 0x299f31d0u,
49 0x082efa98u, 0xec4e6c89u, 0x452821e6u,
50 0x38d01377u, 0xbe5466cfu, 0x34e90c6cu,
51 0xc0ac29b7u, 0xc97c50ddu, 0x3f84d5b5u,
52 0xb5470917u, 0x9216d5d9u, 0x8979fb1bu
53};
54
Bram Moolenaarfa7584c2010-05-19 21:57:45 +020055static UINT32_T sbx[4][256];
56static UINT32_T sbi[4][256] = {
Bram Moolenaar40e6a712010-05-16 22:32:54 +020057 {0xd1310ba6u, 0x98dfb5acu, 0x2ffd72dbu, 0xd01adfb7u,
58 0xb8e1afedu, 0x6a267e96u, 0xba7c9045u, 0xf12c7f99u,
59 0x24a19947u, 0xb3916cf7u, 0x0801f2e2u, 0x858efc16u,
60 0x636920d8u, 0x71574e69u, 0xa458fea3u, 0xf4933d7eu,
61 0x0d95748fu, 0x728eb658u, 0x718bcd58u, 0x82154aeeu,
62 0x7b54a41du, 0xc25a59b5u, 0x9c30d539u, 0x2af26013u,
63 0xc5d1b023u, 0x286085f0u, 0xca417918u, 0xb8db38efu,
64 0x8e79dcb0u, 0x603a180eu, 0x6c9e0e8bu, 0xb01e8a3eu,
65 0xd71577c1u, 0xbd314b27u, 0x78af2fdau, 0x55605c60u,
66 0xe65525f3u, 0xaa55ab94u, 0x57489862u, 0x63e81440u,
67 0x55ca396au, 0x2aab10b6u, 0xb4cc5c34u, 0x1141e8ceu,
68 0xa15486afu, 0x7c72e993u, 0xb3ee1411u, 0x636fbc2au,
69 0x2ba9c55du, 0x741831f6u, 0xce5c3e16u, 0x9b87931eu,
70 0xafd6ba33u, 0x6c24cf5cu, 0x7a325381u, 0x28958677u,
71 0x3b8f4898u, 0x6b4bb9afu, 0xc4bfe81bu, 0x66282193u,
72 0x61d809ccu, 0xfb21a991u, 0x487cac60u, 0x5dec8032u,
73 0xef845d5du, 0xe98575b1u, 0xdc262302u, 0xeb651b88u,
74 0x23893e81u, 0xd396acc5u, 0x0f6d6ff3u, 0x83f44239u,
75 0x2e0b4482u, 0xa4842004u, 0x69c8f04au, 0x9e1f9b5eu,
76 0x21c66842u, 0xf6e96c9au, 0x670c9c61u, 0xabd388f0u,
77 0x6a51a0d2u, 0xd8542f68u, 0x960fa728u, 0xab5133a3u,
78 0x6eef0b6cu, 0x137a3be4u, 0xba3bf050u, 0x7efb2a98u,
79 0xa1f1651du, 0x39af0176u, 0x66ca593eu, 0x82430e88u,
80 0x8cee8619u, 0x456f9fb4u, 0x7d84a5c3u, 0x3b8b5ebeu,
81 0xe06f75d8u, 0x85c12073u, 0x401a449fu, 0x56c16aa6u,
82 0x4ed3aa62u, 0x363f7706u, 0x1bfedf72u, 0x429b023du,
83 0x37d0d724u, 0xd00a1248u, 0xdb0fead3u, 0x49f1c09bu,
84 0x075372c9u, 0x80991b7bu, 0x25d479d8u, 0xf6e8def7u,
85 0xe3fe501au, 0xb6794c3bu, 0x976ce0bdu, 0x04c006bau,
86 0xc1a94fb6u, 0x409f60c4u, 0x5e5c9ec2u, 0x196a2463u,
87 0x68fb6fafu, 0x3e6c53b5u, 0x1339b2ebu, 0x3b52ec6fu,
88 0x6dfc511fu, 0x9b30952cu, 0xcc814544u, 0xaf5ebd09u,
89 0xbee3d004u, 0xde334afdu, 0x660f2807u, 0x192e4bb3u,
90 0xc0cba857u, 0x45c8740fu, 0xd20b5f39u, 0xb9d3fbdbu,
91 0x5579c0bdu, 0x1a60320au, 0xd6a100c6u, 0x402c7279u,
92 0x679f25feu, 0xfb1fa3ccu, 0x8ea5e9f8u, 0xdb3222f8u,
93 0x3c7516dfu, 0xfd616b15u, 0x2f501ec8u, 0xad0552abu,
94 0x323db5fau, 0xfd238760u, 0x53317b48u, 0x3e00df82u,
95 0x9e5c57bbu, 0xca6f8ca0u, 0x1a87562eu, 0xdf1769dbu,
96 0xd542a8f6u, 0x287effc3u, 0xac6732c6u, 0x8c4f5573u,
97 0x695b27b0u, 0xbbca58c8u, 0xe1ffa35du, 0xb8f011a0u,
98 0x10fa3d98u, 0xfd2183b8u, 0x4afcb56cu, 0x2dd1d35bu,
99 0x9a53e479u, 0xb6f84565u, 0xd28e49bcu, 0x4bfb9790u,
100 0xe1ddf2dau, 0xa4cb7e33u, 0x62fb1341u, 0xcee4c6e8u,
101 0xef20cadau, 0x36774c01u, 0xd07e9efeu, 0x2bf11fb4u,
102 0x95dbda4du, 0xae909198u, 0xeaad8e71u, 0x6b93d5a0u,
103 0xd08ed1d0u, 0xafc725e0u, 0x8e3c5b2fu, 0x8e7594b7u,
104 0x8ff6e2fbu, 0xf2122b64u, 0x8888b812u, 0x900df01cu,
105 0x4fad5ea0u, 0x688fc31cu, 0xd1cff191u, 0xb3a8c1adu,
106 0x2f2f2218u, 0xbe0e1777u, 0xea752dfeu, 0x8b021fa1u,
107 0xe5a0cc0fu, 0xb56f74e8u, 0x18acf3d6u, 0xce89e299u,
108 0xb4a84fe0u, 0xfd13e0b7u, 0x7cc43b81u, 0xd2ada8d9u,
109 0x165fa266u, 0x80957705u, 0x93cc7314u, 0x211a1477u,
110 0xe6ad2065u, 0x77b5fa86u, 0xc75442f5u, 0xfb9d35cfu,
111 0xebcdaf0cu, 0x7b3e89a0u, 0xd6411bd3u, 0xae1e7e49u,
112 0x00250e2du, 0x2071b35eu, 0x226800bbu, 0x57b8e0afu,
113 0x2464369bu, 0xf009b91eu, 0x5563911du, 0x59dfa6aau,
114 0x78c14389u, 0xd95a537fu, 0x207d5ba2u, 0x02e5b9c5u,
115 0x83260376u, 0x6295cfa9u, 0x11c81968u, 0x4e734a41u,
116 0xb3472dcau, 0x7b14a94au, 0x1b510052u, 0x9a532915u,
117 0xd60f573fu, 0xbc9bc6e4u, 0x2b60a476u, 0x81e67400u,
118 0x08ba6fb5u, 0x571be91fu, 0xf296ec6bu, 0x2a0dd915u,
119 0xb6636521u, 0xe7b9f9b6u, 0xff34052eu, 0xc5855664u,
120 0x53b02d5du, 0xa99f8fa1u, 0x08ba4799u, 0x6e85076au},
121 {0x4b7a70e9u, 0xb5b32944u, 0xdb75092eu, 0xc4192623u,
122 0xad6ea6b0u, 0x49a7df7du, 0x9cee60b8u, 0x8fedb266u,
123 0xecaa8c71u, 0x699a17ffu, 0x5664526cu, 0xc2b19ee1u,
124 0x193602a5u, 0x75094c29u, 0xa0591340u, 0xe4183a3eu,
125 0x3f54989au, 0x5b429d65u, 0x6b8fe4d6u, 0x99f73fd6u,
126 0xa1d29c07u, 0xefe830f5u, 0x4d2d38e6u, 0xf0255dc1u,
127 0x4cdd2086u, 0x8470eb26u, 0x6382e9c6u, 0x021ecc5eu,
128 0x09686b3fu, 0x3ebaefc9u, 0x3c971814u, 0x6b6a70a1u,
129 0x687f3584u, 0x52a0e286u, 0xb79c5305u, 0xaa500737u,
130 0x3e07841cu, 0x7fdeae5cu, 0x8e7d44ecu, 0x5716f2b8u,
131 0xb03ada37u, 0xf0500c0du, 0xf01c1f04u, 0x0200b3ffu,
132 0xae0cf51au, 0x3cb574b2u, 0x25837a58u, 0xdc0921bdu,
133 0xd19113f9u, 0x7ca92ff6u, 0x94324773u, 0x22f54701u,
134 0x3ae5e581u, 0x37c2dadcu, 0xc8b57634u, 0x9af3dda7u,
135 0xa9446146u, 0x0fd0030eu, 0xecc8c73eu, 0xa4751e41u,
136 0xe238cd99u, 0x3bea0e2fu, 0x3280bba1u, 0x183eb331u,
137 0x4e548b38u, 0x4f6db908u, 0x6f420d03u, 0xf60a04bfu,
138 0x2cb81290u, 0x24977c79u, 0x5679b072u, 0xbcaf89afu,
139 0xde9a771fu, 0xd9930810u, 0xb38bae12u, 0xdccf3f2eu,
140 0x5512721fu, 0x2e6b7124u, 0x501adde6u, 0x9f84cd87u,
141 0x7a584718u, 0x7408da17u, 0xbc9f9abcu, 0xe94b7d8cu,
142 0xec7aec3au, 0xdb851dfau, 0x63094366u, 0xc464c3d2u,
143 0xef1c1847u, 0x3215d908u, 0xdd433b37u, 0x24c2ba16u,
144 0x12a14d43u, 0x2a65c451u, 0x50940002u, 0x133ae4ddu,
145 0x71dff89eu, 0x10314e55u, 0x81ac77d6u, 0x5f11199bu,
146 0x043556f1u, 0xd7a3c76bu, 0x3c11183bu, 0x5924a509u,
147 0xf28fe6edu, 0x97f1fbfau, 0x9ebabf2cu, 0x1e153c6eu,
148 0x86e34570u, 0xeae96fb1u, 0x860e5e0au, 0x5a3e2ab3u,
149 0x771fe71cu, 0x4e3d06fau, 0x2965dcb9u, 0x99e71d0fu,
150 0x803e89d6u, 0x5266c825u, 0x2e4cc978u, 0x9c10b36au,
151 0xc6150ebau, 0x94e2ea78u, 0xa5fc3c53u, 0x1e0a2df4u,
152 0xf2f74ea7u, 0x361d2b3du, 0x1939260fu, 0x19c27960u,
153 0x5223a708u, 0xf71312b6u, 0xebadfe6eu, 0xeac31f66u,
154 0xe3bc4595u, 0xa67bc883u, 0xb17f37d1u, 0x018cff28u,
155 0xc332ddefu, 0xbe6c5aa5u, 0x65582185u, 0x68ab9802u,
156 0xeecea50fu, 0xdb2f953bu, 0x2aef7dadu, 0x5b6e2f84u,
157 0x1521b628u, 0x29076170u, 0xecdd4775u, 0x619f1510u,
158 0x13cca830u, 0xeb61bd96u, 0x0334fe1eu, 0xaa0363cfu,
159 0xb5735c90u, 0x4c70a239u, 0xd59e9e0bu, 0xcbaade14u,
160 0xeecc86bcu, 0x60622ca7u, 0x9cab5cabu, 0xb2f3846eu,
161 0x648b1eafu, 0x19bdf0cau, 0xa02369b9u, 0x655abb50u,
162 0x40685a32u, 0x3c2ab4b3u, 0x319ee9d5u, 0xc021b8f7u,
163 0x9b540b19u, 0x875fa099u, 0x95f7997eu, 0x623d7da8u,
164 0xf837889au, 0x97e32d77u, 0x11ed935fu, 0x16681281u,
165 0x0e358829u, 0xc7e61fd6u, 0x96dedfa1u, 0x7858ba99u,
166 0x57f584a5u, 0x1b227263u, 0x9b83c3ffu, 0x1ac24696u,
167 0xcdb30aebu, 0x532e3054u, 0x8fd948e4u, 0x6dbc3128u,
168 0x58ebf2efu, 0x34c6ffeau, 0xfe28ed61u, 0xee7c3c73u,
169 0x5d4a14d9u, 0xe864b7e3u, 0x42105d14u, 0x203e13e0u,
170 0x45eee2b6u, 0xa3aaabeau, 0xdb6c4f15u, 0xfacb4fd0u,
171 0xc742f442u, 0xef6abbb5u, 0x654f3b1du, 0x41cd2105u,
172 0xd81e799eu, 0x86854dc7u, 0xe44b476au, 0x3d816250u,
173 0xcf62a1f2u, 0x5b8d2646u, 0xfc8883a0u, 0xc1c7b6a3u,
174 0x7f1524c3u, 0x69cb7492u, 0x47848a0bu, 0x5692b285u,
175 0x095bbf00u, 0xad19489du, 0x1462b174u, 0x23820e00u,
176 0x58428d2au, 0x0c55f5eau, 0x1dadf43eu, 0x233f7061u,
177 0x3372f092u, 0x8d937e41u, 0xd65fecf1u, 0x6c223bdbu,
178 0x7cde3759u, 0xcbee7460u, 0x4085f2a7u, 0xce77326eu,
179 0xa6078084u, 0x19f8509eu, 0xe8efd855u, 0x61d99735u,
180 0xa969a7aau, 0xc50c06c2u, 0x5a04abfcu, 0x800bcadcu,
181 0x9e447a2eu, 0xc3453484u, 0xfdd56705u, 0x0e1e9ec9u,
182 0xdb73dbd3u, 0x105588cdu, 0x675fda79u, 0xe3674340u,
183 0xc5c43465u, 0x713e38d8u, 0x3d28f89eu, 0xf16dff20u,
184 0x153e21e7u, 0x8fb03d4au, 0xe6e39f2bu, 0xdb83adf7u},
185 {0xe93d5a68u, 0x948140f7u, 0xf64c261cu, 0x94692934u,
186 0x411520f7u, 0x7602d4f7u, 0xbcf46b2eu, 0xd4a20068u,
187 0xd4082471u, 0x3320f46au, 0x43b7d4b7u, 0x500061afu,
188 0x1e39f62eu, 0x97244546u, 0x14214f74u, 0xbf8b8840u,
189 0x4d95fc1du, 0x96b591afu, 0x70f4ddd3u, 0x66a02f45u,
190 0xbfbc09ecu, 0x03bd9785u, 0x7fac6dd0u, 0x31cb8504u,
191 0x96eb27b3u, 0x55fd3941u, 0xda2547e6u, 0xabca0a9au,
192 0x28507825u, 0x530429f4u, 0x0a2c86dau, 0xe9b66dfbu,
193 0x68dc1462u, 0xd7486900u, 0x680ec0a4u, 0x27a18deeu,
194 0x4f3ffea2u, 0xe887ad8cu, 0xb58ce006u, 0x7af4d6b6u,
195 0xaace1e7cu, 0xd3375fecu, 0xce78a399u, 0x406b2a42u,
196 0x20fe9e35u, 0xd9f385b9u, 0xee39d7abu, 0x3b124e8bu,
197 0x1dc9faf7u, 0x4b6d1856u, 0x26a36631u, 0xeae397b2u,
198 0x3a6efa74u, 0xdd5b4332u, 0x6841e7f7u, 0xca7820fbu,
199 0xfb0af54eu, 0xd8feb397u, 0x454056acu, 0xba489527u,
200 0x55533a3au, 0x20838d87u, 0xfe6ba9b7u, 0xd096954bu,
201 0x55a867bcu, 0xa1159a58u, 0xcca92963u, 0x99e1db33u,
202 0xa62a4a56u, 0x3f3125f9u, 0x5ef47e1cu, 0x9029317cu,
203 0xfdf8e802u, 0x04272f70u, 0x80bb155cu, 0x05282ce3u,
204 0x95c11548u, 0xe4c66d22u, 0x48c1133fu, 0xc70f86dcu,
205 0x07f9c9eeu, 0x41041f0fu, 0x404779a4u, 0x5d886e17u,
206 0x325f51ebu, 0xd59bc0d1u, 0xf2bcc18fu, 0x41113564u,
207 0x257b7834u, 0x602a9c60u, 0xdff8e8a3u, 0x1f636c1bu,
208 0x0e12b4c2u, 0x02e1329eu, 0xaf664fd1u, 0xcad18115u,
209 0x6b2395e0u, 0x333e92e1u, 0x3b240b62u, 0xeebeb922u,
210 0x85b2a20eu, 0xe6ba0d99u, 0xde720c8cu, 0x2da2f728u,
211 0xd0127845u, 0x95b794fdu, 0x647d0862u, 0xe7ccf5f0u,
212 0x5449a36fu, 0x877d48fau, 0xc39dfd27u, 0xf33e8d1eu,
213 0x0a476341u, 0x992eff74u, 0x3a6f6eabu, 0xf4f8fd37u,
214 0xa812dc60u, 0xa1ebddf8u, 0x991be14cu, 0xdb6e6b0du,
215 0xc67b5510u, 0x6d672c37u, 0x2765d43bu, 0xdcd0e804u,
216 0xf1290dc7u, 0xcc00ffa3u, 0xb5390f92u, 0x690fed0bu,
217 0x667b9ffbu, 0xcedb7d9cu, 0xa091cf0bu, 0xd9155ea3u,
218 0xbb132f88u, 0x515bad24u, 0x7b9479bfu, 0x763bd6ebu,
219 0x37392eb3u, 0xcc115979u, 0x8026e297u, 0xf42e312du,
220 0x6842ada7u, 0xc66a2b3bu, 0x12754cccu, 0x782ef11cu,
221 0x6a124237u, 0xb79251e7u, 0x06a1bbe6u, 0x4bfb6350u,
222 0x1a6b1018u, 0x11caedfau, 0x3d25bdd8u, 0xe2e1c3c9u,
223 0x44421659u, 0x0a121386u, 0xd90cec6eu, 0xd5abea2au,
224 0x64af674eu, 0xda86a85fu, 0xbebfe988u, 0x64e4c3feu,
225 0x9dbc8057u, 0xf0f7c086u, 0x60787bf8u, 0x6003604du,
226 0xd1fd8346u, 0xf6381fb0u, 0x7745ae04u, 0xd736fcccu,
227 0x83426b33u, 0xf01eab71u, 0xb0804187u, 0x3c005e5fu,
228 0x77a057beu, 0xbde8ae24u, 0x55464299u, 0xbf582e61u,
229 0x4e58f48fu, 0xf2ddfda2u, 0xf474ef38u, 0x8789bdc2u,
230 0x5366f9c3u, 0xc8b38e74u, 0xb475f255u, 0x46fcd9b9u,
231 0x7aeb2661u, 0x8b1ddf84u, 0x846a0e79u, 0x915f95e2u,
232 0x466e598eu, 0x20b45770u, 0x8cd55591u, 0xc902de4cu,
233 0xb90bace1u, 0xbb8205d0u, 0x11a86248u, 0x7574a99eu,
234 0xb77f19b6u, 0xe0a9dc09u, 0x662d09a1u, 0xc4324633u,
235 0xe85a1f02u, 0x09f0be8cu, 0x4a99a025u, 0x1d6efe10u,
236 0x1ab93d1du, 0x0ba5a4dfu, 0xa186f20fu, 0x2868f169u,
237 0xdcb7da83u, 0x573906feu, 0xa1e2ce9bu, 0x4fcd7f52u,
238 0x50115e01u, 0xa70683fau, 0xa002b5c4u, 0x0de6d027u,
239 0x9af88c27u, 0x773f8641u, 0xc3604c06u, 0x61a806b5u,
240 0xf0177a28u, 0xc0f586e0u, 0x006058aau, 0x30dc7d62u,
241 0x11e69ed7u, 0x2338ea63u, 0x53c2dd94u, 0xc2c21634u,
242 0xbbcbee56u, 0x90bcb6deu, 0xebfc7da1u, 0xce591d76u,
243 0x6f05e409u, 0x4b7c0188u, 0x39720a3du, 0x7c927c24u,
244 0x86e3725fu, 0x724d9db9u, 0x1ac15bb4u, 0xd39eb8fcu,
245 0xed545578u, 0x08fca5b5u, 0xd83d7cd3u, 0x4dad0fc4u,
246 0x1e50ef5eu, 0xb161e6f8u, 0xa28514d9u, 0x6c51133cu,
247 0x6fd5c7e7u, 0x56e14ec4u, 0x362abfceu, 0xddc6c837u,
248 0xd79a3234u, 0x92638212u, 0x670efa8eu, 0x406000e0u},
249 {0x3a39ce37u, 0xd3faf5cfu, 0xabc27737u, 0x5ac52d1bu,
250 0x5cb0679eu, 0x4fa33742u, 0xd3822740u, 0x99bc9bbeu,
251 0xd5118e9du, 0xbf0f7315u, 0xd62d1c7eu, 0xc700c47bu,
252 0xb78c1b6bu, 0x21a19045u, 0xb26eb1beu, 0x6a366eb4u,
253 0x5748ab2fu, 0xbc946e79u, 0xc6a376d2u, 0x6549c2c8u,
254 0x530ff8eeu, 0x468dde7du, 0xd5730a1du, 0x4cd04dc6u,
255 0x2939bbdbu, 0xa9ba4650u, 0xac9526e8u, 0xbe5ee304u,
256 0xa1fad5f0u, 0x6a2d519au, 0x63ef8ce2u, 0x9a86ee22u,
257 0xc089c2b8u, 0x43242ef6u, 0xa51e03aau, 0x9cf2d0a4u,
258 0x83c061bau, 0x9be96a4du, 0x8fe51550u, 0xba645bd6u,
259 0x2826a2f9u, 0xa73a3ae1u, 0x4ba99586u, 0xef5562e9u,
260 0xc72fefd3u, 0xf752f7dau, 0x3f046f69u, 0x77fa0a59u,
261 0x80e4a915u, 0x87b08601u, 0x9b09e6adu, 0x3b3ee593u,
262 0xe990fd5au, 0x9e34d797u, 0x2cf0b7d9u, 0x022b8b51u,
263 0x96d5ac3au, 0x017da67du, 0xd1cf3ed6u, 0x7c7d2d28u,
264 0x1f9f25cfu, 0xadf2b89bu, 0x5ad6b472u, 0x5a88f54cu,
265 0xe029ac71u, 0xe019a5e6u, 0x47b0acfdu, 0xed93fa9bu,
266 0xe8d3c48du, 0x283b57ccu, 0xf8d56629u, 0x79132e28u,
267 0x785f0191u, 0xed756055u, 0xf7960e44u, 0xe3d35e8cu,
268 0x15056dd4u, 0x88f46dbau, 0x03a16125u, 0x0564f0bdu,
269 0xc3eb9e15u, 0x3c9057a2u, 0x97271aecu, 0xa93a072au,
270 0x1b3f6d9bu, 0x1e6321f5u, 0xf59c66fbu, 0x26dcf319u,
271 0x7533d928u, 0xb155fdf5u, 0x03563482u, 0x8aba3cbbu,
272 0x28517711u, 0xc20ad9f8u, 0xabcc5167u, 0xccad925fu,
273 0x4de81751u, 0x3830dc8eu, 0x379d5862u, 0x9320f991u,
274 0xea7a90c2u, 0xfb3e7bceu, 0x5121ce64u, 0x774fbe32u,
275 0xa8b6e37eu, 0xc3293d46u, 0x48de5369u, 0x6413e680u,
276 0xa2ae0810u, 0xdd6db224u, 0x69852dfdu, 0x09072166u,
277 0xb39a460au, 0x6445c0ddu, 0x586cdecfu, 0x1c20c8aeu,
278 0x5bbef7ddu, 0x1b588d40u, 0xccd2017fu, 0x6bb4e3bbu,
279 0xdda26a7eu, 0x3a59ff45u, 0x3e350a44u, 0xbcb4cdd5u,
280 0x72eacea8u, 0xfa6484bbu, 0x8d6612aeu, 0xbf3c6f47u,
281 0xd29be463u, 0x542f5d9eu, 0xaec2771bu, 0xf64e6370u,
282 0x740e0d8du, 0xe75b1357u, 0xf8721671u, 0xaf537d5du,
283 0x4040cb08u, 0x4eb4e2ccu, 0x34d2466au, 0x0115af84u,
284 0xe1b00428u, 0x95983a1du, 0x06b89fb4u, 0xce6ea048u,
285 0x6f3f3b82u, 0x3520ab82u, 0x011a1d4bu, 0x277227f8u,
286 0x611560b1u, 0xe7933fdcu, 0xbb3a792bu, 0x344525bdu,
287 0xa08839e1u, 0x51ce794bu, 0x2f32c9b7u, 0xa01fbac9u,
288 0xe01cc87eu, 0xbcc7d1f6u, 0xcf0111c3u, 0xa1e8aac7u,
289 0x1a908749u, 0xd44fbd9au, 0xd0dadecbu, 0xd50ada38u,
290 0x0339c32au, 0xc6913667u, 0x8df9317cu, 0xe0b12b4fu,
291 0xf79e59b7u, 0x43f5bb3au, 0xf2d519ffu, 0x27d9459cu,
292 0xbf97222cu, 0x15e6fc2au, 0x0f91fc71u, 0x9b941525u,
293 0xfae59361u, 0xceb69cebu, 0xc2a86459u, 0x12baa8d1u,
294 0xb6c1075eu, 0xe3056a0cu, 0x10d25065u, 0xcb03a442u,
295 0xe0ec6e0eu, 0x1698db3bu, 0x4c98a0beu, 0x3278e964u,
296 0x9f1f9532u, 0xe0d392dfu, 0xd3a0342bu, 0x8971f21eu,
297 0x1b0a7441u, 0x4ba3348cu, 0xc5be7120u, 0xc37632d8u,
298 0xdf359f8du, 0x9b992f2eu, 0xe60b6f47u, 0x0fe3f11du,
299 0xe54cda54u, 0x1edad891u, 0xce6279cfu, 0xcd3e7e6fu,
300 0x1618b166u, 0xfd2c1d05u, 0x848fd2c5u, 0xf6fb2299u,
301 0xf523f357u, 0xa6327623u, 0x93a83531u, 0x56cccd02u,
302 0xacf08162u, 0x5a75ebb5u, 0x6e163697u, 0x88d273ccu,
303 0xde966292u, 0x81b949d0u, 0x4c50901bu, 0x71c65614u,
304 0xe6c6c7bdu, 0x327a140au, 0x45e1d006u, 0xc3f27b9au,
305 0xc9aa53fdu, 0x62a80f00u, 0xbb25bfe2u, 0x35bdd2f6u,
306 0x71126905u, 0xb2040222u, 0xb6cbcf7cu, 0xcd769c2bu,
307 0x53113ec0u, 0x1640e3d3u, 0x38abbd60u, 0x2547adf0u,
308 0xba38209cu, 0xf746ce76u, 0x77afa1c5u, 0x20756060u,
309 0x85cbfe4eu, 0x8ae88dd8u, 0x7aaaf9b0u, 0x4cf9aa7eu,
310 0x1948c25cu, 0x02fb8a8cu, 0x01c36ae4u, 0xd6ebe1f9u,
311 0x90d4f869u, 0xa65cdea0u, 0x3f09252du, 0xc208e69fu,
312 0xb74e6132u, 0xce77e25bu, 0x578fdfe3u, 0x3ac372e6u
313 }
314};
315
316
317#define F1(i) \
318 xl ^= pax[i]; \
319 xr ^= ((sbx[0][xl>>24] + \
320 sbx[1][(xl&0xFF0000)>>16]) ^ \
321 sbx[2][(xl&0xFF00)>>8]) + \
322 sbx[3][xl&0xFF];
323
324#define F2(i) \
325 xr ^= pax[i]; \
326 xl ^= ((sbx[0][xr>>24] + \
327 sbx[1][(xr&0xFF0000)>>16]) ^ \
328 sbx[2][(xr&0xFF00)>>8]) + \
329 sbx[3][xr&0xFF];
330
331
332 static void
333bf_e_block(p_xl, p_xr)
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200334 UINT32_T *p_xl;
335 UINT32_T *p_xr;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200336{
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200337 UINT32_T temp, xl = *p_xl, xr = *p_xr;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200338
339 F1(0) F2(1) F1(2) F2(3) F1(4) F2(5) F1(6) F2(7)
340 F1(8) F2(9) F1(10) F2(11) F1(12) F2(13) F1(14) F2(15)
341 xl ^= pax[16]; xr ^= pax[17];
342 temp = xl; xl = xr; xr = temp;
343 *p_xl = xl; *p_xr = xr;
344}
345
346#if 0 /* not used */
347 static void
348bf_d_block(p_xl, p_xr)
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200349 UINT32_T *p_xl;
350 UINT32_T *p_xr;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200351{
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200352 UINT32_T temp, xl = *p_xl, xr = *p_xr;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200353 F1(17) F2(16) F1(15) F2(14) F1(13) F2(12) F1(11) F2(10)
354 F1(9) F2(8) F1(7) F2(6) F1(5) F2(4) F1(3) F2(2)
355 xl ^= pax[1];
356 xr ^= pax[0];
357 temp = xl; xl = xr; xr = temp;
358 *p_xl = xl; *p_xr = xr;
359}
360#endif
361
362
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200363#ifdef WORDS_BIGENDIAN
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200364# define htonl2(x) \
365 x = ((((x) & 0xffL) << 24) | (((x) & 0xff00L) << 8) | \
366 (((x) & 0xff0000L) >> 8) | (((x) & 0xff000000L) >> 24))
367#else
368# define htonl2(x)
369#endif
370
371 static void
372bf_e_cblock(block)
373 char_u *block;
374{
375 block8 bk;
376 memcpy(bk.uc, block, 8);
377 htonl2(bk.ul[0]);
378 htonl2(bk.ul[1]);
379 bf_e_block(&bk.ul[0], &bk.ul[1]);
380 htonl2(bk.ul[0]);
381 htonl2(bk.ul[1]);
382 memcpy(block, bk.uc, 8);
383}
384
385#if 0 /* not used */
386 void
387bf_d_cblock(block)
388 char_u *block;
389{
390 block8 bk;
391 memcpy(bk.uc, block, 8);
392 htonl2(bk.ul[0]); htonl2(bk.ul[1]);
393 bf_d_block(&bk.ul[0], &bk.ul[1]);
394 htonl2(bk.ul[0]); htonl2(bk.ul[1]);
395 memcpy(block, bk.uc, 8);
396}
397#endif
398
399 void
400bf_key_init(password)
401 char_u *password;
402{
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200403 int i, j, keypos = 0;
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200404 UINT32_T val, data_l, data_r;
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200405 char_u *key;
406 int keylen;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200407
Bram Moolenaar823a1652010-05-16 23:02:33 +0200408 key = sha256_key(password);
Bram Moolenaar442b4222010-05-24 21:34:22 +0200409 keylen = (int)STRLEN(key);
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200410 for (i = 0; i < 256; ++i)
411 {
412 sbx[0][i] = sbi[0][i];
413 sbx[1][i] = sbi[1][i];
414 sbx[2][i] = sbi[2][i];
415 sbx[3][i] = sbi[3][i];
416 }
417
418 for (i = 0; i < 18; ++i)
419 {
420 val = 0;
421 for (j = 0; j < 4; ++j)
Bram Moolenaar823a1652010-05-16 23:02:33 +0200422 val = (val << 8) | key[keypos++ % keylen];
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200423 pax[i] = ipa[i] ^ val;
424 }
425
426 data_l = data_r = 0;
427 for (i = 0; i < 18; i += 2)
428 {
429 bf_e_block(&data_l, &data_r);
430 pax[i + 0] = data_l;
431 pax[i + 1] = data_r;
432 }
433
434 for (i = 0; i < 4; ++i)
435 {
436 for (j = 0; j < 256; j += 2)
437 {
438 bf_e_block(&data_l, &data_r);
439 sbx[i][j + 0] = data_l;
440 sbx[i][j + 1] = data_r;
441 }
442 }
443}
444
445/*
446 * BF Self test for corrupted tables or instructions
447 */
448 static int
449bf_check_tables(ipa, sbi, val)
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200450 UINT32_T ipa[18];
451 UINT32_T sbi[4][256];
452 UINT32_T val;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200453{
454 int i, j;
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200455 UINT32_T c = 0;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200456
457 for (i = 0; i < 18; i++)
458 c ^= ipa[i];
459 for (i = 0; i < 4; i++)
460 for (j = 0; j < 256; j++)
461 c ^= sbi[i][j];
462 return c == val;
463}
464
465typedef struct {
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200466 char_u password[64];
467 char_u plaintxt[8];
468 char_u cryptxt[8];
469 char_u badcryptxt[8]; /* cryptxt when big/little endian is wrong */
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200470 UINT32_T keysum;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200471} struct_bf_test_data;
472
Bram Moolenaar4a9b19a2010-05-18 21:17:10 +0200473/*
474 * Assert bf(password, plaintxt) is cryptxt.
475 * Assert csum(pax sbx(password)) is keysum.
476 */
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200477static struct_bf_test_data bf_test_data[] = {
478 {
479 "password",
480 "plaintxt",
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200481 "\x55\xca\x56\x3a\xef\xe1\x9c\x73", /* cryptxt */
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200482 "\x47\xd9\x67\x49\x91\xc5\x9a\x95", /* badcryptxt */
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200483 0x5de01bdbu, /* keysum */
484 },
485};
486
487/*
488 * Return FAIL when there is something wrong with blowfish encryption.
489 */
490 static int
491bf_self_test()
492{
493 int i, bn;
494 int err = 0;
495 block8 bk;
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200496 UINT32_T ui = 0xffffffffUL;
497
498 /* We can't simply use sizeof(UINT32_T), it would generate a compiler
499 * warning. */
500 if (ui != 0xffffffffUL || ui + 1 != 0) {
501 err++;
502 EMSG(_("E820: sizeof(uint32_t) != 4"));
503 }
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200504
505 if (!bf_check_tables(ipa, sbi, 0x6ffa520a))
506 err++;
507
508 bn = ARRAY_LENGTH(bf_test_data);
509 for (i = 0; i < bn; i++)
510 {
511 bf_key_init((char_u *)(bf_test_data[i].password));
512 if (!bf_check_tables(pax, sbx, bf_test_data[i].keysum))
513 err++;
514
515 /* Don't modify bf_test_data[i].plaintxt, self test is idempotent. */
516 memcpy(bk.uc, bf_test_data[i].plaintxt, 8);
517 bf_e_cblock(bk.uc);
518 if (memcmp(bk.uc, bf_test_data[i].cryptxt, 8) != 0)
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200519 {
520 if (err == 0 && memcmp(bk.uc, bf_test_data[i].badcryptxt, 8) == 0)
521 EMSG(_("E817: Blowfish big/little endian use wrong"));
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200522 err++;
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200523 }
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200524 }
525
526 return err > 0 ? FAIL : OK;
527}
528
529/* Output feedback mode. */
530static int randbyte_offset = 0;
531static int update_offset = 0;
532static char_u ofb_buffer[BF_OFB_LEN]; /* 64 bytes */
533
534/*
535 * Initialize with seed "iv[iv_len]".
536 */
537 void
538bf_ofb_init(iv, iv_len)
539 char_u *iv;
540 int iv_len;
541{
542 int i, mi;
543
544 randbyte_offset = update_offset = 0;
Bram Moolenaar7db5fc82010-05-24 11:59:29 +0200545 vim_memset(ofb_buffer, 0, BF_OFB_LEN);
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200546 if (iv_len > 0)
547 {
548 mi = iv_len > BF_OFB_LEN ? iv_len : BF_OFB_LEN;
549 for (i = 0; i < mi; i++)
550 ofb_buffer[i % BF_OFB_LEN] ^= iv[i % iv_len];
551 }
552}
553
554 void
555bf_ofb_update(c)
556 int c;
557{
558 ofb_buffer[update_offset++] ^= (char_u)c;
559 if (update_offset == BF_OFB_LEN)
560 update_offset = 0;
561}
562
563 int
564bf_ranbyte()
565{
566 int current_byte = randbyte_offset++;
567 int current_block = (current_byte / BF_BLOCK) * BF_BLOCK;
568
569 if (randbyte_offset == BF_OFB_LEN)
570 randbyte_offset = 0;
571 if ((current_byte % BF_BLOCK) == 0)
572 bf_e_cblock(&ofb_buffer[current_block]);
573 return ofb_buffer[current_byte];
574}
575
576/*
577 * Run a test to check if the encryption works as expected.
578 * Give an error and return FAIL when not.
579 */
580 int
581blowfish_self_test()
582{
583 if (sha256_self_test() == FAIL)
584 {
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200585 EMSG(_("E818: sha256 test failed"));
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200586 return FAIL;
587 }
588 if (bf_self_test() == FAIL)
589 {
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200590 EMSG(_("E819: Blowfish test failed"));
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200591 return FAIL;
592 }
593 return OK;
594}
595
596#endif /* FEAT_CRYPT */