§
    +X»j§#  ã            
       ó   — d Z ddlZddlmc 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e
j                             de	j                             e	j                             e	j                             e¦  «        d¦  «        ¦  «        ¦  «         ddlmZ ddlmZ ddlmZ ddlmZ  G d„ d	ej        ¦  «        Zed
k    r ej        ¦   «          dS dS )a±  
End-to-End Integration Test for FreeExile Gateway & Security Pipeline.
Tests the complete client-to-server lifecycle:
1. Apple App Attest hardware authentication handshake.
2. Key exchange and AEAD packet encryption.
3. Anti-replay sliding window verification.
4. Touch biometrics human validation on iOS.
5. Authoritative server movement and spatial grid updates.
6. Detection and rejection of tampering, bots, and replay attacks.
é    Nz../../server)ÚAuthoritativeGatewayService)ÚPacketCodec)ÚAppleAppAttestValidator)ÚPacketCipherEnginec                   ó,   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestEndToEndGatewayc              ƒ   ó¤   K  — d| _         d| _        t          | j         | j        ¬¦  «        | _        | j                             ¦   «         ƒ d {V —† d S )Nz	127.0.0.1iN  )ÚhostÚport)r
   r   r   ÚserviceÚstart©Úselfs    úBC:\Projects\FreeExile\tests\integration\test_end_to_end_gateway.pyÚ
asyncSetUpzTestEndToEndGateway.asyncSetUp   sX   è è € ØˆŒ	ØˆŒ	Ý2¸¼	ÈÌ	ÐRÑRÔRˆŒØŒl× Ò Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ð"ó    c              ƒ   óH   K  — | j                              ¦   «         ƒ d {V —† d S ©N)r   Ústopr   s    r   ÚasyncTearDownz!TestEndToEndGateway.asyncTearDown"   s2   è è € ØŒl×ÒÑ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!r   c              ƒ   óœ  K  — t          j        | j        | j        ¦  «        ƒ d{V —†\  }}t	          ¦   «         }|                     ddd¬¦  «        }t          j        dd|j        |j	        |j
        |j        |j        |j        dœ¦  «                             d	¦  «        }|                     t!          j        |¦  «        ¦  «         |                     ¦   «         ƒ d{V —† |                     d
¦  «        ƒ d{V —†}t)          j        d|¦  «        \  }|                     |¦  «        ƒ d{V —†}t          j        |                     d	¦  «        ¦  «        }	|                      |	                     d¦  «        d¦  «         |                      d|	¦  «         |                      d|	¦  «         |	d         }
t6                               |	d         ¦  «        }t;          |¦  «        }d}ddddddœddddddœddddd dœd!d"d#d$d%dœd&d'd(d)d*dœg}t          j        d+dd,d-|d.œ¦  «                             d	¦  «        }|                     ||¦  «        \  }}}t)          j        d/|¦  «        |z   |z   |z   }|                     t!          j        |¦  «        ¦  «         |                     ¦   «         ƒ d{V —† |                     d
¦  «        ƒ d{V —†}t)          j        d|¦  «        \  }|                     |¦  «        ƒ d{V —†}t)          j        d/|dd0…         ¦  «        d1         }|d0d2…         }|d2d3…         }|d3d…         }|                      ||||¦  «        }t          j        |                     d	¦  «        ¦  «        }|                      |                     d4¦  «        d5¦  «         |                      |                     d6¦  «        d¦  «         |                      |                     d¦  «        |
¦  «         |  !                    |                     d7¦  «        d,¦  «         | "                    ¦   «          | #                    ¦   «         ƒ d{V —† dS )8zYGenuine iPhone connects, attests hardware, sends human touch movement, receives snapshot.NÚiphone_15_pro_001úcom.freeexile.game.iosé   ©Ú	device_idÚ	bundle_idÚcounterÚ	handshakeÚplayer_hero_01©ÚtypeÚ
account_idr   r   Úpublic_key_hashÚ	signaturer   Útimestamp_msúutf-8é   ú>IÚstatusÚokÚ
session_idÚ
shared_keyÚ	entity_idg      Y@g      i@ç     @�@g     €2@ç      ð?©ÚxÚyr&   Úmajor_radiusÚforcegÍÌÌÌÌZ@g33333Ci@g     À�@g      3@gR¸…ëQð?g33333s[@gfffff¶i@g     $�@g3333332@g\�Âõ(\ï?g      ]@gÍÌÌÌÌLj@g     d�@gÍÌÌÌÌÌ1@gÍÌÌÌÌÌð?g      _@g      k@g     ¨�@gš™™™™™2@g)\�Âõ(ð?Úmoveç        çš™™™™™¹?©r"   Údir_xÚdir_yÚdtÚtouch_pointsú>Qé   r   é   é$   r"   ÚsnapshotÚack_seqr2   )$ÚasyncioÚopen_connectionr
   r   r   Úgenerate_mock_attestationÚjsonÚdumpsr   r   r$   r%   r   r&   ÚencodeÚwriter   Úencode_frameÚdrainÚreadexactlyÚstructÚunpackÚloadsÚdecodeÚassertEqualÚgetÚassertInÚbytesÚfromhexr   ÚencryptÚpackÚdecryptÚassertGreaterÚcloseÚwait_closed)r   ÚreaderÚwriterÚ	validatorÚtokenÚhandshake_payloadÚheaderÚlengthÚresp_payloadÚrespr.   r-   Úclient_cipherÚseq_numr=   Úmove_msgÚ
