a
    kÄ#d}{  ã                   @   sÄ  d 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 ddlmZmZmZmZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZ ddlm Z  dd	l!m"  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/m0Z0 e0rþddl1m2Z2 G dd„ de3ƒZ4G dd„ de5ƒZ6e-dƒZ7e-dƒZ8G dd„ de6e(e7e8f ƒZ9G dd„ de9e:ef ƒZ;G dd„ de9e<e	f ƒZ=G dd„ de=ƒZ>G dd„ de9e?ef ƒZ@G dd„ de9e?ef ƒZAG dd„ de=ƒZBG d d!„ d!e9e?ef ƒZCG d"d#„ d#e>ƒZDG d$d%„ d%eAƒZEG d&d'„ d'eAƒZFG d(d)„ d)eAƒZGG d*d+„ d+eAƒZHG d,d-„ d-eAƒZIG d.d/„ d/eAƒZJG d0d1„ d1eAƒZKG d2d3„ d3eAƒZLG d4d5„ d5eAƒZMG d6d7„ d7eAƒZNG d8d9„ d9eAƒZOG d:d;„ d;eAƒZPG d<d=„ d=e9e)e$ e)e$ f ƒZQG d>d?„ d?eQƒZRe.d@e,e9 dAf ZSG dBdC„ dCe9e)eS e)ee$  f ƒZTG dDdE„ dEeTƒZUG dFdG„ dGeAƒZVG dHdI„ dIe=ƒZWG dJdK„ dKe6ƒZXe.d@e,e9 dAf ZYG dLdM„ dMe9eYee$ f ƒZZG dNdA„ dAe9d@e*d@ f ƒZ[G dOdP„ dPe@ƒZ\G dQdR„ dRe@ƒZ]d	S )Sz/
Classes that implement ASN.1 data structures.
é    )Úreduce)
ÚASN1_BIT_STRINGÚASN1_BOOLEANÚ
ASN1_ClassÚASN1_Class_UNIVERSALÚ
ASN1_ErrorÚASN1_INTEGERÚ	ASN1_NULLÚASN1_OIDÚASN1_ObjectÚASN1_STRING)ÚBER_Decoding_ErrorÚ
BER_id_decÚBER_tagging_decÚBER_tagging_enc)Ú
BasePacket©Úraw)ÚGeneralizedTimeÚ
RandChoiceÚRandIntÚRandNumÚRandOIDÚ
RandStringÚ	RandField)ÚpacketN)ÚAnyÚAnyStrÚCallableÚDictÚGenericÚListÚOptionalÚTupleÚTypeÚTypeVarÚUnionÚcastÚTYPE_CHECKING)ÚASN1_Packetc                   @   s   e Zd ZdS )ÚASN1F_badsequenceN©Ú__name__Ú
__module__Ú__qualname__© r/   r/   úG/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/asn1fields.pyr*   B   s   r*   c                   @   s   e Zd ZdS )ÚASN1F_elementNr+   r/   r/   r/   r0   r1   F   s   r1   Ú_IÚ_Ac                   @   sš   e Zd ZdZdZejZeZd"dd„Z	dd„ Z
dd	„ Zd
d„ Zdd„ Zdd„ Zd#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S )$ÚASN1F_fieldr   NFc                 C   sŠ   |d ur|| _ || _|d u r$|| _n t|tƒr6|| _n| j |¡| _|| _|d urf|d urfd}t|ƒ‚|| _	|| _
t|p€|p€| jƒ| _d S )Nz5field cannot be both implicitly and explicitly tagged)ÚcontextÚnameÚdefaultÚ
isinstancer	   ÚASN1_tagZasn1_objectÚflexible_tagr   Úimplicit_tagÚexplicit_tagÚintÚnetwork_tag)Úselfr6   r7   r5   r;   r<   r:   Úerr_msgr/   r/   r0   Ú__init__X   s    	
zASN1F_field.__init__c                 C   s   t |ƒS ©N©Úrepr©r?   ÚpktÚxr/   r/   r0   Úi2reprs   s    zASN1F_field.i2reprc                 C   s   |S rB   r/   rE   r/   r/   r0   Úi2hw   s    zASN1F_field.i2hc                 C   s„   t || j| j| j| j| jd�\}}|durL| jdur<|| _n| jdurL|| _| j |j¡}| jrp|j|| j	d�S |j
|| j	d�S dS )a�  
        The good thing about safedec is that it may still decode ASN1
        even if there is a mismatch between the expected tag (self.ASN1_tag)
        and the actual tag; the decoded ASN1 object will simply be put
        into an ASN1_BADTAG object. However, safedec prevents the raising of
        exceptions needed for ASN1F_optional processing.
        Thus we use 'flexible_tag', which should be False with ASN1F_optional.

        Regarding other fields, we might need to know whether encoding went
        as expected or not. Noticeably, input methods from cert.py expect
        certain exceptions to be raised. Hence default flexible_tag is False.
        ©Ú
