blob: 573a1da48be2dc3e5b3d06d040484bc5103bf58b [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
Bram Moolenaar04c9baf2010-06-01 23:37:39 +020021#define BF_BLOCK_MASK 7
Bram Moolenaar40e6a712010-05-16 22:32:54 +020022#define BF_OFB_LEN (8*(BF_BLOCK))
23
24typedef union {
Bram Moolenaarfa7584c2010-05-19 21:57:45 +020025 UINT32_T ul[2];
Bram Moolenaar0bbabe82010-05-17 20:32:55 +020026 char_u uc[8];
Bram Moolenaar40e6a712010-05-16 22:32:54 +020027} block8;
28
Bram Moolenaar442b4222010-05-24 21:34:22 +020029#if defined(WIN3264) || defined(DOS32)
Bram Moolenaar0bbabe82010-05-17 20:32:55 +020030 /* MS-Windows is always little endian */
Bram Moolenaar40e6a712010-05-16 22:32:54 +020031#else
Bram Moolenaar0bbabe82010-05-17 20:32:55 +020032# ifdef HAVE_CONFIG_H
33 /* in configure.in AC_C_BIGENDIAN() defines WORDS_BIGENDIAN when needed */
34# else
35 error!
36 Please change this code to define WORDS_BIGENDIAN for big-endian machines.
Bram Moolenaar40e6a712010-05-16 22:32:54 +020037# endif
38#endif
39
Bram Moolenaarfa7584c2010-05-19 21:57:45 +020040static void bf_e_block __ARGS((UINT32_T *p_xl, UINT32_T *p_xr));
Bram Moolenaar40e6a712010-05-16 22:32:54 +020041static void bf_e_cblock __ARGS((char_u *block));
Bram Moolenaarf506c5b2010-06-22 06:28:58 +020042static int bf_check_tables __ARGS((UINT32_T a_ipa[18], UINT32_T a_sbi[4][256], UINT32_T val));
Bram Moolenaar40e6a712010-05-16 22:32:54 +020043static int bf_self_test __ARGS((void));
44
Bram Moolenaar4a9b19a2010-05-18 21:17:10 +020045/* Blowfish code */
Bram Moolenaarfa7584c2010-05-19 21:57:45 +020046static UINT32_T pax[18];
47static UINT32_T ipa[18] = {
Bram Moolenaar40e6a712010-05-16 22:32:54 +020048 0x243f6a88u, 0x85a308d3u, 0x13198a2eu,
49 0x03707344u, 0xa4093822u, 0x299f31d0u,
50 0x082efa98u, 0xec4e6c89u, 0x452821e6u,
51 0x38d01377u, 0xbe5466cfu, 0x34e90c6cu,
52 0xc0ac29b7u, 0xc97c50ddu, 0x3f84d5b5u,
53 0xb5470917u, 0x9216d5d9u, 0x8979fb1bu
54};
55
Bram Moolenaarfa7584c2010-05-19 21:57:45 +020056static UINT32_T sbx[4][256];
57static UINT32_T sbi[4][256] = {
Bram Moolenaar40e6a712010-05-16 22:32:54 +020058 {0xd1310ba6u, 0x98dfb5acu, 0x2ffd72dbu, 0xd01adfb7u,
59 0xb8e1afedu, 0x6a267e96u, 0xba7c9045u, 0xf12c7f99u,
60 0x24a19947u, 0xb3916cf7u, 0x0801f2e2u, 0x858efc16u,
61 0x636920d8u, 0x71574e69u, 0xa458fea3u, 0xf4933d7eu,
62 0x0d95748fu, 0x728eb658u, 0x718bcd58u, 0x82154aeeu,
63 0x7b54a41du, 0xc25a59b5u, 0x9c30d539u, 0x2af26013u,
64 0xc5d1b023u, 0x286085f0u, 0xca417918u, 0xb8db38efu,
65 0x8e79dcb0u, 0x603a180eu, 0x6c9e0e8bu, 0xb01e8a3eu,
66 0xd71577c1u, 0xbd314b27u, 0x78af2fdau, 0x55605c60u,
67 0xe65525f3u, 0xaa55ab94u, 0x57489862u, 0x63e81440u,
68 0x55ca396au, 0x2aab10b6u, 0xb4cc5c34u, 0x1141e8ceu,
69 0xa15486afu, 0x7c72e993u, 0xb3ee1411u, 0x636fbc2au,
70 0x2ba9c55du, 0x741831f6u, 0xce5c3e16u, 0x9b87931eu,
71 0xafd6ba33u, 0x6c24cf5cu, 0x7a325381u, 0x28958677u,
72 0x3b8f4898u, 0x6b4bb9afu, 0xc4bfe81bu, 0x66282193u,
73 0x61d809ccu, 0xfb21a991u, 0x487cac60u, 0x5dec8032u,
74 0xef845d5du, 0xe98575b1u, 0xdc262302u, 0xeb651b88u,
75 0x23893e81u, 0xd396acc5u, 0x0f6d6ff3u, 0x83f44239u,
76 0x2e0b4482u, 0xa4842004u, 0x69c8f04au, 0x9e1f9b5eu,
77 0x21c66842u, 0xf6e96c9au, 0x670c9c61u, 0xabd388f0u,
78 0x6a51a0d2u, 0xd8542f68u, 0x960fa728u, 0xab5133a3u,
79 0x6eef0b6cu, 0x137a3be4u, 0xba3bf050u, 0x7efb2a98u,
80 0xa1f1651du, 0x39af0176u, 0x66ca593eu, 0x82430e88u,
81 0x8cee8619u, 0x456f9fb4u, 0x7d84a5c3u, 0x3b8b5ebeu,
82 0xe06f75d8u, 0x85c12073u, 0x401a449fu, 0x56c16aa6u,
83 0x4ed3aa62u, 0x363f7706u, 0x1bfedf72u, 0x429b023du,
84 0x37d0d724u, 0xd00a1248u, 0xdb0fead3u, 0x49f1c09bu,
85 0x075372c9u, 0x80991b7bu, 0x25d479d8u, 0xf6e8def7u,
86 0xe3fe501au, 0xb6794c3bu, 0x976ce0bdu, 0x04c006bau,
87 0xc1a94fb6u, 0x409f60c4u, 0x5e5c9ec2u, 0x196a2463u,
88 0x68fb6fafu, 0x3e6c53b5u, 0x1339b2ebu, 0x3b52ec6fu,
89 0x6dfc511fu, 0x9b30952cu, 0xcc814544u, 0xaf5ebd09u,
90 0xbee3d004u, 0xde334afdu, 0x660f2807u, 0x192e4bb3u,
91 0xc0cba857u, 0x45c8740fu, 0xd20b5f39u, 0xb9d3fbdbu,
92 0x5579c0bdu, 0x1a60320au, 0xd6a100c6u, 0x402c7279u,
93 0x679f25feu, 0xfb1fa3ccu, 0x8ea5e9f8u, 0xdb3222f8u,
94 0x3c7516dfu, 0xfd616b15u, 0x2f501ec8u, 0xad0552abu,
95 0x323db5fau, 0xfd238760u, 0x53317b48u, 0x3e00df82u,
96 0x9e5c57bbu, 0xca6f8ca0u, 0x1a87562eu, 0xdf1769dbu,
97 0xd542a8f6u, 0x287effc3u, 0xac6732c6u, 0x8c4f5573u,
98 0x695b27b0u, 0xbbca58c8u, 0xe1ffa35du, 0xb8f011a0u,
99 0x10fa3d98u, 0xfd2183b8u, 0x4afcb56cu, 0x2dd1d35bu,
100 0x9a53e479u, 0xb6f84565u, 0xd28e49bcu, 0x4bfb9790u,
101 0xe1ddf2dau, 0xa4cb7e33u, 0x62fb1341u, 0xcee4c6e8u,
102 0xef20cadau, 0x36774c01u, 0xd07e9efeu, 0x2bf11fb4u,
103 0x95dbda4du, 0xae909198u, 0xeaad8e71u, 0x6b93d5a0u,
104 0xd08ed1d0u, 0xafc725e0u, 0x8e3c5b2fu, 0x8e7594b7u,
105 0x8ff6e2fbu, 0xf2122b64u, 0x8888b812u, 0x900df01cu,
106 0x4fad5ea0u, 0x688fc31cu, 0xd1cff191u, 0xb3a8c1adu,
107 0x2f2f2218u, 0xbe0e1777u, 0xea752dfeu, 0x8b021fa1u,
108 0xe5a0cc0fu, 0xb56f74e8u, 0x18acf3d6u, 0xce89e299u,
109 0xb4a84fe0u, 0xfd13e0b7u, 0x7cc43b81u, 0xd2ada8d9u,
110 0x165fa266u, 0x80957705u, 0x93cc7314u, 0x211a1477u,
111 0xe6ad2065u, 0x77b5fa86u, 0xc75442f5u, 0xfb9d35cfu,
112 0xebcdaf0cu, 0x7b3e89a0u, 0xd6411bd3u, 0xae1e7e49u,
113 0x00250e2du, 0x2071b35eu, 0x226800bbu, 0x57b8e0afu,
114 0x2464369bu, 0xf009b91eu, 0x5563911du, 0x59dfa6aau,
115 0x78c14389u, 0xd95a537fu, 0x207d5ba2u, 0x02e5b9c5u,
116 0x83260376u, 0x6295cfa9u, 0x11c81968u, 0x4e734a41u,
117 0xb3472dcau, 0x7b14a94au, 0x1b510052u, 0x9a532915u,
118 0xd60f573fu, 0xbc9bc6e4u, 0x2b60a476u, 0x81e67400u,
119 0x08ba6fb5u, 0x571be91fu, 0xf296ec6bu, 0x2a0dd915u,
120 0xb6636521u, 0xe7b9f9b6u, 0xff34052eu, 0xc5855664u,
121 0x53b02d5du, 0xa99f8fa1u, 0x08ba4799u, 0x6e85076au},
122 {0x4b7a70e9u, 0xb5b32944u, 0xdb75092eu, 0xc4192623u,
123 0xad6ea6b0u, 0x49a7df7du, 0x9cee60b8u, 0x8fedb266u,
124 0xecaa8c71u, 0x699a17ffu, 0x5664526cu, 0xc2b19ee1u,
125 0x193602a5u, 0x75094c29u, 0xa0591340u, 0xe4183a3eu,
126 0x3f54989au, 0x5b429d65u, 0x6b8fe4d6u, 0x99f73fd6u,
127 0xa1d29c07u, 0xefe830f5u, 0x4d2d38e6u, 0xf0255dc1u,
128 0x4cdd2086u, 0x8470eb26u, 0x6382e9c6u, 0x021ecc5eu,
129 0x09686b3fu, 0x3ebaefc9u, 0x3c971814u, 0x6b6a70a1u,
130 0x687f3584u, 0x52a0e286u, 0xb79c5305u, 0xaa500737u,
131 0x3e07841cu, 0x7fdeae5cu, 0x8e7d44ecu, 0x5716f2b8u,
132 0xb03ada37u, 0xf0500c0du, 0xf01c1f04u, 0x0200b3ffu,
133 0xae0cf51au, 0x3cb574b2u, 0x25837a58u, 0xdc0921bdu,
134 0xd19113f9u, 0x7ca92ff6u, 0x94324773u, 0x22f54701u,
135 0x3ae5e581u, 0x37c2dadcu, 0xc8b57634u, 0x9af3dda7u,
136 0xa9446146u, 0x0fd0030eu, 0xecc8c73eu, 0xa4751e41u,
137 0xe238cd99u, 0x3bea0e2fu, 0x3280bba1u, 0x183eb331u,
138 0x4e548b38u, 0x4f6db908u, 0x6f420d03u, 0xf60a04bfu,
139 0x2cb81290u, 0x24977c79u, 0x5679b072u, 0xbcaf89afu,
140 0xde9a771fu, 0xd9930810u, 0xb38bae12u, 0xdccf3f2eu,
141 0x5512721fu, 0x2e6b7124u, 0x501adde6u, 0x9f84cd87u,
142 0x7a584718u, 0x7408da17u, 0xbc9f9abcu, 0xe94b7d8cu,
143 0xec7aec3au, 0xdb851dfau, 0x63094366u, 0xc464c3d2u,
144 0xef1c1847u, 0x3215d908u, 0xdd433b37u, 0x24c2ba16u,
145 0x12a14d43u, 0x2a65c451u, 0x50940002u, 0x133ae4ddu,
146 0x71dff89eu, 0x10314e55u, 0x81ac77d6u, 0x5f11199bu,
147 0x043556f1u, 0xd7a3c76bu, 0x3c11183bu, 0x5924a509u,
148 0xf28fe6edu, 0x97f1fbfau, 0x9ebabf2cu, 0x1e153c6eu,
149 0x86e34570u, 0xeae96fb1u, 0x860e5e0au, 0x5a3e2ab3u,
150 0x771fe71cu, 0x4e3d06fau, 0x2965dcb9u, 0x99e71d0fu,
151 0x803e89d6u, 0x5266c825u, 0x2e4cc978u, 0x9c10b36au,
152 0xc6150ebau, 0x94e2ea78u, 0xa5fc3c53u, 0x1e0a2df4u,
153 0xf2f74ea7u, 0x361d2b3du, 0x1939260fu, 0x19c27960u,
154 0x5223a708u, 0xf71312b6u, 0xebadfe6eu, 0xeac31f66u,
155 0xe3bc4595u, 0xa67bc883u, 0xb17f37d1u, 0x018cff28u,
156 0xc332ddefu, 0xbe6c5aa5u, 0x65582185u, 0x68ab9802u,
157 0xeecea50fu, 0xdb2f953bu, 0x2aef7dadu, 0x5b6e2f84u,
158 0x1521b628u, 0x29076170u, 0xecdd4775u, 0x619f1510u,
159 0x13cca830u, 0xeb61bd96u, 0x0334fe1eu, 0xaa0363cfu,
160 0xb5735c90u, 0x4c70a239u, 0xd59e9e0bu, 0xcbaade14u,
161 0xeecc86bcu, 0x60622ca7u, 0x9cab5cabu, 0xb2f3846eu,
162 0x648b1eafu, 0x19bdf0cau, 0xa02369b9u, 0x655abb50u,
163 0x40685a32u, 0x3c2ab4b3u, 0x319ee9d5u, 0xc021b8f7u,
164 0x9b540b19u, 0x875fa099u, 0x95f7997eu, 0x623d7da8u,
165 0xf837889au, 0x97e32d77u, 0x11ed935fu, 0x16681281u,
166 0x0e358829u, 0xc7e61fd6u, 0x96dedfa1u, 0x7858ba99u,
167 0x57f584a5u, 0x1b227263u, 0x9b83c3ffu, 0x1ac24696u,
168 0xcdb30aebu, 0x532e3054u, 0x8fd948e4u, 0x6dbc3128u,
169 0x58ebf2efu, 0x34c6ffeau, 0xfe28ed61u, 0xee7c3c73u,
170 0x5d4a14d9u, 0xe864b7e3u, 0x42105d14u, 0x203e13e0u,
171 0x45eee2b6u, 0xa3aaabeau, 0xdb6c4f15u, 0xfacb4fd0u,
172 0xc742f442u, 0xef6abbb5u, 0x654f3b1du, 0x41cd2105u,
173 0xd81e799eu, 0x86854dc7u, 0xe44b476au, 0x3d816250u,
174 0xcf62a1f2u, 0x5b8d2646u, 0xfc8883a0u, 0xc1c7b6a3u,
175 0x7f1524c3u, 0x69cb7492u, 0x47848a0bu, 0x5692b285u,
176 0x095bbf00u, 0xad19489du, 0x1462b174u, 0x23820e00u,
177 0x58428d2au, 0x0c55f5eau, 0x1dadf43eu, 0x233f7061u,
178 0x3372f092u, 0x8d937e41u, 0xd65fecf1u, 0x6c223bdbu,
179 0x7cde3759u, 0xcbee7460u, 0x4085f2a7u, 0xce77326eu,
180 0xa6078084u, 0x19f8509eu, 0xe8efd855u, 0x61d99735u,
181 0xa969a7aau, 0xc50c06c2u, 0x5a04abfcu, 0x800bcadcu,
182 0x9e447a2eu, 0xc3453484u, 0xfdd56705u, 0x0e1e9ec9u,
183 0xdb73dbd3u, 0x105588cdu, 0x675fda79u, 0xe3674340u,
184 0xc5c43465u, 0x713e38d8u, 0x3d28f89eu, 0xf16dff20u,
185 0x153e21e7u, 0x8fb03d4au, 0xe6e39f2bu, 0xdb83adf7u},
186 {0xe93d5a68u, 0x948140f7u, 0xf64c261cu, 0x94692934u,
187 0x411520f7u, 0x7602d4f7u, 0xbcf46b2eu, 0xd4a20068u,
188 0xd4082471u, 0x3320f46au, 0x43b7d4b7u, 0x500061afu,
189 0x1e39f62eu, 0x97244546u, 0x14214f74u, 0xbf8b8840u,
190 0x4d95fc1du, 0x96b591afu, 0x70f4ddd3u, 0x66a02f45u,
191 0xbfbc09ecu, 0x03bd9785u, 0x7fac6dd0u, 0x31cb8504u,
192 0x96eb27b3u, 0x55fd3941u, 0xda2547e6u, 0xabca0a9au,
193 0x28507825u, 0x530429f4u, 0x0a2c86dau, 0xe9b66dfbu,
194 0x68dc1462u, 0xd7486900u, 0x680ec0a4u, 0x27a18deeu,
195 0x4f3ffea2u, 0xe887ad8cu, 0xb58ce006u, 0x7af4d6b6u,
196 0xaace1e7cu, 0xd3375fecu, 0xce78a399u, 0x406b2a42u,
197 0x20fe9e35u, 0xd9f385b9u, 0xee39d7abu, 0x3b124e8bu,
198 0x1dc9faf7u, 0x4b6d1856u, 0x26a36631u, 0xeae397b2u,
199 0x3a6efa74u, 0xdd5b4332u, 0x6841e7f7u, 0xca7820fbu,
200 0xfb0af54eu, 0xd8feb397u, 0x454056acu, 0xba489527u,
201 0x55533a3au, 0x20838d87u, 0xfe6ba9b7u, 0xd096954bu,
202 0x55a867bcu, 0xa1159a58u, 0xcca92963u, 0x99e1db33u,
203 0xa62a4a56u, 0x3f3125f9u, 0x5ef47e1cu, 0x9029317cu,
204 0xfdf8e802u, 0x04272f70u, 0x80bb155cu, 0x05282ce3u,
205 0x95c11548u, 0xe4c66d22u, 0x48c1133fu, 0xc70f86dcu,
206 0x07f9c9eeu, 0x41041f0fu, 0x404779a4u, 0x5d886e17u,
207 0x325f51ebu, 0xd59bc0d1u, 0xf2bcc18fu, 0x41113564u,
208 0x257b7834u, 0x602a9c60u, 0xdff8e8a3u, 0x1f636c1bu,
209 0x0e12b4c2u, 0x02e1329eu, 0xaf664fd1u, 0xcad18115u,
210 0x6b2395e0u, 0x333e92e1u, 0x3b240b62u, 0xeebeb922u,
211 0x85b2a20eu, 0xe6ba0d99u, 0xde720c8cu, 0x2da2f728u,
212 0xd0127845u, 0x95b794fdu, 0x647d0862u, 0xe7ccf5f0u,
213 0x5449a36fu, 0x877d48fau, 0xc39dfd27u, 0xf33e8d1eu,
214 0x0a476341u, 0x992eff74u, 0x3a6f6eabu, 0xf4f8fd37u,
215 0xa812dc60u, 0xa1ebddf8u, 0x991be14cu, 0xdb6e6b0du,
216 0xc67b5510u, 0x6d672c37u, 0x2765d43bu, 0xdcd0e804u,
217 0xf1290dc7u, 0xcc00ffa3u, 0xb5390f92u, 0x690fed0bu,
218 0x667b9ffbu, 0xcedb7d9cu, 0xa091cf0bu, 0xd9155ea3u,
219 0xbb132f88u, 0x515bad24u, 0x7b9479bfu, 0x763bd6ebu,
220 0x37392eb3u, 0xcc115979u, 0x8026e297u, 0xf42e312du,
221 0x6842ada7u, 0xc66a2b3bu, 0x12754cccu, 0x782ef11cu,
222 0x6a124237u, 0xb79251e7u, 0x06a1bbe6u, 0x4bfb6350u,
223 0x1a6b1018u, 0x11caedfau, 0x3d25bdd8u, 0xe2e1c3c9u,
224 0x44421659u, 0x0a121386u, 0xd90cec6eu, 0xd5abea2au,
225 0x64af674eu, 0xda86a85fu, 0xbebfe988u, 0x64e4c3feu,
226 0x9dbc8057u, 0xf0f7c086u, 0x60787bf8u, 0x6003604du,
227 0xd1fd8346u, 0xf6381fb0u, 0x7745ae04u, 0xd736fcccu,
228 0x83426b33u, 0xf01eab71u, 0xb0804187u, 0x3c005e5fu,
229 0x77a057beu, 0xbde8ae24u, 0x55464299u, 0xbf582e61u,
230 0x4e58f48fu, 0xf2ddfda2u, 0xf474ef38u, 0x8789bdc2u,
231 0x5366f9c3u, 0xc8b38e74u, 0xb475f255u, 0x46fcd9b9u,
232 0x7aeb2661u, 0x8b1ddf84u, 0x846a0e79u, 0x915f95e2u,
233 0x466e598eu, 0x20b45770u, 0x8cd55591u, 0xc902de4cu,
234 0xb90bace1u, 0xbb8205d0u, 0x11a86248u, 0x7574a99eu,
235 0xb77f19b6u, 0xe0a9dc09u, 0x662d09a1u, 0xc4324633u,
236 0xe85a1f02u, 0x09f0be8cu, 0x4a99a025u, 0x1d6efe10u,
237 0x1ab93d1du, 0x0ba5a4dfu, 0xa186f20fu, 0x2868f169u,
238 0xdcb7da83u, 0x573906feu, 0xa1e2ce9bu, 0x4fcd7f52u,
239 0x50115e01u, 0xa70683fau, 0xa002b5c4u, 0x0de6d027u,
240 0x9af88c27u, 0x773f8641u, 0xc3604c06u, 0x61a806b5u,
241 0xf0177a28u, 0xc0f586e0u, 0x006058aau, 0x30dc7d62u,
242 0x11e69ed7u, 0x2338ea63u, 0x53c2dd94u, 0xc2c21634u,
243 0xbbcbee56u, 0x90bcb6deu, 0xebfc7da1u, 0xce591d76u,
244 0x6f05e409u, 0x4b7c0188u, 0x39720a3du, 0x7c927c24u,
245 0x86e3725fu, 0x724d9db9u, 0x1ac15bb4u, 0xd39eb8fcu,
246 0xed545578u, 0x08fca5b5u, 0xd83d7cd3u, 0x4dad0fc4u,
247 0x1e50ef5eu, 0xb161e6f8u, 0xa28514d9u, 0x6c51133cu,
248 0x6fd5c7e7u, 0x56e14ec4u, 0x362abfceu, 0xddc6c837u,
249 0xd79a3234u, 0x92638212u, 0x670efa8eu, 0x406000e0u},
250 {0x3a39ce37u, 0xd3faf5cfu, 0xabc27737u, 0x5ac52d1bu,
251 0x5cb0679eu, 0x4fa33742u, 0xd3822740u, 0x99bc9bbeu,
252 0xd5118e9du, 0xbf0f7315u, 0xd62d1c7eu, 0xc700c47bu,
253 0xb78c1b6bu, 0x21a19045u, 0xb26eb1beu, 0x6a366eb4u,
254 0x5748ab2fu, 0xbc946e79u, 0xc6a376d2u, 0x6549c2c8u,
255 0x530ff8eeu, 0x468dde7du, 0xd5730a1du, 0x4cd04dc6u,
256 0x2939bbdbu, 0xa9ba4650u, 0xac9526e8u, 0xbe5ee304u,
257 0xa1fad5f0u, 0x6a2d519au, 0x63ef8ce2u, 0x9a86ee22u,
258 0xc089c2b8u, 0x43242ef6u, 0xa51e03aau, 0x9cf2d0a4u,
259 0x83c061bau, 0x9be96a4du, 0x8fe51550u, 0xba645bd6u,
260 0x2826a2f9u, 0xa73a3ae1u, 0x4ba99586u, 0xef5562e9u,
261 0xc72fefd3u, 0xf752f7dau, 0x3f046f69u, 0x77fa0a59u,
262 0x80e4a915u, 0x87b08601u, 0x9b09e6adu, 0x3b3ee593u,
263 0xe990fd5au, 0x9e34d797u, 0x2cf0b7d9u, 0x022b8b51u,
264 0x96d5ac3au, 0x017da67du, 0xd1cf3ed6u, 0x7c7d2d28u,
265 0x1f9f25cfu, 0xadf2b89bu, 0x5ad6b472u, 0x5a88f54cu,
266 0xe029ac71u, 0xe019a5e6u, 0x47b0acfdu, 0xed93fa9bu,
267 0xe8d3c48du, 0x283b57ccu, 0xf8d56629u, 0x79132e28u,
268 0x785f0191u, 0xed756055u, 0xf7960e44u, 0xe3d35e8cu,
269 0x15056dd4u, 0x88f46dbau, 0x03a16125u, 0x0564f0bdu,
270 0xc3eb9e15u, 0x3c9057a2u, 0x97271aecu, 0xa93a072au,
271 0x1b3f6d9bu, 0x1e6321f5u, 0xf59c66fbu, 0x26dcf319u,
272 0x7533d928u, 0xb155fdf5u, 0x03563482u, 0x8aba3cbbu,
273 0x28517711u, 0xc20ad9f8u, 0xabcc5167u, 0xccad925fu,
274 0x4de81751u, 0x3830dc8eu, 0x379d5862u, 0x9320f991u,
275 0xea7a90c2u, 0xfb3e7bceu, 0x5121ce64u, 0x774fbe32u,
276 0xa8b6e37eu, 0xc3293d46u, 0x48de5369u, 0x6413e680u,
277 0xa2ae0810u, 0xdd6db224u, 0x69852dfdu, 0x09072166u,
278 0xb39a460au, 0x6445c0ddu, 0x586cdecfu, 0x1c20c8aeu,
279 0x5bbef7ddu, 0x1b588d40u, 0xccd2017fu, 0x6bb4e3bbu,
280 0xdda26a7eu, 0x3a59ff45u, 0x3e350a44u, 0xbcb4cdd5u,
281 0x72eacea8u, 0xfa6484bbu, 0x8d6612aeu, 0xbf3c6f47u,
282 0xd29be463u, 0x542f5d9eu, 0xaec2771bu, 0xf64e6370u,
283 0x740e0d8du, 0xe75b1357u, 0xf8721671u, 0xaf537d5du,
284 0x4040cb08u, 0x4eb4e2ccu, 0x34d2466au, 0x0115af84u,
285 0xe1b00428u, 0x95983a1du, 0x06b89fb4u, 0xce6ea048u,
286 0x6f3f3b82u, 0x3520ab82u, 0x011a1d4bu, 0x277227f8u,
287 0x611560b1u, 0xe7933fdcu, 0xbb3a792bu, 0x344525bdu,
288 0xa08839e1u, 0x51ce794bu, 0x2f32c9b7u, 0xa01fbac9u,
289 0xe01cc87eu, 0xbcc7d1f6u, 0xcf0111c3u, 0xa1e8aac7u,
290 0x1a908749u, 0xd44fbd9au, 0xd0dadecbu, 0xd50ada38u,
291 0x0339c32au, 0xc6913667u, 0x8df9317cu, 0xe0b12b4fu,
292 0xf79e59b7u, 0x43f5bb3au, 0xf2d519ffu, 0x27d9459cu,
293 0xbf97222cu, 0x15e6fc2au, 0x0f91fc71u, 0x9b941525u,
294 0xfae59361u, 0xceb69cebu, 0xc2a86459u, 0x12baa8d1u,
295 0xb6c1075eu, 0xe3056a0cu, 0x10d25065u, 0xcb03a442u,
296 0xe0ec6e0eu, 0x1698db3bu, 0x4c98a0beu, 0x3278e964u,
297 0x9f1f9532u, 0xe0d392dfu, 0xd3a0342bu, 0x8971f21eu,
298 0x1b0a7441u, 0x4ba3348cu, 0xc5be7120u, 0xc37632d8u,
299 0xdf359f8du, 0x9b992f2eu, 0xe60b6f47u, 0x0fe3f11du,
300 0xe54cda54u, 0x1edad891u, 0xce6279cfu, 0xcd3e7e6fu,
301 0x1618b166u, 0xfd2c1d05u, 0x848fd2c5u, 0xf6fb2299u,
302 0xf523f357u, 0xa6327623u, 0x93a83531u, 0x56cccd02u,
303 0xacf08162u, 0x5a75ebb5u, 0x6e163697u, 0x88d273ccu,
304 0xde966292u, 0x81b949d0u, 0x4c50901bu, 0x71c65614u,
305 0xe6c6c7bdu, 0x327a140au, 0x45e1d006u, 0xc3f27b9au,
306 0xc9aa53fdu, 0x62a80f00u, 0xbb25bfe2u, 0x35bdd2f6u,
307 0x71126905u, 0xb2040222u, 0xb6cbcf7cu, 0xcd769c2bu,
308 0x53113ec0u, 0x1640e3d3u, 0x38abbd60u, 0x2547adf0u,
309 0xba38209cu, 0xf746ce76u, 0x77afa1c5u, 0x20756060u,
310 0x85cbfe4eu, 0x8ae88dd8u, 0x7aaaf9b0u, 0x4cf9aa7eu,
311 0x1948c25cu, 0x02fb8a8cu, 0x01c36ae4u, 0xd6ebe1f9u,
312 0x90d4f869u, 0xa65cdea0u, 0x3f09252du, 0xc208e69fu,
313 0xb74e6132u, 0xce77e25bu, 0x578fdfe3u, 0x3ac372e6u
314 }
315};
316
317
318#define F1(i) \
319 xl ^= pax[i]; \
Bram Moolenaarbbd6afe2010-06-02 20:32:23 +0200320 xr ^= ((sbx[0][xl >> 24] + \
321 sbx[1][(xl & 0xFF0000) >> 16]) ^ \
322 sbx[2][(xl & 0xFF00) >> 8]) + \
323 sbx[3][xl & 0xFF];
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200324
325#define F2(i) \
326 xr ^= pax[i]; \
Bram Moolenaarbbd6afe2010-06-02 20:32:23 +0200327 xl ^= ((sbx[0][xr >> 24] + \
328 sbx[1][(xr & 0xFF0000) >> 16]) ^ \
329 sbx[2][(xr & 0xFF00) >> 8]) + \
330 sbx[3][xr & 0xFF];
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200331
332
333 static void
334bf_e_block(p_xl, p_xr)
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200335 UINT32_T *p_xl;
336 UINT32_T *p_xr;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200337{
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200338 UINT32_T temp, xl = *p_xl, xr = *p_xr;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200339
340 F1(0) F2(1) F1(2) F2(3) F1(4) F2(5) F1(6) F2(7)
341 F1(8) F2(9) F1(10) F2(11) F1(12) F2(13) F1(14) F2(15)
Bram Moolenaarbbd6afe2010-06-02 20:32:23 +0200342 xl ^= pax[16];
343 xr ^= pax[17];
344 temp = xl;
345 xl = xr;
346 xr = temp;
347 *p_xl = xl;
348 *p_xr = xr;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200349}
350
351#if 0 /* not used */
352 static void
353bf_d_block(p_xl, p_xr)
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200354 UINT32_T *p_xl;
355 UINT32_T *p_xr;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200356{
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200357 UINT32_T temp, xl = *p_xl, xr = *p_xr;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200358 F1(17) F2(16) F1(15) F2(14) F1(13) F2(12) F1(11) F2(10)
359 F1(9) F2(8) F1(7) F2(6) F1(5) F2(4) F1(3) F2(2)
360 xl ^= pax[1];
361 xr ^= pax[0];
362 temp = xl; xl = xr; xr = temp;
363 *p_xl = xl; *p_xr = xr;
364}
365#endif
366
367
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200368#ifdef WORDS_BIGENDIAN
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200369# define htonl2(x) \
370 x = ((((x) & 0xffL) << 24) | (((x) & 0xff00L) << 8) | \
371 (((x) & 0xff0000L) >> 8) | (((x) & 0xff000000L) >> 24))
372#else
373# define htonl2(x)
374#endif
375
376 static void
377bf_e_cblock(block)
378 char_u *block;
379{
Bram Moolenaarbbd6afe2010-06-02 20:32:23 +0200380 block8 bk;
381
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200382 memcpy(bk.uc, block, 8);
383 htonl2(bk.ul[0]);
384 htonl2(bk.ul[1]);
385 bf_e_block(&bk.ul[0], &bk.ul[1]);
386 htonl2(bk.ul[0]);
387 htonl2(bk.ul[1]);
388 memcpy(block, bk.uc, 8);
389}
390
391#if 0 /* not used */
392 void
393bf_d_cblock(block)
394 char_u *block;
395{
396 block8 bk;
397 memcpy(bk.uc, block, 8);
398 htonl2(bk.ul[0]); htonl2(bk.ul[1]);
399 bf_d_block(&bk.ul[0], &bk.ul[1]);
400 htonl2(bk.ul[0]); htonl2(bk.ul[1]);
401 memcpy(block, bk.uc, 8);
402}
403#endif
404
Bram Moolenaar80794b12010-06-13 05:20:42 +0200405/*
406 * Initialize the crypt method using "password" as the encryption key and
407 * "salt[salt_len]" as the salt.
408 */
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200409 void
Bram Moolenaar80794b12010-06-13 05:20:42 +0200410bf_key_init(password, salt, salt_len)
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200411 char_u *password;
Bram Moolenaar80794b12010-06-13 05:20:42 +0200412 char_u *salt;
413 int salt_len;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200414{
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200415 int i, j, keypos = 0;
Bram Moolenaar2f70a342011-02-25 14:42:45 +0100416 unsigned u;
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200417 UINT32_T val, data_l, data_r;
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200418 char_u *key;
419 int keylen;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200420
Bram Moolenaar80794b12010-06-13 05:20:42 +0200421 /* Process the key 1000 times.
422 * See http://en.wikipedia.org/wiki/Key_strengthening. */
423 key = sha256_key(password, salt, salt_len);
424 for (i = 0; i < 1000; i++)
Bram Moolenaarcc448b32010-07-14 16:52:17 +0200425 key = sha256_key(key, salt, salt_len);
Bram Moolenaar80794b12010-06-13 05:20:42 +0200426
427 /* Convert the key from 64 hex chars to 32 binary chars. */
428 keylen = (int)STRLEN(key) / 2;
Bram Moolenaar56be9502010-06-06 14:20:26 +0200429 if (keylen == 0)
430 {
431 EMSG(_("E831: bf_key_init() called with empty password"));
432 return;
433 }
Bram Moolenaar80794b12010-06-13 05:20:42 +0200434 for (i = 0; i < keylen; i++)
435 {
Bram Moolenaar2f70a342011-02-25 14:42:45 +0100436 sscanf((char *)&key[i * 2], "%2x", &u);
437 key[i] = u;
Bram Moolenaar80794b12010-06-13 05:20:42 +0200438 }
439
Bram Moolenaara8ffcbb2010-06-21 06:15:46 +0200440 mch_memmove(sbx, sbi, 4 * 4 * 256);
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200441
442 for (i = 0; i < 18; ++i)
443 {
444 val = 0;
445 for (j = 0; j < 4; ++j)
Bram Moolenaar823a1652010-05-16 23:02:33 +0200446 val = (val << 8) | key[keypos++ % keylen];
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200447 pax[i] = ipa[i] ^ val;
448 }
449
450 data_l = data_r = 0;
451 for (i = 0; i < 18; i += 2)
452 {
453 bf_e_block(&data_l, &data_r);
454 pax[i + 0] = data_l;
455 pax[i + 1] = data_r;
456 }
457
458 for (i = 0; i < 4; ++i)
459 {
460 for (j = 0; j < 256; j += 2)
461 {
462 bf_e_block(&data_l, &data_r);
463 sbx[i][j + 0] = data_l;
464 sbx[i][j + 1] = data_r;
465 }
466 }
467}
468
469/*
470 * BF Self test for corrupted tables or instructions
471 */
472 static int
Bram Moolenaarf506c5b2010-06-22 06:28:58 +0200473bf_check_tables(a_ipa, a_sbi, val)
474 UINT32_T a_ipa[18];
475 UINT32_T a_sbi[4][256];
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200476 UINT32_T val;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200477{
478 int i, j;
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200479 UINT32_T c = 0;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200480
481 for (i = 0; i < 18; i++)
Bram Moolenaarf506c5b2010-06-22 06:28:58 +0200482 c ^= a_ipa[i];
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200483 for (i = 0; i < 4; i++)
484 for (j = 0; j < 256; j++)
Bram Moolenaarf506c5b2010-06-22 06:28:58 +0200485 c ^= a_sbi[i][j];
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200486 return c == val;
487}
488
489typedef struct {
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200490 char_u password[64];
Bram Moolenaar80794b12010-06-13 05:20:42 +0200491 char_u salt[9];
492 char_u plaintxt[9];
493 char_u cryptxt[9];
494 char_u badcryptxt[9]; /* cryptxt when big/little endian is wrong */
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200495 UINT32_T keysum;
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200496} struct_bf_test_data;
497
Bram Moolenaar4a9b19a2010-05-18 21:17:10 +0200498/*
499 * Assert bf(password, plaintxt) is cryptxt.
500 * Assert csum(pax sbx(password)) is keysum.
501 */
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200502static struct_bf_test_data bf_test_data[] = {
503 {
504 "password",
Bram Moolenaar80794b12010-06-13 05:20:42 +0200505 "salt",
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200506 "plaintxt",
Bram Moolenaar80794b12010-06-13 05:20:42 +0200507 "\xad\x3d\xfa\x7f\xe8\xea\x40\xf6", /* cryptxt */
508 "\x72\x50\x3b\x38\x10\x60\x22\xa7", /* badcryptxt */
509 0x56701b5du /* keysum */
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200510 },
511};
512
513/*
514 * Return FAIL when there is something wrong with blowfish encryption.
515 */
516 static int
517bf_self_test()
518{
519 int i, bn;
520 int err = 0;
521 block8 bk;
Bram Moolenaarfa7584c2010-05-19 21:57:45 +0200522 UINT32_T ui = 0xffffffffUL;
523
524 /* We can't simply use sizeof(UINT32_T), it would generate a compiler
525 * warning. */
526 if (ui != 0xffffffffUL || ui + 1 != 0) {
527 err++;
528 EMSG(_("E820: sizeof(uint32_t) != 4"));
529 }
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200530
531 if (!bf_check_tables(ipa, sbi, 0x6ffa520a))
532 err++;
533
534 bn = ARRAY_LENGTH(bf_test_data);
535 for (i = 0; i < bn; i++)
536 {
Bram Moolenaar80794b12010-06-13 05:20:42 +0200537 bf_key_init((char_u *)(bf_test_data[i].password),
Bram Moolenaarcc448b32010-07-14 16:52:17 +0200538 bf_test_data[i].salt,
Bram Moolenaar80794b12010-06-13 05:20:42 +0200539 (int)STRLEN(bf_test_data[i].salt));
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200540 if (!bf_check_tables(pax, sbx, bf_test_data[i].keysum))
541 err++;
542
543 /* Don't modify bf_test_data[i].plaintxt, self test is idempotent. */
544 memcpy(bk.uc, bf_test_data[i].plaintxt, 8);
545 bf_e_cblock(bk.uc);
546 if (memcmp(bk.uc, bf_test_data[i].cryptxt, 8) != 0)
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200547 {
548 if (err == 0 && memcmp(bk.uc, bf_test_data[i].badcryptxt, 8) == 0)
549 EMSG(_("E817: Blowfish big/little endian use wrong"));
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200550 err++;
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200551 }
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200552 }
553
554 return err > 0 ? FAIL : OK;
555}
556
557/* Output feedback mode. */
558static int randbyte_offset = 0;
559static int update_offset = 0;
560static char_u ofb_buffer[BF_OFB_LEN]; /* 64 bytes */
561
562/*
563 * Initialize with seed "iv[iv_len]".
564 */
565 void
566bf_ofb_init(iv, iv_len)
567 char_u *iv;
568 int iv_len;
569{
570 int i, mi;
571
572 randbyte_offset = update_offset = 0;
Bram Moolenaar7db5fc82010-05-24 11:59:29 +0200573 vim_memset(ofb_buffer, 0, BF_OFB_LEN);
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200574 if (iv_len > 0)
575 {
576 mi = iv_len > BF_OFB_LEN ? iv_len : BF_OFB_LEN;
577 for (i = 0; i < mi; i++)
578 ofb_buffer[i % BF_OFB_LEN] ^= iv[i % iv_len];
579 }
580}
581
Bram Moolenaarbbd6afe2010-06-02 20:32:23 +0200582#define BF_OFB_UPDATE(c) { \
583 ofb_buffer[update_offset] ^= (char_u)c; \
584 if (++update_offset == BF_OFB_LEN) \
585 update_offset = 0; \
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200586}
587
Bram Moolenaarbbd6afe2010-06-02 20:32:23 +0200588#define BF_RANBYTE(t) { \
589 if ((randbyte_offset & BF_BLOCK_MASK) == 0) \
590 bf_e_cblock(&ofb_buffer[randbyte_offset]); \
591 t = ofb_buffer[randbyte_offset]; \
592 if (++randbyte_offset == BF_OFB_LEN) \
593 randbyte_offset = 0; \
594}
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200595
Bram Moolenaarbbd6afe2010-06-02 20:32:23 +0200596/*
597 * Encrypt "from[len]" into "to[len]".
598 * "from" and "to" can be equal to encrypt in place.
599 */
600 void
601bf_crypt_encode(from, len, to)
602 char_u *from;
603 size_t len;
604 char_u *to;
605{
606 size_t i;
607 int ztemp, t;
608
609 for (i = 0; i < len; ++i)
610 {
611 ztemp = from[i];
612 BF_RANBYTE(t);
613 BF_OFB_UPDATE(ztemp);
614 to[i] = t ^ ztemp;
615 }
616}
617
618/*
619 * Decrypt "ptr[len]" in place.
620 */
621 void
622bf_crypt_decode(ptr, len)
623 char_u *ptr;
624 long len;
625{
626 char_u *p;
627 int t;
628
629 for (p = ptr; p < ptr + len; ++p)
630 {
631 BF_RANBYTE(t);
632 *p ^= t;
633 BF_OFB_UPDATE(*p);
634 }
635}
636
637/*
638 * Initialize the encryption keys and the random header according to
639 * the given password.
640 */
641 void
642bf_crypt_init_keys(passwd)
643 char_u *passwd; /* password string with which to modify keys */
644{
645 char_u *p;
646
647 for (p = passwd; *p != NUL; ++p)
648 {
649 BF_OFB_UPDATE(*p);
650 }
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200651}
652
Bram Moolenaara8ffcbb2010-06-21 06:15:46 +0200653static int save_randbyte_offset;
654static int save_update_offset;
655static char_u save_ofb_buffer[BF_OFB_LEN];
656static UINT32_T save_pax[18];
657static UINT32_T save_sbx[4][256];
658
659/*
660 * Save the current crypt state. Can only be used once before
661 * bf_crypt_restore().
662 */
663 void
664bf_crypt_save()
665{
666 save_randbyte_offset = randbyte_offset;
667 save_update_offset = update_offset;
668 mch_memmove(save_ofb_buffer, ofb_buffer, BF_OFB_LEN);
669 mch_memmove(save_pax, pax, 4 * 18);
670 mch_memmove(save_sbx, sbx, 4 * 4 * 256);
671}
672
673/*
674 * Restore the current crypt state. Can only be used after
675 * bf_crypt_save().
676 */
677 void
678bf_crypt_restore()
679{
680 randbyte_offset = save_randbyte_offset;
681 update_offset = save_update_offset;
682 mch_memmove(ofb_buffer, save_ofb_buffer, BF_OFB_LEN);
683 mch_memmove(pax, save_pax, 4 * 18);
684 mch_memmove(sbx, save_sbx, 4 * 4 * 256);
685}
686
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200687/*
688 * Run a test to check if the encryption works as expected.
689 * Give an error and return FAIL when not.
690 */
691 int
692blowfish_self_test()
693{
694 if (sha256_self_test() == FAIL)
695 {
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200696 EMSG(_("E818: sha256 test failed"));
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200697 return FAIL;
698 }
699 if (bf_self_test() == FAIL)
700 {
Bram Moolenaar0bbabe82010-05-17 20:32:55 +0200701 EMSG(_("E819: Blowfish test failed"));
Bram Moolenaar40e6a712010-05-16 22:32:54 +0200702 return FAIL;
703 }
704 return OK;
705}
706
707#endif /* FEAT_CRYPT */