
    i                     X   S SK r S SKr/ SQrS rS rS rS r \   " S
 S\
5      r " S S\
5      r " S S\
5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r\" \\\\\S9rg! \ a    \	rS rS rS	 r Nf = f)    N)AESAESModeOfOperationCTRAESModeOfOperationCBCAESModeOfOperationCFBAESModeOfOperationECBAESModeOfOperationOFBAESModesOfOperationCounterc                 B    U S   S-  U S   S-  -  U S   S-  -  U S   -  $ )Nr                      )words    6/app/mltbenv/lib/python3.13/site-packages/pyaes/aes.py_compact_wordr   =   s3    GrMd1gm,Q1=QGG    c                 &    [        S U  5       5      $ )Nc              3   8   #    U  H  n[        U5      v   M     g 7fN)ord).0cs     r   	<genexpr>#_string_to_bytes.<locals>.<genexpr>A   s     %1A   )list)texts    r   _string_to_bytesr"   @   s    %%%%r   c                 2    SR                  S U  5       5      $ )N c              3   8   #    U  H  n[        U5      v   M     g 7fr   )chr)r   bs     r   r   #_bytes_to_string.<locals>.<genexpr>D   s     *6a3q666r   )joinbinarys    r   _bytes_to_stringr,   C   s    77*6***r   c                 
    X-   $ r   r   ar'   s     r   _concat_listr0   F   s	    5Lr   c                 r    [        U [        5      (       a  U $ U  Vs/ s H  n[        U5      PM     sn$ s  snf r   )
