§
    "ÂjX  ã                  óô   — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z
mZmZ ddlmZ  edd¬¦  «         G d„ d	¦  «        ¦   «         Z G d
„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        ZdS )zâ
Dynamic Packet Cipher, Timestamp Gating & Anti-Replay Guard for FreeExile.
Implements Authenticated Encryption with Associated Data (AEAD),
RFC-compliant Sliding Window Anti-Replay, and Sub-Millisecond Nonce Caching (< 1ms).
é    )ÚannotationsN)ÚTupleÚDictÚOptional)Ú	dataclassT)ÚslotsÚfrozenc                  óL   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
S )ÚSecureNetworkPacketÚstrÚ	packet_idÚintÚseq_numÚtimestamp_msÚnonceÚbytesÚpayloadÚ	signatureN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú6C:\Projects\FreeExile\server\security\packet_cipher.pyr   r      sI   € € € € € € à€N€N�NØ€L€L�LØÐÐÑØ€J€J�JØ€N€N�NØ€N€N�N€N€Nr   r   c                  ó*   — e Zd ZdZdd„Zdd
„Zdd„ZdS )ÚPacketCipherEnginezMAEAD-style packet encryption with sequence-derived keystream and HMAC-SHA256.Ú
shared_keyr   c                ó´   — t          |¦  «        dk     r&t          j        |¦  «                             ¦   «         }|d d…         | _        |dd…         | _        d S )Né    é   )ÚlenÚhashlibÚsha256ÚdigestÚenc_keyÚmac_key)Úselfr   s     r   Ú__init__zPacketCipherEngine.__init__   sQ   € Ýˆz‰?Œ?˜RÒÐÝ œ¨
Ñ3Ô3×:Ò:Ñ<Ô<ˆJØ! # 2 #”ˆŒØ! " R %Ô(ˆŒˆˆr   Ú	plaintextr   r   ÚreturnúTuple[bytes, bytes, bytes]c                ó  — |dk     rt          d¦  «        ‚t          j        d¦  «        }| j        |z   t	          j        d|¦  «        z   }t          ¦   «         }d}t          |¦  «        t          |¦  «        k     rt|                     t          j
        |t	          j        d|¦  «        z   ¦  «                             ¦   «         ¦  «         |dz  }t          |¦  «        t          |¦  «        k     °tt          d„ t          ||dt          |¦  «        …         ¦  «        D ¦   «         ¦  «        }t	          j        d|¦  «        |z   |z   }t          j        | j        |t          j
        ¦  «                             ¦   «         dd	…         }	||	|fS )
zXEncrypts payload with sequence-derived keystream and calculates HMAC authentication tag.r   ú%Sequence number must be non-negative.é   ú>Qú>Ié   c              3  ó&   K  — | ]\  }}||z  V — Œd S ©Nr   )Ú.0ÚpÚks      r   ú	<genexpr>z-PacketCipherEngine.encrypt.<locals>.<genexpr>2   s*   è è € ÐXÐX¡T Q¨˜1˜q™5ÐXÐXÐXÐXÐXÐXr   Nr!   )Ú
ValueErrorÚosÚurandomr&   ÚstructÚpackÚ	bytearrayr"   Úextendr#   r$   r%   r   ÚzipÚhmacÚnewr'   )
r(   r*   r   r   Úkeystream_seedÚ	keystreamÚ	block_idxÚ
ciphertextÚtag_dataÚtags
             r   ÚencryptzPacketCipherEngine.encrypt%   sQ  € à�QŠ;ˆ;ÝÐDÑEÔEÐEÝ”
˜2‘”ˆØœ¨Ñ-µ´¸DÀ'Ñ0JÔ0JÑJˆå‘K”Kˆ	Øˆ	Ý�)‰nŒn�s 9™~œ~Ò-Ð-Ø×Ò�Wœ^¨N½V¼[ÈÈyÑ=YÔ=YÑ,YÑZÔZ×aÒaÑcÔcÑdÔdÐdØ˜‰NˆIõ �)‰nŒn�s 9™~œ~Ò-Ð-õ ÐXÐX­S°¸IÀoÅsÈ9Á~Ä~ÀoÔ<VÑ-WÔ-WÐXÑXÔXÑXÔXˆ
Ý”;˜t WÑ-Ô-°Ñ5¸
ÑBˆÝŒh�t”| X­w¬~Ñ>Ô>×EÒEÑGÔGÈÈÈÔLˆà˜3 Ð%Ð%r   rF   rH   r   c                ól  — |dk     rt          d¦  «        ‚t          |¦  «        dk    rt          d¦  «        ‚t          j        d|¦  «        |z   |z   }t	          j        | j        |t          j        ¦  «         	                    ¦   «         dd…         }t	          j
        ||¦  «        st          d¦  «        ‚| j        |z   t          j        d|¦  «        z   }t          ¦   «         }d}	t          |¦  «        t          |¦  «        k     rt|                     t          j        |t          j        d|	¦  «        z   ¦  «         	                    ¦   «         ¦  «         |	d	z  }	t          |¦  «        t          |¦  «        k     °tt          d