ciphertextÚtagÚnonceÚpacket_bodyÚresp_packet_bodyÚresp_seqÚ
resp_nonceÚresp_tagÚresp_ciphertextÚdecrypted_snapshot_bytesrB   s                              r   Ú%test_end_to_end_genuine_iphone_clientz9TestEndToEndGateway.test_end_to_end_genuine_iphone_client%   s¬  è è € å&Ô6°t´yÀ$Ä)ÑLÔLÐLÐLÐLÐLÐLÐL‰ˆ�õ ,Ñ-Ô-ˆ	Ø×3Ò3Ø)Ø.Øð 4ñ 
ô 
ˆõ
 !œJØØ*ØœØœØ$Ô4ØœØ”}Ø!Ô.ð	(
ð 	(
ñ 	ô 	÷ Š6�'‰?Œ?ð 	ð 	�Š•[Ô-Ð.?Ñ@Ô@ÑAÔAÐAØ�lŠl‰nŒnÐÐÐÐÐÐÐð ×)Ò)¨!Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,ˆÝ”M $¨Ñ/Ô/‰	ˆØ#×/Ò/°Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7ˆÝŒz˜,×-Ò-¨gÑ6Ô6Ñ7Ô7ˆà×Ò˜Ÿš (Ñ+Ô+¨TÑ2Ô2Ð2Ø�Š�l DÑ)Ô)Ð)Ø�Š�l DÑ)Ô)Ð)Ø˜Ô%ˆ	Ý—]’] 4¨Ô#5Ñ6Ô6ˆ
õ +¨:Ñ6Ô6ˆð ˆà˜e°VÈTÐ\_Ð`Ð`Ø˜e°VÈTÐ\`ÐaÐaØ˜e°VÈTÐ\`ÐaÐaØ˜e°VÈTÐ\`ÐaÐaØ˜e°VÈTÐ\`ÐaÐað
ˆõ ”:ØØØØØ(ð
ð 
ñ ô ÷ Š6�'‰?Œ?ð 	ð "/×!6Ò!6°xÀÑ!IÔ!IÑˆ
�C˜Ý”k $¨Ñ0Ô0°5Ñ8¸3Ñ>ÀÑKˆØ�Š•[Ô-¨kÑ:Ô:Ñ;Ô;Ð;Ø�lŠl‰nŒnÐÐÐÐÐÐÐð ×)Ò)¨!Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,ˆÝ”M $¨Ñ/Ô/‰	ˆØ!'×!3Ò!3°FÑ!;Ô!;Ð;Ð;Ð;Ð;Ð;Ð;Ðå”= Ð'7¸¸¸Ô';Ñ<Ô<¸QÔ?ˆØ% a¨ dÔ+ˆ
Ø# B r EÔ*ˆØ*¨2¨3¨3Ô/ˆà#0×#8Ò#8¸È(ÐT^Ð`hÑ#iÔ#iÐ Ý”:Ð6×=Ò=¸gÑFÔFÑGÔGˆà×Ò˜Ÿš fÑ-Ô-¨zÑ:Ô:Ð:Ø×Ò˜Ÿš iÑ0Ô0°!Ñ4Ô4Ð4Ø×Ò˜Ÿš kÑ2Ô2°IÑ>Ô>Ð>Ø×Ò˜8Ÿ<š<¨Ñ,Ô,¨cÑ2Ô2Ð2à�Š‰ŒˆØ× Ò Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ð"r   c              ƒ   óJ  K  — t          j        | j        | j        ¦  «        ƒ d{V —†\  }}t	          j        dddddddd	d
œ¦  «                             d¦  «        }|                     t          j	        |¦  «        ¦  «         | 
                    ¦   «         ƒ d{V —† |                     d¦  «        ƒ d{V —†}t          j        d|¦  «        \  }|                     |¦  «        ƒ d{V —†}t	          j        |                     d¦  «        ¦  «        }|                      |                     d¦  «        d¦  «         |                      d|                     dd¦  «                             ¦   «         ¦  «         |                     ¦   «          |                     ¦   «         ƒ d{V —† dS )z3Cracked IPA bundle ID is rejected during handshake.Nr   Úplayer_hackerÚfake_devicezcom.cracked.freeexileÚdeadbeefÚbad_sigr   iè  r!   r'   r(   r)   r*   ÚerrorÚ	tamperingÚmessageÚ )rD   rE   r
   r   rG   rH   rI   rJ   r   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   Úlowerr[   r\   )r   r]   r^   ra   rb   rc   rd   re   s           r   Ú&test_end_to_end_rejects_cracked_bundlez:TestEndToEndGateway.test_end_to_end_rejects_cracked_bundlex   s¶  è è € å&Ô6°t´yÀ$Ä)ÑLÔLÐLÐLÐLÐLÐLÐL‰ˆ�å œJØØ)Ø&Ø0Ø)Ø"ØØ ð	(
