README.md
Rendering markdown...
@import Darwin;
@import Foundation;
#include "CTEvaluate.h"
extern CFStringRef kSecCodeInfoCodeDirectory;
int main(int argc, char** argv) {
// https://github.com/qyang-nj/llios/blob/main/macho_parser/docs/LC_CODE_SIGNATURE.md
// https://developer.apple.com/documentation/security/1395809-seccodecopysigninginformation?language=objc
// https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/apps/app_shim/app_shim_manager_mac.cc;l=110;drc=d54e5200563bb88d95c70f1d3208d1ccb2137a40
NSURL* target_url =
[NSURL fileURLWithPath:argc >= 2 ? [NSString stringWithUTF8String:argv[1]] : @"littlemis"];
// NSURL* target_url = [NSURL
// fileURLWithPath:@"/Applications/Firefox.app/Contents/MacOS/firefox"];
SecStaticCodeRef sec_code = nil;
OSStatus status =
SecStaticCodeCreateWithPath((__bridge CFURLRef)target_url, kSecCSDefaultFlags, &sec_code);
if (status != errSecSuccess) {
abort();
}
NSDictionary* out_dict = nil;
status = SecCodeCopySigningInformation(
sec_code, kSecCSDefaultFlags | kSecCSSigningInformation | kSecCSInternalInformation,
(__bridge CFDictionaryRef*)&out_dict);
if (status != errSecSuccess) {
abort();
}
// NSLog(@"%@", out_dict);
NSData* cms_data = out_dict[(__bridge NSString*)kSecCodeInfoCMS];
// https://blog.umangis.me/a-deep-dive-into-ios-code-signing/
NSData* code_directory_data = out_dict[(__bridge NSString*)kSecCodeInfoCodeDirectory];
// TODO(zhuowei): lol
// [cms_data writeToFile:@"cmsblob.der" atomically:false];
// [code_directory_data writeToFile:@"cdblob.der" atomically:false];
const uint8_t* leaf_certificate = nil;
size_t leaf_certificate_length = 0;
CoreTrustPolicyFlags policy_flags = 0;
CoreTrustDigestType cms_digest_type = 0;
CoreTrustDigestType hash_agility_digest_type = 0;
const uint8_t* digest_data = nil;
size_t digest_length = 0;
CT_int result = CTEvaluateAMFICodeSignatureCMS(
cms_data.bytes, cms_data.length, code_directory_data.bytes, code_directory_data.length,
/*allow_test_hierarchy=*/true, &leaf_certificate, &leaf_certificate_length, &policy_flags,
&cms_digest_type, &hash_agility_digest_type, &digest_data, &digest_length);
NSLog(@"result = %d leaf_certificate = %p leaf_certificate_length = %lx policy_flags = %llx "
@"cms_digest_type = %x hash_agility_digest_type = %x digest_data = %p digest_length = %lx",
result, leaf_certificate, leaf_certificate_length, policy_flags, cms_digest_type,
hash_agility_digest_type, digest_data, digest_length);
}