#include <Security/Certificates.h>
#include <Security/CertLibRef.h>//%%%should be included in Certificates.h
using namespace KeychainCore;
void CertificateImpl::CertificateImplCommonInit(CSSM_CERT_TYPE type)
{
mType = type;
mCLReference = NULL;
CertLibCursorImpl* cursor = NULL;
cursor = new CertLibCursorImpl(type);
if (!cursor)
MacOSError::throwMe(errSecItemNotFound);
CertLib certLib; if (!cursor->next(certLib))
{
delete cursor;
MacOSError::throwMe(errSecItemNotFound);
}
delete cursor;
mCLReference = CertLibRef::handle(certLib); }
CertificateImpl::CertificateImpl(const CSSM_DATA* data, CSSM_CERT_TYPE type):
mItem(NULL)
{
CertificateImplCommonInit(type);
(void*)mData.Data = malloc(data->Length);
memcpy(mData.Data, data->Data, data->Length);
mData.Length = data->Length;
}
CertificateImpl::CertificateImpl(SecKeychainItemRef item, CSSM_CERT_TYPE type)
{
CertificateImplCommonInit(type);
mItem = item;
SecRetain(item);
mData.Data = NULL;
mData.Length = 0;
}
CertificateImpl::~CertificateImpl()
{
if (mData.Data)
{
if (mItem)
SecKeychainItemFreeContent(NULL, mData.Data); else
free(mData.Data); }
if (mItem)
SecRelease(mItem);
if (mCLReference)
SecRelease(mCLReference);
}
CSSM_DATA* CertificateImpl::getData()
{
if (mItem)
{
if (mData.Data)
SecKeychainItemFreeContent(NULL, mData.Data);
OSStatus result = SecKeychainItemCopyContent(mItem, NULL, NULL, &mData.Length, (void**)&(mData.Data));
if (result)
MacOSError::throwMe(result);
} return &mData;
}
CSSM_X509_NAME* CertificateImpl::getSubject()
{
return NULL;}
CSSM_X509_NAME* CertificateImpl::getIssuer()
{
return NULL;}