a
    Y                     @   s&  d dl Z d dlZg dZdd Zdd Zdd Zd	d
 Zze W n. eyn   e	Zdd Zdd Zdd
 ZY n0 G dd de
ZG dd de
ZG dd de
ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG d d! d!eZeeeeeed"ZdS )#    N)AESAESModeOfOperationCTRAESModeOfOperationCBCAESModeOfOperationCFBAESModeOfOperationECBAESModeOfOperationOFBAESModesOfOperationCounterc                 C   s,   | d d> | d d> B | d d> B | d B S )Nr                      )wordr   r   >/home/ec2-user/.local/lib/python3.9/site-packages/pyaes/aes.py_compact_word=   s    r   c                 C   s   t dd | D S )Nc                 s   s   | ]}t |V  qd S Nord.0cr   r   r   	<genexpr>A       z#_string_to_bytes.<locals>.<genexpr>)listtextr   r   r   _string_to_bytes@   s    r   c                 C   s   d dd | D S )N c                 s   s   | ]}t |V  qd S r   )chr)r   br   r   r   r   D   r   z#_bytes_to_string.<locals>.<genexpr>)joinbinaryr   r   r   _bytes_to_stringC   s    r&   c                 C   s   | | S r   r   ar"   r   r   r   _concat_listF   s    r)   c                 C   s   t | tr| S dd | D S )Nc                 S   s   g | ]}t |qS r   r   r   r   r   r   
<listcomp>T   r   z$_string_to_bytes.<locals>.<listcomp>)
isinstancebytesr   r   r   r   r   Q   s    
c                 C   s   t | S r   r,   r$   r   r   r   r&   W   s    c                 C   s   | t | S r   r-   r'   r   r   r   r)   [   s    c                   @   s   e Zd ZdZddddZg dZg dZg dZg d	Zg d
Z	g dZ
g dZg dZg dZg dZg dZg dZg dZg dZg dZdd Zdd Zdd ZdS )r   zEncapsulates the AES block cipher.

    You generally should not need this. Use the AESModeOfOperation classes
    below instead.
         r   r
       )r   r      r   r   r2   @         6   l         M      /   ^      c         5   j         }               (   r@   |   w   {      k   o   rJ   0   r   g   +         r:   v            rG   rH   Y   G         rE               r               &   r7   ?         4            q   r9   1      r3      #      r
         r<         r5         '      u   	      ,      r6   n   Z      R   ;      rF   )      r=      S      r      r2         [   rD         9   J   L   X         rI         C   r;   3      E      r      P   <         Q      r4            8      r?         !   r               r/         _   rB   D            ~   =   d   ]      s   `      O      "   *         F               r>            2   :   r.   I      $   \            b   rK         y         7   m         N      r8   V         e   z      r      x   %   .            rA         t      K            p   >      f   H   r      r0   a   rC   W                              i                           U   (                        B   h   A      -         T         (   r   r   rD   r   rR   r7   rm   r   r  r4   r   r  r   r   rV   r   rL   r   r   rY   r  r=   r   r  rl   r  r   r   r   r   r  r   r%  rN   r  r   r   r   rt   r   r   r   r   r   r  rH   ru   r   r   r   r  r   r  r  r   r}   rW   r   r_   r   r   r   r   r   rc   r	  r   r   r  r  r
  r'  rE   rb   r   rk   r   r   r   r   r8   r   r   r   rf   r   r  r   r>   rr   r   r  r   r   r   r   r   r9   r:   r   r  r?   r   r.   rj   r   r   rw   r   rF   r   r   r   r   r  r   rX   ri   r#  r   r  r`   r   r   r   r   r   rP   r   rK   r  r   r   rS   r   r   rB   rO   r   r  r]   r   r  r   rv   r   r   r   r   r^   rC   r   rz   r   r   r   r   r~   r  r   r\   ro   r   rp   r  r   rJ   r  rQ   re   r   r0   r   r
   r   r6   r   r   r   r   rA   r   r   r2   r<   r   rd   rU   r   r   r   r   r   r   r   r   r   rx   rs   rq   r   ry   r   r[   r|   r5   r   r   r   r   r   r   r   r   r   r  r"  rn   r   r   rg   rZ   ra   rI   r   r   r   r;   r   r   r   r$  r   r{   r&  r   r   r   r!  r  r   rT   r3   r   r   rM   r   rh   r  r  r   r@   r  r   r/   rG   (   l   c l   |p l   w\ l   {l l   r l   k, l   o< l   TE# iP00`il   g i}++Vl   ~O l   bWk i櫫Ml   vX l   EJ il   @I l   }t l   z_ l   Yd l   G l   pw i쭭Al   gTg i_i꯯Ei#iSl   rH l   [@7 i·ul   }C i=ij&&LiZ66liA??~l   wk l   OL i\44hiQl   4e# l   qs l   qD l   sXW iS11bi?*il   RG+ ie##Fl   ^C; i(0i7i
i/i	i6$il   =b? l   &k ii''NiͲl   uT i		iit,,Xi.4i-6l   n8 l   Zh i[l   RH iM;;vl   aVo iγ}i{))Rl   >c; iq//^il   SL l   hQs r   l   ,m i`  @l   |G iȱyl   [l l   j( l   FK iپgiK99rl   J( l   L0 l   X` l   JO l   kPw l   *o i媪Ol   {[ l   C l   M4 iU33fil   E l   yS il   | l   P@ iD<<xi%i㨨Kl   QD i]l   @  ii?i!iH88pl   uc i߼ciwl   uZ_ ic!!Bi0 l   K l   s{ l   mR l   LM ii5&l   /l l   _| i5l   D i9.l   WD' iUl   ~x iG==zl   d l   ]t i+2l   sL l   `  il   O< l   \G if""Di~**Ti;il   F l   )n iӸki<(l   y^O l   ^x il   v[[ l   ;`7 iV22diN::ti

l   I$ i
il$$Hl   \p l   ]B? l   nS{ iשּׁCl   b i9i1l   7d' l   yd l   2g+ l   CH iY77nl   m4 il   dUc l   N8 i੩Il   l0 l   VX l   tg l   %j l   e l   zh i鮮Giiպol   x` io%%Jir..\i$8iWiǴsl   QF/ l   #h l   |]C l   tP i!>l   K, iܽaiil   p@ iB>>|iĵql   f l   H  il   vo il   a i_55jl   W\ iйiil   XA3 i':i'l   8a3 l   xW i+i3"l   i$ l   pYS ii3i-i"<il    i l   IN l   UT ix((Pl   z_K iiYi	iiڿel   1f/ l   B l   h  l   A i)iw--Zii˰{l   TP iֻmi:,(   l   ccK l   ||	 l   ww3 l   {{ il   kk{ l   ooc iőTi00`Pil   ggS i++V}ii׵bl   +L l   vv5 iʏEl   ?: iɉ@l   }} il   YYdW l   GG il   -X iԳgl   "z l   /T l   G~ l   $n l   rr- i[l   7 il   {\ i&&Lji66lZi??~AiĩOi44h\l   %h i4il   qq' iثsi11bSi*?iiǕRi##FeiÝ^i0(l   oB i
l   _j i	i$6l    76 i=i&i''Nil   2 l   uu? i		l   ;< i,,Xti4.i6-l   nne l   ZZh] l    v l   RRHm i;;vMiַal   3 i))R{i>i//^ql   '. l   SSLk iѹhr   i,i  @`il   1 l   [[l[ l   jj} iˍFl   >2 i99rKl   JJ(= l   LL0) l   XX`Q iυJiлki*l   *J il   CC l   MM4/ i33fUl   #( l   EE iil    l   PP@a i<<xDl   Kt l   (F l   QQDg l   #| l   @@  l    l   Z l   Cx i88pHil   <> l   6 iگui!!Bci 0iiiҿmíLii&5i/l   __|C l   kD l   DD i.9iēWl   'd l   ~~ i==zGl   ddY l   ]]tO i2+l   ss+ l   ``A l   30 l   OO<# iܣi""Dfi**T~l   wV l    l   FF i)l   8& i(<iާyl   ^^xE iiۭvi;i22dVi::tNi

l   II$7 i
i$$Hll   \\pI i]iӽnl   ,^ l   bbM l   sP l   cH i7l   yy i2iȋCi77nYl   mmo l    iձdl   NN8% l   )@ l   lli l   VVXu ii%l   ee_ l   zz l   .R il   :* l   xx i%%Joi..\ri8$l   &b l   4 iƗQi#iݡ|l   tt9 i>!l   KK,; l   =8 l    l   

 l   pp! i>>|Bl   5 l   ffU l   HH 1 iiil   aaG i55j_l   WW\s l   9  l   /" iXi:'l   Or i8il   Wf i"3l   iiw i٩pl    l   gN l   [l i<"l   +$ i i·Il   UUT i((Pxiߥzl    l   !p l   	  il   ?4 i1l   BB l   hhq l   AA l   S` i--Zwil   0 l   TTPy l   ;, i,:(   icƥci||iwwi{{l   d ikֽkioޱol   
 i0`P0iigΩgi+V}+l   g3| l   5. l   MW ivvl    l   : l   	 i}}l   o+t iYYiGGl   {` l   A[ l   3( l   _E l   E_ l   #~9 l   SI irrl     l   uo l   a9z l   =\' i&Lj&i6lZ6i?~A?l   un l    i4h\4l   QK l   QiJ l   yb iqql   +0 i1bS1i*?il    i#Fe#l    i0(l   7B- i
l   /j5 i	i$6l   6 l   _{D l   MMV i'Ni'l   e iuui		l   < i,Xt,i4.i6-inܲniZZl   [A iRRi;vM;l   7, l   }g i)R{)l   ]}F i/^q/l   .	 iSSl   9" r   l   AYZ i @` l   c?x l   yc i[[ijԾjl    l   g} i9rK9iJJiLLiXXl    l   ;  l   EU^ l   OU l   m-v iCCiMMi3fU3l   ( iEEl   i!r iiiPPi<xD<l   %t? l   KQ iQQl   ]G i@@l    l   ?Z% l   !x; i8pH8l   q	j l   cy l   wm l   /4 i!Bc!i 0l   e5~ l   }f l   ?$ l    ii&5l   C_X i__l   5D/ iDDi.9l    l   UO i~~i=zG=idȬdi]]i2+issi``l   0 iOOl   #8 i"Df"i*T~*l   ;V! l    iFFl   GS\ l   kq i(<l   '< i^^il   -6 l   [w@ i2dV2i:tN:i

iIIi
i$Hl$i\\l    l   =& l   CY ibĦbl   9P# l   1H+ l   SoH iyyl   UeN l    i7nY7imڷml    l   1* iNNl   IS ilشliVVl   sh l   OKT ieʯeizzl   G] il   ou ixxi%Jo%i.\r.i8$l   WM l   si l    l   KGP l   !: itti>!iKKl   a{ l    l   
 ippi>|B>l   qk if̪fiHHil   wl iia£ai5j_5iWWl   is l   " l    i:'l   'r= l   YqB l   k'p l   +f1 i"3iiһil   )2 l    l   3N) l   -l7 i<"l   $ l   IAR l    iUUi(Px(l   %> l    l   YC l   	  il   e l   WcL iBBihиhiAAl   )`3 i-Zw-il   {a iTTl   mw i,:(   iƥcci||iwwi{{l   e iֽkkiޱool   T i`P00iiΩggiV}++l   } l   b/ l   MfWW ivvl   E l    l   @ i}}l   u iYYiGGl   a l   Al[[ l   g) l   _}EE l   Ej__ l   #?99 l   SwII irrl   [ l   uBoo l   { l   =.'' iLj&&ilZ66i~A??l   o l   O ih\44l   QtKK l   4K l   c iqql   s1 ibS11i*?il   R iFe##l   ^ i0(l   7!-- i
