blob: 7d3ade7b2759a0be69a76fd1335177fd72b38100 [file] [log] [blame]
/*
* Copyright (C) 2025 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <aidl/android/hardware/security/see/hwcrypto/BnHwCryptoKey.h>
#include <aidl/android/hardware/security/see/hwcrypto/IHwCryptoKey.h>
#include <aidl/android/hardware/security/see/hwcrypto/types/HalErrorCode.h>
#include <android-base/logging.h>
#include <android-base/result.h>
#include <android/hardware/security/see/hwcrypto/IHwCryptoKey.h>
#include <binder/RpcSession.h>
// We use cpp interfaces to talk to Trusty, and ndk interfaces for the platform
namespace cpp_hwcrypto = android::hardware::security::see::hwcrypto;
namespace ndk_hwcrypto = aidl::android::hardware::security::see::hwcrypto;
namespace android {
namespace trusty {
namespace hwcryptohalservice {
class HwCryptoKey : public ndk_hwcrypto::BnHwCryptoKey {
private:
sp<cpp_hwcrypto::IHwCryptoKey> mHwCryptoServer;
sp<IBinder> mRoot;
sp<RpcSession> mSession;
android::base::Result<void> connectToTrusty(const char* tipcDev);
public:
HwCryptoKey();
static std::shared_ptr<HwCryptoKey> Create(const char* tipcDev);
ndk::ScopedAStatus deriveCurrentDicePolicyBoundKey(
const ndk_hwcrypto::IHwCryptoKey::DiceBoundDerivationKey& derivationKey,
ndk_hwcrypto::IHwCryptoKey::DiceCurrentBoundKeyResult* aidl_return) override;
ndk::ScopedAStatus deriveDicePolicyBoundKey(
const ndk_hwcrypto::IHwCryptoKey::DiceBoundDerivationKey& derivationKey,
const ::std::vector<uint8_t>& dicePolicyForKeyVersion,
ndk_hwcrypto::IHwCryptoKey::DiceBoundKeyResult* aidl_return) override;
ndk::ScopedAStatus deriveKey(const ndk_hwcrypto::IHwCryptoKey::DerivedKeyParameters& parameters,
ndk_hwcrypto::IHwCryptoKey::DerivedKey* aidl_return) override;
ndk::ScopedAStatus getHwCryptoOperations(
std::shared_ptr<ndk_hwcrypto::IHwCryptoOperations>* aidl_return) override;
ndk::ScopedAStatus importClearKey(
const ndk_hwcrypto::types::ExplicitKeyMaterial& keyMaterial,
const ndk_hwcrypto::KeyPolicy& newKeyPolicy,
std::shared_ptr<ndk_hwcrypto::IOpaqueKey>* aidl_return) override;
ndk::ScopedAStatus getCurrentDicePolicy(std::vector<uint8_t>* aidl_return) override;
ndk::ScopedAStatus keyTokenImport(
const ndk_hwcrypto::types::OpaqueKeyToken& requestedKey,
const ::std::vector<uint8_t>& sealingDicePolicy,
std::shared_ptr<ndk_hwcrypto::IOpaqueKey>* aidl_return) override;
ndk::ScopedAStatus getKeyslotData(
ndk_hwcrypto::IHwCryptoKey::KeySlot slotId,
std::shared_ptr<ndk_hwcrypto::IOpaqueKey>* aidl_return) override;
};
template <typename LHP, typename RHP>
LHP convertKeyPolicy(const RHP& policyToConvert) {
LHP policy = LHP();
policy.usage = static_cast<decltype(policy.usage)>(policyToConvert.usage);
policy.keyLifetime = static_cast<decltype(policy.keyLifetime)>(policyToConvert.keyLifetime);
policy.keyType = static_cast<decltype(policy.keyType)>(policyToConvert.keyType);
policy.keyManagementKey = policyToConvert.keyManagementKey;
policy.keyPermissions.reserve(policyToConvert.keyPermissions.size());
for (auto permission : policyToConvert.keyPermissions) {
policy.keyPermissions.push_back(
std::move(static_cast<decltype(policy.keyPermissions)::value_type>(permission)));
}
return policy;
}
template <typename CPP, typename NDK,
std::map<std::weak_ptr<NDK>, wp<CPP>, std::owner_less<>>& mapping>
sp<CPP> retrieveCppBinder(const std::shared_ptr<NDK>& ndkBinder) {
if (ndkBinder == nullptr) {
return nullptr;
}
if (mapping.find(ndkBinder) == mapping.end()) {
LOG(ERROR) << "couldn't find wrapped key";
return nullptr;
}
auto cppBbinder = mapping[ndkBinder];
return cppBbinder.promote();
}
template <typename CPP_BINDER, typename NDK_BINDER, typename NDK_BASE,
std::map<std::weak_ptr<NDK_BINDER>, wp<CPP_BINDER>, std::owner_less<>>& mapping>
void insertBinderMapping(const sp<CPP_BINDER>& cppBinder, std::shared_ptr<NDK_BINDER>* ndkBinder) {
std::shared_ptr<NDK_BINDER> spNdkBinder = NDK_BASE::Create(cppBinder);
std::weak_ptr<NDK_BINDER> wptrNdkBinder = spNdkBinder;
wp<CPP_BINDER> wpCppBinder = cppBinder;
mapping.insert({wptrNdkBinder, wpCppBinder});
*ndkBinder = spNdkBinder;
}
} // namespace hwcryptohalservice
} // namespace trusty
} // namespace android