#ifndef _H_OSXSIGNER
#define _H_OSXSIGNER
#include <security_utilities/osxcode.h>
#include <security_cdsa_client/cspclient.h>
#include <string>
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(u_int32_t 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); }
u_int32_t 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;
};
} }
#endif //_H_OSXSIGNER