
    h              	       f   d Z ddl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#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ e/rddl0m1Z1  G d de2          Z3 G d de4          Z5 e,d          Z6 e,d          Z7 G d de5e'e6e7f                   Z8 G d de8e9ef                   Z: G d de8e;e
f                   Z< G d de<          Z= G d de8e>ef                   Z? G d de8e>ef                   Z@ G d de<          ZA G d  d!e8e>ef                   ZB G d" d#e=          ZC G d$ d%e@          ZD G d& d'e@          ZE G d( d)e@          ZF G d* d+e@          ZG G d, d-e@          ZH G d. d/e@          ZI G d0 d1e@          ZJ G d2 d3e@          ZK G d4 d5e@          ZL G d6 d7e@          ZM G d8 d9e@          ZN G d: d;e@          ZO G d< d=e8e(e#         e(e#         f                   ZP G d> d?eP          ZQe-d@e+e8e#e#f                  dAe8e#e#f         f         ZR G dB dCe8e(eR         e(ee#                  f                   ZS G dD dEeS          ZT G dF dGe@          ZU G dH dIe<          ZV G dJ dKe5          ZWe-d@e+e8e#e#f                  dAf         ZX G dL dMe8eXee#         f                   ZY G dN dAe8d@e)d@         f                   ZZ G dO dPe?          Z[ G dQ dRe?          Z\ G dS dTe@          Z]dS )Uz/
Classes that implement ASN.1 data structures.
    N)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)packet)AnyAnyStrCallableDictGenericListOptionalTupleTypeTypeVarUnioncastTYPE_CHECKING)ASN1_Packetc                       e Zd ZdS )ASN1F_badsequenceN__name__
__module____qualname__     T/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/asn1fields.pyr,   r,   C           Dr2   r,   c                       e Zd ZdS )ASN1F_elementNr-   r1   r2   r3   r6   r6   G   r4   r2   r6   _I_Ac                       e Zd ZdZdZej        ZeZ	 	 	 	 	 ddZ	d Z
d Zd Zd Zd	 Zd
 Z	 ddZd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )ASN1F_fieldr   NFc                    ||| _         || _        ||| _        n<t          |t                    r|| _        n| j                            |          | _        || _        || _        ||d}t          |          |ot          |          | _        |ot          |          | _        t          |p|p| j                  | _        g | _        d S )Nz5field cannot be both implicitly and explicitly tagged)contextnamedefault
isinstancer
   ASN1_tagasn1_objectsize_lenflexible_tagr   intimplicit_tagexplicit_tagnetwork_tagowners)	selfr=   r>   r<   rE   rF   rC   rB   err_msgs	            r3   __init__zASN1F_field.__init__Y   s     "DL	?"DLL++ 	>"DLL=44W==DL ($<+CMGW%%%(>S->->(>S->->|L|Lt}MMr2   c                 :    | j                             |           d S N)rH   append)rI   clss     r3   register_ownerzASN1F_field.register_ownerw   s    3r2   c                      t          |          S rM   reprrI   pktxs      r3   i2reprzASN1F_field.i2repr{   s    Awwr2   c                     |S rM   r1   rT   s      r3   i2hzASN1F_field.i2h   s    r2   c                 ^   t          || j        | j        | j        | j        | j                  \  }}|| j        || _        n| j        || _        | j                            |j                  }| j        r|                    || j	                  S |
                    || j	                  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_tagrE   rF   safe_fnameN)r<   )r   r@   rE   rF   rC   r=   	get_codec
ASN1_codecsafedecr<   dec)rI   rU   sdiff_tagcodecs        r3   m2izASN1F_field.m2i   s     &aDM373D373D+/+<-1Y	8 8 8!
  ,$,!!".$,!''77 	6==DL=99999Q9555r2   c           	         |dS t          |t                    r| j        t          j        k    s:|j        t          j        k    s%|j        t          j        k    s| j        |j        k    r|                    |j	                  }n\t          d|d| j        d| j        d          | j                            |j	                                      || j                  }t          || j        | j                  S )Nr2   zEncoding Error: got z instead of an z for field [])rB   rE   rF   )r?   r   r@   r   ANYtagRAWERRORencr`   r   r=   r_   rB   r   rE   rF   rI   rU   rV   rc   s       r3   i2mzASN1F_field.i2m   s    93a%% 		W!5!999-111-333}%%EE#.)) j]^]^]^`d`m`m`mosoxoxox!yzzz''77;;A;VVAq,0,=,0,=? ? ? 	?r2   c                 ,    t          t          |          S rM   )r(   r7   rT   s      r3   any2izASN1F_field.any2i   s    B{{r2   c                     	  |||          }n&# t           $ r t          j        ||          }Y nw xY w|                    t          j                  }d}||j        }|j        r|j        `||fS )N_underlayerr2   )r,   r   Rawgetlayerload
