
    h                        d dl Z d dlZg dZd Zd Zd Zd Z	 e n# e$ r e	Zd Zd Zd	 ZY nw xY w G d
 de
          Z G d de
          Z G d de
          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z eeeeee          ZdS )    N)AESAESModeOfOperationCTRAESModeOfOperationCBCAESModeOfOperationCFBAESModeOfOperationECBAESModeOfOperationOFBAESModesOfOperationCounterc                 Z    | d         dz  | d         dz  z  | d         dz  z  | d         z  S )Nr                      )words    I/var/www/html/auto_sub_bot/venv/lib/python3.11/site-packages/pyaes/aes.py_compact_wordr   =   s3    GrMd1gm,Q1=QGG    c                 4    t          d | D                       S )Nc              3   4   K   | ]}t          |          V  d S Nord.0cs     r   	<genexpr>z#_string_to_bytes.<locals>.<genexpr>A   s(      %%1A%%%%%%r   )listtexts    r   _string_to_bytesr#   @   s    %%%%%%%%r   c                 @    d                     d | D                       S )N c              3   4   K   | ]}t          |          V  d S r   )chr)r   bs     r   r   z#_bytes_to_string.<locals>.<genexpr>D   s(      **a3q66******r   )joinbinarys    r   _bytes_to_stringr,   C   s#    77**6******r   c                     | |z   S r   r   ar(   s     r   _concat_listr0   F   s    q5Lr   c                 H    t          | t                    r| S d | D             S )Nc                 ,    g | ]}t          |          S r   r   r   s     r   
