Package flumotion :: Package extern :: Module unixcrypt
[hide private]

Source Code for Module flumotion.extern.unixcrypt

  1  # drop in replacement for the C "crypt" module. 
  2  # (c)2000 Michal J Wallace (sabren@manifestation.com) 
  3  # made available to one and all under the python license. 
  4  # 
  5  # Based on perl code by Martin Vorlaender, martin@radiogaga.harz.de, 
  6  # 11-DEC-1997. 
  7  # which was based upon Java source code written by jdumas@zgs.com, 
  8  # which was based upon C source code written by Eric Young, eay@psych.uq.oz.au. 
  9  # 
 10  #################################################3 
 11   
 12  """ this module supposedly emulates the unix crypt() routine. 
 13   
 14  don't ask me how it works, because I have no clue. I just 
 15  ported Crypt::UnixCrypt from perl into python.. :) 
 16   
 17  encryptedtext = crypt(plaintext, salt) 
 18   
 19  NOTE: supposedly, it doesn't work the same way unix does 
 20  when salt is not in [A-Za-z0-9./]{2} 
 21   
 22  0423.2000: I CAN't get this working. I'm going to try 
 23  porting Crypt::PasswdMD5... 
 24  """ 
 25   
 26  ITERATIONS = 16 
 27   
 28  con_salt = ( 
 29      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 30      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 31      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 32      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 33      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 34      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
 35      0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 
 36      0x0A, 0x0B, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 
 37      0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 
 38      0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 
 39      0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 
 40      0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24, 
 41      0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 
 42      0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 
 43      0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 
 44      0x3D, 0x3E, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, ) 
 45   
 46  shifts2 = ( 
 47      0, 0, 1, 1, 1, 1, 1, 1, 
 48      0, 1, 1, 1, 1, 1, 1, 0, ) 
 49   
 50  skb0 = ( 
 51      # for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 
 52      0x00000000, 0x00000010, 0x20000000, 0x20000010, 
 53      0x00010000, 0x00010010, 0x20010000, 0x20010010, 
 54      0x00000800, 0x00000810, 0x20000800, 0x20000810, 
 55      0x00010800, 0x00010810, 0x20010800, 0x20010810, 
 56      0x00000020, 0x00000030, 0x20000020, 0x20000030, 
 57      0x00010020, 0x00010030, 0x20010020, 0x20010030, 
 58      0x00000820, 0x00000830, 0x20000820, 0x20000830, 
 59      0x00010820, 0x00010830, 0x20010820, 0x20010830, 
 60      0x00080000, 0x00080010, 0x20080000, 0x20080010, 
 61      0x00090000, 0x00090010, 0x20090000, 0x20090010, 
 62      0x00080800, 0x00080810, 0x20080800, 0x20080810, 
 63      0x00090800, 0x00090810, 0x20090800, 0x20090810, 
 64      0x00080020, 0x00080030, 0x20080020, 0x20080030, 
 65      0x00090020, 0x00090030, 0x20090020, 0x20090030, 
 66      0x00080820, 0x00080830, 0x20080820, 0x20080830, 
 67      0x00090820, 0x00090830, 0x20090820, 0x20090830, ) 
 68   
 69  skb1 = ( 
 70      # for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 
 71      0x00000000, 0x02000000, 0x00002000, 0x02002000, 
 72      0x00200000, 0x02200000, 0x00202000, 0x02202000, 
 73      0x00000004, 0x02000004, 0x00002004, 0x02002004, 
 74      0x00200004, 0x02200004, 0x00202004, 0x02202004, 
 75      0x00000400, 0x02000400, 0x00002400, 0x02002400, 
 76      0x00200400, 0x02200400, 0x00202400, 0x02202400, 
 77      0x00000404, 0x02000404, 0x00002404, 0x02002404, 
 78      0x00200404, 0x02200404, 0x00202404, 0x02202404, 
 79      0x10000000, 0x12000000, 0x10002000, 0x12002000, 
 80      0x10200000, 0x12200000, 0x10202000, 0x12202000, 
 81      0x10000004, 0x12000004, 0x10002004, 0x12002004, 
 82      0x10200004, 0x12200004, 0x10202004, 0x12202004, 
 83      0x10000400, 0x12000400, 0x10002400, 0x12002400, 
 84      0x10200400, 0x12200400, 0x10202400, 0x12202400, 
 85      0x10000404, 0x12000404, 0x10002404, 0x12002404, 
 86      0x10200404, 0x12200404, 0x10202404, 0x12202404, ) 
 87   
 88  skb2 = ( 
 89      # for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 
 90      0x00000000, 0x00000001, 0x00040000, 0x00040001, 
 91      0x01000000, 0x01000001, 0x01040000, 0x01040001, 
 92      0x00000002, 0x00000003, 0x00040002, 0x00040003, 
 93      0x01000002, 0x01000003, 0x01040002, 0x01040003, 
 94      0x00000200, 0x00000201, 0x00040200, 0x00040201, 
 95      0x01000200, 0x01000201, 0x01040200, 0x01040201, 
 96      0x00000202, 0x00000203, 0x00040202, 0x00040203, 
 97      0x01000202, 0x01000203, 0x01040202, 0x01040203, 
 98      0x08000000, 0x08000001, 0x08040000, 0x08040001, 
 99      0x09000000, 0x09000001, 0x09040000, 0x09040001, 
100      0x08000002, 0x08000003, 0x08040002, 0x08040003, 
101      0x09000002, 0x09000003, 0x09040002, 0x09040003, 
102      0x08000200, 0x08000201, 0x08040200, 0x08040201, 
103      0x09000200, 0x09000201, 0x09040200, 0x09040201, 
104      0x08000202, 0x08000203, 0x08040202, 0x08040203, 
105      0x09000202, 0x09000203, 0x09040202, 0x09040203, ) 
106   
107   
108   
109  skb3 = ( 
110      # for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 
111      0x00000000, 0x00100000, 0x00000100, 0x00100100, 
112      0x00000008, 0x00100008, 0x00000108, 0x00100108, 
113      0x00001000, 0x00101000, 0x00001100, 0x00101100, 
114      0x00001008, 0x00101008, 0x00001108, 0x00101108, 
115      0x04000000, 0x04100000, 0x04000100, 0x04100100, 
116      0x04000008, 0x04100008, 0x04000108, 0x04100108, 
117      0x04001000, 0x04101000, 0x04001100, 0x04101100, 
118      0x04001008, 0x04101008, 0x04001108, 0x04101108, 
119      0x00020000, 0x00120000, 0x00020100, 0x00120100, 
120      0x00020008, 0x00120008, 0x00020108, 0x00120108, 
121      0x00021000, 0x00121000, 0x00021100, 0x00121100, 
122      0x00021008, 0x00121008, 0x00021108, 0x00121108, 
123      0x04020000, 0x04120000, 0x04020100, 0x04120100, 
124      0x04020008, 0x04120008, 0x04020108, 0x04120108, 
125      0x04021000, 0x04121000, 0x04021100, 0x04121100, 
126      0x04021008, 0x04121008, 0x04021108, 0x04121108, ) 
127   
128  skb4 = ( 
129      # for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 
130      0x00000000, 0x10000000, 0x00010000, 0x10010000, 
131      0x00000004, 0x10000004, 0x00010004, 0x10010004, 
132      0x20000000, 0x30000000, 0x20010000, 0x30010000, 
133      0x20000004, 0x30000004, 0x20010004, 0x30010004, 
134      0x00100000, 0x10100000, 0x00110000, 0x10110000, 
135      0x00100004, 0x10100004, 0x00110004, 0x10110004, 
136      0x20100000, 0x30100000, 0x20110000, 0x30110000, 
137      0x20100004, 0x30100004, 0x20110004, 0x30110004, 
138      0x00001000, 0x10001000, 0x00011000, 0x10011000, 
139      0x00001004, 0x10001004, 0x00011004, 0x10011004, 
140      0x20001000, 0x30001000, 0x20011000, 0x30011000, 
141      0x20001004, 0x30001004, 0x20011004, 0x30011004, 
142      0x00101000, 0x10101000, 0x00111000, 0x10111000, 
143      0x00101004, 0x10101004, 0x00111004, 0x10111004, 
144      0x20101000, 0x30101000, 0x20111000, 0x30111000, 
145      0x20101004, 0x30101004, 0x20111004, 0x30111004, ) 
146   
147  skb5 = ( 
148      # for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 
149      0x00000000, 0x08000000, 0x00000008, 0x08000008, 
150      0x00000400, 0x08000400, 0x00000408, 0x08000408, 
151      0x00020000, 0x08020000, 0x00020008, 0x08020008, 
152      0x00020400, 0x08020400, 0x00020408, 0x08020408, 
153      0x00000001, 0x08000001, 0x00000009, 0x08000009, 
154      0x00000401, 0x08000401, 0x00000409, 0x08000409, 
155      0x00020001, 0x08020001, 0x00020009, 0x08020009, 
156      0x00020401, 0x08020401, 0x00020409, 0x08020409, 
157      0x02000000, 0x0A000000, 0x02000008, 0x0A000008, 
158      0x02000400, 0x0A000400, 0x02000408, 0x0A000408, 
159      0x02020000, 0x0A020000, 0x02020008, 0x0A020008, 
160      0x02020400, 0x0A020400, 0x02020408, 0x0A020408, 
161      0x02000001, 0x0A000001, 0x02000009, 0x0A000009, 
162      0x02000401, 0x0A000401, 0x02000409, 0x0A000409, 
163      0x02020001, 0x0A020001, 0x02020009, 0x0A020009, 
164      0x02020401, 0x0A020401, 0x02020409, 0x0A020409, ) 
165   
166   
167  skb6 = ( 
168      # for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 
169      0x00000000, 0x00000100, 0x00080000, 0x00080100, 
170      0x01000000, 0x01000100, 0x01080000, 0x01080100, 
171      0x00000010, 0x00000110, 0x00080010, 0x00080110, 
172      0x01000010, 0x01000110, 0x01080010, 0x01080110, 
173      0x00200000, 0x00200100, 0x00280000, 0x00280100, 
174      0x01200000, 0x01200100, 0x01280000, 0x01280100, 
175      0x00200010, 0x00200110, 0x00280010, 0x00280110, 
176      0x01200010, 0x01200110, 0x01280010, 0x01280110, 
177      0x00000200, 0x00000300, 0x00080200, 0x00080300, 
178      0x01000200, 0x01000300, 0x01080200, 0x01080300, 
179      0x00000210, 0x00000310, 0x00080210, 0x00080310, 
180      0x01000210, 0x01000310, 0x01080210, 0x01080310, 
181      0x00200200, 0x00200300, 0x00280200, 0x00280300, 
182      0x01200200, 0x01200300, 0x01280200, 0x01280300, 
183      0x00200210, 0x00200310, 0x00280210, 0x00280310, 
184      0x01200210, 0x01200310, 0x01280210, 0x01280310, ) 
185   
186   
187  skb7 = ( 
188      # for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 
189      0x00000000, 0x04000000, 0x00040000, 0x04040000, 
190      0x00000002, 0x04000002, 0x00040002, 0x04040002, 
191      0x00002000, 0x04002000, 0x00042000, 0x04042000, 
192      0x00002002, 0x04002002, 0x00042002, 0x04042002, 
193      0x00000020, 0x04000020, 0x00040020, 0x04040020, 
194      0x00000022, 0x04000022, 0x00040022, 0x04040022, 
195      0x00002020, 0x04002020, 0x00042020, 0x04042020, 
196      0x00002022, 0x04002022, 0x00042022, 0x04042022, 
197      0x00000800, 0x04000800, 0x00040800, 0x04040800, 
198      0x00000802, 0x04000802, 0x00040802, 0x04040802, 
199      0x00002800, 0x04002800, 0x00042800, 0x04042800, 
200      0x00002802, 0x04002802, 0x00042802, 0x04042802, 
201      0x00000820, 0x04000820, 0x00040820, 0x04040820, 
202      0x00000822, 0x04000822, 0x00040822, 0x04040822, 
203      0x00002820, 0x04002820, 0x00042820, 0x04042820, 
204      0x00002822, 0x04002822, 0x00042822, 0x04042822, ) 
205   
206  SPtrans0 = ( 
207      # nibble 0 
208      0x00820200, 0x00020000, 0x80800000, 0x80820200, 
209      0x00800000, 0x80020200, 0x80020000, 0x80800000, 
210      0x80020200, 0x00820200, 0x00820000, 0x80000200, 
211      0x80800200, 0x00800000, 0x00000000, 0x80020000, 
212      0x00020000, 0x80000000, 0x00800200, 0x00020200, 
213      0x80820200, 0x00820000, 0x80000200, 0x00800200, 
214      0x80000000, 0x00000200, 0x00020200, 0x80820000, 
215      0x00000200, 0x80800200, 0x80820000, 0x00000000, 
216      0x00000000, 0x80820200, 0x00800200, 0x80020000, 
217      0x00820200, 0x00020000, 0x80000200, 0x00800200, 
218      0x80820000, 0x00000200, 0x00020200, 0x80800000, 
219      0x80020200, 0x80000000, 0x80800000, 0x00820000, 
220      0x80820200, 0x00020200, 0x00820000, 0x80800200, 
221      0x00800000, 0x80000200, 0x80020000, 0x00000000, 
222      0x00020000, 0x00800000, 0x80800200, 0x00820200, 
223      0x80000000, 0x80820000, 0x00000200, 0x80020200, ) 
224   
225   
226  SPtrans1 = ( 
227      # nibble 1 
228      0x10042004, 0x00000000, 0x00042000, 0x10040000, 
229      0x10000004, 0x00002004, 0x10002000, 0x00042000, 
230      0x00002000, 0x10040004, 0x00000004, 0x10002000, 
231      0x00040004, 0x10042000, 0x10040000, 0x00000004, 
232      0x00040000, 0x10002004, 0x10040004, 0x00002000, 
233      0x00042004, 0x10000000, 0x00000000, 0x00040004, 
234      0x10002004, 0x00042004, 0x10042000, 0x10000004, 
235      0x10000000, 0x00040000, 0x00002004, 0x10042004, 
236      0x00040004, 0x10042000, 0x10002000, 0x00042004, 
237      0x10042004, 0x00040004, 0x10000004, 0x00000000, 
238      0x10000000, 0x00002004, 0x00040000, 0x10040004, 
239      0x00002000, 0x10000000, 0x00042004, 0x10002004, 
240      0x10042000, 0x00002000, 0x00000000, 0x10000004, 
241      0x00000004, 0x10042004, 0x00042000, 0x10040000, 
242      0x10040004, 0x00040000, 0x00002004, 0x10002000, 
243      0x10002004, 0x00000004, 0x10040000, 0x00042000, ) 
244   
245   
246  SPtrans2 = ( 
247      # nibble 2 
248      0x41000000, 0x01010040, 0x00000040, 0x41000040, 
249      0x40010000, 0x01000000, 0x41000040, 0x00010040, 
250      0x01000040, 0x00010000, 0x01010000, 0x40000000, 
251      0x41010040, 0x40000040, 0x40000000, 0x41010000, 
252      0x00000000, 0x40010000, 0x01010040, 0x00000040, 
253      0x40000040, 0x41010040, 0x00010000, 0x41000000, 
254      0x41010000, 0x01000040, 0x40010040, 0x01010000, 
255      0x00010040, 0x00000000, 0x01000000, 0x40010040, 
256      0x01010040, 0x00000040, 0x40000000, 0x00010000, 
257      0x40000040, 0x40010000, 0x01010000, 0x41000040, 
258      0x00000000, 0x01010040, 0x00010040, 0x41010000, 
259      0x40010000, 0x01000000, 0x41010040, 0x40000000, 
260      0x40010040, 0x41000000, 0x01000000, 0x41010040, 
261      0x00010000, 0x01000040, 0x41000040, 0x00010040, 
262      0x01000040, 0x00000000, 0x41010000, 0x40000040, 
263      0x41000000, 0x40010040, 0x00000040, 0x01010000, ) 
264   
265   
266  SPtrans3 = ( 
267      # nibble 3 
268      0x00100402, 0x04000400, 0x00000002, 0x04100402, 
269      0x00000000, 0x04100000, 0x04000402, 0x00100002, 
270      0x04100400, 0x04000002, 0x04000000, 0x00000402, 
271      0x04000002, 0x00100402, 0x00100000, 0x04000000, 
272      0x04100002, 0x00100400, 0x00000400, 0x00000002, 
273      0x00100400, 0x04000402, 0x04100000, 0x00000400, 
274      0x00000402, 0x00000000, 0x00100002, 0x04100400, 
275      0x04000400, 0x04100002, 0x04100402, 0x00100000, 
276      0x04100002, 0x00000402, 0x00100000, 0x04000002, 
277      0x00100400, 0x04000400, 0x00000002, 0x04100000, 
278      0x04000402, 0x00000000, 0x00000400, 0x00100002, 
279      0x00000000, 0x04100002, 0x04100400, 0x00000400, 
280      0x04000000, 0x04100402, 0x00100402, 0x00100000, 
281      0x04100402, 0x00000002, 0x04000400, 0x00100402, 
282      0x00100002, 0x00100400, 0x04100000, 0x04000402, 
283      0x00000402, 0x04000000, 0x04000002, 0x04100400, ) 
284   
285   
286  SPtrans4 = ( 
287      # nibble 4 
288      0x02000000, 0x00004000, 0x00000100, 0x02004108, 
289      0x02004008, 0x02000100, 0x00004108, 0x02004000, 
290      0x00004000, 0x00000008, 0x02000008, 0x00004100, 
291      0x02000108, 0x02004008, 0x02004100, 0x00000000, 
292      0x00004100, 0x02000000, 0x00004008, 0x00000108, 
293      0x02000100, 0x00004108, 0x00000000, 0x02000008, 
294      0x00000008, 0x02000108, 0x02004108, 0x00004008, 
295      0x02004000, 0x00000100, 0x00000108, 0x02004100, 
296      0x02004100, 0x02000108, 0x00004008, 0x02004000, 
297      0x00004000, 0x00000008, 0x02000008, 0x02000100, 
298      0x02000000, 0x00004100, 0x02004108, 0x00000000, 
299      0x00004108, 0x02000000, 0x00000100, 0x00004008, 
300      0x02000108, 0x00000100, 0x00000000, 0x02004108, 
301      0x02004008, 0x02004100, 0x00000108, 0x00004000, 
302      0x00004100, 0x02004008, 0x02000100, 0x00000108, 
303      0x00000008, 0x00004108, 0x02004000, 0x02000008, ) 
304   
305   
306  SPtrans5 = ( 
307      # nibble 5 
308      0x20000010, 0x00080010, 0x00000000, 0x20080800, 
309      0x00080010, 0x00000800, 0x20000810, 0x00080000, 
310      0x00000810, 0x20080810, 0x00080800, 0x20000000, 
311      0x20000800, 0x20000010, 0x20080000, 0x00080810, 
312      0x00080000, 0x20000810, 0x20080010, 0x00000000, 
313      0x00000800, 0x00000010, 0x20080800, 0x20080010, 
314      0x20080810, 0x20080000, 0x20000000, 0x00000810, 
315      0x00000010, 0x00080800, 0x00080810, 0x20000800, 
316      0x00000810, 0x20000000, 0x20000800, 0x00080810, 
317      0x20080800, 0x00080010, 0x00000000, 0x20000800, 
318      0x20000000, 0x00000800, 0x20080010, 0x00080000, 
319      0x00080010, 0x20080810, 0x00080800, 0x00000010, 
320      0x20080810, 0x00080800, 0x00080000, 0x20000810, 
321      0x20000010, 0x20080000, 0x00080810, 0x00000000, 
322      0x00000800, 0x20000010, 0x20000810, 0x20080800, 
323      0x20080000, 0x00000810, 0x00000010, 0x20080010, ) 
324   
325   
326  SPtrans6 = ( 
327      # nibble 6 
328      0x00001000, 0x00000080, 0x00400080, 0x00400001, 
329      0x00401081, 0x00001001, 0x00001080, 0x00000000, 
330      0x00400000, 0x00400081, 0x00000081, 0x00401000, 
331      0x00000001, 0x00401080, 0x00401000, 0x00000081, 
332      0x00400081, 0x00001000, 0x00001001, 0x00401081, 
333      0x00000000, 0x00400080, 0x00400001, 0x00001080, 
334      0x00401001, 0x00001081, 0x00401080, 0x00000001, 
335      0x00001081, 0x00401001, 0x00000080, 0x00400000, 
336      0x00001081, 0x00401000, 0x00401001, 0x00000081, 
337      0x00001000, 0x00000080, 0x00400000, 0x00401001, 
338      0x00400081, 0x00001081, 0x00001080, 0x00000000, 
339      0x00000080, 0x00400001, 0x00000001, 0x00400080, 
340      0x00000000, 0x00400081, 0x00400080, 0x00001080, 
341      0x00000081, 0x00001000, 0x00401081, 0x00400000, 
342      0x00401080, 0x00000001, 0x00001001, 0x00401081, 
343      0x00400001, 0x00401080, 0x00401000, 0x00001001, ) 
344   
345  SPtrans7 = ( 
346      # nibble 7 
347      0x08200020, 0x08208000, 0x00008020, 0x00000000, 
348      0x08008000, 0x00200020, 0x08200000, 0x08208020, 
349      0x00000020, 0x08000000, 0x00208000, 0x00008020, 
350      0x00208020, 0x08008020, 0x08000020, 0x08200000, 
351      0x00008000, 0x00208020, 0x00200020, 0x08008000, 
352      0x08208020, 0x08000020, 0x00000000, 0x00208000, 
353      0x08000000, 0x00200000, 0x08008020, 0x08200020, 
354      0x00200000, 0x00008000, 0x08208000, 0x00000020, 
355      0x00200000, 0x00008000, 0x08000020, 0x08208020, 
356      0x00008020, 0x08000000, 0x00000000, 0x00208000, 
357      0x08200020, 0x08008020, 0x08008000, 0x00200020, 
358      0x08208000, 0x00000020, 0x00200020, 0x08008000, 
359      0x08208020, 0x00200000, 0x08200000, 0x08000020, 
360      0x00208000, 0x00008020, 0x08008020, 0x08200000, 
361      0x00000020, 0x08208000, 0x00208020, 0x00000000, 
362      0x08000000, 0x08200020, 0x00008000, 0x00208020, ) 
363   
364   
365  cov_2char = ( 
366      0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 
367      0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 
368      0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 
369      0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 
370      0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62, 
371      0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 
372      0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 
373      0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, ) 
374   
375   
376 -def ushr(n, s):
377 """only for ints! (mimics the Java >>> operator)""" 378 379 s = s & 0x1f 380 return (n >> s) & (~0 >> s) # perl ~0 == 4294967295
381 382
383 -def toByte(value):
384 """this turns value into a shortint..""" 385 # the perl version was called toByte, but it returns signed numbers. 386 # maybe java bytes are signed? i don't remember.. 387 388 value = value & 0xff # makes it a byte 389 if (value & 0x80): 390 value = -((~value & 0xff)+1) # is this right?? perl was: 391 # $value = -((~$value & 0xff) + 1) 392 # if $value & 0x80; 393 # but perl's "~" and python's "~" 394 # don't do the 395 # same thing exactly... 396 return value
397 398
399 -def toInt(value):
400 if value & 0x80000000: 401 value = - ((~value & 0xffffffff) + 1) 402 return value
403 404
405 -def byteToUnsigned(value):
406 if value >= 0: 407 return value 408 else: 409 return value + 256
410 411
412 -def fourBytesToInt(b, offset):
413 414 value = byteToUnsigned(b[offset]) 415 value = value | (byteToUnsigned(b[offset+1]) << 8) 416 value = value | (byteToUnsigned(b[offset+2]) << 16) 417 value = value | (byteToUnsigned(b[offset+3]) << 24) 418 419 return toInt(value)
420 421
422 -def intToFourBytes(iValue, b, offset):
423 424 b[offset] = toByte(ushr(iValue, 0) & 0xff) 425 b[offset+1] = toByte(ushr(iValue, 8) & 0xff) 426 b[offset+2] = toByte(ushr(iValue, 16) & 0xff) 427 b[offset+3] = toByte(ushr(iValue, 24) & 0xff) 428 429 return None
430 431
432 -def PERM_OP(a, b, n, m, results):
433 434 t = (ushr(a, n) ^ b) & m 435 a = a ^ (t << n) # is order of operations right? 436 b = b ^ t 437 438 results[0] = toInt(a) 439 results[1] = toInt(b) 440 441 return None
442 443
444 -def HPERM_OP(a, n, m):
445 446 t = ((a << (16 - n)) ^ a) & m 447 a = a ^ t ^ ushr(t, 16 - n) 448 449 return toInt(a)
450 451
452 -def des_set_key(key):
453 454 schedule = [None] * (ITERATIONS * 2) 455 # original version of that line was: 456 # my @schedule; $#schedule = $ITERATIONS * 2 -1; 457 458 c = fourBytesToInt(key, 0) 459 d = fourBytesToInt(key, 4) 460 461 results = [None, None] 462 # my @results; $#results = 1; 463 464 PERM_OP(d, c, 4, 0x0f0f0f0f, results) 465 d = results[0] 466 c = results[1] 467 468 c = HPERM_OP(c, -2, 0xcccc0000) 469 d = HPERM_OP(d, -2, 0xcccc0000) 470 471 PERM_OP(d, c, 1, 0x55555555, results) 472 d = results[0] 473 c = results[1] 474 475 PERM_OP(c, d, 8, 0x00ff00ff, results) 476 c = results[0] 477 d = results[1] 478 479 PERM_OP(d, c, 1, 0x55555555, results) 480 d = results[0] 481 c = results[1] 482 483 d = (((d & 0x000000ff) << 16) | (d & 0x0000ff00) | 484 ushr(d & 0x00ff0000, 16) | ushr(c & 0xf0000000, 4)) 485 486 c = c & 0x0fffffff 487 488 j = 0 489 490 for i in range(ITERATIONS): 491 if (shifts2[i]): 492 c = ushr(c, 2) | (c << 26) 493 d = ushr(d, 2) | (d << 26) 494 else: 495 c = ushr(c, 1) | (c << 27) 496 d = ushr(d, 1) | (d << 27) 497 498 c = c & 0x0fffffff 499 d = d & 0x0fffffff 500 501 s = skb0[(c) & 0x3f]| \ 502 skb1[(ushr(c, 6) & 0x03) | (ushr(c, 7) & 0x3c)]| \ 503 skb2[(ushr(c, 13) & 0x0f) | (ushr(c, 14) & 0x30)]| \ 504 skb3[(ushr(c, 20) & 0x01) | (ushr(c, 21) & 0x06) | \ 505 (ushr(c, 22) & 0x38)] 506 507 t = skb4[(d) & 0x3f]| \ 508 skb5[(ushr(d, 7) & 0x03) | (ushr(d, 8) & 0x3c)]| \ 509 skb6[ushr(d, 15) & 0x3f]| \ 510 skb7[(ushr(d, 21) & 0x0f) | (ushr(d, 22) & 0x30)] 511 512 schedule[j] = ((t << 16) | 513 (s & 0x0000ffff)) & 0xffffffff 514 s = (ushr(s, 16) | (t & 0xffff0000)) 515 j = j + 1 516 517 s = (s << 4) | ushr(s, 28) 518 schedule[j] = s & 0xffffffff 519 j = j + 1 520 521 return schedule
522 523
524 -def D_ENCRYPT(L, R, S, E0, E1, s):
525 526 v = R ^ ushr(R, 16) 527 u = v & E0 528 v = v & E1 529 u = (u ^ (u << 16)) ^ R ^ s[S] 530 t = (v ^ (v << 16)) ^ R ^ s[S + 1] 531 t = ushr(t, 4) | (t << 28) 532 533 L = L ^ (SPtrans1[(t) & 0x3f] | \ 534 SPtrans3[ushr(t, 8) & 0x3f] | \ 535 SPtrans5[ushr(t, 16) & 0x3f] | \ 536 SPtrans7[ushr(t, 24) & 0x3f] | \ 537 SPtrans0[(u) & 0x3f] | \ 538 SPtrans2[ushr(u, 8) & 0x3f] | \ 539 SPtrans4[ushr(u, 16) & 0x3f] | \ 540 SPtrans6[ushr(u, 24) & 0x3f]) 541 542 return L
543 544
545 -def body(schedule, Eswap0, Eswap1):
546 547 left = 0 548 right = 0 549 t = 0 550 551 552 for j in range(25): 553 554 for i in range(0, ITERATIONS * 2, 4): 555 left = D_ENCRYPT(left, right, i, Eswap0, Eswap1, schedule) 556 right = D_ENCRYPT(right, left, i + 2, Eswap0, Eswap1, schedule) 557 558 left, right = right, left 559 560 t = right 561 562 right = ushr(left, 1) | (left << 31) 563 left = ushr(t, 1) | (t << 31) 564 565 left = left & 0xffffffff 566 right = right & 0xffffffff 567 568 results = [None, None] 569 # was: 570 # my @results; $#results = 1; 571 572 PERM_OP(right, left, 1, 0x55555555, results) 573 right = results[0] 574 left = results[1] 575 576 PERM_OP(left, right, 8, 0x00ff00ff, results) 577 left = results[0] 578 right = results[1] 579 580 PERM_OP(right, left, 2, 0x33333333, results) 581 right = results[0] 582 left = results[1] 583 584 PERM_OP(left, right, 16, 0x0000ffff, results) 585 left = results[0] 586 right = results[1] 587 588 PERM_OP(right, left, 4, 0x0f0f0f0f, results) 589 right = results[0] 590 left = results[1] 591 592 return [left, right]
593 594
595 -def crypt(plaintext, salt):
596 buffer = '' 597 598 if salt=='': 599 return buffer 600 601 if len(salt)<2: 602 salt = salt + salt 603 604 buffer = salt[:2] 605 606 Eswap0 = con_salt[ord(salt[0])] 607 Eswap1 = con_salt[ord(salt[1])] << 4 608 609 key = [0] * 8 610 611 iChar = map(lambda c: ord(c) << 1, plaintext) 612 613 for i in range(len(key)): 614 if i >= len(iChar): 615 break 616 key[i] = toByte(iChar[i]) 617 618 619 schedule = des_set_key(key) 620 out = body(schedule, Eswap0, Eswap1) 621 622 b = [None] * 9 623 624 intToFourBytes(out[0], b, 0) 625 intToFourBytes(out[1], b, 4) 626 b[8] = 0 627 628 629 y = 0 630 u = 0x80 631 632 for i in range(2, 13): 633 634 c = 0 635 for j in range(6): 636 c = c << 1 637 638 if (b[y] & u) != 0: 639 c = c | 1 640 641 u = u >> 1 642 643 if(u == 0): 644 y = y + 1 645 u = 0x80 646 647 buffer = buffer + chr(cov_2char[c]) 648 649 return buffer
650 651 652 if __name__=="__main__": 653 print crypt("cat", "hat") 654