#include "sigblob.h"
#include "CSCommon.h"
namespace Security {
namespace CodeSigning {
CFDataRef EmbeddedSignatureBlob::component(CodeDirectory::SpecialSlot slot) const
{
const BlobCore *blob = this->find(slot);
if (blob) {
return blobData(slot, blob);
}
return NULL;
}
CFDataRef EmbeddedSignatureBlob::blobData(CodeDirectory::SpecialSlot slot, BlobCore const *blob)
{
if (CodeDirectory::slotAttributes(slot) & cdComponentIsBlob) {
return makeCFData(*blob); } else if (const BlobWrapper *wrap = BlobWrapper::specific(blob)) {
return makeCFData(*wrap);
} else {
MacOSError::throwMe(errSecCSSignatureInvalid);
}
}
void EmbeddedSignatureBlob::Maker::component(CodeDirectory::SpecialSlot slot, CFDataRef data)
{
if (CodeDirectory::slotAttributes(slot) & cdComponentIsBlob)
add(slot, reinterpret_cast<const BlobCore *>(CFDataGetBytePtr(data))->clone());
else
add(slot, BlobWrapper::alloc(CFDataGetBytePtr(data), CFDataGetLength(data)));
}
CFDictionaryRef EntitlementBlob::entitlements() const
{
return makeCFDictionaryFrom(this->at<const UInt8 *>(sizeof(EntitlementBlob)),
this->length() - sizeof(EntitlementBlob));
}
EntitlementDERBlob *EntitlementDERBlob::alloc(size_t length) {
size_t blobLength = length + sizeof(BlobCore);
if (blobLength < length) {
return NULL;
}
EntitlementDERBlob *b = (EntitlementDERBlob *)malloc(blobLength);
if (b != NULL) {
b->BlobCore::initialize(kSecCodeMagicEntitlementDER, blobLength);
}
return b;
}
} }