l   /555 i	i$6l    l   =E l   &W iNi''l   Mee iuui		l    iXt,,i4.i6-iܲnniZZl   [{AA iRRivM;;l   a- l   }Ngg iR{))l   >G i^q//l   		 iSSl   h# r   l   ,[ i@`  l   y l   yHcc i[[iԾjjl   F l   gY}} irK99iJJiLLiXXl   J l   k! l   *_ l   OeUU l   w iCCiMMifU33l    iEEl   s iiiPPixD<<l   %:?? l   KcQQ iQQl   ]~GG i@@l   
 l   ?-%% l   !<;; ipH88l   k l   c_yy l   wAmm l   u5 iBc!!i 0l    l   g l   m% l   L ii&5l   /Y i__l   5"// iDDi.9l   W	 l   UrOO i~~izG==iȬddi]]i2+issi``l    iOOl   9 iDf""iT~**l   ;+!! l    iFFl   )] l   kSqq i(<l   y= i^^il   v7 l   ;A idV22itN::i

iIIi
iHl$$i\\l   ] l   n' l   CoYY iĦbbl   9(## l   1$++ l   7I iyyl   2O l   C inY77iڷmml    l   d+ iNNl   I`SS iشlliVVl   i l   %U iʯeeizzl   Gi]] il   oUuu ixxiJo%%i\r..i8$l   WqMM l   sGii l   Q l   #Q l   |; itti>!iKKl   a\{{ l    l    ippi|B>>l   qDkk i̪ffiHHil   m ii£aaij_55iWWl   iPss l    l   X i:'l   '9== l   8C l   q l   +311 i"3iһiil   p3 l   	 l   3')) l   -677 i<"l    l    S l   I iUUiPx((l   z? l    l   YxCC l   	  il   eZ l   1M iBBiиhhiAAl   )033 iZw--il   {Kaa iTTl   mVww i,:(   PQSeA~ä^':k;E   XY KU0    mZ    v    %Lj O   KU
 D5&   #j    IZb= g%E]   u^    p     k_镜   z~    Y*    -}) !tX)iI   DH ju   xyi    k>2 q'   O}    -a    f,A :}Jc   14J    `3. ESb   wb    .v     }    +r XhHp   }    l) {R   #SV Kr   W?F *Uf   (e µ/   {    n& (0鲥#j   \-Z    +    4N    rf iNeվ   bh"    ~M	 S.4   UE 2   ukI 9`@q^   Qz !>   =-    |: FM   " ]qoP`$   i{-    C wg   Ba 鈋   8[2N y   G
