a
    kÄ#dŽ8  ã                   @   s˜  d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	 ddl
mZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZ dd	lmZ dd
lmZ ddl m!Z! ddl"m#Z# ddddddddddœdfddddddddœdfddddddddddddddddddd d!d"d#d$d%œdfddddddd&d'd(d)d*d+œ
dfddddd,œdfdi dfdi dfdi dfd-i dfd.i dfd/ddd0œdfd1i dfd2i dfd&i dfd'i dfd(i dfd3œZ$e$Z%i Z&e%D ]HZ'e%e' Z(i Z)e(d D ]Z*e*e)e(d e* < �qØe'e)e(d fe&e(d < �qÀ['[*[)[(G d4d5„ d5eƒZ+g d6¢Z,g d7¢Z-G d8d9„ d9eƒZ.G d:d;„ d;e.ƒZ/G d<d=„ d=e.ƒZ0G d>d?„ d?e.ƒZ1G d@dA„ dAe.ƒZ2G dBdC„ dCe2ƒZ3G dDdE„ dEe.ƒZ4G dFdG„ dGe2ƒZ5G dHdI„ dIe2ƒZ6G dJdK„ dKe.ƒZ7G dLdM„ dMe2ƒZ8eee/dNdO� eee/dNdP� e	ee/dNdNdQ� e	e.e2ddR� e	e.e4ddR� e	e.e1ddR� e	e.e0ddR� e	e.e6ddR� e	e.e7ddR� e	e.e8ddR� e	e.e5d.dR� e	e.e3d2dR� dSdT„ Z9dS )UzE
ISAKMP (Internet Security Association and Key Management Protocol).
é    )Úabsolute_importN)Úconf)ÚPacketÚbind_bottom_upÚbind_top_down)Úchb)ÚByteEnumFieldÚ	ByteFieldÚFieldLenFieldÚ
FlagsFieldÚIntEnumFieldÚIntFieldÚPacketLenFieldÚShortEnumFieldÚ
ShortFieldÚStrFixedLenFieldÚStrLenFieldÚ
XByteField)ÚIPÚUDP)Úsr)Ú
RandString)Úwarning)Úreduceé   é   é   é   é   é   é   é   )zDES-CBCzIDEA-CBCzBlowfish-CBCzRC5-R16-B64-CBCz3DES-CBCzCAST-CBCzAES-CBCzCAMELLIA-CBC)ÚMD5ÚSHAZTigerzSHA2-256zSHA2-384zSHA2-512iÝú  iÞú  ißú  iàú  iéý  iêý  iëý  iìý  iíý  iîý  iïý  iðý  iñý  iòý  )ZPSKZDSSzRSA SigzRSA EncryptionzRSA Encryption RevisedzElGamal EncryptionzElGamal Encryption Revisedz	ECDSA SigZHybridInitRSAZHybridRespRSAZHybridInitDSSZHybridRespDSSZXAUTHInitPreSharedZXAUTHRespPreSharedZXAUTHInitDSSZXAUTHRespDSSZXAUTHInitRSAZXAUTHRespRSAZXAUTHInitRSAEncryptionZXAUTHRespRSAEncryptionZXAUTHInitRSARevisedEncryptionZXAUTHRespRSARevisedEncryptioé   é   é   é   é   )
Z	768MODPgrZ
1024MODPgrZ	EC2Ngr155Z	EC2Ngr185Z
1536MODPgrZ
2048MODPgrZ
3072MODPgrZ
4096MODPgrZ
6144MODPgrZ
8192MODPgr)ZMODPZECPZEC2Né	   é
   é   )ZSecondsZ	Kilobytesé   é   )Z
