1. class EncodePasswd(object): 
  2.     def __init__(self, passwd=None, verifycode=None): 
  3.         self.passwd = passwd 
  4.         self.verifycode = verifycode 
  5.         self.hexcase = 1 
  6.         self.b64pad = '' 
  7.         self.chrsz = 8 
  8.         self.mode = 32 
  9.  
  10.     def str2binl(self, D): 
  11.         C = [] 
  12.         A = (1<<self.chrsz) - 1 
  13.         for B in range(0, len(D)*self.chrsz, self.chrsz): 
  14.             if len(C) == (B>>5): C.append(0
  15.             C[B>>5] |= (ord(D[B/self.chrsz])&A)<<(B%32
  16.         return C 
  17.  
  18.     def binl2hex(self, C): 
  19.         B = "0123456789abcdef" 
  20.         if self.hexcase:  
  21.             B = "0123456789ABCDEF" 
  22.         D = '' 
  23.         for A in range(0, len(C)*41): 
  24.             D += B[(C[A>>2]>>((A%4)*8+4))&15] + B[(C[A>>2]>>((A%4)*8))&15
  25.         return D 
  26.          
  27.     def md5(self, A): 
  28.         return self.hex_md5(A) 
  29.  
  30.     def hex_md5(self, A):  
  31.         return self.binl2hex(self.core_md5(self.str2binl(A), len(A)*self.chrsz)) 
  32.      
  33.     def str_md5(self, A): 
  34.         return self.binl2str(self.core_md5(self.str2binl(A), len(A)*self.chrsz)) 
  35.      
  36.     def hex_hmac_md5(self, A, B): 
  37.         return self.binl2hex(self.core_hmac_md5(A, B)) 
  38.          
  39.     def b64_hmac_md5(self, A, B): 
  40.         return binl2b64(core_hmac_md5(A, B)) 
  41.      
  42.     def str_hmac_md5(self, A, B): 
  43.         return self.binl2str(self.core_hmac_md5(A, B)) 
  44.         
  45.     def md5_vm_test(self): 
  46.         return self.hex_md5('abc') == '900150983cd24fb0d6963f7d28e17f72' 
  47.      
  48.     # this is equvalent of >>> in js 
  49.     def rsl(self, A, B): 
  50.         return (A & 0xFFFFFFFFL) >> B 
  51.      
  52.     def jsArraySet(self, list, index, value): 
  53.         if index < 0return 
  54.         if len(list) > index: 
  55.             list[index] = value 
  56.         else
  57.             for i in range(index-len(list)): 
  58.                 list.append(0
  59.             list.append(value) 
  60.     def jsArrayGet(self, list, index): 
  61.         if len(list) > index: 
  62.             return list[index] 
  63.         else
  64.             return 0 
  65.      
  66.     def core_md5(self, K, F): 
  67.         #K[F>>5] |= 128<<((F)%32) 
  68.         self.jsArraySet(K, F>>5self.jsArrayGet(K, F>>5)|(128<<(F%32))) 
  69.         #K[(self.rsl(F+64, 9)<<4)+14] = F 
  70.         self.jsArraySet(K, (self.rsl(F+649)<<4)+14, F) 
  71.         J=1732584193
  72.         I=-271733879
  73.         H=-1732584194
  74.         G=271733878
  75.          
  76.         for C in range(0, len(K), 16): 
  77.             E=J; 
  78.             D=I; 
  79.             B=H; 
  80.             A=G; 
  81.             J=self.md5_ff(J,I,H,G,self.jsArrayGet(K, C+0),7,-680876936); 
  82.             G=self.md5_ff(G,J,I,H,self.jsArrayGet(K, C+1),12,-389564586); 
  83.             H=self.md5_ff(H,G,J,I,self.jsArrayGet(K, C+2),17,606105819); 
  84.             I=self.md5_ff(I,H,G,J,self.jsArrayGet(K, C+3),22,-1044525330); 
  85.             J=self.md5_ff(J,I,H,G,self.jsArrayGet(K, C+4),7,-176418897); 
  86.             G=self.md5_ff(G,J,I,H,self.jsArrayGet(K, C+5),12,1200080426); 
  87.             H=self.md5_ff(H,G,J,I,self.jsArrayGet(K, C+6),17,-1473231341); 
  88.             I=self.md5_ff(I,H,G,J,self.jsArrayGet(K, C+7),22,-45705983); 
  89.             J=self.md5_ff(J,I,H,G,self.jsArrayGet(K, C+8),7,1770035416); 
  90.             G=self.md5_ff(G,J,I,H,self.jsArrayGet(K, C+9),12,-1958414417); 
  91.             H=self.md5_ff(H,G,J,I,self.jsArrayGet(K, C+10),17,-42063); 
  92.             I=self.md5_ff(I,H,G,J,self.jsArrayGet(K, C+11),22,-1990404162); 
  93.             J=self.md5_ff(J,I,H,G,self.jsArrayGet(K, C+12),7,1804603682); 
  94.             G=self.md5_ff(G,J,I,H,self.jsArrayGet(K, C+13),12,-40341101); 
  95.             H=self.md5_ff(H,G,J,I,self.jsArrayGet(K, C+14),17,-1502002290); 
  96.             I=self.md5_ff(I,H,G,J,self.jsArrayGet(K, C+15),22,1236535329); 
  97.             J=self.md5_gg(J,I,H,G,self.jsArrayGet(K, C+1),5,-165796510); 
  98.             G=self.md5_gg(G,J,I,H,self.jsArrayGet(K, C+6),9,-1069501632); 
  99.             H=self.md5_gg(H,G,J,I,self.jsArrayGet(K, C+11),14,643717713); 
  100.             I=self.md5_gg(I,H,G,J,self.jsArrayGet(K, C+0),20,-373897302); 
  101.             J=self.md5_gg(J,I,H,G,self.jsArrayGet(K, C+5),5,-701558691); 
  102.             G=self.md5_gg(G,J,I,H,self.jsArrayGet(K, C+10),9,38016083); 
  103.             H=self.md5_gg(H,G,J,I,self.jsArrayGet(K, C+15),14,-660478335); 
  104.             I=self.md5_gg(I,H,G,J,self.jsArrayGet(K, C+4),20,-405537848); 
  105.             J=self.md5_gg(J,I,H,G,self.jsArrayGet(K, C+9),5,568446438); 
  106.             G=self.md5_gg(G,J,I,H,self.jsArrayGet(K, C+14),9,-1019803690); 
  107.             H=self.md5_gg(H,G,J,I,self.jsArrayGet(K, C+3),14,-187363961); 
  108.             I=self.md5_gg(I,H,G,J,self.jsArrayGet(K, C+8),20,1163531501); 
  109.             J=self.md5_gg(J,I,H,G,self.jsArrayGet(K, C+13),5,-1444681467); 
  110.             G=self.md5_gg(G,J,I,H,self.jsArrayGet(K, C+2),9,-51403784); 
  111.             H=self.md5_gg(H,G,J,I,self.jsArrayGet(K, C+7),14,1735328473); 
  112.             I=self.md5_gg(I,H,G,J,self.jsArrayGet(K, C+12),20,-1926607734); 
  113.             J=self.md5_hh(J,I,H,G,self.jsArrayGet(K, C+5),4,-378558); 
  114.             G=self.md5_hh(G,J,I,H,self.jsArrayGet(K, C+8),11,-2022574463); 
  115.             H=self.md5_hh(H,G,J,I,self.jsArrayGet(K, C+11),16,1839030562); 
  116.             I=self.md5_hh(I,H,G,J,self.jsArrayGet(K, C+14),23,-35309556); 
  117.             J=self.md5_hh(J,I,H,G,self.jsArrayGet(K, C+1),4,-1530992060); 
  118.             G=self.md5_hh(G,J,I,H,self.jsArrayGet(K, C+4),11,1272893353); 
  119.             H=self.md5_hh(H,G,J,I,self.jsArrayGet(K, C+7),16,-155497632); 
  120.             I=self.md5_hh(I,H,G,J,self.jsArrayGet(K, C+10),23,-1094730640); 
  121.             J=self.md5_hh(J,I,H,G,self.jsArrayGet(K, C+13),4,681279174); 
  122.             G=self.md5_hh(G,J,I,H,self.jsArrayGet(K, C+0),11,-358537222); 
  123.             H=self.md5_hh(H,G,J,I,self.jsArrayGet(K, C+3),16,-722521979); 
  124.             I=self.md5_hh(I,H,G,J,self.jsArrayGet(K, C+6),23,76029189); 
  125.             J=self.md5_hh(J,I,H,G,self.jsArrayGet(K, C+9),4,-640364487); 
  126.             G=self.md5_hh(G,J,I,H,self.jsArrayGet(K, C+12),11,-421815835); 
  127.             H=self.md5_hh(H,G,J,I,self.jsArrayGet(K, C+15),16,530742520); 
  128.             I=self.md5_hh(I,H,G,J,self.jsArrayGet(K, C+2),23,-995338651); 
  129.             J=self.md5_ii(J,I,H,G,self.jsArrayGet(K, C+0),6,-198630844); 
  130.             G=self.md5_ii(G,J,I,H,self.jsArrayGet(K, C+7),10,1126891415); 
  131.             H=self.md5_ii(H,G,J,I,self.jsArrayGet(K, C+14),15,-1416354905); 
  132.             I=self.md5_ii(I,H,G,J,self.jsArrayGet(K, C+5),21,-57434055); 
  133.             J=self.md5_ii(J,I,H,G,self.jsArrayGet(K, C+12),6,1700485571); 
  134.             G=self.md5_ii(G,J,I,H,self.jsArrayGet(K, C+3),10,-1894986606); 
  135.             H=self.md5_ii(H,G,J,I,self.jsArrayGet(K, C+10),15,-1051523); 
  136.             I=self.md5_ii(I,H,G,J,self.jsArrayGet(K, C+1),21,-2054922799); 
  137.             J=self.md5_ii(J,I,H,G,self.jsArrayGet(K, C+8),6,1873313359); 
  138.             G=self.md5_ii(G,J,I,H,self.jsArrayGet(K, C+15),10,-30611744); 
  139.             H=self.md5_ii(H,G,J,I,self.jsArrayGet(K, C+6),15,-1560198380); 
  140.             I=self.md5_ii(I,H,G,J,self.jsArrayGet(K, C+13),21,1309151649); 
  141.             J=self.md5_ii(J,I,H,G,self.jsArrayGet(K, C+4),6,-145523070); 
  142.             G=self.md5_ii(G,J,I,H,self.jsArrayGet(K, C+11),10,-1120210379); 
  143.             H=self.md5_ii(H,G,J,I,self.jsArrayGet(K, C+2),15,718787259); 
  144.             I=self.md5_ii(I,H,G,J,self.jsArrayGet(K, C+9),21,-343485551); 
  145.             J=self.safe_add(J,E); 
  146.             I=self.safe_add(I,D); 
  147.             H=self.safe_add(H,B); 
  148.             G=self.safe_add(G,A) 
  149.              
  150.         if self.mode == 16
  151.             return [I, H] 
  152.         else
  153.             return [J, I, H, G] 
  154.              
  155.     def md5_cmn(self, F, C, B, A, E, D): 
  156.         return self.safe_add(self.bit_rol(self.safe_add(self.safe_add(C, F), self.safe_add(A, D)), E), B) 
  157.          
  158.     def md5_ff(self, C, B,G, F,A,E,D): 
  159.         return self.md5_cmn((B&G)|((~B)&F), C, B, A, E, D) 
  160.          
  161.     def md5_gg(self, C,B,G,F,A,E,D): 
  162.         return self.md5_cmn((B&F)|(G&(~F)),C,B,A,E,D) 
  163.          
  164.     def md5_hh(self, C,B,G,F,A,E,D): 
  165.         return self.md5_cmn(B^G^F, C,B,A,E,D) 
  166.          
  167.     def md5_ii(self,C,B,G,F,A,E,D): 
  168.         return self.md5_cmn(G^(B|(~F)),C,B,A,E,D) 
  169.      
  170.     def core_hmac_md5(self, C, F): 
  171.         E = self.str2binl(C) 
  172.         if len(E) > 16
  173.             E = self.core_md5(E,len(C)*self.chrsz) 
  174.         A = [None]*16 
  175.         D = [None]*16 
  176.         for B in range(016): 
  177.             A[B] = E[B]^909522486 
  178.             D[B] = E[B]^1549556828 
  179.         G = self.core_md5(A+self.str2binl(F), 512+len(F)*self.chrsz) 
  180.         return self.core_md5(D+G, 512+128)     
  181.      
  182.     def safe_add(self, A,D): 
  183.         C = (A&65535)+(D&65535
  184.         B = (A>>16)+(D>>16)+(C>>16
  185.         return (B<<16)|(C&65535
  186.  
  187.     def bit_rol(self, A, B): 
  188.         return (A<self.rsl(A, 32-B) 
  189.          
  190.     def binl2str(self, C): 
  191.         D = '' 
  192.         A = (1<<self.chrsz)-1 
  193.         for B in range(0, len(C)*32self.chrsz): 
  194.             D += chr(self.rsl(C[B>>5], B%32)&A) 
  195.         return D 
  196.          
  197.     def binl2b64(self, D): 
  198.         C="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" 
  199.         F = '' 
  200.         for B in range(0, len(D)*43): 
  201.             E=(((D[B>>2]>>8*(B%4))&255)<<16)|(((D[B+1>>2]>>8*((B+1)%4))&255)<<8)|((D[B+2>>2]>>8*((B+2)%4))&255
  202.             for A in range(04): 
  203.                 if B*8+A*6>len(D)*32
  204.                     F += self.b64pad 
  205.                 else
  206.                     F += C[(E>>6*(3-A))&63
  207.         return F 
  208.  
  209.  
  210.     def hexchar2bin(self,str): 
  211.         arr = [] 
  212.         for i in range(0, len(str) , 2): 
  213.             arr.append("\\x" + str[i:i+2]) 
  214.         arr="".join(arr) 
  215.         exec("temp = '" + arr + "'"); 
  216.         return temp 
  217.  
  218.  
  219.  
  220.     def md5_3(self, B): 
  221.         hash = self.core_md5(self.str2binl(B), len(B)*self.chrsz) 
  222.         hash = self.core_md5(hash, 16*self.chrsz) 
  223.         hash = self.core_md5(hash, 16*self.chrsz) 
  224.         return self.binl2hex(hash)