B B|   q r   郆	H+2pNrZl   z V8ծ='9-6d
!\h   T6 :.6$g
   g&    i 鞑   OE  aiKwZ   
:'E    *@ C"<	   Ge 鹨-ȩW   L^    ]3]    `F    &n r\;fD4~[   v)    FG    h|m    cqq    \c. cB@"    	    }$
    =v%    2]    m!S K/   0d9 Rwl+   9R H"dG   Q    ?A ,}V3"   N    Qq2    "    61    M    (^J    &o5 餿?:,xP_jbF~T   m    8! ^9.   /     > |i-o   J    ;Y }   nc8Q    {;w6    	xL Yn   75Y        en*M    ~fU ϼ!   h+^    u 6oJ   	>U |)鯲11#?*   0K f57Nt   Jy    P!A ا3   J	b AP/MvMC   TMT    ,I    5= jL   X QeF   j: ]5   stu    .Av    Zf    RR%    3V R Gm   a5 z7Y   <&V    'R    5In    e9B <Gz   Y_9 ?sUy7sS[_   oz> Dx   s_    >Dr ,4$8   _@F r   %y I<(   A~ q9޳   di1 Vda{   p6e* t\lH   BWp! (   QPeA~S   4    ^'t,    k+w    E?b    XzYW    c& 0 U   mvZm    vL# L%   ex    */    D5L     bj ZI%g   j0    ~B u/L   FG    S    _N    +*    zm~W    YR*5 郾-   !t& iI)ɎDujyx>Xk   q9O:    Oa}m 魈 f   :Nh Jc   1 3Q`SbE   wdbA    kv	 頁   +) hHpXE   l^)    {n s#   KD WUf*(µ/   {E5    7K    (`d    ?Gd    jt \ϊ+   yN%    a    iB    Z    * b4   &    S.h:    UsEA 2u9   `T q^nQ   !|r ݖ=   >] MF   T"k ]qo   P~ $   =/    C@ gw   Bha{    	 [8   H6 
|G   BR     r        +2H   p<X rZlN   w 8Vծ=9-6'
d\h!   T[6# .6$:   g
b W   ni%    7< O    \D KwZi麓
   * K "<C	   [    6[r    (    q
 uL   w    `F{    &?    rx    ;f
 ~[4)Cv   #9 hc   1 cB"@Ƅ $J}   =;q 2)m/K   02g    RX    A  +l   pR3    H#t dG"   |Q	 ?   ,}0    3D^    NI    8    J} Ԙ6   uM z(鎷&   -H    :XH xP   _6 F~Tb       X!Q 9.^   Ck    ]>} i|   -UR    %g 陬;   } N cn;{x&	   Yh 鷚   OQ ne~ϼ!   M    gu3    6o    	)    |0S,    $c^ #?*1锥0   f"k  Nt7   M    a ا3J   ln P/   M CMMT   ?    Q=G jL   ,q QeF^5]tsA.gZےRV3Gm   aW5 7z   x    <    ')] a5   [ Gz<ҜYsU?y   7G~    wT _[o=   D    / h>4$8,@_r%   I<P A9q   <    49    V  {a2p\lHtWB(      QN A~Se   I ':^;kEXK   0 t vm̈v%L   O/    *E 5&D   b5G IZ%gE   ] /u   L%`    FG/    ks _   *9 mzRY   T[ tX!I)i       u xyXk>'qᾶO   p/Z     IX }:cJ1Q`3SbEdw   k;	]    ~9@ +HpXh   E3z ޔl   {Rnq    s+G& Kr   c    UfTV (   / ņ{7ӥ   (0    #dK j   m ϊ+   y'%i    se    iNBE    ei    } 4b   D} .4SU   dB    $V    rX    `@T_    q^> nQ   !> ݖ=>ݮ   Mz    Tk q]   ( P`   Hv    V/S @C   g< 谽B    8[   y] |G
B|r      	    +2Z pZlNr   } V8   =<* -6'9   
2    \hBL [T6$:.
g   WN    4-    <#     
 a wZiK   bt *   "<@ 	   r[    -rQ    S WuL   nw; `&   r\xk fD;[4~Cv)   #K    6x    8b    1W9    cB 
 @"Ƅ J}$=2   )GB K/0R   wG +l   p)3s HG"d   ( ?}V,   3"! IN   8Y#    E Ԙ6   &    z%Q<    ZM    ?H    :,;    xP$    _j6 ~TbF   q    9.n    _    ]}    i& o-%ϳ   Hw2 }nc   ;[v &	xYn   ln    OQ5 en   *L    !    oQ    :7 oJ6	)|   1^e ?*1#   Fa( 5f   Ntnx    |M    `a!    3*0    q0    A5 P   ^l    Mv-    C` TM   k    jL6 ,eFQ   ^	T ]5st.AgZ   $ 3VmGךa7zY<'   a7k    aK    Gzxb    > U?s    s7   S    _T =o   Dx7    Jg    h9} $8,4_@    %<(I   * 9q   g    X9I    Vd     {    2Ul lHt\BW(      QPNi ~SeAä:^'   ;KV    q:    +t    KF  U0mv    %L   O|K *&D5鵏b   Ib    %g6t    ET    ]a} u/L鍣F   kF'    g    9% zmYR   -} X!t   I)@    D    uj    x k>X   ']r    6B    Z f    }4u    c> 1`3QbESwd黄k   @ +pXhHE   < R{#srKWf*U   PV    /k    
 ӥ70(   #2K j\   +8 駒yNi   eM5 վb4   
M 4S.    f    2    um    9 @`^qQn>!   =: ݮ>   MFzM 鑵T   q o`P   $1    { C@   gw<3    =P     8[   y[ G
||B   I= r      	 2H+plNrZ   Vp
    =] 6'9-
dh!\T[$:.6g
W   R-]    #7    O    a"A8 ZiKw   
t'    eU@ <C"	   -    -9Qm ȩ   W3b Lu   ;3 `&\rD;f   [4v v)C#   h[    cI 1Bc   @D.     " }$J   x{v    dr m)   K^<    sad    l    wP    +l,f 驙p   z(    G"R    Dy    ~` V,}"3NI8   ~E    6(    Ok (z   &o    ?$[ ,:Pxj_TbF~   B'    hq1 .^9   u_ 韾]   i|&!    o)[* ϳ%   ;2Y }   n8 {;	x&nY   n5 部O   e*    ~    !y    Y7O J6o   T>    )V`    1/eI *1#?   0(K    5@D t7N   &    0!    3O J   AwY        /# vM   CM`_    TT    _	,    ck# Lj,FQe^   ]j    s .AZg   R7 3V   m,    .    7zB    Y)p <   nOR 5az<G   Y%    U?d y   s?o    Sjo    _[T{ o=xD   _ >h8,4$   _F r   JD (I<A   9qP ޳   i dV   {a p2Ht\l   Bp (   r   r  r  r  r  r  r  r  rX  r)  r  rS  r%  r  r  r  r  r  r  r  r!  r  ro  r  r  r  r  r  r  r  r  r  r  r$  r  rN  r^  rg  r  r  r\  r  r  r  r  r  rY  r=  r,  r  rK  r  r@  r  r-  r  r/  r:  r  r	  r  rO  r  r  r1  r  rT  rB  rC  r  r  r  rz  rc  r  r  rQ  r
  rW  r  r{  r  r(  r  rH  r#  r  r  r  r  r  ra  rr  rt  r  r  r  r  r  r"  rk  ru  r[  r  rm  r   r*  r  rx  rd  r  r  ry  r  rh  r  r  r  r`  r  r  r  r  rI  r8  r&  r  r  r  r4  r;  r  r  r  rl  r?  r  r  r  re  r  r  rA  r  r  r  rw  r  rJ  rR  r  r  rn  r  r  r<  r  r  r3  r  r  rZ  rb  r2  rq  r.  rL  r  r  r  r  r  r  r  r  r  r  r  r_  r  r  r  rv  r  r  r~  r  r  r  r  r  r0  r  r  rM  rV  rD  r  r  r  r  r  r  rG  rs  r  r  r  r  rf  r  r  rp  r+  r  r6  r  r]  r  r  r  r  rE  r  r  r  r  r9  r  r   r  r  r  rF  r  r  r  r}  rP  r  r  r  r  r5  r  r  rj  r  ri  r  rU  r7  r  r|  r  r>  (   r   r  r  r  r  r  r  r  rW  r(  r  rR  r$  r  r  r  r  r  r  r  r   r  rn  r  r  r  r  r  r  r  r  r  r  r#  r  rM  r]  rf  r  r  r[  r  r  r  r  r  rX  r<  r+  r  rJ  r  r?  r  r,  r  r.  r9  r  r  r  rN  r  r  r0  r  rS  rA  rB  r  r  r  ry  rb  r  r  rP  r	  rV  r  rz  r  r'  r  rG  r"  r  r  r  r  r  r`  rq  rs  r  r  r  r  r  r!  rj  rt  rZ  r  rl  r  r)  r  rw  rc  r  r  rx  r  rg  r  r  r  r_  r  r  r  r   rH  r7  r%  r  r  r  r3  r:  r  r  r  rk  r>  r  r  r  rd  r  r  r@  r  r  r  rv  r  rI  rQ  r  r  rm  r  r  r;  r  r  r2  r  r  rY  ra  r1  rp  r-  rK  r  r  r  r  r  r  r  r
  r  r  r  r^  r  r  r  ru  r  r  r}  r  r  r  r  r  r/  r  r  rL  rU  rC  r  r  r  r  r  r  rF  rr  r  r  r  r  re  r  r  ro  r*  r  r5  r  r\  r~  r  r  r  rD  r  r  r  r  r8  r  r  r  r  r  rE  r  r  r  r|  rO  r  r  r  r  r4  r  r  ri  r  rh  r  rT  r6  r  r{  r  r=  (   r   r  r  r  r  r  r  r  rV  r'  r  rQ  r#  r  r  r  r  r  r  r  r  r  rm  r  r  r  r  r  r  r  r  r  r  r"  r  rL  r\  re  r  r  rZ  r  r
  r  r  r  rW  r;  r*  r  rI  r  r>  r  r+  r  r-  r8  r  r  r  rM  r  r  r/  r  rR  r@  rA  r  r  r  rx  ra  r  r  rO  r  rU  r  ry  r  r&  r  rF  r!  r  r  r  r  r  r_  rp  rr  r~  r  r  r  r  r   ri  rs  rY  r  rk  r  r(  r  rv  rb  r  r  rw  r  rf  r  r  r  r^  r  r  r  r  rG  r6  r$  r  r  r  r2  r9  r  r  r  rj  r=  r  r  r  rc  r  r  r?  r  r  r  ru  r  rH  rP  r  r  rl  r  r  r:  r  r  r1  r   r  rX  r`  r0  ro  r,  rJ  r  r  r  r  r  r  r  r	  r  r  r  r]  r  r  r  rt  r  r  r|  r  r  r  r  r  r.  r  r  rK  rT  rB  r  r  r  r  r  r  rE  rq  r  r  r  r  rd  r  r  rn  r)  r  r4  r  r[  r}  r  r  r  rC  r  r  r  r  r7  r  r  r  r  r  rD  r  r  r  r{  rN  r  r  r  r  r3  r  r  rh  r  rg  r  rS  r5  r  rz  r  r<  (   r   r  r  r  r  r  r  r  rU  r&  r  rP  r"  r  r  r  r  r  r  r  r  r~  rl  r  r  r  r  r  r  r  r  r  r  r!  r  rK  r[  rd  r  r  rY  r  r	  r  r  r  rV  r:  r)  r  rH  r  r=  r  r*  r  r,  r7  r  r  r  rL  r  r  r.  r  rQ  r?  r@  r  r  r  rw  r`  r  r  rN  r  rT  r  rx  r  r%  r  rE  r   r  r  r  r  r  r^  ro  rq  r}  r  r  r  r  r  rh  rr  rX  r  rj  r  r'  r  ru  ra  r  r  rv  r  re  r  r  r  r]  r  r  r  r  rF  r5  r#  r  r  r  r1  r8  r  r  r  ri  r<  r  r  r  rb  r  r  r>  r  r  r  rt  r   rG  rO  r  r  rk  r  r  r9  r  r  r0  r  r  rW  r_  r/  rn  r+  rI  r  r  r  r  r  r  r  r  r  r  r  r\  r  r  r  rs  r  r  r{  r  r  r  r  r  r-  r  r  rJ  rS  rA  r  r  r  r  r  r  rD  rp  r  r  r  r  rc  r  r  rm  r(  r  r3  r  rZ  r|  r  r  r  rB  r  r  r  r  r6  r  r  r  r  r  rC  r  r  r  rz  rM  r  r  r  r  r2  r  r
  rg  r  rf  r  rR  r4  r  ry  r  r;  c                    sL  t  dvrtd| jt   }dd t|d D | _dd t|d D | _|d d }t  d } fddtd	t  dD }td	|D ]<}|| | j|d  |d < || | j||d   |d < qd	}|}||k r||d  }	|d	  | j|	d
