o
    .jMD                     @  s  d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ ddl	m
Z
 ddlmZmZ ddlmZ d	Zd
ZdZdZdZedZedZedZedZdZdZG dd deZG dd deZejZejd ej dej!dej"diZ#dd e#$ D Z%ejdej dej!dej"d iZ&dd e&$ D Z'G dd deZ(edi e
G dd dZ)dd&d'Z*dd*d+Z+dd,d-Z,dd/d0Z-ddd5d6Zdd9d:Z.	 ddd?d@Z/ddCdDZ0edi e
G dEdF dFZ1edi e
G dGdH dHZ2e G dIdJ dJZ3i dKdLe4fddMe5fddNe5fddOe5fdPdQe5fdRdSe2fddTe5fdUdVe5fdWdXe5fdYdZe4fd[d\e5fd]d^e5fd d_e4fdd`e4fdadbe5fdcdde5fdedfe6fdge1fdhe5fdie4fdje4fdkZ7ddldmZ8ddodpZ9ddrdsZ:ddtduZ;ddvdwZ<ddydzZ=G d{d| d|eZ>e?e>j@e>jAe>jBe>jCe>jDgZEe?e>j@e>jAe>jCe>jDgZFe?e>jGe>jHe>jBe>jIgZJedi e
G d}d~ d~ZKedi e
G dd dZLedi e
G dd dZMdS )    )annotationsN)	dataclass)IntEnum   )DATACLASS_KWARGS)AeadAes128GcmBuffer)pull_quic_header   @              be0c690b9f66575a1d766b54e368c84e 8fb4b01b56ac48e260fbcbcead7ccc92461599d35d632bf2239825bbd86969bc2d7c6d9990efb04a   c                   @  sT   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdS )QuicErrorCoder      r      r               	   
                        N)__name__
__module____qualname__NO_ERRORINTERNAL_ERRORCONNECTION_REFUSEDFLOW_CONTROL_ERRORSTREAM_LIMIT_ERRORSTREAM_STATE_ERRORFINAL_SIZE_ERRORFRAME_ENCODING_ERRORTRANSPORT_PARAMETER_ERRORCONNECTION_ID_LIMIT_ERRORPROTOCOL_VIOLATIONINVALID_TOKENAPPLICATION_ERRORCRYPTO_BUFFER_EXCEEDEDKEY_UPDATE_ERRORAEAD_LIMIT_REACHEDVERSION_NEGOTIATION_ERRORCRYPTO_ERROR r9   r9   D/home/thesage/.local/lib/python3.10/site-packages/qh3/quic/packet.pyr      s&    r   c                   @  s$   e Zd ZdZdZdZdZdZdZdS )QuicPacketTyper   r   r   r   r   r   N)	r$   r%   r&   INITIALZERO_RTT	HANDSHAKERETRYVERSION_NEGOTIATIONONE_RTTr9   r9   r9   r:   r;   0   s    r;   r   r   c                 C     i | ]\}}||qS r9   r9   .0ivr9   r9   r:   
<dictcomp>D       
rG   c                 C  rB   r9   r9   rC   r9   r9   r:   rG   P   rH   c                   @  s   e Zd ZdZdZdZdS )QuicProtocolVersionr   r   iC3kN)r$   r%   r&   NEGOTIATION	VERSION_1	VERSION_2r9   r9   r9   r:   rI   U   s    rI   c                   @  s\   e Zd ZU ded< 	 ded< 	 ded< 	 ded< 	 ded	< 	 ded
< 	 ded< 	 ded< dS )
QuicHeader
int | Noneversionr;   packet_typeintpacket_lengthbytesdestination_cid
source_cidtokenintegrity_tag	list[int]supported_versionsNr$   r%   r&   __annotations__r9   r9   r9   r:   rM   [   s"   
 rM   packet_without_tagrS   original_destination_cidrO   rQ   returnc                 C  s   t dt| t|  d}|t| || ||  | s&td|tjkr0t}t	}nt
}t}t|d}||d|j}t|tkrKtd|S )z9
    Calculate the integrity tag for a RETRY packet.
    r   capacityz'Retry pseudo packet was not fully builts   null!12bytes    z*Retry integrity tag has an unexpected size)r   len
push_uint8
push_byteseof
ValueErrorrI   rL   RETRY_AEAD_KEY_VERSION_2RETRY_AEAD_NONCE_VERSION_2RETRY_AEAD_KEY_VERSION_1RETRY_AEAD_NONCE_VERSION_1r   encrypt_with_noncedataRETRY_INTEGRITY_TAG_SIZE)r\   r]   rO   bufaead_key
aead_nonceaeadrW   r9   r9   r:   get_retry_integrity_tagv   s    



rr   
first_byteboolc                 C     | t @ rdS dS NTF)PACKET_SPIN_BITrs   r9   r9   r:   get_spin_bit      ry   c                 C  ru   rv   )PACKET_LONG_HEADERrx   r9   r9   r:   is_long_header   rz   r|   strc                 C  s:   zt | j}W n ty   d}Y nw d| dd| dS )zF
    Return a user-friendly representation of a protocol version.
    UNKNOWN0x08xz ())rI   namerf   )rO   version_namer9   r9   r:   pretty_protocol_version   s   r   rn   r   host_cid_lengthrN   c              
   C  sX   |   }t| j||\
}}}}}}}	}
}}| ||  t|t||||||	t|
dS )N)rO   rP   rR   rT   rU   rV   rW   rY   )tell_pull_quic_header_rawraw_dataseekrM   r;   list)rn   r   packet_startrO   rP   rR   rT   rU   rV   rW   rY   _encrypted_offset
end_offsetr9   r9   r:   r	      s0   r	   rP   bitsc                 C  s,   | t jkrt}nt}ttB || d> B |B S )z8
    Encode the first byte of a long header packet.
    r   )rI   rL   !PACKET_LONG_TYPE_ENCODE_VERSION_2!PACKET_LONG_TYPE_ENCODE_VERSION_1r{   PACKET_FIXED_BIT)rO   rP   r   long_type_encoder9   r9   r:   encode_long_header_first_byte   s   

r   rU   rT   retry_tokenunusedc                 C  s   t dt| t| t| t d}|t| tj| ||  |t| || |t| || || |t	|j
|| d | sRtd|j
S )Nr   r_   )rO   z Retry packet was not fully built)r   rb   rm   rc   r   r;   r?   push_uint32rd   rr   rl   re   rf   )rO   rU   rT   r]   r   r   rn   r9   r9   r:   encode_quic_retry   s0   



r   rY   rX   c                 C  s   t dt| t|  dt|  d}|tdd tB  |tj |t| |	| |t|  |	|  |D ]}|| q?|j
S )Nr   r   r_   r   r   )r   rb   rc   osurandomr{   r   rI   rJ   rd   rl   )rU   rT   rY   rn   rO   r9   r9   r:   encode_quic_version_negotiation   s$   


r   c                   @  s.   e Zd ZU ded< ded< ded< ded< dS )QuicPreferredAddressztuple[str, int] | Noneipv4_addressipv6_addressrS   connection_idstateless_reset_tokenNrZ   r9   r9   r9   r:   r     s
   
 r   c                   @  s   e Zd ZU ded< ded< dS )QuicVersionInformationrQ   chosen_versionrX   available_versionsNrZ   r9   r9   r9   r:   r        
 r   c                   @  s  e Zd ZU dZded< dZded< dZded< dZded< dZded< dZ	ded	< dZ
ded
< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dS )QuicTransportParametersNzbytes | None"original_destination_connection_idrN   max_idle_timeoutr   max_udp_payload_sizeinitial_max_data"initial_max_stream_data_bidi_local#initial_max_stream_data_bidi_remoteinitial_max_stream_data_uniinitial_max_streams_bidiinitial_max_streams_uniack_delay_exponentmax_ack_delayFzbool | Nonedisable_active_migrationzQuicPreferredAddress | Nonepreferred_addressactive_connection_id_limitinitial_source_connection_idretry_source_connection_idzQuicVersionInformation | Noneversion_informationmax_datagram_frame_sizequantum_readinessgoogle_connection_optionsztuple[int, bytes] | Nonegreased_transport_parameter)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   r9   r9   r9   r:   r     s.   
 r   r!   r   r   r   r   r   r   r"   r   r   r   r   r   r   i(1  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r    r   i7  c           
      C  s   d }|  d}|  }|tdkrtt||f}d }|  d}|  }|tdkr4tt||f}|  }|  |}|  d}	t||||	dS )Nr   r   )r   r   r   r   )	
pull_bytespull_uint16rS   r}   	ipaddressIPv4AddressIPv6Address
pull_uint8r   )
rn   r   	ipv4_host	ipv4_portr   	ipv6_host	ipv6_portconnection_id_lengthr   r   r9   r9   r:   pull_quic_preferred_addressV  s&   



r   Nonec                 C  s   |j d ur| t|j d j | |j d  n| td |jd ur;| t|jd j | |jd  n| td | 	t
|j | |j | |j d S )Nr   r   r      )r   rd   r   r   packedpush_uint16rS   r   r   rc   rb   r   r   )rn   r   r9   r9   r:   push_quic_preferred_addresso  s   

r   lengthc                 C  sT   |   }g }t|d d D ]	}||    q|dks d|v r$tdt||dS )Nr   r   r   z.Version Information must not contain version 0)r   r   )pull_uint32rangeappendrf   r   )rn   r   r   r   rE   r9   r9   r:   pull_quic_version_information  s   r   c                 C  s&   |  |j |jD ]}|  | q	d S N)r   r   r   )rn   r   rO   r9   r9   r:   push_quic_version_information  s   
r   c                 C  s
  t  }t }|  s|  }|  }|  }||v r"td|d|| |tv rnt| \}}|tu r>t	|||   n5|t
u rLt	||| | n'|tu rYt	||t|  n|tu rgt	||t| | nt	||d n| | |  || krtd|  r
|S )Nz Duplicate transport parameter 0xxTz)Transport parameter length does not match)r   setre   pull_uint_varr   rf   addPARAMSrQ   setattrrS   r   r   r   r   r   )rn   paramsseenparam_id	param_lenparam_start
param_name
param_typer9   r9   r:   pull_quic_transport_parameters  s:   

!r   r   c           	      C  s   t  D ]r\}\}}|dkr+|jd ur+|j\}}| | | t| |r+| | t||}|d urv|durvtdd}|tu rG|| n|t	u rQ|| n|t
u r[t|| n	|tu rdt|| | | | |  | |j qd S )Nr"   Fi   r_   )r   itemsr   push_uint_varrb   rd   getattrr   rQ   rS   r   r   r   r   r   rl   )	rn   r   r   r   r   	grease_idgrease_valueparam_value	param_bufr9   r9   r:   push_quic_transport_parameters  s.   






r   c                   @  st   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdS )QuicFrameTyper   r   r   r   r   r   r   r   r   r   r"   r      r                                 0   1   N)r$   r%   r&   PADDINGPINGACKACK_ECNRESET_STREAMSTOP_SENDINGCRYPTO	NEW_TOKENSTREAM_BASEMAX_DATAMAX_STREAM_DATAMAX_STREAMS_BIDIMAX_STREAMS_UNIDATA_BLOCKEDSTREAM_DATA_BLOCKEDSTREAMS_BLOCKED_BIDISTREAMS_BLOCKED_UNINEW_CONNECTION_IDRETIRE_CONNECTION_IDPATH_CHALLENGEPATH_RESPONSETRANSPORT_CLOSEAPPLICATION_CLOSEHANDSHAKE_DONEDATAGRAMDATAGRAM_WITH_LENGTHr9   r9   r9   r:   r     s6    r   c                   @  s&   e Zd ZU ded< ded< ded< dS )QuicResetStreamFramerQ   
error_code
final_size	stream_idNrZ   r9   r9   r9   r:   r    s   
 r  c                   @  s   e Zd ZU ded< ded< dS )QuicStopSendingFramerQ   r  r  NrZ   r9   r9   r9   r:   r  %  r   r  c                   @  s2   e Zd ZU dZded< dZded< dZded	< d
S )QuicStreamFramera   rS   rl   Frt   finr   rQ   offsetN)r$   r%   r&   rl   r[   r  r  r9   r9   r9   r:   r  +  s   
 r  r9   )r\   rS   r]   rS   rO   rQ   r^   rS   )rs   rQ   r^   rt   )rO   rQ   r^   r}   r   )rn   r   r   rN   r^   rM   )rO   rQ   rP   r;   r   rQ   r^   rQ   )r   )rO   rQ   rU   rS   rT   rS   r]   rS   r   rS   r   rQ   r^   rS   )rU   rS   rT   rS   rY   rX   r^   rS   )rn   r   r^   r   )rn   r   r   r   r^   r   )rn   r   r   rQ   r^   r   )rn   r   r   r   r^   r   )rn   r   r^   r   )rn   r   r   r   r^   r   )N
__future__r   binasciir   r   dataclassesr   enumr   _compatr   _hazmatr   r   r	   r   r{   r   rw   CONNECTION_ID_MAX_SIZEPACKET_NUMBER_MAX_SIZE	unhexlifyri   rg   rj   rh   rm   STATELESS_RESET_TOKEN_SIZEr   r;   r<   PACKET_TYPE_INITIALr=   r>   r?   r   r   !PACKET_LONG_TYPE_DECODE_VERSION_1r   !PACKET_LONG_TYPE_DECODE_VERSION_2rI   rM   rr   ry   r|   r   r   r   r   r   r   r   rS   rQ   rt   r   r   r   r   r   r   r   r   	frozensetr   r   r   r  r  NON_ACK_ELICITING_FRAME_TYPESNON_IN_FLIGHT_FRAME_TYPESr	  r
  r  PROBING_FRAME_TYPESr  r  r  r9   r9   r9   r:   <module>   s   










	






' 		