ð 	(
ñ 	ô 	÷ Š6�'‰?Œ?ð 	ð 	�Š•[Ô-Ð.?Ñ@Ô@ÑAÔAÐAØ�lŠl‰nŒnÐÐÐÐÐÐÐà×)Ò)¨!Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,ˆÝ”M $¨Ñ/Ô/‰	ˆØ#×/Ò/°Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7ˆÝŒz˜,×-Ò-¨gÑ6Ô6Ñ7Ô7ˆà×Ò˜Ÿš (Ñ+Ô+¨WÑ5Ô5Ð5Ø�Š�k 4§8¢8¨I°rÑ#:Ô#:×#@Ò#@Ñ#BÔ#BÑCÔCÐCà�Š‰ŒˆØ× Ò Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ð"r   c              ƒ   óš  ‡K  — t          j        | j        | j        ¦  «        ƒ d{V —†\  }}t	          ¦   «         }|                     ddd¬¦  «        }t          j        dd|j        |j	        |j
        |j        |j        |j        dœ¦  «                             d	¦  «        }|                     t!          j        |¦  «        ¦  «         |                     ¦   «         ƒ d{V —† |                     d
¦  «        ƒ d{V —†}t)          j        d|¦  «        \  }t          j        |                     |¦  «        ƒ d{V —†                     d	¦  «        ¦  «        }t0                               |d         ¦  «        }	t5          |	¦  «        }
ddddddœddddddœddddddœddddddœddddddœg}t          j        dddd|dœ¦  «                             d	¦  «        }d}|
                     ||¦  «        \  }}}t)          j        d|¦  «        |z   |z   |z   }|                     t!          j        |¦  «        ¦  «         |                     ¦   «         ƒ d{V —† |                     d
¦  «        ƒ d{V —†}t)          j        d|¦  «        \  }|                     |¦  «        ƒ d{V —†}t)          j        d|dd…         ¦  «        d          }|dd!…         }|d!d"…         }|d"d…         }t          j        |
                     ||||¦  «                             d	¦  «        ¦  «        }|                      |                     d#¦  «        d$¦  «         |                     d%d&¦  «                              ¦   «         Š|  !                    tE          ˆfd'„d(D ¦   «         ¦  «        d)‰› �¦  «         | #                    ¦   «          | $                    ¦   «         ƒ d{V —† dS )*zPScripted bot moving with synthetic contact or perfect straight line is rejected.NÚiphone_bot_targetr   r   r   r   Úbot_accr!   r'   r(   r)   r-   g      $@r/   g      .@r0   r1   g      4@g     ��@g      >@g     à�@g      D@g     �@g      I@g     @�@r6   r7   r8   r9   r>   r?   r   r@   rA   r*   ÚrejectedÚreasonr|   c              3   ó    •K  — | ]}|‰v V — Œ	d S r   © )Ú.0ÚwÚreason_lowers     €r   ú	<genexpr>zVTestEndToEndGateway.test_end_to_end_rejects_bot_straight_line_touch.<locals>.<genexpr>×   s(   øè è € ÐbÐb a��\Ð!ÐbÐbÐbÐbÐbÐbr   )Ú	syntheticÚbotÚscriptÚemulatorÚdetectedz,Expected bot anomaly detection reason, got: )%rD   rE   r
   r   r   rF   rG   rH   r   r   r$   r%   r   r&   rI   rJ   r   rK   rL   rM   rN   rO   rP   rQ   rU   rV   r   rW   rX   rY   rR   rS   r}   Ú
