o
    j                     @   s&  d dl Z d dlZg dZdd Zdd Zdd Zd	d
 Zze W n ey7   e	Zdd Zdd Zdd
 ZY nw G dd de
ZG dd de
ZG dd de
ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG d d! d!eZeeeeeed"ZdS )#    N)AESAESModeOfOperationCTRAESModeOfOperationCBCAESModeOfOperationCFBAESModeOfOperationECBAESModeOfOperationOFBAESModesOfOperationCounterc                 C   s,   | d d> | d d> B | d d> B | d B S )Nr                      )wordr   r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/unicrypto/backends/pure/external/AES/AES.py_compact_word?   s   ,r   c                 C   s   t dd | D S )Nc                 s       | ]}t |V  qd S Nord.0cr   r   r   	<genexpr>C       z#_string_to_bytes.<locals>.<genexpr>)listtextr   r   r   _string_to_bytesB   s   r    c                 C   s   d dd | D S )N c                 s   r   r   )chr)r   br   r   r   r   F   r   z#_bytes_to_string.<locals>.<genexpr>)joinbinaryr   r   r   _bytes_to_stringE   s   r'   c                 C   s   | | S r   r   ar#   r   r   r   _concat_listH      r*   c                 C   s   t | tr| S dd | D S )Nc                 S   s   g | ]}t |qS r   r   r   r   r   r   
<listcomp>V   s    z$_string_to_bytes.<locals>.<listcomp>)
isinstancebytesr   r   r   r   r    S   s   
c                 C   s   t | S r   r.   r%   r   r   r   r'   Y   r+   c                 C   s   | t | S r   r/   r(   r   r   r   r*   ]   s   c                   @   s   e Zd ZdZddddZg dZg dZg dZg d	Zg d
Z	g dZ
g dZg dZg dZg dZg dZg dZg dZg dZg dZdd Zdd Zdd ZdS )r   zEncapsulates the AES block cipher.

    You generally should not need this. Use the AESModeOfOperation classes
    below instead.
         r   r
       )r   r      r   r   r4   @         6   l         M      /   ^      c         5   j         }               (   rB   |   w   {      k   o   rL   0   r   g   +         r<   v            rI   rJ   Y   G         rG               r               &   r9   ?         4            q   r;   1      r5      #      r
         r>         r7         '      u   	      ,      r8   n   Z      R   ;      rH   )      r?      S      r      r4         [   rF         9   J   L   X         rK         C   r=   3      E      r      P   <         Q      r6            8      rA         !   r               r1         _   rD   D            ~   =   d   ]      s   `      O      "   *         F               r@            2   :   r0   I      $   \            b   rM         y         7   m         N      r:   V         e   z      r      x   %   .            rC         t      K            p   >      f   H   r      r2   a   rE   W                              i                           U   (                        B   h   A      -         T         (   r   r   rF   r   rT   r9   ro   r   r  r6   r   r	  r   r   rX   r   rN   r   r   r[   r  r?   r   r  rn   r  r   r   r   r   r  r   r'  rP   r  r   r   r   rv   r   r   r   r   r   r   rJ   rw   r   r   r   r  r   r  r  r   r   rY   r   ra   r   r   r   r   r   re   r  r  r   r  r!  r  r)  rG   rd   r   rm   r   r   r   r   r:   r   r  r   rh   r   r  r   r@   rt   r   r  r   r   r   r   r   r;   r<   r   r  rA   r   r0   rl   r   r   ry   r   rH   r   r   r   r   r  r   rZ   rk   r%  r   r  rb   r   r   r   r   r   rR   r   rM   r  r"  r   rU   r   r   rD   rQ   r   r  r_   r   r  r   rx   r   r   r   r   r`   rE   r   r|   r   r   r   r   r   r  r   r^   rq   r   rr   r  r   rL   r  rS   rg   r   r2   r   r
   r   r8   r   r   r   r   rC   r   r   r4   r>   r   rf   rW   r   r   r   r   r   r   r   r   r   rz   ru   rs   r   r{   r   r]   r~   r7   r   r   r   r   r   r   r   r   r   r  r$  rp   r   r   ri   r\   rc   rK   r   r   r   r=   r   r   r   r&  r   r}   r(  r   r   r   r#  r  r   rV   r5   r   r   rO   r   rj   r
  r  r   rB   r  r   r1   rI   (   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  rZ  r+  r  rU  r'  r   r  r  r  r  r  r  r#  r  rq  r  r  r  r  r  r  r  r  r  r  r&  r  rP  r`  ri  r   r  r^  r  r  r  r  r  r[  r?  r.  r  rM  r  rB  r  r/  r  r1  r<  r  r  r  rQ  r  r  r3  r  rV  rD  rE  r  r  r  r|  re  r  r  rS  r  rY  r  r}  r  r*  r  rJ  r%  r  r  r  r  r  rc  rt  rv  r  r  r  r  r  r$  rm  rw  r]  r  ro  r"  r,  r  rz  rf  r  r  r{  r  rj  r  r  r  rb  r  r  r  r  rK  r:  r(  r  r  r  r6  r=  r  r  r  rn  rA  r  r  r  rg  r  r  rC  r  r  r  ry  r  rL  rT  r  r  rp  r  r  r>  r  r  r5  r  r	  r\  rd  r4  rs  r0  rN  r  r  r  r  r  r  r  r  r  r  r  ra  r  r  r  rx  r  r  r  r  r  r  r  r  r2  r  r  rO  rX  rF  r  r  r  r  r  r  rI  ru  r  r  r  r  rh  r  r  rr  r-  r  r8  r  r_  r  r  r  r  rG  r  r
  r!  r  r;  r  r  r  r  r  rH  r  r  r  r  rR  r  r  r  r  r7  r  r  rl  r  rk  r  rW  r9  r  r~  r  r@  (   r   r  r  r  r  r  r  r  rY  r*  r  rT  r&  r  r  r  r  r  r  r  r"  r  rp  r  r  r  r  r  r  r  r  r  r  r%  r  rO  r_  rh  r  r  r]  r  r  r  r  r   rZ  r>  r-  r  rL  r  rA  r  r.  r  r0  r;  r  r
  r  rP  r  r  r2  r  rU  rC  rD  r  r  r  r{  rd  r  r  rR  r  rX  r  r|  r  r)  r  rI  r$  r  r  r  r  r  rb  rs  ru  r  r  r  r  r  r#  rl  rv  r\  r  rn  r!  r+  r  ry  re  r  r  rz  r  ri  r  r  r  ra  r  r  r  r  rJ  r9  r'  r  r  r  r5  r<  r  r  r  rm  r@  r  r  r  rf  r  r  rB  r  r  r  rx  r  rK  rS  r  r  ro  r  r  r=  r  r  r4  r  r  r[  rc  r3  rr  r/  rM  r  r  r  r  r  r  r  r  r  r  r  r`  r  r  r  rw  r  r  r  r  r  r  r  r  r1  r  r  rN  rW  rE  r  r  r  r  r  r  rH  rt  r  r  r  r  rg  r  r  rq  r,  r  r7  r  r^  r  r  r  r  rF  r  r	  r   r  r:  r  r  r  r  r  rG  r  r  r  r~  rQ  r  r  r  r  r6  r  r  rk  r  rj  r  rV  r8  r  r}  r  r?  (   r   r  r  r  r  r  r  r  rX  r)  r  rS  r%  r  r  r  r  r  r  r  r!  r  ro  r  r  r  r  r  r  r  r  r  r  r$  r  rN  r^  rg  r  r  r\  r  r  r  r  r  rY  r=  r,  r  rK  r  r@  r  r-  r  r/  r:  r  r	  r  rO  r  r  r1  r  rT  rB  rC  r  r  r  rz  rc  r  r  rQ  r
  rW  r  r{  r  r(  r  rH  r#  r  r  r  r  r  ra  rr  rt  r  r  r  r  r  r"  rk  ru  r[  r  rm  r   r*  r  rx  rd  r  r  ry  r  rh  r  r  r  r`  r  r  r  r  rI  r8  r&  r  r  r  r4  r;  r  r  r  rl  r?  r  r  r  re  r  r  rA  r  r  r  rw  r  rJ  rR  r  r  rn  r  r  r<  r  r  r3  r  r  rZ  rb  r2  rq  r.  rL  r  r  r  r  r  r  r  r  r  r  r  r_  r  r  r  rv  r  r  r~  r  r  r  r  r  r0  r  r  rM  rV  rD  r  r  r  r  r  r  rG  rs  r  r  r  r  rf  r  r  rp  r+  r  r6  r  r]  r  r  r  r  rE  r  r  r  r  r9  r  r   r  r  r  rF  r  r  r  r}  rP  r  r  r  r  r5  r  r  rj  r  ri  r  rU  r7  r  r|  r  r>  (   r   r  r  r  r  r  r  r  rW  r(  r  rR  r$  r  r  r  r  r  r  r  r   r  rn  r  r  r  r  r  r  r  r  r  r  r#  r  rM  r]  rf  r  r  r[  r  r  r  r  r  rX  r<  r+  r  rJ  r  r?  r  r,  r  r.  r9  r  r  r  rN  r  r  r0  r  rS  rA  rB  r  r  r  ry  rb  r  r  rP  r	  rV  r  rz  r  r'  r  rG  r"  r  r  r  r  r  r`  rq  rs  r  r  r  r  r  r!  rj  rt  rZ  r  rl  r  r)  r  rw  rc  r  r  rx  r  rg  r  r  r  r_  r  r  r  r   rH  r7  r%  r  r  r  r3  r:  r  r  r  rk  r>  r  r  r  rd  r  r  r@  r  r  r  rv  r  rI  rQ  r  r  rm  r  r  r;  r  r  r2  r  r  rY  ra  r1  rp  r-  rK  r  r  r  r  r  r  r  r
  r  r  r  r^  r  r  r  ru  r  r  r}  r  r  r  r  r  r/  r  r  rL  rU  rC  r  r  r  r  r  r  rF  rr  r  r  r  r  re  r  r  ro  r*  r  r5  r  r\  r~  r  r  r  rD  r  r  r  r  r8  r  r  r  r  r  rE  r  r  r  r|  rO  r  r  r  r  r4  r  r  ri  r  rh  r  rT  r6  r  r{  r  r=  c                    s`  t  dvr
td| jt   }dd t|d D | _dd t|d D | _|d d }t  d } fddtd	t  dD }td	|D ]}|| | j|d  |d < || | j||d   |d < qId	}|}||k rn||d  }	|d	  | j|	d
? d@  d> | j|	d? d@  d
> A | j|	d@  d> A | j|	d? d@  A | j| d> A N  < |d7 }|dkrtd|D ]}||  ||d  N  < qngtd|d D ]}||  ||d  N  < q||d d  }	||d   | j|	d@  | j|	d? d@  d> A | j|	d
? d@  d
> A | j|	d? d@  d> A N  < t|d d |D ]}||  ||d  N  < q d	}
|
|k rj||k rj||
 | j|d  |d < ||
 | j||d   |d < |
d7 }
|d7 }|
|k rj||k s<||k sqtd|D ]:}td	dD ]1}
| j| |
 }	| j|	d? d@  | j	|	d
? d@  A | j
|	d? d@  A | j|	d@  A | j| |
< qzqsd S )Nr3   zInvalid key sizec                 S      g | ]}d gd qS r   r5   r   r   ir   r   r   r,          z AES.__init__.<locals>.<listcomp>r   c                 S   r&  r'  r   r(  r   r   r   r,      r*  r5   c              	      s(   g | ]}t d  ||d  d qS )z>ir5   r   )structunpackr(  keyr   r   r,      s   ( 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tkr)  rconpointertttjrr   r-  r   __init__   sz    
%zAES.__init__c                      t  dkr
tdt jd }g d\}}}g d} fddtdd	D }td|D ]N}tdd	D ]A}	j||	 d
? d@  j||	| d	  d? d@  A j||	| d	  d? d@  A j||	| d	  d@  A j| |	 A ||	< q5t|}q.g }
tdd	D ]a}	j| |	 }|
	j
||	 d
? d@  |d
? A d@  |
	j
||	| d	  d? d@  |d? A d@  |
	j
||	| d	  d? d@  |d? A d@  |
	j
||	| d	  d@  |A d@  q|
S )z9Encrypt a block of plain text using the AES block cipher.r   wrong block lengthr   )r   r   r   r   r   r   r   c                    6   g | ]}t  d | d | d   jd | A qS r5   r   )r   r3  r(  	plaintextr;  r   r   r,         6 zAES.encrypt.<locals>.<listcomp>r   r5   r
   r   r   )r/  r0  r3  r2  T1T2T3T4copyappendr5  )r;  rL  r<  s1s2s3r)   rA  rD  r)  resultrB  r   rK  r   encrypt   4   
(00*zAES.encryptc                    rF  )z:Decrypt a block of cipher text using the AES block cipher.r   rG  r   )r   r   r   rH  c                    rI  rJ  )r   r4  r(  
ciphertextr;  r   r   r,      rM  zAES.decrypt.<locals>.<listcomp>r   r5   r
   r   r   )r/  r0  r4  r2  T5T6T7T8rR  rS  Si)r;  r[  r<  rT  rU  rV  r)   rA  rD  r)  rW  rB  r   rZ  r   decrypt   rY  zAES.decryptN)__name__
__module____qualname____doc__r1  r6  r5  r`  rN  rO  rP  rQ  r\  r]  r^  r_  r7  r8  r9  r:  rE  rX  ra  r   r   r   r   r   c   s*    H"r   c                   @   s.   e Zd ZdZd
ddZedd Zdd Zd	S )r	   zA counter object for the Counter (CTR) mode of operation.

       To create a custom counter, you can usually just override the
       increment method.r   c                    s     fddt dddD | _d S )Nc                    s   g | ]} |? d  qS )   r   r(  initial_valuer   r   r,         z$Counter.__init__.<locals>.<listcomp>r   i)r2  _counter)r;  rh  r   rg  r   rE    s    zCounter.__init__c                 C      | j S r   )rk  sr   r   r   <lambda>      zCounter.<lambda>c                 C   sb   t t| jd ddD ]}| j|  d7  < | j| dk r  dS d| j|< qdgt| j | _dS )z1Increment the counter (overflow rolls back to 0).r   rj  rf  r   N)r2  r/  rk  )r;  r)  r   r   r   	increment  s
   zCounter.incrementNr   )rb  rc  rd  re  rE  propertyvaluerq  r   r   r   r   r	     s
    
