o
    .j<                     @  s   d dl mZ d dlmZ d dlmZmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZmZmZmZmZ dZdZddgZdZdZed ZG dd deZG dd dZG dd deZ G dd dZ!dS )    )annotations)IntEnum)AnyCallableSequence   )Buffersize_uint_var)Epoch   )
CryptoPair)QuicLoggerTrace)NON_ACK_ELICITING_FRAME_TYPESNON_IN_FLIGHT_FRAME_TYPESPACKET_NUMBER_MAX_SIZEQuicFrameTypeQuicPacketTypei  i   iF  i  ).Nc                   @  s   e Zd ZdZdZdS )QuicDeliveryStater   r   N)__name__
__module____qualname__ACKEDLOST r   r   L/home/thesage/.local/lib/python3.10/site-packages/qh3/quic/packet_builder.pyr   -   s    r   c                   @  s,   e Zd ZdZ			ddddZdddZdS )QuicSentPacketepoch	in_flightis_ack_elicitingis_crypto_packetis_pmtu_probepacket_numberpacket_type	sent_time
sent_bytesdelivery_handlersquic_logger_framesNr   Fr   r
   r   boolr   r    r"   intr#   r   r$   float | Noner%   r!   returnNonec
           
      C  sF   || _ || _|| _|| _|	| _|| _|| _|| _|| _d | _	d | _
d S Nr   )
selfr   r   r   r    r"   r#   r$   r%   r!   r   r   r   __init__A   s   
zQuicSentPacket.__init__otherobjectc                 C  sn   t |tstS | j|jko6| j|jko6| j|jko6| j|jko6| j|jko6| j|jko6| j	|j	ko6| j
|j
kS r-   )
isinstancer   NotImplementedr   r   r   r    r!   r"   r#   r%   )r.   r0   r   r   r   __eq__Y   s"   







zQuicSentPacket.__eq__)Nr   F)r   r
   r   r(   r   r(   r    r(   r"   r)   r#   r   r$   r*   r%   r)   r!   r(   r+   r,   )r0   r1   r+   r(   )r   r   r   	__slots__r/   r4   r   r   r   r   r   2   s    r   c                   @  s   e Zd ZdS )QuicPacketBuilderStopN)r   r   r   r   r   r   r   r6   h   s    r6   c                   @  s   e Zd ZdZdZeddddddd?ddZed@ddZedAddZ	edBdd Z
edAd!d"ZedAd#d$ZdCd&d'ZdDd)d*Zd+dg fdEd3d4ZdFd9d:ZdCd;d<ZdCd=d>ZdS )GQuicPacketBuilderz+
    Helper for building QUIC packets.
    )max_flight_bytesmax_total_bytesr'   	_host_cid
_is_client	_peer_cid_peer_token_quic_logger	_spin_bit_version
_datagrams_datagram_flight_bytes_datagram_init_datagram_needs_padding_packets_flight_bytes_total_bytes_header_size_packet_packet_crypto_packet_long_header_packet_numbers_packet_start_packet_type_buffer_buffer_capacity_flight_capacity_aead_tag_sizer   N    F)max_datagram_sizer"   packet_numbers
peer_tokenquic_loggerspin_bithost_cidbytespeer_cidversionr)   	is_clientr(   rT   r"   rU   dict[Epoch, int] | NonerV   rW   QuicLoggerTrace | NonerX   c       
         C  s   d | _ d | _d | _|| _|| _|| _|| _|	| _|
| _|| _	g | _
d| _d| _d| _g | _d| _d| _d| _d | _d | _d| _d| _d | _|d urOt|| _ntj|tj|tj|i| _t|| _|| _|| _ d S )Nr   TF)!r8   r9   r'   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rM   rN   dictrL   r
   INITIAL	HANDSHAKEONE_RTTr   rO   rP   rQ   )r.   rY   r[   r\   r]   rT   r"   rU   rV   rW   rX   r   r   r   r/      s@   

zQuicPacketBuilder.__init__r+   c                 C  s(   | j dusJ | j | j }|| jkS )z@
        Returns `True` if the current packet is empty.
        N)rI   rO   tellrM   rH   )r.   packet_sizer   r   r   packet_is_empty   s   
z!QuicPacketBuilder.packet_is_emptyc                 C  s   t | j S )z
        Returns the packet number for the next packet.

        .. deprecated:: Use ``packet_numbers`` for per-space access.
        )maxrL   valuesr.   r   r   r   r"      s   zQuicPacketBuilder.packet_numberdict[Epoch, int]c                 C  s   | j S )zG
        Returns the per-space packet numbers (RFC 9000 12.3).
        )rL   ri   r   r   r   rU      s   z QuicPacketBuilder.packet_numbersc                 C     | j | j  | j S zh
        Returns the remaining number of bytes which can be used in
        the current packet.
        )rP   rO   rd   rR   ri   r   r   r   remaining_buffer_space      z(QuicPacketBuilder.remaining_buffer_spacec                 C  rk   rl   )rQ   rO   rd   rR   ri   r   r   r   remaining_flight_space   rn   z(QuicPacketBuilder.remaining_flight_spacer,   c                 C  s
   d| _ dS )z
        Mark the current datagram as needing to be padded to the full
        path MTU. Used to satisfy RFC 9000 8.2.1 (PATH_CHALLENGE /
        PATH_RESPONSE) and similar requirements.
        TN)rD   ri   r   r   r   pad_datagram   s   