hidden_tagr;   r<   ÚsafeZ_fnameN)r5   )r   r9   r;   r<   r:   r6   Ú	get_codecÚ
ASN1_codecZsafedecr5   Údec)r?   rF   ÚsÚdiff_tagÚcodecr/   r/   r0   Úm2i{   s    ü


zASN1F_field.m2ic                 C   s–   |d u rdS t |tƒrl| jtjksF|jtjksF|jtjksF| j|jkrT| |j	¡}q€t
d|| j| jf ƒ‚n| j |j	¡ |¡}t|| j| j| jd�S )Nó    z6Encoding Error: got %r instead of an %r for field [%s]©rK   r;   r<   )r8   r   r9   r   ÚANYÚtagÚRAWÚERRORÚencrN   r   r6   rM   r   r;   r<   ©r?   rF   rG   rP   r/   r/   r0   Úi2mš   s"    

ÿ
þ
ýþzASN1F_field.i2mc                 C   s
   t t|ƒS rB   )r'   r2   rE   r/   r/   r0   Úany2i¬   s    zASN1F_field.any2ic                 C   sd   z|||d�}W n  t y0   tj||d�}Y n0 | tj¡}d}|d ur\|j}|jr\|j`||fS )N©Ú_underlayerrT   )r*   r   ZRawZgetlayerÚloadZ
