
    ;Si                     \   d dl Z d dlZg dZd Zd Zd Zd Z	 e  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y# e$ r e	Zd Zd Zd	 ZY w xY w)    N)AESAESModeOfOperationCTRAESModeOfOperationCBCAESModeOfOperationCFBAESModeOfOperationECBAESModeOfOperationOFBAESModesOfOperationCounterc                 B    | d   dz  | d   dz  z  | d   dz  z  | d   z  S )Nr                      )words    N/var/www/OnlineNewsSite/project/venv/lib/python3.12/site-packages/pyaes/aes.py_compact_wordr   =   s3    GrMd1gm,Q1=QGG    c                 &    t        d | D              S )Nc              3   2   K   | ]  }t        |        y wN)ord).0cs     r   	<genexpr>z#_string_to_bytes.<locals>.<genexpr>A   s     %1A%   )list)texts    r   _string_to_bytesr!   @   s    %%%%r   c                 2    dj                  d | D              S )N c              3   2   K   | ]  }t        |        y wr   )chr)r   bs     r   r   z#_bytes_to_string.<locals>.<genexpr>D   s     *a3q6*r   )joinbinarys    r   _bytes_to_stringr*   C   s    77*6***r   c                     | |z   S r   r   ar&   s     r   _concat_listr.   F   s    q5Lr   c                 b    t        | t              r| S | D cg c]  }t        |       c}S c c}w r   )
