§
    ØÂjÆ  ã                  óÎ   — d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
 ddlmZ  edee¦  «        ZdZ G d„ d	e¦  «        Z G d
„ dee         ¦  «        Z G d„ d¦  «        ZdS )a3  
Dynamic Polymorphic XOR Key RAM Encryption Engine for FreeExile.
Protects sensitive gameplay state (HP, Mana, Currency, Cooldowns) against
memory scanners and debuggers (Cheat Engine, GameGem, memory freeze hooks).
Implements automatic dynamic key mutation and cryptographic canary integrity verification.
é    )ÚannotationsN)ÚTypeVarÚGenericÚUnionÚOptional)Ú	dataclassÚTl   Ò,}gºy c                  ó   — e Zd ZdZdS )ÚMemoryTamperViolationErrorzURaised when memory corruption, address freeze, or Cheat Engine tampering is detected.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    ú;C:\Projects\FreeExile\server\security\polymorphic_memory.pyr   r      s   € € € € € Ø_Ð_Ø€Dr   r   c                  ó\   — e Zd ZdZddd	„Zdd„Zdd„Zdd„Zdd„Zd d„Z	d!d„Z
d"d„Zd#d„ZdS )$ÚPolymorphicRAMVariablezÎ
    Polymorphic memory-protected variable.
    Masks internal value with a 64-bit rotating XOR key that changes dynamically
    upon every access or frame cycle. Verifies cryptographic canary on read.
    Úunnamed_statÚinitial_valuer	   Úvariable_nameÚstrÚreturnÚNonec                óª   — || _         t          |t          ¦  «        | _        d| _        d| _        d| _        d| _        |                      |¦  «         d S )Nr   )	r   Ú