zQuicPacketBuilder.pad_datagram(tuple[list[bytes], list[QuicSentPacket]]c                 C  s:   | j dur	|   |   | j}| j}g | _g | _||fS )z2
        Returns the assembled datagrams.
        N)rI   _end_packet_flush_current_datagramrA   rE   )r.   	datagramspacketsr   r   r   flush   s   
zQuicPacketBuilder.flushr   
frame_typecapacityhandlerQuicDeliveryHandler | Nonehandler_argsSequence[Any]r   c           	      C  s   | j  }| j}| j| | |k s|tvr | j| | |k r t| j | | j}|t	vr0d|_
|tvr7d|_|tjkr?d|_|durZ|j}|du rS||fg|_| j S |||f | j S )z%
        Starts a new frame.
        TN)rO   rd   rR   rP   r   rQ   r6   push_uint_varrI   r   r   r   r   CRYPTOr    r&   append)	r.   rw   rx   ry   r{   buf_posaeadpacketdhr   r   r   start_frame  s*   


zQuicPacketBuilder.start_framer#   r   cryptor   c                 C  s  |t jt jhvsJ d| j}| jdur|   | }| j| dk r)|   d}| j	r_| j
dur?| j
| j }|| jk r?|| _| j| _| jdurV| j| j }|| jk rV|| _d| _d| _	d| _|t jkrdt| j t| j }|t jkrt| j}|t|| 7 }ndt| j }|| | jkrt|t jkrtj}	n|t jkrtj}	ntj}	|| _t|	ddd| j|	 || _|| _|j| _ || _!|| _"g }
|
| j_#|
| _#|$| j!| j  dS )z&
        Starts a new packet.
        zInvalid packet typeN   r   F      )%r   RETRYVERSION_NEGOTIATIONrO   rI   rr   rd   rP   rs   rC   r9   rG   rQ   r8   rF   rB   rD   rc   lenr<   r:   ra   r=   r	   r6   r
   rb   rH   r   rL   rJ   aead_tag_sizerR   rM   rN   r'   seek)r.   r#   r   bufpacket_startremaining_total_bytesremaining_flight_bytesheader_sizetoken_lengthr   qlfr   r   r   start_packet*  sr   









zQuicPacketBuilder.start_packetc                 C  st  | j }| }|| j }|| jkrtt | j | }| js!| jjr*| j	t
jkr*d| _| jrD| j	t
jkrD| j| | j }||krA|}d| _|dkr\d| j_| jdur[| jj| j  nd}| j|| j||| j| j	t
jk| jt| j	| j| j| j| j| jj| j_| j| j | jjr|  j | jj7  _ | j	t
jkr| !  | j"| jj#  d7  < n|$| j d| _d| _dS )z*
        Ends the current packet.
        TFr   Nr   )%rO   rd   rM   rH   r   PACKET_NUMBER_SEND_SIZEr;   rI   r   rN   r   ra   rD   rc   rQ   rR   r   r>   r'   r   encode_padding_framerJ   finalize_packetr@   r)   r<   r:   r=   r?   r"   r%   rE   rB   rs   rL   r   r   )r.   r   r   re   padding_sizeremaining_flightr   r   r   rr   y  sr   





zQuicPacketBuilder._end_packetc                 C  s   | j  }|rK| jr)| j| j   }|dkr)| j t| |  j|7  _||7 }| j| j j	 |  j
| j7  _
|  j|7  _d| _| j d d S d S )Nr   T)rO   rd   rD   rQ   
push_bytesrZ   rB   rA   r   datarF   rG   rC   r   )r.   datagram_bytesextra_bytesr   r   r   rs     s   
z)QuicPacketBuilder._flush_current_datagram)rY   rZ   r[   rZ   r\   r)   r]   r(   rT   r)   r"   r)   rU   r^   rV   rZ   rW   r_   rX   r(   )r+   r(   )r+   r)   )r+   rj   )r+   r,   )r+   rq   )
rw   r)   rx   r)   ry   rz   r{   r|   r+   r   )r#   r   r   r   r+   r,   )r   r   r   __doc__r5   PACKET_MAX_SIZEr/   propertyrf   r"   rU   rm   ro   rp   rv   r   r   rr   rs   r   r   r   r   r7   l   s:    &9


"
ONr7   N)"
__future__r   enumr   typingr   r   r   _hazmatr   r	   tlsr
   r   r   loggerr   r   r   r   r   r   r   SMALLEST_MAX_DATAGRAM_SIZEr   MTU_PROBE_SIZESPACKET_LENGTH_SEND_SIZEr   QuicDeliveryHandlerr   r   	Exceptionr6   r7   r   r   r   r   <module>   s$    6