
    h                        d Z ddlZddl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mZ ddl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 ddlmZ dd	l m!Z! dd
l"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) dZ*i 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&d'd(d)d*d+d,d-d.d/i d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTZ+ G dU dVe          Z, G dW dXe,          Z-ddYiZ. G dZ d[e          Z/ G d\ d]e          Z0 G d^ d_e          Z1 G d` dae-          Z2 G db dce-          Z3 G dd dee,          Z4 G df dge,          Z5dhdidjdkdlZ6 G dm dne          Z7 G do dpe          Z8 G dq dre          Z9 G ds dte          Z:e7e8e9e:dlZ; G du dve          Z< G dw dxe,          Z= G dy dze,          Z> G d{ d|e          Z? G d} d~e          Z@ddiZAde@iZB G d de          ZC G d de,          ZD G d de,          ZE G d de,          ZF G d de,          ZGdddZH G d de,          ZI G d de,          ZJd ZK G d de,          ZL G d deL          ZMddddZN G d de,          ZO G d de,          ZP G d de,          ZQ G d de          ZR G d de          ZS G d de-          ZT G d de,          ZU G d de,          ZV G d de,          ZW G d de,          ZX G d de,          ZY G d de,          ZZ G d de,          Z[ G d de,          Z\e[e\e[dZ] G d de,          Z^ G d de,          Z_ G d de,          Z`e_e`dZa G d de,          ZbdddZc G d de,          Zd G dĄ de,          Ze G dƄ de-          Zf G dȄ de,          Zg G dʄ de,          Zh G d̄ de,          Zi G d΄ de,          Zji de2de4de5de=de>deDdeEdeFdeGd eKd"eLd$eOd&ePd(eQd*eTd2eUd4eVeWejeXeZe[e^ebedegeheYefeie3dМZk G dф de          Zl G dӄ de          ZmdS )z
TLS handshake extensions.
    N)ByteEnumField	ByteField	EnumFieldFieldLenFieldFieldListFieldIntFieldMayEndPacketFieldPacketListFieldShortEnumField
ShortFieldStrFixedLenFieldStrLenFieldXStrLenField)PacketRawPadding)X509_Extensions)_tls_version)SigAndHashAlgsLenFieldSigAndHashAlgsField_tls_hash_sig)_GenericTLSSessionInheritance)_tls_named_groups)_tls_cipher_suites)AnsiColorTheme)raw)confs    !tae¢z^	Ȩ3server_name   max_fragment_length   client_certificate_url   trusted_ca_keys   truncated_hmac   status_request   user_mapping   client_authz   server_authz	   	cert_type
   supported_groups   ec_point_formats   signature_algorithms   	heartbeat   alpn   signed_certificate_timestamp   client_certificate_type   server_certificate_type   padding   encrypt_then_mac   extended_master_secret   record_size_limit#   session_ticket)   pre_shared_key*   early_data_indication+   supported_versions,   cookie-   psk_key_exchange_modes/   certificate_authorities0   oid_filters1   post_handshake_auth2   signature_algorithms_cert3   	key_sharet3  next_protocol_negotiationrenegotiation_infoencrypted_server_name)    c                   p    e Zd ZdZdZ edde           edddd           edd	d
           gZ	d Z
dS )TLS_Ext_Unknownza
    We put this here rather than in extensions.py in order to avoid
    circular imports...
    zTLS Extension - Scapy UnknowntypeNlen!Hvalfmt	length_of c                     | j         S Nri   pkts    _/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/tls/extensions.py<lambda>zTLS_Ext_Unknown.<lambda>p       sw     length_fromc                     | j         =t          |          dz
  }|d d         t          j        d|          z   |dd          z   }||z   S )Nr&   r"   rj   )ri   structpack)selfppaytmp_lens       ru   
post_buildzTLS_Ext_Unknown.post_buildr   sM    8!ffqjG"1"D'222QqrrU:A3wrx   )__name__
__module____qualname____doc__namer   _tls_extr   r   fields_descr    rx   ru   rg   rg   g   s          +D!>&$99 =$%HHH;ub+>+>@ @ @AK
    rx   rg   c                       e Zd ZdZ	 	 ddZdS )	TLS_Ext_PrettyPacketListz
    Dummy extension used for server_name/ALPN/NPN for a lighter representation:
    the final field is showed as a 1-line list rather than as lots of packets.
    XXX Define a new condition for packet lists in Packet._show_or_dump?
    Fr$   ro   Tc           
      B   |rt                      nt          j        }||                    d          d|                    | j                  d|                    d          d}| j        dd         D ]}|j        }	|j        }
| 	                    |j                  }||z   d |	|j                  d|                    d	          d}|
                    | |          }t          |t                    rQ|                    d
d
dt          |          t          |          z   t          |j                  z   dz   z  z             }|| |
|          d
z  }| j        d         }|j        }	|j        }
| 	                    |j                  }||z   d |	|j                  d|                    d	          d}|
                    | |          }t          |t                    rQ|                    d