isinstanceÚfloatÚ	_is_floatÚ	_mask_keyÚ_masked_valÚ_canary_hashÚ_access_countÚ	set_value)Úselfr   r   s      r   Ú__init__zPolymorphicRAMVariable.__init__   sR   € Ø*ˆÔÝ# Mµ5Ñ9Ô9ˆŒØˆŒØ !ˆÔØ!"ˆÔØ"#ˆÔØ�Š�}Ñ%Ô%Ð%Ð%Ð%r   ÚvalueÚintc                ó  — | j         r=t          j        dt          |¦  «        ¦  «        }t          j        d|¦  «        d         S t          j        dt          |¦  «        ¦  «        }t          j        d|¦  «        d         S )z@Converts float or int to an exact 64-bit integer representation.ú>dú>Qr   ú>q)r   ÚstructÚpackr   Úunpackr'   )r$   r&   Úpackeds      r   Ú_to_raw_intz"PolymorphicRAMVariable._to_raw_int(   sh   € àŒ>ð 	2Ý”[ ¥u¨U¡|¤|Ñ4Ô4ˆFÝ”=  vÑ.Ô.¨qÔ1Ð1Ý”˜T¥3 u¡:¤:Ñ.Ô.ˆÝŒ}˜T 6Ñ*Ô*¨1Ô-Ð-r   Úraw_intc                óÜ   — | j         r3t          j        d|dz  ¦  «        }t          j        d|¦  «        d         S t          j        d|dz  ¦  «        }t          j        d|¦  «        d         S )z9Restores float or int from 64-bit integer representation.r*   ì   ÿÿÿÿ r)   r   r+   )r   r,   r-   r.   )r$   r1   r/   s      r   Ú_from_raw_intz$PolymorphicRAMVariable._from_raw_int0   sh   € àŒ>ð 	2Ý”[  wÐ1CÑ'CÑDÔDˆFÝ”=  vÑ.Ô.¨qÔ1Ð1Ý”˜T 7Ð-?Ñ#?Ñ@Ô@ˆÝŒ}˜T 6Ñ*Ô*¨1Ô-Ð-r   Úkeyc                ó\   — |t           z  |dz  z   dz  }||dz	  z  }|dz  dz  }||dz	  z  }|S )zGComputes internal integrity canary to detect external memory tampering.l   ¥%KK–--
 r3   é!   l   Í«Z_?�z )Ú_CANARY_SALT)r$   r1   r5   Úhs       r   Ú_compute_canaryz&PolymorphicRAMVariable._compute_canary8   sM   € à�Ñ$¨Ð/AÑ)AÑBÐFXÑXˆØ	ˆa�2‰g‰ˆØÐ#Ñ#Ð'9Ñ9ˆØ	ˆa�2‰g‰ˆØˆr   Ú	new_valuec                óà   — |                       |¦  «        }t          j        d¦  «        | _        || j        z  | _        |                      || j        ¦  «        | _        | xj        dz  c_        dS )zHEncrypts value with a newly generated random 64-bit polymorphic XOR key.é@   é   N)r0   ÚsecretsÚrandbitsr   r    r:   r!   r"   )r$   r;   r1   s      r   r#   z PolymorphicRAMVariable.set_value@   sj   € à×"Ò" 9Ñ-Ô-ˆÝ Ô)¨"Ñ-Ô-ˆŒØ" T¤^Ñ3ˆÔØ ×0Ò0°¸$¼.ÑIÔIˆÔØÐÔ˜aÑÐÔÐÐr   c           	     ó  — | j         | j        z  }|                      || j        ¦  «        }|| j        k    r%t	          d| j        › d|d›d| j        d›d�¦  «        ‚|                      |¦  «        }|                      |¦  «         |S )z‘
        Decrypts value on-the-fly, verifies integrity canary,
        and dynamically rotates the key to scramble RAM address contents.
        zMemory tampering detected on z! Canary mismatch (expected z#xz, got z4). Cheat Engine / GameGem memory freeze intercepted.)r    r   r:   r!   r   r   r4   r#   )r$   r1   Úexpected_canaryÚvals       r   Ú	get_valuez PolymorphicRAMVariable.get_valueH   sº   € ð
 Ô" T¤^Ñ3ˆØ×.Ò.¨w¸¼ÑGÔGˆØ˜dÔ/Ò/Ð/Ý,ðD°Ô0Bð Dð DØ-<Ð`ðDð DØGKÔGXÐ`ðDð Dð Dñô ð ð × Ò  Ñ)Ô)ˆà�Š�sÑÔÐØˆ
r   c                ó.   — |                       ¦   «          dS )zNCycles encryption mask key without modifying logical value (called per-frame).N)rD   ©r$   s    r   Ú
cycle_maskz!PolymorphicRAMVariable.cycle_mask[   s   € à�ŠÑÔÐÐÐr   Úboolc                óh   — | j         | j        z  }|                      || j        ¦  «        | j        k    S )z7Non-mutating integrity check against memory corruption.)r    r   r:   r!   )r$   r1   s     r   Úverify_integrityz'PolymorphicRAMVariable.verify_integrity_   s1   € àÔ" T¤^Ñ3ˆØ×#Ò# G¨T¬^Ñ<Ô<ÀÔ@QÒQÐQr   Úcorrupted_masked_valc                ó   — || _         dS )zISimulates external memory hacker / Cheat Engine overwriting memory bytes.N)r    )r$   rK   s     r   Úinject_raw_memory_corruptionz3PolymorphicRAMVariable.inject_raw_memory_corruptiond   s   € à/ˆÔÐÐr   N)r   )r   r	   r   r   r   r   )r&   r	   r   r'   )r1   r'   r   r	   )r1   r'   r5   r'   r   r'   )r;   r	   r   r   )r   r	   ©r   r   ©r   rH   )rK   r'   r   r   )r   r   r   r   r%   r0   r4   r:   r#   rD   rG   rJ   rM   r   r   r   r   r      sÛ   € € € € € ðð ð&ð &ð &ð &ð &ð.ð .ð .ð .ð.ð .ð .ð .ðð ð ð ð ð  ð  ð  ðð ð ð ð&ð ð ð ðRð Rð Rð Rð
0ð 0ð 0ð 0ð 0ð 0r   r   c                  ó`   — e Zd ZdZ	 	 	 	 	 	 ddd„Zdd„Zdd„Zdd„Zdd„Zd d„Z	d!d„Z
d"d„ZdS )#ÚProtectedPlayerStatsz“
    Secure client/server container for critical gameplay attributes.
    Every stat is individually encapsulated in a PolymorphicRAMVariable.
    ç     @�@ç     @@r   Úhpr   Úmax_hpÚmanaÚmax_manaÚcurrency_hon_nguyenr'   Úcooldown_msr   r   c                ó†  — t          t                   |d¦  «        | _        t          t                   |d¦  «        | _        t          t                   |d¦  «        | _        t          t                   |d¦  «        | _        t          t                   |d¦  «        | _        t          t                   |d¦  «        | _        d S )NÚplayer_current_hpÚplayer_max_hpÚplayer_current_manaÚplayer_max_manarX   Úskill_cooldown_ms)	r   r   rT   rU   rV   rW   r'   rX   rY   )r$   rT   rU   rV   rW   rX   rY   s          r   r%   zProtectedPlayerStats.__init__o   s–   € õ )­Ô/°Ð4GÑHÔHˆŒÝ,­UÔ3°F¸OÑLÔLˆŒÝ*­5Ô1°$Ð8MÑNÔNˆŒ	Ý.­uÔ5°hÐ@QÑRÔRˆŒÝ#9½#Ô#>Ð?RÐTiÑ#jÔ#jˆÔ Ý1µ#Ô6°{ÐDWÑXÔXˆÔÐÐr   Úamountc                ó®   — | j                              ¦   «         }t          d|t          d|¦  «        z
  ¦  «        }| j                              |¦  «         |S )z4Safely applies damage with polymorphic RAM mutation.ç        )rT   rD   Úmaxr#   )r$   r`   Úcurr_hpÚnew_hps       r   Útake_damagez ProtectedPlayerStats.take_damage   sN   € à”'×#Ò#Ñ%Ô%ˆÝ�S˜'¥C¨¨VÑ$4Ô$4Ñ4Ñ5Ô5ˆØŒ×Ò˜&Ñ!Ô!Ð!Øˆr   c                óà   — | j                              ¦   «         }| j                             ¦   «         }t          ||t	          d|¦  «        z   ¦  «        }| j                              |¦  «         |S )z Safely restores HP up to max_hp.rb   )rT   rD   rU   Úminrc   r#   )r$   r`   rd   Úcapre   s        r   ÚhealzProtectedPlayerStats.heal†   sa   € à”'×#Ò#Ñ%Ô%ˆØŒk×#Ò#Ñ%Ô%ˆÝ�S˜'¥C¨¨VÑ$4Ô$4Ñ4Ñ5Ô5ˆØŒ×Ò˜&Ñ!Ô!Ð!Øˆr   ÚcostrH   c                ó‚   — | j                              ¦   «         }||k     rdS | j                              ||z
  ¦  «         dS )z1Safely deducts mana if sufficient balance exists.FT)rV   rD   r#   )r$   rk   Ú	curr_manas      r   Ú