isinstancebytesr   )r    r   s     r   r!   r!   Q   s)    dE"K $%1A%%%s   ,c                     t        |       S r   r1   r(   s    r   r*   r*   W   s    V}r   c                     | t        |      z   S r   r3   r,   s     r   r.   r.   [   s    58|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y)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         }               (   rH   |   w   {      k   o   rR   0   r   g   +         rB   v            rO   rP   Y   G         rM               r               &   r?   ?         4            q   rA   1      r;      #      r         rD         r=         '      u   	      ,      r>   n   Z      R   ;      rN   )      rE      S      r      r:         [   rL         9   J   L   X         rQ         C   rC   3      E      r      P   <         Q      r<            8      rG         !   r               r7         _   rJ   D            ~   =   d   ]      s   `      O      "   *         F               rF            2   :   r6   I      $   \            b   rS         y         7   m         N      r@   V         e   z      r      x   %   .            rI         t      K            p   >      f   H   r      r8   a   rK   W                              i                           U   (                        B   h   A      -         T         (   r   r   rL   r   rZ   r?   ru   r   r$  r<   r   r  r   r   r^   r   rT   r   r   ra   r  rE   r   r  rt   r  r   r   r   r   r  r   r-  rV   r  r   r   r   r|   r   r   r   r   r   r&  rP   r}   r   r   r   r!  r  r  r  r   r   r_   r   rg   r   r   r  r   r   rk   r  r  r   r  r'  r  r/  rM   rj   r   rs   r   r   r   r   r@   r  r  r   rn   r   r  r   rF   rz   r   r
  r   r   r   r   r   rA   rB   r   r   rG   r   r6   rr   r   r   r   r   rN   r   r   r   r   r  r   r`   rq   r+  r   r  rh   r   r   r   r   r  rX   r   rS   r  r(  r   r[   r   r   rJ   rW   r   r  re   r   r%  r   r~   r   r   r   r   rf   rK   r   r   r   r   r   r   r   r  r   rd   rw   r   rx   r  r   rR   r"  rY   rm   r   r8   r   r   r   r>   r   r   r  r   rI   r   r   r:   rD   r   rl   r]   r   r   r   r   r   r   r   r   r   r   r{   ry   r   r   r   rc   r   r=   r   r   r   r   r   r   r   r  r   r#  r*  rv   r   r   ro   rb   ri   rQ   r   r   r   rC   r   r   r   r,  r   r   r.  r   r   r   r)  r	  r   r\   r;   r   r   rU   r   rp   r  r  r   rH   r  r   r7   rO   (   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  r`  r1  r  r[  r-  r  r  r  r  r  r  r  r)  r  rw  r  r  r  r  r  r  r  r  r  r  r,  r  rV  rf  ro  r&  r  rd  r  r  r   r  r  ra  rE  r4  r  rS  r  rH  r  r5  r  r7  rB  r  r  r  rW  r  r  r9  r  r\  rJ  rK  r  r  r  r  rk  r  r  rY  r  r_  r  r  r   r0  r  rP  r+  r  r  r  r  r  ri  rz  r|  r  r  r  r  r  r*  rs  r}  rc  r  ru  r(  r2  r  r  rl  r  r  r  r  rp  r  r  r  rh  r$  r  r  r	  rQ  r@  r.  r"  r  r  r<  rC  r  r  r  rt  rG  r  r  r  rm  r  r  rI  r  r  r  r  r  rR  rZ  r  r  rv  r  r  rD  r  r  r;  r
  r  rb  rj  r:  ry  r6  rT  r  r  r  r  r  r  r  r  r  r  r  rg  r  r  r  r~  r  r  r  r#  r  r  r  r  r8  r  r  rU  r^  rL  r  r  r  r  r  r  rO  r{  r  r  r  r  rn  r  r  rx  r3  r%  r>  r  re  r  r  r  r  rM  r  r  r'  r  rA  r  r  r  r  r  rN  r  r  r  r  rX  r  r  r  r  r=  r  r  rr  r  rq  r  r]  r?  r  r  r  rF  (   r   r  r  r  r   r  r  r  r_  r0  r  rZ  r,  r  r  r  r  r  r  r  r(  r  rv  r  r  r  r  r  r  r  r  r  r  r+  r  rU  re  rn  r%  r  rc  r  r  r  r  r  r`  rD  r3  r  rR  r  rG  r  r4  r  r6  rA  r  r  r  rV  r  r  r8  r  r[  rI  rJ  r  r  r  r  rj  r  r  rX  r  r^  r  r  r  r/  r  rO  r*  r  r  r  r  r  rh  ry  r{  r  r  r  r  r  r)  rr  r|  rb  r  rt  r'  r1  r  r  rk  r  r  r  r  ro  r  r  r  rg  r#  r  r  r  rP  r?  r-  r!  r   r  r;  rB  r  r  r  rs  rF  r  r  r  rl  r  r  rH  r  r  r  r~  r
  rQ  rY  r  r  ru  r  r  rC  r  r  r:  r	  r  ra  ri  r9  rx  r5  rS  r  r  r  r  r  r  r  r  r  r  r  rf  r  r  r  r}  r  r  r  r"  r  r  r  r  r7  r  r  rT  r]  rK  r  r  r  r  r  r  rN  rz  r  r  r  r  rm  r  r  rw  r2  r$  r=  r  rd  r  r  r  r  rL  r  r  r&  r  r@  r  r  r  r  r  rM  r  r  r  r  rW  r  r  r  r  r<  r  r  rq  r  rp  r  r\  r>  r  r  r  rE  (   r   r  r  r  r  r  r  r  r^  r/  r  rY  r+  r  r  r  r  r  r  r  r'  r  ru  r  r  r  r  r  r  r  r  r  r  r*  r  rT  rd  rm  r$  r  rb  r  r  r  r  r  r_  rC  r2  r  rQ  r  rF  r  r3  r  r5  r@  r  r  r  rU  r  r  r7  r  rZ  rH  rI  r  r  r  r  ri  r  r  rW  r  r]  r  r  r  r.  r  rN  r)  r  r  r  r  r  rg  rx  rz  r  r  r  r  r  r(  rq  r{  ra  r  rs  r&  r0  r  r~  rj  r  r  r  r  rn  r  r  r  rf  r"  r  r  r  rO  r>  r,  r   r  r  r:  rA  r  r  r  rr  rE  r  r  r  rk  r  r  rG  r  r  r  r}  r	  rP  rX  r  r  rt  r  r  rB  r  r  r9  r  r  r`  rh  r8  rw  r4  rR  r  r  r   r  r  r  r  r  r  r  r  re  r  r  r  r|  r  r  r  r!  r  r  r  r  r6  r  r  rS  r\  rJ  r  r  r  r  r
  r  rM  ry  r  r  r  r  rl  r  r  rv  r1  r#  r<  r  rc  r  r  r  r  rK  r  r  r%  r  r?  r  r  r  r  r  rL  r  r  r  r  rV  r  r  r  r  r;  r  r  rp  r  ro  r  r[  r=  r  r  r  rD  (   r   r  r  r  r  r  r  r  r]  r.  r  rX  r*  r  r  r  r  r  r  r  r&  r  rt  r  r  r   r  r  r  r  r  r  r  r)  r  rS  rc  rl  r#  r  ra  r  r  r  r  r  r^  rB  r1  r  rP  r  rE  r  r2  r  r4  r?  r  r  r  rT  r  r  r6  r  rY  rG  rH  r  r  r  r  rh  r  r  rV  r  r\  r  r  r  r-  r  rM  r(  r  r  r  r  r  rf  rw  ry  r  r  r  r  r  r'  rp  rz  r`  r  rr  r%  r/  r  r}  ri  r  r  r~  r  rm  r  r  r  re  r!  r  r  r  rN  r=  r+  r  r  r  r9  r@  r  r  r  rq  rD  r  r  r  rj  r  r  rF  r  r  r  r|  r  rO  rW  r  r  rs  r  r  rA  r
  r  r8  r  r  r_  rg  r7  rv  r3  rQ  r  r  r  r  r  r  r  r  r  r  r  rd  r  r  r  r{  r  r  r  r   r  r  r  r  r5  r  r  rR  r[  rI  r  r  r  r  r	  r  rL  rx  r  r  r  r  rk  r  r  ru  r0  r"  r;  r  rb  r  r  r  r  rJ  r  r  r$  r  r>  r  r  r  r  r  rK  r  r  r  r  rU  r  r  r  r  r:  r  r  ro  r  rn  r  rZ  r<  r  r  r  rC  c           
      N   t        |      dvrt        d      | j                  t        |         }t        |dz         D cg c]  }dgdz  
 c}| _        t        |dz         D cg c]  }dgdz  
 c}| _        |dz   dz  }t        |      dz  }t        dt        |      d      D cg c]!  }t        j                  d|||dz          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
