#include "DecodedCrl.h"
#include "cldebugging.h"
#include "AppleX509CLSession.h"
#include "CSPAttacher.h"
#include <Security/cssmapple.h>
DecodedCrl::DecodedCrl(
AppleX509CLSession &session)
: DecodedItem(session)
{
memset(&mCrl, 0, sizeof(mCrl));
}
DecodedCrl::DecodedCrl(
AppleX509CLSession &session,
const CssmData &encodedCrl)
: DecodedItem(session)
{
memset(&mCrl, 0, sizeof(mCrl));
PRErrorCode prtn = mCoder.decode(encodedCrl.data(), encodedCrl.length(),
kSecAsn1SignedCrlTemplate, &mCrl);
if(prtn) {
CssmError::throwMe(CSSMERR_CL_UNKNOWN_FORMAT);
}
mDecodedExtensions.decodeFromNss(mCrl.tbs.extensions);
mState = IS_DecodedAll;
}
DecodedCrl::~DecodedCrl()
{
}
void DecodedCrl::decodeCts(
const CssmData &encodedCts)
{
assert(mState == IS_Empty);
memset(&mCrl, 0, sizeof(mCrl));
PRErrorCode prtn = mCoder.decode(encodedCts.data(), encodedCts.length(),
kSecAsn1TBSCrlTemplate, &mCrl.tbs);
if(prtn) {
CssmError::throwMe(CSSMERR_CL_UNKNOWN_FORMAT);
}
mDecodedExtensions.decodeFromNss(mCrl.tbs.extensions);
mState = IS_DecodedTBS;
}
void DecodedCrl::encodeExtensions()
{
NSS_TBSCrl &tbs = mCrl.tbs;
assert(mState == IS_Building);
assert(tbs.extensions == NULL);
if(mDecodedExtensions.numExtensions() == 0) {
return;
}
mDecodedExtensions.encodeToNss(tbs.extensions);
}
#define MAX_TEMPLATE_SIZE (16 * 1024)
void DecodedCrl::encodeCts(
CssmOwnedData &encodedCts)
{
encodeExtensions();
assert(mState == IS_Building);
NSS_TBSCrl &tbs = mCrl.tbs;
if((tbs.signature.algorithm.Data == NULL) ||
(tbs.issuer.rdns == NULL)) {
clErrorLog("DecodedCrl::encodeTbs: incomplete TBS");
CssmError::throwMe(CSSMERR_CL_NO_FIELD_VALUES);
}
PRErrorCode prtn;
prtn = SecNssEncodeItemOdata(&tbs, kSecAsn1TBSCrlTemplate,
encodedCts);
if(prtn) {
CssmError::throwMe(CSSMERR_CL_MEMORY_ERROR);
}
}