underlayerpayload)rI   rO   rc   ru   ccpads         r3   extract_packetzASN1F_field.extract_packet   s    	7A;///AA  	7 	7 	7
1+666AAA	7zz&*%%	A ,O+!ts     33c                 T    |                      |t          || j                            S rM   )rp   getattrr=   rI   rU   s     r3   buildzASN1F_field.build   s"    xxWS$)44555r2   c                 d    |                      ||          \  }}|                     ||           |S rM   )rf   set_val)rI   rU   rc   vs       r3   dissectzASN1F_field.dissect   s2    xxQ1S!r2   c                 >   t          |t                    rc|d d          }t          t          |                    D ]:}t          ||         t                    r||                                         ||<   ;|S t          |d          r|                                S |S )Ncopy)r?   listrangelenr   r   hasattr)rI   rV   is      r3   do_copyzASN1F_field.do_copy   s    a 	!!!A3q66]] ' 'adJ// 'Q499;;AaDH1f 	6688Or2   c                 2    t          || j        |           d S rM   )setattrr=   )rI   rU   vals      r3   r   zASN1F_field.set_val   s    TY$$$$$r2   c                 0    t          || j                  d u S rM   )r   r=   r   s     r3   is_emptyzASN1F_field.is_empty   s    sDI&&$..r2   c                     | gS rM   r1   rI   s    r3   get_fields_listzASN1F_field.get_fields_list   s	    vr2   c                      t          |           S rM   rR   r   s    r3   __str__zASN1F_field.__str__   s    Dzzr2   c                 Z    t          t          t                   t                                S rM   )r(   r   r7   r   r   s    r3   randvalzASN1F_field.randval   s    IbM799---r2   c                 *    t          j         |           S rM   )r   r   s    r3   r   zASN1F_field.copy   s    yr2   )NNNFNrM   )r.   r/   r0   holds_packetsislistr   rj   r@   r<   rK   rP   rW   rY   rf   rp   rr   r}   r   r   r   r   r   r   r   r   r   r1   r2   r3   r:   r:   S   sJ       MF#'H"G
 ""#   <         6 6 6>? ? ?$   $(   $6 6 6  
 
 
% % %/ / /    . . .    r2   r:   c                   "    e Zd Zej        Zd ZdS )ASN1F_BOOLEANc                 "    t          dd          S )NTF)r   r   s    r3   r   zASN1F_BOOLEAN.randval   s    $&&&r2   N)r.   r/   r0   r   BOOLEANr@   r   r1   r2   r3   r   r      s+        #+H' ' ' ' 'r2   r   c                   "    e Zd Zej        Zd ZdS )ASN1F_INTEGERc                 "    t          dd          S )Nl         l    )r   r   s    r3   r   zASN1F_INTEGER.randval  s    vy)))r2   N)r.   r/   r0   r   INTEGERr@   r   r1   r2   r3   r   r     s+        #+H* * * * *r2   r   c                   6     e Zd Z	 	 	 d fd	Z fdZd Z xZS )ASN1F_enum_INTEGERNc                 x   t          t          |                               |||||           i x}| _        i x}| _        t          |t                    rt          t          |                    }	nt          |          }	t          d |	D                       r||}}|	D ]}
||
         ||
<   |
|||
         <   d S )Nr<   rE   rF   c              3   @   K   | ]}t          |t                    V  d S rM   )r?   str).0rV   s     r3   	<genexpr>z.ASN1F_enum_INTEGER.__init__.<locals>.<genexpr>"  s,      00az!S!!000000r2   )
