X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/866f8763175ff60e4fa455b92b5eb660a12fe6c7..07691282a056c4efea71e1e505527601e8cc166b:/OSX/libsecurity_smime/lib/SecCMS.c diff --git a/OSX/libsecurity_smime/lib/SecCMS.c b/OSX/libsecurity_smime/lib/SecCMS.c index 11026ca4..53e74aac 100644 --- a/OSX/libsecurity_smime/lib/SecCMS.c +++ b/OSX/libsecurity_smime/lib/SecCMS.c @@ -55,6 +55,8 @@ CFTypeRef kSecCMSSignedAttributes = CFSTR("kSecCMSSignedAttributes"); CFTypeRef kSecCMSSignDate = CFSTR("kSecCMSSignDate"); CFTypeRef kSecCMSAllCerts = CFSTR("kSecCMSAllCerts"); CFTypeRef kSecCMSHashAgility = CFSTR("kSecCMSHashAgility"); +CFTypeRef kSecCMSHashAgilityV2 = CFSTR("kSecCMSHashAgilityV2"); +CFTypeRef kSecCMSExpirationDate = CFSTR("kSecCMSExpirationDate"); CFTypeRef kSecCMSBulkEncryptionAlgorithm = CFSTR("kSecCMSBulkEncryptionAlgorithm"); CFTypeRef kSecCMSEncryptionAlgorithmDESCBC = CFSTR("kSecCMSEncryptionAlgorithmDESCBC"); @@ -394,6 +396,22 @@ static OSStatus SecCMSVerifySignedData_internal(CFDataRef message, CFDataRef det CFDictionarySetValue(attrs, kSecCMSHashAgility, hash_agility_value); } } + + CFDictionaryRef hash_agility_values = NULL; + if (errSecSuccess == SecCmsSignerInfoGetAppleCodesigningHashAgilityV2(sigd->signerInfos[0], &hash_agility_values)) { + if (hash_agility_values) { + CFDictionarySetValue(attrs, kSecCMSHashAgilityV2, hash_agility_values); + } + } + + CFAbsoluteTime expiration_time; + if (errSecSuccess == SecCmsSignerInfoGetAppleExpirationTime(sigd->signerInfos[0], &expiration_time)) { + CFDateRef expiration_date = CFDateCreate(NULL, expiration_time); + if (expiration_date) { + CFDictionarySetValue(attrs, kSecCMSExpirationDate, expiration_date); + CFRetainSafe(expiration_date); + } + } *signed_attributes = attrs; if (certs) CFRelease(certs); @@ -441,6 +459,10 @@ CFArrayRef SecCMSCertificatesOnlyMessageCopyCertificates(CFDataRef message) { SecCmsSignedDataRef sigd = NULL; CFMutableArrayRef certs = NULL; + if (!message) { + return NULL; + } + CSSM_DATA encoded_message = { CFDataGetLength(message), (uint8_t*)CFDataGetBytePtr(message) }; require_noerr_quiet(SecCmsMessageDecode(&encoded_message, NULL, NULL, NULL, NULL, NULL, NULL, &cmsg), out); /* expected to be a signed data message at the top level */ @@ -465,8 +487,10 @@ CFArrayRef SecCMSCertificatesOnlyMessageCopyCertificates(CFDataRef message) { } out: - if (cmsg) - SecCmsMessageDestroy(cmsg); + if (cmsg) { SecCmsMessageDestroy(cmsg); } + if (certs && CFArrayGetCount(certs) < 1) { + CFReleaseNull(certs); + } return certs; }