#ifndef _H_SD_CONTEXT
#define _H_SD_CONTEXT
#include <security_cdsa_plugin/CSPsession.h>
#include <securityd_client/ssclient.h>
#include <security_cdsa_utilities/digestobject.h>
#include <security_cdsa_client/cspclient.h>
class SDCSPSession;
class SDKey;
class SDContext : public CSPFullPluginSession::CSPContext
{
public:
SDContext(SDCSPSession &session);
~SDContext() { clearOutBuf(); }
virtual void init(const Context &context, bool encoding);
protected:
SecurityServer::ClientSession &clientSession();
SDCSPSession &mSession;
CssmData mOutBuf;
const Context *mContext;
void clearOutBuf();
void copyOutBuf(CssmData &out);
};
class SDSignatureContext : public SDContext
{
public:
SDSignatureContext(SDCSPSession &session);
~SDSignatureContext();
virtual void init(const Context &context, bool signing);
virtual void update(const CssmData &data);
virtual size_t outputSize(bool final, size_t inSize);
void sign(CssmData &sig);
virtual void final(CssmData &out);
virtual void final(const CssmData &in);
virtual void setDigestAlgorithm(CSSM_ALGORITHMS digestAlg);
private:
SecurityServer::KeyHandle mKeyHandle;
CSSM_ALGORITHMS mSigAlg; CSSM_ALGORITHMS mDigestAlg;
NullDigest *mNullDigest;
CssmClient::Digest *mDigest;
};
class SDRandomContext : public SDContext
{
public:
SDRandomContext(SDCSPSession &session);
virtual void init(const Context &context, bool);
virtual size_t outputSize(bool final, size_t inSize);
virtual void final(CssmData &out);
private:
uint32 mOutSize; };
class SDCryptContext : public SDContext
{
public:
SDCryptContext(SDCSPSession &session);
~SDCryptContext();
virtual void init(const Context &context, bool encoding);
virtual size_t inputSize(size_t outSize);
virtual size_t outputSize(bool final, size_t inSize);
virtual void minimumProgress(size_t &in, size_t &out);
virtual void update(void *inp, size_t &inSize, void *outp,
size_t &outSize);
virtual void final(CssmData &out);
private:
SecurityServer::KeyHandle mKeyHandle;
NullDigest mNullDigest; };
class SDDigestContext : public SDContext
{
public:
SDDigestContext(SDCSPSession &session);
~SDDigestContext();
virtual void init(const Context &context, bool);
virtual void update(const CssmData &data);
virtual void final(CssmData &out);
virtual size_t outputSize(bool final, size_t inSize);
private:
CssmClient::Digest *mDigest;
};
class SDMACContext : public SDContext
{
public:
SDMACContext(SDCSPSession &session);
virtual void init(const Context &context, bool);
virtual void update(const CssmData &data);
virtual size_t outputSize(bool final, size_t inSize);
void genMac(CssmData &mac);
virtual void final(CssmData &out);
virtual void final(const CssmData &in);
private:
SecurityServer::KeyHandle mKeyHandle;
NullDigest mNullDigest; };
#endif // _H_SD_CONTEXT