xref: /aosp_15_r20/system/hwservicemanager/TokenManager.h (revision ee3b7b6295061e544d3520b965ea91a90424af41)
1*ee3b7b62SAndroid Build Coastguard Worker /*
2*ee3b7b62SAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*ee3b7b62SAndroid Build Coastguard Worker  *
4*ee3b7b62SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ee3b7b62SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ee3b7b62SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ee3b7b62SAndroid Build Coastguard Worker  *
8*ee3b7b62SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ee3b7b62SAndroid Build Coastguard Worker  *
10*ee3b7b62SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ee3b7b62SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ee3b7b62SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ee3b7b62SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ee3b7b62SAndroid Build Coastguard Worker  * limitations under the License.
15*ee3b7b62SAndroid Build Coastguard Worker  */
16*ee3b7b62SAndroid Build Coastguard Worker 
17*ee3b7b62SAndroid Build Coastguard Worker #pragma once
18*ee3b7b62SAndroid Build Coastguard Worker 
19*ee3b7b62SAndroid Build Coastguard Worker #include <android/hidl/token/1.0/ITokenManager.h>
20*ee3b7b62SAndroid Build Coastguard Worker #include <chrono>
21*ee3b7b62SAndroid Build Coastguard Worker #include <hidl/MQDescriptor.h>
22*ee3b7b62SAndroid Build Coastguard Worker #include <hidl/Status.h>
23*ee3b7b62SAndroid Build Coastguard Worker #include <unordered_map>
24*ee3b7b62SAndroid Build Coastguard Worker #include <array>
25*ee3b7b62SAndroid Build Coastguard Worker 
26*ee3b7b62SAndroid Build Coastguard Worker namespace android {
27*ee3b7b62SAndroid Build Coastguard Worker namespace hidl {
28*ee3b7b62SAndroid Build Coastguard Worker namespace token {
29*ee3b7b62SAndroid Build Coastguard Worker namespace V1_0 {
30*ee3b7b62SAndroid Build Coastguard Worker namespace implementation {
31*ee3b7b62SAndroid Build Coastguard Worker 
32*ee3b7b62SAndroid Build Coastguard Worker using ::android::hidl::base::V1_0::IBase;
33*ee3b7b62SAndroid Build Coastguard Worker using ::android::hidl::token::V1_0::ITokenManager;
34*ee3b7b62SAndroid Build Coastguard Worker using ::android::hardware::hidl_array;
35*ee3b7b62SAndroid Build Coastguard Worker using ::android::hardware::hidl_string;
36*ee3b7b62SAndroid Build Coastguard Worker using ::android::hardware::hidl_vec;
37*ee3b7b62SAndroid Build Coastguard Worker using ::android::hardware::Return;
38*ee3b7b62SAndroid Build Coastguard Worker using ::android::hardware::Void;
39*ee3b7b62SAndroid Build Coastguard Worker using ::android::sp;
40*ee3b7b62SAndroid Build Coastguard Worker 
41*ee3b7b62SAndroid Build Coastguard Worker struct TokenManager : public ITokenManager {
42*ee3b7b62SAndroid Build Coastguard Worker     TokenManager();
43*ee3b7b62SAndroid Build Coastguard Worker 
44*ee3b7b62SAndroid Build Coastguard Worker     // Methods from ::android::hidl::token::V1_0::ITokenManager follow.
45*ee3b7b62SAndroid Build Coastguard Worker     Return<void> createToken(const sp<IBase>& store, createToken_cb hidl_cb) override;
46*ee3b7b62SAndroid Build Coastguard Worker     Return<bool> unregister(const hidl_vec<uint8_t> &token) override;
47*ee3b7b62SAndroid Build Coastguard Worker     Return<sp<IBase>> get(const hidl_vec<uint8_t> &token) override;
48*ee3b7b62SAndroid Build Coastguard Worker 
49*ee3b7b62SAndroid Build Coastguard Worker private:
50*ee3b7b62SAndroid Build Coastguard Worker     static constexpr uint64_t KEY_SIZE = 16;
51*ee3b7b62SAndroid Build Coastguard Worker 
52*ee3b7b62SAndroid Build Coastguard Worker     static constexpr uint64_t TOKEN_ID_NONE = 0;
53*ee3b7b62SAndroid Build Coastguard Worker 
54*ee3b7b62SAndroid Build Coastguard Worker     static bool constantTimeCompare(const hidl_vec<uint8_t> &t1, const hidl_vec<uint8_t> &t2);
55*ee3b7b62SAndroid Build Coastguard Worker 
56*ee3b7b62SAndroid Build Coastguard Worker     static hidl_vec<uint8_t> makeToken(const uint64_t id, const uint8_t *hmac, uint64_t hmacSize);
57*ee3b7b62SAndroid Build Coastguard Worker     static uint64_t getTokenId(const hidl_vec<uint8_t> &token);
58*ee3b7b62SAndroid Build Coastguard Worker 
59*ee3b7b62SAndroid Build Coastguard Worker     std::array<uint8_t, KEY_SIZE> mKey;
60*ee3b7b62SAndroid Build Coastguard Worker 
61*ee3b7b62SAndroid Build Coastguard Worker     struct TokenInterface {
62*ee3b7b62SAndroid Build Coastguard Worker         sp<IBase> interface;
63*ee3b7b62SAndroid Build Coastguard Worker         uint64_t id;
64*ee3b7b62SAndroid Build Coastguard Worker         hidl_vec<uint8_t> token; // First eight bytes are tokenId. Remaining bytes are hmac.
65*ee3b7b62SAndroid Build Coastguard Worker     };
66*ee3b7b62SAndroid Build Coastguard Worker 
67*ee3b7b62SAndroid Build Coastguard Worker     TokenInterface generateToken(const sp<IBase> &interface);
68*ee3b7b62SAndroid Build Coastguard Worker 
69*ee3b7b62SAndroid Build Coastguard Worker     // verifies token, returns iterator into mMap
70*ee3b7b62SAndroid Build Coastguard Worker     std::unordered_map<uint64_t, TokenInterface>::const_iterator
71*ee3b7b62SAndroid Build Coastguard Worker             lookupToken(const hidl_vec<uint8_t> &token);
72*ee3b7b62SAndroid Build Coastguard Worker 
73*ee3b7b62SAndroid Build Coastguard Worker     std::unordered_map<uint64_t, TokenInterface> mMap; // map getTokenId(i.token) -> i
74*ee3b7b62SAndroid Build Coastguard Worker     uint64_t mTokenIndex = TOKEN_ID_NONE; // last token index
75*ee3b7b62SAndroid Build Coastguard Worker };
76*ee3b7b62SAndroid Build Coastguard Worker 
77*ee3b7b62SAndroid Build Coastguard Worker }  // namespace implementation
78*ee3b7b62SAndroid Build Coastguard Worker }  // namespace V1_0
79*ee3b7b62SAndroid Build Coastguard Worker }  // namespace token
80*ee3b7b62SAndroid Build Coastguard Worker }  // namespace hidl
81*ee3b7b62SAndroid Build Coastguard Worker }  // namespace android
82