d
dt          |          t          |          z   t          |j                  z   dz   z  z             }|| |
|          d
z  }| j        r0|| j                            |||d|z  | j        z  z   |d          z  }|r|st%          |           dS |S )z Reproduced from packet.py z###[ z]###z 
Nz  10=
r&   F)dumpindentlvl	label_lvl
first_call)r   r   color_themepunct
layer_namer   r   
field_namefield_valuegetfieldvali2repr
isinstancestrreplaceri   payload_show_or_dumpshow_indentprint)r~   r   r   r   r   r   ctsfncolvcolfvaluebegnreprvals                 ru   r   z&TLS_Ext_PrettyPacketList._show_or_dump   s    "&;^4+;(y"((6*:*:*:*:!}}TY7777&9I9I9I9IK!#2#& 	2 	2A=D>D%%af--F%.___dd16llll%'XXc]]]]5DhhtV,,G'3'' B!//$sc)nn>A#hh?G>A!&kk?J ?@?@ 8A 1A B B TT44====11AAR }~!!!&))!*S$$qv,,,,O((4((gs## 	>oodD3#i..:=c((;C:=af++;F ;<;< 4= -= > >G 	
ttG}}}}--< 	S++f03sV|dFV7V0W6?E , S S SA  	d 	!HHHHHHrx   N)Fr$   ro   ro   T)r   r   r   r   r   r   rx   ru   r   r      s:          017;' ' ' ' ' 'rx   r   	host_namec                   j    e Zd ZdZ edde           eddd           eddd	 
          gZd Z	dS )
ServerNameHostNamenametyper   namelenN
servernamern   ro   c                     | j         S rq   )r   rs   s    ru   rv   zServerName.<lambda>   s    s{ rx   ry   c                     t           S rq   r   r~   r   s     ru   guess_payload_classzServerName.guess_payload_class       rx   )
r   r   r   r   r   _tls_server_name_typesr   r   r   r   r   rx   ru   r   r      sw        D =Q0FGG =DLIII;|R+B+BD D DEK
    rx   r   c                       e Zd Zd ZdS )ServerListFieldc                 ^    d |D             }dd                     d |D                       z  S )Nc                     g | ]	}|j         