spend_manazProtectedPlayerStats.spend_manaŽ   sE   € à”I×'Ò'Ñ)Ô)ˆ	Ø�tÒÐØ�5ØŒ	×Ò˜I¨Ñ,Ñ-Ô-Ð-Øˆtr   c                ó’   — | j                              ¦   «         }t          d||z   ¦  «        }| j                              |¦  «         |S )z Adds Primal Currency Hon Nguyen.r   )rX   rD   rc   r#   )r$   r`   ÚcurrÚnew_currs       r   Úadd_currencyz!ProtectedPlayerStats.add_currency–   sE   € àÔ'×1Ò1Ñ3Ô3ˆÝ�q˜$ ™-Ñ(Ô(ˆØÔ ×*Ò*¨8Ñ4Ô4Ð4Øˆr   c                ó‚   — | j                              ¦   «         }||k     rdS | j                              ||z
  ¦  «         dS )z-Spends currency if sufficient balance exists.FT)rX   rD   r#   )r$   r`   rp   s      r   Úspend_currencyz#ProtectedPlayerStats.spend_currency�   sD   € àÔ'×1Ò1Ñ3Ô3ˆØ�&Š=ˆ=Ø�5ØÔ ×*Ò*¨4°&©=Ñ9Ô9Ð9Øˆtr   c                ó2  — | j                              ¦   «          | j                             ¦   «          | j                             ¦   «          | j                             ¦   «          | j                             ¦   «          | j                             ¦   «          dS )z<Cycles all XOR keys across all stats (called on frame tick).N)rT   rG   rU   rV   rW   rX   rY   rF   s    r   Úcycle_all_masksz$ProtectedPlayerStats.cycle_all_masks¥   s‚   € àŒ×ÒÑÔÐØŒ×ÒÑ Ô Ð ØŒ	×ÒÑÔÐØŒ× Ò Ñ"Ô"Ð"ØÔ ×+Ò+Ñ-Ô-Ð-ØÔ×#Ò#Ñ%Ô%Ð%Ð%Ð%r   c                ó.  — | j                              ¦   «         o|| j                             ¦   «         oc| j                             ¦   «         oJ| j                             ¦   «         o1| j                             ¦   «         o| j                             ¦   «         S )z3Verifies integrity across all protected attributes.)rT   rJ   rU   rV   rW   rX   rY   rF   s    r   Úverify_all_integrityz)ProtectedPlayerStats.verify_all_integrity®   s�   € ð ŒG×$Ò$Ñ&Ô&ð 4Ø”×,Ò,Ñ.Ô.ð4à”	×*Ò*Ñ,Ô,ð4ð ”×.Ò.Ñ0Ô0ð4ð Ô(×9Ò9Ñ;Ô;ð	4ð
 Ô ×1Ò1Ñ3Ô3ð	
r   N)rR   rR   rS   rS   r   r   )rT   r   rU   r   rV   r   rW   r   rX   r'   rY   r'   r   r   )r`   r   r   r   )rk   r   r   rH   )r`   r'   r   r'   )r`   r'   r   rH   rN   rO   )r   r   r   r   r%   rf   rj   rn   rr   rt   rv   rx   r   r   r   rQ   rQ   i   sÜ   € € € € € ðð ð ØØØØ#$ØðYð Yð Yð Yð Yð ð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ð&ð &ð &ð &ð	
ð 	
ð 	
ð 	
ð 	
ð 	
r   rQ   )r   Ú
__future__r   Úmathr,   r?   Útypingr   r   r   r   Údataclassesr   r'   r   r	   r8   Ú	Exceptionr   r   rQ   r   r   r   ú<module>r~      s)  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€Ø €€€Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø !Ð !Ð !Ð !Ð !Ð !à€GˆC��eÑÔ€Ø!€ð	ð 	ð 	ð 	ð 	 ñ 	ô 	ð 	ð
N0ð N0ð N0ð N0ð N0˜W QœZñ N0ô N0ð N0ðbN
ð N
ð N
ð N
ð N
ñ N
ô N
ð N
ð N
ð N
r   