superr   rK   i2ss2ir?   r   r   r   any)rI   r=   r>   enumr<   rE   rF   r   r   keysk	__class__s              r3   rK   zASN1F_enum_INTEGER.__init__  s     	 $''00'7%% 	1 	
 	
 	

 dhdhdD!! 	T##DD::D00400000 	 CC 	 	A!WCFCQLL	 	r2   c                     t          |t                    s|}n| j        |         }t          t          |                               ||          S rM   )r?   r   r   r   r   rp   )rI   rU   rc   vsr   s       r3   rp   zASN1F_enum_INTEGER.i2m(  sJ    
 !S!! 	BB!B'..223;;;r2   c                     |Kt          |t                    r6| j                            |j                  }|rd|dt          |          S t          |          S )N'z' )r?   r	   r   getr   rS   )rI   rU   rV   rs       r3   rW   zASN1F_enum_INTEGER.i2repr3  s[    
 =Z<88=QU##A 0 0$%AAtAwww//Awwr2   NNN)r.   r/   r0   rK   rp   rW   __classcell__r   s   @r3   r   r     sp        
 ""     4	< 	< 	< 	< 	<	 	 	 	 	 	 	r2   r   c                   <     e Zd Zej        Z	 	 	 	 d fd	Zd Z xZS )ASN1F_BIT_STRINGTNc                     t          t          |                               |d |||           t          |t          t
          f          rt          ||          | _        d S || _        d S )Nr   readable)r   r   rK   r?   bytesr   r   r>   )rI   r=   r>   default_readabler<   rE   rF   r   s          r3   rK   zASN1F_BIT_STRING.__init__B  s     	%%..$%% 	/ 	
 	
 	

 gs|,, 	#*74DF F FDLLL #DLLLr2   c                 <    t          t          dd                    S Nr   i  r   r   r   s    r3   r   zASN1F_BIT_STRING.randvalV      '!T**+++r2   )TNNN)	r.   r/   r0   r   
BIT_STRINGr@   rK   r   r   r   s   @r3   r   r   ?  sb        #.H
 #'""# # # # # #(, , , , , , ,r2   r   c                   "    e Zd Zej        Zd ZdS )ASN1F_STRINGc                 <    t          t          dd                    S r   r   r   s    r3   r   zASN1F_STRING.randval^  r   r2   N)r.   r/   r0   r   STRINGr@   r   r1   r2   r3   r   r   [  s+        #*H, , , , ,r2   r   c                       e Zd Zej        ZdS )
ASN1F_NULLN)r.   r/   r0   r   NULLr@   r1   r2   r3   r   r   c  s        #(HHHr2   r   c                   "    e Zd Zej        Zd ZdS )	ASN1F_OIDc                     t                      S rM   )r   r   s    r3   r   zASN1F_OID.randvalj  s    yyr2   N)r.   r/   r0   r   OIDr@   r   r1   r2   r3   r   r   g  s+        #'H    r2   r   c                       e Zd Zej        ZdS )ASN1F_ENUMERATEDN)r.   r/   r0   r   
ENUMERATEDr@   r1   r2   r3   r   r   o          #.HHHr2   r   c                       e Zd Zej        ZdS )ASN1F_UTF8_STRINGN)r.   r/   r0   r   UTF8_STRINGr@   r1   r2   r3   r   r   s  s        #/HHHr2   r   c                       e Zd Zej        ZdS )ASN1F_NUMERIC_STRINGN)r.   r/   r0   r   NUMERIC_STRINGr@   r1   r2   r3   r   r   w          #2HHHr2   r   c                       e Zd Zej        ZdS )ASN1F_PRINTABLE_STRINGN)r.   r/   r0   r   PRINTABLE_STRINGr@   r1   r2   r3   r   r   {          #4HHHr2   r   c                       e Zd Zej        ZdS )ASN1F_T61_STRINGN)r.   r/   r0   r   
T61_STRINGr@   r1   r2   r3   r   r     r   r2   r   c                       e Zd Zej        ZdS )ASN1F_VIDEOTEX_STRINGN)r.   r/   r0   r   VIDEOTEX_STRINGr@   r1   r2   r3   r   r     s        #3HHHr2   r   c                       e Zd Zej        ZdS )ASN1F_IA5_STRINGN)r.   r/   r0   r   
IA5_STRINGr@   r1   r2   r3   r   r     r   r2   r   c                       e Zd Zej        ZdS )ASN1F_GENERAL_STRINGN)r.   r/   r0   r   GENERAL_STRINGr@   r1   r2   r3   r   r     r   r2   r   c                   "    e Zd Zej        Zd ZdS )ASN1F_UTC_TIMEc                     t                      S rM   r   r   s    r3   r   zASN1F_UTC_TIME.randval         r2   N)r.   r/   r0   r   UTC_TIMEr@   r   r1   r2   r3   r   r     s+        #,H! ! ! ! !r2   r   c                   "    e Zd Zej        Zd ZdS )ASN1F_GENERALIZED_TIMEc                     t                      S rM   r   r   s    r3   r   zASN1F_GENERALIZED_TIME.randval  r   r2   N)r.   r/   r0   r   GENERALIZED_TIMEr@   r   r1   r2   r3   r   r     s+        #4H! ! ! ! !r2   r   c                       e Zd Zej        ZdS )ASN1F_ISO646_STRINGN)r.   r/   r0   r   ISO646_STRINGr@   r1   r2   r3   r   r     s        #1HHHr2   r   c                       e Zd Zej        ZdS )ASN1F_UNIVERSAL_STRINGN)r.   r/   r0   r   UNIVERSAL_STRINGr@   r1   r2   r3   r   r     r   r2   r   c                       e Zd Zej        ZdS )ASN1F_BMP_STRINGN)r.   r/   r0   r   
BMP_STRINGr@   r1   r2   r3   r  r    r   r2   r  c                   X     e Zd Zej        ZdZ fdZd Zd Z	d Z
d Zd Z fdZ xZS )	ASN1F_SEQUENCE   c                     d}d |D             } t          t          |           j        ||fi | || _        t	          |          dk    | _        d S )Ndummy_seq_namec                     g | ]	}|j         
S r1   )r>   )r   fields     r3   
<listcomp>z+ASN1F_SEQUENCE.__init__.<locals>.<listcomp>  s    222U5=222r2   r  )r   r  rK   seqr   r   )rI   r  kwargsr=   r>   r   s        r3   rK   zASN1F_SEQUENCE.__init__  sl    22c222,nd##,'	
 	