r	   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	AESBlockModeOfOperationz;Super-class for AES modes of operation that require blocks.c                 C   s   t || _d S r   )r   _aes)r;  r.  r   r   r   rE  1  s   z AESBlockModeOfOperation.__init__c                 C      t dNznot implemented	Exceptionr;  r[  r   r   r   ra  4  r+   zAESBlockModeOfOperation.decryptc                 C   rw  rx  ry  r;  rL  r   r   r   rX  7  r+   zAESBlockModeOfOperation.encryptN)rb  rc  rd  re  rE  ra  rX  r   r   r   r   ru  /  s
    ru  c                   @   s   e Zd ZdZdS )AESStreamModeOfOperationz?Super-class for AES modes of operation that are stream-ciphers.N)rb  rc  rd  re  r   r   r   r   r}  ;  s    r}  c                   @   s   e Zd ZdZdZdS )AESSegmentModeOfOperationz9Super-class for AES modes of operation that segment data.r   N)rb  rc  rd  re  segment_bytesr   r   r   r   r~  >  s    r~  c                   @   s$   e Zd ZdZdZdd Zdd ZdS )r   a  AES Electronic Codebook Mode of Operation.

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

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

   Also see:
       o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_codebook_.28ECB.29
       o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.1zElectronic Codebook (ECB)c                 C   ,   t |dkr