<listcomp>z$_string_to_bytes.<locals>.<listcomp>T   s    %%%1A%%%r   )
isinstancebytesr!   s    r   r#   r#   Q   s-    dE"" 	K%%%%%%r   c                      t          |           S r   r5   r*   s    r   r,   r,   W   s    V}}r   c                 &    | t          |          z   S r   r7   r.   s     r   r0   r0   [   s    588|r   c                       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 Zd Z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   r>   @         6   l         M      /   ^      c         5   j         }               (   rL   |   w   {      k   o   rV   0   r   g   +         rF   v            rS   rT   Y   G         rQ               r               &   rC   ?         4            q   rE   1      r?      #      r         rH         rA         '      u   	      ,      rB   n   Z      R   ;      rR   )      rI      S      r      r>         [   rP         9   J   L   X         rU         C   rG   3      E      r      P   <         Q      r@            8      rK         !   r               r;         _   rN   D            ~   =   d   ]      s   `      O      "   *         F               rJ            2   :   r:   I      $   \            b   rW         y         7   m         N      rD   V         e   z      r      x   %   .            rM         t      K            p   >      f   H   r      r<   a   rO   W                              i                           U   (                        B   h   A      -         T         (   r   r   rP   r   r^   rC   ry   r   r(  r@   r   r  r   r   rb   r   rX   r   r   re   r  rI   r   r  rx   r  r   r   r   r   r  r   r1  rZ   r  r   r   r   r   r   r   r   r   r   r*  rT   r   r   r   r   r%  r
  r"  r  r   r   rc   r   rk   r   r   r  r   r   ro   r  r  r   r  r+  r  r3  rQ   rn   r   rw   r   r   r   r   rD   r  r  r   rr   r   r  r   rJ   r~   r   r  r   r   r   r   r   rE   rF   r   r$  rK   r   r:   rv   r   r   r   r   rR   r   r   r   r   r  r   rd   ru   r/  r   r  rl   r  r   r   r   r  r\   r   rW   r  r,  r   r_   r   r   rN   r[   r   r   ri   r   r)  r   r   r   r  r   r   rj   rO   r   r   r   r   r   r   r   r#  r   rh   r{   r   r|   r  r   rV   r&  r]   rq   r   r<   r   r   r   rB   r   r   r  r  rM   r   r   r>   rH   r   rp   ra   r   r   r   r   r  r   r   r   r   r   r   r}   r   r   r   rg   r   rA   r   r   r   r   r   r   r   r	  r   r'  r.  rz   r   r   rs   rf   rm   rU   r   r   r   rG   r   r   r   r0  r   r   r2  r   r   r   r-  r  r   r`   r?   r   r   rY   r   rt   r  r  r   rL   r!  r   r;   rS   (   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  rd  r5  r  r_  r1  r
  r  r  r  r  r  r  r-  r  r{  r#  r  r  r  r  r  r  r  r  r  r0  r  rZ  rj  rs  r*  r  rh  r  r  r$  r  r  re  rI  r8  r  rW  r  rL  r  r9  r  r;  rF  r  r  r  r[  r  r  r=  r  r`  rN  rO  r  r  r  r  ro  r	  r  r]  r  rc  r  r  r  r4  r   rT  r/  r  r  r  r  r  rm  r~  r  r  r  r  r"  r  r.  rw  r  rg  r  ry  r,  r6  r  r  rp  r  r  r  r  rt  r  r  r  rl  r(  r  r  r  rU  rD  r2  r&  r  r   r@  rG  r  r  r  rx  rK  r  r  r  rq  r  r  rM  r  r  r  r  r  rV  r^  r  r  rz  r!  r  rH  r  r  r?  r  r  rf  rn  r>  r}  r:  rX  r  r  r  r  r  r  r  r  r  r  r  rk  r  r  r  r  r  r  r  r'  r  r  r  r  r<  r  r  rY  rb  rP  r  r  r  r  r  r  rS  r  r  r  r  r  rr  r  r  r|  r7  r)  rB  r  ri  r  r  r  r  rQ  r  r  r+  r  rE  r  r  r  r  r  rR  r  r  r  r  r\  r  r  r  r  rA  r  r  rv  r  ru  r  ra  rC  r  r  r  rJ  (   r   r  r  r  r$  r  r  r  rc  r4  r  r^  r0  r	  r  r  r  r  r  r  r,  r  rz  r"  r  r  r  r  r  r  r  r  r  r/  r  rY  ri  rr  r)  r  rg  r  r  r#  r  r
  rd  rH  r7  r  rV  r  rK  r  r8  r  r:  rE  r  r  r  rZ  r  r  r<  r  r_  rM  rN  r  r  r  r  rn  r  r  r\  r  rb  r  r  r  r3  r  rS  r.  r  r  r  r  r  rl  r}  r  r  r  r  r!  r  r-  rv  r  rf  r  rx  r+  r5  r  r  ro  r  r  r  r  rs  r  r  r  rk  r'  r  r  r  rT  rC  r1  r%  r  r  r?  rF  r  r  r  rw  rJ  r  r  r  rp  r  r  rL  r  r  r  r  r  rU  r]  r  r  ry  r   r  rG  r  r  r>  r  r  re  rm  r=  r|  r9  rW  r  r  r  r  r  r  r  r  r  r  r  rj  r  r  r  r  r  r  r  r&  r  r  r  r  r;  r  r  rX  ra  rO  r  r  r  r  r  r  rR  r~  r  r  r  r  rq  r  r  r{  r6  r(  rA  r  rh  r  r  r  r  rP  r  r  r*  r  rD  r  r  r  r  r  rQ  r  r  r   r  r[  r  r  r  r  r@  r  r  ru  r  rt  r  r`  rB  r  r  r  rI  (   r   r  r  r  r#  r  r  r  rb  r3  r  r]  r/  r  r  r  r  r  r  r  r+  r  ry  r!  r  r  r  r  r  r  r  r  r  r.  r  rX  rh  rq  r(  r  rf  r  r  r"  r  r	  rc  rG  r6  r  rU  r  rJ  r  r7  r  r9  rD  r  r  r  rY  r  r  r;  r  r^  rL  rM  r  r  r  r  rm  r  r  r[  r  ra  r  r  r  r2  r  rR  r-  r  r  r  r  r  rk  r|  r~  r  r   r  r   r  r,  ru  r  re  r  rw  r*  r4  r  r  rn  r  r  r  r  rr  r  r  r  rj  r&  r  r  r  rS  rB  r0  r$  r  r  r>  rE  r  r  r  rv  rI  r  r  r  ro  r  r  rK  r  r  r  r  r  rT  r\  r  r  rx  r  r  rF  r  r  r=  r  r  rd  rl  r<  r{  r8  rV  r  r  r  r  r  r  r  r  r  r  r  ri  r  r  r  r  r  r  r  r%  r  r  r  r  r:  r  r  rW  r`  rN  r  r  r  r  r  r  rQ  r}  r  r  r  r  rp  r  r  rz  r5  r'  r@  r  rg  r  r  r  r  rO  r  r  r)  r  rC  r  r
  r  r  r  rP  r  r  r  r  rZ  r  r  r  r  r?  r  r  rt  r  rs  r  r_  rA  r  r  r  rH  (   r   r  r  r  r"  r  r  r  ra  r2  r  r\  r.  r  r  r  r  r  r  r  r*  r  rx  r   r  r  r  r  r  r  r  r  r  r-  r  rW  rg  rp  r'  r  re  r  r  r!  r  r  rb  rF  r5  r  rT  r  rI  r  r6  r  r8  rC  r  r  r  rX  r  r  r:  r  r]  rK  rL  r  r  r  r  rl  r  r  rZ  r  r`  r  r  r  r1  r  rQ  r,  r  r  r  r  r  rj  r{  r}  r  r  r   r  r  r+  rt  r~  rd  r  rv  r)  r3  r  r  rm  r  r  r  r  rq  r  r  r  ri  r%  r  r  r
  rR  rA  r/  r#  r  r  r=  rD  r  r  r  ru  rH  r  r  r  rn  r  r  rJ  r  r  r  r  r  rS  r[  r  r  rw  r  r  rE  r  r  r<  r  r  rc  rk  r;  rz  r7  rU  r  r  r  r  r  r  r  r  r  r  r  rh  r  r  r  r  r  r  r  r$  r  r  r  r  r9  r  r  rV  r_  rM  r  r  r  r  r  r  rP  r|  r  r  r  r  ro  r  r  ry  r4  r&  r?  r  rf  r  r  r  r  rN  r  r  r(  r  rB  r  r	  r  r  r  rO  r  r  r  r  rY  r  r  r  r  r>  r  r  rs  r  rr  r  r^  r@  r  r  r  rG  c                 D   t                    dvrt          d          | j        t                             }d t          |dz             D             | _        d t          |dz             D             | _        |dz   dz  }t                    dz  }fdt          dt                    d          D             }t          d|          D ]=}||         | j        |dz           |dz  <   ||         | j        ||dz  z
           |dz  <   >d}|}||k     r||dz
           }	|dxx         | j        |	d	z	  d