#	
 	
 	
 #hhlr2   c                 0    d| j         j        | j        dS )N<>)r   r.   r  r   s    r3   __repr__zASN1F_SEQUENCE.__repr__  s     >22DHHH==r2   c                 D    t          fd| j        D                       S )Nc              3   B   K   | ]}|                               V  d S rM   )r   )r   frU   s     r3   r   z*ASN1F_SEQUENCE.is_empty.<locals>.<genexpr>  s-      55q1::c??555555r2   )allr  r   s    `r3   r   zASN1F_SEQUENCE.is_empty  s(    5555DH555555r2   c                 0    t          d | j        g           S )Nc                 0    | |                                 z   S rM   )r   )rV   ys     r3   <lambda>z0ASN1F_SEQUENCE.get_fields_list.<locals>.<lambda>  s    1q'8'8':':#: r2   )r   r  r   s    r3   r   zASN1F_SEQUENCE.get_fields_list  s!    ::h$ $ 	$r2   c                 .   t          || j        | j        | j        | j        |j                  \  }}|| j        || _        n| j        || _        | j                            |j                  }|                    |          \  }}}t          |          dk    r!| j
        D ]}|                    |d           nV| j
        D ]*}	 |                    ||          }# t          $ r Y  nw xY wt          |          dk    rt          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.
        r[   Nr   unexpected remainder	remaining)r   r@   rE   rF   rC   r=   r_   r`   check_type_check_lenr   r  r   r   r,   r   )rI   rU   rc   rd   re   r   remainobjs           r3   rf   zASN1F_SEQUENCE.m2i  sN    &aDM373D373D+/+<-0X	7 7 7!
  ,$,!!".$,!''7711!441fq66Q;;x ' 'C&&&&' x  C++AA(   EE1vvzz()?1MMMM6zs   C
C,+C,c                 8    |                      ||          \  }}|S rM   )rf   )rI   rU   rc   _rV   s        r3   r   zASN1F_SEQUENCE.dissect  s    xxQ1r2   c                     t          fd| j        d          }t          t          |                               |          S )Nc                 4    | |                               z   S rM   )r   )rV   r  rU   s     r3   r  z&ASN1F_SEQUENCE.build.<locals>.<lambda>  s    AGGCLL 0 r2   r2   )r   r  r   r  rp   )rI   rU   rc   r   s    ` r3   r   zASN1F_SEQUENCE.build  sF    00008S" "^T**..sA666r2   )r.   r/   r0   r   SEQUENCEr@   r   rK   r  r   r   rf   r   r   r   r   s   @r3   r  r    s         $,HM# # # # #> > >6 6 6$ $ $
! ! !F  
7 7 7 7 7 7 7 7 7r2   r  c                       e Zd Zej        ZdS )	ASN1F_SETNr.   r/   r0   r   SETr@   r1   r2   r3   r&  r&             #'HHHr2   r&  r*   ASN1F_PACKETc                   d     e Zd ZdZej        ZdZ	 	 	 d fd	Zd Z	d Z
d Z fdZd	 Zd
 Z xZS )ASN1F_SEQUENCE_OFz@
    Two types are allowed as cls: ASN1_Packet, ASN1F_field
    r  Nc                     t          |t                    rt          |t                    st          |t                    r@t          |t                    r ||d           _        n| _         fd _        d _        nUt          |d          st          |          r't          d|           _
         fd _        d _        nt          d          t          t                                         |d |||	           | _        d S )
