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   z�Encapsulates 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   bW¯k iæ««Ml   švìX l   EJ• i�‚‚l   @I“ l   ‡}út l   zõ_ l   ëY²d l   ÉGŽ l   páw iì­­Al   gT©g iý¢¢_iê¯¯Ei¿œœ#i÷¤¤Sl   –räH l   [@�7 iÂ··ul   }ûC i®““=ij&&LiZ66liA??~l   wïk l   OL™ i\44hiô¥¥Ql   4eË# l   qãs l   “qâD l   sX±W iS11bi?*il   RG�+ ie##Fl   ^C‡; i(0i¡––7i
iµšš/i	i6$i›€€l   =bÅ? l   &k× ii''NiÍ²²l   ŸuêT i		ižƒƒit,,Xi.4i-6l   ²nÜ8 l   îZ´h iû  [l   öR¤H iM;;vl   aV­o iÎ³³}i{))Rl   >cÇ; iq//^i—„„l   õS¦L l   hQ£s r   l   ,mÛ i`  @l   |ùG iÈ±±yl   í[¶l l   ¾jÔ( l   FK— iÙ¾¾giK99rl   ÞJ”( l   ÔL˜0 l   èX°` l   JOŸ l   kP¡w l   *oß iåªªOl   {÷[ l   ÅC† l   ×Mš4 iU33fi”……l   ÏEŠ l   yóS il   �þ| l   ðP @ iD<<xiºŸŸ%iã¨¨Kl   óQ¢D iþ££]l   À@€  iŠ��i­’’?i¼��!iH88pl   uëc iß¼¼ciÁ¶¶wl   uZµ_ ic!!Bi0 l   ÿK l   sç{ l   mR¥ l   LM› ii5&l   /lÙ l   á_¾| i¢——5l   ÌDˆ i9.l   WD‰' iò§§Ul   ‚~üx iG==zl   ¬dÈ l   ç]ºt i+2l   •sæL 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Ä i¨‘‘9i¤••1l   7dÉ' l   ‹yòd l   2gÏ+ l   CH‘ iY77nl   ·mÚ4 iŒ��l   dU«c l   ÒNœ8 ià©©Il   ´lØ0 l   úV¬X l   tég l   %jÕ l   ¯eÊ l   Žzôh ié®®GiiÕººol   ˆxð` io%%Jir..\i$8iñ¦¦WiÇ´´sl   QF�/ l   #hÑ l   |]»C l   œtèP i!>l   ÝK–, iÜ½½ai†‹‹i…ŠŠl   �pà@ iB>>|iÄµµql   ªfÌ l   ØH�  il   vío il   £aÂ i_55jl   ùW®\ iÐ¹¹ii‘††l   XAƒ3 i':i¹žž'l   8aÃ3 l   xñW i³˜˜+i3"l   »iÒ$ l   pY³S i‰ŽŽi§””3i¶››-i"<i’‡‡l    iÓ l   IN� l   ÿUªT ix((Pl   z_¿K i�ŒŒiø¡¡Yi€‰‰	iiÚ¿¿el   1fÍ/ l   ÆB„ l   ¸hÐ  l   ÃA‚ i°™™)iw--ZiiË°°{l   üT¨P iÖ»»mi:,(   l   ccŒK l   ||ð	 l   wwÜ3 l   {{ì iòòÿl   kk¬{ l   oo¼c iÅÅ‘Ti00`Pil   ggœS i++V}iþþçi××µbl   «+›L l   vvØ5 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 iååÑ4iññù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   nn¸e 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   dd�Y 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   bbˆM l   ‘sP l   •cH iääÓ7l   yyä iççÕ2iÈÈ‹Ci77nYl   mm´o l   � iÕÕ±dl   NN8% l   ©)“@ l   ll°i 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   ttÐ9 i>!l   KK,; l   ½=Ã8 l   ‹ l   Š

 l   ppÀ! i>>|Bl   µ5ã l   ff˜U l   HH 1 iiöö÷il   aa„G i55j_l   WW\s l   ¹9Ó  l   †/" iÁÁ™Xi:'l   žOr iááÙ8iøøël   ˜Wf i"3l   ii¤w iÙÙ©pl   Ž l   ”gN l   ›[l i<"l   ‡+$ iééÉ iÎÎ‡Il   UUT i((Pxißß¥zl   Œ l   ¡!³p l   ‰	  il   ¿?Ë4 iææ×1l   BB l   hh q l   AA l   ™S` i--Zwil   °0÷ l   TTPy l   »;Û, i,:(   icÆ¥ci|ø„|iwî™wi{ö�{l   òd ikÖ½kioÞ±ol   Å©
 i0`P0iigÎ©gi+V}+l   þg3| l   ×5Å. l   «MÌW ivìšvl   Ê‹ l   ‚: l   É	� i}ú‡}l   úo+t iY²ëYiGŽÉGl   ð{` l   ­AØ[ l   Ô3Ï( l   ¢_úE l   ¯EÔ_ l   œ#~9 l   ¤SîI irä–rl   À·  l   ·u„o l   ýa9z l   “=\' i&Lj&i6lZ6i?~A?l   ÷un l   ÌŸ i4h\4l   ¥QèK l   åQiJ l   ñyb iqâ“ql   Ø+ç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 iuêŸui		l   ƒ< i,Xt,i4.i6-inÜ²niZ´îZl    [öA iR¤öRi;vM;l   Ö7Ã, l   ³}œg i)R{)l   ã]}F i/^q/l   „.	 iS¦õSl   Ñ9Ñ" r   l   íAYZ i @` l   üc?x l   ±y�c i[¶í[ijÔ¾jl   Ë� l   ¾g²} i9rK9iJ”ÞJiL˜ÔLiX°èXl   Ï• l   Ð;×  l   ïEU^ l   ªOÊU l   ûm-v iC†ÅCiMš×Mi3fU3l   …( iEŠÏEl   ùi!r iiþ�iP ðPi<xD<l   Ÿ%t? l   ¨KÆQ iQ¢óQl   £]üG i@€À@l   � l   ’?Z% l   �!x; i8pH8l   õq	j l   ¼c¾y l   ¶w‚m l   Ú/ë4 i!Bc!i 0l   ÿe5~ l   ó}f l   Ò?Û$ l   Í™ ii&5l   ìC_X i_¾á_l   —5D/ iDˆÌDi.9l   Ä¯ l   §UäO i~ü‚~i=zG=idÈ¬di]ºç]i2+isæ•si`À `l   �0 iOžÑOl   Ü#ÿ8 i"Df"i*T~*l   �;V! l   ˆ iFŒÊFl   îGS\ l   ¸k¦q i(<l   Þ'ó< i^¼â^il   Û-í6 l   à[w@ i2dV2i:tN:i

iI’ÛIi
i$Hl$i\¸ä\l   Â» l   Ó=Ý& l   ¬CÞY ibÄ¦bl   ‘9P# l   •1H+ l   äSoH iyò‹yl   çUeN l   È‡ i7nY7imÚ·ml   � l   Õ1É* iNœÒNl   ©IÀS ilØ´liV¬úVl   ôsh l   êOKT ieÊ¯eizôŽzl   ®GÒ] il   ºoªu ixðˆxi%Jo%i.\r.i8$l   ¦WâM l   ´sŽi l   Æ£ l   èKGP l   Ý!ù: itèœti>!iK–ÝKl   ½a¸{ l   ‹ l   Š
 ipà�pi>|B>l   µqˆk ifÌªfiH�ØHil   öwl iiaÂ£ai5j_5iW®ùWl   ¹i s 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   Î“ iUªÿUi(Px(l   ß%õ> l   Œ l   ¡YðC l   ‰	  il   ¿e´ l   æWcL iB„ÆBihÐ¸hiA‚ÃAl   ™)`3 i-Zw-il   °{–a iT¨üTl   »m¬w i,:(   iÆ¥cciø„||iî™wwiö�{{l   ÿäe iÖ½kkiÞ±ool   ‘TŠ i`P00iiÎ©ggiV}++l   çü} l   µb®/ l   MfWW iìšvvl   �E” l    l   ‰@’ iú‡}}l   ïôu i²ëYYiŽÉGGl   ûàa l   Al[[ l   ³g¨) l   _}EE l   Ej__ l   #?99 l   SwII iä–rrl   ›[€ l   uBoo l   áú{ l   =.'' iLj&&ilZ66i~A??l   õîo l   ƒO˜ ih\44l   QtKK l   Ñ4ÊK l   ùâc iâ“qql   «s°1 ibS11i*?il   •RŽ iFe##l   �^† i0(l   7!-- i
