a
    kÄ#dÆ3  ã                   @   sN  d dl Z d dlZd dlmZmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlm  mZ d dlmZmZ d dlmZ d dlmZ d4d	d
„Zd5dd„Zdd„ Zg d¢g d¢gZdZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!d d!„ Z"d"d#„ Z#d$d%„ Z$d&d'„ Z%d(d)„ Z&d*d+„ Z'G d,d-„ d-e(ƒZ)G d.d/„ d/e(ƒZ*d0d1„ Z+d2d3„ Z,dS )6é    N)ÚunpackÚpack)Úcrc32)ÚCipherÚ
algorithms)Údefault_backend)ÚorbÚchb)Ú	Dot11TKIP)Úmac2strc                 C   s>   t  | ¡}t|dtƒ d�}| ¡ }|r4| d| ¡ | |¡S )zQEncrypt data @data with key @key, skipping @skip first bytes of the
    keystreamN)ÚmodeÚbackendó    )r   ZARC4r   r   Ú	encryptorÚupdate)ÚkeyÚdataÚskipÚ	algorithmÚcipherr   © r   úQ/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/modules/krack/crypto.pyÚARC4_encrypt   s    
r   c                 C   s   t | ||ƒS )zQDecrypt data @data with key @key, skipping @skip first bytes of the
    keystream)r   )r   r   r   r   r   r   ÚARC4_decrypt!   s    r   c                 C   sˆ   d}d  t||gƒt||gƒ ¡}d}d}d}	||d d d kr|t | |tdƒ | t|ƒ tj¡}
|d7 }|	|
 ¡  }	q.|	d	|… S )