z           dz  | j        |	dz	  d
z           d	z  z  | j        |	d
z           dz  z  | j        |	dz	  d
z           z  | j        |         dz  z  z  cc<   |dz  }|dk    r-t          d|          D ]}||xx         ||dz
           z  cc<   nt          d|dz            D ]}||xx         ||dz
           z  cc<   ||dz  dz
           }	||dz  xx         | j        |	d
z           | j        |	dz	  d
z           dz  z  | j        |	d	z	  d
z           d	z  z  | j        |	dz	  d
z           dz  z  z  cc<   t          |dz  dz   |          D ]}||xx         ||dz
           z  cc<   d}
|
|k     rW||k     rQ||
         | j        |dz           |dz  <   ||
         | j        ||dz  z
           |dz  <   |
dz  }
|dz  }|
|k     r||k     Q||k     t          d|          D ]}t          dd          D ]o}
| j        |         |
         }	| j        |	dz	  d
z           | j	        |	d	z	  d
z           z  | j
        |	dz	  d
z           z  | j        |	d
z           z  | j        |         |
<   pd S )Nr=   zInvalid key sizec                     g | ]}d gdz  	S r   r?   r   r   is     r   r3   z AES.__init__.<locals>.<listcomp>       888QC!G888r   r   c                     g | ]}d gdz  	S r2  r   r3  s     r   r3   z AES.__init__.<locals>.<listcomp>   r5  r   r?   c           	      \    g | ](}t          j        d ||dz                      d         )S )z>ir?   r   )structunpack)r   r4  keys     r   r3   z AES.__init__.<locals>.<listcomp>   s6    UUUv}T3qQw<003UUUr   r   r   r   r   r   r   )len
ValueErrornumber_of_roundsxrange_Ke_KdSrconU1U2U3U4)selfr:  roundsround_key_countKCtkr4  rconpointertttjrs    `          r   __init__zAES.__init__   s   s88<''/000&s3xx0 98VFQJ%7%7888 98VFQJ%7%7888!A:*XX] VUUUVAs3xxQR=S=SUUU 2 	7 	7A&(eDHQ!VQU#13ADHVqAv&'A.. /!!BFBqEEEtvrRx4/0B6vrax4/0B68vr4/0Q68 vrRx4/01 y-3	5 6EEE
 1KQww2 ' 'AqEEERAY&EEEE'
  27++ ' 'AqEEERAY&EEEEa!_27D(8 9 $qD'8 9a ?!A $bD'8 9R ?!A !%bD'8 9R ?!A B
  a!R00 ' 'AqEEERAY&EEEE Ab&&Q00*,Q%a Q'57U16*+AE2QQ	 b&&Q00= /!!J 6"" 	> 	>AAq\\ > >Xa[^"&'28t*;"<"&'28t*;"<#="&'2!8t*;"<#= #''2t+;"<#=A>	> 	>r   c                 l    t                    dk    rt          d          t           j                  dz
  }g d\  }}}g d} fdt          dd          D             }t          d|          D ]}t          dd          D ]}	 j        ||	         d	z	  d
z            j        ||	|z   dz           dz	  d
z           z   j        ||	|z   dz           dz	  d
z           z   j        ||	|z   dz           d
z           z   j        |         |	         z  ||	<   t          j        |          }g }
t          dd          D ]}	 j        |         |	         }|
	                     j
        ||	         d	z	  d
z           |d	z	  z  d
z             |
	                     j
        ||	|z   dz           dz	  d
z           |dz	  z  d
z             |
	                     j
        ||	|z   dz           dz	  d
z           |dz	  z  d
z             |
	                     j
        ||	|z   dz           d
z           |z  d
z             |
S )z9Encrypt a block of plain text using the AES block cipher.r   wrong block lengthr   )r   r   r   r   r   r   r   c                 x    g | ]6}t          d |z  d |z  d z                      j        d         |         z  7S r?   r   )r   r?  )r   r4  	plaintextrG  s     r   r3   zAES.encrypt.<locals>.<listcomp>   sE    ```amIa!eAEAIo677$(1+a.H```r   r   r?   r   r   r   )r;  r<  r?  r>  T1T2T3T4copyappendrA  )rG  rW  rH  s1s2s3r/   rM  rP  r4  resultrN  s   ``          r   encryptzAES.encrypt   s    y>>R1222TX" yyRLL a````SYZ[]^S_S_``` 6"" 	 	AAq\\ ( (AB!6$ >?AFa<B!6$ >?@AFa<Q!6$ >?@ AFa<$!>?@ A	'!
 	!AA 1 	X 	XA&!!$BMM461a#3r#9T"ABbBhOSWWXXXMM461a"f\?b#8D"@AR2XNRVVWWWMM461a"f\?q#8D"@ARAXNRVVWWWMM461a"f\?D#@ARGRVVWWWWr   c                 l    t                    dk    rt          d          t           j                  dz
  }g d\  }}}g d} fdt          dd          D             }t          d|          D ]}t          dd          D ]}	 j        ||	         d	z	  d
