struct ThePath { struct Certificate* certificate; // 0 struct X509Policy* policy; // 0x18 } struct Certificate { CTAsn1Item certificate_data; // 0x10 // 0x20 CTAsn1Item certificate_signature_algorithm; // 0x28 - OID CTAsn1Item certificate_signature; // 0x38 // 0x48 CTAsn1Item subject; // 0x68 CTAsn1Item issuer; // 0x78 // 0x88 CTAsn1Item other_signature_algorithm;// 0x98 - some other signature algorithm? CTAsn1Item authorityKeyIdentifier; // 0xa8 CTAsn1Item subjectKeyIdentifier; // 0xb8; used when_bvar1_is_false // 0xc8 uint64_t policy_flags; // 0xf0 - see X509PolicySetFlagsForRoots struct Certificate* next; // 0x120 }; struct X509Policy { long expected_number_of_certs; // 0x0 long somethingelse; // what? 0x8 bool check_apple_root_cas_in_addition_to_mfi; // 0x10 - forced to true in CTEvaluateAMFICodeSignatureCMS_MaxDigestType bool allow_test_hierarchy; // 0x11 bool validate_that_our_hardcoded_root_is_still_valid; // 0x12 CTAsn1Item* root_public_key; // 0x18 CTAsn1Item* root_ec_public_key; // 0x20 CTAsn1Item* root_signature_oid; // 0x28 CTAsn1Item* something_usually_null_octet; // 0x30 } uint64_t X509ChainCheckPathWithOptions(uint32_t arg1, ThePath* the_path, X509Policy* policy, int options); uint64_t X509CertificateCheckSignature(uint32_t arg1, struct Certificate* next_cert, CTAsn1Item* certificate, CTAsn1Item* certificate_signature_algorithm, CTAsn1Item* certificate_signature) uint64_t X509CertificateCheckSignatureWithPublicKey(root_public_key, root_ec_public_key, root_signature_oid, ); error: 0x90006: not enough certs 0x90008: cert is not signed with another cert 0x9000b: root cert isn't apple at all actually 0x9000c: root isn't a real apple root cert - this is new bvar1 = has apple root? 2022-05-21 19:07:40.949 ct_little[52285:1444517] result = 0 leaf_certificate = 0x7f92ac80912f leaf_certificate_length = 5b6 policy_flags = 20 cms_digest_type = 4 hash_agility_digest_type = 4 digest_data = 0x7f92ac809812 digest_length = 20 2022-05-21 19:45:54.412 ct_little[54721:1461797] result = 0 leaf_certificate = 0x7fc0ec80d268 leaf_certificate_length = 32a policy_flags = 0 cms_digest_type = 4 hash_agility_digest_type = 4 digest_data = 0x7fc0ec80d66f digest_length = 20 So it does: X509CertificateCheckSignature(29, apple_dev_cert, &mozilla_cert->certificate_data, &mozilla_cert->certificate_signature_algorithm, &mozilla_cert->certificate_signature) X509CertificateCheckSignature(29, apple_root_cert, &apple_dev_cert->certificate_data, &apple_dev_cert->certificate_signature_algorithm, &apple_dev_cert->certificate_signature) X509CertificateCheckSignature(29, apple_root_cert, &apple_root_cert->certificate_data, &apple_root_cert->certificate_signature_algorithm, &apple_root_cert->certificate_signature) X509CertificateCheckSignature(29, NULL, &apple_root_cert->certificate_data, &apple_root_cert->certificate_signature_algorithm, &apple_root_cert->certificate_signature)