tdt|}t| j|S )Nr    plaintext block must be 16 bytes)r/  r0  r    r'   rv  rX  r|  r   r   r   rX  V     zAESModeOfOperationECB.encryptc                 C   r  )Nr   !ciphertext block must be 16 bytes)r/  r0  r    r'   rv  ra  r{  r   r   r   ra  ]  r  zAESModeOfOperationECB.decryptN)rb  rc  rd  re  namerX  ra  r   r   r   r   r   E  s
    r   c                   @   .   e Zd ZdZdZd
ddZdd Zdd	 ZdS )r   a  AES Cipher-Block Chaining Mode of Operation.

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

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

   Also see:
       o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher-block_chaining_.28CBC.29
       o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.2zCipher-Block Chaining (CBC)Nc                 C   sD   |d u rdgd | _ nt|dkrtdt|| _ t| | d S Nr   r   &initialization vector must be 16 bytes)_last_cipherblockr/  r0  r    ru  rE  r;  r.  ivr   r   r   rE  {  s   
zAESModeOfOperationCBC.__init__c                 C   sJ   t |dkr
tdt|}dd t|| jD }| j|| _t| jS )Nr   r  c                 S      g | ]\}}||A qS r   r   r   plr   r   r   r,     ri  z1AESModeOfOperationCBC.encrypt.<locals>.<listcomp>)r/  r0  r    zipr  rv  rX  r'   )r;  rL  precipherblockr   r   r   rX    s   
zAESModeOfOperationCBC.encryptc                 C   sH   t |dkr
tdt|}dd t| j|| jD }|| _t|S )Nr   r  c                 S   r  r   r   r  r   r   r   r,     ri  z1AESModeOfOperationCBC.decrypt.<locals>.<listcomp>)r/  r0  r    r  rv  ra  r  r'   )r;  r[  cipherblockrL  r   r   r   ra    s   zAESModeOfOperationCBC.decryptr   rb  rc  rd  re  r  rE  rX  ra  r   r   r   r   r   f  s    