l   /555 i	i$6l    l   ß=ÄE l   Í&ÖW iNi''l   Mee iêŸuui		l    iXt,,i4.i6-iÜ²nni´îZZl   [{AA i¤öRRivM;;l   ·a¬- l   }Ngg iR{))l   Ý>ÆG i^q//l   		 i¦õSSl   ¹h¢# r   l   Á,Ú[ i@`  l   ãøy l   yHcc i¶í[[iÔ¾jjl   �F– l   gY}} irK99i”ÞJJi˜ÔLLi°èXXl   …Jž l   »k ! l   Å*Þ_ l   OeUU l   íöw i†ÅCCiš×MMifU33l    iŠÏEEl   éòs iiþ�i ðPPixD<<l   %:?? l   KcQQ i¢óQQl   ]~GG i€À@@l   
 l   ?-%% l   !<;; ipH88l   ñêk l   c_yy l   wAmm l   ¯u´5 iBc!!i 0l   åþ l   ýæg l   ¿m¤% l   �Lš ii&5l   Ã/ØY i¾á__l   5"// iˆÌDDi.9l   “Wˆ	 l   UrOO iü‚~~izG==iÈ¬ddiºç]]i2+iæ•ssiÀ ``l    ižÑOOl   £¸9 iDf""iT~**l   ;+!! l    iŒÊFFl   Ç)Ü] l   kSqq i(<l   §y¼= i¼â^^il   ­v¶7 l   Û;ÀA idV22itN::i

