#ifdef STANDALONE
#undef __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__
#undef __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
#endif
#include "SecFramework.h"
#include <dispatch/dispatch.h>
#include <CommonCrypto/CommonDigest.h>
#include <CommonCrypto/CommonDigestSPI.h>
#include <Security/SecAsn1Coder.h>
#include <Security/oidsalg.h>
#include <utilities/SecCFWrappers.h>
#include <Security/SecBase.h>
#include <inttypes.h>
CFDataRef SecSHA1DigestCreate(CFAllocatorRef allocator,
const UInt8 *data, CFIndex length) {
if (length < 0 || length > INT32_MAX || data == NULL) {
return NULL;
}
CFMutableDataRef digest = CFDataCreateMutable(allocator,
CC_SHA1_DIGEST_LENGTH);
CFDataSetLength(digest, CC_SHA1_DIGEST_LENGTH);
CCDigest(kCCDigestSHA1, data, length, CFDataGetMutableBytePtr(digest));
return digest;
}
CFDataRef SecSHA256DigestCreate(CFAllocatorRef allocator,
const UInt8 *data, CFIndex length) {
if (length < 0 || length > INT32_MAX || data == NULL) {
return NULL;
}
CFMutableDataRef digest = CFDataCreateMutable(allocator,
CC_SHA256_DIGEST_LENGTH);
CFDataSetLength(digest, CC_SHA256_DIGEST_LENGTH);
CCDigest(kCCDigestSHA256, data, length, CFDataGetMutableBytePtr(digest));
return digest;
}
CFDataRef SecSHA256DigestCreateFromData(CFAllocatorRef allocator, CFDataRef data) {
CFMutableDataRef digest = CFDataCreateMutable(allocator,
CC_SHA256_DIGEST_LENGTH);
CFDataSetLength(digest, CC_SHA256_DIGEST_LENGTH);
CCDigest(kCCDigestSHA256, CFDataGetBytePtr(data), CFDataGetLength(data), CFDataGetMutableBytePtr(digest));
return digest;
}
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 (length < 0 || length > INT32_MAX || data == NULL)
return NULL;
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, (CC_LONG)length, CFDataGetMutableBytePtr(digest));
return digest;
}