Nr2   c                 :    j                             ||           S rM   )fldrf   rc   rU   rI   s     r3   r  z,ASN1F_SEQUENCE_OF.__init__.<locals>.<lambda>#  s    $(,,sA2F2F r2   r   	ASN1_rootzType[ASN1_Packet]c                 >                         j        | |          S )Nrt   )r}   rO   r0  s     r3   r  z,ASN1F_SEQUENCE_OF.__init__.<locals>.<lambda>'  s&    $2E2E! 3F 3. 3. r2   r  z*cls should be an ASN1_Packet or ASN1_fieldr   )r?   type
issubclassr:   r/  _extract_packetr   r   callabler(   rO   
ValueErrorr   r,  rK   r>   rI   r=   r>   rO   r<   rE   rF   r   s   `      r3   rK   zASN1F_SEQUENCE_OF.__init__  s-    c4   	KZ[%A%A 	K3,,	K#t$$ 3tS>>#F#F#F#FD !"DS+&& 	K(3-- 	K/55DH$. $. $. $.D !"DIJJJ&&//$%L 	0 	
 	
 	
 r2   c                 8    t                               | |          S rM   )r:   r   r   s     r3   r   zASN1F_SEQUENCE_OF.is_empty2  s     ##D#...r2   c                    t          || j        | j        | j        | j                  \  }}|| j        || _        n| j        || _        | j                            |j                  }|                    |          \  }}}g }|r2|                     ||          \  }}|r|	                    |           |2t          |          dk    rt          d|          ||fS )N)r\   rE   rF   r]   r   r  r  )r   r@   rE   rF   rC   r_   r`   r  r5  rN   r   r   )	rI   rU   rc   rd   re   r   r  lstr{   s	            r3   rf   zASN1F_SEQUENCE_OF.m2i8  s   
 &aDM373D373D+/+<> > >!  ,$,!!".$,!''7711!441f 	''3//DAq 

1  	 q66A::$%;qIIIIF{r2   c                 Z   t          || j                  }t          |t                    rH|j        t
          j        k    r3t          t          t          t                   t          f         |          }n$|d}nd                    d |D                       }|                     ||          S )Nr2   c              3   4   K   | ]}t          |          V  d S rM   r   )r   r   s     r3   r   z*ASN1F_SEQUENCE_OF.build.<locals>.<genexpr>Z  s(      --AQ------r2   )r   r=   r?   r   rk   r   rl   r(   r'   r"   _SEQ_Tr   joinrp   )rI   rU   r   rc   s       r3   r   zASN1F_SEQUENCE_OF.buildQ  s    c49%%c;'' 	./333U4<./55AA[AA-------AxxQr2   c                       j         r)t          t                                         |          S dd                     fd|D                       z  S )Nz[%s], c              3   N   K   | ]}j                             |          V   d S rM   )r/  rW   )r   rV   rU   rI   s     r3   r   z+ASN1F_SEQUENCE_OF.i2repr.<locals>.<genexpr>b  sD       & &,-Q''& & & & & &r2   )r   r   r,  rW   r?  rI   rU   rV   r   s   `` r3   rW   zASN1F_SEQUENCE_OF.i2repr]  sy     	*D1188a@@@DII & & & & &12& & &    r2   c                     | j         r&t          j        |                                           S | j                                        S rM   )r   r   fuzzrO   r/  r   r   s    r3   r   zASN1F_SEQUENCE_OF.randvalf  s9     	&;txxzz***8##%%%r2   c                 2    d| j         j        d| j        dS )Nr   r  )r   r.   r=   r   s    r3   r  zASN1F_SEQUENCE_OF.__repr__m  s       N333TYYY??r2   r   )r.   r/   r0   __doc__r   r$  r@   r   rK   r   rf   r   rW   r   r  r   r   s   @r3   r,  r,    s          $,HF ""     </ / /  2
  
  
     & & &@ @ @ @ @ @ @r2   r,  c                       e Zd Zej        ZdS )ASN1F_SET_OFNr'  r1   r2   r3   rJ  rJ  r  r)  r2   rJ  c                       e Zd Zej        ZdS )ASN1F_IPADDRESSN)r.   r/   r0   r   	IPADDRESSr@   r1   r2   r3   rL  rL  v  s        #-HHHr2   rL  c                       e Zd Zej        ZdS )ASN1F_TIME_TICKSN)r.   r/   r0   r   
