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