EncryptionÚHashZAuthenticationZ	GroupDescZ	GroupTypeZ
GroupPrimeZGroupGenerator1ZGroupGenerator2ZGroupCurveAZGroupCurveBZLifeTypeZLifeDurationZPRFZ	KeyLengthZ	FieldSizeZ
GroupOrderc                   @   s8   e Zd ZdZedd„ ƒZedd„ ƒZdd„ Zdd	„ Zd
S )ÚISAKMPTransformSetFieldr   c                 C   s’   | \}}t  ||i df¡\}}}| ||¡}d}|d@ rx|sHtd| ƒ d}|rrt|d@ ƒ| }|dL }|d7 }qL|}n|dO }t d	||¡| S )
Nr   ó    i  ÿÿz9%r should not be TLV but is too big => using TLV encodingéÿ   r!   r   é €  z!HH)ÚISAKMPTransformTypesÚgetr   r   ÚstructÚpack)Ztype_val_tupleÚtypÚvalZtype_valZenc_dictZtlvÚsÚn© r;   úJ/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/isakmp.pyÚtype2nums   s    
z ISAKMPTransformSetField.type2numc                 C   s,   t  | | i f¡}|d  ||¡}|d |fS ©Nr   r   )ÚISAKMPTransformNumr4   )r7   Úencr8   r;   r;   r<   Únum2type†   s    z ISAKMPTransformSetField.num2typec                 C   s$   |d u rdS dd„ |D ƒ}d  |¡S )Nr0   c                 S   s   g | ]}t  |¡‘qS r;   )r/   r=   )Ú.0Úer;   r;   r<   Ú
<listcomp>�   r0   z/ISAKMPTransformSetField.i2m.<locals>.<listcomp>)Újoin)ÚselfÚpktÚir;   r;   r<   Úi2mŒ   s    zISAKMPTransformSetField.i2mc                 C   s   g }t |ƒdkrät d|d d… ¡\}|d@  }|ržt d|dd… ¡\}|d t |ƒkrftd| ƒ |dd| … }tdd„ t dd	t |ƒ f |¡d
ƒ}n"|dM }d
}t d|dd… ¡\}|d| d … }| t ||¡¡ qt |ƒd
krütd| ƒ |S )Nr   z!Hr   r2   z)Bad length for ISAKMP transform type=%#6xc                 S   s   | d> |B S ©Nr!   r;   )ÚxÚyr;   r;   r<   Ú<lambda>¤   r0   z-ISAKMPTransformSetField.m2i.<locals>.<lambda>z!%sÚBr   iÿ  z2Extra bytes after ISAKMP transform dissection [%r])Úlenr5   Úunpackr   r   Úappendr/   rA   )rF   rG   ÚmÚlstZ
trans_typeZis_tlvZ	value_lenÚvaluer;   r;   r<   Úm2i’   s$    
(zISAKMPTransformSetField.m2iN)	Ú__name__Ú
__module__Ú__qualname__ZislistÚstaticmethodr=   rA   rI   rU   r;   r;   r;   r<   r/   p   s   

r/   )ÚNoneZSAZProposalZ	TransformZKEZIDZCERTÚCRr.   ZSIGZNonceZNotificationÚDeleteZVendorID)rZ   Úbasezidentity prot.z	auth onlyZ
aggressiveÚinfoc                   @   s   e Zd Zdd„ ZdS )ÚISAKMP_classc                 C   sB   | j }|dkrtjS |ttƒk r:t| }tƒ  d| t¡S tS d S )Nr   zISAKMP_payload_%s)Únext_payloadr   Ú	raw_layerrO   ÚISAKMP_payload_typeÚglobalsr4   ÚISAKMP_payload)rF   ÚpayloadÚnpÚptr;   r;   r<   Úguess_payload_class¹   s    z ISAKMP_class.guess_payload_classN)rV   rW   rX   rh   r;   r;   r;   r<   r_   ¸   s   r_   c                   @   s|   e Zd Zd Zedddƒedddƒeddeƒeddƒed	deƒe	d
ddg d¢ƒe
ddƒe
ddƒgZdd„ Zdd„ Zdd„ ZdS )ÚISAKMPÚinit_cookieÚ r!   Zresp_cookier`   r   Úversionr&   Ú	exch_typeÚflags)Z
encryptionÚcommitZ	auth_onlyZres3Zres4Zres5Zres6Zres7ÚidÚlengthNc                 C   s   | j d@ rtjS t | |¡S )Nr   )rn   r   ra   r_   rh   )rF   re   r;   r;   r<   rh   Ñ   s    
zISAKMP.guess_payload_classc                 C   s   t |tƒr|j| jkrdS dS r>   )Ú
isinstanceri   rj   )rF   Úotherr;   r;   r<   ÚanswersÖ   s    
zISAKMP.answersc                 C   s>   ||7 }| j d u r:|d d… t dt|ƒ¡ |dd …  }|S )Né   z!Ié   )rq   r5   r6   rO   )rF   ÚpÚpayr;   r;   r<   Ú
post_buildÜ   s    
(zISAKMP.post_build)rV   rW   rX   Únamer   r   rb   r   ÚISAKMP_exchange_typer   r   Úfields_descrh   rt   ry   r;   r;   r;   r<   ri   Ä   s   



øri   c                   @   sd   e Zd ZdZeddeƒeddƒeddƒeddƒedd	d	d
iƒeddƒedddd„ d�gZ	dd„ Z
dS )ÚISAKMP_payload_TransformzIKE Transformr`   NÚresr   rq   Únumrp   r   ZKEY_IKEZres2Z
transformsc                 C   s
   | j d S rJ   ©rq   ©rK   r;   r;   r<   rM   í   r0   z!ISAKMP_payload_Transform.<lambda>©Zlength_fromc                 C   sV   | j d u rJt|ƒ}|d d… t|d? d@ ƒ }|t|d@ ƒ |dd …  }||7 }|S )Nr   r!   r1   r   )rq   rO   r   )rF   rw   rx   Ztmp_lenZtmp_payr;   r;   r<   ry   ÷   s    
z#ISAKMP_payload_Transform.post_build)rV   rW   rX   rz   r   rb   r	   r   r/   r|   ry   r;   r;   r;   r<   r}   ã   s   
ør}   c                   @   sŠ   e Zd ZdZeddeƒeddƒeddddd	d
„ d�eddƒeddddiƒeddddƒeddƒedddd
„ d�e	de
 ¡ edd
