#include <Security/cssmdata.h>
#include <Security/utilities.h>
#include <cstring>
namespace Security {
bool operator == (const CSSM_DATA &d1, const CSSM_DATA &d2)
{
if (&d1 == &d2)
return true; if (d1.Length != d2.Length)
return false; if (d1.Data == d2.Data)
return true; return !memcmp(d1.Data, d2.Data, d1.Length);
}
CssmManagedData::~CssmManagedData()
{ }
void CssmOwnedData::set(CssmManagedData &source)
{
if (source.length() == 0) { reset(); } else if (allocator == source.allocator) { if (referent.data() == source.data()) { assert(this == &source); } else { reset(); referent = source.release(); }
} else { copy(source); source.reset(); }
}
CssmData CssmAutoData::release()
{
CssmData result = mData;
mData.clear();
return result;
}
void CssmAutoData::reset()
{
allocator.free(mData);
mData.clear();
}
CssmData CssmRemoteData::release()
{
iOwnTheData = false;
return referent;
}
void CssmRemoteData::reset()
{
if (iOwnTheData)
allocator.free(referent);
referent.clear();
}
CssmDateData::CssmDateData(const CSSM_DATE &date)
: CssmData(buffer, sizeof(buffer))
{
memcpy(buffer, date.Year, 4);
memcpy(buffer + 4, date.Month, 2);
memcpy(buffer + 6, date.Day, 2);
}
CssmGuidData::CssmGuidData(const CSSM_GUID &guid) : CssmData(buffer, sizeof(buffer))
{
Guid::overlay(guid).toString(buffer);
}
CssmDLPolyData::operator CSSM_DATE () const
{
assert(mFormat == CSSM_DB_ATTRIBUTE_FORMAT_BLOB);
if (mData.Length != 8)
CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
CSSM_DATE date;
memcpy(date.Year, mData.Data, 4);
memcpy(date.Month, mData.Data + 4, 2);
memcpy(date.Day, mData.Data + 6, 2);
return date;
}
CssmDLPolyData::operator Guid () const
{
assert(mFormat == CSSM_DB_ATTRIBUTE_FORMAT_BLOB);
if (mData.Length != Guid::stringRepLength + 1)
CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
return Guid(reinterpret_cast<const char *>(mData.Data));
}
}