i’ÛIIi
iHl$$i¸ä\\l   Ÿ]„ l   ½n¦' l   CoYY iÄ¦bbl   9(## l   1$++ l   Ó7ÈI iò‹yyl   Õ2ÎO l   ‹C� inY77iÚ·mml    l   ±dª+ iœÒNNl   I`SS iØ´lli¬úVVl   óèi l   Ï%ÔU iÊ¯eeiôŽzzl   Gi]] il   oUuu iðˆxxiJo%%i\r..i8$l   WqMM l   sGii l   —QŒ l   Ë#ÐQ l   ¡|º; ièœtti>!i–ÝKKl   a\{{ l    l    ià�ppi|B>>l   qDkk iÌªffi�ØHHil   ÷ìm iiÂ£aaij_55i®ùWWl   iPss l    l   ™X‚ i:'l   '9== l   Ù8ÂC l   ëðq l   +311 i"3iÒ»iil   ©p²3 l   	 l   3')) l   -677 i<"l    l   É ÒS l   ‡Iœ iªÿUUiPx((l   ¥z¾? l    l   YxCC l   	  il   eZ l   ×1ÌM i„ÆBBiÐ¸hhi‚ÃAAl   )033 iZw--il   {Kaa i¨üTTl   mVww i,:(   éP§ôQéSeA~éÃ¤é–^':éËk«;éñE�ì   «XôY é“ãKéUú0 ì   ömìZ ì   ‘v˜ ì   %Lj éü×åOì   ×KU
 é€D5&ì   �#Åj ì   IZb= égº%é˜êEéáÀþ]ì   u^ ì   p™ ì   £� éÆùÓkéç_�é•œ’ì   ëzÚ~ ì   ÚY¤* ì   -}) éÓ!tXé)iàIì   DH“ éj‰Âuì   xyi ì   k>°2 éÝq¹'ì   ¶OÂ} ì   -a ì   f,A é´:Î}éJßcì   ‚14J ì   `3¢. éESbì   àwÈb ì   „.×v ì    } ì   ”+r éXhHpì   }‹ ì   ‡l¼) é·ø{Rì   #SçV éâKrì   W?F é*«Ufì   (Öe éÂµ/ì   š{Š ì   ¥n& éò‡(0é²¥¿#éºjì   \-Z ì   +ž ì   ’4óN ì   ðrf é¡âiNéÍôÚeéÕ¾ì   bh" ì   Š~M	 é�S.4ì    UæE é2áŠì   ukíI é9ìƒéªï`@éŸq^ì   QÜz éùŠ!>ì   =º- ì   ®|: éF½æMì   µ©" é]ÄqéoÔéÿP`é$û˜ì   —i{- ì   ÌC€ éwžÙgì   ½BÐa éˆ‹‰ì   8[2N éÛîÈyì   G
