@@ -740,6 +740,11 @@ static bool test_arm64_pauth_cp_reg_update(uc_engine *uc, const uint32_t cpregid
740740 return (((reg .val & setmask ) == setmask ) && ((reg .val & clearmask ) == 0 ));
741741}
742742
743+ #define DEBUG_CHECKPOINT (msg ) { \
744+ printf("--- " msg "\n"); \
745+ fflush(stdout); \
746+ }
747+
743748static void test_arm64_pauth (void )
744749{
745750 uc_engine * uc ;
@@ -754,6 +759,9 @@ static void test_arm64_pauth(void)
754759 OK (uc_open (UC_ARCH_ARM64 , UC_MODE_ARM , & uc ));
755760 OK (uc_ctl_set_cpu_model (uc , UC_CPU_ARM64_MAX ));
756761
762+ printf ("\n" );
763+ DEBUG_CHECKPOINT ("uc created" );
764+
757765 // Check the CPU actually supports any form of PAuth, i.e. any APA or API
758766 // bits are set. At the time of writing, UC_CPU_ARM64_A72 does not support
759767 // PAuth, but UC_CPU_ARM64_MAX does. This is not required for the test,
@@ -792,6 +800,8 @@ static void test_arm64_pauth(void)
792800 test_arm64_pauth_cp_reg_write (uc , APDAKeyLo_EL1 , 0xAAAAAAAAAAAAAAAAULL ); // == IA
793801 test_arm64_pauth_cp_reg_write (uc , APDAKeyHi_EL1 , 0xBBBBBBBBBBBBBBBBULL );
794802
803+ DEBUG_CHECKPOINT ("setup complete" );
804+
795805 // Verify that paciza and uc_ctl_pauth_sign() result in the same signed
796806 // pointer.
797807
@@ -804,34 +814,56 @@ static void test_arm64_pauth(void)
804814 TEST_CHECK (x1 != some_unsigned_pointer );
805815 TEST_CHECK ((x1 & pac_mask ) != 0 );
806816
817+ DEBUG_CHECKPOINT ("paciza done" );
818+
807819 uint64_t ptr = some_unsigned_pointer ;
808820 OK (uc_ctl_pauth_sign (uc , ptr , UC_ARM64_PAUTH_KEY_IA , 0 , & ptr ));
809821 TEST_CHECK (ptr == x1 );
810822
823+ DEBUG_CHECKPOINT ("uc_ctl_pauth_sign() returned" );
824+
811825 // Verify that stripping the PAC results in the original pointer.
812826
813827 OK (uc_ctl_pauth_strip (uc , ptr , UC_ARM64_PAUTH_KEY_IA , & ptr ));
814828 TEST_CHECK (ptr == some_unsigned_pointer );
815829
830+ DEBUG_CHECKPOINT ("uc_ctl_pauth_strip() returned" );
831+
816832 // Verify that authenticating works as expected.
817833
818834 bool valid = true;
819835 OK (uc_ctl_pauth_auth (uc , ptr , UC_ARM64_PAUTH_KEY_IA , 0 , & valid ));
820836 TEST_CHECK (!valid ); // unsigned pointer
837+
838+ DEBUG_CHECKPOINT ("uc_ctl_pauth_auth() returned once" );
839+
821840 valid = false;
822841 OK (uc_ctl_pauth_auth (uc , x1 , UC_ARM64_PAUTH_KEY_IA , 0 , & valid ));
823842 TEST_CHECK (valid ); // signed pointer
843+
844+ DEBUG_CHECKPOINT ("uc_ctl_pauth_auth() returned twice" );
845+
824846 valid = true;
825847 OK (uc_ctl_pauth_auth (uc , x1 , UC_ARM64_PAUTH_KEY_IA , 1337 , & valid ));
826848 TEST_CHECK (!valid ); // wrong diversifier
849+
850+ DEBUG_CHECKPOINT ("uc_ctl_pauth_auth() returned thrice" );
851+
827852 valid = true;
828853 OK (uc_ctl_pauth_auth (uc , x1 , UC_ARM64_PAUTH_KEY_IB , 0 , & valid ));
829854 TEST_CHECK (!valid ); // wrong but enabled key
855+
856+ DEBUG_CHECKPOINT ("uc_ctl_pauth_auth() returned four times" );
857+
830858 valid = true;
831859 OK (uc_ctl_pauth_auth (uc , x1 , UC_ARM64_PAUTH_KEY_DA , 0 , & valid ));
832860 TEST_CHECK (!valid ); // disabled but same value key
833861
862+ DEBUG_CHECKPOINT ("uc_ctl_pauth_auth() returned five times" );
863+
834864 OK (uc_close (uc ));
865+
866+ DEBUG_CHECKPOINT ("uc closed" );
835867}
836868
837869TEST_LIST = {{"test_arm64_until" , test_arm64_until },
0 commit comments