³ò

a¤Dc        	   @   s¸  d  Z  d e f d „  ƒ  YZ d „  Z e e d i ƒ  ƒ Z d g d Z x" e d ƒ D] Z	 e	 e e e	 <qT Wd „  Z
 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d Z d e e d d d ƒ g Z xC e d d ƒ D]2 Z	 e e d >ƒ Z e i e e d d d ƒ ƒ q Wd „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z  d „  Z! d „  Z" d „  Z# d  „  Z$ d! „  Z% d" S(#   sD   Implementation of AES (Advanced Encryption Standard).  See FIPS 197.t   Objectc           B   s   e  Z d  „  Z RS(   c         O   s.   | |  _  x | D] } | |  i  | i <q Wd  S(   N(   t   __dict__t   __name__(   t   selft   argst   kwt   arg(    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   __init__   s    	 (   R   t
   __module__R   (    (    (    s*   /home/ping/web/passpet/darcs/server/aes.pyR       s   c         C   s   t  |  d ƒ S(   Ni   (   t   int(   t   hex(    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   unhex
   s    s  63 7c 77 7b f2 6b 6f c5 30 01 67 2b fe d7 ab 76 
                  ca 82 c9 7d fa 59 47 f0 ad d4 a2 af 9c a4 72 c0 
                  b7 fd 93 26 36 3f f7 cc 34 a5 e5 f1 71 d8 31 15 
                  04 c7 23 c3 18 96 05 9a 07 12 80 e2 eb 27 b2 75 
                  09 83 2c 1a 1b 6e 5a a0 52 3b d6 b3 29 e3 2f 84 
                  53 d1 00 ed 20 fc b1 5b 6a cb be 39 4a 4c 58 cf 
                  d0 ef aa fb 43 4d 33 85 45 f9 02 7f 50 3c 9f a8 
                  51 a3 40 8f 92 9d 38 f5 bc b6 da 21 10 ff f3 d2 
                  cd 0c 13 ec 5f 97 44 17 c4 a7 7e 3d 64 5d 19 73 
                  60 81 4f dc 22 2a 90 88 46 ee b8 14 de 5e 0b db 
                  e0 32 3a 0a 49 06 24 5c c2 d3 ac 62 91 95 e4 79 
                  e7 c8 37 6d 8d d5 4e a9 6c 56 f4 ea 65 7a ae 08 
                  ba 78 25 2e 1c a6 b4 c6 e8 dd 74 1f 4b bd 8b 8a 
                  70 3e b5 66 48 03 f6 0e 61 35 57 b9 86 c1 1d 9e 
                  e1 f8 98 11 69 d9 8e 94 9b 1e 87 e9 ce 55 28 df 
                  8c a1 89 0d bf e6 42 68 41 99 2d 0f b0 54 bb 16i    i   c         C   s   |  d S(   s   Take the low 8 bits of n.i   i   i   (    (   t   n(    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   byte$   s    c         C   s   |  d S(   s   Take the low 32 bits of n.i   i    l        (    (   R   (    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   word(   s    c         C   s4   t  |  ƒ d >t  | ƒ d >t  | ƒ d >t  | ƒ S(   s   Convert four bytes to a word.i   i   i   (   R   (   t   a0t   a1t   a2t   a3(    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   toword,   s    c         C   s8   t  |  d ?ƒ t  |  d ?ƒ t  |  d ?ƒ t  |  d ?ƒ f S(   s   Convert a word to four bytes.i   i   i   i    (   R   (   t   w(    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   tobytes0   s    c         C   sG   t  g  } t |  ƒ D]) \ } } | | t |  ƒ d | d >q ~ ƒ S(   s:   Convert a block (list of integer bytes) to a long integer.i   i   (   t   sumt	   enumeratet   len(   t   blockt   _[1]t   it   b(    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   tolong4   s    c         C   s=   g  } t  | d d d d ƒ D] } | t |  | ?ƒ q ~ S(   s:   Convert a long integer to a block (list of integer bytes).i   iøÿÿÿ(   t   rangeR   (   t   longt
   blockbytesR   t   shift(    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   toblock8   s    c         C   s2   g  } t  |  | ƒ D] \ } } | | | Aq ~ S(   N(   t   zip(   t   aR   R   t   xt   y(    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   blockxor<   s    c         C   s;   t  |  ƒ \ } } } } t t | t | t | t | ƒ S(   N(   R   R   t   S(   R   R   R   R   R   (    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   SubWord@   s    c         C   s+   t  |  ƒ \ } } } } t | | | | ƒ S(   N(   R   R   (   R   R   R   R   R   (    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   RotWordD   s    c         C   s   d } d d d	 d
 d } x' | |  j o | d >| d >} } q Wx@ | d j o2 |  | @o |  | N}  n | d ?| d ?} } qI W|  S(   s3   Reduce a polynomial modulo x^8 + x^4 + x^3 + x + 1.i   i   i   i   i    i   i   i   i   i   i   i   (    (   R   t   bitt   modulus(    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   reduceH   s    c         C   sR   d } d } x9 | |  j o+ |  | @o | | | N} n | d >} q Wt  | ƒ S(   s8   Multiply two polynomials modulo x^8 + x^4 + x^3 + x + 1.i    i   (   R-   (   R$   R   t   productR+   (    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   multT   s    i   i   c         C   sC  d g | | d } t  |  t ƒ o t t t |  ƒ ƒ }  n g  } t d d d ƒ D] } | t |  | ?ƒ qU ~ } t | |  ƒ | | *x³ t | | | d ƒ D]š } | | d }	 t | | ƒ | | }
 } | d j o t	 t
 |	 ƒ ƒ t |
 A}	 n+ | d j o | d j o t	 |	 ƒ }	 n | | | |	 A| | <q¡ W| S(   Ni    i   i   i    i   i   (   t
   isinstancet   strR   t   mapt   ordR   R   t   reversedR	   R)   R*   t   Rcon(   t   Kt   Nkt   Nbt   NrR   R   R!   t   keyR   t   tempt   iht   il(    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   KeyExpansionf   s    7 c         C   s#   g  } |  D] } | t  | q ~ S(   N(   R(   (   t   stateR   R%   (    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   SubBytes{   s    c         C   s#   g  } |  D] } | t  | q ~ S(   N(   t   InvS(   R?   R   R%   (    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   InvSubBytes~   s    c         C   sj   |  \ } } } } } } } } }	 }
 } } } } } } | | | | | |
 | | |	 | | | | | | | g S(   N(    (   t   .0R$   R   t   ct   dt   et   ft   gt   hR   t   jt   kt   lt   mR   t   ot   p(    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt	   ShiftRows   s   6c         C   sj   |  \ } } } } } } } } }	 }
 } } } } } } | | | | | | | | |	 | | | | |
 | | g S(   N(    (   RC   R$   R   RD   RE   RF   RG   RH   RI   R   RJ   RK   RL   RM   R   RN   RO   (    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   InvShiftRows„   s   6c   	      C   s²   |  \ } } } } t  | d ƒ t  | d ƒ A| A| A} | t  | d ƒ At  | d ƒ A| A} | | At  | d ƒ At  | d ƒ A} t  | d ƒ | A| At  | d ƒ A} | | | | g S(   Ni   i   (   R/   (	   RC   t   c0t   c1t   c2t   c3t   m0t   m1t   m2t   m3(    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt	   MixColumn‡   s
   $$$$c         C   sD   t  |  d d !ƒ t  |  d d !ƒ t  |  d d !ƒ t  |  d d !ƒ S(   Ni    i   i   i   i   (   RZ   (   R?   (    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt
   MixColumnsŽ   s    c   	      C   sú   |  \ } } } } t  | d ƒ t  | d ƒ At  | d ƒ At  | d ƒ A} t  | d ƒ t  | d ƒ At  | d ƒ At  | d ƒ A} t  | d ƒ t  | d ƒ At  | d ƒ At  | d ƒ A} t  | d ƒ t  | d ƒ At  | d ƒ At  | d ƒ A} | | | | f S(   Ni   i   i   i	   (   R/   (	   RC   RR   RS   RT   RU   RV   RW   RX   RY   (    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   InvMixColumn’   s
   6666c         C   sD   t  |  d d !ƒ t  |  d d !ƒ t  |  d d !ƒ t  |  d d !ƒ S(   Ni    i   i   i   i   (   R\   (   R?   (    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   InvMixColumns™   s    c         C   s7   t  |  t g  } | D] } | t | ƒ q ~ d ƒ ƒ S(   N(    (   R'   R   R   (   R?   R:   R   RK   (    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   AddRoundKey   s    c      
      sÌ   |  d j o d \ } ‰ ‰ nQ |  d j o d \ } ‰ ‰ n1 |  d j o d \ } ‰ ‰ n t  d
 |  ƒ ‚ t | | ˆ ˆ ƒ ‰  ‡  ‡ ‡ f d †  } ‡  ‡ ‡ f d †  } t | | d |  d d ˆ ƒS(   sn  Create a cipher object with a given key K.  The length of the key,
    given by 'keybits', must be 128, 192, or 256.  The key may be given as
    a long integer or a string of 16, 24, or 32 bytes.  The resulting object
    has two methods, encipher and decipher, that take a block as input and
    give a block as output, where a block is a list of 16 integer bytes.i€   i   i
   iÀ   i   i   i   i   i   s   invalid key length %dc      	      s   t  |  t ƒ o t t |  ƒ p |  } t | ˆ  ˆ  ƒ } x] t d ˆ ƒ D]L } t | ƒ } t | ƒ } t | ƒ } t | ˆ  | ˆ | d ˆ !ƒ } qI Wt | ƒ } t | ƒ } t | ˆ  ˆ ˆ ˆ d ˆ !ƒ } t  |  t ƒ o d i	 t t
 | ƒ ƒ p | S(   Ni   t    (   R0   R1   R2   R3   R^   R   R@   RP   R[   t   joint   chr(   t   inputR?   t   round(   R   R9   R8   (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   encipher²   s    & &"c            s  t  |  t ƒ o t t |  ƒ p |  } t | ˆ  ˆ ˆ ˆ d ˆ !ƒ } xd t ˆ d d d ƒ D]L } t | ƒ } t | ƒ } t | ˆ  | ˆ | d ˆ !ƒ } t | ƒ } q_ Wt | ƒ } t | ƒ } t | ˆ  ˆ  ƒ } t  |  t ƒ o d i	 t t
 | ƒ ƒ p | S(   Ni   i    iÿÿÿÿR_   (   R0   R1   R2   R3   R^   R   RQ   RB   R]   R`   Ra   (   Rb   R?   Rc   (   R   R8   R9   (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   decipher¿   s    &" "t   keybitsR    (   i   i   i
   (   i   i   i   (   i   i   i   (   t
   ValueErrorR>   R    (   Rf   R6   R7   Rd   Re   (    (   R   R9   R8   s*   /home/ping/web/passpet/darcs/server/aes.pyt   AES    s    c         C   s'   |  d } | d t  | ƒ | 7} | S(   s0   Pad a string to fit in a whole number of blocks.s   €t    (   R   (   t   dataR    t   padded(    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   padÎ   s    
c      	   C   sl   t  |  ƒ | d j o t d ƒ ‚ n g  } t d t  |  ƒ | ƒ D]! } | t t |  | | | !ƒ qD ~ S(   sB   Convert a string to a list of blocks (a block is a list of bytes).i    s   incomplete padded data(   R   Rg   R   R2   R3   (   Rk   R    R   R   (    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   toblocksÔ   s    c         C   sÈ  |  i  d j o t d ƒ ‚ n t |  i d g d ƒ ƒ } | d >} | d @o | d
 N} n | d >} | d @o | d N} n t | d ƒ t | d ƒ } } t t | ƒ d ƒ t | ƒ d d j } | d j o d } t } n t | ƒ d d j } | o& t | d ƒ } t	 | d | ƒ } n, t t
 | d ƒ d ƒ } t	 | d | ƒ } d g d }	 x: t | d ƒ D]( }
 t	 |	 | |
 ƒ } |  i | ƒ }	 qtWt	 |	 | ƒ } |  i | ƒ } t | ƒ S(   s>   Use the given cipher to compute AES-CMAC for the given string.i€   s   AES-CMAC requires 128-bit keysi    i   i   i‡   iÿÿÿÿl	                    l	                    l	   ‡                l	                    l	                    l	   ‡                (   Rf   Rg   R   Rd   R"   R	   R   t   FalseRm   R'   Rl   R   (   t   cipherRj   t   Lt   K1t   K2R   t   flagt   blockst   M_lastt   XR   t   Yt   T(    (    s*   /home/ping/web/passpet/darcs/server/aes.pyt   macÜ   s8    

*
 N(&   t   __doc__t   objectR    R   R2   t   splitR(   RA   R   R   R   R   R   R   R   R"   R'   R)   R*   R-   R/   R%   R5   t   appendR>   R@   RB   RP   RQ   RZ   R[   R\   R]   R^   Rh   Rl   Rm   Ry   (    (    (    s*   /home/ping/web/passpet/darcs/server/aes.pys   <module>   sN   	 											  											.		