øB ééB|ì   Éq r   éƒ†€	éHí+2é¬péNrZlì   ûz éV8…éÕ®=é'9-6édÙ
é!¦\hì   ÑT¶6 é:.6$é±g
ì   g¯& ì   ÒÝi éž‘›ì   OE� é¢ ÜaéiKwZéì   
:'E ì   å*@ éCà"<éé	ì   ­Ge é¹¨¶-éÈ©é…ñWì   Lê^ ì   »]3] ì   ý`þF ì   Ÿ&n é¼õr\éÅ;fDé4~û[ì   v)† ì   ÜFG ì   h|Ûm ì   cqÉq ì   Ê\c. é…cBé@"—ì    Œ	 ì   }$”
 ì   ø=v% ì   2ò] ì   m!S éK/žì   ó0d9 éìR†éÐãÁwél³+ì   ™9áR éúH”é"déGì   ÄùQ ì   ?àA éØ,}Véï�3"ì   ÇN’ ì   ÁQq2 ì   þ"• ì   6¨1 ì   ÏëM ì   (^õJ ì   &o5 é¤¿­?éä�:,é’xPé›Ì_jébF~Tì   Âm ì   è8±! é^÷9.ì   õ/‡ ì   ¾ »> é|“Ðié©-Õoì   ³J ì   ;Y é§}ì   nc8Q ì   {;w6 ì   	xL éôYnì   75Y ì   ¨Ÿ ì   en*M ì   ~fÿU éÏ¼!ì   æh+^ ì   ÙÏu éÎ6oJì   Ô	>U éÖ|°)é¯²¤1é1#?*ì   0K éÀf¢5é7¼Ntì   ¦Jy ì   °P!A éØ§3ì   J	b é÷ÚìAéPÍé/ö‘é�ÖMvéM°ïCì   TMT ì   ß,I ì   ã5£= éˆjLì   ¸X éQeFì   j½: é]5Œì   stu ì   .Av ì   ZÎf ì   RR·% ì   3V R éGÖmì   Œa®5 éz¡7éŽøYì   ‰<&V ì   î'R ì   5IÃn ì   íe9B é<±Gzì   Y_¥9 é?sòUéyÎé¿7ÇséêÍ÷Sé[ªý_ì   oz> é†ÛDxì   �s_ ì   >DÑr é,4$8ì   _@F érÃì   %Äy é‹I<(ì   A~ éq¨9éÞ³ì   œdi1 é�ÁVdéa„Ë{ì   p6e* ét\lHì   BWp! (   é§ôQPéeA~Sì   ¤4 ì   ^'t, ì   k+w ì   E?b ì   XzYW ì   c—& éú0 Uì   mvZm ì   vL# éLõ%ì   ×eŸx ì   Ë*Š/ ì   D5L  ì   £bj éZ±ÞIéº%gì   j‹0 ì   À~»B éu/ÃéðL�ì   —FG ì   ùS× ì   _N ì   œ+* ì   zm~W ì   YR*5 éƒ¾Ô-ì   !t°& éiàI)éÈÉŽDé‰ÂujéyŽôxé>X™kì   q9O: ì   Oa}m é­ˆðé¬ Éfì   :Nûh éJßcì   1Ê é3Q—`éSbEì   wdbA ì   ®kv	 é �þì   +ò) éhHpXéýE�ì   l^) ì   ø{¤n éÓs«#ì   KäD é�ãWé«Uf*é(ë²éÂµ/ì   {E5 ì   7¦K ì   ‡(`d ì   ¥?Gd ì   jt é‚í\éÏŠ+ì   ´yN% ì   òæa ì   âiœB ì   ôZË ì   ¾* éb4Ñì   þ&‰ ì   S.h: ì   UsEA éáŠ2éëö¤uéìƒ9ì   ï`€T éŸq^én½Qì   Š!|r éÝ–=ì   >º] é½æMFì   �T"k é]ÄqéÔoì   PÀ~ éû˜$ì   é=­/ ì   C@ éžÙgwì   Bha{ ì   ‹	 é[ç8ì   îHó6 é
|¡Gì   BøR ì   ñ 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¯
 éu¯Lì   ÝÝw ì   `F{ ì   &î? ì   õr¸x ì   ;fˆ
 é~û[4é)C‹vì   Æ#–9 éüí¶héñä¸cì   Ü1® é…cBé"—@éÆ„ é$J…}ì   =;¥q é2ù®é¡)Çmé/žKì   02¹g ì   RX ì   ãAï  é³+lì   ¹pR3 ì   H#t édéG"ì   Œ|Q	 é?ð ì   ,}¬0 ì   �3D^ ì   NI ì   Ñ8² ì   ¢J} éÔ˜6ì   �uM éÞz¥(éŽ·Ú&ì   ¿-H ì   �:XH é’xPì   Ì_Ô6 éF~Tbì   í ì   ¸X!Q é÷9.^ì   ¯Ck ì   €]>} é“Ði|ì   -UßR ì   %žg é™¬È;ì   } N écœèné»;Û{éx&Í	ì   YÜh é·šìì   šOQ én•æeéæÿª~éÏ¼!ì   èÞM ì   ›gu3 ì   6o” ì   	Õ) ì   |0S, ì   ²$c^ é#?*1é”¥Æ0ì   f"k  é¼Nt7ì   ÊùM ì   ÐÁa éØ§3é˜ñJì   Úlƒn éPÍéö‘/ì   ÖMì é°ïCMéMªÌTì   É? ì   µQ=G éˆjLì   ,‚q éQeFéê^�é5Œ]ét‡úséAû.ég³ZéÒÛ’RéVé3éGÖmì   aW5 é¡7zì   x³ ì   <Ö ì   ')�] éÉa·5ì   åÂ[ é±Gz<éßÒœYésòU?éÎyì   7Gç~ ì   Íw§T éªý_[éo=ßì   ÛDð ì   ó/• éÄh¹>é4$8,é@£Â_éÃré%â¼ì   I<P é•ÿAé¨9qì   ³< ì   ä4±9 ì   ÁVÈ  é„Ë{aé¶2Õpé\lHtéW¸ÐB(   ì   ôQ N éA~Seì   †I é':–^é«;Ëké�ñEéú¬«XéãK“ì   0 ªt év­öméÌˆ‘véõ%Lì   åOø/ ì   *E¯ é5&€Dì   b5G é±ÞIZéº%géêE˜ì   þ]Â é/Ãuì   L%` ì   FG/ ì   ÓkŒs é�ç_ì   ’*9 ém¿ëzéR•ÚYì   ¾T[ étXÓ!éàI)iì   É‰ ì   ÂuÔ éŽôxyéX™k>é¹'Ýqéá¾¶Oì   ˆp/Z ì    IÍX éÎ}´:éßcJéå‚1éQ—`3éSbEéd±àwì   k;	] ì   �~9@ éù”+éHpXhì   E3z éÞ”‡lì   {Rnq ì   s+G& éKrâì   c¯ ì   UfTV éë²(ì   µ/ éÅ†š{é7Ó¥ì   (0ä ì   ¿#dK éºjì   m¹ éÏŠ+ì   y'%i ì   sáe ì   iNBE ì   Úeši ì   ª} é4Ñbì   ¦D} é.4�Séó¢ Uì   ŠdB ì   ö$ëV ì   ƒrX ì   `@T_ ì   q^> én½Qì   !>ò éÝ–=é>Ý®ì   æMŒz ì   Tk éÄq]ì   Þ( éP`ÿì   ˜Hv ì   ½V/S é@‰ÌCì   Ùgî< éè°½Bì   ‰ éç8[ì   Èy¶] é|¡G