„ t          ||dt          |¦  «        …         ¦  «        D ¦   «         ¦  «        S )zUVerifies authenticity tag before decrypting. Raises ValueError if tampering detected.r   r.   r!   zBPacket authentication tag verification failed. Invalid tag length.r0   NzBPacket authentication tag verification failed. Tampering detected.r1   r2   c              3  ó&   K  — | ]\  }}||z  V — Œd S r4   r   )r5   Úcr7   s      r   r8   z-PacketCipherEngine.decrypt.<locals>.<genexpr>K   s*   è è € ÐTÐT™t˜q !�Q˜‘UÐTÐTÐTÐTÐTÐTr   )r9   r"   r<   r=   rA   rB   r'   r#   r$   r%   Úcompare_digestr&   r>   r?   r   r@   )
r(   rF   rH   r   r   rG   Úexpected_tagrC   rD   rE   s
             r   ÚdecryptzPacketCipherEngine.decrypt8   s€  € à�QŠ;ˆ;ÝÐDÑEÔEÐEÝˆs‰8Œ8�rŠ>ˆ>ÝÐaÑbÔbÐbÝ”;˜t WÑ-Ô-°Ñ5¸
ÑBˆÝ”x ¤¨h½¼ÑGÔG×NÒNÑPÔPÐQTÐRTÐQTÔUˆåÔ" 3¨Ñ5Ô5ð 	cÝÐaÑbÔbÐbàœ¨Ñ-µ´¸DÀ'Ñ0JÔ0JÑJˆÝ‘K”Kˆ	Øˆ	Ý�)‰nŒn�s :™œÒ.Ð.Ø×Ò�Wœ^¨N½V¼[ÈÈyÑ=YÔ=YÑ,YÑZÔZ×aÒaÑcÔcÑdÔdÐdØ˜‰NˆIõ �)‰nŒn�s :™œÒ.Ð.õ ÐTÐT¥s¨:°yÐAQÅ#ÀjÁ/Ä/ÐAQÔ7RÑ'SÔ'SÐTÑTÔTÑTÔTÐTr   N)r   r   )r*   r   r   r   r+   r,   )
rF   r   rH   r   r   r   r   r   r+   r   )r   r   r   Ú__doc__r)   rI   rO   r   r   r   r   r      s\   € € € € € ØWÐWð)ð )ð )ð )ð&ð &ð &ð &ð&Uð Uð Uð Uð Uð Ur   r   c                  ó$   — e Zd ZdZddd„Zdd	„Zd
S )ÚAntiReplayWindowzESliding window anti-replay filter (RFC 4303 IPsec Anti-Replay model).é@   Úwindow_sizer   c                ó0   — || _         d| _        d| _        d S )Nr   )rT   Úhighest_seqÚbitmap)r(   rT   s     r   r)   zAntiReplayWindow.__init__Q   s   € Ø&ˆÔØ !ˆÔØˆŒˆˆr   r   r+   Úboolc                óB  — |dk    rdS | j         dk    r|| _         d| _        dS || j         k    r8|| j         z
  }|| j        k     r| j        |z  dz  | _        nd| _        || _         dS | j         |z
  }|| j        k    rdS d|z  }| j        |z  rdS | xj        |z  c_        dS )zVValidates seq_num against sliding window. Returns True if accepted, False if replayed.r   Fr2   T)rV   rW   rT   )r(   r   ÚdiffÚmasks       r   Úcheck_and_updatez!AntiReplayWindow.check_and_updateV   sÖ   € à�aŠ<ˆ<Ø�5àÔ˜qÒ Ð Ø&ˆDÔØˆDŒKØ�4à�TÔ%Ò%Ð%Ø˜TÔ-Ñ-ˆDØ�dÔ&Ò&Ð&Ø#œ{¨dÑ2°aÑ7�”�à�”Ø&ˆDÔØ�4àÔ 'Ñ)ˆØ�4Ô#Ò#Ð#Ø�5à�D‰yˆØŒ;˜Ñð 	Ø�5àˆŒ�tÑˆŒØˆtr   N)rS   )rT   r   )r   r   r+   rX   )r   r   r   rP   r)   r\   r   r   r   rR   rR   N   sG   € € € € € ØOÐOðð ð ð ð ð
ð ð ð ð ð r   rR   c                  óD   — e Zd ZdZ	 	 ddd„Z	 	 ddd„Z	 ddd„Zdd d„ZdS )!ÚTimestampGatedPacketGuardz½
    High-Performance Timestamp Gating & Nonce Cache Guard.
    Enforces maximum timestamp drift (< 3000ms), single-use nonces, and HMAC integrity.
    Rejects replay attacks in < 1ms.
    é¸  rS   r   r   Úmax_drift_msr   rT   r+   ÚNonec                óZ   — || _         || _        t          |¬¦  «        | _        i | _        d S )N)rT   )r   r`   rR   Úreplay_windowÚnonce_cache)r(   r   r`   rT   s       r   r)   z"TimestampGatedPacketGuard.__init__|   s4   € ð %ˆŒØ(ˆÔÝ-¸+ÐFÑFÔFˆÔà+-ˆÔÐÐr   Nr   r   r   úOptional[int]r   úOptional[str]r   c                óx  — |€#t          t          j        ¦   «         dz  ¦  «        n|}|€t          j        d¦  «        n|}d|› d|dd…         › �}|› d|› d|› �                     d¦  «        |z   }t          j        | j        |t          j	        ¦  «         
                    ¦   «         }	t          ||||||	¬	¦  «        S )
