§
    #Âjþ%  ã                  óX  — 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mZm	Z	m
Z
mZ ddlmZ  edd¬¦  «         G d„ d	¦  «        ¦   «         Z edd¬¦  «         G d
„ d¦  «        ¦   «         Z edd¬¦  «         G d„ d¦  «        ¦   «         ZddlZ G d„ de¦  «        Z G d„ d¦  «        ZdS )zù
Apple App Attest & DeviceCheck Verification Service for FreeExile.
Verifies hardware-backed cryptographic attestation statements from Apple Secure Enclave
to guarantee client binary integrity, detect jailbreak/tampering, and prevent emulator bots.
é    )ÚannotationsN)ÚDictÚTupleÚOptionalÚList)Ú	dataclassT)ÚslotsÚfrozenc                  óZ   — 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	S )ÚAttestationTokenÚstrÚ	device_idÚ	bundle_idÚpublic_key_hashÚ	signatureÚintÚcounterÚtimestamp_msNúOptional[str]Úchallenge_nonce)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   © ó    ú3C:\Projects\FreeExile\server\security\app_attest.pyr   r      s_   € € € € € € à€N€N�NØ€N€N�NØÐÐÑØ€N€N�NØ€L€L�LØÐÐÑØ%)€OÐ)Ð)Ð)Ñ)Ð)Ð)r   r   c                  ó\   — e Zd ZU ded<   ded<   dZded<   dZded<   dZded<   dZded	<   d
S )ÚClientEnvironmentInfor   r   Úbinary_hashFÚboolÚis_jailbrokenÚdebugger_attachedÚsuspicious_dylib_loadedÚemulation_artifactsN)r   r   r   r   r"   r#   r$   r%   r   r   r   r   r      sn   € € € € € € à€N€N�NØÐÐÑØ€MÐÐÐÑØ#ÐÐ#Ð#Ð#Ñ#Ø$)ÐÐ)Ð)Ð)Ñ)Ø %ÐÐ%Ð%Ð%Ñ%Ð%Ð%r   r   c                  ó8   — e Zd ZU ded<   ded<   ded<   ded<   d	S )
ÚClientIntegrityResultr!   Ú
is_trustedÚfloatÚ
risk_scorez	List[str]Úviolation_flagsr   ÚdetailsN)r   r   r   r   r   r   r   r'   r'   %   s=   € € € € € € àÐÐÑØÐÐÑØÐÐÑØ€L€L�L€L€Lr   r'   c                  ó   — e Zd ZdZdS )ÚAppleAppAttestSecurityErrorzRRaised when insecure simulated attestation is attempted in strict production mode.N)r   r   r   Ú__doc__r   r   r   r.   r.   0   s   € € € € € Ø\Ð\Ø€Dr   r.   c                  ó^   — e Zd ZdZ	 	 	 d%d&d„Zd'd(d„Zd)d„Z	 	 d*d+d„Z	 d,d-d„Zd.d „Z	d/d$„Z
dS )0ÚAppleAppAttestValidatorzé
    Apple App Attest & Secure Enclave verification service.
    Implements cryptographic challenge-response handshakes, monotonic counter validation,
    and client runtime integrity enforcement against jailbreak and emulators.
    úcom.freeexile.game.iosúSHA256:OFFICIAL_APPLE_CERT_2026NÚexpected_bundle_idr   Úexpected_binary_hashÚrequire_production_pkiúOptional[bool]ÚreturnÚNonec                óö   — || _         || _        |�|| _        nKt          j                             dd¦  «                             ¦   «                              ¦   «         dv | _        i | _        i | _	        d| _
        d S )NÚFREEEXILE_PRODUCTION_ATTESTÚ >   Ú1ÚonÚyesÚtrues+   APPLE_APP_ATTEST_ROOT_CA_SIMULATED_KEY_2026)r4   r5   r6   ÚosÚenvironÚgetÚstripÚlowerÚdevice_assertion_countersÚactive_challengesÚ_attest_root_secret)Úselfr4   r5   r6   s       r   Ú__init__z AppleAppAttestValidator.__init__<   sƒ   € ð #5ˆÔØ$8ˆÔ!Ø!Ð-Ø*@ˆDÔ'Ð'õ ”