isinstancebytesr   )r!   r   s     r   r"   r"   Q   s0    dE""K $%1A%%%s   4c                     [        U 5      $ r   r3   r*   s    r   r,   r,   W   s    V}r   c                     U [        U5      -   $ r   r5   r.   s     r   r0   r0   [   s    58|r   c                       \ rS rSrSrSSSS.r/ SQr/ SQr/ S	Qr/ S
Qr	/ SQr
/ SQr/ SQr/ SQr/ SQr/ SQr/ SQr/ SQr/ SQr/ SQr/ SQrS rS rS rSrg)r   a   zyEncapsulates 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         }               (   rK   |   w   {      k   o   rU   0   r   g   +         rE   v            rR   rS   Y   G         rP               r               &   rB   ?         4            q   rD   1      r>      #      r         rG         r@         '      u   	      ,      rA   n   Z      R   ;      rQ   )      rH      S      r      r=         [   rO         9   J   L   X         rT         C   rF   3      E      r      P   <         Q      r?            8      rJ         !   r               r:         _   rM   D            ~   =   d   ]      s   `      O      "   *         F               rI            2   :   r9   I      $   \            b   rV         y         7   m         N      rC   V         e   z      r      x   %   .            rL         t      K            p   >      f   H   r      r;   r8   rN   W                              i                           U   (                        B   h   A      -         T         (   r   r   rO   r   r]   rB   rx   r   r&  r?   r   r  r   r   ra   r   rW   r   r   rd   r  rH   r   r  rw   r  r   r   r   r   r  r   r/  rY   r  r   r   r   r   r   r   r   r   r   r(  rS   r   r   r   r   r#  r	  r   r  r   r   rb   r   rj   r   r   r  r   r   rn   r  r  r   r  r)  r  r1  rP   rm   r   rv   r   r   r   r   rC   r  r
  r   rq   r   r  r   rI   r}   r   r  r   r   r   r   r   rD   rE   r   r"  rJ   r   r9   ru   r   r   r   r   rQ   r   r   r   r   r  r   rc   rt   r-  r   r  rk   r  r   r   r   r  r[   r   rV   r  r*  r   r^   r   r   rM   rZ   r   r  rh   r   r'  r   r   r   r   r   r   ri   rN   r   r   r   r   r   r   r   r!  r   rg   rz   r   r{   r  r   rU   r$  r\   rp   r   r;   r   r   r   rA   r   r   r  r  rL   r   r   r=   rG   r   ro   r`   r   r   r   r   r  r   r   r   r   r   r~   r|   r   r   r   rf   r   r@   r   r   r   r   r   r   r   r  r   r%  r,  ry   r   r   rr   re   rl   rT   r   r   r   rF   r   r   r   r.  r   r   r0  r   r   r   r+  r8   r   r_   r>   r   r   rX   r   rs   r  r  r   rK   r  r   r:   rR   (   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  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  (   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  c           
      d   [        U5      S;  a  [        S5      eU R                  [        U5         n[        US-   5       Vs/ s H	  nS/S-  PM     snU l        [        US-   5       Vs/ s H	  nS/S-  PM     snU l        US-   S-  n[        U5      S-  n[        S[        U5      S5       Vs/ s H"  n[        R                  " SXUS-    5      S   PM$     nn[        SU5       H9  nXc   U R                  US-     US-  '   Xc   U R
                  X#S-  -
     US-  '   M;     SnUnX:  Ga  XeS-
     n	US==   U R                  U	S-	  S-     S	-  U R                  U	S
-	  S-     S-  -  U R                  U	S-     S
-  -  U R                  U	S	-	  S-     -  U R                  U   S	-  -  -  ss'   US-  nUS
:w  a%  [        SU5       H  nXc==   XcS-
     -  ss'   M     O[        SUS-  5       H  nXc==   XcS-
     -  ss'   M     XeS-  S-
     n	XeS-  ==   U R                  U	S-     U R                  U	S
-	  S-     S
-  -  U R                  U	S-	  S-     S-  -  U R                  U	S	-	  S-     S	-  -  -  ss'   [        US-  S-   U5       H  nXc==   XcS-
     -  ss'   M     Sn
X:  aQ  X:  aL  Xj   U R                  US-     US-  '   Xj   U R
                  X(S-  -
     US-  '   U
S-  n
US-  nX:  a  X:  a  ML  X:  a  GM  [        SU5       H  n[        SS5       Hy  n
U R
                  U   U
   n	U R                  U	S	-	  S-     U R                  U	S-	  S-     -  U R                  U	S
-	  S-     -  U R                  U	S-     -  U R
                  U   U
'   M{     M     g s  snf s  snf s  snf )Nr<   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__AES.__init__   s!   s8<'/00&&s3x0 &,FQJ%78%7QC!G%78 &,FQJ%78%7QC!G%78!A:*X] >DAs3xQR=SU=Sv}}T3Q<03=SU 2A&(eDHHQ!VQU#13DHHVAv&'A. 
 !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ERAY&E '
  27+AERAY&E ,a!_7D(8 9 $qD'8 9a ?!A $bD'8 9R ?!A !%bD'8 9R ?!A B
  a!R0AERAY&E 1 A&Q0*,%a Q'57U6*+AE2QQ	 &Q0= !J 6"AAq\XXa[^"&''28t*;"<"&''28t*;"<#="&''2!8t*;"<#= #'''2t+;"<#=A " #q 9 9 Vs   N#+N(1)N-c           	      n   [        U5      S:w  a  [        S5      e[        U R                  5      S-
  n/ SQu  p4n/ SQn[        SS5       Vs/ s H-  n[	        USU-  SU-  S-    5      U R                  S   U   -  PM/     nn[        SU5       H  n	[        SS5       H  nU R
                  X   S-	  S	-     U R                  XU-   S-     S-	  S	-     -  U R                  XU-   S-     S
-	  S	-     -  U R                  XU-   S-     S	-     -  U R                  U	   U   -  Xg'   M     [        R                  " U5      nM     / n
[        SS5       H  nU R                  U   U   nU
R                  U R                  X   S-	  S	-     US-	  -  S	-  5        U
R                  U R                  XU-   S-     S-	  S	-     US-	  -  S	-  5        U
R                  U R                  XU-   S-     S
-	  S	-     US
-	  -  S	-  5        U
R                  U R                  XU-   S-     S	-     U-  S	-  5        M     U
$ s  snf )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/  r0  r3  r2  r   T1T2T3T4copyappendr7  )r=  	plaintextr?  s1s2s3r/   r@  rE  rH  resultrF  s               r   encryptAES.encrypt   sb    y>R122TXX"  TZZ[]^S_`S_amIa!eAEAI67$((1+a.HS_` 6"AAq\B!6$ >?Fa<B!6$ >?@Fa<Q!6$ >?@ Fa<$!>?@ A	' " 		!A # 1A&!!$BMM4661#3r#9T"ABbBhOSWWXMM4661"f\?b#8D"@AR2XNRVVWMM4661"f\?q#8D"@ARAXNRVVWMM4661"f\?D#@ARGRVVW  + a   4H2c           	      n   [        U5      S:w  a  [        S5      e[        U R                  5      S-
  n/ SQu  p4n/ SQn[        SS5       Vs/ s H-  n[	        USU-  SU-  S-    5      U R                  S   U   -  PM/     nn[        SU5       H  n	[        SS5       H  nU R
                  X   S-	  S	-     U R                  XU-   S-     S-	  S	-     -  U R                  XU-   S-     S
-	  S	-     -  U R                  XU-   S-     S	-     -  U R                  U	   U   -  Xg'   M     [        R                  " U5      nM     / n
[        SS5       H  nU R                  U   U   nU
R                  U R                  X   S-	  S	-     US-	  -  S	-  5        U
R                  U R                  XU-   S-     S-	  S	-     US-	  -  S	-  5        U
R                  U R                  XU-   S-     S
-	  S	-     US
-	  -  S	-  5        U
R                  U R                  XU-   S-     S	-     U-  S	-  5        M     U
$ s  snf )z:Decrypt a block of cipher text using the AES block cipher.r   rL  r   )r   r   r   rM  r   r>   r   r   r   )r/  r0  r4  r2  r   T5T6T7T8rR  rS  Si)r=  
ciphertextr?  rU  rV  rW  r/   r@  rE  rH  rX  rF  s               r   decryptAES.decrypt   sb    z?b 122TXX"  U[[\^_T`aT`qmJq1uQUQY78488A;q>IT`a 6"AAq\B!6$ >?Fa<B!6$ >?@Fa<Q!6$ >?@ Fa<$!>?@ A	' " 		!A # 1A&!!$BMM477A$4$:d#BCrRxPTXXYMM477A2vlOr$9T#ABbBhOSWWXMM477A2vlO$9T#ABbQhOSWWXMM477A2vlOT$ABbHSWWX  + br[  )r4  r3  N)__name__
__module____qualname____firstlineno____doc__r1  r8  r7  ra  rN  rO  rP  rQ  r]  r^  r_  r`  r9  r:  r;  r<  rI  rY  rc  __static_attributes__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                   :    \ rS rSrSrSS jr\" S 5      rS rSr	g)	r
   i  zA counter object for the Counter (CTR) mode of operation.

To create a custom counter, you can usually just override the
increment method.c                 ^    [        SSS5       Vs/ s H
  o!U-	  S-  PM     snU l        g s  snf )Nr   i   )r2  _counter)r=  initial_valuer@  s      r   rI  Counter.__init__  s4     AGwPRTV@WY@W1Q.#5@WYYs   *c                     U R                   $ r   ro  ss    r   <lambda>Counter.<lambda>  s    qzzr   c                 
   [        [        U R                  5      S-
  SS5       H>  nU R                  U==   S-  ss'   U R                  U   S:  a    gSU R                  U'   M@     S/[        U R                  5      -  U l        g)z1Increment the counter (overflow rolls back to 0).r   rm  rn  r   N)r2  r/  ro  )r=  r@  s     r   	incrementCounter.increment  su     DMM*Q.B7AMM!!}}Q#%u  !DMM! 8  EC$66DMr   rs  Nr   )
re  rf  rg  rh  ri  rI  propertyvaluery  rj  r   r   r   r
   r
     s    
Z
 )*E7r   r
   c                   *    \ rS rSrSrS rS rS rSrg)AESBlockModeOfOperationi-  z;Super-class for AES modes of operation that require blocks.c                 $    [        U5      U l        g r   )r   _aes)r=  r>  s     r   rI   AESBlockModeOfOperation.__init__/  s    H	r   c                     [        S5      eNznot implemented	Exceptionr=  rb  s     r   rc  AESBlockModeOfOperation.decrypt2      )**r   c                     [        S5      er  r  r=  rT  s     r   rY  AESBlockModeOfOperation.encrypt5  r  r   )r  N)	re  rf  rg  rh  ri  rI  rc  rY  rj  r   r   r   r  r  -  s    E++r   r  c                       \ rS rSrSrSrg)AESStreamModeOfOperationi9  z?Super-class for AES modes of operation that are stream-ciphers.r   N)re  rf  rg  rh  ri  rj  r   r   r   r  r  9  s    Ir   r  c                       \ rS rSrSrSrSrg)AESSegmentModeOfOperationi<  z9Super-class for AES modes of operation that segment data.r   r   N)re  rf  rg  rh  ri  segment_bytesrj  r   r   r   r  r  <  s
    CMr   r  c                   (    \ rS rSrSrSrS rS rSrg)r   iC  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                     [        U5      S:w  a  [        S5      e[        U5      n[        U R                  R                  U5      5      $ Nr   z plaintext block must be 16 bytes)r/  r0  r"   r,   r  rY  r  s     r   rY  AESModeOfOperationECB.encryptT  s>    y>R?@@$Y/			 1 1) <==r   c                     [        U5      S:w  a  [        S5      e[        U5      n[        U R                  R                  U5      5      $ Nr   z!ciphertext block must be 16 bytes)r/  r0  r"   r,   r  rc  r  s     r   rc  AESModeOfOperationECB.decrypt[  s>    z?b @AA%j1
		 1 1* =>>r   r   N)	re  rf  rg  rh  ri  namerY  rc  rj  r   r   r   r   r   C  s    o 'D>?r   r   c                   2    \ rS rSrSrSrS	S jrS rS rSr	g)
r   id  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                     Uc  S/S-  U l         O*[        U5      S:w  a  [        S5      e[        U5      U l         [        R                  X5        g Nr   r   &initialization vector must be 16 bytes)_last_cipherblockr/  r0  r"   r  rI  r=  r>  ivs      r   rI  AESModeOfOperationCBC.__init__y  sG    :'(URZD"W]EFF%5b%9D"((3r   c                    [        U5      S:w  a  [        S5      e[        U5      n[        XR                  5       VVs/ s H	  u  p#X#-  PM     nnnU R
                  R                  U5      U l        [        U R                  5      $ s  snnf r  )r/  r0  r"   zipr  r  rY  r,   )r=  rT  plprecipherblocks        r   rY  AESModeOfOperationCBC.encrypt  sw    y>R?@@$Y/	14Y@V@V1WY1WvAE1WY!%!2!2>!B 6 677 Zs   Bc                    [        U5      S:w  a  [        S5      e[        U5      n[        U R                  R                  U5      U R                  5       VVs/ s H	  u  p4X4-  PM     nnnX l        [        U5      $ s  snnf r  )r/  r0  r"   r  r  rc  r  r,   )r=  rb  cipherblockr  r  rT  s         r   rc  AESModeOfOperationCBC.decrypt  sr    z?b @AA&z2,/		0A0A+0NPTPfPf,gi,g&1qu,g	i!,	** js   A<)r  r   
re  rf  rg  rh  ri  r  rI  rY  rc  rj  r   r   r   r   r   d  s    o$ )D48+r   r   c                   D    \ rS rSrSrSrS
S jr\" S 5      rS r	S r
Srg	)r   i  ak  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                     US:X  a  SnUc  S/S-  U l         O*[        U5      S:w  a  [        S5      e[        U5      U l         X0l        [
        R                  X5        g )Nr   r   r   r  )_shift_registerr/  r0  r"   _segment_bytesr  rI  )r=  r>  r  segment_sizes       r   rI  AESModeOfOperationCFB.__init__  sY    1Ql:%&52:D W]EFF!1"!5$
*((3r   c                     U R                   $ r   )r  rt  s    r   rv  AESModeOfOperationCFB.<lambda>  s
    q'7'7r   c                    [        U5      U R                  -  S:w  a  [        S5      e[        U5      n/ n[	        S[        U5      U R                  5       H  nXX0R                  -    nU R
                  R                  U R                  5      S [        U5       n[        XE5       VVs/ s H	  u  pgXg-  PM     nnn[        U R                  [        U5      S  U5      U l        UR                  U5        M     [        U5      $ s  snnf )Nr   z2plaintext block must be a multiple of segment_sizer/  r  r0  r"   r2  r  rY  r  r  r0   extendr,   )	r=  rT  	encryptedr@  plaintext_segmentxor_segmentr  xcipher_segments	            r   rY  AESModeOfOperationCFB.encrypt  s    y>D///14QRR$Y/	 	3y>4+>+>?A )Q1D1D-D E))++D,@,@ABY3GXCYZK589J5XZ5X6A5XNZ $00D0DSEXEY0Z\j#kD ^, @  	** [   'Dc                    [        U5      U R                  -  S:w  a  [        S5      e[        U5      n/ n[	        S[        U5      U R                  5       H  nXX0R                  -    nU R
                  R                  U R                  5      S [        U5       n[        XE5       VVs/ s H	  u  pgXg-  PM     nnn[        U R                  [        U5      S  U5      U l        UR                  U5        M     [        U5      $ s  snnf )Nr   z3ciphertext block must be a multiple of segment_sizer  )	r=  rb  	decryptedr@  r  r  r  r  r  s	            r   rc  AESModeOfOperationCFB.decrypt  s    z?T000A5RSS%j1
 	3z?D,?,?@A'1/B/B+BCN))++D,@,@ABV3~CVWK8;N8X Z8Xfq158X Z $00D0DSEXEY0Z\j#kD ./ A  	** ![r  )r  r  Nr{  )re  rf  rg  rh  ri  r  rI  r|  r  rY  rc  rj  r   r   r   r   r     s+    o #D4 78M+(+r   r   c                   2    \ rS rSrSrSrS	S jrS rS rSr	g)
r   i  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                     Uc  S/S-  U l         O*[        U5      S:w  a  [        S5      e[        U5      U l         / U l        [
        R                  X5        g r  )_last_precipherblockr/  r0  r"   _remaining_blockr  rI  r  s      r   rI  AESModeOfOperationOFB.__init__  sO    :*+
D%W]EFF&6r&:$
# #((3r   c                 j   / n[        U5       H  n[        U R                  5      S:X  a1  U R                  R	                  U R
                  5      U l        / U l        U R                  R                  S5      nU R
                  R                  U5        X4-  nUR                  U5        M     [        U5      $ )Nr   )	r"   r/  r  r  rY  r  poprS  r,   )r=  rT  r  r  precipherbyte
cipherbytes         r   rY  AESModeOfOperationOFB.encrypt  s    	!),A4(()Q.(,		(9(9$:S:S(T%,/) 1155a8M%%,,];*JZ( -  	**r   c                 $    U R                  U5      $ r   rY  r  s     r   rc  AESModeOfOperationOFB.decrypt	  s    ||J''r   )r  r  r   r  r   r   r   r   r     s    
o #D
4+(r   r   c                   2    \ rS rSrSrSrS	S jrS rS rSr	g)
r   i  a  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                 b    [         R                  X5        Uc
  [        5       nX l        / U l        g r   )r  rI  r
   ro  _remaining_counter)r=  r>  counters      r   rI  AESModeOfOperationCTR.__init__,  s)    ((3?iG"%r   c                    [        U R                  5      [        U5      :  a  U =R                  U R                  R                  U R                  R
                  5      -  sl        U R                  R                  5         [        U R                  5      [        U5      :  a  M  [        U5      n[        XR                  5       VVs/ s H	  u  p#X#-  PM     nnnU R                  [        U5      S  U l        [        U5      $ s  snnf r   )
r/  r  r  rY  ro  r}  ry  r"   r  r,   )r=  rT  r  r   r  s        r   rY  AESModeOfOperationCTR.encrypt5  s    $))*S^;##tyy'8'89L9L'MM#MM##% $))*S^; %Y/	,/	;R;R,SU,S&1qu,S	U"&"9"9#i./"J	** Vs   Dc                 $    U R                  U5      $ r   r  )r=  	crypttexts     r   rc  AESModeOfOperationCTR.decryptA  s    ||I&&r   )ro  r  r   r  r   r   r   r   r     s    <4 D&
+'r   r   )ctrcbccfbecbofb)rR  r5  __all__r   r"   r,   r0   r2  r  rangeobjectr   r
   r  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)