assertTrueÚanyr[   r\   )r   r]   r^   r_   r`   ra   rb   rc   re   r-   rf   Úbot_touch_pointsrh   rg   ri   rj   rk   rl   rm   rn   ro   rp   rq   Údecrypted_resprˆ   s                           @r   Ú/test_end_to_end_rejects_bot_straight_line_touchzCTestEndToEndGateway.test_end_to_end_rejects_bot_straight_line_touch•   sL  øè è € å&Ô6°t´yÀ$Ä)ÑLÔLÐLÐLÐLÐLÐLÐL‰ˆ�õ ,Ñ-Ô-ˆ	Ø×3Ò3Ø)Ø.Øð 4ñ 
ô 
ˆõ
 !œJØØ#ØœØœØ$Ô4ØœØ”}Ø!Ô.ð	(
ð 	(
ñ 	ô 	÷ Š6�'‰?Œ?ð 	ð 	�Š•[Ô-Ð.?Ñ@Ô@ÑAÔAÐAØ�lŠl‰nŒnÐÐÐÐÐÐÐà×)Ò)¨!Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,ˆÝ”M $¨Ñ/Ô/‰	ˆÝŒz ×!3Ò!3°FÑ!;Ô!;Ð;Ð;Ð;Ð;Ð;Ð;×CÒCÀGÑLÔLÑMÔMˆÝ—]’] 4¨Ô#5Ñ6Ô6ˆ
Ý*¨:Ñ6Ô6ˆð ˜T°6È4ÐZ]Ð^Ð^Ø˜T°6È4ÐZ]Ð^Ð^Ø˜T°6È4ÐZ]Ð^Ð^Ø˜T°6È4ÐZ]Ð^Ð^Ø˜T°6È4ÐZ]Ð^Ð^ð
Ðõ ”:ØØØØØ,ð
ð 
ñ ô ÷ Š6�'‰?Œ?ð 	ð ˆØ!.×!6Ò!6°xÀÑ!IÔ!IÑˆ
�C˜Ý”k $¨Ñ0Ô0°5Ñ8¸3Ñ>ÀÑKˆØ�Š•[Ô-¨kÑ:Ô:Ñ;Ô;Ð;Ø�lŠl‰nŒnÐÐÐÐÐÐÐð ×)Ò)¨!Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,ˆÝ”M $¨Ñ/Ô/‰	ˆØ!'×!3Ò!3°FÑ!;Ô!;Ð;Ð;Ð;Ð;Ð;Ð;ÐÝ”= Ð'7¸¸¸Ô';Ñ<Ô<¸QÔ?ˆØ% a¨ dÔ+ˆ
Ø# B r EÔ*ˆØ*¨2¨3¨3Ô/ˆåœ M×$9Ò$9¸/È8ÐU_ÐaiÑ$jÔ$j×$qÒ$qÐryÑ$zÔ$zÑ{Ô{ˆØ×Ò˜×+Ò+¨HÑ5Ô5°zÑBÔBÐBØ%×)Ò)¨(°BÑ7Ô7×=Ò=Ñ?Ô?ˆØ�ŠÝÐbÐbÐbÐbÐ+aÐbÑbÔbÑbÔbØI¸<ÐIÐIñ	
ô 	
ð 	
ð
 	�Š‰ŒˆØ× Ò Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ð"r   N)Ú__name__Ú
__module__Ú__qualname__r   r   rs   r~   r“   r…   r   r   r   r      sh   € € € € € ð#ð #ð #ð"ð "ð "ðQ#ð Q#ð Q#ðf#ð #ð #ð:G#ð G#ð G#ð G#ð G#r   r   Ú__main__)Ú__doc__ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arÚunittestrD   ÚosÚsysrG   rN   ÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Ú%gateway.authoritative_gateway_servicer   Úgateway.network_gatewayr   Úsecurity.app_attestr   Úsecurity.packet_cipherr   ÚIsolatedAsyncioTestCaser   r”   Úmainr…   r   r   ú<module>r®      sG  ðð	ð 	ð € € € € € € € € € € € € €€€€Ø €€€Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø €€€à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \à MÐ MÐ MÐ MÐ MÐ MØ /Ð /Ð /Ð /Ð /Ð /Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5ðA#ð A#ð A#ð A#ð A#˜(Ô:ñ A#ô A#ð A#ðH ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   