#ifndef _H_OSXSIGNER
#define _H_OSXSIGNER
#include <Security/osxsigning.h>
#include <Security/cspclient.h>
#include <string>
#ifdef _CPP_OSXSIGNER
#pragma export on
#endif
namespace Security
{
namespace CodeSigning
{
class OSXSigner : public Signer {
class Digester; friend class Digester;
public:
class OSXSignature;
OSXSigner();
OSXSignature *sign(const Signable &target);
bool verify(const Signable &target, const Signature *signature);
OSXSignature *restore(uint32 type, const void *data, size_t length);
public:
class OSXSignature : public Signature {
public:
static const size_t hashLength = 20; typedef uint8 Hash[hashLength];
OSXSignature(const void *src) { memcpy(mData, src, hashLength); }
bool operator == (const Signature &other) const
{
if (const OSXSignature *sig = dynamic_cast<const OSXSignature *>(&other))
return !memcmp(mData, sig->mData, hashLength);
else
return false;
}
bool operator == (void *bytes) const
{ return !memcmp(mData, bytes, hashLength); }
uint32 type() const { return standardOSXSignature; }
const void *data() const { return mData; }
size_t length() const { return hashLength; }
private:
uint8 mData[hashLength];
};
private:
class Digester : public State, public CssmClient::Digest {
public:
Digester(OSXSigner &sgn) : State(sgn), CssmClient::Digest(sgn.csp, CSSM_ALGID_SHA1) { }
void enumerateContents(const void *addr, size_t length);
};
private:
CssmClient::CSP csp;
};
}
}
#ifdef _CPP_OSXSIGNER
#pragma export off
#endif
#endif //_H_OSXSIGNER