r   c                   @   s:   e Zd ZdZdZdddZedd Zdd	 Zd
d Z	dS )r   a  AES Cipher Feedback Mode of Operation.

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

    Also see:
       o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_feedback_.28CFB.29
       o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.3zCipher Feedback (CFB)r   c                 C   sV   |dkrd}|d u rdgd | _ nt|dkrtdt|| _ || _t| | d S )Nr   r   r   r  )_shift_registerr/  r0  r    _segment_bytesru  rE  )r;  r.  r  segment_sizer   r   r   rE    s   
zAESModeOfOperationCFB.__init__c                 C   rl  r   )r  rm  r   r   r   ro    rp  zAESModeOfOperationCFB.<lambda>c                 C   s   t |}g }tdt|| jD ]4}|||| j  }| j| jd t| }dd t||D }t| jt|d  || _|	| qt
|S )Nr   c                 S   r  r   r   r   r  xr   r   r   r,     ri  z1AESModeOfOperationCFB.encrypt.<locals>.<listcomp>r    r2  r/  r  rv  rX  r  r  r*   extendr'   )r;  rL  	encryptedr)  plaintext_segmentxor_segmentcipher_segmentr   r   r   rX       zAESModeOfOperationCFB.encryptc                 C   s   t |}g }tdt|| jD ]4}|||| j  }| j| jd t| }dd t||D }t| jt|d  || _|	| qt
|S )Nr   c                 S   r  r   r   r  r   r   r   r,     ri  z1AESModeOfOperationCFB.decrypt.<locals>.<listcomp>r  )r;  r[  	decryptedr)  r  r  r  r   r   r   ra    r  zAESModeOfOperationCFB.decryptNrr  )
rb  rc  rd  re  r  rE  rs  r  rX  ra  r   r   r   r   r     s    