z>Creates a signed, timestamped, nonce-protected network packet.Néè  r!   Úpkt_Ú_é   ú:úutf-8)r   r   r   r   r   r   )r   ÚtimeÚsecretsÚ	token_hexÚencoderA   rB   r   r#   r$   Ú	hexdigestr   )
r(   r   r   r   r   ÚtsÚnr   Úsign_payloadÚsigs
             r   Úcreate_packetz'TimestampGatedPacketGuard.create_packetˆ   sÖ   € ð )5Ð(<�S•”‘”˜tÑ#Ñ$Ô$Ð$À,ˆØ%* ]�GÔ˜bÑ!Ô!Ð!¸ˆØ,˜7Ð,Ð, Q r¨ r¤UÐ,Ð,ˆ	Ø!Ð,Ð, BÐ,Ð,¨Ð,Ð,×3Ò3°GÑ<Ô<¸wÑFˆÝŒh�t”¨µg´nÑEÔE×OÒOÑQÔQˆå"ØØØØØØð
ñ 
ô 
ð 	
r   ÚpacketÚserver_now_msúTuple[bool, str, float]c                óä  — t          j        ¦   «         }|€#t          t          j         ¦   «         dz  ¦  «        n|}t          ||j        z
  ¦  «        }|| j        k    r*t          j        ¦   «         |z
  dz  }dd|› d| j        › d�|fS |j        › d|j        › d|j        › �                     d	¦  «        |j	        z   }t          j        | j        |t          j        ¦  «                             ¦   «         }t          j        |j        |¦  «        st          j        ¦   «         |z
  dz  }dd
