
    F2j<                       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e          Z G d d          Z G d de          Z  G 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                      e Zd ZdZdZdS )QuicDeliveryStater   r   N)__name__
__module____qualname__ACKEDLOST     _/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/qh3/quic/packet_builder.pyr   r   -   s        EDDDr   r   c                  *    e Zd ZdZ	 	 	 dddZ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
                    || _         || _        || _        || _        |	| _        || _        || _        || _        || _        d | _	        d | _
        d S Nr    )
selfr!   r"   r#   r$   r&   r'   r(   r)   r%   s
             r   __init__zQuicSentPacket.__init__A   s^     
" 0 0**&"$OS59r   otherobjectc                :   t          |t                    st          S | j        |j        k    oo| j        |j        k    o_| j        |j        k    oO| j        |j        k    o?| j        |j        k    o/| j        |j        k    o| j	        |j	        k    o| j
        |j
        k    S r2   )
isinstancer   NotImplementedr!   r"   r#   r$   r%   r&   r'   r)   )r3   r5   s     r   __eq__zQuicSentPacket.__eq__Y   s    %00 	"!!J%+% 4%/14%)??4 %)??4 "e&99	4
 "e&994  E$554 5#33		
r   )Nr   F)r!   r   r"   r,   r#   r,   r$   r,   r&   r-   r'   r   r(   r.   r)   r-   r%   r,   r/   r0   )r5   r6   r/   r,   )r   r   r   	__slots__r4   r:   r   r   r   r   r   2   sS        I, #'#: : : : :0
 
 
 
 
 
r   r   c                      e Zd ZdS )QuicPacketBuilderStopN)r   r   r   r   r   r   r=   r=   h   s        Dr   r=   c                      e Zd ZdZdZeddddddd3dZed4d            Zed5d            Z	ed6d            Z
ed5d            Zed5d            Zd7d Zd8d"Zd#dg fd9d+Zd:d0Zd7d1Zd7d2ZdS );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   Nr   F)max_datagram_sizer&   packet_numbers
peer_tokenquic_loggerspin_bithost_cidbytespeer_cidversionr-   	is_clientr,   r[   r&   r\   dict[Epoch, int] | Noner]   r^   QuicLoggerTrace | Noner_   c       
           d | _         d | _        d | _        || _        || _        || _        || _        |	| _        |