k7  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  rS||k  rN||
   | j                  |dz     |dz  <   ||
   | j
                  ||dz  z
     |dz  <   |
dz  }
|dz  }|
|k  r||k  rN||k  rt        d|      D ]  }t        dd      D ]x  }
| j
                  |   |
   }	| j                  |	d	z	  dz     | j                  |	dz	  dz     z  | j                  |	d
z	  dz     z  | j                  |	dz     z  | j
                  |   |
<   z  y c c}w c c}w c c}w )Nr9   zInvalid key sizer   r   r;   z>ir   r   r   r   r   )len
ValueErrornumber_of_roundsxrange_Ke_KdstructunpackSrconU1U2U3U4)selfkeyroundsiround_key_countKCtkrconpointertttjrs               r   __init__zAES.__init__   s\   s8<'/00&&s3x0 &,FQJ%78QC!G8 &,FQJ%78QC!G8!A:*X] >DAs3xQR=SUv}}T3qQ<03UU 2 	7A&(eDHHQ!VQU#13ADHHVqAv&'A.	7
 /!BFBqEtvvrRx4/0B6vvrax4/0B68vvr4/0Q68 vvrRx4/01 yy-3	5 6E
 1KQw2 'AqERAY&E'
  27+ 'AqERAY&E'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 'AqERAY&E' Ab&Q0*,Q%a Q'57U16*+AE2QQ	 b&Q0= /!J 6" 	>AAq\ >XXa[^"&''28t*;"<"&''28t*;"<#="&''2!8t*;"<#= #'''2t+;"<#=A>	>q 9 9 Vs   N&N)&N"c           	      l   t        |      dk7  rt        d      t        | j                        dz
  }g d\  }}}g d}t        dd      D cg c],  }t	        |d|z  d|z  dz          | j                  d   |   z  . }}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                  | j                  ||   dz	  d	z     |dz	  z  d	z         |
