#include "ssblob.h"
namespace Security {
namespace SecurityServer {
uint32 CommonBlob::getCurrentVersion() {
uint32 ret = version_MacOS_10_0;
CFTypeRef integrity = (CFNumberRef)CFPreferencesCopyValue(CFSTR("KeychainIntegrity"), CFSTR("com.apple.security"), kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
if (integrity && CFGetTypeID(integrity) == CFBooleanGetTypeID()) {
bool integrityProtections = CFBooleanGetValue((CFBooleanRef)integrity);
if(integrityProtections) {
secdebugfunc("integrity", "creating a partition keychain; global is on");
ret = version_partition;
} else {
secdebugfunc("integrity", "creating a old-style keychain; global is off");
ret = version_MacOS_10_0;
}
CFRelease(integrity);
}
return ret;
}
void CommonBlob::initialize()
{
magic = magicNumber;
this->blobVersion = getCurrentVersion();
}
void CommonBlob::initialize(uint32 version)
{
magic = magicNumber;
secdebugfunc("integrity", "creating a partition keychain with version %d", version);
this->blobVersion = version;
}
bool CommonBlob::isValid() const
{
return magic == magicNumber;
}
void CommonBlob::validate(CSSM_RETURN failureCode) const
{
if (!isValid())
CssmError::throwMe(failureCode);
}
static const char clearPubKeySig[] = "Cleartext public key";
bool KeyBlob::isClearText()
{
return (memcmp(blobSignature, clearPubKeySig,
sizeof(blobSignature)) == 0);
}
void KeyBlob::setClearTextSignature()
{
memmove(blobSignature, clearPubKeySig, sizeof(blobSignature));
}
}
}