„ d�g	ZdS )ÚISAKMP_payload_ProposalzIKE proposalr`   Nr~   r   rq   ZtransÚHc                 C   s   |d S rJ   r;   ©rG   rK   r;   r;   r<   rM     r0   z ISAKMP_payload_Proposal.<lambda>©ÚadjustZproposalr   Úprotori   ÚSPIsizeZSPIrN   Ztrans_nbrk   c                 C   s   | j S )N)r‰   r�   r;   r;   r<   rM     r0   r‚   c                 C   s
   | j d S rJ   r€   r�   r;   r;   r<   rM     r0   )rV   rW   rX   rz   r   rb   r	   r
   r   r   r   ra   r}   r|   r;   r;   r;   r<   rƒ     s   
÷rƒ   c                	   @   sJ   e Zd ZdZeddeƒeddƒeddddd	d
„ d�edddd
„ d�gZ	dS )rd   zISAKMP payloadr`   Nr~   r   rq   Úloadr„   c                 C   s   |d S ©Nr   r;   r…   r;   r;   r<   rM     r0   zISAKMP_payload.<lambda>r†   rk   c                 C   s
   | j d S r‹   r€   r�   r;   r;   r<   rM     r0   r‚   )
rV   rW   rX   rz   r   rb   r	   r
   r   r|   r;   r;   r;   r<   rd     s   
ürd   c                   @   s   e Zd ZdZdS )ÚISAKMP_payload_VendorIDzISAKMP Vendor IDN©rV   rW   rX   rz   r;   r;   r;   r<   rŒ     s   rŒ   c                   @   sl   e Zd ZdZeddeƒeddƒeddddd	d
„ d�eddddiƒeddddiƒe	de
 ¡ edd
„ d�gZdS )ÚISAKMP_payload_SAz	ISAKMP SAr`   Nr~   r   rq   Úpropr„   c                 C   s   |d S ©Nr,   r;   r…   r;   r;   r<   rM   $  r0   zISAKMP_payload_SA.<lambda>r†   ZDOIr   ZIPSECZ	situationÚidentityc                 C   s
   | j d S r�   r€   r�   r;   r;   r<   rM   '  r0   r‚   )rV   rW   rX   rz   r   rb   r	   r
   r   r   r   ra   rƒ   r|   r;   r;   r;   r<   rŽ     s   
úrŽ   c                   @   s   e Zd ZdZdS )ÚISAKMP_payload_NoncezISAKMP NonceNr�   r;   r;   r;   r<   r’   +  s   r’   c                   @   s   e Zd ZdZdS )ÚISAKMP_payload_KEzISAKMP Key ExchangeNr�   r;   r;   r;   r<   r“   /  s   r“   c                   @   sv   e Zd ZdZeddeƒeddƒeddddd	d
„ d�edddddœƒeddddiƒeddddiƒe	dddd
„ d�gZ
dS )ÚISAKMP_payload_IDzISAKMP Identificationr`   Nr~   r   rq   rŠ   r„   c                 C   s   |d S rJ   r;   r…   r;   r;   r<   rM   8  r0   zISAKMP_payload_ID.<lambda>r†   ZIDtyper   Z	IPv4_addrÚKey)r   r+   ZProtoIDZUnusedZPortrk   c                 C   s
   | j d S rJ   r€   r�   r;   r;   r<   rM   =  r0   r‚   )rV   rW   rX   rz   r   rb   r	   r
   r   r   r|   r;   r;   r;   r<   r”   3  s   
ør”   c                   @   s   e Zd ZdZdS )ÚISAKMP_payload_HashzISAKMP HashNr�   r;   r;   r;   r<   r–   A  s   r–   iô  )Údport)Úsport)r—   r˜   )r`   c                 C   s@   t | d�}|tƒ  }|ttdƒdd� }|ttƒ d� }t|ƒS )z8Sends/receives a ISAMPK payload SA with payload proposal)Údstr!   r   )rj   rm   )r�   )r   r   ri   r   rŽ   rƒ   r   )ÚiprG   r;   r;   r<   Úikescan[  s
    

r›   ):Ú__doc__Ú
__future__r   r5   Zscapy.configr   Zscapy.packetr   r   r   Zscapy.compatr   Zscapy.fieldsr   r	   r
   r   r   r   r   r   r   r   r   r   Zscapy.layers.inetr   r   Zscapy.sendrecvr   Zscapy.volatiler   Zscapy.errorr   Ú	functoolsr   ZISAKMPAttributeTypesr3   r?   r:   r8   ÚtmprC   r/   rb   r{   r_   ri   r}   rƒ   rd   rŒ   rŽ   r’   r“   r”   r–   r›   r;   r;   r;   r<   Ú<module>   s  8ùùûûëë÷	÷
þþÿÿÄB@