? d@  d> | j|	d? d@  d
> A | j|	d@  d> A | j|	d? d@  A | j| d> A N  < |d7 }|dkrtd|D ]}||  ||d  N  < qtntd|d D ]}||  ||d  N  < q||d d  }	||d   | j|	d@  | j|	d? d@  d> A | j|	d
? d@  d
> A | j|	d? d@  d> A N  < t|d d |D ]}||  ||d  N  < qFd	}
|
|k r||k r||
 | j|d  |d < ||
 | j||d   |d < |
d7 }
|d7 }qjqtd|D ]t}td	dD ]b}
| j| |
 }	| j|	d? d@  | j	|	d
? d@  A | j
|	d? d@  A | j|	d@  A | j| |
< qqd S )Nr1   zInvalid key sizec                 S   s   g | ]}d gd qS r   r3   r   r   ir   r   r   r*      r   z AES.__init__.<locals>.<listcomp>r   c                 S   s   g | ]}d gd qS r$  r   r%  r   r   r   r*      r   r3   c              	      s(   g | ] }t d  ||d  d qS )z>ir3   r   )structunpackr%  keyr   r   r*      r   r   r   r   r
   r   r   )len
ValueErrornumber_of_roundsxrange_Ke_KdSrconU1U2U3U4)selfr*  roundsZround_key_countZKCZtkr&  Zrconpointertttjrr   r)  r   __init__   sp     