TIME_TICKSr@   r1   r2   r3   rO  rO  z  r   r2   rO  c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	ASN1F_optionalc                 "    d|_         || _        d S )NF)rC   _field)rI   r	  s     r3   rK   zASN1F_optional.__init__  s    "r2   c                 ,    t          | j        |          S rM   )r   rT  )rI   attrs     r3   __getattr__zASN1F_optional.__getattr__  s    t{D)))r2   c                 |    	 | j                             ||          S # t          t          t          f$ r d |fcY S w xY wrM   )rT  rf   r   r,   r   rI   rU   rc   s      r3   rf   zASN1F_optional.m2i  sN    	;??3***-/AB 	 	 	7NNN	s    ;;c                     	 | j                             ||          S # t          t          t          f$ r  | j                             |d            |cY S w xY wrM   )rT  r   r   r,   r   r   rY  s      r3   r   zASN1F_optional.dissect  sd    	;&&sA...-/AB 	 	 	KT***HHH	s    4AAc                 n    | j                             |          rdS | j                             |          S )Nr2   )rT  r   r   r   s     r3   r   zASN1F_optional.build  s5    ;$$ 	3{  %%%r2   c                 8    | j                             ||          S rM   )rT  rr   rT   s      r3   rr   zASN1F_optional.any2i  s    {  a(((r2   c                 8    | j                             ||          S rM   )rT  rW   rT   s      r3   rW   zASN1F_optional.i2repr  s    {!!#q)))r2   N)
r.   r/   r0   rK   rW  rf   r   r   rr   rW   r1   r2   r3   rR  rR    s}          
* * *    & & &) ) )* * * * *r2   rR  c                   F     e Zd ZdZdZej        Z fdZd Z	d Z
d Z x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                 p   d|v rd}t          |          d | _        dD ]&}t          | ||                    |                     't	          t
          |                               |d | j        | j                   || _	        d | _
        i | _        i | _        |D ]}t          |d          r~t          d|          }t          |j        d          rDt          t
          |j                  }|j                                        D ]\  }	}
|
| j        |	<   ||| j        |j        j        <   t          |d          rkt%          |t&                    r|| j        t)          |j                  <   || j        |j        <   |j        |j        f| j        t-          |j                  <   t          d          d S )	NrE   z1ASN1F_CHOICE has been called with an implicit_tag)r<   rF   r1  r*   choicesr@   z(ASN1F_CHOICE: no tag found for one field)r   rE   r   r   r   r_  rK   r<   rF   r>   current_choicera  
pktchoicesr   r(   r1  itemsrG   r?   r3  rD   r@   hashrO   )rI   r=   r>   argsr  rJ   kwargprootr   r   r   s              r3   rK   zASN1F_CHOICE.__init__  s   V##IGW%%% 0 	4 	4ED%E!2!23333lD!!**$* 	+ 	
 	
 	
 " 	M 	MAq+&& M**1;	22 >ak::D $ 2 2 4 4 , ,1*+Q, =>DL!899J'' 	Ma&& T45DLQZ11 34DL/45NAN3SDODKK00 !KLLL)	M 	Mr2   c                 h   t          |          dk    rt          d          t          || j        | j                  \  }}t          |          \  }}|| j        v r| j        |         }nQ| j        rt          }nBt          d| j	        d|dt          | j                                                  d          t          |d          r|                     |||	          S t          |t                    r% || j	        d
                              ||          S |                    ||          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)r\   rF   z#ASN1F_CHOICE: unexpected field in 'z' (tag z not in possible tags )r1  rt   r2   )r   r   r   r@   rF   r   ra  rC   r:   r=   r   r   r   r}   r?   r3  rf   )rI   rU   rc   r!  rk   choices         r3   rf   zASN1F_CHOICE.m2i  sE    q66Q;;=>>>qT],0,=? ? ?1AQ$,\#&FF  $ j 			333T\->->-@-@(A(A(A(A   6;'' 	&&&vqc&BBB%% 	&6$)S))--c1555 ::c1%%%r2   c                    |d}nnt          |          }t          t          |                    | j        v r<| j        t          t          |                             \  }}t	          |||          }t	          || j                  S )Nr2   ri   )rF   )r   re  r3  rc  r   rF   )rI   rU   rV   rc   impexps         r3   rp   zASN1F_CHOICE.i2m  s    9AAAADGG}}//?4Q==9S#A14146 6 6 qt/@AAAAr2   c                    g }| j                                         D ]}t          |d          r0|                    t	          j         |                                 Bt          |d          rnt          |t                    r2|                     |dd                                                      |                    |                                           t          | S )Nr1  r@   dummy)
