
    kj3                        d dl 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 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mZmZ dZdZed   Z  G d de      Z!e G d d             Z" G d de#      Z$ G d d      Z%y)    )	dataclassfield)Enum)AnyCallableDictListOptionalSequenceTuple   )Buffersize_uint_var)Epoch   )
CryptoPair)QuicLoggerTrace)NON_ACK_ELICITING_FRAME_TYPESNON_IN_FLIGHT_FRAME_TYPESPACKET_FIXED_BITPACKET_NUMBER_MAX_SIZEQuicFrameTypeQuicPacketTypeencode_long_header_first_byte).Nc                       e Zd ZdZdZy)QuicDeliveryStater   r   N)__name__
__module____qualname__ACKEDLOST     d/home/ubuntu/.cache/pipx/cdb5059130eadca/lib/python3.12/site-packages/aioquic/quic/packet_builder.pyr   r      s    EDr#   r   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   dZe	e
   ed<   d	Zeed
<    ee      Zeeeef      ed<    ee      Zee   ed<   y)QuicSentPacketepoch	in_flightis_ack_elicitingis_crypto_packetpacket_numberpacket_typeN	sent_timer   
sent_bytes)default_factorydelivery_handlersquic_logger_frames)r   r   r   r   __annotations__boolintr   r-   r
   floatr.   r   listr0   r	   r   QuicDeliveryHandlerr   r1   r   r"   r#   r$   r&   r&      sx    LO!%Ix%J?D@tE"5s":;<  &+4%@T
@r#   r&   c                       e Zd Zy)QuicPacketBuilderStopN)r   r   r   r"   r#   r$   r9   r9   0   s    r#   r9   c                      e Zd ZdZddddddeded	ed
ededededee   defdZ	e
defd       Ze
defd       Ze
defd       Ze
defd       Zdeee   ee   f   fdZddg fdededee   dee   def
dZdededdfdZd"d Zd"d!Zy)#QuicPacketBuilderz+
    Helper for building QUIC packets.
    r   r#   NF)r+   
peer_tokenquic_loggerspin_bithost_cidpeer_cidversion	is_clientmax_datagram_sizer+   r<   r=   r>   c       	            d | _         d | _        d | _        || _        || _        || _        || _        || _        |	| _        || _	        g | _
        d| _        d| _        d| _        g | _        d| _        d| _        d| _        d | _        d | _        || _        d| _        d | _        t/        |      | _        || _        || _        y )Nr   TF)max_flight_bytesmax_total_bytesr1   	_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_number_packet_start_packet_typer   _buffer_buffer_capacity_flight_capacity)
