#ifndef _H_SS_CONTEXT
#define _H_SS_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 SSCSPSession;
class SSKey;
class SSContext : public CSPFullPluginSession::CSPContext
{
public:
SSContext(SSCSPSession &session);
~SSContext() { clearOutBuf(); }
virtual void init(const Context &context, bool encoding);
protected:
SecurityServer::ClientSession &clientSession();
SSCSPSession &mSession;
CssmData mOutBuf;
const Context *mContext;
void clearOutBuf();
void copyOutBuf(CssmData &out);
};
class SSSignatureContext : public SSContext
{
public:
SSSignatureContext(SSCSPSession &session);
~SSSignatureContext();
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; CSSM_ALGORITHMS mOrigAlg;
NullDigest *mNullDigest;
CssmClient::Digest *mDigest;
};
class SSRandomContext : public SSContext
{
public:
SSRandomContext(SSCSPSession &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 SSCryptContext : public SSContext
{
public:
SSCryptContext(SSCSPSession &session);
~SSCryptContext();
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 SSDigestContext : public SSContext
{
public:
SSDigestContext(SSCSPSession &session);
~SSDigestContext();
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 SSMACContext : public SSContext
{
public:
SSMACContext(SSCSPSession &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_SS_CONTEXT