namespace {
template <class...T>
-int deserialize(const int msgId, MessageBuffer &recv, T&&...t)
+int deserializeResponse(const int msgId, MessageBuffer &recv, T&&...t)
{
int retMsgId, retCode;
recv.Deserialize(retMsgId, retCode, std::forward<T>(t)...);
int getCertChain(
ServiceConnection &serviceConnection,
LogicCommand command,
- int msgId,
+ Manager::Impl &impl,
const CertificateShPtr &certificate,
const T &untrustedVector,
const T &trustedVector,
{
EXCEPTION_GUARD_START_CPPAPI
- MessageBuffer recv;
- auto send = SerializeMessage(static_cast<int>(command),
- msgId,
- certificate->getDER(),
- untrustedVector,
- trustedVector,
- useTrustedSystemCertificates);
-
- int retCode = serviceConnection.processRequest(send, recv);
-
- if (CKM_API_SUCCESS != retCode)
- return retCode;
+ Manager::Impl::Request rq(impl, command, serviceConnection,
+ certificate->getDER(), untrustedVector, trustedVector, useTrustedSystemCertificates);
+ if (!rq)
+ return rq.err();
RawBufferVector rawBufferVector;
- retCode = deserialize(msgId, recv, rawBufferVector);
+ int retCode = rq.deserialize(rawBufferVector);
if (retCode != CKM_API_SUCCESS)
return retCode;
EXCEPTION_GUARD_END
}
-} // namespace anonymous
+} // namespace
Manager::Impl::Impl()
: m_counter(0),
{
}
+template <class Cmd, class...T>
+Manager::Impl::Request::Request(Manager::Impl &impl, Cmd cmd, CKM::ServiceConnection &conn, T&&...t)
+{
+ static_assert(sizeof cmd <= sizeof(int));
+ const auto msgId = m_msgId = ++impl.m_counter;
+ m_retCode = conn.processRequest(
+ SerializeMessage(static_cast<int>(cmd), msgId, std::forward<T>(t)...),
+ m_recv);
+}
+
+Manager::Impl::Request::operator bool() const {
+ return CKM_API_SUCCESS == m_retCode;
+}
+
+int Manager::Impl::Request::err() const {
+ assert(!*this);
+ return m_retCode;
+}
+
+template <class...T>
+int Manager::Impl::Request::deserialize(T&&...t)
+{
+ assert(*this);
+ return deserializeResponse(m_msgId, m_recv, std::forward<T>(t)...);
+}
+
+template <class...T>
+int Manager::Impl::Request::maybeDeserialize(T&&...t)
+{
+ return *this ? deserialize(std::forward<T>(t)...) : err();
+}
int Manager::Impl::saveBinaryData(
const Alias &alias,
const RawBuffer &rawData,
const Policy &policy)
{
- int msgId = ++m_counter;
-
EXCEPTION_GUARD_START_CPPAPI
if (alias.empty() || rawData.empty())
return CKM_API_ERROR_INPUT_PARAM;
- MessageBuffer recv;
AliasSupport helper(alias);
- auto send = SerializeMessage(static_cast<int>(LogicCommand::SAVE),
- msgId,
- dataType,
- helper.getName(),
- helper.getOwner(),
- rawData,
- PolicySerializable(policy));
-
- int retCode = m_storageConnection.processRequest(send, recv);
-
- if (CKM_API_SUCCESS != retCode)
- return retCode;
int opType;
- return deserialize(msgId, recv, opType);
+ return Request(*this, LogicCommand::SAVE, m_storageConnection,
+ dataType, helper.getName(), helper.getOwner(), rawData, PolicySerializable(policy)
+ ).maybeDeserialize(opType);
EXCEPTION_GUARD_END
}
if (alias.empty() || pkcs.get() == NULL)
return CKM_API_ERROR_INPUT_PARAM;
- int msgId = ++m_counter;
-
EXCEPTION_GUARD_START_CPPAPI
- MessageBuffer recv;
AliasSupport helper(alias);
- auto send = SerializeMessage(static_cast<int>(LogicCommand::SAVE_PKCS12),
- msgId,
- helper.getName(),
- helper.getOwner(),
- PKCS12Serializable(*pkcs.get()),
- PolicySerializable(keyPolicy),
- PolicySerializable(certPolicy));
- int retCode = m_storageConnection.processRequest(send, recv);
-
- if (CKM_API_SUCCESS != retCode)
- return retCode;
-
- return deserialize(msgId, recv);
+ return Request(*this, LogicCommand::SAVE_PKCS12, m_storageConnection,
+ helper.getName(), helper.getOwner(), PKCS12Serializable(*pkcs.get()),
+ PolicySerializable(keyPolicy), PolicySerializable(certPolicy)
+ ).maybeDeserialize();
EXCEPTION_GUARD_END
}
if (alias.empty())
return CKM_API_ERROR_INPUT_PARAM;
- int msgId = ++m_counter;
-
EXCEPTION_GUARD_START_CPPAPI
- MessageBuffer recv;
AliasSupport helper(alias);
+
+ int msgId = ++m_counter;
+ MessageBuffer recv;
auto send = SerializeMessage(static_cast<int>(LogicCommand::GET_PKCS12),
msgId,
helper.getName(),
if (alias.empty())
return CKM_API_ERROR_INPUT_PARAM;
- int msgId = ++m_counter;
-
EXCEPTION_GUARD_START_CPPAPI
- MessageBuffer recv;
AliasSupport helper(alias);
- auto send = SerializeMessage(static_cast<int>(LogicCommand::REMOVE),
- msgId,
- helper.getName(),
- helper.getOwner());
-
- int retCode = m_storageConnection.processRequest(send, recv);
-
- if (CKM_API_SUCCESS != retCode)
- return retCode;
- return deserialize(msgId, recv);
+ return Request(*this, LogicCommand::REMOVE, m_storageConnection,
+ helper.getName(), helper.getOwner()
+ ).maybeDeserialize();
EXCEPTION_GUARD_END
}
if (alias.empty())
return CKM_API_ERROR_INPUT_PARAM;
- int msgId = ++m_counter;
-
EXCEPTION_GUARD_START_CPPAPI
- MessageBuffer recv;
AliasSupport helper(alias);
- auto send = SerializeMessage(static_cast<int>(LogicCommand::GET),
- msgId,
- sendDataType,
- helper.getName(),
- helper.getOwner(),
- password);
-
- int retCode = m_storageConnection.processRequest(send, recv);
- if (CKM_API_SUCCESS != retCode)
- return retCode;
-
- return deserialize(msgId, recv, recvDataType, rawData);
+ return Request(*this, LogicCommand::GET, m_storageConnection,
+ sendDataType, helper.getName(), helper.getOwner(), password
+ ).maybeDeserialize(recvDataType, rawData);
EXCEPTION_GUARD_END
}
if (alias.empty())
return CKM_API_ERROR_INPUT_PARAM;
- int msgId = ++m_counter;
-
EXCEPTION_GUARD_START_CPPAPI
- MessageBuffer recv;
AliasSupport helper(alias);
- auto send = SerializeMessage(static_cast<int>(LogicCommand::GET_PROTECTION_STATUS),
- msgId,
- sendDataType,
- helper.getName(),
- helper.getOwner());
-
- int retCode = m_storageConnection.processRequest(send, recv);
-
- if (CKM_API_SUCCESS != retCode)
- return retCode;
-
DataType tmpDataType;
bool passwordProtectionStatus;
- retCode = deserialize(msgId, recv, tmpDataType, passwordProtectionStatus);
+
+ int retCode = Request(*this, LogicCommand::GET_PROTECTION_STATUS, m_storageConnection,
+ sendDataType, helper.getName(), helper.getOwner()
+ ).maybeDeserialize(tmpDataType, passwordProtectionStatus);
if (retCode != CKM_API_SUCCESS) {
return retCode;
int Manager::Impl::getBinaryDataAliasVectorHelper(DataType dataType,
OwnerNameVector &ownerNameVector)
{
- int msgId = ++m_counter;
-
- MessageBuffer recv;
- auto send = SerializeMessage(static_cast<int>(LogicCommand::GET_LIST), msgId, dataType);
-
- int retCode = m_storageConnection.processRequest(send, recv);
-
- if (retCode != CKM_API_SUCCESS)
- return retCode;
-
- int retMsgId;
DataType tmpDataType;
- recv.Deserialize(retMsgId, retCode, tmpDataType, ownerNameVector);
-
- return retMsgId != msgId ? CKM_API_ERROR_UNKNOWN : retCode;
+ return Request(*this, LogicCommand::GET_LIST, m_storageConnection,
+ dataType
+ ).maybeDeserialize(tmpDataType, ownerNameVector);
}
int Manager::Impl::getBinaryDataAliasVector(DataType dataType,
const Alias &keyAlias,
const Policy &policyKey)
{
- // proceed with sending request
- int msgId = ++m_counter;
-
EXCEPTION_GUARD_START_CPPAPI
- MessageBuffer recv;
AliasSupport aliasHelper(keyAlias);
- auto send = SerializeMessage(static_cast<int>(LogicCommand::CREATE_KEY_AES),
- msgId,
- static_cast<int>(size),
- PolicySerializable(policyKey),
- aliasHelper.getName(),
- aliasHelper.getOwner());
- int retCode = m_storageConnection.processRequest(send, recv);
-
- if (CKM_API_SUCCESS != retCode)
- return retCode;
-
- return deserialize(msgId, recv);
+ return Request(*this, LogicCommand::CREATE_KEY_AES, m_storageConnection,
+ static_cast<int>(size), PolicySerializable(policyKey),
+ aliasHelper.getName(), aliasHelper.getOwner()
+ ).maybeDeserialize();
EXCEPTION_GUARD_END
}
return CKM_API_ERROR_INPUT_PARAM;
}
- // proceed with sending request
- int msgId = ++m_counter;
-
EXCEPTION_GUARD_START_CPPAPI
- MessageBuffer recv;
AliasSupport privateHelper(privateKeyAlias);
AliasSupport publicHelper(publicKeyAlias);
- auto send = SerializeMessage(static_cast<int>(LogicCommand::CREATE_KEY_PAIR),
- msgId,
- CryptoAlgorithmSerializable(keyGenAlgorithm),
- PolicySerializable(policyPrivateKey),
- PolicySerializable(policyPublicKey),
- privateHelper.getName(),
- privateHelper.getOwner(),
- publicHelper.getName(),
- publicHelper.getOwner());
- int retCode = m_storageConnection.processRequest(send, recv);
-
- if (CKM_API_SUCCESS != retCode)
- return retCode;
-
- return deserialize(msgId, recv);
+ return Request(*this, LogicCommand::CREATE_KEY_PAIR, m_storageConnection,
+ CryptoAlgorithmSerializable(keyGenAlgorithm),
+ PolicySerializable(policyPrivateKey),
+ PolicySerializable(policyPublicKey),
+ privateHelper.getName(), privateHelper.getOwner(),
+ publicHelper.getName(), publicHelper.getOwner()
+ ).maybeDeserialize();
EXCEPTION_GUARD_END
}
return getCertChain(
m_storageConnection,
LogicCommand::GET_CHAIN_CERT,
- ++m_counter,
+ *this,
certificate,
untrustedVector,
trustedVector,
return getCertChain(
m_storageConnection,
LogicCommand::GET_CHAIN_ALIAS,
- ++m_counter,
+ *this,
certificate,
untrustedVector,
trustedVector,
const CryptoAlgorithm &cAlgorithm,
RawBuffer &signature)
{
- int msgId = ++m_counter;
-
EXCEPTION_GUARD_START_CPPAPI
- MessageBuffer recv;
AliasSupport helper(privateKeyAlias);
- auto send = SerializeMessage(static_cast<int>(LogicCommand::CREATE_SIGNATURE),
- msgId,
- helper.getName(),
- helper.getOwner(),
- password,
- message,
- CryptoAlgorithmSerializable(cAlgorithm));
-
- int retCode = m_storageConnection.processRequest(send, recv);
-
- if (CKM_API_SUCCESS != retCode)
- return retCode;
- return deserialize(msgId, recv, signature);
+ return Request(*this, LogicCommand::CREATE_SIGNATURE, m_storageConnection,
+ helper.getName(), helper.getOwner(), password, message,
+ CryptoAlgorithmSerializable(cAlgorithm)
+ ).maybeDeserialize(signature);
EXCEPTION_GUARD_END
}
const RawBuffer &signature,
const CryptoAlgorithm &cAlg)
{
- int msgId = ++m_counter;
-
EXCEPTION_GUARD_START_CPPAPI
- MessageBuffer recv;
AliasSupport helper(publicKeyOrCertAlias);
- auto send = SerializeMessage(static_cast<int>(LogicCommand::VERIFY_SIGNATURE),
- msgId,
- helper.getName(),
- helper.getOwner(),
- password,
- message,
- signature,
- CryptoAlgorithmSerializable(cAlg));
- int retCode = m_storageConnection.processRequest(send, recv);
-
- if (CKM_API_SUCCESS != retCode)
- return retCode;
-
- return deserialize(msgId, recv);
+ return Request(*this, LogicCommand::VERIFY_SIGNATURE, m_storageConnection,
+ helper.getName(), helper.getOwner(), password, message, signature,
+ CryptoAlgorithmSerializable(cAlg)
+ ).maybeDeserialize();
EXCEPTION_GUARD_END
}
if (CKM_API_SUCCESS != retCode)
return retCode;
- return deserialize(msgId, recv, ocspStatus);
+ return deserializeResponse(msgId, recv, ocspStatus);
EXCEPTION_GUARD_END
}
const ClientId &accessor,
PermissionMask permissionMask)
{
- int msgId = ++m_counter;
-
EXCEPTION_GUARD_START_CPPAPI
- MessageBuffer recv;
AliasSupport helper(alias);
- auto send = SerializeMessage(static_cast<int>(LogicCommand::SET_PERMISSION),
- msgId,
- helper.getName(),
- helper.getOwner(),
- accessor,
- permissionMask);
-
- int retCode = m_storageConnection.processRequest(send, recv);
- if (CKM_API_SUCCESS != retCode)
- return retCode;
-
- return deserialize(msgId, recv);
+ return Request(*this, LogicCommand::SET_PERMISSION, m_storageConnection,
+ helper.getName(), helper.getOwner(), accessor, permissionMask
+ ).maybeDeserialize();
EXCEPTION_GUARD_END
}
const RawBuffer &input,
RawBuffer &output)
{
- int msgId = ++m_counter;
-
EXCEPTION_GUARD_START_CPPAPI
- MessageBuffer recv;
AliasSupport helper(keyAlias);
CryptoAlgorithmSerializable cas(algo);
- auto send = SerializeMessage(static_cast<int>(command),
- msgId,
- cas,
- helper.getName(),
- helper.getOwner(),
- password,
- input);
-
- int retCode = m_encryptionConnection.processRequest(send, recv);
-
- if (CKM_API_SUCCESS != retCode)
- return retCode;
- return deserialize(msgId, recv, output);
+ return Request(*this, command, m_encryptionConnection,
+ cas, helper.getName(), helper.getOwner(), password, input
+ ).maybeDeserialize(output);
EXCEPTION_GUARD_END
}