const Policy &sharedSecretPolicy,
const RawBuffer &ciphertext);
+ int deriveHybrid(const CryptoAlgorithm ¶ms,
+ const Alias &firstSecretAlias,
+ const Password &firstSecretPassword,
+ const Alias &secondSecretAlias,
+ const Password &secondSecretPassword,
+ const Alias &newKeyAlias,
+ const Policy &newKeyPolicy);
+
int initializeCipher(const CryptoAlgorithm ¶ms,
const Alias &keyAlias,
const Password &keyPassword,
const char *new_key_alias,
const ckmc_policy_s new_key_policy)
{
- (void) params;
- (void) first_secret_alias;
- (void) first_secret_password;
- (void) second_secret_alias;
- (void) second_secret_password;
- (void) new_key_alias;
- (void) new_key_policy;
+ EXCEPTION_GUARD_START_CAPI
- return CKMC_ERROR_NONE;
+ if (params == nullptr || first_secret_alias == nullptr ||
+ second_secret_alias == nullptr || new_key_alias == nullptr)
+ return CKMC_ERROR_INVALID_PARAMETER;
+
+ const CKM::CryptoAlgorithm *ca = reinterpret_cast<const CKM::CryptoAlgorithm *>
+ (params);
+
+ int ret = 0;
+ auto mgr = CKM::Manager::create();
+
+ ret = to_ckmc_error(
+ mgr->deriveHybrid(*ca,
+ CKM::Alias(first_secret_alias),
+ _tostring(first_secret_password),
+ CKM::Alias(second_secret_alias),
+ _tostring(second_secret_password),
+ CKM::Alias(new_key_alias),
+ _toCkmPolicy(new_key_policy)));
+
+ return ret;
+ EXCEPTION_GUARD_END
}
EXCEPTION_GUARD_END
}
+int Manager::Impl::deriveHybrid(const CryptoAlgorithm ¶ms,
+ const Alias &firstSecretAlias,
+ const Password &firstSecretPassword,
+ const Alias &secondSecretAlias,
+ const Password &secondSecretPassword,
+ const Alias &newKeyAlias,
+ const Policy &newKeyPolicy)
+{
+ EXCEPTION_GUARD_START_CPPAPI
+
+ AliasSupport firstSecretAliasHelper(firstSecretAlias);
+ AliasSupport secondSecretAliasHelper(secondSecretAlias);
+ AliasSupport newKeyAliasHelper(newKeyAlias);
+
+ return Request(*this,
+ LogicCommand::DERIVE_HYBRID,
+ m_extendedConnection,
+ CryptoAlgorithmSerializable(params),
+ firstSecretAliasHelper.getName(),
+ firstSecretAliasHelper.getOwner(),
+ firstSecretPassword,
+ secondSecretAliasHelper.getName(),
+ secondSecretAliasHelper.getOwner(),
+ secondSecretPassword,
+ newKeyAliasHelper.getName(),
+ newKeyAliasHelper.getOwner(),
+ PolicySerializable(newKeyPolicy)
+ ).maybeDeserialize();
+
+ EXCEPTION_GUARD_END
+}
+
int Manager::Impl::initializeCipher(
const CryptoAlgorithm ¶ms,
const Alias &keyAlias,
const Policy &sharedSecretPolicy,
const RawBuffer &ciphertext);
+ int deriveHybrid(const CryptoAlgorithm ¶ms,
+ const Alias &firstSecretAlias,
+ const Password &firstSecretPassword,
+ const Alias &secondSecretAlias,
+ const Password &secondSecretPassword,
+ const Alias &newKeyAlias,
+ const Policy &newKeyPolicy);
+
int initializeCipher(const CryptoAlgorithm ¶ms,
const Alias &keyAlias,
const Password &keyPassword,
);
}
+int Manager::deriveHybrid(const CryptoAlgorithm ¶ms,
+ const Alias &firstSecretAlias,
+ const Password &firstSecretPassword,
+ const Alias &secondSecretAlias,
+ const Password &secondSecretPassword,
+ const Alias &newKeyAlias,
+ const Policy &newKeyPolicy)
+{
+ return m_impl->deriveHybrid(
+ params,
+ firstSecretAlias,
+ firstSecretPassword,
+ secondSecretAlias,
+ secondSecretPassword,
+ newKeyAlias,
+ newKeyPolicy
+ );
+}
+
int Manager::initializeCipher(
const CryptoAlgorithm ¶ms,
const Alias &keyAlias,
UNWRAP_CONCATENATED_DATA,
GET_BACKEND_INFO,
ENCAPSULATE_KEY,
- DECAPSULATE_KEY
+ DECAPSULATE_KEY,
+ DERIVE_HYBRID
};
enum class EncryptionCommand : int {
ThrowErr(Exc::Crypto::OperationNotSupported);
}
+ virtual Token deriveHybrid(const CryptoAlgorithm &,
+ const Token &,
+ const Password &,
+ const Token &,
+ const Password &,
+ const Password &,
+ const RawBuffer &)
+ {
+ ThrowErr(Exc::Crypto::OperationNotSupported);
+ }
+
// onward = true for encryption/signing, false for decryption/verification
virtual GCtxShPtr initContext(const CryptoAlgorithm &, bool /*onward*/)
{
return Token(backendId(), data.type, Store::pack(data.buffer, pass));
}
+Token BData::deriveHybrid(const CryptoAlgorithm ¶ms,
+ const Token &firstKey,
+ const Password &firstPass,
+ const Token &secondKey,
+ const Password &secondPass,
+ const Password &newKeyPass,
+ const RawBuffer &)
+{
+ RawBuffer firstKeyBuffer = Store::unpack(firstKey.data, firstPass);
+ RawBuffer secondKeyBuffer = Store::unpack(secondKey.data, secondPass);
+
+ firstKeyBuffer.reserve(firstKeyBuffer.size() + secondKeyBuffer.size());
+ firstKeyBuffer.insert(firstKeyBuffer.end(), secondKeyBuffer.begin(), secondKeyBuffer.end());
+
+ auto data = Internals::deriveKBKDF(firstKeyBuffer, params);
+
+ return Token(backendId(), data.type, Store::pack(data.buffer, newKeyPass));
+}
+
Token Key::unwrap(const CryptoAlgorithm ¶ms,
const Data &wrappedKey,
const Password &pass,
ThrowErr(Exc::Crypto::OperationNotSupported);
}
+Token Cert::deriveHybrid(const CryptoAlgorithm &,
+ const Token &,
+ const Password &,
+ const Token &,
+ const Password &,
+ const Password &,
+ const RawBuffer &)
+{
+ ThrowErr(Exc::Crypto::OperationNotSupported);
+}
+
} // namespace SW
} // namespace Crypto
} // namespace CKM
return m_raw;
}
Token derive(const CryptoAlgorithm &, const Password &, const RawBuffer &) override;
+ Token deriveHybrid(const CryptoAlgorithm &,
+ const Token &,
+ const Password &,
+ const Token &,
+ const Password &,
+ const Password &,
+ const RawBuffer &) override;
protected:
RawBuffer m_raw;
const RawBuffer &,
const RawBuffer &) override;
+ Token deriveHybrid(const CryptoAlgorithm &,
+ const Token &,
+ const Password &,
+ const Token &,
+ const Password &,
+ const Password &,
+ const RawBuffer &) override;
+
protected:
EvpShPtr getEvpShPtr() override;
};
return SerializeMessage(msgID, retCode);
}
+RawBuffer CKMLogic::deriveHybrid(
+ const Credentials &cred,
+ const int msgID,
+ const CryptoAlgorithm ¶ms,
+ const Name &firstSecretAlias,
+ const ClientId &firstSecretOwner,
+ const Password &firstSecretPassword,
+ const Name &secondSecretAlias,
+ const ClientId &secondSecretOwner,
+ const Password &secondSecretPassword,
+ const Name &newKeyAlias,
+ const ClientId &newKeyOwner,
+ const PolicySerializable &newKeyPolicy)
+{
+ DB::Row firstKeyRow, secondKeyRow;
+ DataType firstKeyType, secondKeyType;
+
+ return SerializeMessage(msgID, tryRet([&] {
+ Crypto::GObjUPtr obj;
+ DataType objType;
+ auto [dbOp, digest, ret] = beginSaveAndGetHash(cred, newKeyAlias, newKeyOwner);
+ if (ret != CKM_API_SUCCESS)
+ return ret;
+
+ ret = readDataHelper(false, cred, DataType::DB_KEY_LAST,
+ firstSecretAlias, firstSecretOwner, firstSecretPassword, obj, objType);
+ if (ret != CKM_API_SUCCESS) {
+ ret = readDataHelper(false, cred, DataType::BINARY_DATA,
+ firstSecretAlias, firstSecretOwner, firstSecretPassword, obj, objType);
+ if (ret != CKM_API_SUCCESS)
+ return ret;
+
+ ret = readRowHelper(false, cred, DataType::BINARY_DATA, firstSecretAlias, firstSecretOwner,
+ firstSecretPassword, firstKeyRow, firstKeyType);
+
+ } else {
+ ret = readRowHelper(false, cred, DataType::KEY_AES, firstSecretAlias, firstSecretOwner,
+ firstSecretPassword, firstKeyRow, firstKeyType);
+ if (ret != CKM_API_SUCCESS)
+ return ret;
+ }
+
+ ret = readRowHelper(false, cred, DataType::KEY_AES, secondSecretAlias, secondSecretOwner,
+ secondSecretPassword, secondKeyRow, secondKeyType);
+ if (ret != CKM_API_SUCCESS) {
+ ret = readRowHelper(false, cred, DataType::BINARY_DATA, secondSecretAlias, secondSecretOwner,
+ secondSecretPassword, secondKeyRow, secondKeyType);
+ if (ret != CKM_API_SUCCESS)
+ return ret;
+ }
+
+ if (firstKeyRow.backendId != secondKeyRow.backendId) {
+ LogError("Mismatched backends");
+ return CKM_API_ERROR_INPUT_PARAM;
+ }
+
+ Token newKey = obj->deriveHybrid(params, firstKeyRow, firstSecretPassword, secondKeyRow,
+ secondSecretPassword, newKeyPolicy.password, digest);
+
+ dbOp.finalize(std::move(newKey), newKeyPolicy);
+ return CKM_API_SUCCESS;
+ }));
+}
+
RawBuffer CKMLogic::getBackendInfo(const int msgID, BackendId backend)
{
BackendInfo info;
const PolicySerializable &sharedSecretPolicy,
const RawBuffer &ciphertext);
+ RawBuffer deriveHybrid(
+ const Credentials &cred,
+ const int msgID,
+ const CryptoAlgorithm ¶ms,
+ const Name &firstSecretAlias,
+ const ClientId &firstSecretOwner,
+ const Password &firstSecretPassword,
+ const Name &secondSecretAlias,
+ const ClientId &secondSecretOwner,
+ const Password &secondSecretPassword,
+ const Name &newKeyAlias,
+ const ClientId &newKeyOwner,
+ const PolicySerializable &newKeyPolicy);
+
RawBuffer getBackendInfo(
const int msgID,
BackendId backend);
ciphertext);
};
break;
+
}
+ case LogicCommand::DERIVE_HYBRID: {
+ CryptoAlgorithmSerializable params;
+ Name firstSecretAlias;
+ ClientId firstSecretOwner;
+ Password firstSecretPassword;
+ Name secondSecretAlias;
+ ClientId secondSecretOwner;
+ Password secondSecretPassword;
+ Name newKeyAlias;
+ ClientId newKeyOwner;
+ PolicySerializable newKeyPolicy;
+
+ buffer.Deserialize(params,
+ firstSecretAlias,
+ firstSecretOwner,
+ firstSecretPassword,
+ secondSecretAlias,
+ secondSecretOwner,
+ secondSecretPassword,
+ newKeyAlias,
+ newKeyOwner,
+ newKeyPolicy);
+
+ logicFunc = [&, params, firstSecretAlias, firstSecretOwner, firstSecretPassword,
+ secondSecretAlias, secondSecretOwner, secondSecretPassword, newKeyAlias,
+ newKeyOwner, newKeyPolicy]() {
+ return m_logic->deriveHybrid(
+ cred,
+ msgId,
+ params,
+ firstSecretAlias,
+ cred.effectiveOwner(firstSecretOwner),
+ firstSecretPassword,
+ secondSecretAlias,
+ cred.effectiveOwner(secondSecretOwner),
+ secondSecretPassword,
+ newKeyAlias,
+ cred.effectiveOwner(newKeyOwner),
+ newKeyPolicy);
+ };
+ break;
+
+ }
+
default:
Throw(Exception::BrokenProtocol);
}