z            j        ||	|z   dz           dz	  d
z           z   j        ||	|z   dz           dz	  d
z           z   j        ||	|z   dz           d
z           z   j        |         |	         z  ||	<   t          j        |          }g }
t          dd          D ]}	 j        |         |	         }|
	                     j
        ||	         d	z	  d
z           |d	z	  z  d
z             |
	                     j
        ||	|z   dz           dz	  d
z           |dz	  z  d
z             |
	                     j
        ||	|z   dz           dz	  d
z           |dz	  z  d
z             |
	                     j
        ||	|z   dz           d
z           |z  d
z             |
S )z:Decrypt a block of cipher text using the AES block cipher.r   rS  r   )r   r   r   rT  c                 x    g | ]6}t          d |z  d |z  d z                      j        d         |         z  7S rV  )r   r@  )r   r4  
ciphertextrG  s     r   r3   zAES.decrypt.<locals>.<listcomp>   sE    aaaqmJq1uQUQY78848A;q>Iaaar   r   r?   r   r   r   )r;  r<  r@  r>  T5T6T7T8r\  r]  Si)rG  re  rH  r^  r_  r`  r/   rM  rP  r4  ra  rN  s   ``          r   decryptzAES.decrypt   s    z??b  1222TX" yyRLL baaaaTZ[\^_T`T`aaa 6"" 	 	AAq\\ ( (AB!6$ >?AFa<B!6$ >?@AFa<Q!6$ >?@ AFa<$!>?@ A	'!
 	!AA 1 	Y 	YA&!!$BMM47Aq$4$:d#BCrRxPTXXYYYMM47Aq2vlOr$9T#ABbBhOSWWXXXMM47Aq2vlO$9T#ABbQhOSWWXXXMM47Aq2vlOT$ABbHSWWXXXXr   N)__name__
__module____qualname____doc__r=  rB  rA  rj  rX  rY  rZ  r[  rf  rg  rh  ri  rC  rD  rE  rF  rQ  rb  rk  r   r   r   r   r   a   s         BB// B  B  BD 	K  	K  	KA 	K  	K  	KB 
L0  
L0  
L0B 
L0  
L0  
L0B 
L0  
L0  
L0B 
L0  
L0  
L0B 
L0  
L0  
L0B 
L0  
L0  
L0B 
L0  
L0  
L0B 
L0  
L0  
L0B 
L0  
L0  
L0B 
L0  
L0  
L0B 
L0  
L0  
L0B 
L0  
L0  
L0BF> F> F>P     D         r   r   c                   8    e Zd ZdZddZ ed           Z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                 L    fdt          ddd          D             | _        d S )Nc                      g | ]
}|z	  d z  S )   r   )r   r4  initial_values     r   r3   z$Counter.__init__.<locals>.<listcomp>  s#    YYY1MQ.#5YYYr   r   i)r>  _counter)rG  rt  s    `r   rQ  zCounter.__init__  s3     ZYYYwPRTV@W@WYYYr   c                     | j         S r   )rv  ss    r   <lambda>zCounter.<lambda>  s    qz r   c                     t          t          | j                  dz
  dd          D ]5}| j        |xx         dz  cc<   | j        |         dk     r dS d| j        |<   6dgt          | j                  z  | _        dS )z1Increment the counter (overflow rolls back to 0).r   ru  rs  r   N)r>  r;  rv  )rG  r4  s     r   	incrementzCounter.increment  s     DM**Q.B77 
	7 
	7AM!!}Q#%%uuu  !DM!  EC$6$66DMMMr   Nr   )rl  rm  rn  ro  rQ  propertyvaluer|  r   r   r   r
   r
     sZ         
