#include "il2cpp-config.h" #if IL2CPP_TARGET_OSX #include "os/SystemCertificates.h" #include #include #include namespace il2cpp { namespace os { void* SystemCertificates::OpenSystemRootStore() { CFArrayRef anchors = NULL; OSStatus s; s = SecTrustCopyAnchorCertificates(&anchors); IL2CPP_ASSERT(s == noErr); return (void*)anchors; } int SystemCertificates::EnumSystemCertificates(void* certStore, void** iter, int *format, int* size, void** data) { OSStatus s; CFDataRef certData; int numCerts = (int)CFArrayGetCount((CFArrayRef)certStore); *format = DATATYPE_STRING; // Order matters when it comes to certificates need to read in reverse int currentCert = numCerts; if (*iter != NULL) { currentCert = static_cast(reinterpret_cast(*iter)); } SecCertificateRef cert = (SecCertificateRef)CFArrayGetValueAtIndex((CFArrayRef)certStore, (currentCert - 1)); s = SecItemExport(cert, kSecFormatPEMSequence, kSecItemPemArmour, NULL, &certData); if (s == errSecSuccess) { char* certPEMStr = (char*)CFDataGetBytePtr(certData); *iter = reinterpret_cast(static_cast((currentCert - 1))); *data = certPEMStr; *size = sizeof(certPEMStr); if ((currentCert - 1) > 0) { return TRUE; } } return FALSE; } void SystemCertificates::CloseSystemRootStore(void* cStore) { CFRelease((CFArrayRef)cStore); } } } #endif