Token Manager: use arbitrarily sized tokens.
Token manager tokens need to be larger then 64 bits so that we have
sufficient security. Allowing them to be variably sized gives us
sufficient flexibility to change the underlying implementation without
having to change the interface.
Test: hidl_test
Test: (sanity) YouTube videos work
Test: (sanity) watching movies works
Test: Camera record + replay works
Bug: 33842662
Change-Id: I1acc8b5ab5a06597366adbe5718b63acf88c635a
diff --git a/transport/token/1.0/ITokenManager.hal b/transport/token/1.0/ITokenManager.hal
index b1bb735..23a44bd 100644
--- a/transport/token/1.0/ITokenManager.hal
+++ b/transport/token/1.0/ITokenManager.hal
@@ -26,10 +26,12 @@
* Register an interface. The server must keep a strong reference
* to the interface until the token is destroyed by calling unregister.
*
+ * Must return empty token on failure.
+ *
* @param store Interface which can later be fetched with the returned token.
* @return token Opaque value which may be used as inputs to other functions.
*/
- createToken(interface store) generates (uint64_t token);
+ createToken(interface store) generates (vec<uint8_t>token);
/**
* Destory a token and the strong reference to the associated interface.
@@ -37,7 +39,7 @@
* @param token Token received from createToken
* @return success Whether or not the token was successfully unregistered.
*/
- unregister(uint64_t token) generates (bool success);
+ unregister(vec<uint8_t> token) generates (bool success);
/**
* Fetch an interface from a provided token.
@@ -46,5 +48,5 @@
* @return store Interface registered with createToken and the corresponding
* token or nullptr.
*/
- get(uint64_t token) generates (interface store);
+ get(vec<uint8_t> token) generates (interface store);
};
diff --git a/transport/token/1.0/utils/HybridInterface.cpp b/transport/token/1.0/utils/HybridInterface.cpp
index f28446e..106ad4e 100644
--- a/transport/token/1.0/utils/HybridInterface.cpp
+++ b/transport/token/1.0/utils/HybridInterface.cpp
@@ -89,19 +89,17 @@
}
bool createHalToken(const sp<HInterface>& interface, HalToken* token) {
- hardware::Return<HalToken> transaction(false);
+ hardware::Return<void> transaction;
{
std::lock_guard<std::mutex> lock(gTokenManagerLock);
if (isBadTokenManager()) {
return false;
}
- transaction = gTokenManager->createToken(interface);
- if (isBadTransaction(transaction)) {
- return false;
- }
+ transaction = gTokenManager->createToken(interface, [&](const HalToken &newToken) {
+ *token = newToken;
+ });
}
- *token = static_cast<HalToken>(transaction);
- return true;
+ return !isBadTransaction(transaction);
}
bool deleteHalToken(const HalToken& token) {
diff --git a/transport/token/1.0/utils/include/hidl/HybridInterface.h b/transport/token/1.0/utils/include/hidl/HybridInterface.h
index 42d3734..8c3e742 100644
--- a/transport/token/1.0/utils/include/hidl/HybridInterface.h
+++ b/transport/token/1.0/utils/include/hidl/HybridInterface.h
@@ -96,7 +96,7 @@
namespace android {
-typedef uint64_t HalToken;
+typedef ::android::hardware::hidl_vec<uint8_t> HalToken;
typedef ::android::hidl::base::V1_0::IBase HInterface;
constexpr uint32_t DEFAULT_GET_HAL_TOKEN_TRANSACTION_CODE =
@@ -247,7 +247,7 @@
ALOGE("H2BConverter: Failed to create HAL token.");
}
reply->writeBool(result);
- reply->writeUint64(token);
+ reply->writeByteArray(token.size(), token.data());
return NO_ERROR;
}
return BNINTERFACE::onTransact(code, data, reply, flags);
@@ -313,7 +313,11 @@
data.writeInterfaceToken(BaseInterface::getInterfaceDescriptor());
if (mImpl->transact(GET_HAL_TOKEN, data, &reply) == NO_ERROR) {
bool tokenCreated = reply.readBool();
- HalToken token = reply.readUint64();
+
+ std::vector<uint8_t> tokenVector;
+ reply.readByteVector(&tokenVector);
+ HalToken token = HalToken(tokenVector);
+
if (tokenCreated) {
sp<HInterface> hBase = retrieveHalInterface(token);
if (hBase != nullptr) {