#ifdef __MWERKS__
#define _CPP_OSXSIGNER
#endif
#include <Security/osxsigner.h>
#include <Security/debugging.h>
namespace Security
{
namespace CodeSigning
{
OSXSigner::OSXSigner() : csp(gGuidAppleCSP)
{
}
OSXSigner::OSXSignature *OSXSigner::sign(const Signable &target)
{
Digester digester(*this);
scanContents(digester, target);
CssmClient::DataBuffer<OSXSignature::hashLength> hash;
digester(hash);
IFDUMPING("codesign", Debug::dumpData("sign", hash));
return new OSXSignature(hash);
}
bool OSXSigner::verify(const Signable &target, const Signature *signature)
{
if (const OSXSignature *sig = dynamic_cast<const OSXSignature *>(signature)) {
Digester digester(*this);
scanContents(digester, target);
CssmClient::DataBuffer<OSXSignature::hashLength> hash;
digester(hash);
IFDUMPING("codesign", Debug::dumpData("verify", hash));
return (*sig) == hash;
}
return false;
}
void OSXSigner::Digester::enumerateContents(const void *data, size_t length)
{
digest(CssmData(const_cast<void *>(data), length));
}
OSXSigner::OSXSignature *OSXSigner::restore(uint32 type, const void *data, size_t length)
{
switch (type) {
case CSSM_ACL_CODE_SIGNATURE_OSX:
if (length != OSXSignature::hashLength)
CssmError::throwMe(CSSM_ERRCODE_INVALID_DATA);
return new OSXSignature(data);
default:
CssmError::throwMe(CSSM_ERRCODE_UNKNOWN_FORMAT);
}
}
};
}