|fS |j        | j        v rt          j        ¦   «         |z
  dz  }dd|fS | j                             |j        ¦  «        st          j        ¦   «         |z
  dz  }dd|fS |j        | j        |j        <   t+          | j        ¦  «        dk    r|                      |¦  «         t          j        ¦   «         |z
  dz  }dd|fS )zü
        Validates timestamp drift, HMAC signature, nonce uniqueness, and sequence number.
        Returns: (is_valid: bool, status_reason: str, processing_latency_ms: float)
        Guaranteed to reject replayed or invalid packets in < 1.0ms.
        Nrh   g     @�@FzTIMESTAMP_DRIFT_EXCEEDED (zms > zms)rl   rm   ÚINVALID_HMAC_SIGNATUREÚREPLAY_DUPLICATE_NONCEÚREPLAY_SEQUENCE_NUMBERiPÃ  TÚPACKET_ACCEPTED)rn   Úperf_counterr   Úabsr   r`   r   r   rq   r   rA   rB   r   r#   r$   rr   rM   r   rd   rc   r\   r"   Úprune_expired_nonces)	r(   rx   ry   Út0Únow_msÚdriftÚ
elapsed_msru   Úexpected_sigs	            r   Úverify_and_process_packetz3TimestampGatedPacketGuard.verify_and_process_packetŸ   s  € õ ÔÑ Ô ˆØ,9Ð,A••T”Y‘[”[ 4Ñ'Ñ(Ô(Ð(À}ˆõ �F˜VÔ0Ñ0Ñ1Ô1ˆØ�4Ô$Ò$Ð$ÝÔ+Ñ-Ô-°Ñ2°fÑ<ˆJØÐY°uÐYÐYÀ4ÔCTÐYÐYÐYÐ[eÐeÐeð !œ.ÐOÐO¨6Ô+>ÐOÐOÀÄÐOÐO×VÒVÐW^Ñ_Ô_ÐbhÔbpÑpˆÝ”x ¤°½w¼~ÑNÔN×XÒXÑZÔZˆÝÔ" 6Ô#3°\ÑBÔBð 	?ÝÔ+Ñ-Ô-°Ñ2°fÑ<ˆJØÐ2°JÐ>Ð>ð Œ<˜4Ô+Ð+Ð+ÝÔ+Ñ-Ô-°Ñ2°fÑ<ˆJØÐ2°JÐ>Ð>ð Ô!×2Ò2°6´>ÑBÔBð 	?ÝÔ+Ñ-Ô-°Ñ2°fÑ<ˆJØÐ2°JÐ>Ð>ð *0Ô)<ˆÔ˜œÑ&ÝˆtÔÑ Ô  5Ò(Ð(Ø×%Ò% fÑ-Ô-Ð-åÔ'Ñ)Ô)¨BÑ.°&Ñ8ˆ
ØÐ&¨
Ð2Ð2r   c                óî   ‡— |€#t          t          j        ¦   «         dz  ¦  «        n|}|| j        dz  z
  Šˆfd„| j                             ¦   «         D ¦   «         }|D ]
}| j        |= Œt          |¦  «        S )zDPrunes cached nonces older than 2x max_drift_ms to keep memory lean.Nrh   é   c                ó&   •— g | ]\  }}|‰k     ¯|‘ŒS r   r   )r5   rt   rs   Úcutoffs      €r   ú
<listcomp>zBTimestampGatedPacketGuard.prune_expired_nonces.<locals>.<listcomp>Ï   s"   ø€ ÐJÐJÐJ™˜˜B¸bÀ6ºk¸k�1¸k¸k¸kr   )r   rn   r`   rd   Úitemsr"   )r(   ry   r„   Úexpiredrt   rŒ   s        @r   r‚   z.TimestampGatedPacketGuard.prune_expired_noncesË   sˆ   ø€ à,9Ð,A••T”Y‘[”[ 4Ñ'Ñ(Ô(Ð(À}ˆØ˜4Ô,¨qÑ0Ñ1ˆØJÐJÐJÐJ $Ô"2×"8Ò"8Ñ":Ô":ÐJÑJÔJˆØð 	$ð 	$ˆAØÔ  Ð#Ð#Ý�7‰|Œ|Ðr   )r_   rS   )r   r   r`   r   rT   r   r+   ra   )NN)
r   r   r   r   r   re   r   rf   r+   r   r4   )rx   r   ry   re   r+   rz   )ry   re   r+   r   )r   r   r   rP   r)   rw   rˆ   r‚   r   r   r   r^   r^   u   s˜   € € € € € ðð ð !Øð	
.ð 
.ð 
.ð 
.ð 
.ð  '+Ø#ð
ð 
ð 
ð 
ð 
ð4 (,ð*3ð *3ð *3ð *3ð *3ðXð ð ð ð ð ð r   r^   )rP   Ú
__future__r   rA   r#   r:   r<   rn   ro   Útypingr   r   r   Údataclassesr   r   r   rR   r^   r   r   r   ú<module>r“      sc  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø !Ð !Ð !Ð !Ð !Ð !ð €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðð/Uð /Uð /Uð /Uð /Uñ /Uô /Uð /Uðd$ð $ð $ð $ð $ñ $ô $ð $ðN]ð ]ð ]ð ]ð ]ñ ]ô ]ð ]ð ]ð ]r   