Z Z Z Z
 H))**E7 7 7 7 7r   r
   c                   $    e Zd ZdZd Zd Zd ZdS )AESBlockModeOfOperationz;Super-class for AES modes of operation that require blocks.c                 .    t          |          | _        d S r   )r   _aes)rG  r:  s     r   rQ  z AESBlockModeOfOperation.__init__/  s    HH			r   c                      t          d          Nznot implemented	ExceptionrG  re  s     r   rk  zAESBlockModeOfOperation.decrypt2      )***r   c                      t          d          r  r  rG  rW  s     r   rb  zAESBlockModeOfOperation.encrypt5  r  r   N)rl  rm  rn  ro  rQ  rk  rb  r   r   r   r  r  -  sG        EE  + + ++ + + + +r   r  c                       e Zd ZdZdS )AESStreamModeOfOperationz?Super-class for AES modes of operation that are stream-ciphers.N)rl  rm  rn  ro  r   r   r   r  r  9  s        IIIIr   r  c                       e Zd ZdZdZdS )AESSegmentModeOfOperationz9Super-class for AES modes of operation that segment data.r   N)rl  rm  rn  ro  segment_bytesr   r   r   r  r  <  s        CCMMMr   r  c                   "    e Zd ZdZdZd Z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                     t          |          dk    rt          d          t          |          }t          | j                            |                    S )Nr    plaintext block must be 16 bytes)r;  r<  r#   r,   r  rb  r  s     r   rb  zAESModeOfOperationECB.encryptT  sM    y>>R?@@@$Y//		 1 1) < <===r   c                     t          |          dk    rt          d          t          |          }t          | j                            |                    S )Nr   !ciphertext block must be 16 bytes)r;  r<  r#   r,   r  rk  r  s     r   rk  zAESModeOfOperationECB.decrypt[  sM    z??b  @AAA%j11
	 1 1* = =>>>r   N)rl  rm  rn  ro  namerb  rk  r   r   r   r   r   C  sE        o o 'D> > >? ? ? ? ?r   r   c                   *    e Zd ZdZdZddZd Z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                     |dgdz  | _         n6t          |          dk    rt          d          t          |          | _         t                              | |           d S Nr   r   &initialization vector must be 16 bytes)_last_cipherblockr;  r<  r#   r  rQ  rG  r:  ivs      r   rQ  zAESModeOfOperationCBC.__init__y  sb    :'(URZD""WW]]EFFF%5b%9%9D"((s33333r   c                    t          |          dk    rt          d          t          |          }d t          || j                  D             }| j                            |          | _        t          | j                  S )Nr   r  c                     g | ]