ra  valuesr   rN   r   rE  r?   r3  r   r   )rI   randchoicesrh  s      r3   r   zASN1F_CHOICE.randval
  s    $$&& 
	4 
	4Aq+&& 	4""6;qqss#3#34444J'' 4a&& 4&&qq$'7'7'?'?'A'ABBBB  &&qyy{{333;''r2   )r.   r/   r0   rH  r   r   rj   r@   rK   rf   rp   r   r   r   s   @r3   r_  r_    s         
 M#'H$M $M $M $M $ML& & &@B B B( ( ( ( ( ( (r2   r_  c                   H     e Zd ZdZ	 	 	 	 d fd	Zd Zd Z fdZd Z xZ	S )	r*  r  Nc                     || _         || _        t          t          |                               |d |||           |%|#|!|j        j        t          j        k    rd| _	        || _
        d S )Nr   0   )rO   next_cls_cbr   r*  rK   r1  r@   r   r$  rG   r>   )	rI   r=   r>   rO   r<   rE   rF   rw  r   s	           r3   rK   zASN1F_PACKET.__init__  s     &lD!!**$%L 	+ 	
 	
 	
 L$8S_}%)=)FFF#, r2   c                    | j         r|                      |          p| j        }n| j        }t          |d          s|                     |||          S t	          ||j        j        | j        | j        | j	        | j
                  \  }}|| j        || _        n| j        || _        |sd |fS |                     |||          S )Nr1  rt   r[   )rw  rO   r   r}   r   r1  r@   rE   rF   rC   r=   )rI   rU   rc   rO   rd   s        r3   rf   zASN1F_PACKET.m2i3  s     	""3''348CC(CsK(( 	@&&sA3&???%aCM4J373D373D+/+<-1Y	8 8 8!
  ,$,!!".$,! 	7N""3s";;;r2   c                    |d}nmt          |t                    r|}nUt          |t                    r|j        rt	          |j                  }n$d}n!t	          |          }t          |d          s|S t          || j        | j                  S )Nr2   r1  ri   )	r?   r   r   r   r   r   r   rE   rF   ro   s       r3   rp   zASN1F_PACKET.i2mJ  s    
 9AA5!! 	AA;'' 		u JJAA1k** q,0,=,0,=? ? ? 	?r2   c                     t          |d          r|                    |           t          t          |                               ||          S Nadd_underlayer)r   r|  r   r*  rr   rC  s      r3   rr   zASN1F_PACKET.any2ia  sL    
 1&'' 	"S!!!\4((..sA666r2   c                 N    t          j        |                                           S rM   )r   rE  rO   r   s    r3   r   zASN1F_PACKET.randvalj  s    {488::&&&r2   )NNNN)
r.   r/   r0   r   rK   rf   rp   rr   r   r   r   s   @r3   r*  r*    s        M ""!     *< < <.? ? ?.7 7 7 7 7' ' ' ' ' ' 'r2   c                   L     e Zd ZdZej        Z	 	 	 d fd	Z fdZ fdZ	 x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                     || _         t          t          |                               ||ot	          |          |||           d S )Nr   )rO   r   r  rK   r   r8  s          r3   rK   z ASN1F_BIT_STRING_ENCAPS.__init__v  sX     %t,,55$G%% 	6 	
 	
 	
 	
 	
r2   c                 p   t          t          |                               ||          \  }}t          |j                  dz  dk    rt          d|          |j        r&|                     | j        |j        |          \  }}n	d |j        fS t          |          dk    rt          d|          ||fS )N   r   zwrong bit stringr  rt   r  )	r   r  rf   r   r   r   val_readabler}   rO   )rI   rU   rc   
bit_stringr  rh  r   s         r3   rf   zASN1F_BIT_STRING_ENCAPS.m2i  s    "#:DAAEEc1MM
Fz~"a''$%71EEEE" 	1&&tx1H36 ' 8 8DAqq 000q66A::$%;qIIII&yr2   c                     t          |t                    s"t          |dnt          |          d          }t          t          |                               ||          S )Nr2   Tr   )r?   r   r   r   r  rp   rC  s      r3   rp   zASN1F_BIT_STRING_ENCAPS.i2m  s`    !_-- 	yeAhh  A ,d3377Q???r2   r   )r.   r/   r0   rH  r   r   r@   rK   rf   rp   r   r   s   @r3   r  r  o  s          $.H ""
 
 
 
 
 
