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