#include "reqreader.h"
#include <Security/SecTrustSettingsPriv.h>
#include <security_utilities/memutils.h>
#include <security_cdsa_utilities/cssmdata.h> // for hex encoding
#include "csutilities.h"
namespace Security {
namespace CodeSigning {
Requirement::Reader::Reader(const Requirement *req)
: mReq(req), mPC(sizeof(Requirement))
{
assert(req);
if (req->kind() != exprForm)
MacOSError::throwMe(errSecCSReqUnsupported);
}
void Requirement::Reader::getData(const void *&data, size_t &length)
{
length = get<uint32_t>();
checkSize(length);
data = (mReq->at<void>(mPC));
mPC += LowLevelMemoryUtilities::alignUp(length, baseAlignment);
}
string Requirement::Reader::getString()
{
const char *s; size_t length;
getData(s, length);
return string(s, length);
}
const unsigned char *Requirement::Reader::getHash()
{
const unsigned char *s; size_t length;
getData(s, length);
if (length != SHA1::digestLength)
MacOSError::throwMe(errSecCSReqInvalid);
return s;
}
const unsigned char *Requirement::Reader::getSHA1()
{
const unsigned char *digest; size_t length;
getData(digest, length);
if (length != CC_SHA1_DIGEST_LENGTH)
MacOSError::throwMe(errSecCSReqInvalid);
return digest;
}
void Requirement::Reader::skip(size_t length)
{
checkSize(length);
mPC += length;
}
} }