zAES.__init__c                    s  t  dkrtdt jd }g d\}}}g d} fddtdd	D }td|D ]}tdd	D ]}	j||	 d
? d@  j||	| d	  d? d@  A j||	| d	  d? d@  A j||	| d	  d@  A j| |	 A ||	< qjt|}q\g }
tdd	D ]}	j| |	 }|
	j
||	 d
? d@  |d
? A d@  |
	j
||	| d	  d? d@  |d? A d@  |
	j
||	| d	  d? d@  |d? A d@  |
	j
||	| d	  d@  |A d@  q|
S )z9Encrypt a block of plain text using the AES block cipher.r   wrong block lengthr   )r   r   r   r   r   r   r   c                    s6   g | ].}t  d | d | d   jd | A qS r3   r   )r   r/  r%  	plaintextr7  r   r   r*      r   zAES.encrypt.<locals>.<listcomp>r   r3   r
   r   r   )r+  r,  r/  r.  T1T2T3T4copyappendr1  )r7  rB  r8  s1s2s3r(   r9  r<  r&  resultr:  r   rA  r   encrypt   s4    
(00,zAES.encryptc                    s  t  dkrtdt jd }g d\}}}g d} fddtdd	D }td|D ]}tdd	D ]}	j||	 d
? d@  j||	| d	  d? d@  A j||	| d	  d? d@  A j||	| d	  d@  A j| |	 A ||	< qjt|}q\g }
tdd	D ]}	j| |	 }|
	j
