#include <Security/cryptoclient.h>
using namespace CssmClient;
Crypt::Crypt(const CSP &csp, CSSM_ALGORITHMS alg) : Context(csp, alg)
{
mMode = CSSM_ALGMODE_NONE;
mCred = NULL;
mInitVector = NULL;
mPadding = CSSM_PADDING_NONE;
}
void Crypt::key(const Key &key)
{
mKey = key;
set(CSSM_ATTRIBUTE_KEY, static_cast<const CssmKey &>(key));
}
void
Crypt::activate()
{
if (!mActive)
{
if (!mCred)
mCred = &AccessCredentials::null;
if (!mKey && mAlgorithm != CSSM_ALGID_NONE)
CssmError::throwMe(CSSMERR_CSP_MISSING_ATTR_KEY);
if (!mKey || mKey->keyClass() == CSSM_KEYCLASS_SESSION_KEY)
{ check(CSSM_CSP_CreateSymmetricContext(attachment()->handle(), mAlgorithm,
mMode, mCred, mKey, mInitVector, mPadding, NULL,
&mHandle));
}
else
{
check(CSSM_CSP_CreateAsymmetricContext(attachment()->handle(), mAlgorithm,
mCred, mKey, mPadding, &mHandle));
}
mActive = true;
}
}
void Crypt::cred(const AccessCredentials *c)
{
if (!(mCred = c))
mCred = &AccessCredentials::null;
set(CSSM_ATTRIBUTE_ACCESS_CREDENTIALS, *mCred);
}
uint32
Encrypt::encrypt(const CssmData *in, uint32 inCount,
CssmData *out, uint32 outCount, CssmData &remData)
{
unstaged();
uint32 total;
check(CSSM_EncryptData(handle(), in, inCount, out, outCount, &total, &remData));
return total;
}
void
Encrypt::init()
{
check(CSSM_EncryptDataInit(handle()));
mStaged = true;
}
uint32
Encrypt::encrypt(const CssmData *in, uint32 inCount,
CssmData *out, uint32 outCount)
{
staged();
uint32 total;
check(CSSM_EncryptDataUpdate(handle(), in, inCount, out, outCount, &total));
return total;
}
void
Encrypt::final(CssmData &remData)
{
staged();
check(CSSM_EncryptDataFinal(handle(), &remData));
mStaged = false;
}
uint32
Decrypt::decrypt(const CssmData *in, uint32 inCount,
CssmData *out, uint32 outCount, CssmData &remData)
{
unstaged();
uint32 total;
check(CSSM_DecryptData(handle(), in, inCount, out, outCount, &total, &remData));
return total;
}
void
Decrypt::init()
{
check(CSSM_DecryptDataInit(handle()));
mStaged = true;
}
uint32
Decrypt::decrypt(const CssmData *in, uint32 inCount,
CssmData *out, uint32 outCount)
{
staged();
uint32 total;
check(CSSM_DecryptDataUpdate(handle(), in, inCount, out, outCount, &total));
return total;
}
void
Decrypt::final(CssmData &remData)
{
staged();
check(CSSM_DecryptDataFinal(handle(), &remData));
mStaged = false;
}