—’Ð<¸bÑAÔA×GÒGÑIÔI×OÒOÑQÔQØ-ð.ð Ô'ð
 :<ˆÔ&à=?ˆÔØ#QˆÔ Ð Ð r   éx   r   Úttl_secondsr   c                ó˜   — t          j        d¦  «        }t          t          j        ¦   «         dz  ¦  «        |dz  z   }||f| j        |<   |S )zCGenerates a cryptographically random, time-bounded challenge nonce.é   éè  )ÚsecretsÚ	token_hexr   ÚtimerG   )rI   r   rL   ÚnonceÚexpires_at_mss        r   Úgenerate_challengez*AppleAppAttestValidator.generate_challengeQ   sK   € åÔ! "Ñ%Ô%ˆÝ�DœI™KœK¨$Ñ.Ñ/Ô/°;ÀÑ3EÑFˆØ-2°MÐ,BˆÔ˜yÑ)Øˆr   r   r!   c                óÊ   — | j                              |d¦  «        }|sdS |\  }}t          t          j        ¦   «         dz  ¦  «        }||k    rdS t	          j        ||¦  «        S )z@Verifies and consumes the active challenge nonce for the device.NFrO   )rG   Úpopr   rR   ÚhmacÚcompare_digest)rI   r   r   ÚcachedÚexpected_noncerT   Únow_mss          r   Úverify_challengez(AppleAppAttestValidator.verify_challengeX   sl   € àÔ'×+Ò+¨I°tÑ<Ô<ˆØð 	Ø�5Ø(.Ñ%ˆ˜Ý•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆØ�MÒ!Ð!Ø�5ÝÔ" >°?ÑCÔCÐCr   é   r   r   r   r   c           	     óà  — | j         rt          d¦  «        ‚t          t          j        ¦   «         dz  ¦  «        }t	          j        |› d|› �                     ¦   «         ¦  «                             ¦   «         }|› d|› d|› d|› d|› �	}|r|d|› �z  }t          j	        | j
        |                     ¦   «         t          j        ¦  «                             ¦   «         }t          |||||||¬¦  «        S )zJGenerates an authentic mock App Attest token for testing and verification.zjCannot generate mock attestation tokens when require_production_pki/FREEEXILE_PRODUCTION_ATTEST is active.rO   Ú_ú:)r   r   r   r   r   r   r   )r6   r.   r   rR   ÚhashlibÚsha256ÚencodeÚ	hexdigestrX   ÚnewrH   r   )	rI   r   r   r   r   r\   Úpub_key_hashÚ	sign_datar   s	            r   Úgenerate_mock_attestationz1AppleAppAttestValidator.generate_mock_attestationc   s  € ð Ô&ð 	Ý-Ø|ñô ð õ •T”Y‘[”[ 4Ñ'Ñ(Ô(ˆÝ”~¨Ð&@Ð&@°YÐ&@Ð&@×&GÒ&GÑ&IÔ&IÑJÔJ×TÒTÑVÔVˆØ ÐPÐP 9ÐPÐP¨|ÐPÐP¸gÐPÐPÈÐPÐPˆ	Øð 	/ØÐ.˜_Ð.Ð.Ñ.ˆIÝ”H˜TÔ5°y×7GÒ7GÑ7IÔ7IÍ7Ì>ÑZÔZ×dÒdÑfÔfˆ	åØØØ(ØØØØ+ð
ñ 
ô 
ð 	
r   ÚtokenÚrequired_challengeúTuple[bool, str]c           	     ó^  — | j         rdS |j        dk    rdS |�F|j        rt          j        |j        |¦  «        sdS |                      |j        |j        ¦  «        sdS n7|j        | j        v r)|j        r |                      |j        |j        ¦  «        sdS |j        | j	        k    rdd	|j        › d
| j	        › d�fS |j        › d|j        › d|j
        › d|j        › d|j        › �	}|j        r|d|j        › �z  }t          j        | j        |                     ¦   «         t          j        ¦  «                             ¦   «         }t          j        |j        |¦  «        sdS | j                             |j        ¦  «        }|�|j        |k    rdd|j        › d|› d�fS |j        | j        |j        <   dS )zµ
        Validates hardware attestation statement from Apple Secure Enclave.
        Verifies bundle ID, challenge match, cryptographic signature, and counter monotonicity.
        )Fz‡Production hardware attestation failure: Simulated HMAC tokens rejected. Apple ASN.1 X.509 PKI certificate chain verification required.r   )Fz4Invalid assertion counter. Counter must be positive.N)Fz6Challenge mismatch or expired. Replay attack rejected.)Fz>Challenge already consumed or expired. Replay attack rejected.)FzIPending challenge verification failed or missing. Replay attack rejected.FzInvalid bundle identifier 'z', expected 'z'. Binary tampering detected.ra   )FzQInvalid cryptographic attestation signature. Untrusted hardware or hook detected.z<Attestation replay detected: counter did not increment (got z, registered z).)Tz?Apple App Attest verified successfully. Hardware authenticated.)r6   r   r   rX   rY   r]   r   rG   r   r4   r   r   rf   rH   rd   rb   rc   re   r   rF   rC   )rI   rj   rk   rh   Úexpected_sigÚexisting_counters         r   Úverify_attestationz*AppleAppAttestValidator.verify_attestation€   sF  € ð Ô&ð 	ðð ð Œ=˜AÒÐØPÐPð Ð)ØÔ(ð WµÔ0CÀEÔDYÐ[mÑ0nÔ0nð WØVÐVØ×(Ò(¨¬¸%Ô:OÑPÔPð _Ø^Ð^ð_àŒ_ Ô 6Ð6Ð6ØÔ(ð j°×0EÒ0EÀeÄoÐW\ÔWlÑ0mÔ0mð jØiÐið Œ?˜dÔ5Ò5Ð5Øð  M¸¼ð  Mð  MÐVZÔVmð  Mð  Mð  Mð  Mð  Mð ”ÐwÐw¨¬ÐwÐw¸5Ô;PÐwÐwÐSXÔS`ÐwÐwÐchÔcuÐwÐwˆ	ØÔ ð 	5ØÐ4˜UÔ2Ð4Ð4Ñ4ˆIÝ”x Ô 8¸)×:JÒ:JÑ:LÔ:LÍgÌnÑ]Ô]×gÒgÑiÔiˆåÔ" 5¤?°LÑAÔAð 	nØmÐmð  Ô9×=Ò=¸e¼oÑNÔNÐØÐ'¨E¬MÐ=MÒ,MÐ,MØðIØœðIð IØ4DðIð Ið Iðð ð ;@¼-ˆÔ& u¤Ñ7ØVÐVr   Únew_counterc                óˆ   — |dk    rdS | j                              |¦  «        }|€dS ||k    rdd|› d|› d�fS || j         |<   d	S )
z“
        Verifies that subsequent client assertion requests increment monotonically,
        preventing hardware assertion replay attacks.
        r   )Fz,Invalid assertion counter. Must be positive.N)Fz=Device not attested. Must complete initial attestation first.Fz)Assertion counter did not increment (got z, last z). Replay attack suspected.)TzAssertion counter valid.)rF   rC   )rI   r   rq   Úlast_counters       r   Úverify_assertion_counterz0AppleAppAttestValidator.verify_assertion_counter¶   s�   € ð
 ˜!ÒÐØHÐHàÔ5×9Ò9¸)ÑDÔDˆØÐØYÐYà˜,Ò&Ð&Øð  DÀkð  Dð  DÐZfð  Dð  Dð  Dð  Dð  Dà4?ˆÔ& yÑ1Ø/Ð/r   Úenvr   r'   c                óZ  — g }d}|j         | j        k    r|                     d¦  «         |dz  }|j        | j        k    r|                     d¦  «         |dz  }|j        r|                     d¦  «         |dz  }|j        r|                     d¦  «         |d	z  }|j        r|                     d
¦  «         |d	z  }|j        r|                     d¦  «         |dz  }t          |¦  «        dk    }|rdndd 
                    |¦  «        › �}t          |t          d|¦  «        ||¬¦  «        S )zž
        Verifies client integrity against jailbreak artifacts, dynamic hooking (Frida/Substrate),
        attached debuggers, and modified binaries.
        g        ÚBUNDLE_ID_MISMATCHg      à?ÚBINARY_HASH_TAMPEREDgš™™™™™Ù?ÚJAILBREAK_DETECTEDgffffffÖ?ÚDEBUGGER_ATTACHEDg333333Ó?ÚSUSPICIOUS_DYLIB_HOOKÚEMULATOR_DETECTEDg      Ð?r   zEnvironment authenticzIntegrity violations: z, g      ð?)r(   r*   r+   r,   )r   r4   Úappendr    r5   r"   r#   r$   r%   ÚlenÚjoinr'   Úmin)rI   ru   Ú
violationsr*   r(   r,   s         r   Úverify_client_environmentz1AppleAppAttestValidator.verify_client_environmentÈ   sz  € ð
 !#ˆ
Øˆ
àŒ=˜DÔ3Ò3Ð3Ø×ÒÐ2Ñ3Ô3Ð3Ø˜$ÑˆJàŒ?˜dÔ7Ò7Ð7Ø×ÒÐ4Ñ5Ô5Ð5Ø˜$ÑˆJàÔð 	Ø×ÒÐ2Ñ3Ô3Ð3Ø˜$ÑˆJàÔ ð 	Ø×ÒÐ1Ñ2Ô2Ð2Ø˜$ÑˆJàÔ&ð 	Ø×ÒÐ5Ñ6Ô6Ð6Ø˜$ÑˆJàÔ"ð 	Ø×ÒÐ1Ñ2Ô2Ð2Ø˜$ÑˆJå˜‘_”_¨Ò)ˆ
Ø-7ÐmÐ)Ð)Ð=mÐVZ×V_ÒV_Ð`jÑVkÔVkÐ=mÐ=mˆÝ$Ø!Ý˜3 
Ñ+Ô+Ø&Øð	
ñ 
ô 
ð 	
r   )r2   r3   N)r4   r   r5   r   r6   r7   r8   r9   )rK   )r   r   rL   r   r8   r   )r   r   r   r   r8   r!   )r^   N)
r   r   r   r   r   r   r   r   r8   r   )N)rj   r   rk   r   r8   rl   )r   r   rq   r   r8   rl   )ru   r   r8   r'   )r   r   r   r/   rJ   rU   r]   ri   rp   rt   r‚   r   r   r   r1   r1   5   sç   € € € € € ðð ð #;Ø$EØ15ð	Rð Rð Rð Rð Rð*ð ð ð ð ð	Dð 	Dð 	Dð 	Dð Ø)-ð
ð 
ð 
ð 
ð 
ð< LPð4Wð 4Wð 4Wð 4Wð 4Wðl0ð 0ð 0ð 0ð$'
ð '
ð '
ð '
ð '
ð '
r   r1   )r/   Ú
__future__r   rX   rb   rR   rP   Útypingr   r   r   r   Údataclassesr   r   r   r'   rA   ÚRuntimeErrorr.   r1   r   r   r   ú<module>r‡      sº  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€Ø €€€Ø €€€Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø !Ð !Ð !Ð !Ð !Ð !ð €�˜dÐ#Ñ#Ô#ð*ð *ð *ð *ð *ñ *ô *ñ $Ô#ð*ð €�˜dÐ#Ñ#Ô#ð&ð &ð &ð &ð &ñ &ô &ñ $Ô#ð&ð €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðð 
€	€	€	ð	ð 	ð 	ð 	ð 	 ,ñ 	ô 	ð 	ð
z
ð z
ð z
ð z
ð z
ñ z
ô z
ð z
ð z
ð z
r   