@@ -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,57 @@ 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 ;
820+ printf ("test_arm64_pauth: &ptr=%p\n" , & ptr ); fflush (stdout );
808821 OK (uc_ctl_pauth_sign (uc , ptr , UC_ARM64_PAUTH_KEY_IA , 0 , & ptr ));
809822 TEST_CHECK (ptr == x1 );
810823
824+ DEBUG_CHECKPOINT ("uc_ctl_pauth_sign() returned" );
825+
811826 // Verify that stripping the PAC results in the original pointer.
812827
813828 OK (uc_ctl_pauth_strip (uc , ptr , UC_ARM64_PAUTH_KEY_IA , & ptr ));
814829 TEST_CHECK (ptr == some_unsigned_pointer );
815830
831+ DEBUG_CHECKPOINT ("uc_ctl_pauth_strip() returned" );
832+
816833 // Verify that authenticating works as expected.
817834
818835 bool valid = true;
819836 OK (uc_ctl_pauth_auth (uc , ptr , UC_ARM64_PAUTH_KEY_IA , 0 , & valid ));
820837 TEST_CHECK (!valid ); // unsigned pointer
838+
839+ DEBUG_CHECKPOINT ("uc_ctl_pauth_auth() returned once" );
840+
821841 valid = false;
822842 OK (uc_ctl_pauth_auth (uc , x1 , UC_ARM64_PAUTH_KEY_IA , 0 , & valid ));
823843 TEST_CHECK (valid ); // signed pointer
844+
845+ DEBUG_CHECKPOINT ("uc_ctl_pauth_auth() returned twice" );
846+
824847 valid = true;
825848 OK (uc_ctl_pauth_auth (uc , x1 , UC_ARM64_PAUTH_KEY_IA , 1337 , & valid ));
826849 TEST_CHECK (!valid ); // wrong diversifier
850+
851+ DEBUG_CHECKPOINT ("uc_ctl_pauth_auth() returned thrice" );
852+
827853 valid = true;
828854 OK (uc_ctl_pauth_auth (uc , x1 , UC_ARM64_PAUTH_KEY_IB , 0 , & valid ));
829855 TEST_CHECK (!valid ); // wrong but enabled key
856+
857+ DEBUG_CHECKPOINT ("uc_ctl_pauth_auth() returned four times" );
858+
830859 valid = true;
831860 OK (uc_ctl_pauth_auth (uc , x1 , UC_ARM64_PAUTH_KEY_DA , 0 , & valid ));
832861 TEST_CHECK (!valid ); // disabled but same value key
833862
863+ DEBUG_CHECKPOINT ("uc_ctl_pauth_auth() returned five times" );
864+
834865 OK (uc_close (uc ));
866+
867+ DEBUG_CHECKPOINT ("uc closed" );
835868}
836869
837870TEST_LIST = {{"test_arm64_until" , test_arm64_until },
0 commit comments