j                  | j                  |||z   dz     dz	  d	z     |dz	  z  d	z         |
j                  | j                  |||z   dz     d
z	  d	z     |d
z	  z  d	z         |
j                  | j                  |||z   dz     d	z     |z  d	z          |
S c c}w )z9Encrypt a block of plain text using the AES block cipher.r   wrong block lengthr   )r   r   r   r   r   r   r   r   r;   r   r   r   )r-  r.  r1  r0  r   T1T2T3T4copyappendr5  )r;  	plaintextr=  s1s2s3r-   r>  rC  rF  resultrD  s               r   encryptzAES.encrypt   s    y>R122TXX" R TZZ[]^S_`amIa!eAEAI67$((1+a.H`` 6" 	AAq\ (AB!6$ >?AFa<B!6$ >?@AFa<Q!6$ >?@ AFa<$!>?@ A	'!( 		!A	 1 	XA&!!$BMM4661a#3r#9T"ABbBhOSWWXMM4661a"f\?b#8D"@AR2XNRVVWMM4661a"f\?q#8D"@ARAXNRVVWMM4661a"f\?D#@ARGRVVW	X + a   1H1c           	      l   t        |      dk7  rt        d      t        | j                        dz
  }g d\  }}}g d}t        dd      D cg c],  }t	        |d|z  d|z  dz          | j                  d   |   z  . }}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                  | j                  ||   dz	  d	z     |dz	  z  d	z         |