\  }}||z  S r   r   r   pls      r   r3   z1AESModeOfOperationCBC.encrypt.<locals>.<listcomp>  s     YYYv1AEYYYr   )r;  r<  r#   zipr  r  rb  r,   )rG  rW  precipherblocks      r   rb  zAESModeOfOperationCBC.encrypt  sx    y>>R?@@@$Y//	YYY@V1W1WYYY!%!2!2>!B!B 6777r   c                     t          |          dk    rt          d          t          |          }d t          | j                            |          | j                  D             }|| _        t          |          S )Nr   r  c                     g | ]
\  }}||z  S r   r   r  s      r   r3   z1AESModeOfOperationCBC.decrypt.<locals>.<listcomp>  s     iii&1aq1uiiir   )r;  r<  r#   r  r  rk  r  r,   )rG  re  cipherblockrW  s       r   rk  zAESModeOfOperationCBC.decrypt  sv    z??b  @AAA&z22iiC	0A0A+0N0NPTPf,g,giii	!,	***r   r   rl  rm  rn  ro  r  rQ  rb  rk  r   r   r   r   r   d  sY        o o$ )D4 4 4 48 8 8+ + + + +r   r   c                   B    e Zd ZdZdZd	dZ ed           Zd Z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                     |dk    rd}|dgdz  | _         n6t          |          dk    rt          d          t          |          | _         || _        t
                              | |           d S )Nr   r   r   r  )_shift_registerr;  r<  r#   _segment_bytesr  rQ  )rG  r:  r  segment_sizes       r   rQ  zAESModeOfOperationCFB.__init__  sy    1Ql:%&52:D  WW]]EFFF!1"!5!5$
*((s33333r   c                     | j         S r   )r  rx  s    r   rz  zAESModeOfOperationCFB.<lambda>  s	    q'7 r   c                 *   t          |          | j        z  dk    rt          d          t          |          }g }t	          dt          |          | j                  D ]}|||| j        z            }| j                            | j                  d t          |                   }d t          ||          D             }t          | j        t          |          d          |          | _        |
                    |           t          |          S )Nr   z2plaintext block must be a multiple of segment_sizec                     g | ]
\  }}||z  S r   r   r   r  xs      r   r3   z1AESModeOfOperationCFB.encrypt.<locals>.<listcomp>  s     ZZZ6AqAZZZr   r;  r  r<  r#   r>  r  rb  r  r  r0   extendr,   )rG  rW  	encryptedr4  plaintext_segmentxor_segmentcipher_segments          r   rb  zAESModeOfOperationCFB.encrypt  s   y>>D//144QRRR$Y//	 	3y>>4+>?? 	- 	-A )!Q1D-D*D E)++D,@AABY3GXCYCYBYZKZZS9JK5X5XZZZN $00DSEXEXEYEY0Z\j#k#kD ^,,,,	***r   c                 *   t          |          | j        z  dk    rt          d          t          |          }g }t	          dt          |          | j                  D ]}|||| j        z            }| j                            | j                  d t          |                   }d t          ||          D             }t          | j        t          |          d          |          | _        |
                    |           t          |          S )Nr   z3ciphertext block must be a multiple of segment_sizec                     g | ]