$    @ @ @ @ @ @ @ @ @r2   r  c                   <     e Zd Z	 	 	 d fd	Z fdZd Zd Z xZS )ASN1F_FLAGSNc                 r    || _         t          t          |                               ||d|||           d S )NF)r   r<   rE   rF   )mappingr   r  rK   )rI   r=   r>   r  r<   rE   rF   r   s          r3   rK   zASN1F_FLAGS.__init__  sN     k4  ))'"%% 	* 	
 	
 	
 	
 	
r2   c                    t          |t                    rt          d |D                       rbdgt          | j                  z  }|                    d          D ]}d|| j                            |          <    d                    |          }t          |          }t          t          |                               ||          S )Nc              3      K   | ]}|d vV  	dS ))01Nr1   )r   r  s     r3   r   z$ASN1F_FLAGS.any2i.<locals>.<genexpr>  s'      2211J&222222r2   r  +r   )r?   r   r   r   r  splitindexr?  r   r   r  rr   )rI   rU   rV   valuer   r   s        r3   rr   zASN1F_FLAGS.any2i  s    a 	#2222222 #DL 1 11 7 7A36E$,,,Q//00GGENN""A[$''--c1555r2   c                 n     t          | j                  j        } fdt          |          D             S )Nc                 l    g | ]0\  }}|d k    |t          j                  k     #j        |         1S )r  )r   r  )r   r   
positionalrI   s      r3   r
  z)ASN1F_FLAGS.get_flags.<locals>.<listcomp>  sN     @ @ @MAz$$S->->)>)> Q)>)>)>r2   )r   r=   r   	enumerate)rI   rU   fbytess   `  r3   	get_flagszASN1F_FLAGS.get_flags  sQ    di((,@ @ @ @Yv5F5F @ @ @ 	@r2   c                     |=d                     |                     |                    }|dz   t          |          z   S t          |          S )NrA  rG  )r?  r  rS   )rI   rU   rV   pretty_ss       r3   rW   zASN1F_FLAGS.i2repr  sD    =yy!4!455Hc>DGG++Awwr2   r   )r.   r/   r0   rK   rr   r  rW   r   r   s   @r3   r  r    s        
 ""
 
 
 
 
 
$
6 
6 
6 
6 
6@ @ @      r2   r  c                   0     e Zd ZdZdZ fdZ fdZ xZS )ASN1F_STRING_PacketFieldz*
    ASN1F_STRING that holds packets.
    r  c                     t          |d          rt          t          |                    }t          t          |                               ||          S )Nr1  )r   r   r   r   r  rp   )rI   rU   r   r   s      r3   rp   zASN1F_STRING_PacketField.i2m  sI    3$$ 	*eCjj))C-t4488cBBBr2   c                     t          |d          r|                    |           t          t          |                               ||          S r{  )r   r|  r   r  rr   rC  s      r3   rr   zASN1F_STRING_PacketField.any2i  sK    1&'' 	"S!!!-t44::3BBBr2   )r.   r/   r0   rH  r   rp   rr   r   r   s   @r3   r  r    sp          MC C C C CC C C C C C C C Cr2   r  )^rH  r   	functoolsr   scapy.asn1.asn1r   r   r   r   r   r	   r
   r   r   r   scapy.asn1.berr   r   r   r   scapy.base_classesr   scapy.compatr   scapy.volatiler   r   r   r   r   r   r   scapyr   typingr   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   scapy.asn1packetr*   	Exceptionr,   objectr6   r7   r8   r:   boolr   rD   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r&  r>  r,  rJ  rL  rO  rR  	_CHOICE_Tr_  r*  r  r  r  r1   r2   r3   <module>r     s6	                                             * ) ) ) ) )                                                             -,,,,,,	 	 	 	 		 	 	 		 	 	 	 	F 	 	 	 WT]]WT]]c c c c c-R c c cT' ' ' ' 'Kl 23 ' ' '* * * * *K\ 12 * * */ / / / / / / /d, , , , ,{3#78 , , ,8, , , , ,;sK/0 , , ,) ) ) ) ) ) ) )    CM*   / / / / /) / / /0 0 0 0 0 0 0 03 3 3 3 3< 3 3 35 5 5 5 5\ 5 5 5/ / / / /| / / /4 4 4 4 4L 4 4 4/ / / / /| / / /3 3 3 3 3< 3 3 3! ! ! ! !\ ! ! !! ! ! ! !\ ! ! !2 2 2 2 2, 2 2 25 5 5 5 5\ 5 5 5/ / / / /| / / /R7 R7 R7 R7 R7[cDI!56 R7 R7 R7j( ( ( ( ( ( ( ( 
S#X	S
c@ c@ c@ c@ c@DL$(S)9$:%; < c@ c@ c@L( ( ( ( ($ ( ( (. . . . .l . . ./ / / / /} / / /&* &* &* &* &*] &* &* &*R -k#s(&;!<nLM	j( j( j( j( j(;y+c*::; j( j( j(ZQ' Q' Q' Q' Q';}h}.EEF Q' Q' Q'h.@ .@ .@ .@ .@. .@ .@ .@b* * * * *" * * *ZC C C C C| C C C C Cr2   