SignatureContext.cpp [plain text]
#include "SignatureContext.h"
#include "AppleCSPUtils.h"
#include "AppleCSPSession.h"
#include <Security/cssmtype.h>
#include <security_utilities/debugging.h>
#define cspSigDebug(args...) secinfo("cspSig", ## args)
SignatureContext::~SignatureContext()
{
delete &mDigest;
delete &mSigner;
mInitFlag = false;
}
void SignatureContext::init(
const Context &context,
bool isSigning)
{
mDigest.digestInit();
mSigner.signerInit(context, isSigning);
mInitFlag = true;
}
void SignatureContext::update(
const CssmData &data)
{
mDigest.digestUpdate(data.Data, data.Length);
}
void SignatureContext::final(
CssmData &out)
{
void *digest;
size_t digestLen;
void *sig = out.data();
size_t sigLen = out.length();
digestLen = mDigest.digestSizeInBytes();
digest = session().malloc(digestLen);
mDigest.digestFinal(digest);
try {
mSigner.sign(digest,
digestLen,
sig,
&sigLen);
}
catch(...) {
session().free(digest);
throw;
}
session().free(digest);
if(out.length() < sigLen) {
cspSigDebug("SignatureContext: mallocd sig too small!");
CssmError::throwMe(CSSMERR_CSP_INTERNAL_ERROR);
}
out.length(sigLen);
}
void SignatureContext::final(
const CssmData &in)
{
void *digest;
size_t digestLen;
digestLen = mDigest.digestSizeInBytes();
digest = session().malloc(digestLen);
mDigest.digestFinal(digest);
try {
mSigner.verify(digest,
digestLen,
in.Data,
in.Length);
}
catch(...) {
session().free(digest);
throw;
}
session().free(digest);
}
size_t SignatureContext::outputSize(
bool final,
size_t inSize)
{
return mSigner.maxSigSize();
}
void SignatureContext::setDigestAlgorithm(
CSSM_ALGORITHMS digestAlg)
{
mSigner.setDigestAlg(digestAlg);
}