j                  | j                  |||z   dz     dz	  d	z     |dz	  z  d	z         |
j                  | j                  |||z   dz     d
z	  d	z     |d
z	  z  d	z         |
j                  | j                  |||z   dz     d	z     |z  d	z          |
S c c}w )z:Decrypt a block of cipher text using the AES block cipher.r   rI  r   )r   r   r   rJ  r   r;   r   r   r   )r-  r.  r2  r0  r   T5T6T7T8rO  rP  Si)r;  
ciphertextr=  rR  rS  rT  r-   r>  rC  rF  rU  rD  s               r   decryptzAES.decrypt   s    z?b 122TXX" R U[[\^_T`aqmJq1uQUQY78488A;q>Iaa 6" 	AAq\ (AB!6$ >?AFa<B!6$ >?@AFa<Q!6$ >?@ AFa<$!>?@ A	'!( 		!A	 1 	YA&!!$BMM477Aq$4$:d#BCrRxPTXXYMM477Aq2vlOr$9T#ABbBhOSWWXMM477Aq2vlO$9T#ABbQhOSWWXMM477Aq2vlOT$ABbHSWWX	Y + brW  N)__name__
__module____qualname____doc__r/  r6  r5  r]  rK  rL  rM  rN  rY  rZ  r[  r\  r7  r8  r9  r:  rG  rV  r_  r   r   r   r   r   a   s     BB/ BD 	KA 	KB 
L0B 
L0B 
L0B 
L0B 
L0B 
L0B 
L0B 
L0B 
L0B 
L0B 
L0B 
L0BF>P D r   r   c                   0    e Zd ZdZddZ ed       Zd Zy)r
   zA counter object for the Counter (CTR) mode of operation.

       To create a custom counter, you can usually just override the
       increment method.c                 Z    t        ddd      D cg c]
  }||z	  dz   c}| _        y c c}w )Nr   i   )r0  _counter)r;  initial_valuer>  s      r   rG  zCounter.__init__  s0     AGwPRTV@WY1MQ.#5YYs   (c                     | j                   S r   )rh  ss    r   <lambda>zCounter.<lambda>  s
    qzz r   c                    t        t        | j                        dz
  dd      D ]<  }| j                  |xx   dz  cc<   | j                  |   dk  r yd| j                  |<   > dgt        | j                        z  | _        y)z1Increment the counter (overflow rolls back to 0).r   rf  rg  r   N)r0  r-  rh  )r;  r>  s     r   	incrementzCounter.increment  sz     DMM*Q.B7 
	7AMM!!}}Q#%u  !DMM!
	7  EC$66DMr   Nr   )r`  ra  rb  rc  rG  propertyvaluero  r   r   r   r
   r
     s    
Z
 )*E7r   r
   c                   "    e Zd ZdZd Zd Zd Zy)AESBlockModeOfOperationz;Super-class for AES modes of operation that require blocks.c                 $    t        |      | _        y r   )r   _aes)r;  r<  s     r   rG  z AESBlockModeOfOperation.__init__/  s    H	r   c                     t        d      Nznot implemented	Exceptionr;  r^  s     r   r_  zAESBlockModeOfOperation.decrypt2      )**r   c                     t        d      rx  ry  r;  rQ  s     r   rV  zAESBlockModeOfOperation.encrypt5  r|  r   N)r`  ra  rb  rc  rG  r_  rV  r   r   r   rt  rt  -  s    E++r   rt  c                       e Zd ZdZy)AESStreamModeOfOperationz?Super-class for AES modes of operation that are stream-ciphers.N)r`  ra  rb  rc  r   r   r   r  r  9  s    Ir   r  c                       e Zd ZdZdZy)AESSegmentModeOfOperationz9Super-class for AES modes of operation that segment data.r   N)r`  ra  rb  rc  segment_bytesr   r   r   r  r  <  s
    CMr   r  c                        e Zd ZdZdZd Zd Zy)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k7  rt        d      t        |      }t        | j                  j                  |            S Nr   z plaintext block must be 16 bytes)r-  r.  r!   r*   rv  rV  r~  s     r   rV  zAESModeOfOperationECB.encryptT  s>    y>R?@@$Y/			 1 1) <==r   c                     t        |      dk7  rt        d      t        |      }t        | j                  j                  |            S Nr   z!ciphertext block must be 16 bytes)r-  r.  r!   r*   rv  r_  r{  s     r   r_  zAESModeOfOperationECB.decrypt[  s>    z?b @AA%j1
		 1 1* =>>r   N)r`  ra  rb  rc  namerV  r_  r   r   r   r   r   C  s    o 'D>?r   r   c                   (    e Zd ZdZdZddZd Zd Zy)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  | _         n)t        |      dk7  rt        d      t        |      | _         t        j                  | |       y Nr   r   &initialization vector must be 16 bytes)_last_cipherblockr-  r.  r!   rt  rG  r;  r<  ivs      r   rG  zAESModeOfOperationCBC.__init__y  sI    :'(URZD"W]EFF%5b%9D"((s3r   c                    t        |      dk7  rt        d      t        |      }t        || j                        D cg c]
  \  }}||z   }}}| j
                  j                  |      | _        t        | j                        S c c}}w r  )r-  r.  r!   zipr  rv  rV  r*   )r;  rQ  plprecipherblocks        r   rV  zAESModeOfOperationCBC.encrypt  sz    y>R?@@$Y/	14Y@V@V1WYv1AEYY!%!2!2>!B 6 677 Zs   Bc                    t        |      dk7  rt        d      t        |      }t        | j                  j                  |      | j                        D cg c]
  \  }}||z   }}}|| _        t        |      S c c}}w r  )r-  r.  r!   r  rv  r_  r  r*   )r;  r^  cipherblockr  r  rQ  s         r   r_  zAESModeOfOperationCBC.decrypt  su    z?b @AA&z2,/		0A0A+0NPTPfPf,gi&1aq1ui	i!,	** js   A;r   r`  ra  rb  rc  r  rG  rV  r_  r   r   r   r   r   d  s    o$ )D48+r   r   c                   :    e Zd ZdZdZddZ ed       Zd Zd Z	y)	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)c                     |dk(  rd}|dgdz  | _         n)t        |      dk7  rt        d      t        |      | _         || _        t
        j                  | |       y )Nr   r   r   r  )_shift_registerr-  r.  r!   _segment_bytesrt  rG  )r;  r<  r  segment_sizes       r   rG  zAESModeOfOperationCFB.__init__  s]    1Ql:%&52:D W]EFF!1"!5$