||	 d
? d@  |d
? A d@  |
	j
||	| d	  d? d@  |d? A d@  |
	j
||	| d	  d? d@  |d? A d@  |
	j
||	| d	  d@  |A d@  q|
S )z:Decrypt a block of cipher text using the AES block cipher.r   r>  r   )r   r   r   r?  c                    s6   g | ].}t  d | d | d   jd | A qS r@  )r   r0  r%  
ciphertextr7  r   r   r*      r   zAES.decrypt.<locals>.<listcomp>r   r3   r
   r   r   )r+  r,  r0  r.  T5T6T7T8rG  rH  Si)r7  rO  r8  rI  rJ  rK  r(   r9  r<  r&  rL  r:  r   rN  r   decrypt   s4    
(00,zAES.decryptN)__name__
__module____qualname____doc__r-  r2  r1  rT  rC  rD  rE  rF  rP  rQ  rR  rS  r3  r4  r5  r6  r=  rM  rU  r   r   r   r   r   a   s(   H"r   c                   @   s.   e Zd ZdZd
ddZedd Zdd Zd	S )r	   zA counter object for the Counter (CTR) mode of operation.

       To create a custom counter, you can usually just override the
       increment method.r   c                    s     fddt dddD | _d S )Nc                    s   g | ]} |? d  qS )   r   r%  initial_valuer   r   r*     r   z$Counter.__init__.<locals>.<listcomp>r   i)r.  _counter)r7  r\  r   r[  r   r=    s    zCounter.__init__c                 C   s   | j S r   )r^  sr   r   r   <lambda>  r   zCounter.<lambda>c                 C   s`   t t| jd ddD ]2}| j|  d7  < | j| dk r> q\d| j|< qdgt| j | _dS )z1Increment the counter (overflow rolls back to 0).r   r]  rZ  r   N)r.  r+  r^  )r7  r&  r   r   r   	increment  s
    zCounter.incrementN)r   )rV  rW  rX  rY  r=  propertyvaluerb  r   r   r   r   r	     s   
r	   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	AESBlockModeOfOperationz;Super-class for AES modes of operation that require blocks.c                 C   s   t || _d S r   )r   _aes)r7  r*  r   r   r   r=  /  s    z AESBlockModeOfOperation.__init__c                 C   s   t dd S Nznot implemented	Exceptionr7  rO  r   r   r   rU  2  s    zAESBlockModeOfOperation.decryptc                 C   s   t dd S rg  rh  r7  rB  r   r   r   rM  5  s    zAESBlockModeOfOperation.encryptN)rV  rW  rX  rY  r=  rU  rM  r   r   r   r   re  -  s   re  c                   @   s   e Zd ZdZdS )AESStreamModeOfOperationz?Super-class for AES modes of operation that are stream-ciphers.N)rV  rW  rX  rY  r   r   r   r   rl  9  s   rl  c                   @   s   e Zd ZdZdZdS )AESSegmentModeOfOperationz9Super-class for AES modes of operation that segment data.r   N)rV  rW  rX  rY  segment_bytesr   r   r   r   rm  <  s   rm  c                   @   s$   e Zd ZdZdZdd Zdd ZdS )r   a  AES Electronic Codebook Mode of Operation.

       o Block-cipher, so data must be padded to 16 byte boundaries

   Security Notes:
       o This mode is not recommended
       o Any two identical blocks produce identical encrypted values,
         exposing data patterns. (See the image of Tux on wikipedia)

   Also see:
       o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_codebook_.28ECB.29
       o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.1zElectronic Codebook (ECB)c                 C   s,   t |dkrtdt|}t| j|S )Nr    plaintext block must be 16 bytes)r+  r,  r   r&   rf  rM  rk  r   r   r   rM  T  s    zAESModeOfOperationECB.encryptc                 C   s,   t |dkrtdt|}t| j|S )Nr   !ciphertext block must be 16 bytes)r+  r,  r   r&   rf  rU  rj  r   r   r   rU  [  s    zAESModeOfOperationECB.decryptN)rV  rW  rX  rY  namerM  rU  r   r   r   r   r   C  s   r   c                   @   s.   e Zd ZdZdZd
ddZdd Zdd	 ZdS )r   a  AES Cipher-Block Chaining Mode of Operation.

       o The Initialization Vector (IV)
       o Block-cipher, so data must be padded to 16 byte boundaries
       o An incorrect initialization vector will only cause the first
         block to be corrupt; all other blocks will be intact
       o A corrupt bit in the cipher text will cause a block to be
         corrupted, and the next block to be inverted, but all other
         blocks will be intact.

   Security Notes:
       o This method (and CTR) ARE recommended.

   Also see:
       o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher-block_chaining_.28CBC.29
       o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.2zCipher-Block Chaining (CBC)Nc                 C   sF   |d u rdgd | _ n t|dkr,tdn
t|| _ t| | d S Nr   r   &initialization vector must be 16 bytes)_last_cipherblockr+  r,  r   re  r=  r7  r*  ivr   r   r   r=  y  s    

zAESModeOfOperationCBC.__init__c                 C   sJ   t |dkrtdt|}dd t|| jD }| j|| _t| jS )Nr   ro  c                 S   s   g | ]\}}||A qS r   r   r   plr   r   r   r*     r   z1AESModeOfOperationCBC.encrypt.<locals>.<listcomp>)r+  r,  r   ziprt  rf  rM  r&   )r7  rB  Zprecipherblockr   r   r   rM    s    zAESModeOfOperationCBC.encryptc                 C   sH   t |dkrtdt|}dd t| j|| jD }|| _t|S )Nr   rp  c                 S   s   g | ]\}}||A qS r   r   rw  r   r   r   r*     r   z1AESModeOfOperationCBC.decrypt.<locals>.<listcomp>)r+  r,  r   rz  rf  rU  rt  r&   )r7  rO  ZcipherblockrB  r   r   r   rU    s    zAESModeOfOperationCBC.decrypt)NrV  rW  rX  rY  rq  r=  rM  rU  r   r   r   r   r   d  s
   


r   c                   @   s:   e Zd ZdZdZdddZedd Zdd	 Zd
d Z	dS )r   a  AES Cipher Feedback Mode of Operation.

       o A stream-cipher, so input does not need to be padded to blocks,
         but does need to be padded to segment_size

    Also see:
       o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_feedback_.28CFB.29
       o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.3zCipher Feedback (CFB)r   c                 C   sX   |dkrd}|d u r"dgd | _ n t|dkr8tdn
t|| _ || _t| | d S )Nr   r   r   rs  )_shift_registerr+  r,  r   _segment_bytesre  r=  )r7  r*  rv  Zsegment_sizer   r   r   r=    s    

zAESModeOfOperationCFB.__init__c                 C   s   | j S r   )r}  r_  r   r   r   ra    r   zAESModeOfOperationCFB.<lambda>c                 C   s   t || j dkrtdt|}g }tdt || jD ]h}|||| j  }| j| jd t | }dd t||D }t	| jt |d  || _|
| q8t|S )Nr   z2plaintext block must be a multiple of segment_sizec                 S   s   g | ]\}}||A qS r   r   r   rx  xr   r   r   r*     r   z1AESModeOfOperationCFB.encrypt.<locals>.<listcomp>r+  r}  r,  r   r.  rf  rM  r|  rz  r)   extendr&   )r7  rB  	encryptedr&  plaintext_segmentxor_segmentcipher_segmentr   r   r   rM    s    zAESModeOfOperationCFB.encryptc                 C   s   t || j dkrtdt|}g }tdt || jD ]h}|||| j  }| j| jd t | }dd t||D }t	| jt |d  || _|
| q8t|S )Nr   z3ciphertext block must be a multiple of segment_sizec                 S   s   g | ]\}}||A qS r   r   r~  r   r   r   r*     r   z1AESModeOfOperationCFB.decrypt.<locals>.<listcomp>r  )r7  rO  Z	decryptedr&  r  r  r  r   r   r   rU    s    zAESModeOfOperationCFB.decryptN)r   )
rV  rW  rX  rY  rq  r=  rc  rn  rM  rU  r   r   r   r   r     s   

r   c                   @   s.   e Zd ZdZdZd
ddZdd Zdd	 ZdS )r   a   AES Output Feedback Mode of Operation.

       o A stream-cipher, so input does not need to be padded to blocks,
         allowing arbitrary length data.
       o A bit twiddled in the cipher text, twiddles the same bit in the
         same bit in the plain text, which can be useful for error
         correction techniques.

    Also see:
       o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Output_feedback_.28OFB.29
       o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.4zOutput Feedback (OFB)Nc                 C   sL   |d u rdgd | _ n t|dkr,tdn
t|| _ g | _t| | d S rr  )_last_precipherblockr+  r,  r   _remaining_blockre  r=  ru  r   r   r   r=    s    

zAESModeOfOperationOFB.__init__c                 C   sh   g }t |D ]R}t| jdkr4| j| j| _g | _| jd}| j| ||A }|| qt|S )Nr   )	r   r+  r  rf  rM  r  poprH  r&   )r7  rB  r  rx  ZprecipherbyteZ
cipherbyter   r   r   rM    s    zAESModeOfOperationOFB.encryptc                 C   s
   |  |S r   rM  rj  r   r   r   rU  	  s    zAESModeOfOperationOFB.decrypt)Nr{  r   r   r   r   r     s
   
r   c                   @   s.   e Zd ZdZdZd
ddZdd Zdd	 ZdS )r   aU  AES Counter Mode of Operation.

       o A stream-cipher, so input does not need to be padded to blocks,
         allowing arbitrary length data.
       o The counter must be the same size as the key size (ie. len(key))
       o Each block independant of the other, so a corrupt byte will not
         damage future blocks.
       o Each block has a uniue counter value associated with it, which
         contributes to the encrypted value, so no data patterns are
         leaked.
       o Also known as: Counter Mode (CM), Integer Counter Mode (ICM) and
         Segmented Integer Counter (SIC

   Security Notes:
       o This method (and CBC) ARE recommended.
       o Each message block is associated with a counter value which must be
         unique for ALL messages with the same key. Otherwise security may be
         compromised.

    Also see:

       o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_.28CTR.29
       o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.5
         and Appendix B for managing the initial counterzCounter (CTR)Nc                 C   s*   t | | |d u rt }|| _g | _d S r   )re  r=  r	   r^  _remaining_counter)r7  r*  counterr   r   r   r=  ,  s
    zAESModeOfOperationCTR.__init__c                 C   sr   t | jt |k r8|  j| j| jj7  _| j  q t|}dd t|| jD }| jt |d  | _t	|S )Nc                 S   s   g | ]\}}||A qS r   r   )r   rx  r   r   r   r   r*   <  r   z1AESModeOfOperationCTR.encrypt.<locals>.<listcomp>)
r+  r  rf  rM  r^  rd  rb  r   rz  r&   )r7  rB  r  r   r   r   rM  5  s    zAESModeOfOperationCTR.encryptc                 C   s
   |  |S r   r  )r7  Z	crypttextr   r   r   rU  A  s    zAESModeOfOperationCTR.decrypt)Nr{  r   r   r   r   r     s
   
	r   )ZctrZcbcZcfbZecbZofb)rG  r'  __all__r   r   r&   r)   r.  ri  rangeobjectr   r	   re  rl  rm  r   r   r   r   r   dictr   r   r   r   r   <module>6   s>    0!5G/8