S r   )r   .0r   s     ru   
<listcomp>z*ServerListField.i2repr.<locals>.<listcomp>   s    '''q|'''rx   [%s], c              3   4   K   | ]}t          |          V  d S rq   reprr   xs     ru   	<genexpr>z)ServerListField.i2repr.<locals>.<genexpr>   (      !7!7a$q''!7!7!7!7!7!7rx   joinr~   rt   r   ress       ru   r   zServerListField.i2repr   s;    ''Q'''		!7!73!7!7!77777rx   Nr   r   r   r   r   rx   ru   r   r      #        8 8 8 8 8rx   r   c                   "     e Zd ZdZ fdZ xZS )ServerLenFieldzQ
    There is no length when there are no servernames (as in a ServerHello).
    c                 n    |s	|j         s|S t          t          |                               |||          S rq   )servernamessuperr   addfield)r~   rt   r   rk   	__class__s       ru   r   zServerLenField.addfield   s<     	? ^T**33CC@@@rx   )r   r   r   r   r   __classcell__r   s   @ru   r   r      sK         A A A A A A A A Arx   r   c            	           e Zd ZdZ edde           e edddd                      ed	dd
           e	dg e
d           gZdS )TLS_Ext_ServerNamezTLS Extension - Server Namerh   r   ri   Nr   c                     |dz   S )Nr"   r   )rt   r   s     ru   rv   zTLS_Ext_ServerName.<lambda>   s
    a!e rx   )rn   adjustservernameslenr   c                     | j         S rq   )r   rs   s    ru   rv   zTLS_Ext_ServerName.<lambda>   s	    3;M rx   ry   )r   r   r   r   r   r   r	   r   r   r   r   r   r   rx   ru   r   r      s        (D!>&!X666--t}/C/CE E E F F!>"2D,9; ; ;"?="j/M/MO O OPKKKrx   r   c                   ,   e Zd ZdZ edde           e edd                     edde	           edde
           eddd	d
           ed	dd            eddd           eddd            edddd
           eddd           g
ZdS )TLS_Ext_EncryptedServerNamez%TLS Extension - Encrypted Server Namerh   re   ri   Ncipherkey_exchange_groupkey_exchange_lenkey_exchangeH)rn   rm   ro   c                     | j         S rq   )r   rs   s    ru   rv   z$TLS_Ext_EncryptedServerName.<lambda>   s	    8L rx   ry   record_digest_lenrecord_digestr   c                     | j         S rq   )r   rs   s    ru   rv   z$TLS_Ext_EncryptedServerName.<lambda>   	    8M rx   encrypted_sni_lenencrypted_snic                     | j         S rq   )r   rs   s    ru   rv   z$TLS_Ext_EncryptedServerName.<lambda>   r   rx   )r   r   r   r   r   r   r	   r   r   r   r   r   r   r   r   rx   ru   r   r      s2       2D!>&&(;;6**UD11229Xt-?@@!>"6"35 5 =!3T+9sD D D<,L,LN N N =!4!%B B B<,M,MO O O =!4d+:E E E<,M,MO O OPKKKrx   r   c                   x    e Zd ZdZ edde           e edd                     edddd	d
dd          gZ	dS )TLS_Ext_MaxFragLenz#TLS Extension - Max Fragment Lengthrh   r    ri   N
maxfraglenr&   z2^9z2^10z2^11z2^12)r    r"   r$   r&   
r   r   r   r   r   r   r	   r   r   r   r   rx   ru   r   r      sm        0D!>&!X666**UD1122 =qe6<6<6<3> 3> ? ?@KKKrx   r   c                   V    e Zd ZdZ edde           e edd                    gZdS )TLS_Ext_ClientCertURLz&TLS Extension - Client Certificate URLrh   r"   ri   N	r   r   r   r   r   r   r	   r   r   r   rx   ru   r   r      sD        3D!>&!X666**UD11224KKKrx   r   
pre_agreedkey_sha1_hash	x509_namecert_sha1_hash)r   r    r"   r$   c                   4    e Zd ZdZ edde          gZd ZdS )TAPreAgreedzTrusted authority - pre_agreedidtyper   c                     t           S rq   r   r   s     ru   r   zTAPreAgreed.guess_payload_class  r   rx   N)r   r   r   r   r   _tls_trusted_authority_typesr   r   r   rx   ru   r   r     s?        +D =1.JKKLK    rx   r   c                   L    e Zd ZdZ edde           eddd          gZd ZdS )TAKeySHA1Hashz!Trusted authority - key_sha1_hashr   r    idNr@   c                     t           S rq   r   r   s     ru   r   z!TAKeySHA1Hash.guess_payload_class  r   rx   	r   r   r   r   r   r   r   r   r   r   rx   ru   r  r    sS        .D =1.JKK##D$335K    rx   r  c                   n    e Zd ZdZdZ edde           eddd           edd	d
           gZ	d Z
dS )
TAX509Namezm
    XXX Section 3.4 of RFC 4366. Implement a more specific DNField
    rather than current StrLenField.
    zTrusted authority - x509_namer   r"   dnlenNdnr   ro   c                     | j         S rq   )r  rs   s    ru   rv   zTAX509Name.<lambda>   s     rx   ry   c                     t           S rq   r   r   s     ru   r   zTAX509Name.guess_payload_class"  r   rx   )r   r   r   r   r   r   r   r   r   r   r   r   rx   ru   r  r    sz          +D =1.JKK =$$???;tR5J5JKKKMK    rx   r  c                   L    e Zd ZdZ edde           eddd          gZd ZdS )TACertSHA1Hashz"Trusted authority - cert_sha1_hashr   r$   r  Nr@   c                     t           S rq   r   r   s     ru   r   z"TACertSHA1Hash.guess_payload_class+  r   rx   r  r   rx   ru   r  r  &  sS        /D =1.JKK##D$335K    rx   r  c                       e Zd ZdZd ZdS )_TAListFieldz
    Specific version that selects the right Trusted Authority (previous TA*)
    class to be used for dissection based on idtype.
    c                 |    t          |d                   }| j        }|t          v rt          |         } ||          S Nr   )ordcls_tls_trusted_authority_clsr~   rt   mr   r  s        ru   m2iz_TAListField.m2i;  s;    QqTh///,V4Cs1vvrx   N)r   r   r   r   r  r   rx   ru   r  r  5  s-         
    rx   r  c            	           e Zd ZdZ edde           e edd                     eddd           e	dg e
d	 
          gZdS )TLS_Ext_TrustedCAIndz%TLS Extension - Trusted CA Indicationrh   r$   ri   Ntalentar   c                     | j         S rq   )r  rs   s    ru   rv   zTLS_Ext_TrustedCAInd.<lambda>I  s    	 rx   ry   )r   r   r   r   r   r   r	   r   r   r  r   r   r   rx   ru   r  r  C  s|        2D!>&!X666**UD1122 =$$???<b#,A,AC C CDKKKrx   r  c                   V    e Zd ZdZ edde           e edd                    gZdS )TLS_Ext_TruncatedHMACzTLS Extension - Truncated HMACrh   r&   ri   Nr   r   rx   ru   r  r  L  sD        +D!>&!X666**UD11224KKKrx   r  c                   R    e Zd ZdZ eddd           eddd           gZd	 ZdS )
ResponderIDzResponder ID structure	respidlenNrespidr   ro   c                     | j         S rq   r"  rs   s    ru   rv   zResponderID.<lambda>V  s    s} rx   ry   c                     t           S rq   r   r   s     ru   r   zResponderID.guess_payload_classX  r   rx   r   r   r   r   r   r   r   r   r   rx   ru   r!  r!  R  se        #D =dhGGG;x+D+DF F FGK    rx   r!  c                       e Zd ZdZdZ eddd           edg ed            ed	dd
           ed
de	          gZ
d ZdS )OCSPStatusRequestzE
    This is the structure defined in RFC 6066, not in RFC 6960!
    zOCSPStatusRequest structurer"  Nr#  r   c                     | j         S rq   r%  rs   s    ru   rv   zOCSPStatusRequest.<lambda>c  s    3= rx   ry   	reqextlenreqextro   c                     t           S rq   r   r   s     ru   r   z%OCSPStatusRequest.guess_payload_classg  r   rx   )r   r   r   r   r   r   r   r!  r
   r   r   r   r   rx   ru   r)  r)  \  s          )D =dhGGG"?8R/H/HJ J J =dhGGG;x_==	?K    rx   r)  ocspc                       e Zd Zd ZdS )_StatusReqFieldc                 `    |j         }| j        }|t          v rt          |         } ||          S rq   )styper  _cert_status_req_clsr  s        ru   r  z_StatusReqField.m2ip  s3    h)))&v.Cs1vvrx   N)r   r   r   r  r   rx   ru   r0  r0  o  s#            rx   r0  c            	           e Zd ZdZ edde           e edd                     edde	           e
dg ed 	          gZdS )
TLS_Ext_CSRz*TLS Extension - Certificate Status Requestrh   r(   ri   Nr2  reqc                     | j         dz
  S )Nr    rr   rs   s    ru   rv   zTLS_Ext_CSR.<lambda>~  s    37Q; rx   ry   )r   r   r   r   r   r   r	   r   r   _cert_status_typer0  r   r   r   rx   ru   r5  r5  x  sz        7D!>&!X666**UD1122 =$0ABB"?5"c/F/FH H HIKKKrx   r5  c                       e Zd ZdZ edde           e edd                     edddd	           e	dg  e
d
d          d           gZdS )TLS_Ext_UserMappingzTLS Extension - User Mappingrh   r*   ri   NumlenBumrl   umtyper   c                     | j         S rq   )r;  rs   s    ru   rv   zTLS_Ext_UserMapping.<lambda>  s    #) rx   ry   )r   r   r   r   r   r   r	   r   r   r   r   r   r   rx   ru   r:  r:    s        )D!>&!X666**UD1122 =$C4HHH!>$"+)Ha"8"8.C.CE E EFKKKrx   r:  c                   Z    e Zd ZdZdZ edde           e edd                    gZ	dS )TLS_Ext_ClientAuthz XXX Unsupported zTLS Extension - Client Authzrh   r,   ri   N
r   r   r   r   r   r   r   r	   r   r   r   rx   ru   rA  rA    J        )D!>&!X666**UD1122KKKrx   rA  c                   Z    e Zd ZdZdZ edde           e edd                    gZ	dS )TLS_Ext_ServerAuthzrB  zTLS Extension - Server Authzrh   r.   ri   NrC  r   rx   ru   rF  rF    rD  rx   rF  zX.509OpenPGP)r   r    c                       e Zd ZdZ edde           e edd                     eddd           e	dd	d
g e
dde          d           gZdS )TLS_Ext_ClientCertTypez1TLS Extension - Certificate Type (client version)rh   r0   ri   N	ctypeslenctypesr   r   r    	certtypesc                     | j         S rq   )rJ  rs   s    ru   rv   zTLS_Ext_ClientCertType.<lambda>      #- rx   ry   )r   r   r   r   r   r   r	   r   r   r   r   _tls_cert_typesr   r   rx   ru   rI  rI    s        >D!>&!X666**UD1122 =dhGGG!>(QF"/-T0?#A #A.G.GI I IJKKKrx   rI  c                   n    e Zd ZdZ edde           e edd                     edde	          gZ
dS )TLS_Ext_ServerCertTypez1TLS Extension - Certificate Type (server version)rh   r0   ri   Nctype)r   r   r   r   r   r   r	   r   r   rO  r   r   rx   ru   rQ  rQ    sV        >D!>&!X666**UD1122 =$@@BKKKrx   rQ  c                     t          j        d| dd                   d         }|dk    rt          }nt          } || g|R i |S )z
    We need to select the correct one on dissection. We use the length for
    that, as 1 for client version would imply an empty list.
    rj   r"   r&   r   r    )r|   unpackrQ  rI  )r  argskargsr   r  s        ru   _TLS_Ext_CertTypeDispatcherrW    sW    
 mD!AaC&))!,G!||$$3q!4!!!5!!!rx   c                       e Zd ZdZdZ edde           e edd                     e	ddd	           e
dg  ed
de          d           gZdS )TLS_Ext_SupportedGroupsz
    This extension was known as 'Supported Elliptic Curves' before TLS 1.3
    merged both group selection mechanisms for ECDH and FFDH.
    z TLS Extension - Supported Groupsrh   r2   ri   N	groupslengroupsr   ngc                     | j         S rq   )rZ  rs   s    ru   rv   z TLS_Ext_SupportedGroups.<lambda>  rN  rx   ry   )r   r   r   r   r   r   r   r	   r   r   r   r   r   r   rx   ru   rY  rY    s          .D!>&"h776**UD1122 =dhGGG!>(B"0.t1B#D #D.G.GI I IJKKKrx   rY  c                       e Zd ZdS )TLS_Ext_SupportedEllipticCurvesN)r   r   r   r   rx   ru   r_  r_    s        Drx   r_  uncompressedansiX962_compressed_primeansiX962_compressed_char2)r   r    r"   c                       e Zd ZdZ edde           e edd                     edddd	           e	dd
g e
dde          d           gZdS )TLS_Ext_SupportedPointFormatz&TLS Extension - Supported Point Formatrh   r4   ri   Necpllenr<  ecplrl   r   ncc                     | j         S rq   )re  rs   s    ru   rv   z%TLS_Ext_SupportedPointFormat.<lambda>  s    #+ rx   ry   )r   r   r   r   r   r   r	   r   r   r   r   _tls_ecpoint_formatr   r   rx   ru   rd  rd    s        3D!>&"h776**UD1122 =DcVLLL!>&1#"/-d0C#E #E.E.EG G GHKKKrx   rd  c                       e Zd ZdZ edde           e edd                     eddd           e	dg  e
d	de          d
           gZdS )TLS_Ext_SignatureAlgorithmsz$TLS Extension - Signature Algorithmsrh   r6   ri   Nsig_algs_lensig_algsr   hash_sigc                     | j         S rq   rl  rs   s    ru   rv   z$TLS_Ext_SignatureAlgorithms.<lambda>  	    s?O rx   ry   r   r   r   r   r   r   r	   r   r   r   r   r   r   r   rx   ru   rk  rk    s        1D!>&"h776**UD1122)).$4>@ @ @&&z2'0yT1>(@ (@3O3OQ Q Q	RKKKrx   rk  c            	       t    e Zd ZdZ edde           e edd                     edddd	d
          gZ	dS )TLS_Ext_HeartbeatzTLS Extension - Heartbeatrh   r8   ri   Nheartbeat_moder"   peer_allowed_to_sendpeer_not_allowed_to_sendr    r"   r   r   rx   ru   rt  rt    sm        &D!>&$996**UD1122 =!11%;%?"A "AB BCKKKrx   rt  c                   T    e Zd ZdZ edddd           eddd 	          gZd
 ZdS )ProtocolNamezProtocol Nameri   Nr<  protocolrl   ro   c                     | j         S rq   rr   rs   s    ru   rv   zProtocolName.<lambda>  rw   rx   ry   c                     t           S rq   r   r   s     ru   r   z ProtocolName.guess_payload_class  r   rx   r'  r   rx   ru   rz  rz    sg        D =#LLL;z2+>+>@ @ @AK    rx   rz  c                       e Zd Zd ZdS )ProtocolListFieldc                 ^    d |D             }dd                     d |D                       z  S )Nc                     g | ]	}|j         
S r   )r{  r   s     ru   r   z,ProtocolListField.i2repr.<locals>.<listcomp>  s    %%%aqz%%%rx   r   r   c              3   4   K   | ]}t          |          V  d S rq   r   r   s     ru   r   z+ProtocolListField.i2repr.<locals>.<genexpr>  r   rx   r   r   s       ru   r   zProtocolListField.i2repr   s;    %%1%%%		!7!73!7!7!77777rx   Nr   r   rx   ru   r  r    r   rx   r  c            	           e Zd ZdZ edde           e edd                     eddd           e	dg e
d	 
          gZdS )TLS_Ext_ALPNz6TLS Extension - Application Layer Protocol Negotiationrh   r:   ri   Nprotocolslen	protocolsr   c                     | j         S rq   )r  rs   s    ru   rv   zTLS_Ext_ALPN.<lambda>  s	    C<L rx   ry   )r   r   r   r   r   r   r	   r   r   r  rz  r   r   rx   ru   r  r    s}        CD!>&$996**UD1122 =MMM$$["l1L1LN N NOKKKrx   r  c                   d    e Zd ZdZ edde           eddd           eddd	 
          gZdS )TLS_Ext_PaddingzTLS Extension - Paddingrh   rB   ri   NrC   r   ro   c                     | j         S rq   rr   rs   s    ru   rv   zTLS_Ext_Padding.<lambda>  rw   rx   ry   )	r   r   r   r   r   r   r   r   r   r   rx   ru   r  r    sa        $D!>&$99 =	BBB;y"+>+>@ @ @AKKKrx   r  c                   V    e Zd ZdZ edde           e edd                    gZdS )TLS_Ext_EncryptThenMACz TLS Extension - Encrypt-then-MACrh   rD   ri   Nr   r   rx   ru   r  r    sD        -D!>&$996**UD11224KKKrx   r  c                   V    e Zd ZdZ edde           e edd                    gZdS )TLS_Ext_ExtendedMasterSecretz&TLS Extension - Extended Master Secretrh   rF   ri   Nr   r   rx   ru   r  r    sD        3D!>&$996**UD11224KKKrx   r  c                   h    e Zd ZdZdZ edde           eddd           edd	d
           gZ	dS )TLS_Ext_SessionTicketz
    RFC 5077 updates RFC 4507 according to most implementations, which do not
    use another (useless) 'ticketlen' field after the global 'len' field.
    zTLS Extension - Session Ticketrh   rJ   ri   Nticketr   ro   c                     | j         S rq   rr   rs   s    ru   rv   zTLS_Ext_SessionTicket.<lambda>+  rw   rx   ry   )
r   r   r   r   r   r   r   r   r   r   r   rx   ru   r  r  "  sm          ,D!>&$99 =AAA;x+>+>@ @ @AKKKrx   r  c                   V    e Zd ZdZ edde           e edd                    gZdS )TLS_Ext_KeySharez'TLS Extension - Key Share (dummy class)rh   r^   ri   Nr   r   rx   ru   r  r  .  sD        4D!>&$996**UD11224KKKrx   r  c                   V    e Zd ZdZ edde           e edd                    gZdS )TLS_Ext_PreSharedKeyz,TLS Extension - Pre Shared Key (dummy class)rh   rL   ri   Nr   r   rx   ru   r  r  4  sD        9D!>&$996**UD11224KKKrx   r  c                   V    e Zd ZdZ edde           e edd                    gZdS )TLS_Ext_EarlyDataIndicationzTLS Extension - Early Datarh   rN   ri   Nr   r   rx   ru   r  r  :  sD        'D!>&$996**UD11224KKKrx   r  c                   l    e Zd ZdZ edde           e edd                     edd          gZ	dS )!TLS_Ext_EarlyDataIndicationTicket&TLS Extension - Ticket Early Data Inforh   rN   ri   Nmax_early_data_sizer   
r   r   r   r   r   r   r	   r   r   r   r   rx   ru   r  r  @  T        3D!>&$996**UD1122811557KKKrx   r  )r    r&   r.   c                   V    e Zd ZdZ edde           e edd                    gZdS )TLS_Ext_SupportedVersionsz0TLS Extension - Supported Versions (dummy class)rh   rP   ri   Nr   r   rx   ru   r  r  L  sD        =D!>&$996**UD11224KKKrx   r  c                       e Zd ZdZ edde           e edd                     edddd	           e	dg  ed
de
          d           gZdS )TLS_Ext_SupportedVersion_CHz4TLS Extension - Supported Versions (for ClientHello)rh   rP   ri   Nversionslenr<  versionsrl   versionc                     | j         S rq   )r  rs   s    ru   rv   z$TLS_Ext_SupportedVersion_CH.<lambda>[  s    #/ rx   ry   )r   r   r   r   r   r   r	   r   r   r   r   r   r   rx   ru   r  r  R  s        AD!>&$996**UD1122 =#+57 7 7!>*b"0.D1=#? #?.I.IK K K	LKKKrx   r  c                   n    e Zd ZdZ edde           e edd                     edde          gZ	dS )TLS_Ext_SupportedVersion_SHz4TLS Extension - Supported Versions (for ServerHello)rh   rP   ri   Nr  )
r   r   r   r   r   r   r	   r   r   r   r   rx   ru   r  r  ^  sV        AD!>&$996**UD1122!>)T<@@BKKKrx   r  rx  c                       e Zd ZdZ edde           e edd                     eddd           e	dd	d
           gZ
d ZdS )TLS_Ext_CookiezTLS Extension - Cookierh   rR   ri   N	cookielenrS   r   ro   c                     | j         S rq   )r  rs   s    ru   rv   zTLS_Ext_Cookie.<lambda>o  s     rx   ry   c                     |                      d          }||dk    rt          j        d          | _        t                              |           S )NrS   rx       )r   osurandomrS   rg   build)r~   fvals     ru   r  zTLS_Ext_Cookie.buildq  sE    ))<43;;*R..DK$$T***rx   )r   r   r   r   r   r   r	   r   r   r   r   r  r   rx   ru   r  r  i  s        #D!>&$996**UD1122 =dhGGG<",E,EG G GHK+ + + + +rx   r  psk_ke
psk_dhe_kec                       e Zd ZdZ edde           e edd                     edddd	           e	dg  e
d
de          d           gZdS )TLS_Ext_PSKKeyExchangeModesz&TLS Extension - PSK Key Exchange Modesrh   rT   ri   N
kxmodeslenr<  kxmodesrl   kxmodec                     | j         S rq   )r  rs   s    ru   rv   z$TLS_Ext_PSKKeyExchangeModes.<lambda>  s    #. rx   ry   )r   r   r   r   r   r   r	   r   r   r   r   _tls_psk_kx_modesr   r   rx   ru   r  r  {  s        3D!>&$996**UD1122 =t+46 6 6!>)R"/-$0A#C #C.H.HJ J J	KKKKrx   r  c                   l    e Zd ZdZ edde           e edd                     edd          gZ	dS )TLS_Ext_TicketEarlyDataInfor  rh   .   ri   Nr  r   r  r   rx   ru   r  r    r  rx   r  c                   j    e Zd ZdZdZ edde           eddd           edg e	d	 
          gZ
dS )TLS_Ext_NPNzU
    Defined in RFC-draft-agl-tls-nextprotoneg-03. Deprecated in favour of ALPN.
    z)TLS Extension - Next Protocol Negotiationrh   r`   ri   Nr  r   c                     | j         S rq   rr   rs   s    ru   rv   zTLS_Ext_NPN.<lambda>  s    CG rx   ry   )r   r   r   r   r   r   r   r   r  rz  r   r   rx   ru   r  r    sp          7D!>&&(;; =DDD$$["l1C1CE E EFKKKrx   r  c                   V    e Zd ZdZ edde           e edd                    gZdS )TLS_Ext_PostHandshakeAuthz#TLS Extension - Post Handshake Authrh   rZ   ri   Nr   r   rx   ru   r  r    sD        0D!>&$996**UD11224KKKrx   r  c                       e Zd ZdZ edde           e edd                     eddd           e	dg  e
d	de          d
           gZdS )TLS_Ext_SignatureAlgorithmsCertz)TLS Extension - Signature Algorithms Certrh   r\   ri   Nrl  rm  r   rn  c                     | j         S rq   rp  rs   s    ru   rv   z(TLS_Ext_SignatureAlgorithmsCert.<lambda>  rq  rx   ry   rr  r   rx   ru   r  r    s        6D!>&$996**UD1122)).$4>@ @ @&&z2'0yT1>(@ (@3O3OQ Q Q	RKKKrx   r  c                       e Zd ZdZ edde           e edd                     edddd	           e	dd
d           gZ
dS )TLS_Ext_RenegotiationInfoz(TLS Extension - Renegotiation Indicationrh   rd   ri   Nreneg_conn_lenr<  renegotiated_connectionrl   ro   c                     | j         S rq   )r  rs   s    ru   rv   z"TLS_Ext_RenegotiationInfo.<lambda>  s	    s7I rx   ry   )r   r   r   r   r   r   r	   r   r   r   r   r   rx   ru   r  r    s        5D!>&&(;;6**UD1122 =!14S+DF F F;8"+I+IK K K	LKKKrx   r  c                   l    e Zd ZdZ edde           e edd                     edd          gZdS )TLS_Ext_RecordSizeLimitz!TLS Extension - Record Size Limitrh   rH   ri   NrI   r   r   rx   ru   r  r    sT        .D!>&$996**UD1122:1488:KKKrx   r  )rF   rH   rJ   rL   rN   rP   rR   rT   rZ   r\   r^   r`   rd   re   c                   $     e Zd Z fdZd Z xZS )_ExtensionsLenFieldc                     |                     | j                  }|                    |          }||dk     r|j        j        }||dk     r|dfS t          t          |                               ||          S )z
        We try to compute a length, usually from a msglen parsed earlier.
        If we can not find any length, we consider 'extensions_present'
        (from RFC 5246) to be False.
        Nr     )	get_fieldrn   rz   tls_sessiontls_versionr   r  getfield)r~   rt   r   extr   vr   s         ru   r  z_ExtensionsLenField.getfield  sw     mmDN++//#&&?gkk+AyAJJ$w($//88a@@@rx   c                    || j         |                    | j                   \  }}|j        j        }d|j        _        |                    ||          }||j        _        |                     ||          }|dk    r3|j        j        }||dk     r|S |t          j        | j	        |          z   S |t          j        | j	        |          z   S )a  
        There is a hack with the _ExtensionsField.i2len. It works only because
        we expect _ExtensionsField.i2m to return a string of the same size (if
        not of the same value) upon successive calls (e.g. through i2len here,
        then i2m when directly building the _ExtensionsField).

        XXX A proper way to do this would be to keep the extensions built from
        the i2len call here, instead of rebuilding them later on.
        NTr   r  )
rn   getfield_and_valr  frozeni2lenr   r  r|   r}   rm   )	r~   rt   r   ifldr  tmpr   r  s	            ru   r   z_ExtensionsLenField.addfield  s     9~)00@@	To,)-&IIc4((),&KKQ''663AyAJJ  6;tx#;#;;;6;tx++++rx   )r   r   r   r  r   r   r   s   @ru   r  r    sL        A A A A A, , , , , , ,rx   r  c                   .    e Zd ZdZdZd Zd Zd Zd ZdS )_ExtensionsFieldr    c                 P    |dS t          |                     ||                    S r  )ri   i2m)r~   rt   r  s      ru   r  z_ExtensionsField.i2len  s(    91488C##$$$rx   c                     |                      |          pd}|dk    r|g fS ||d          |                     ||d |                   fS r  )rz   r  )r~   rt   r   r   s       ru   r  z_ExtensionsField.getfield  sU    ""3'',1a<<b5L{DHHS!HWH+6666rx   c                 D   |dS t          |t                    r`|j        j        sTd}|D ]M}t          |t                    r$|j        |_        ||                                z  };|t          |          z  }N|S d                    t          t
          |                    S )Nrx   )r   r   r  r  raw_statefulr   r   map)r~   rt   r  r   r  s        ru   r  z_ExtensionsField.i2m  s    93c899 		?)  & &C!#'DEE &*-/S--///SXXxxC$$$rx   c                    g }t          |          dk    rt          j        d|d d                   d         }t          j        d|dd                   d         }t                              |t
                    }|t          u raddlm}m	} |j
        r1|j
        t          k    r!|                    |j        t
                    }n|                    |j        t
                    }n|t          u r'ddlm}	 |	                    |j        t
                    }n]|t          u r&t                               |j        t
                    }n.|t"          u r%t$                              |j        t
                    }|                     ||d |dz            |j                             ||dz   d          }t          |          dk    |r'|                    t+          j        |                     |S )Nr&   rj   r"   r   )_tls_ext_keyshare_cls_tls_ext_keyshare_hrr_cls)_tls_ext_presharedkey_cls)r  )ri   r|   rT  _tls_ext_clsgetrg   r  "scapy.layers.tls.keyexchange_tls13r  r  random_bytes_tls_hello_retry_magicmsgtyper  r  r  _tls_ext_supported_version_clsr  _tls_ext_early_data_clsappendr  r   	raw_layer)
r~   rt   r  r   tr   r  r  r  r  s
             ru   r  z_ExtensionsField.m2i.  s   !ffkkdAbqbE**1-AmD!AaC&11!4G""1o66C&&&F F F F F F F F # R(,BBB377_UUCC/33CKQQCC,,,XXXXXX/33CKQQ111488oVV333-11#+OOJJss1\gk\?HHHIII'A+,,A; !ffkk<  	*JJt~a(()))
rx   N)	r   r   r   islistholds_packetsr  r  r  r  r   rx   ru   r  r    sZ        FM% % %
7 7 7% % %" " " " "rx   r  )nr   r  r|   scapy.fieldsr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   scapy.packetr   r   r   scapy.layers.x509r   scapy.layers.tls.basefieldsr   scapy.layers.tls.keyexchanger   r   r   scapy.layers.tls.sessionr   scapy.layers.tls.crypto.groupsr   scapy.layers.tls.crypto.suitesr   scapy.themesr   scapy.compatr   scapy.configr   r  r   rg   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r!  r)  r8  r3  r0  r5  r:  rA  rF  rO  rI  rQ  rW  rY  r_  ri  rd  rk  rt  rz  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   rx   ru   <module>r     s$   
 
			                                  . - - - - - - - - - - - - - - - 4 4 4 4 4 4N N N N N N N N N N B B B B B B < < < < < < = = = = = = ' ' ' ' ' '            "1 &A} &$&'&  & 	&
 & ~& ~& ~& {& "& "& && +& &&  0!&" +#& &$ +%&& )'&( $)&* *+&, %-&. "/&0 "1&2 )3&4 &5&6 (7&8 *9&: +;&< -=&> '?&@ -A&B +C&D /E& &H )+K& & &R    3   2. . . . . . . .b [)        8 8 8 8 8o 8 8 8	A 	A 	A 	A 	A] 	A 	A 	AP P P P P1 P P PP P P P P": P P P*@ @ @ @ @ @ @ @4 4 4 4 4O 4 4 4 $0#2#.#3 5  5     &       F              V    "-!.!+!/1 1     ?   D D D D D? D D D4 4 4 4 4O 4 4 4    &           K ,-     o   I I I I I/ I I IF F F F F/ F F F    /       /    ),,J J J J J_ J J JB B B B B_ B B B
" 
" 
"J J J J Jo J J J	 	 	 	 	&= 	 	 	 )557 7 
H H H H H? H H H	R 	R 	R 	R 	R/ 	R 	R 	RC C C C C C C C    6   8 8 8 8 8 8 8 8O O O O O+ O O OA A A A Ao A A A4 4 4 4 4_ 4 4 44 4 4 4 4? 4 4 4	A 	A 	A 	A 	AO 	A 	A 	A4 4 4 4 4 4 4 44 4 4 4 4? 4 4 44 4 4 4 4/ 4 4 47 7 7 7 7 7 7 7 :?9; ; 
4 4 4 4 4 4 4 4	L 	L 	L 	L 	L/ 	L 	L 	LB B B B B/ B B B &A%@"B "B + + + + +_ + + + !\22 	K 	K 	K 	K 	K/ 	K 	K 	K7 7 7 7 7/ 7 7 7F F F F F* F F F4 4 4 4 4 4 4 4	R 	R 	R 	R 	Ro 	R 	R 	RL L L L L L L L: : : : :o : : :$% $%$($ '$ (	$
 ;$ &$ &$ &$ .$ +$ 0$ /$ '$ l$  o!$" ,#$$ 3-+*1/$1/5& $13G$ $ $N*, *, *, *, *,- *, *, *,Z@ @ @ @ @{ @ @ @ @ @rx   