selfr?   r@   rA   rB   rC   r+   r<   r=   r>   s
             r$   __init__zQuicPacketBuilder.__init__9   s     04.28<!#!%'! (*&'#"',$.0 1548+6:/0 1 1r#   returnc                     | j                   J | j                  j                         | j                  z
  }|| j                  k  S )z@
        Returns `True` if the current packet is empty.
        )rV   r[   tellrY   rU   )r^   packet_sizes     r$   packet_is_emptyz!QuicPacketBuilder.packet_is_emptyg   sB    
 ||'''ll'')D,>,>>d////r#   c                     | j                   S )z@
        Returns the packet number for the next packet.
        )rX   r^   s    r$   r+   zQuicPacketBuilder.packet_numberp   s    
 """r#   c                 ~    | j                   | j                  j                         z
  | j                  j                  z
  S zh
        Returns the remaining number of bytes which can be used in
        the current packet.
        )r\   r[   rb   rW   aead_tag_sizerf   s    r$   remaining_buffer_spacez(QuicPacketBuilder.remaining_buffer_spacew   ;     !!ll!"!!//0	
r#   c                 ~    | j                   | j                  j                         z
  | j                  j                  z
  S rh   )r]   r[   rb   rW   ri   rf   s    r$   remaining_flight_spacez(QuicPacketBuilder.remaining_flight_space   rk   r#   c                     | j                   | j                          | j                          | j                  }| j                  }g | _        g | _        ||fS )z2
        Returns the assembled datagrams.
        )rV   _end_packet_flush_current_datagramrN   rR   )r^   	datagramspacketss      r$   flushzQuicPacketBuilder.flush   sQ     <<#$$&OO	--'!!r#   r   
frame_typecapacityhandlerhandler_argsc                    | j                   |k  s|t        vr| j                  |k  rt        | j                  j                  |       |t        vrd| j                  _        |t        vrd| j                  _	        |t        j                  k(  rd| j                  _        |'| j                  j                  j                  ||f       | j                  S )z%
        Starts a new frame.
        T)rj   r   rm   r9   r[   push_uint_varr   rV   r)   r(   r   CRYPTOr*   r0   append)r^   rt   ru   rv   rw   s        r$   start_framezQuicPacketBuilder.start_frame   s     &&177++h6''"":.::,0DLL)66%)DLL"---,0DLL)LL**117L2IJ||r#   r,   cryptoc                    |t         j                  t         j                  t         j                  t         j                  fv sJ d       | j
                  }| j                  | j                          |j                         }| j                  |z
  dk  r| j                          d}| j                  r| j                  /| j                  | j                  z
  }|| j                  k  r|| _	        | j                  | _        | j                  /| j                  | j                   z
  }|| j                  k  r|| _        d| _        d| _        d| _        |t         j                  k7  rhd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                  }	n4|t         j                  k(  rt2        j                  }	nt2        j                  }	|| _        t7        |	ddd| j8                  |      | _        || _        || _        || _        | j                  j@                  | _         |jC                  | j<                  | j4                  z          y)	z&
        Starts a new packet.
        zInvalid packet typeN   r   F      )r'   r(   r)   r*   r+   r,   )"r   INITIAL	HANDSHAKEZERO_RTTONE_RTTr[   rV   ro   rb   r\   rp   rP   rF   rT   r]   rE   rS   rO   rQ   lenrI   rG   rJ   r   r9   r   rU   r&   rX   rW   rY   rZ   r1   seek)
r^   r,   r}   bufpacket_startremaining_total_bytesremaining_flight_bytesheader_sizetoken_lengthr'   s
             r$   start_packetzQuicPacketBuilder.start_packet   s    ""$$##""	
 
 	!
 !	! 
 ll <<# xxz  </#5((*L ##/(,(<(<t?P?P(P%(4+@+@@,AD)$($9$9D!$$0)-)>)>ASAS)S&)D,A,AA,BD)*+D'"'D+0D( .000s4>>22S5HHKn444"4#3#34}\:\IIc$..11K +%)>)>>'' .000MMEN444OOEMME'%""--#
 %)'"&,,"A"A##d&7&778r#   c                 
   | j                   }|j                         | j                  z
  }|| j                  kD  rt        t
        z
  | j                  z   |z
  }| j                  s| j                  j                  r$| j                  t        j                  k(  rd| _        | j                  r?| j                  t        j                  k(  r"| j                  |kD  r| j                  }d| _        |dkD  ry|j                  t!        |             ||z  }d| j                  _        | j$                  =| j                  j&                  j)                  | j$                  j+                                | j                  t        j                  k7  r|| j                  z
  t
        z   | j,                  j.                  z   }|j1                  | j                         |j3                  t5        | j6                  | j                  t
        dz
               |j9                  | j6                         |j3                  t;        | j<                               |j                  | j<                         |j3                  t;        | j>                               |j                  | j>                         | j                  t        j                  k(  r?|jA                  t;        | jB                               |j                  | jB                         |jE                  |dz         |jE                  | jF                  dz         n|j1                  | j                         |j3                  tH        | jJ                  dz  z  | j,                  jL                  d	z  z  t
        dz
  z         |j                  | j<                         |jE                  | jF                  dz         |jO                  | j                  | j                  |z         }|j1                  | j                         |j                  | j,                  jQ                  |d| j                   || j                  | | jF                               |j                         | j                  z
  | j                  _)        | jT                  j)                  | j                         | j                  j"                  r)| xjV                  | j                  jR                  z  c_+        | j                  t        j                  k(  r| jY                          | xjF                  dz  c_#        n|j1                  | j                         d| _        d| _        y)
z*
        Ends the current packet.
        TFr   Nr   i @  i     r   )-r[   rb   rY   rU   r   PACKET_NUMBER_SEND_SIZErH   rV   r)   rZ   r   r   rQ   r   rm   
push_bytesbytesr(   rK   r1   r{   encode_padding_framerW   ri   r   
push_uint8r   rM   push_uint32r   rI   rG   ry   rJ   push_uint16rX   r   rL   	key_phase
data_sliceencrypt_packetr.   rR   rO   rp   )r^   r   rc   padding_sizelengthplains         r$   ro   zQuicPacketBuilder._end_packet  s5    llhhj4#5#55*** ')*##$   4<<#@#@##~'='==/3, ,,%%)?)??..=#'#>#>L/4, au\23|+)-& $$0LL33::))>>@
   N$:$::''(-. ))778  ++,1t'8'8:QTU:U
 .s4>>23t~~.s4>>23t~~.$$(>(>>%%c$*:*:&;<NN4#3#340 3 3f <=++,$~~*,**449; /24 t~~. 3 3f <= NN4#5#5t7I7IK7WXEHHT''(NN##22!d//0$++k:'' '*hhj43E3E&EDLL#MM  .||%%++t||/F/FF+   N$:$::,,.1$ HHT''("&r#   c                 4   | j                   j                         }|r| j                  rj| j                  | j                   j                         z
  }|dkD  r>| j                   j	                  t        |             | xj                  |z  c_        ||z  }| j                  j                  | j                   j                         | xj                  | j                  z  c_
        | xj                  |z  c_        d| _        | j                   j                  d       y y )Nr   T)r[   rb   rQ   r]   r   r   rO   rN   r{   datarS   rT   rP   r   )r^   datagram_bytesextra_bytess      r$   rp   z)QuicPacketBuilder._flush_current_datagramp  s    **, ++"33dll6G6G6II?LL++E+,>?//;>/"k1NOO""4<<#4#45$"="==/"&DLLa  r#   )r`   N)r   r   r   __doc__r   r4   r3   r
   r   r_   propertyrd   r+   rj   rm   r   r	   r&   rs   r7   r   r   r   r|   r   r   r   ro   rp   r"   r#   r$   r;   r;   4   sz    15,2 ,2 	,2
 ,2 ,2 ,2 ,2 ,2 o.,2 ,2\ 0 0 0 #s # # 	
 	
 	
 	
 	
 	
"uT%[$~*>>? "" 15&(  -.	
 sm 
6J9 J9
 J9t J9Xj'X!r#   r;   N)&dataclassesr   r   enumr   typingr   r   r   r	   r
   r   r   bufferr   r   tlsr   r}   r   loggerr   packetr   r   r   r   r   r   r   PACKET_LENGTH_SEND_SIZEr   r7   r   r&   	Exceptionr9   r;   r"   r#   r$   <module>r      s    (  G G G *   #      y)  
 A A A 	I 	L! L!r#   