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