#include "SecFrameworkP.h"
#include <pthread.h>
#include <CoreFoundation/CFBundle.h>
#include <CoreFoundation/CFURLAccess.h>
#if 0
#include "SecRandomP.h"
#endif
#include <CommonCrypto/CommonDigest.h>
#include <Security/SecAsn1Coder.h>
#include <Security/oidsalg.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <dlfcn.h>
#include <string.h>
#include <CoreFoundation/CFBundlePriv.h>
#include <utilities/debugging.h>
static CFBundleRef kSecFrameworkBundle;
static pthread_once_t kSecFrameworkBundleLookup = PTHREAD_ONCE_INIT;
static void SecFrameworkBundleLookup(void) {
Dl_info info;
dladdr("", &info);
CFURLRef urlRef = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8*) info.dli_fname, strlen(info.dli_fname), false);
kSecFrameworkBundle = _CFBundleCreateWithExecutableURLIfLooksLikeBundle(NULL, urlRef);
CFRelease(urlRef);
if (kSecFrameworkBundle)
CFRetain(kSecFrameworkBundle);
}
CFStringRef SecFrameworkCopyLocalizedString(CFStringRef key,
CFStringRef tableName) {
pthread_once(&kSecFrameworkBundleLookup, SecFrameworkBundleLookup);
if (kSecFrameworkBundle) {
return CFBundleCopyLocalizedString(kSecFrameworkBundle, key, key,
tableName);
}
CFRetain(key);
return key;
}
CFURLRef SecFrameworkCopyResourceURL(CFStringRef resourceName,
CFStringRef resourceType, CFStringRef subDirName) {
CFURLRef url = NULL;
pthread_once(&kSecFrameworkBundleLookup, SecFrameworkBundleLookup);
if (kSecFrameworkBundle) {
url = CFBundleCopyResourceURL(kSecFrameworkBundle, resourceName,
resourceType, subDirName);
if (!url) {
secinfo("SecFramework", "resource: %@.%@ in %@ not found", resourceName,
resourceType, subDirName);
}
}
return url;
}
CFDataRef SecFrameworkCopyResourceContents(CFStringRef resourceName,
CFStringRef resourceType, CFStringRef subDirName) {
CFURLRef url = SecFrameworkCopyResourceURL(resourceName, resourceType,
subDirName);
CFDataRef data = NULL;
if (url) {
SInt32 error;
if (!CFURLCreateDataAndPropertiesFromResource(kCFAllocatorDefault,
url, &data, NULL, NULL, &error)) {
secinfo("SecFramework", "read: %d", (int)error);
}
CFRelease(url);
}
return data;
}
CFDataRef SecSHA1DigestCreate(CFAllocatorRef allocator,
const UInt8 *data, CFIndex length) {
CFMutableDataRef digest = CFDataCreateMutable(allocator,
CC_SHA1_DIGEST_LENGTH);
CFDataSetLength(digest, CC_SHA1_DIGEST_LENGTH);
CC_SHA1(data, (CC_LONG)length, CFDataGetMutableBytePtr(digest));
return digest;
}
#if 0
CFDataRef SecDigestCreate(CFAllocatorRef allocator,
const SecAsn1Oid *algorithm, const SecAsn1Item *params,
const UInt8 *data, CFIndex length) {
unsigned char *(*digestFcn)(const void *data, CC_LONG len, unsigned char *md);
CFIndex digestLen;
if (SecAsn1OidCompare(algorithm, &CSSMOID_SHA1)) {
digestFcn = CC_SHA1;
digestLen = CC_SHA1_DIGEST_LENGTH;
} else if (SecAsn1OidCompare(algorithm, &CSSMOID_SHA224)) {
digestFcn = CC_SHA224;
digestLen = CC_SHA224_DIGEST_LENGTH;
} else if (SecAsn1OidCompare(algorithm, &CSSMOID_SHA256)) {
digestFcn = CC_SHA256;
digestLen = CC_SHA256_DIGEST_LENGTH;
} else if (SecAsn1OidCompare(algorithm, &CSSMOID_SHA384)) {
digestFcn = CC_SHA384;
digestLen = CC_SHA384_DIGEST_LENGTH;
} else if (SecAsn1OidCompare(algorithm, &CSSMOID_SHA512)) {
digestFcn = CC_SHA512;
digestLen = CC_SHA512_DIGEST_LENGTH;
} else {
return NULL;
}
CFMutableDataRef digest = CFDataCreateMutable(allocator, digestLen);
CFDataSetLength(digest, digestLen);
digestFcn(data, length, CFDataGetMutableBytePtr(digest));
return digest;
}
#endif