underlayerÚpayload)r?   ÚclsrP   r_   ÚcZcpadr/   r/   r0   Úextract_packet°   s    zASN1F_field.extract_packetc                 C   s   |   |t|| jƒ¡S rB   )r\   Úgetattrr6   ©r?   rF   r/   r/   r0   ÚbuildÂ   s    zASN1F_field.buildc                 C   s    |   ||¡\}}|  ||¡ |S rB   )rS   Úset_val)r?   rF   rP   Úvr/   r/   r0   ÚdissectÆ   s    zASN1F_field.dissectc                 C   s`   t |tƒrJ|d d … }tt|ƒƒD ]"}t || tƒr"||  ¡ ||< q"|S t|dƒr\| ¡ S |S )NÚcopy)r8   ÚlistÚrangeÚlenr   rk   Úhasattr)r?   rG   Úir/   r/   r0   Údo_copyÌ   s    

zASN1F_field.do_copyc                 C   s   t || j|ƒ d S rB   )Úsetattrr6   )r?   rF   Úvalr/   r/   r0   rh   Ø   s    zASN1F_field.set_valc                 C   s   t || jƒd u S rB   )re   r6   rf   r/   r/   r0   Úis_emptyÜ   s    zASN1F_field.is_emptyc                 C   s   | gS rB   r/   ©r?   r/   r/   r0   Úget_fields_listà   s    zASN1F_field.get_fields_listc                 C   s   t | ƒS rB   rC   ru   r/   r/   r0   Ú__str__ä   s    zASN1F_field.__str__c                 C   s   t ƒ S rB   )r   ru   r/   r/   r0   Úrandvalè   s    zASN1F_field.randval)NNNF)N)r,   r-   r.   Úholds_packetsÚislistr   rV   r9   r5   rA   rH   rI   rS   r\   r]   rd   rg   rj   rq   rh   rt   rv   rw   rx   r/   r/   r/   r0   r4   R   s0       ú
 ý
r4   c                   @   s   e Zd ZejZdd„ ZdS )ÚASN1F_BOOLEANc                 C   s
   t ddƒS )NTF)r   ru   r/   r/   r0   rx   ô   s    zASN1F_BOOLEAN.randvalN)r,   r-   r.   r   ZBOOLEANr9   rx   r/   r/   r/   r0   r{   ñ   s   r{   c                   @   s   e Zd ZejZdd„ ZdS )ÚASN1F_INTEGERc                 C   s
   t ddƒS )Nlûÿÿÿ         l   ÿÿÿÿ )r   ru   r/   r/   r0   rx   ü   s    zASN1F_INTEGER.randvalN)r,   r-   r.   r   ZINTEGERr9   rx   r/   r/   r/   r0   r|   ù   s   r|   c                       s2   e Zd Zd‡ fdd„	Z‡ fdd„Zdd„ Z‡  ZS )	ÚASN1F_enum_INTEGERNc                    s�   t t| ƒj|||||d� i  }| _i  }| _t|tƒrFtt|ƒƒ}	nt|ƒ}	t	dd„ |	D ƒƒrj|| }}|	D ]}
||
 ||
< |
|||
 < qnd S )N©r5   r;   r<   c                 s   s   | ]}t |tjƒV  qd S rB   )r8   ÚsixÚstring_types)Ú.0rG   r/   r/   r0   Ú	<genexpr>  rT   z.ASN1F_enum_INTEGER.__init__.<locals>.<genexpr>)
Úsuperr}   rA   Úi2sÚs2ir8   rl   rm   rn   Úany)r?   r6   r7   Úenumr5   r;   r<   r„   r…   ÚkeysÚk©Ú	__class__r/   r0   rA     s    	
ý



zASN1F_enum_INTEGER.__init__c                    s,   t |tƒs|}n
| j| }tt| ƒ ||¡S rB   )r8   Ústrr…   rƒ   r}   r\   )r?   rF   rP   ÚvsrŠ   r/   r0   r\     s    

zASN1F_enum_INTEGER.i2mc                 C   s<   |d ur4t |tƒr4| j |j¡}|r4d|t|ƒf S t|ƒS )Nz'%s' %s)r8   r   r„   Úgetrs   rD   )r?   rF   rG   Úrr/   r/   r0   rH   '  s
    zASN1F_enum_INTEGER.i2repr)NNN)r,   r-   r.   rA   r\   rH   Ú__classcell__r/   r/   rŠ   r0   r}     s      úr}   c                       s,   e Zd ZejZd‡ fdd„	Zdd„ Z‡  ZS )ÚASN1F_BIT_STRINGTNc                    sB   t t| ƒj|d |||d� t|ttfƒr8t||d�| _n|| _d S )Nr~   ©Úreadable)rƒ   r‘   rA   r8   ÚbytesrŒ   r   r7   )r?   r6   r7   Údefault_readabler5   r;   r<   rŠ   r/   r0   rA   6  s    	
ýÿ
zASN1F_BIT_STRING.__init__c                 C   s   t tddƒƒS ©Nr   iè  ©r   r   ru   r/   r/   r0   rx   J  s    zASN1F_BIT_STRING.randval)TNNN)	r,   r-   r.   r   Ú
BIT_STRINGr9   rA   rx   r�   r/   r/   rŠ   r0   r‘   3  s       úr‘   c                   @   s   e Zd ZejZdd„ ZdS )ÚASN1F_STRINGc                 C   s   t tddƒƒS r–   r—   ru   r/   r/   r0   rx   R  s    zASN1F_STRING.randvalN)r,   r-   r.   r   ÚSTRINGr9   rx   r/   r/   r/   r0   r™   O  s   r™   c                   @   s   e Zd ZejZdS )Ú
ASN1F_NULLN)r,   r-   r.   r   ZNULLr9   r/   r/   r/   r0   r›   W  s   r›   c                   @   s   e Zd ZejZdd„ ZdS )Ú	ASN1F_OIDc                 C   s   t ƒ S rB   )r   ru   r/   r/   r0   rx   ^  s    zASN1F_OID.randvalN)r,   r-   r.   r   ZOIDr9   rx   r/   r/   r/   r0   rœ   [  s   rœ   c                   @   s   e Zd ZejZdS )ÚASN1F_ENUMERATEDN)r,   r-   r.   r   Z
ENUMERATEDr9   r/   r/   r/   r0   r�   c  s   r�   c                   @   s   e Zd ZejZdS )ÚASN1F_UTF8_STRINGN)r,   r-   r.   r   ZUTF8_STRINGr9   r/   r/   r/   r0   rž   g  s   rž   c                   @   s   e Zd ZejZdS )ÚASN1F_NUMERIC_STRINGN)r,   r-   r.   r   ZNUMERIC_STRINGr9   r/   r/   r/   r0   rŸ   k  s   rŸ   c                   @   s   e Zd ZejZdS )ÚASN1F_PRINTABLE_STRINGN)r,   r-   r.   r   ZPRINTABLE_STRINGr9   r/   r/   r/   r0   r    o  s   r    c                   @   s   e Zd ZejZdS )ÚASN1F_T61_STRINGN)r,   r-   r.   r   Z
T61_STRINGr9   r/   r/   r/   r0   r¡   s  s   r¡   c                   @   s   e Zd ZejZdS )ÚASN1F_VIDEOTEX_STRINGN)r,   r-   r.   r   ZVIDEOTEX_STRINGr9   r/   r/   r/   r0   r¢   w  s   r¢   c                   @   s   e Zd ZejZdS )ÚASN1F_IA5_STRINGN)r,   r-   r.   r   Z
IA5_STRINGr9   r/   r/   r/   r0   r£   {  s   r£   c                   @   s   e Zd ZejZdS )ÚASN1F_GENERAL_STRINGN)r,   r-   r.   r   ZGENERAL_STRINGr9   r/   r/   r/   r0   r¤     s   r¤   c                   @   s   e Zd ZejZdd„ ZdS )ÚASN1F_UTC_TIMEc                 C   s   t ƒ S rB   ©r   ru   r/   r/   r0   rx   †  s    zASN1F_UTC_TIME.randvalN)r,   r-   r.   r   ZUTC_TIMEr9   rx   r/   r/   r/   r0   r¥   ƒ  s   r¥   c                   @   s   e Zd ZejZdd„ ZdS )ÚASN1F_GENERALIZED_TIMEc                 C   s   t ƒ S rB   r¦   ru   r/   r/   r0   rx   Ž  s    zASN1F_GENERALIZED_TIME.randvalN)r,   r-   r.   r   ZGENERALIZED_TIMEr9   rx   r/   r/   r/   r0   r§   ‹  s   r§   c                   @   s   e Zd ZejZdS )ÚASN1F_ISO646_STRINGN)r,   r-   r.   r   ZISO646_STRINGr9   r/   r/   r/   r0   r¨   “  s   r¨   c                   @   s   e Zd ZejZdS )ÚASN1F_UNIVERSAL_STRINGN)r,   r-   r.   r   ZUNIVERSAL_STRINGr9   r/   r/   r/   r0   r©   —  s   r©   c                   @   s   e Zd ZejZdS )ÚASN1F_BMP_STRINGN)r,   r-   r.   r   Z
BMP_STRINGr9   r/   r/   r/   r0   rª   ›  s   rª   c                       sZ   e Zd ZejZdZ‡ fdd„Zdd„ Zdd„ Z	dd	„ Z
d
d„ Zdd„ Z‡ fdd„Z‡  ZS )ÚASN1F_SEQUENCEé   c                    sj   d}dd„ |D ƒ}dD ]}t | || |¡ƒ qtt| ƒj||| j| j| j| jd� || _	t
|ƒdk| _d S )NZdummy_seq_namec                 S   s   g | ]
}|j ‘qS r/   )r7   )r�   Úfieldr/   r/   r0   Ú
<listcomp>±  rT   z+ASN1F_SEQUENCE.__init__.<locals>.<listcomp>)r5   r;   r<   r:   r¬   )rr   rŽ   rƒ   r«   rA   r5   r;   r<   r:   Úseqrn   rz   )r?   r¯   Úkwargsr6   r7   ÚkwargrŠ   r/   r0   rA   ®  s    
üzASN1F_SEQUENCE.__init__c                 C   s   d| j j| jf S )Nz<%s%r>)r‹   r,   r¯   ru   r/   r/   r0   Ú__repr__¾  s    zASN1F_SEQUENCE.__repr__c                    s   t ‡ fdd„| jD ƒƒS )Nc                 3   s   | ]}|  ˆ ¡V  qd S rB   )rt   )r�   Úf©rF   r/   r0   r‚   Ä  rT   z*ASN1F_SEQUENCE.is_empty.<locals>.<genexpr>)Úallr¯   rf   r/   r´   r0   rt   Â  s    zASN1F_SEQUENCE.is_emptyc                 C   s   t dd„ | jg ƒS )Nc                 S   s   | |  ¡  S rB   )rv   ©rG   Úyr/   r/   r0   Ú<lambda>È  rT   z0ASN1F_SEQUENCE.get_fields_list.<locals>.<lambda>)r   r¯   ru   r/   r/   r0   rv   Æ  s    ÿzASN1F_SEQUENCE.get_fields_listc              	   C   sæ   t || j| j| j| j|jd�\}}|durL| jdur<|| _n| jdurL|| _| j |j¡}| |¡\}}}t	|ƒdkr�| j
D ]}| |d¡ q|nN| j
D ].}z| ||¡}W q– tyÂ   Y  qÆY q–0 q–t	|ƒdkrÞtd|d�‚g |fS )aÃ  
        ASN1F_SEQUENCE behaves transparently, with nested ASN1_objects being
        dissected one by one. Because we use obj.dissect (see loop below)
        instead of obj.m2i (as we trust dissect to do the appropriate set_vals)
        we do not directly retrieve the list of nested objects.
        Thus m2i returns an empty list (along with the proper remainder).
        It is discarded by dissect() and should not be missed elsewhere.
        rJ   Nr   úunexpected remainder©Ú	remaining)r   r9   r;   r<   r:   r6   rM   rN   Úcheck_type_check_lenrn   r¯   rh   rj   r*   r   )r?   rF   rP   rQ   rR   rp   ÚremainÚobjr/   r/   r0   rS   Ë  s0    
ü




zASN1F_SEQUENCE.m2ic                 C   s   |   ||¡\}}|S rB   )rS   )r?   rF   rP   Ú_rG   r/   r/   r0   rj   î  s    zASN1F_SEQUENCE.dissectc                    s(   t ‡ fdd„| jdƒ}tt| ƒ ˆ |¡S )Nc                    s   | |  ˆ ¡ S rB   )rg   r¶   r´   r/   r0   r¸   õ  rT   z&ASN1F_SEQUENCE.build.<locals>.<lambda>rT   )r   r¯   rƒ   r«   r\   ©r?   rF   rP   rŠ   r´   r0   rg   ó  s    ÿzASN1F_SEQUENCE.build)r,   r-   r.   r   ÚSEQUENCEr9   ry   rA   r²   rt   rv   rS   rj   rg   r�   r/   r/   rŠ   r0   r«   Ÿ  s   #r«   c                   @   s   e Zd ZejZdS )Ú	ASN1F_SETN©r,   r-   r.   r   ZSETr9   r/   r/   r/   r0   rÂ   ú  s   rÂ   r)   ÚASN1F_PACKETc                       sT   e Zd ZdZejZdZd‡ fdd„	Zdd„ Z	dd	„ Z
d
d„ Zdd„ Zdd„ Z‡  ZS )ÚASN1F_SEQUENCE_OFz@
    Two types are allowed as cls: ASN1_Packet, ASN1F_field
    r¬   Nc                    s¢   t |tƒrBt|tƒrBtttttf  |ƒˆ _‡ fdd„ˆ _dˆ _	n<t
|dƒsTt|ƒrvtd|ƒˆ _‡ fdd„ˆ _dˆ _	ntdƒ‚ttˆ ƒj|d |||d	� |ˆ _d S )
Nc                    s   ˆ   ˆ jd¡ || ¡S ©NrT   )Úfldr6   rS   ©rP   rF   ru   r/   r0   r¸     s   ÿÿz,ASN1F_SEQUENCE_OF.__init__.<locals>.<lambda>r   Ú	ASN1_rootzType[ASN1_Packet]c                    s   ˆ j ˆ j| |d�S )Nr^   )rd   rb   rÈ   ru   r/   r0   r¸     s   ÿr¬   z*cls should be an ASN1_Packet or ASN1_fieldr~   )r8   ÚtypeÚ
issubclassr4   r'   r$   r   rÇ   Ú_extract_packetry   ro   Úcallablerb   Ú
ValueErrorrƒ   rÅ   rA   r7   ©r?   r6   r7   rb   r5   r;   r<   rŠ   ru   r0   rA   	  s    	
þzASN1F_SEQUENCE_OF.__init__c                 C   s   t  | |¡S rB   )r4   rt   rf   r/   r/   r0   rt   $  s    zASN1F_SEQUENCE_OF.is_emptyc           	      C   s®   t || j| j| j| jd�\}}|d urH| jd ur8|| _n| jd urH|| _| j |j¡}| |¡\}}}g }|rŽ|  ||¡\}}|rj| 	|¡ qjt
|ƒdkr¦td|d�‚||fS )N)rK   r;   r<   rL   r   r¹   rº   )r   r9   r;   r<   r:   rM   rN   r¼   rÌ   Úappendrn   r   )	r?   rF   rP   rQ   rR   rp   r½   Úlstrc   r/   r/   r0   rS   *  s(    ý


zASN1F_SEQUENCE_OF.m2ic                 C   sh   t || jƒ}t|tƒr:|jtjkr:ttt	t
 tf |ƒ}n"|d u rHd}nd dd„ |D ƒ¡}|  ||¡S )NrT   c                 s   s   | ]}t |ƒV  qd S rB   r   )r�   rp   r/   r/   r0   r‚   L  rT   z*ASN1F_SEQUENCE_OF.build.<locals>.<genexpr>)re   r6   r8   r   rW   r   rX   r'   r&   r!   Ú_SEQ_Tr”   Újoinr\   )r?   rF   rs   rP   r/   r/   r0   rg   C  s    

ÿzASN1F_SEQUENCE_OF.buildc                 C   s*   | j rt |  ¡ ¡S |  | jd¡ ¡ S d S rÆ   )ry   r   Úfuzzrb   rÇ   r6   rx   ru   r/   r/   r0   rx   O  s    zASN1F_SEQUENCE_OF.randvalc                 C   s   d| j j| jf S )Nz<%s %s>)r‹   r,   r6   ru   r/   r/   r0   r²   V  s    zASN1F_SEQUENCE_OF.__repr__)NNN)r,   r-   r.   Ú__doc__r   rÁ   r9   rz   rA   rt   rS   rg   rx   r²   r�   r/   r/   rŠ   r0   rÅ     s      úrÅ   c                   @   s   e Zd ZejZdS )ÚASN1F_SET_OFNrÃ   r/   r/   r/   r0   rÖ   [  s   rÖ   c                   @   s   e Zd ZejZdS )ÚASN1F_IPADDRESSN)r,   r-   r.   r   Z	IPADDRESSr9   r/   r/   r/   r0   r×   _  s   r×   c                   @   s   e Zd ZejZdS )ÚASN1F_TIME_TICKSN)r,   r-   r.   r   Z
TIME_TICKSr9   r/   r/   r/   r0   rØ   c  s   rØ   c                   @   sD   e 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S )ÚASN1F_optionalc                 C   s   d|_ || _d S )NF)r:   Ú_field)r?   r­   r/   r/   r0   rA   l  s    zASN1F_optional.__init__c                 C   s   t | j|ƒS rB   )re   rÚ   )r?   Úattrr/   r/   r0   Ú__getattr__q  s    zASN1F_optional.__getattr__c              
   C   s6   z| j  ||¡W S  tttfy0   d |f Y S 0 d S rB   )rÚ   rS   r   r*   r   rÀ   r/   r/   r0   rS   u  s    zASN1F_optional.m2ic              
   C   s@   z| j  ||¡W S  tttfy:   | j  |d ¡ | Y S 0 d S rB   )rÚ   rj   r   r*   r   rh   rÀ   r/   r/   r0   rj   }  s
    zASN1F_optional.dissectc                 C   s   | j  |¡rdS | j  |¡S rÆ   )rÚ   rt   rg   rf   r/   r/   r0   rg   …  s    zASN1F_optional.buildc                 C   s   | j  ||¡S rB   )rÚ   r]   rE   r/   r/   r0   r]   ‹  s    zASN1F_optional.any2ic                 C   s   | j  ||¡S rB   )rÚ   rH   rE   r/   r/   r0   rH   �  s    zASN1F_optional.i2reprN)
r,   r-   r.   rA   rÜ   rS   rj   rg   r]   rH   r/   r/   r/   r0   rÙ   k  s   rÙ   c                       sB   e Zd ZdZdZejZ‡ fdd„Zdd„ Z	dd„ Z
d	d
„ Z‡  ZS )ÚASN1F_CHOICEzÅ
    Multiple types are allowed: ASN1_Packet, ASN1F_field and ASN1F_PACKET(),
    See layers/x509.py for examples.
    Other ASN1F_field instances than ASN1F_PACKET instances must not be used.
    r¬   c                    sh  d|v rd}t |ƒ‚d | _dD ]}t| || |¡ƒ qtt| ƒj|d | j| jd� || _	d | _
i | _i | _|D ]ô}t|dƒrÐtd|ƒ}t|jdƒrÀtt|jƒ}t |j¡D ]\}	}
|
| j|	< qªn|| j|jj< qnt|dƒ�rZtttttttf  f |ƒ}t|tƒ�r|| jt|jƒ< n@|| j|j< |jd u�r@|| j|jd@ < |j|jf| jt|jƒ< qnt d	ƒ‚qnd S )
Nr;   z1ASN1F_CHOICE has been called with an implicit_tag)r5   r<   rÉ   r)   Úchoicesr9   é   z(ASN1F_CHOICE: no tag found for one field)r   r;   rr   rŽ   rƒ   rÝ   rA   r5   r<   r7   Zcurrent_choicerÞ   Ú
pktchoicesro   r'   rÉ   r   Ú	iteritemsr>   r&   rÄ   r$   r4   r   r8   rÊ   r=   r9   Úhashrb   )r?   r6   r7   Úargsr°   r@   r±   ÚpÚrootr‰   ri   rŠ   r/   r0   rA      s>    
þ

zASN1F_CHOICE.__init__c                 C   sæ   t |ƒdkrtdƒ‚t|| j| jd�\}}t|ƒ\}}|| jv rL| j| }nH|d@ | jv rj| j|d@  }n*| jrvt}ntd| j	|t
| j ¡ ƒf ƒ‚t|dƒr¸td|ƒ}| j|||d�S t|tƒrÖ|| j	d	ƒ ||¡S | ||¡S d
S )z‡
        First we have to retrieve the appropriate choice.
        Then we extract the field/packet, according to this choice.
        r   zASN1F_CHOICE: got empty string)rK   r<   rß   zGASN1F_CHOICE: unexpected field in '%s' (tag %s not in possible tags %s)rÉ   r)   r^   rT   N)rn   r   r   r9   r<   r   rÞ   r:   r4   r6   rl   rˆ   ro   r'   rd   r8   rÊ   rS   )r?   rF   rP   r¿   rW   Úchoicer/   r/   r0   rS   É  s0    ÿ

ÿÿÿ


zASN1F_CHOICE.m2ic                 C   s^   |d u rd}nBt |ƒ}tt|ƒƒ| jv rP| jtt|ƒƒ \}}t|| j||d�}t|| jd�S )NrT   rU   )r<   )r   râ   rÊ   rà   r   r9   r<   )r?   rF   rG   rP   ÚimpÚexpr/   r/   r0   r\   ì  s    þzASN1F_CHOICE.i2mc                 C   st   g }t  | j¡D ]Z}t|dƒr2| t |ƒ ¡¡ qt|dƒrt|tƒr\| |dd ƒ 	¡ ¡ q| | 	¡ ¡ qt
|Ž S )NrÉ   r9   Údummy)r   Ú
itervaluesrÞ   ro   rÐ   r   rÔ   r8   rÊ   rx   r   )r?   Zrandchoicesrä   r/   r/   r0   rx   ù  s    


zASN1F_CHOICE.randval)r,   r-   r.   rÕ   ry   r   rV   r9   rA   rS   r\   rx   r�   r/   r/   rŠ   r0   rÝ   —  s   )#rÝ   c                       s:   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Z‡  ZS )rÄ   r¬   Nc                    sT   || _ || _tt| ƒj|d |||d� |d u rJ|d u rJ|jjtjkrJd| _	|| _
d S )Nr~   é0   )rb   Únext_cls_cbrƒ   rÄ   rA   rÉ   r9   r   rÁ   r>   r7   )r?   r6   r7   rb   r5   r;   r<   rì   rŠ   r/   r0   rA     s    

þzASN1F_PACKET.__init__c                 C   s¢   | j r|   |¡p| j}n| j}t|dƒs8| j|||d�S t||jj| j| j| j	| j
d�\}}|d ur†| jd urv|| _n| jd ur†|| _|s’d |fS | j|||d�S )NrÉ   r^   rJ   )rì   rb   ro   rd   r   rÉ   r9   r;   r<   r:   r6   )r?   rF   rP   rb   rQ   r/   r/   r0   rS   "  s&    

ü


zASN1F_PACKET.m2ic                 C   s^   |d u rd}n:t |tƒr|}n*t |tƒr@|jr:t|jƒ}qHd}nt|ƒ}t|| j| j| jd�S )NrT   rU   )	r8   r”   r   rs   r   r   r9   r;   r<   r[   r/   r/   r0   r\   9  s    

þzASN1F_PACKET.i2mc                 C   s   t  |  ¡ ¡S rB   )r   rÔ   rb   ru   r/   r/   r0   rx   M  s    zASN1F_PACKET.randval)NNNN)	r,   r-   r.   ry   rA   rS   r\   rx   r�   r/   r/   rŠ   r0   rÄ   
  s       ùc                       s@   e Zd ZdZejZd	‡ fdd„	Z‡ fdd„Z‡ fdd„Z	‡  Z
S )
ÚASN1F_BIT_STRING_ENCAPSzš
    We may emulate simple string encapsulation with explicit_tag=0x04,
    but we need a specific class for bit strings because of unused bits, etc.
    Nc                    s,   || _ tt| ƒj||ot|ƒ|||d� d S )Nr~   )rb   rƒ   rí   rA   r   rÏ   rŠ   r/   r0   rA   Y  s    	
ýz ASN1F_BIT_STRING_ENCAPS.__init__c                    s~   t t| ƒ ||¡\}}t|jƒd dkr4td|d�‚|jrT| j| j|j|d�\}}n
d |jfS t|ƒdkrvtd|d�‚||fS )Né   r   zwrong bit stringrº   r^   r¹   )	rƒ   rí   rS   rn   rs   r   Zval_readablerd   rb   )r?   rF   rP   Z
bit_stringr½   rä   rŠ   r/   r0   rS   i  s    ÿ
zASN1F_BIT_STRING_ENCAPS.m2ic                    s.   |d u rdnt |ƒ}tt| ƒ |t|dd�¡S )NrT   Tr’   )r   rƒ   rí   r\   r   r[   rŠ   r/   r0   r\   w  s
    

þzASN1F_BIT_STRING_ENCAPS.i2m)NNN)r,   r-   r.   rÕ   r   r˜   r9   rA   rS   r\   r�   r/   r/   rŠ   r0   rí   R  s      úrí   c                       s.   e Zd Zd‡ fdd„	Zdd„ Zdd„ Z‡  ZS )	ÚASN1F_FLAGSNc                    s&   || _ tt| ƒj||d|||d� d S )NF)r•   r5   r;   r<   )Úmappingrƒ   rï   rA   )r?   r6   r7   rð   r5   r;   r<   rŠ   r/   r0   rA   �  s    	
ûzASN1F_FLAGS.__init__c                    s$   t |ˆ jƒj}‡ fdd„t|ƒD ƒS )Nc                    s0   g | ](\}}|d kr|t ˆ jƒk rˆ j| ‘qS )Ú1)rn   rð   )r�   rp   Ú
positionalru   r/   r0   r®   –  s   ÿz)ASN1F_FLAGS.get_flags.<locals>.<listcomp>)re   r6   rs   Ú	enumerate)r?   rF   Zfbytesr/   ru   r0   Ú	get_flags“  s    zASN1F_FLAGS.get_flagsc                 C   s0   |d ur(d  |  |¡¡}|d t|ƒ S t|ƒS )Nz, ú )rÓ   rô   rD   )r?   rF   rG   Zpretty_sr/   r/   r0   rH   ™  s    zASN1F_FLAGS.i2repr)NNN)r,   r-   r.   rA   rô   rH   r�   r/   r/   rŠ   r0   rï   €  s      úrï   )^rÕ   Ú	functoolsr   Zscapy.asn1.asn1r   r   r   r   r   r   r	   r
   r   r   Zscapy.asn1.berr   r   r   r   Zscapy.base_classesr   Zscapy.compatr   Zscapy.volatiler   r   r   r   r   r   r   Zscapyr   Zscapy.libs.sixZlibsr   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   Zscapy.asn1packetr)   Ú	Exceptionr*   Úobjectr1   r2   r3   r4   Úboolr{   r=   r|   r}   rŒ   r‘   r™   r›   rœ   r�   rž   rŸ   r    r¡   r¢   r£   r¤   r¥   r§   r¨   r©   rª   r«   rÂ   rÒ   rÅ   rÖ   r×   rØ   rÙ   Z	_CHOICE_TrÝ   rÄ   rí   rï   r/   r/   r/   r0   Ú<module>   sh   0$
<  2 [
ÿZ)sH.