#ifndef _DIGEST_OBJECT_H_
#define _DIGEST_OBJECT_H_
#include <CoreServices/../Frameworks/CarbonCore.framework/Headers/MacTypes.h>
#include <Security/cssmalloc.h>
class DigestObject {
public:
DigestObject() : mInitFlag(false), mIsDone(false) { }
virtual ~DigestObject() { }
virtual void digestInit() = 0;
virtual void digestUpdate(
const void *data,
size_t len) = 0;
virtual void digestFinal(
void *digest) = 0;
virtual DigestObject *digestClone() const = 0;
virtual size_t digestSizeInBytes() const = 0;
protected:
bool mInitFlag;
bool mIsDone;
bool initFlag() { return mInitFlag; }
void setInitFlag(bool flag) { mInitFlag = flag; }
bool isDone() { return mIsDone; }
void setIsDone(bool done) { mIsDone = done; }
};
class NullDigest : public DigestObject
{
public:
NullDigest() : mInBuf(NULL), mInBufSize(0)
{
}
void digestInit()
{
if(mInBufSize) {
assert(mInBuf != NULL);
memset(mInBuf, 0, mInBufSize);
CssmAllocator::standard().free(mInBuf);
mInBufSize = 0;
mInBuf = NULL;
}
}
~NullDigest()
{
digestInit();
}
void digestUpdate(
const void *data,
size_t len)
{
mInBuf = CssmAllocator::standard().realloc(mInBuf, mInBufSize + len);
memmove((uint8 *)mInBuf + mInBufSize, data, len);
mInBufSize += len;
}
virtual void digestFinal(
void *digest)
{
memmove(digest, mInBuf, mInBufSize);
}
virtual DigestObject *digestClone() const
{
NullDigest *cloned = new NullDigest;
cloned->digestUpdate(mInBuf, mInBufSize);
return cloned;
}
virtual const void *digestPtr() { return mInBuf; }
size_t digestSizeInBytes() const
{
return mInBufSize;
}
private:
void *mInBuf;
size_t mInBufSize;
};
#endif