z4Source https://stackoverflow.com/questions/12018920/s   Pairwise key expansionó    é@   r   é   éŸ   é    é   N)ÚjoinÚsortedÚhmacÚnewr	   ÚhashlibÚsha1Údigest)r   ZamacZsmacZanonceZsnonceÚAÚBÚblenÚiÚRZhmacsha1r   r   r   ÚcustomPRF512)   s    $r,   (   i¥Æ  i„ø  i™î  i�ö  iÿ  i½Ö  i±Þ  iT‘  iP`  i  i©Î  i}V  iç  ibµ  iæM  išì  iE�  i�  i@‰  i‡ú  iï  ië²  iÉŽ  iû  iìA  ig³  iý_  iêE  i¿#  i÷S  i–ä  i[›  iÂu  iá  i®=  ijL  iZl  iA~  iõ  iOƒ  i\h  iôQ  i4Ñ  iù  i“â  is«  iSb  i?*  i  iR•  ieF  i^�  i(0  i¡7  i
  iµ/  i	  i6$  i›  i=ß  i&Í  iiN  iÍ  iŸê  i  iž  itX  i.4  i-6  i²Ü  iî´  iû[  iö¤  iMv  ia·  iÎ}  i{R  i>Ý  iq^  i—  iõ¦  ih¹  r   i,Á  i`@  iã  iÈy  ií¶  i¾Ô  iF�  iÙg  iKr  iÞ”  iÔ˜  iè°  iJ…  ik»  i*Å  iåO  ií  iÅ†  i×š  iUf  i”  iÏŠ  ié  i  i�þ  ið   iDx  iº%  iãK  ió¢  iþ]  iÀ€  iŠ  i­?  i¼!  iHp  iñ  ißc  iÁw  iu¯  icB  i0   iå  iý  im¿  iL�  i  i5&  i/Ã  iá¾  i¢5  iÌˆ  i9.  iW“  iòU  i‚ü  iGz  i¬È  içº  i+2  i•æ  i À  i˜  iÑž  i£  ifD  i~T  i«;  iƒ  iÊŒ  i)Ç  iÓk  i<(  iy§  iâ¼  i  iv­  i;Û  iVd  iNt  i  iÛ’  i
  ilH  iä¸  i]Ÿ  in½  iïC  i¦Ä  i¨9  i¤1  i7Ó  i‹ò  i2Õ  iC‹  iYn  i·Ú  iŒ  id±  iÒœ  iàI  i´Ø  iú¬  ió  i%Ï  i¯Ê  iŽô  iéG  i  iÕo  iˆð  ioJ  ir\  i$8  iñW  iÇs  iQ—  i#Ë  i|¡  iœè  i!>  iÝ–  iÜa  i†  i…  i�à  iB|  iÄq  iªÌ  iØ�  i  i÷  i  i£Â  i_j  iù®  iÐi  i‘  iX™  i':  i¹'  i8Ù  ië  i³+  i3"  i»Ò  ip©  i‰  i§3  i¶-  i"<  i’  i É  iI‡  iÿª  ixP  iz¥  i�  iøY  i€	  i  iÚe  i1×  iÆ„  i¸Ð  iÃ‚  i°)  iwZ  i  iË{  iü¨  iÖm  i:,  (   iÆ¥  iø„  iî™  iö�  iÿ  iÖ½  iÞ±  i‘T  i`P  i  iÎ©  iV}  iç  iµb  iMæ  iìš  i�E  i�  i‰@  iú‡  iï  i²ë  iŽÉ  iû  iAì  i³g  i_ý  iEê  i#¿  iS÷  iä–  i›[  iuÂ  iá  i=®  iLj  ilZ  i~A  iõ  iƒO  ih\  iQô  iÑ4  iù  iâ“  i«s  ibS  i*?  i  i•R  iFe  i�^  i0(  i7¡  i
  i/µ  i	  i$6  i›  iß=  iÍ&  iNi  iÍ  iêŸ  i  iž  iXt  i4.  i6-  iÜ²  i´î  i[û  i¤ö  ivM  i·a  i}Î  iR{  iÝ>  i^q  i—  i¦õ  i¹h  r   iÁ,  i@`  iã  iyÈ  i¶í  iÔ¾  i�F  igÙ  irK  i”Þ  i˜Ô  i°è  i…J  i»k  iÅ*  iOå  ií  i†Å  iš×  ifU  i”  iŠÏ  ié  i  iþ�  i ð  ixD  i%º  iKã  i¢ó  i]þ  i€À  iŠ  i?­  i!¼  ipH  iñ  icß  iwÁ  i¯u  iBc  i 0  iå  iý  i¿m  i�L  i  i&5  iÃ/  i¾á  i5¢  iˆÌ  i.9  i“W  iUò  iü‚  izG  iÈ¬  iºç  i2+  iæ•  iÀ   i˜  ižÑ  i£  iDf  iT~  i;«  iƒ  iŒÊ  iÇ)  ikÓ  i(<  i§y  i¼â  i  i­v  iÛ;  idV  itN  i  i’Û  i
  iHl  i¸ä  iŸ]  i½n  iCï  iÄ¦  i9¨  i1¤  iÓ7  iò‹  iÕ2  i‹C  inY  iÚ·  iŒ  i±d  iœÒ  iIà  iØ´  i¬ú  ió  iÏ%  iÊ¯  iôŽ  iGé  i  ioÕ  iðˆ  iJo  i\r  i8$  iWñ  isÇ  i—Q  iË#  i¡|  ièœ  i>!  i–Ý  iaÜ  i†  i…  ià�  i|B  iqÄ  iÌª  i�Ø  i  i÷  i  iÂ£  ij_  i®ù  iiÐ  i‘  i™X  i:'  i'¹  iÙ8  ië  i+³  i"3  iÒ»  i©p  i‰  i3§  i-¶  i<"  i’  iÉ   i‡I  iªÿ  iPx  i¥z  i�  iYø  i	€  i  ieÚ  i×1  i„Æ  iÐ¸  i‚Ã  i)°  iZw  i  i{Ë  i¨ü  imÖ  i,:  r   c                 C   s   | d> |B S )Nr   r   )Úb1Úb2r   r   r   Ú_MK16‡   s    r/   c                 C   s    t d | d@  t d | d?  A S )Nr   éÿ   r   r   )Ú_SBOXS)Úindexr   r   r   Ú_SBOX16‹   s    r3   c                 C   s   | d@ S )Niÿÿ  r   ©Úvaluer   r   r   Ú_CAST16�   s    r6   c                 C   s   | d? d@ | d> B S )Nr   iÿ  é   r   r4   r   r   r   Ú_RotR1“   s    r8   c              
   C   s¼  t | ƒdksJ ‚t |ƒdks J ‚t |ƒdks0J ‚tdd„ | | | D ƒƒsNJ ‚g }| t| d | d ƒ¡ | t| d | d ƒ¡ | t|d	 |d
 ƒ¡ | t|d |d ƒ¡ | t|d |d ƒ¡ ttƒD �]"}d|d	@  }t|d
 t|d t|d	|  |d
|  ƒA ƒ ƒ|d
< t|d	 t|d
 t|d|  |d|  ƒA ƒ ƒ|d	< t|d t|d	 t|d|  |d|  ƒA ƒ ƒ|d< t|d t|d t|d|  |d|  ƒA ƒ ƒ|d< t|d t|d t|d	|  |d
|  ƒA ƒ | ƒ|d< qÒt|ƒ}| t|d t| d	 | d
 ƒ ƒ¡ t|d
 t|d t|d	 |d
 ƒA ƒ ƒ|d
< t|d	 t|d
 t|d |d ƒA ƒ ƒ|d	< t|d t|d	 t|d |d ƒA ƒ ƒ|d< t|d t|d t|d |d ƒA ƒ ƒ|d< t|d t|d t|d |d ƒA ƒ ƒ|d< t|d t|d t|d |d ƒA ƒ ƒ|d< t|d
 t	|d t|d |d ƒA ƒ ƒ|d
< t|d	 t	|d
 t|d |d ƒA ƒ ƒ|d	< t|d t	|d	 ƒ ƒ|d< t|d t	|d ƒ ƒ|d< t|d t	|d ƒ ƒ|d< t|d t	|d ƒ ƒ|d< g }| | d	 ¡ | | d	 dB d@ ¡ | | d
 ¡ | |d t|d	 |d
 ƒA d	? d@ ¡ tdƒD ]*}| || d@ ¡ | || d? ¡ �qjt |ƒdk�s¨J ‚d 
dd„ |D ƒ¡S )zhImplement TKIP WEPSeed generation
    TSC: packet IV
    TA: target addr bytes
    TK: temporal key
    é   é   c                 s   s   | ]}t |tjƒV  qd S ©N)Ú
isinstanceÚsixÚinteger_types©Ú.0Úxr   r   r   Ú	<genexpr>¡   r   z#gen_TKIP_RC4_key.<locals>.<genexpr>é   é   é   é   r   r   é	   r   é   é   é   é   é
   r7   é   é    é   r0   r   c                 s   s   | ]}t |ƒV  qd S r;   )r	   r?   r   r   r   rB   Ù   r   )ÚlenÚallÚappendr/   ÚrangeÚPHASE1_LOOP_CNTr6   r3   Úlistr8   r    )ÚTSCÚTAÚTKZTTAKr*   ÚjZPPKÚWEPSeedr   r   r   Úgen_TKIP_RC4_key—   sR    6666<$........(r[   c                 C   s    | |d ? | d| d > B d@ S ©NrN   ì   ÿÿ r   ©r5   Úshiftr   r   r   Ú_rotate_right32ß   s    r`   c                 C   s    | |d > | d| d ? B d@ S r\   r   r^   r   r   r   Ú_rotate_left32ã   s    ra   c                 C   s   | d@ d? | d@ d> B S )z(Swap 2 least significant bytes of @valuel    ~ r   iÿ ÿ r   r4   r   r   r   Ú_XSWAPç   s    rb   c                 C   sn   |t | dƒA }| | d } |t| ƒA }| | d } |t | dƒA }| | d } |t| dƒA }| | d } | |fS )zDefined in 802.11i p.49é   l        rC   rD   )ra   rb   r`   )Úm_lÚm_rr   r   r   Ú
_michael_bì   s    rf   c           	      C   sŽ   t t|ƒdƒ\}}|tdƒ dd|   }td| ƒ\}}t|d ƒD ]<}td||d |d d … ƒd }||N }t||ƒ\}}qDtd||ƒS )	zDefined in 802.11i p.48rF   éZ   r   rJ   z<IIrD   ú<Ir   )ÚdivmodrP   r	   r   rS   rf   r   )	r   Zto_hashZnb_blockZnb_extra_bytesr   rd   re   r*   Zblock_ir   r   r   Úmichaelù   s    "rj   c                 C   s”   | j jsJ ‚| t }|j}|js(tdƒ‚|j}|j}|j}|j	}|j
}|j}|j}	|dB d@ |ksfJ ‚dd„ t| jƒD ƒ}
||||||	g}||
|fS )z4Extract TSCs, TA and encoded-data from a packet @pktz Extended IV must be set for TKIPrN   rO   c                 S   s   g | ]}t |ƒ‘qS r   ©r   ©r@   Úer   r   r   Ú
<listcomp>'  r   z"parse_TKIP_hdr.<locals>.<listcomp>)ZFCfieldZ	protectedr
   r   Zext_ivÚ
ValueErrorÚTSC0ÚTSC1rZ   ÚTSC2ÚTSC3ÚTSC4ÚTSC5r   Zaddr2)ÚpktZ
tkip_layerÚpayloadrp   rq   ZWEPseedrr   rs   rt   ru   rW   rV   r   r   r   Úparse_TKIP_hdr  s     rx   c                 C   sâ   |d? d@ |d? d@ |d? d@ |d? d@ |d? d@ |d@ f\}}}}}}	d}
t |ƒt |dB d@ ƒ t |	ƒ t |
ƒ }|t |ƒt |ƒ t |ƒ t |ƒ 7 }dd	„ t|ƒD ƒ}|	|||||g}d
d	„ |D ƒ}t|||ƒ}|t|| ƒ S )zaBuild a TKIP header for IV @iv and mac @mac, and encrypt @data
    based on temporal key @tk
    é(   r0   rN   é   r:   r   rO   c                 S   s   g | ]}t |ƒ‘qS r   rk   rl   r   r   r   rn   =  r   z&build_TKIP_payload.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r   rk   r?   r   r   r   rn   ?  r   )r	   r   r[   r   )r   ZivÚmacÚtkru   rt   rs   rr   rq   rp   ZbitfieldZTKIP_hdrrW   rV   rX   Úrc4_keyr   r   r   Úbuild_TKIP_payload-  s    




ú($r~   c                 C   s2   t | ƒ\}}}dd„ |D ƒ}t|||ƒ}t||ƒS )z9Extract data from a WPA packet @pkt with temporal key @tkc                 S   s   g | ]}t |ƒ‘qS r   rk   r?   r   r   r   rn   H  r   z"parse_data_pkt.<locals>.<listcomp>)rx   r[   r   )rv   r|   rV   rW   r   rX   r}   r   r   r   Úparse_data_pktE  s    r   c                   @   s   e Zd ZdZdS )ÚICVErrorz(The expected ICV is not the computed oneN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r€   N  s   r€   c                   @   s   e Zd ZdZdS )ÚMICErrorz(The expected MIC is not the computed oneNr�   r   r   r   r   r†   S  s   r†   c                 C   s�   t | ƒdksJ ‚| dd… }| dd… }| dd… }tdt|| ƒd@ ƒ}||krXtƒ ‚t|ƒ}t|ƒ}	t||	| d | ƒ}
|
|krŒtƒ ‚|S )z=Check MIC, ICV & return the data from a decrypted TKIP packetrI   éüÿÿÿNiôÿÿÿrh   r]   s       )rP   r   r   r€   r   rj   r†   )r   Úmic_keyÚsourceÚdestÚICVÚMICZ
data_clearZexpected_ICVÚsaÚdaZexpected_MICr   r   r   Úcheck_MIC_ICVX  s    r�   c                 C   sL   t |ƒ}t |ƒ}t||| d d |  ƒ}tdt| | ƒd@ ƒ}| | | S )z0Compute and return the data with its MIC and ICVr   s      rh   r]   )r   rj   r   r   )r   rˆ   r‰   rŠ   r�   rŽ   rŒ   r‹   r   r   r   Úbuild_MIC_ICVq  s
    r�   )r   )r   )-r$   r"   Ústructr   r   Úzlibr   Z&cryptography.hazmat.primitives.ciphersr   r   Zcryptography.hazmat.backendsr   Zscapy.libs.sixZlibsr=   Zscapy.compatr   r	   Zscapy.layers.dot11r
   Zscapy.utilsr   r   r   r,   r1   rT   r/   r3   r6   r8   r[   r`   ra   rb   rf   rj   rx   r~   r   Ú	Exceptionr€   r†   r�   r�   r   r   r   r   Ú<module>   sB   

"ÝHH 	