r   c                   @   r  )r   a   AES Output Feedback Mode of Operation.

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

    Also see:
       o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Output_feedback_.28OFB.29
       o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.4zOutput Feedback (OFB)Nc                 C   sJ   |d u rdgd | _ nt|dkrtdt|| _ g | _t| | d S r  )_last_precipherblockr/  r0  r    _remaining_blockru  rE  r  r   r   r   rE    s   
zAESModeOfOperationOFB.__init__c                 C   sh   g }t |D ])}t| jdkr| j| j| _g | _| jd}| j| ||A }|| qt|S )Nr   )	r    r/  r  rv  rX  r  poprS  r'   )r;  rL  r  r  precipherbyte
cipherbyter   r   r   rX    s   zAESModeOfOperationOFB.encryptc                 C   
   |  |S r   rX  r{  r   r   r   ra       
zAESModeOfOperationOFB.decryptr   r  r   r   r   r   r     s    
r   c                   @   r  )r   aU  AES Counter Mode of Operation.

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

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

    Also see:

       o https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_.28CTR.29
       o See NIST SP800-38A (http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf); section 6.5
         and Appendix B for managing the initial counterzCounter (CTR)Nc                 C   s*   t | | |d u rt }|| _g | _d S r   )ru  rE  r	   rk  _remaining_counter)r;  r.  counterr   r   r   rE  .  s
   
zAESModeOfOperationCTR.__init__c                 C   s   t | jt |k r$|  j| j| jj7  _| j  t | jt |k s	t|}dd t|| jD }| jt |d  | _t	|S )Nc                 S   r  r   r   )r   r  r   r   r   r   r,   >  ri  z1AESModeOfOperationCTR.encrypt.<locals>.<listcomp>)
r/  r  rv  rX  rk  rt  rq  r    r  r'   )r;  rL  r  r   r   r   rX  7  s   
zAESModeOfOperationCTR.encryptc                 C   r  r   r  )r;  	crypttextr   r   r   ra  C  r  zAESModeOfOperationCTR.decryptr   r  r   r   r   r   r     s    
	r   )ctrcbccfbecbofb)rR  r+  __all__r   r    r'   r*   r2  rz  rangeobjectr   r	   ru  r}  r~  r   r   r   r   r   dictr   r   r   r   r   <module>   sB   7 0!5G/8
