1 """
2 Unix crypt(3) password hash algorithm.
3
4 This is a port to Python of the standard Unix password crypt function.
5 It's a single self-contained source file that works with any version
6 of Python from version 1.5 or higher. The code is based on Eric
7 Young's optimised crypt in C.
8
9 Python fcrypt is intended for users whose Python installation has not
10 had the crypt module enabled, or whose C library doesn't include the
11 crypt function. See the documentation for the Python crypt module for
12 more information:
13
14 http://www.python.org/doc/current/lib/module-crypt.html
15
16 An alternative Python crypt module that uses the MD5 algorithm and is
17 more secure than fcrypt is available from michal j wallace at:
18
19 http://www.sabren.net/code/python/crypt/index.php3
20
21 The crypt() function is a one-way hash function, intended to hide a
22 password such that the only way to find out the original password is
23 to guess values until you get a match. If you need to encrypt and
24 decrypt data, this is not the module for you.
25
26 There are at least two packages providing Python cryptography support:
27 M2Crypto at <http://www.pobox.org.sg/home/ngps/m2/>, and amkCrypto at
28 <http://www.amk.ca/python/code/crypto.html>.
29
30 Functions:
31
32 crypt() -- return hashed password
33 """
34
35 __author__ = 'Carey Evans <careye@spamcop.net>'
36 __version__ = '1.3.1'
37 __date__ = '21 February 2004'
38 __credits__ = '''michal j wallace for inspiring me to write this.
39 Eric Young for the C code this module was copied from.'''
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121 import string, struct
122
123
124 _ITERATIONS = 16
125
126 _SPtrans = (
127
128 [ 0x00820200, 0x00020000, 0x80800000, 0x80820200,
129 0x00800000, 0x80020200, 0x80020000, 0x80800000,
130 0x80020200, 0x00820200, 0x00820000, 0x80000200,
131 0x80800200, 0x00800000, 0x00000000, 0x80020000,
132 0x00020000, 0x80000000, 0x00800200, 0x00020200,
133 0x80820200, 0x00820000, 0x80000200, 0x00800200,
134 0x80000000, 0x00000200, 0x00020200, 0x80820000,
135 0x00000200, 0x80800200, 0x80820000, 0x00000000,
136 0x00000000, 0x80820200, 0x00800200, 0x80020000,
137 0x00820200, 0x00020000, 0x80000200, 0x00800200,
138 0x80820000, 0x00000200, 0x00020200, 0x80800000,
139 0x80020200, 0x80000000, 0x80800000, 0x00820000,
140 0x80820200, 0x00020200, 0x00820000, 0x80800200,
141 0x00800000, 0x80000200, 0x80020000, 0x00000000,
142 0x00020000, 0x00800000, 0x80800200, 0x00820200,
143 0x80000000, 0x80820000, 0x00000200, 0x80020200 ],
144
145
146 [ 0x10042004, 0x00000000, 0x00042000, 0x10040000,
147 0x10000004, 0x00002004, 0x10002000, 0x00042000,
148 0x00002000, 0x10040004, 0x00000004, 0x10002000,
149 0x00040004, 0x10042000, 0x10040000, 0x00000004,
150 0x00040000, 0x10002004, 0x10040004, 0x00002000,
151 0x00042004, 0x10000000, 0x00000000, 0x00040004,
152 0x10002004, 0x00042004, 0x10042000, 0x10000004,
153 0x10000000, 0x00040000, 0x00002004, 0x10042004,
154 0x00040004, 0x10042000, 0x10002000, 0x00042004,
155 0x10042004, 0x00040004, 0x10000004, 0x00000000,
156 0x10000000, 0x00002004, 0x00040000, 0x10040004,
157 0x00002000, 0x10000000, 0x00042004, 0x10002004,
158 0x10042000, 0x00002000, 0x00000000, 0x10000004,
159 0x00000004, 0x10042004, 0x00042000, 0x10040000,
160 0x10040004, 0x00040000, 0x00002004, 0x10002000,
161 0x10002004, 0x00000004, 0x10040000, 0x00042000 ],
162
163
164 [ 0x41000000, 0x01010040, 0x00000040, 0x41000040,
165 0x40010000, 0x01000000, 0x41000040, 0x00010040,
166 0x01000040, 0x00010000, 0x01010000, 0x40000000,
167 0x41010040, 0x40000040, 0x40000000, 0x41010000,
168 0x00000000, 0x40010000, 0x01010040, 0x00000040,
169 0x40000040, 0x41010040, 0x00010000, 0x41000000,
170 0x41010000, 0x01000040, 0x40010040, 0x01010000,
171 0x00010040, 0x00000000, 0x01000000, 0x40010040,
172 0x01010040, 0x00000040, 0x40000000, 0x00010000,
173 0x40000040, 0x40010000, 0x01010000, 0x41000040,
174 0x00000000, 0x01010040, 0x00010040, 0x41010000,
175 0x40010000, 0x01000000, 0x41010040, 0x40000000,
176 0x40010040, 0x41000000, 0x01000000, 0x41010040,
177 0x00010000, 0x01000040, 0x41000040, 0x00010040,
178 0x01000040, 0x00000000, 0x41010000, 0x40000040,
179 0x41000000, 0x40010040, 0x00000040, 0x01010000 ],
180
181
182 [ 0x00100402, 0x04000400, 0x00000002, 0x04100402,
183 0x00000000, 0x04100000, 0x04000402, 0x00100002,
184 0x04100400, 0x04000002, 0x04000000, 0x00000402,
185 0x04000002, 0x00100402, 0x00100000, 0x04000000,
186 0x04100002, 0x00100400, 0x00000400, 0x00000002,
187 0x00100400, 0x04000402, 0x04100000, 0x00000400,
188 0x00000402, 0x00000000, 0x00100002, 0x04100400,
189 0x04000400, 0x04100002, 0x04100402, 0x00100000,
190 0x04100002, 0x00000402, 0x00100000, 0x04000002,
191 0x00100400, 0x04000400, 0x00000002, 0x04100000,
192 0x04000402, 0x00000000, 0x00000400, 0x00100002,
193 0x00000000, 0x04100002, 0x04100400, 0x00000400,
194 0x04000000, 0x04100402, 0x00100402, 0x00100000,
195 0x04100402, 0x00000002, 0x04000400, 0x00100402,
196 0x00100002, 0x00100400, 0x04100000, 0x04000402,
197 0x00000402, 0x04000000, 0x04000002, 0x04100400 ],
198
199
200 [ 0x02000000, 0x00004000, 0x00000100, 0x02004108,
201 0x02004008, 0x02000100, 0x00004108, 0x02004000,
202 0x00004000, 0x00000008, 0x02000008, 0x00004100,
203 0x02000108, 0x02004008, 0x02004100, 0x00000000,
204 0x00004100, 0x02000000, 0x00004008, 0x00000108,
205 0x02000100, 0x00004108, 0x00000000, 0x02000008,
206 0x00000008, 0x02000108, 0x02004108, 0x00004008,
207 0x02004000, 0x00000100, 0x00000108, 0x02004100,
208 0x02004100, 0x02000108, 0x00004008, 0x02004000,
209 0x00004000, 0x00000008, 0x02000008, 0x02000100,
210 0x02000000, 0x00004100, 0x02004108, 0x00000000,
211 0x00004108, 0x02000000, 0x00000100, 0x00004008,
212 0x02000108, 0x00000100, 0x00000000, 0x02004108,
213 0x02004008, 0x02004100, 0x00000108, 0x00004000,
214 0x00004100, 0x02004008, 0x02000100, 0x00000108,
215 0x00000008, 0x00004108, 0x02004000, 0x02000008 ],
216
217
218 [ 0x20000010, 0x00080010, 0x00000000, 0x20080800,
219 0x00080010, 0x00000800, 0x20000810, 0x00080000,
220 0x00000810, 0x20080810, 0x00080800, 0x20000000,
221 0x20000800, 0x20000010, 0x20080000, 0x00080810,
222 0x00080000, 0x20000810, 0x20080010, 0x00000000,
223 0x00000800, 0x00000010, 0x20080800, 0x20080010,
224 0x20080810, 0x20080000, 0x20000000, 0x00000810,
225 0x00000010, 0x00080800, 0x00080810, 0x20000800,
226 0x00000810, 0x20000000, 0x20000800, 0x00080810,
227 0x20080800, 0x00080010, 0x00000000, 0x20000800,
228 0x20000000, 0x00000800, 0x20080010, 0x00080000,
229 0x00080010, 0x20080810, 0x00080800, 0x00000010,
230 0x20080810, 0x00080800, 0x00080000, 0x20000810,
231 0x20000010, 0x20080000, 0x00080810, 0x00000000,
232 0x00000800, 0x20000010, 0x20000810, 0x20080800,
233 0x20080000, 0x00000810, 0x00000010, 0x20080010 ],
234
235
236 [ 0x00001000, 0x00000080, 0x00400080, 0x00400001,
237 0x00401081, 0x00001001, 0x00001080, 0x00000000,
238 0x00400000, 0x00400081, 0x00000081, 0x00401000,
239 0x00000001, 0x00401080, 0x00401000, 0x00000081,
240 0x00400081, 0x00001000, 0x00001001, 0x00401081,
241 0x00000000, 0x00400080, 0x00400001, 0x00001080,
242 0x00401001, 0x00001081, 0x00401080, 0x00000001,
243 0x00001081, 0x00401001, 0x00000080, 0x00400000,
244 0x00001081, 0x00401000, 0x00401001, 0x00000081,
245 0x00001000, 0x00000080, 0x00400000, 0x00401001,
246 0x00400081, 0x00001081, 0x00001080, 0x00000000,
247 0x00000080, 0x00400001, 0x00000001, 0x00400080,
248 0x00000000, 0x00400081, 0x00400080, 0x00001080,
249 0x00000081, 0x00001000, 0x00401081, 0x00400000,
250 0x00401080, 0x00000001, 0x00001001, 0x00401081,
251 0x00400001, 0x00401080, 0x00401000, 0x00001001 ],
252
253
254 [ 0x08200020, 0x08208000, 0x00008020, 0x00000000,
255 0x08008000, 0x00200020, 0x08200000, 0x08208020,
256 0x00000020, 0x08000000, 0x00208000, 0x00008020,
257 0x00208020, 0x08008020, 0x08000020, 0x08200000,
258 0x00008000, 0x00208020, 0x00200020, 0x08008000,
259 0x08208020, 0x08000020, 0x00000000, 0x00208000,
260 0x08000000, 0x00200000, 0x08008020, 0x08200020,
261 0x00200000, 0x00008000, 0x08208000, 0x00000020,
262 0x00200000, 0x00008000, 0x08000020, 0x08208020,
263 0x00008020, 0x08000000, 0x00000000, 0x00208000,
264 0x08200020, 0x08008020, 0x08008000, 0x00200020,
265 0x08208000, 0x00000020, 0x00200020, 0x08008000,
266 0x08208020, 0x00200000, 0x08200000, 0x08000020,
267 0x00208000, 0x00008020, 0x08008020, 0x08200000,
268 0x00000020, 0x08208000, 0x00208020, 0x00000000,
269 0x08000000, 0x08200020, 0x00008000, 0x00208020 ] )
270
271 _skb = (
272
273 [ 0x00000000, 0x00000010, 0x20000000, 0x20000010,
274 0x00010000, 0x00010010, 0x20010000, 0x20010010,
275 0x00000800, 0x00000810, 0x20000800, 0x20000810,
276 0x00010800, 0x00010810, 0x20010800, 0x20010810,
277 0x00000020, 0x00000030, 0x20000020, 0x20000030,
278 0x00010020, 0x00010030, 0x20010020, 0x20010030,
279 0x00000820, 0x00000830, 0x20000820, 0x20000830,
280 0x00010820, 0x00010830, 0x20010820, 0x20010830,
281 0x00080000, 0x00080010, 0x20080000, 0x20080010,
282 0x00090000, 0x00090010, 0x20090000, 0x20090010,
283 0x00080800, 0x00080810, 0x20080800, 0x20080810,
284 0x00090800, 0x00090810, 0x20090800, 0x20090810,
285 0x00080020, 0x00080030, 0x20080020, 0x20080030,
286 0x00090020, 0x00090030, 0x20090020, 0x20090030,
287 0x00080820, 0x00080830, 0x20080820, 0x20080830,
288 0x00090820, 0x00090830, 0x20090820, 0x20090830 ],
289
290
291 [ 0x00000000, 0x02000000, 0x00002000, 0x02002000,
292 0x00200000, 0x02200000, 0x00202000, 0x02202000,
293 0x00000004, 0x02000004, 0x00002004, 0x02002004,
294 0x00200004, 0x02200004, 0x00202004, 0x02202004,
295 0x00000400, 0x02000400, 0x00002400, 0x02002400,
296 0x00200400, 0x02200400, 0x00202400, 0x02202400,
297 0x00000404, 0x02000404, 0x00002404, 0x02002404,
298 0x00200404, 0x02200404, 0x00202404, 0x02202404,
299 0x10000000, 0x12000000, 0x10002000, 0x12002000,
300 0x10200000, 0x12200000, 0x10202000, 0x12202000,
301 0x10000004, 0x12000004, 0x10002004, 0x12002004,
302 0x10200004, 0x12200004, 0x10202004, 0x12202004,
303 0x10000400, 0x12000400, 0x10002400, 0x12002400,
304 0x10200400, 0x12200400, 0x10202400, 0x12202400,
305 0x10000404, 0x12000404, 0x10002404, 0x12002404,
306 0x10200404, 0x12200404, 0x10202404, 0x12202404 ],
307
308
309 [ 0x00000000, 0x00000001, 0x00040000, 0x00040001,
310 0x01000000, 0x01000001, 0x01040000, 0x01040001,
311 0x00000002, 0x00000003, 0x00040002, 0x00040003,
312 0x01000002, 0x01000003, 0x01040002, 0x01040003,
313 0x00000200, 0x00000201, 0x00040200, 0x00040201,
314 0x01000200, 0x01000201, 0x01040200, 0x01040201,
315 0x00000202, 0x00000203, 0x00040202, 0x00040203,
316 0x01000202, 0x01000203, 0x01040202, 0x01040203,
317 0x08000000, 0x08000001, 0x08040000, 0x08040001,
318 0x09000000, 0x09000001, 0x09040000, 0x09040001,
319 0x08000002, 0x08000003, 0x08040002, 0x08040003,
320 0x09000002, 0x09000003, 0x09040002, 0x09040003,
321 0x08000200, 0x08000201, 0x08040200, 0x08040201,
322 0x09000200, 0x09000201, 0x09040200, 0x09040201,
323 0x08000202, 0x08000203, 0x08040202, 0x08040203,
324 0x09000202, 0x09000203, 0x09040202, 0x09040203 ],
325
326
327 [ 0x00000000, 0x00100000, 0x00000100, 0x00100100,
328 0x00000008, 0x00100008, 0x00000108, 0x00100108,
329 0x00001000, 0x00101000, 0x00001100, 0x00101100,
330 0x00001008, 0x00101008, 0x00001108, 0x00101108,
331 0x04000000, 0x04100000, 0x04000100, 0x04100100,
332 0x04000008, 0x04100008, 0x04000108, 0x04100108,
333 0x04001000, 0x04101000, 0x04001100, 0x04101100,
334 0x04001008, 0x04101008, 0x04001108, 0x04101108,
335 0x00020000, 0x00120000, 0x00020100, 0x00120100,
336 0x00020008, 0x00120008, 0x00020108, 0x00120108,
337 0x00021000, 0x00121000, 0x00021100, 0x00121100,
338 0x00021008, 0x00121008, 0x00021108, 0x00121108,
339 0x04020000, 0x04120000, 0x04020100, 0x04120100,
340 0x04020008, 0x04120008, 0x04020108, 0x04120108,
341 0x04021000, 0x04121000, 0x04021100, 0x04121100,
342 0x04021008, 0x04121008, 0x04021108, 0x04121108 ],
343
344
345 [ 0x00000000, 0x10000000, 0x00010000, 0x10010000,
346 0x00000004, 0x10000004, 0x00010004, 0x10010004,
347 0x20000000, 0x30000000, 0x20010000, 0x30010000,
348 0x20000004, 0x30000004, 0x20010004, 0x30010004,
349 0x00100000, 0x10100000, 0x00110000, 0x10110000,
350 0x00100004, 0x10100004, 0x00110004, 0x10110004,
351 0x20100000, 0x30100000, 0x20110000, 0x30110000,
352 0x20100004, 0x30100004, 0x20110004, 0x30110004,
353 0x00001000, 0x10001000, 0x00011000, 0x10011000,
354 0x00001004, 0x10001004, 0x00011004, 0x10011004,
355 0x20001000, 0x30001000, 0x20011000, 0x30011000,
356 0x20001004, 0x30001004, 0x20011004, 0x30011004,
357 0x00101000, 0x10101000, 0x00111000, 0x10111000,
358 0x00101004, 0x10101004, 0x00111004, 0x10111004,
359 0x20101000, 0x30101000, 0x20111000, 0x30111000,
360 0x20101004, 0x30101004, 0x20111004, 0x30111004 ],
361
362
363 [ 0x00000000, 0x08000000, 0x00000008, 0x08000008,
364 0x00000400, 0x08000400, 0x00000408, 0x08000408,
365 0x00020000, 0x08020000, 0x00020008, 0x08020008,
366 0x00020400, 0x08020400, 0x00020408, 0x08020408,
367 0x00000001, 0x08000001, 0x00000009, 0x08000009,
368 0x00000401, 0x08000401, 0x00000409, 0x08000409,
369 0x00020001, 0x08020001, 0x00020009, 0x08020009,
370 0x00020401, 0x08020401, 0x00020409, 0x08020409,
371 0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
372 0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
373 0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
374 0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
375 0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
376 0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
377 0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
378 0x02020401, 0x0A020401, 0x02020409, 0x0A020409 ],
379
380
381 [ 0x00000000, 0x00000100, 0x00080000, 0x00080100,
382 0x01000000, 0x01000100, 0x01080000, 0x01080100,
383 0x00000010, 0x00000110, 0x00080010, 0x00080110,
384 0x01000010, 0x01000110, 0x01080010, 0x01080110,
385 0x00200000, 0x00200100, 0x00280000, 0x00280100,
386 0x01200000, 0x01200100, 0x01280000, 0x01280100,
387 0x00200010, 0x00200110, 0x00280010, 0x00280110,
388 0x01200010, 0x01200110, 0x01280010, 0x01280110,
389 0x00000200, 0x00000300, 0x00080200, 0x00080300,
390 0x01000200, 0x01000300, 0x01080200, 0x01080300,
391 0x00000210, 0x00000310, 0x00080210, 0x00080310,
392 0x01000210, 0x01000310, 0x01080210, 0x01080310,
393 0x00200200, 0x00200300, 0x00280200, 0x00280300,
394 0x01200200, 0x01200300, 0x01280200, 0x01280300,
395 0x00200210, 0x00200310, 0x00280210, 0x00280310,
396 0x01200210, 0x01200310, 0x01280210, 0x01280310 ],
397
398
399 [ 0x00000000, 0x04000000, 0x00040000, 0x04040000,
400 0x00000002, 0x04000002, 0x00040002, 0x04040002,
401 0x00002000, 0x04002000, 0x00042000, 0x04042000,
402 0x00002002, 0x04002002, 0x00042002, 0x04042002,
403 0x00000020, 0x04000020, 0x00040020, 0x04040020,
404 0x00000022, 0x04000022, 0x00040022, 0x04040022,
405 0x00002020, 0x04002020, 0x00042020, 0x04042020,
406 0x00002022, 0x04002022, 0x00042022, 0x04042022,
407 0x00000800, 0x04000800, 0x00040800, 0x04040800,
408 0x00000802, 0x04000802, 0x00040802, 0x04040802,
409 0x00002800, 0x04002800, 0x00042800, 0x04042800,
410 0x00002802, 0x04002802, 0x00042802, 0x04042802,
411 0x00000820, 0x04000820, 0x00040820, 0x04040820,
412 0x00000822, 0x04000822, 0x00040822, 0x04040822,
413 0x00002820, 0x04002820, 0x00042820, 0x04042820,
414 0x00002822, 0x04002822, 0x00042822, 0x04042822 ] )
415
416 _shifts2 = (0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0)
417
418 _con_salt = [
419 0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,
420 0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,
421 0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,
422 0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,
423 0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,
424 0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x00,0x01,
425 0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
426 0x0A,0x0B,0x05,0x06,0x07,0x08,0x09,0x0A,
427 0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,
428 0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,
429 0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,
430 0x23,0x24,0x25,0x20,0x21,0x22,0x23,0x24,
431 0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,
432 0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,
433 0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,
434 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44 ]
435
436 _cov_2char = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
437
438
440 """Clever bit manipulation."""
441 t = ((a << 18) ^ a) & 0xcccc0000
442 return a ^ t ^ ((t >> 18) & 0x3fff)
443
445 """Cleverer bit manipulation."""
446 t = ((a >> n) ^ b) & m
447 b = b ^ t
448 a = a ^ (t << n)
449 return a,b
450
451
453 """Generate DES key schedule from ASCII password."""
454
455 c,d = struct.unpack('<ii', password)
456 c = (c & 0x7f7f7f7f) << 1
457 d = (d & 0x7f7f7f7f) << 1
458
459 d,c = _PERM_OP(d,c,4,0x0f0f0f0f)
460 c = _HPERM_OP(c)
461 d = _HPERM_OP(d)
462 d,c = _PERM_OP(d,c,1,0x55555555)
463 c,d = _PERM_OP(c,d,8,0x00ff00ff)
464 d,c = _PERM_OP(d,c,1,0x55555555)
465
466
467 d = (((d & 0x000000ff) << 16) | (d & 0x0000ff00) |
468 ((d & 0x00ff0000) >> 16) | ((c >> 4) & 0x0f000000))
469 c = c & 0x0fffffff
470
471
472 shifts2 = _shifts2
473 skbc0, skbc1, skbc2, skbc3, skbd0, skbd1, skbd2, skbd3 = _skb
474
475 k = [0] * (_ITERATIONS * 2)
476
477 for i in range(_ITERATIONS):
478
479 if shifts2[i]:
480 c = (c >> 2) | (c << 26)
481 d = (d >> 2) | (d << 26)
482 else:
483 c = (c >> 1) | (c << 27)
484 d = (d >> 1) | (d << 27)
485 c = c & 0x0fffffff
486 d = d & 0x0fffffff
487
488 s = ( skbc0[ c & 0x3f ] |
489 skbc1[((c>> 6) & 0x03) | ((c>> 7) & 0x3c)] |
490 skbc2[((c>>13) & 0x0f) | ((c>>14) & 0x30)] |
491 skbc3[((c>>20) & 0x01) |
492 ((c>>21) & 0x06) | ((c>>22) & 0x38)] )
493
494 t = ( skbd0[ d & 0x3f ] |
495 skbd1[((d>> 7) & 0x03) | ((d>> 8) & 0x3c)] |
496 skbd2[((d>>15) & 0x3f) ] |
497 skbd3[((d>>21) & 0x0f) | ((d>>22) & 0x30)] )
498
499 k[2*i] = ((t << 16) | (s & 0x0000ffff)) & 0xffffffff
500 s = (s >> 16) | (t & 0xffff0000)
501
502
503 s = (s << 4) | ((s >> 28) & 0x0f)
504 k[2*i + 1] = s & 0xffffffff
505
506 return k
507
508
509 -def _body(ks, E0, E1):
510 """Use the key schedule ks and salt E0, E1 to create the password hash."""
511
512
513 SP0, SP1, SP2, SP3, SP4, SP5, SP6, SP7 = _SPtrans
514
515 inner = range(0, _ITERATIONS*2, 2)
516 l = r = 0
517 for j in range(25):
518 l,r = r,l
519 for i in inner:
520 t = r ^ ((r >> 16) & 0xffff)
521 u = t & E0
522 t = t & E1
523 u = u ^ (u << 16) ^ r ^ ks[i]
524 t = t ^ (t << 16) ^ r ^ ks[i+1]
525 t = ((t >> 4) & 0x0fffffff) | (t << 28)
526
527 l,r = r,(SP1[(t ) & 0x3f] ^ SP3[(t>> 8) & 0x3f] ^
528 SP5[(t>>16) & 0x3f] ^ SP7[(t>>24) & 0x3f] ^
529 SP0[(u ) & 0x3f] ^ SP2[(u>> 8) & 0x3f] ^
530 SP4[(u>>16) & 0x3f] ^ SP6[(u>>24) & 0x3f] ^ l)
531
532 l = ((l >> 1) & 0x7fffffff) | ((l & 0x1) << 31)
533 r = ((r >> 1) & 0x7fffffff) | ((r & 0x1) << 31)
534
535 r,l = _PERM_OP(r, l, 1, 0x55555555)
536 l,r = _PERM_OP(l, r, 8, 0x00ff00ff)
537 r,l = _PERM_OP(r, l, 2, 0x33333333)
538 l,r = _PERM_OP(l, r, 16, 0x0000ffff)
539 r,l = _PERM_OP(r, l, 4, 0x0f0f0f0f)
540
541 return l,r
542
543
544 -def crypt(password, salt):
545 """Generate an encrypted hash from the passed password. If the password
546 is longer than eight characters, only the first eight will be used.
547
548 The first two characters of the salt are used to modify the encryption
549 algorithm used to generate in the hash in one of 4096 different ways.
550 The characters for the salt should be upper- and lower-case letters A
551 to Z, digits 0 to 9, '.' and '/'.
552
553 The returned hash begins with the two characters of the salt, and
554 should be passed as the salt to verify the password.
555
556 Example:
557
558 >>> from fcrypt import crypt
559 >>> password = 'AlOtBsOl'
560 >>> salt = 'cE'
561 >>> hash = crypt(password, salt)
562 >>> hash
563 'cEpWz5IUCShqM'
564 >>> crypt(password, hash) == hash
565 1
566 >>> crypt('IaLaIoK', hash) == hash
567 0
568
569 In practice, you would read the password using something like the
570 getpass module, and generate the salt randomly:
571
572 >>> import random, string
573 >>> saltchars = string.letters + string.digits + './'
574 >>> salt = random.choice(saltchars) + random.choice(saltchars)
575
576 Note that other ASCII characters are accepted in the salt, but the
577 results may not be the same as other versions of crypt. In
578 particular, '_', '$1' and '$2' do not select alternative hash
579 algorithms such as the extended passwords, MD5 crypt and Blowfish
580 crypt supported by the OpenBSD C library.
581 """
582
583
584 if len(salt) == 0:
585 salt = 'AA'
586 elif len(salt) == 1:
587 salt = salt + 'A'
588 Eswap0 = _con_salt[ord(salt[0]) & 0x7f]
589 Eswap1 = _con_salt[ord(salt[1]) & 0x7f] << 4
590
591
592 ks = _set_key((password + '\0\0\0\0\0\0\0\0')[:8])
593 o1, o2 = _body(ks, Eswap0, Eswap1)
594
595
596 t1 = (o1 << 16 & 0xff0000) | (o1 & 0xff00) | (o1 >> 16 & 0xff)
597 t2 = (o1 >> 8 & 0xff0000) | (o2 << 8 & 0xff00) | (o2 >> 8 & 0xff)
598 t3 = (o2 & 0xff0000) | (o2 >> 16 & 0xff00)
599
600 r = [ t1 >> 18 & 0x3f, t1 >> 12 & 0x3f, t1 >> 6 & 0x3f, t1 & 0x3f,
601 t2 >> 18 & 0x3f, t2 >> 12 & 0x3f, t2 >> 6 & 0x3f, t2 & 0x3f,
602 t3 >> 18 & 0x3f, t3 >> 12 & 0x3f, t3 >> 6 & 0x3f ]
603
604 for i in range(len(r)):
605 r[i] = _cov_2char[r[i]]
606 return salt[:2] + string.join(r, '')
607
609 """Run doctest on fcrypt module."""
610 import doctest, fcrypt
611 return doctest.testmod(fcrypt)
612
613 if __name__ == '__main__':
614 _test()
615