| _        || _	        g | _
        d| _        d| _        d| _        g | _        d| _        d| _        d| _        d | _        d | _        d| _        d| _        d | _        |t/          |          | _        n+t2          j        |t2          j        |t2          j        |i| _        t;          |          | _        || _        || _         d S )Nr   TF)!r@   rA   r+   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rU   rV   dictrT   r   INITIAL	HANDSHAKEONE_RTTr	   rW   rX   rY   )r3   r`   rb   rc   rd   r[   r&   r\   r]   r^   r_   s              r   r4   zQuicPacketBuilder.__init__   s    -1+/59!#!%'! (*&'#"',$.0 .215#( 37 %#'#7#7D   }}$D  /00 1 1r   r/   c                l    | j         J | j                                        | j        z
  }|| j        k    S )z@
        Returns `True` if the current packet is empty.
        )rQ   rW   tellrU   rP   )r3   packet_sizes     r   packet_is_emptyz!QuicPacketBuilder.packet_is_empty   s;    
 |'''l''))D,>>d///r   c                N    t          | j                                                  S )z
        Returns the packet number for the next packet.

        .. deprecated:: Use ``packet_numbers`` for per-space access.
        )maxrT   valuesr3   s    r   r&   zQuicPacketBuilder.packet_number   s!     4'..00111r   dict[Epoch, int]c                    | j         S )zG
        Returns the per-space packet numbers (RFC 9000 12.3).
        )rT   rs   s    r   r\   z QuicPacketBuilder.packet_numbers   s    
 ##r   c                T    | j         | j                                        z
  | j        z
  S zh
        Returns the remaining number of bytes which can be used in
        the current packet.
        )rX   rW   rm   rZ   rs   s    r   remaining_buffer_spacez(QuicPacketBuilder.remaining_buffer_space   (     $t|'8'8':'::T=PPPr   c                T    | j         | j                                        z
  | j        z
  S rw   )rY   rW   rm   rZ   rs   s    r   remaining_flight_spacez(QuicPacketBuilder.remaining_flight_space   ry   r   r0   c                    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)rL   rs   s    r   pad_datagramzQuicPacketBuilder.pad_datagram   s     (,$$$r   (tuple[list[bytes], list[QuicSentPacket]]c                    | j         |                                  |                                  | j        }| j        }g | _        g | _        ||fS )z2
        Returns the assembled datagrams.
        )rQ   _end_packet_flush_current_datagramrI   rM   )r3   	datagramspacketss      r   flushzQuicPacketBuilder.flush   sW     <#$$&&&O	-'!!r   r   
frame_typecapacityhandlerQuicDeliveryHandler | Nonehandler_argsSequence[Any]r	   c                   | j                                         }| j        }| j        |z
  |z
  |k     s|t          vr| j        |z
  |z
  |k     rt          | j                             |           | j        }|t          vrd|_
        |t          vrd|_        |t          j        k    rd|_        |+|j        }|||fg|_        n|                    ||f           | j         S )z%
        Starts a new frame.
        T)rW   rm   rZ   rX   r   rY   r=   push_uint_varrQ   r   r#   r"   r   CRYPTOr$   r*   append)	r3   r   r   r   r   buf_posaeadpacketdhs	            r   start_framezQuicPacketBuilder.start_frame  s    ,##%%" 7*T1H<<777%/$6AA''"":...:::&*F#666#F---&*F#)Bz-4l,C+D((		7L1222|r   r'   r   cryptor   c                   |t           j        t           j        hvs
J d            | j        }| j        |                                  |                                }| j        |z
  dk     r|                                  d}| j	        rq| j
        !| j
        | j        z
  }|| j        k     r|| _        | j        | _        | j        !| j        | j        z
  }|| j        k     r|| _        d| _        d| _	        d| _        |t           j        k    rfdt%          | j                  z   t%          | j                  z   }|t           j        k    r)t%          | j                  }|t/          |          |z   z  }ndt%          | j                  z   }||z   | j        k    rt0          |t           j        k    rt2          j        }	n)|t           j        k    rt2          j        }	nt2          j        }	|| _        t9          |	ddd| j        |	         |          | _        || _        |j        | _         || _!        || _"        g }
|
| j        _#        |
| _#        |$                    | j!        | j        z              dS )z&
        Starts a new packet.
        zInvalid packet typeN   r   F      )%r   RETRYVERSION_NEGOTIATIONrW   rQ   r   rm   rX   r   rK   rA   rO   rY   r@   rN   rJ   rL   rk   lenrD   rB   ri   rE   r
   r=   r   rj   rP   r   rT   rR   aead_tag_sizerZ   rU   rV   r+   seek)r3   r'   r   bufpacket_startremaining_total_bytesremaining_flight_bytesheader_sizetoken_lengthr!   qlfs              r   start_packetzQuicPacketBuilder.start_packet*  s     .#
 
 
 
 !
 
 

 l <# xxzz </#55((***L  	1#/(,(<t?P(P%(4+@@@,AD)$($9D!$0)-)>AS)S&)D,AAA,BD)*+D'"'D+0D( .000s4>222S5H5HHKn444"4#344}\::\IIc$.111K +%)>>>'' .000MEEN444OEEME'% '
 
 %$2)'*-'"%#d&7788888r   c                   | j         }|                                }|| j        z
  }|| j        k    rt          t
          z
  | j        z   |z
  }| j        s| j        j        r| j	        t          j        k    rd| _        | j        r6| j	        t          j        k    r!| j        |z
  | j        z
  }||k    r|}d| _        |dk    rJd| j        _        | j        6| j        j                            | j                                                   nd}| j                            || j        ||| j        | j	        t          j        k    | j        t1          | j	                  | j        | j        | j        | j        | j        j                  | j        _        | j                            | j                   | j        j        r| xj         | j        j        z  c_         | j	        t          j        k    r| !                                 | j"        | j        j#        xx         dz  cc<   n|$                    | j                   d| _        d| _        dS )z*
        Ends the current packet.
        TFr   Nr   )%rW   rm   rU   rP   r   PACKET_NUMBER_SEND_SIZErC   rQ   r#   rV   r   ri   rL   rk   rY   rZ   r"   rF   r+   r   encode_padding_framerR   finalize_packetrH   r-   rD   rB   rE   rG   r&   r)   rM   rJ   r   rT   r!   r   )r3   r   r   rn   padding_sizeremaining_flights         r   r   zQuicPacketBuilder._end_packety  sX    l((** 22*** ')*#$   4#'<#@4#~'===/3, ,5%)???#'#87#BTEX#X #l22#3L/4,a)-&$0L3::)>>@@    ! '+&9&I&I"!!^%;;D%&& *' 'DL#  M  ...|% G++t|/FF++  N$:::,,... !344494444 HHT'((("&r   c                   | j                                         }|r| j        rc| j        | j                                         z
  }|dk    r<| j                             t          |                     | xj        |z  c_        ||z  }| j                            | j         j	                   | xj
        | j        z  c_
        | xj        |z  c_        d| _        | j                             d           d S d S )Nr   T)rW   rm   rL   rY   
push_bytesra   rJ   rI   r   datarN   rO   rK   r   )r3   datagram_bytesextra_bytess      r   r   z)QuicPacketBuilder._flush_current_datagram  s    **,, 	! + 2"3dl6G6G6I6II??L++E+,>,>???//;>//"k1NO""4<#4555$"==/"&DLa     	! 	!r   )r`   ra   rb   ra   rc   r-   rd   r,   r[   r-   r&   r-   r\   re   r]   ra   r^   rf   r_   r,   )r/   r,   )r/   r-   )r/   rt   )r/   r0   )r/   r~   )
r   r-   r   r-   r   r   r   r   r/   r	   )r'   r   r   r   r/   r0   )r   r   r   __doc__r;   PACKET_MAX_SIZEr4   propertyro   r&   r\   rx   r{   r}   r   r   r   r   r   r   r   r   r?   r?   l   s        IL "126.272 72 72 72 72 72r 0 0 0 X0 2 2 2 X2 $ $ $ X$ Q Q Q XQ Q Q Q XQ, , , ," " " "" .2&(         DM9 M9 M9 M9^L' L' L' L'\! ! ! ! ! !r   r?   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   	Exceptionr=   r?   r   r   r   <module>r      s   " " " " " "       * * * * * * * * * * + + + + + + + +             # # # # # #             0 " ,   y)        
3
 3
 3
 3
 3
 3
 3
 3
l	 	 	 	 	I 	 	 	k! k! k! k! k! k! k! k! k! k!r   