summaryrefslogtreecommitdiff
path: root/crypt_blowfish.c
diff options
context:
space:
mode:
authorStefan Esser2012-01-11 20:15:17 +0100
committerStefan Esser2012-01-11 20:15:17 +0100
commit31c5db0ca4d1690bc161b01243a0a2ae193f6246 (patch)
tree81395851f40bcae020e658be2f96b777a5665f79 /crypt_blowfish.c
parente602fd738f066e0abf9fdf8b5dbb373b8daee40b (diff)
Removed files for crypt support
Diffstat (limited to 'crypt_blowfish.c')
-rw-r--r--crypt_blowfish.c751
1 files changed, 0 insertions, 751 deletions
diff --git a/crypt_blowfish.c b/crypt_blowfish.c
deleted file mode 100644
index cdc3ac5..0000000
--- a/crypt_blowfish.c
+++ /dev/null
@@ -1,751 +0,0 @@
1/*
2 $Id: crypt_blowfish.c,v 1.1.1.1 2007-11-28 01:15:35 sesser Exp $
3*/
4/*
5 * This code comes from John the Ripper password cracker, with reentrant
6 * and crypt(3) interfaces added, but optimizations specific to password
7 * cracking removed.
8 *
9 * Written by Solar Designer <solar at openwall.com> in 1998-2002 and
10 * placed in the public domain.
11 *
12 * There's absolutely no warranty.
13 *
14 * It is my intent that you should be able to use this on your system,
15 * as a part of a software package, or anywhere else to improve security,
16 * ensure compatibility, or for any other purpose. I would appreciate
17 * it if you give credit where it is due and keep your modifications in
18 * the public domain as well, but I don't require that in order to let
19 * you place this code and any modifications you make under a license
20 * of your choice.
21 *
22 * This implementation is compatible with OpenBSD bcrypt.c (version 2a)
23 * by Niels Provos <provos at citi.umich.edu>, and uses some of his
24 * ideas. The password hashing algorithm was designed by David Mazieres
25 * <dm at lcs.mit.edu>.
26 *
27 * There's a paper on the algorithm that explains its design decisions:
28 *
29 * http://www.usenix.org/events/usenix99/provos.html
30 *
31 * Some of the tricks in BF_ROUND might be inspired by Eric Young's
32 * Blowfish library (I can't be sure if I would think of something if I
33 * hadn't seen his code).
34 */
35
36#include <string.h>
37
38#include <errno.h>
39#ifndef __set_errno
40#define __set_errno(val) errno = (val)
41#endif
42
43#undef __CONST
44#ifdef __GNUC__
45#define __CONST __const
46#else
47#define __CONST
48#endif
49
50#ifdef __i386__
51#define BF_ASM 0
52#define BF_SCALE 1
53#elif defined(__alpha__) || defined(__hppa__)
54#define BF_ASM 0
55#define BF_SCALE 1
56#else
57#define BF_ASM 0
58#define BF_SCALE 0
59#endif
60
61typedef unsigned int BF_word;
62
63/* Number of Blowfish rounds, this is also hardcoded into a few places */
64#define BF_N 16
65
66typedef BF_word BF_key[BF_N + 2];
67
68typedef struct {
69 BF_word S[4][0x100];
70 BF_key P;
71} BF_ctx;
72
73/*
74 * Magic IV for 64 Blowfish encryptions that we do at the end.
75 * The string is "OrpheanBeholderScryDoubt" on big-endian.
76 */
77static BF_word BF_magic_w[6] = {
78 0x4F727068, 0x65616E42, 0x65686F6C,
79 0x64657253, 0x63727944, 0x6F756274
80};
81
82/*
83 * P-box and S-box tables initialized with digits of Pi.
84 */
85static BF_ctx BF_init_state = {
86 {
87 {
88 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
89 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
90 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
91 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
92 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
93 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
94 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
95 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
96 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
97 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
98 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
99 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
100 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
101 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
102 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
103 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
104 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
105 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
106 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
107 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
108 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
109 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
110 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
111 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
112 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
113 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
114 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
115 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
116 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
117 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
118 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
119 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
120 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
121 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
122 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
123 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
124 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
125 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
126 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
127 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
128 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
129 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
130 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
131 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
132 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
133 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
134 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
135 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
136 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
137 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
138 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
139 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
140 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
141 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
142 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
143 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
144 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
145 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
146 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
147 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
148 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
149 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
150 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
151 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a
152 }, {
153 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
154 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
155 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
156 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
157 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
158 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
159 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
160 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
161 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
162 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
163 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
164 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
165 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
166 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
167 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
168 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
169 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
170 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
171 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
172 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
173 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
174 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
175 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
176 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
177 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
178 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
179 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
180 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
181 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
182 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
183 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
184 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
185 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
186 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
187 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
188 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
189 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
190 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
191 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
192 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
193 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
194 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
195 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
196 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
197 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
198 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
199 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
200 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
201 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
202 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
203 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
204 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
205 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
206 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
207 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
208 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
209 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
210 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
211 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
212 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
213 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
214 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
215 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
216 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7
217 }, {
218 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
219 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
220 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
221 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
222 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
223 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
224 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
225 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
226 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
227 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
228 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
229 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
230 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
231 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
232 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
233 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
234 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
235 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
236 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
237 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
238 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
239 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
240 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
241 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
242 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
243 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
244 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
245 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
246 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
247 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
248 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
249 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
250 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
251 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
252 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
253 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
254 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
255 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
256 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
257 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
258 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
259 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
260 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
261 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
262 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
263 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
264 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
265 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
266 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
267 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
268 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
269 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
270 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
271 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
272 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
273 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
274 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
275 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
276 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
277 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
278 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
279 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
280 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
281 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0
282 }, {
283 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
284 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
285 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
286 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
287 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
288 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
289 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
290 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
291 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
292 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
293 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
294 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
295 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
296 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
297 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
298 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
299 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
300 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
301 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
302 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
303 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
304 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
305 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
306 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
307 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
308 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
309 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
310 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
311 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
312 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
313 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
314 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
315 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
316 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
317 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
318 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
319 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
320 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
321 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
322 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
323 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
324 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
325 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
326 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
327 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
328 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
329 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
330 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
331 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
332 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
333 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
334 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
335 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
336 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
337 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
338 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
339 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
340 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
341 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
342 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
343 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
344 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
345 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
346 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
347 }
348 }, {
349 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
350 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
351 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
352 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
353 0x9216d5d9, 0x8979fb1b
354 }
355};
356
357static unsigned char BF_itoa64[64 + 1] =
358 "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
359
360static unsigned char BF_atoi64[0x60] = {
361 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 1,
362 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 64, 64, 64, 64,
363 64, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
364 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 64, 64, 64, 64, 64,
365 64, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
366 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 64, 64, 64, 64, 64
367};
368
369/*
370 * This may be optimized out if built with function inlining and no BF_ASM.
371 */
372static void clean(void *data, int size)
373{
374#if BF_ASM
375 extern void _BF_clean(void *data);
376#endif
377 memset(data, 0, size);
378#if BF_ASM
379 _BF_clean(data);
380#endif
381}
382
383#define BF_safe_atoi64(dst, src) \
384{ \
385 tmp = (unsigned char)(src); \
386 if (tmp == '$') break; \
387 if ((unsigned int)(tmp -= 0x20) >= 0x60) return -1; \
388 tmp = BF_atoi64[tmp]; \
389 if (tmp > 63) return -1; \
390 (dst) = tmp; \
391}
392
393static int BF_decode(BF_word *dst, __CONST char *src, int size)
394{
395 unsigned char *dptr = (unsigned char *)dst;
396 unsigned char *end = dptr + size;
397 unsigned char *sptr = (unsigned char *)src;
398 unsigned int tmp, c1, c2, c3, c4;
399
400 do {
401 BF_safe_atoi64(c1, *sptr++);
402 BF_safe_atoi64(c2, *sptr++);
403 *dptr++ = (c1 << 2) | ((c2 & 0x30) >> 4);
404 if (dptr >= end) break;
405
406 BF_safe_atoi64(c3, *sptr++);
407 *dptr++ = ((c2 & 0x0F) << 4) | ((c3 & 0x3C) >> 2);
408 if (dptr >= end) break;
409
410 BF_safe_atoi64(c4, *sptr++);
411 *dptr++ = ((c3 & 0x03) << 6) | c4;
412 } while (dptr < end);
413
414 while (dptr < end)
415 *dptr++ = 0;
416
417 return 0;
418}
419
420static void BF_encode(char *dst, __CONST BF_word *src, int size)
421{
422 unsigned char *sptr = (unsigned char *)src;
423 unsigned char *end = sptr + size;
424 unsigned char *dptr = (unsigned char *)dst;
425 unsigned int c1, c2;
426
427 do {
428 c1 = *sptr++;
429 *dptr++ = BF_itoa64[c1 >> 2];
430 c1 = (c1 & 0x03) << 4;
431 if (sptr >= end) {
432 *dptr++ = BF_itoa64[c1];
433 break;
434 }
435
436 c2 = *sptr++;
437 c1 |= c2 >> 4;
438 *dptr++ = BF_itoa64[c1];
439 c1 = (c2 & 0x0f) << 2;
440 if (sptr >= end) {
441 *dptr++ = BF_itoa64[c1];
442 break;
443 }
444
445 c2 = *sptr++;
446 c1 |= c2 >> 6;
447 *dptr++ = BF_itoa64[c1];
448 *dptr++ = BF_itoa64[c2 & 0x3f];
449 } while (sptr < end);
450}
451
452static void BF_swap(BF_word *x, int count)
453{
454 static int endianness_check = 1;
455 char *is_little_endian = (char *)&endianness_check;
456 BF_word tmp;
457
458 if (*is_little_endian)
459 do {
460 tmp = *x;
461 tmp = (tmp << 16) | (tmp >> 16);
462 *x++ = ((tmp & 0x00FF00FF) << 8) | ((tmp >> 8) & 0x00FF00FF);
463 } while (--count);
464}
465
466#if BF_SCALE
467/* Architectures which can shift addresses left by 2 bits with no extra cost */
468#define BF_ROUND(L, R, N) \
469 tmp1 = L & 0xFF; \
470 tmp2 = L >> 8; \
471 tmp2 &= 0xFF; \
472 tmp3 = L >> 16; \
473 tmp3 &= 0xFF; \
474 tmp4 = L >> 24; \
475 tmp1 = data.ctx.S[3][tmp1]; \
476 tmp2 = data.ctx.S[2][tmp2]; \
477 tmp3 = data.ctx.S[1][tmp3]; \
478 tmp3 += data.ctx.S[0][tmp4]; \
479 tmp3 ^= tmp2; \
480 R ^= data.ctx.P[N + 1]; \
481 tmp3 += tmp1; \
482 R ^= tmp3;
483#else
484/* Architectures with no complicated addressing modes supported */
485#define BF_INDEX(S, i) \
486 (*((BF_word *)(((unsigned char *)S) + (i))))
487#define BF_ROUND(L, R, N) \
488 tmp1 = L & 0xFF; \
489 tmp1 <<= 2; \
490 tmp2 = L >> 6; \
491 tmp2 &= 0x3FC; \
492 tmp3 = L >> 14; \
493 tmp3 &= 0x3FC; \
494 tmp4 = L >> 22; \
495 tmp4 &= 0x3FC; \
496 tmp1 = BF_INDEX(data.ctx.S[3], tmp1); \
497 tmp2 = BF_INDEX(data.ctx.S[2], tmp2); \
498 tmp3 = BF_INDEX(data.ctx.S[1], tmp3); \
499 tmp3 += BF_INDEX(data.ctx.S[0], tmp4); \
500 tmp3 ^= tmp2; \
501 R ^= data.ctx.P[N + 1]; \
502 tmp3 += tmp1; \
503 R ^= tmp3;
504#endif
505
506/*
507 * Encrypt one block, BF_N is hardcoded here.
508 */
509#define BF_ENCRYPT \
510 L ^= data.ctx.P[0]; \
511 BF_ROUND(L, R, 0); \
512 BF_ROUND(R, L, 1); \
513 BF_ROUND(L, R, 2); \
514 BF_ROUND(R, L, 3); \
515 BF_ROUND(L, R, 4); \
516 BF_ROUND(R, L, 5); \
517 BF_ROUND(L, R, 6); \
518 BF_ROUND(R, L, 7); \
519 BF_ROUND(L, R, 8); \
520 BF_ROUND(R, L, 9); \
521 BF_ROUND(L, R, 10); \
522 BF_ROUND(R, L, 11); \
523 BF_ROUND(L, R, 12); \
524 BF_ROUND(R, L, 13); \
525 BF_ROUND(L, R, 14); \
526 BF_ROUND(R, L, 15); \
527 tmp4 = R; \
528 R = L; \
529 L = tmp4 ^ data.ctx.P[BF_N + 1];
530
531#if BF_ASM
532#define BF_body() \
533 _BF_body_r(&data.ctx);
534#else
535#define BF_body() \
536 L = R = 0; \
537 ptr = data.ctx.P; \
538 do { \
539 ptr += 2; \
540 BF_ENCRYPT; \
541 *(ptr - 2) = L; \
542 *(ptr - 1) = R; \
543 } while (ptr < &data.ctx.P[BF_N + 2]); \
544\
545 ptr = data.ctx.S[0]; \
546 do { \
547 ptr += 2; \
548 BF_ENCRYPT; \
549 *(ptr - 2) = L; \
550 *(ptr - 1) = R; \
551 } while (ptr < &data.ctx.S[3][0xFF]);
552#endif
553
554static void BF_set_key(__CONST char *key, BF_key expanded, BF_key initial)
555{
556 __CONST char *ptr = key;
557 int i, j;
558 BF_word tmp;
559
560 for (i = 0; i < BF_N + 2; i++) {
561 tmp = 0;
562 for (j = 0; j < 4; j++) {
563 tmp <<= 8;
564 tmp |= *ptr;
565
566 if (!*ptr) ptr = key; else ptr++;
567 }
568
569 expanded[i] = tmp;
570 initial[i] = BF_init_state.P[i] ^ tmp;
571 }
572}
573
574char *suhosin_crypt_blowfish_rn(__CONST char *key, __CONST char *setting,
575 char *output, int size)
576{
577#if BF_ASM
578 extern void _BF_body_r(BF_ctx *ctx);
579#endif
580 struct {
581 BF_ctx ctx;
582 BF_key expanded_key;
583 union {
584 BF_word salt[4];
585 BF_word output[6];
586 } binary;
587 } data;
588 BF_word L, R;
589 BF_word tmp1, tmp2, tmp3, tmp4;
590 BF_word *ptr;
591 BF_word count;
592 int i;
593
594 if (size < 7 + 22 + 31 + 1) {
595 __set_errno(ERANGE);
596 return NULL;
597 }
598
599 if (setting[0] != '$' ||
600 setting[1] != '2' ||
601 setting[2] != 'a' ||
602 setting[3] != '$' ||
603 setting[4] < '0' || setting[4] > '3' ||
604 setting[5] < '0' || setting[5] > '9' ||
605 setting[6] != '$') {
606 __set_errno(EINVAL);
607 return NULL;
608 }
609
610 count = (BF_word)1 << ((setting[4] - '0') * 10 + (setting[5] - '0'));
611 if (count < 16 || BF_decode(data.binary.salt, &setting[7], 16)) {
612 clean(data.binary.salt, sizeof(data.binary.salt));
613 __set_errno(EINVAL);
614 return NULL;
615 }
616
617 BF_swap(data.binary.salt, 4);
618
619 BF_set_key(key, data.expanded_key, data.ctx.P);
620
621 memcpy(data.ctx.S, BF_init_state.S, sizeof(data.ctx.S));
622
623 L = R = 0;
624 for (i = 0; i < BF_N + 2; i += 2) {
625 L ^= data.binary.salt[i & 2];
626 R ^= data.binary.salt[(i & 2) + 1];
627 BF_ENCRYPT;
628 data.ctx.P[i] = L;
629 data.ctx.P[i + 1] = R;
630 }
631
632 ptr = data.ctx.S[0];
633 do {
634 ptr += 4;
635 L ^= data.binary.salt[(BF_N + 2) & 3];
636 R ^= data.binary.salt[(BF_N + 3) & 3];
637 BF_ENCRYPT;
638 *(ptr - 4) = L;
639 *(ptr - 3) = R;
640
641 L ^= data.binary.salt[(BF_N + 4) & 3];
642 R ^= data.binary.salt[(BF_N + 5) & 3];
643 BF_ENCRYPT;
644 *(ptr - 2) = L;
645 *(ptr - 1) = R;
646 } while (ptr < &data.ctx.S[3][0xFF]);
647
648 do {
649 data.ctx.P[0] ^= data.expanded_key[0];
650 data.ctx.P[1] ^= data.expanded_key[1];
651 data.ctx.P[2] ^= data.expanded_key[2];
652 data.ctx.P[3] ^= data.expanded_key[3];
653 data.ctx.P[4] ^= data.expanded_key[4];
654 data.ctx.P[5] ^= data.expanded_key[5];
655 data.ctx.P[6] ^= data.expanded_key[6];
656 data.ctx.P[7] ^= data.expanded_key[7];
657 data.ctx.P[8] ^= data.expanded_key[8];
658 data.ctx.P[9] ^= data.expanded_key[9];
659 data.ctx.P[10] ^= data.expanded_key[10];
660 data.ctx.P[11] ^= data.expanded_key[11];
661 data.ctx.P[12] ^= data.expanded_key[12];
662 data.ctx.P[13] ^= data.expanded_key[13];
663 data.ctx.P[14] ^= data.expanded_key[14];
664 data.ctx.P[15] ^= data.expanded_key[15];
665 data.ctx.P[16] ^= data.expanded_key[16];
666 data.ctx.P[17] ^= data.expanded_key[17];
667
668 BF_body();
669
670 tmp1 = data.binary.salt[0];
671 tmp2 = data.binary.salt[1];
672 tmp3 = data.binary.salt[2];
673 tmp4 = data.binary.salt[3];
674 data.ctx.P[0] ^= tmp1;
675 data.ctx.P[1] ^= tmp2;
676 data.ctx.P[2] ^= tmp3;
677 data.ctx.P[3] ^= tmp4;
678 data.ctx.P[4] ^= tmp1;
679 data.ctx.P[5] ^= tmp2;
680 data.ctx.P[6] ^= tmp3;
681 data.ctx.P[7] ^= tmp4;
682 data.ctx.P[8] ^= tmp1;
683 data.ctx.P[9] ^= tmp2;
684 data.ctx.P[10] ^= tmp3;
685 data.ctx.P[11] ^= tmp4;
686 data.ctx.P[12] ^= tmp1;
687 data.ctx.P[13] ^= tmp2;
688 data.ctx.P[14] ^= tmp3;
689 data.ctx.P[15] ^= tmp4;
690 data.ctx.P[16] ^= tmp1;
691 data.ctx.P[17] ^= tmp2;
692
693 BF_body();
694 } while (--count);
695
696 for (i = 0; i < 6; i += 2) {
697 L = BF_magic_w[i];
698 R = BF_magic_w[i + 1];
699
700 count = 64;
701 do {
702 BF_ENCRYPT;
703 } while (--count);
704
705 data.binary.output[i] = L;
706 data.binary.output[i + 1] = R;
707 }
708
709 memcpy(output, setting, 7 + 22 - 1);
710 output[7 + 22 - 1] = BF_itoa64[(int)
711 BF_atoi64[(int)setting[7 + 22 - 1] - 0x20] & 0x30];
712
713/* This has to be bug-compatible with the original implementation, so
714 * only encode 23 of the 24 bytes. :-) */
715 BF_swap(data.binary.output, 6);
716 BF_encode(&output[7 + 22], data.binary.output, 23);
717 output[7 + 22 + 31] = '\0';
718
719/* Overwrite the most obvious sensitive data we have on the stack. Note
720 * that this does not guarantee there's no sensitive data left on the
721 * stack and/or in registers; I'm not aware of portable code that does. */
722 clean(&data, sizeof(data));
723
724 return output;
725}
726
727char *suhosin_crypt_gensalt_blowfish_rn(unsigned long count,
728 __CONST char *input, int size, char *output, int output_size)
729{
730 if (size < 16 || output_size < 7 + 22 + 1 ||
731 (count && (count < 4 || count > 31))) {
732 if (output_size > 0) output[0] = '\0';
733 __set_errno((output_size < 7 + 22 + 1) ? ERANGE : EINVAL);
734 return NULL;
735 }
736
737 if (!count) count = 5;
738
739 output[0] = '$';
740 output[1] = '2';
741 output[2] = 'a';
742 output[3] = '$';
743 output[4] = '0' + count / 10;
744 output[5] = '0' + count % 10;
745 output[6] = '$';
746
747 BF_encode(&output[7], (BF_word *)input, 16);
748 output[7 + 22] = '\0';
749
750 return output;
751}