
    mbi8                    J   d dl mZ d dlmZ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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dZ e	d         Z! G d de          Z" edi e G d d                      Z# G d de$          Z% G d d          Z&dS )    )annotations)	dataclassfield)IntEnum)AnyCallableSequence   )DATACLASS_KWARGS)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_bytei   ).Nc                      e Zd ZdZdZdS )QuicDeliveryStater   r   N)__name__
__module____qualname__ACKEDLOST     g/var/www/html/mdtn/previsions/meteo_cartes/venv/lib/python3.11/site-packages/qh3/quic/packet_builder.pyr   r   /   s        EDDDr!   r   c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   dZded<   dZded<    ee          Zded<    ee          Z	ded<   dS )QuicSentPacketr   epochbool	in_flightis_ack_elicitingis_crypto_packetintpacket_numberr   packet_typeNzfloat | None	sent_timer   
sent_bytes)default_factoryz%list[tuple[QuicDeliveryHandler, Any]]delivery_handlersz
list[dict]quic_logger_frames)
r   r   r   __annotations__r-   r.   r   listr0   r1   r    r!   r"   r$   r$   4   s         LLLOOO"I""""J?Du@ @ @     &+U4%@%@%@@@@@@@r!   r$   c                      e Zd ZdS )QuicPacketBuilderStopN)r   r   r   r    r!   r"   r5   r5   E   s        Dr!   r5   c                      e Zd ZdZdZdddddd-dZed.d            Zed/d            Zed/d            Z	ed/d            Z
d0dZddg fd1d$Zd2d*Zd3d+Zd3d,ZdS )4QuicPacketBuilderz+
    Helper for building QUIC packets.
    )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_long_header_packet_number_packet_start_packet_type_buffer_buffer_capacity_flight_capacityr   r!   NF)r+   
peer_tokenquic_loggerspin_bithost_cidbytespeer_cidversionr*   	is_clientr&   r+   rR   rS   QuicLoggerTrace | NonerT   c                  d | _         d | _        d | _        || _        || _        || _        || _        || _        || _        || _	        g | _
        d| _        d| _        d| _        g | _        d| _        d| _        d| _        d | _        d | _        d| _        || _        d| _        d | _        t1          t2                    | _        t2          | _        t2          | _        d S )Nr   TF)r8   r9   r1   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   r   PACKET_MAX_SIZErO   rP   rQ   )	selfrU   rW   rX   rY   r+   rR   rS   rT   s	            r"   __init__zQuicPacketBuilder.__init__l   s     -1+/59!#!%'! (*&'#"',$.0 .215#( +37o.. / /r!   returnc                l    | j         J | j                                        | j        z
  }|| j        k    S )z@
        Returns `True` if the current packet is empty.
        )rI   rO   tellrM   rH   )r]   packet_sizes     r"   packet_is_emptyz!QuicPacketBuilder.packet_is_empty   s;    
 |'''l''))D,>>d///r!   c                    | j         S )z@
        Returns the packet number for the next packet.
        )rL   r]   s    r"   r+   zQuicPacketBuilder.packet_number   s    
 ""r!   c                ^    | j         | j                                        z
  | j        j        z
  S zh
        Returns the remaining number of bytes which can be used in
        the current packet.
        )rP   rO   ra   rJ   aead_tag_sizere   s    r"   remaining_buffer_spacez(QuicPacketBuilder.remaining_buffer_space   3     !l!!"!/0	
r!   c                ^    | j         | j                                        z
  | j        j        z
  S rg   )rQ   rO   ra   rJ   rh   re   s    r"   remaining_flight_spacez(QuicPacketBuilder.remaining_flight_space   rj   r!   (tuple[list[bytes], list[QuicSentPacket]]c                    | j         |                                  |                                  | j        }| j        }g | _        g | _        ||fS )z2
        Returns the assembled datagrams.
        )rI   _end_packet_flush_current_datagramrA   rE   )r]   	datagramspacketss      r"   flushzQuicPacketBuilder.flush   sW     <#$$&&&O	-'!!r!   r   
frame_typecapacityhandlerQuicDeliveryHandler | Nonehandler_argsSequence[Any]r   c                b   | j         |k     s|t          vr| j        |k     rt          | j                            |           |t          vrd| j        _        |t          vrd| j        _	        |t          j        k    rd| j        _        |!| j        j                            ||f           | j        S )z%
        Starts a new frame.
        T)ri   r   rl   r5   rO   push_uint_varr   rI   r(   r'   r   CRYPTOr)   r0   append)r]   rt   ru   rv   rx   s        r"   start_framezQuicPacketBuilder.start_frame   s     &11777+h66''"":...:::,0DL)666%)DL"---,0DL)L*117L2IJJJ|r!   r,   r   cryptor   Nonec                   |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        j!        | _!        |"                    | j        | j        z              dS )	z&
        Starts a new packet.
        zInvalid packet typeN   r   F      )r%   r'   r(   r)   r+   r,   )#r   RETRYVERSION_NEGOTIATIONrO   rI   ro   ra   rP   rp   rC   r9   rG   rQ   r8   rF   rB   rD   ONE_RTTlenr<   r:   INITIALr=   r   r5   r   	HANDSHAKErH   r$   rL   rJ   rM   rN   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   su     .#
 
 
 
 !
 
 

 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'%""-#
 
 
 %)'"&,"A#d&7788888r!   c                x	   | j         }|                                | j        z
  }|| j        k    rbt          t
          z
  | j        z   |z
  }| j        s| j        j        r| j	        t          j        k    rd| _        | j        r.| j	        t          j        k    r| j        |k    r| j        }d| _        |dk    rp|                    t!          |                     ||z  }d| j        _        | j        6| j        j                            | j                                                   | j	        t          j        k    r|| j        z
  t
          z   | j        j        z   }|                    | j                   |                    t5          | j        | j	        t
          dz
                       |                    | j                   |                    t;          | j                             |                    | j                   |                    t;          | j                             |                    | j                   | j	        t          j        k    rA|                     t;          | j!                             |                    | j!                   |"                    |dz             |"                    | j#        dz             n|                    | j                   |                    tH          | j%        dz  z  | j        j&        d	z  z  t
          dz
  z             |                    | j                   |"                    | j#        dz             |'                    | j        | j        |z             }|                    | j                   |                    | j        (                    |d| j                 || j        |         | j#                             |                                | j        z
  | j        _)        | j*                            | j                   | j        j        r| xj+        | j        j)        z  c_+        | j	        t          j        k    r| ,                                 | xj#        dz  c_#        n|                    | j                   d| _        d| _        dS )
z*
        Ends the current packet.
        TFr   Nr   i @  i     r
   )-rO   ra   rM   rH   r   PACKET_NUMBER_SEND_SIZEr;   rI   r(   rN   r   r   rD   r   rl   
push_bytesrV   r'   r>   r1   r}   encode_padding_framerJ   rh   r   
push_uint8r   r@   push_uint32r   r<   r:   r{   r=   push_uint16rL   r   r?   	key_phase
data_sliceencrypt_packetr.   rE   rB   rp   )r]   r   rb   padding_sizelengthplains         r"   ro   zQuicPacketBuilder._end_packet6  s    lhhjj4#55*** ')*#$   4#'<#@4#~'===/3, ,5%)???.==#'#>L/4, au\22333|+)-& $0L3::)>>@@  
  N$:::'(-. )78  +,,,1t'8:QTU:U   
 ...s4>22333t~...s4>22333t~...$(>>>%%c$*:&;&;<<<NN4#3444000 3f <====+,,,$~*,*49; /24   t~... 3f <=== NN4#5t7IK7WXXEHHT'(((NN#22!d//0$+k9:'    '*hhjj43E&EDL#M  ...|% G++t|/FF++  N$:::,,...1$ 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)rO   ra   rD   rQ   r   rV   rB   rA   r}   datarF   rG   rC   r   )r]   datagram_bytesextra_bytess      r"   rp   z)QuicPacketBuilder._flush_current_datagram  s    **,, 	! + 2"3dl6G6G6I6II??L++E+,>,>???//;>//"k1NO""4<#4555$"==/"&DLa     	! 	!r!   )rU   rV   rW   rV   rX   r*   rY   r&   r+   r*   rR   rV   rS   rZ   rT   r&   )r_   r&   )r_   r*   )r_   rm   )
rt   r*   ru   r*   rv   rw   rx   ry   r_   r   )r,   r   r   r   r_   r   )r_   r   )r   r   r   __doc__	__slots__r^   propertyrc   r+   ri   rl   rs   r~   r   ro   rp   r    r!   r"   r7   r7   I   sQ        IJ .2,0 ,0 ,0 ,0 ,0 ,0\ 0 0 0 X0 # # # X# 	
 	
 	
 X	
 	
 	
 	
 X	
" " " "" .2&(    6I9 I9 I9 I9Vj' j' j' j'X! ! ! ! ! !r!   r7   Nr    )'
__future__r   dataclassesr   r   enumr   typingr   r   r	   _compatr   _hazmatr   r   tlsr   r   r   loggerr   packetr   r   r   r   r   r   r   r\   PACKET_LENGTH_SEND_SIZEr   QuicDeliveryHandlerr   r$   	Exceptionr5   r7   r    r!   r"   <module>r      s   " " " " " " ( ( ( ( ( ( ( (       * * * * * * * * * * & & & & & & + + + + + + + +             # # # # # #                 4    y)        
 A A A A A A A A 	 	 	 	 	I 	 	 	i! i! i! i! i! i! i! i! i! i!r!   