*((s3r   c                     | j                   S r   )r  rk  s    r   rm  zAESModeOfOperationCFB.<lambda>  s    q'7'7 r   c                    t        |      | j                  z  dk7  rt        d      t        |      }g }t	        dt        |      | j                        D ]  }|||| j                  z    }| j
                  j                  | j                        d t        |       }t        ||      D cg c]
  \  }}||z   }}}t        | j                  t        |      d  |      | _        |j                  |        t        |      S c c}}w )Nr   z2plaintext block must be a multiple of segment_sizer-  r  r.  r!   r0  rv  rV  r  r  r.   extendr*   )	r;  rQ  	encryptedr>  plaintext_segmentxor_segmentr  xcipher_segments	            r   rV  zAESModeOfOperationCFB.encrypt  s   y>D///14QRR$Y/	 	3y>4+>+>? 	-A )!Q1D1D-D E))++D,@,@ABY3GXCYZK589JK5XZ6AqAZNZ $00D0DSEXEY0Z\j#kD ^,	-  	** [   )D c                    t        |      | j                  z  dk7  rt        d      t        |      }g }t	        dt        |      | j                        D ]  }|||| j                  z    }| j
                  j                  | j                        d t        |       }t        ||      D cg c]
  \  }}||z   }}}t        | j                  t        |      d  |      | _        |j                  |        t        |      S c c}}w )Nr   z3ciphertext block must be a multiple of segment_sizer  )	r;  r^  	decryptedr>  r  r  r  r  r  s	            r   r_  zAESModeOfOperationCFB.decrypt  s    z?T000A5RSS%j1
 	3z?D,?,?@ 	0A'1t/B/B+BCN))++D,@,@ABV3~CVWK8;NK8X Zfq!1q5 Z Z $00D0DSEXEY0Z\j#kD ./	0  	** ![r  Nrp  )
r`  ra  rb  rc  r  rG  rq  r  rV  r_  r   r   r   r   r     s+    o #D4 78M+(+r   r   c                   (    e Zd ZdZdZddZd Zd Zy)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  | _         n)t        |      dk7  rt        d      t        |      | _         g | _        t
        j                  | |       y r  )_last_precipherblockr-  r.  r!   _remaining_blockrt  rG  r  s      r   rG  zAESModeOfOperationOFB.__init__  sQ    :*+
D%W]EFF&6r&:$
# #((s3r   c                 f   g }t        |      D ]  }t        | j                        dk(  r1| j                  j	                  | j
                        | _        g | _        | j                  j                  d      }| j
                  j                  |       ||z  }|j                  |        t        |      S )Nr   )	r!   r-  r  rv  rV  r  poprP  r*   )r;  rQ  r  r  precipherbyte
cipherbytes         r   rV  zAESModeOfOperationOFB.encrypt  s    	!), 	)A4(()Q.(,		(9(9$:S:S(T%,/) 1155a8M%%,,];]*JZ(	)  	**r   c                 $    | j                  |      S r   rV  r{  s     r   r_  zAESModeOfOperationOFB.decrypt	  s    ||J''r   r   r  r   r   r   r   r     s    
o #D
4+(r   r   c                   (    e Zd ZdZdZddZd Zd Zy)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                 d    t         j                  | |       |
t               }|| _        g | _        y r   )rt  rG  r
   rh  _remaining_counter)r;  r<  counters      r   rG  zAESModeOfOperationCTR.__init__,  s-    ((s3?iG"%r   c                    t        | j                        t        |      k  r~| xj                  | j                  j                  | j                  j
                        z  c_        | j                  j                          t        | j                        t        |      k  r~t        |      }t        || j                        D cg c]
  \  }}||z   }}}| j                  t        |      d  | _        t        |      S c c}}w r   )
r-  r  rv  rV  rh  rr  ro  r!   r  r*   )r;  rQ  r  r   r  s        r   rV  zAESModeOfOperationCTR.encrypt5  s    $))*S^;##tyy'8'89L9L'MM#MM##% $))*S^; %Y/	,/	4;R;R,SU&1aq1uU	U"&"9"9#i./"J	** Vs   C>c                 $    | j                  |      S r   r  )r;  	crypttexts     r   r_  zAESModeOfOperationCTR.decryptA  s    ||I&&r   r   r  r   r   r   r   r     s    <4 D&
+'r   r   )ctrcbccfbecbofb)rO  r3  __all__r   r!   r*   r.   r0  rz  rangeobjectr   r
   rt  r  r  r   r   r   r   r   dictr	   r   r   r   <module>r     s   l  _H&+

*l& l^7f 7:	+f 	+J6 J 8 ?3 ?B1+3 1+jC+5 C+N+(4 +(^4'4 4'p 




 u  F&s   B B+*B+