éB|éé„øÉr   ì   €	 ì   +2�Z é¬péZlNrì   }÷ é…V8ì   ®=<* é-6'9ì   
È2 ì   \hBL é[›ÑTé6$:.é
±gì   WN ì   î4¥- ì   ›<# ì   À Ÿ
 éÜa¢ éwZiKéì   “bt é Àå*ì   "<†@ éé	ì   ‹r[ ì   ¶-rQ ì   �S éñW…éu¯Lì   ™nw; é£ý`é÷Ÿ&ì   r\xk éfDÅ;éû[4~éC‹v)ì   #K¹ ì   í6Ñx ì   ä8Çb ì   1W•9 ì   cB 
 é—@"éÆ„ éJ…}$é»Òø=éù®2ì   )GÛB éžK/é²Üó0é†ìRì   Áw G é³+lì   p)3s é”úHééG"dì   ü(‰ éð ?é}VØ,ì   3"Þ! éI‡ÇNì   8Yƒ# ì   ÊýE éÔ˜6ì   õ&Ÿ ì   z%Q< ì   ·ZM ì   ­?H ì   :,È; ì   xP$ ì   _j6 é~TbFé�öÂì   ØÑq ì   9.¼n ì   Ãë_ ì   ]} ì   Ðiø& éÕo©-é%Ï³ì   ¬Hw2 é§}éœèncì   ;[÷v é&Í	xéYnôì   šln ì   OQ5 é•æenì   ÿ*ýL ì   ¼! ì   oÍQ ì   ç:³7 éoJÎ6éŸêÔ	é°)Ö|ì   ¤1^e é?*1#ì   ¥Fa( é¢5Àfì   Ntnx ì   ‚|M ì   �`a! ì   §3*0 ì   q•0 ì   ìAî5 éÍPì   ‘^l ì   Mv- ì   ïCš` éªÌTMé–äßì   ÑÇk ì   jL6 é,Á¸éeFQì   ^	T éŒ]5é‡ústéû.Aég³Zì   Û¥$ éé3VéÖmGé×šŒaé¡7zéøYŽéë‰<é©Îî'ì   a7k ì   aÛK ì   Gzxb ì   Ò³> éòU?sì   ò éÇs¿7ì   ÷SÔ ì   ý_¶T é=ßoì   Dx7 ì   ¯Jg ì   h9} é$8,4é£Â_@ì   ä éâ¼%é<(‹Iì   ƒ* é¨9qì   ¼g ì   ´X9I ì   Vd  ì   Ë{Â ì   2Uál élHt\é¸ÐBW(   ì   QPNi é~SeAéÃ¤é:–^'ì   ;K×V ì   q‹: ì   ¬+±t ì   KF é Uú0é­ömvì   ˆí éõ%Lì   O|¯K éÅ×Ë*é&€D5éµ�£bì   ÞI´b ì   %g6t ì   ET ì   ]a�} éÃu/é�ðLé�£—Fì   kFó' ì   g¿ ì   9% é¿ëzmé•ÚYRì   Ô-} éXÓ!tì   I)Ò@ ì   ŽD� ì   uj ì   ôxò é™k>Xì   ']ãr ì   ¾6ŸB ì   ðZ éÉf¬ ì   }4u ì   c”> éå‚1é—`3QébESé±àwdé»„®kì   þ@ éù”+épXhHé�ýEì   ”Ù< éR·ø{é«#ÓsérâKéãW�éf*«Uì   ²PV ì   /„k ì   †÷
 éÓ¥7é0ò‡(ì   #2K éºjéí\‚ì   Š+8 é§’´yéóðòéN¡âiì   eMé5 éÕ¾éÑb4ì   Ä
ýM é4�S.ì   ¢ «f ì   2Â ì   ¤uÖm ì   9Ø é@ªï`é^Ÿqé½Q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 é£ý`é÷Ÿ&é\¼õréDÅ;fì   [4üv é‹v)CéËÜÆ#ì   ¶hø[ ì   ¸câI é×ÊÜ1éB…cì   @D. ì   „ " é…}$Jì   Òx{v ì   ®dr éÇm¡)ì   K^< ì   Üsad ì   l¥ ì   wPÇ ì   +l,f é©™¹pì   z‘( ì   G"ÈR ì   ¨Dy ì    ~` éVØ,}é"ï�3é‡ÇNIéÙÁÑ8ì   Œ~E ì   ˜6( ì   ¦Ok é¥(Þzì   Ú&o ì   ?$[ é,ä�:éP’xéj›Ì_éTbF~ì   öB' ì   �hq1 é.^÷9ì   ‚u_ éŸ¾€]ì   i|&! ì   o)[* éÏ³%ì   È;2Y é§}ì   ènÆ8 éÛ{»;éÍ	x&énôYì   ìn5 éƒ¨šOì   æeÜ* ì   ª~Ì ì   !žy éïæèì   ºY7O éJÎ6oì   êT> ì   )Vù` ì   1/eI é*1#?ì   Æ0(K ì   5@ÍD ét7¼Nì   ü&• ì   à0¡! ì   3°O éñJ˜ì   AwµY ì     ì   /ì# év�ÖMì   CM`_ ì   ÌTšT ì   ä_	, ì   žck# éLˆjéÁ¸,éFQeé�ê^ì   ]j ì   úsè éû.Aé³Zgì   ’R¤7 éé3Vì   mŽ, ì   šÃ. ì   7zB ì   Y)p éë‰<ì   ÎnOR é·5Éaéáíåéz<±Gì   œY¾% ì   U?æd éyÎì   s?o ì   Sj›o ì   _[T{ éßo=éx†ÛDì   Êç_ é¹>Ähé8,4$ì   Â_€F érÃì   ¼JD é(‹I<éÿA•ì   9qP éÞ³ì   ØÉi éd�ÁVì   {a éÕp¶2éHt\lì   ÐB®p (   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rÉtd|ƒD ]}||  ||d  N  < q¹ngt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	   z˜A 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
û