\  }}||z  S r   r   r  s      r   r3   z1AESModeOfOperationCFB.decrypt.<locals>.<listcomp>  s      Z Z Zfq!1q5 Z Z Zr   r  )rG  re  	decryptedr4  r  r  r  s          r   rk  zAESModeOfOperationCFB.decrypt  s   z??T00A55RSSS%j11
 	3z??D,?@@ 	0 	0A'1t/B+B(BCN)++D,@AABV3~CVCVBVWK Z ZNK8X8X Z Z Z $00DSEXEXEYEY0Z\j#k#kD .////	***r   Nr}  )
rl  rm  rn  ro  r  rQ  r~  r  rb  rk  r   r   r   r   r     sn        o o #D4 4 4 4 H7788M+ + +(+ + + + +r   r   c                   *    e Zd ZdZdZddZd Z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                     |dgdz  | _         n6t          |          dk    rt          d          t          |          | _         g | _        t
                              | |           d S r  )_last_precipherblockr;  r<  r#   _remaining_blockr  rQ  r  s      r   rQ  zAESModeOfOperationOFB.__init__  sj    :*+
D%%WW]]EFFF&6r&:&:$
# #((s33333r   c                 j   g }t          |          D ]}t          | j                  dk    r+| j                            | j                  | _        g | _        | j                            d          }| j                            |           ||z  }|                    |           t          |          S )Nr   )	r#   r;  r  r  rb  r  popr]  r,   )rG  rW  r  r  precipherbyte
cipherbytes         r   rb  zAESModeOfOperationOFB.encrypt  s    	!),, 	) 	)A4())Q..(,	(9(9$:S(T(T%,/) 155a88M%,,];;;]*JZ((((	***r   c                 ,    |                      |          S r   rb  r  s     r   rk  zAESModeOfOperationOFB.decrypt	  s    ||J'''r   r   r  r   r   r   r   r     sY        
o 
o #D
4 
4 
4 
4+ + +( ( ( ( (r   r   c                   *    e Zd ZdZdZddZd Z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                 x    t                               | |           |t                      }|| _        g | _        d S r   )r  rQ  r
   rv  _remaining_counter)rG  r:  counters      r   rQ  zAESModeOfOperationCTR.__init__,  s;    ((s333?iiG"%r   c                    t          | j                  t          |          k     rp| xj        | j                            | j        j                  z  c_        | j                                         t          | j                  t          |          k     pt          |          }d t          || j                  D             }| j        t          |          d          | _        t          |          S )Nc                     g | ]
\  }}||z  S r   r   )r   r  r   s      r   r3   z1AESModeOfOperationCTR.encrypt.<locals>.<listcomp><  s     UUU&1aq1uUUUr   )
r;  r  r  rb  rv  r  r|  r#   r  r,   )rG  rW  r  s      r   rb  zAESModeOfOperationCTR.encrypt5  s    $)**S^^;;##ty'8'89L'M'MM##M##%%% $)**S^^;; %Y//	UUC	4;R,S,SUUU	"&"9#i..//"J	***r   c                 ,    |                      |          S r   r  )rG  	crypttexts     r   rk  zAESModeOfOperationCTR.decryptA  s    ||I&&&r   r   r  r   r   r   r   r     sW        < <4 D& & & &
+ 
+ 
+' ' ' ' 'r   r   )ctrcbccfbecbofb)r\  r8  __all__r   r#   r,   r0   r>  r  rangeobjectr   r
   r  r  r  r   r   r   r   r   dictr	   r   r   r   <module>r     s  l  _ _ _H H H& & &+ + +  

FF   F& & &      (l l l l l& l l l^7 7 7 7 7f 7 7 7:	+ 	+ 	+ 	+ 	+f 	+ 	+ 	+J J J J J6 J J J     8   ? ? ? ? ?3 ? ? ?B1+ 1+ 1+ 1+ 1+3 1+ 1+ 1+jC+ C+ C+ C+ C+5 C+ C+ C+N+( +( +( +( +(4 +( +( +(^4' 4' 4' 4' 4'4 4' 4' 4'p d




     s    00