/* * Copyright (C) 2017 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. */ #ifndef KEYSTORE_CONFIRMATION_MANAGER_H_ #define KEYSTORE_CONFIRMATION_MANAGER_H_ #include <android/hardware/confirmationui/1.0/IConfirmationUI.h> #include <android/hardware/confirmationui/1.0/types.h> #include <binder/Binder.h> #include <binder/IBinder.h> #include <binder/Status.h> #include <keystore/keymaster_types.h> #include <map> #include <mutex> #include <utils/LruCache.h> #include <utils/StrongPointer.h> #include <vector> #include "confirmationui_rate_limiting.h" namespace keystore { using android::binder::Status; using android::hardware::confirmationui::V1_0::IConfirmationResultCallback; using ConfirmationResponseCode = android::hardware::confirmationui::V1_0::ResponseCode; class ConfirmationManager; class ConfirmationManager : public android::hardware::hidl_death_recipient, public IConfirmationResultCallback { public: explicit ConfirmationManager(android::IBinder::DeathRecipient* deathRecipient); // Calls into the confirmationui HAL to start a new prompt. // // Returns OperationPending if another application is already // showing a confirmation. Otherwise returns the return code from // the HAL. Status presentConfirmationPrompt(const android::sp<android::IBinder>& listener, const android::String16& promptText, const hidl_vec<uint8_t>& extraData, const android::String16& locale, int uiOptionsAsFlags, int32_t* aidl_return); // Calls into the confirmationui HAL to cancel displaying a // prompt. // // Returns OperatingPending if another application is showing a // confirmation. Otherwise returns the return code from the HAL. Status cancelConfirmationPrompt(const android::sp<android::IBinder>& listener, int32_t* aidl_return); // Checks if the confirmationUI HAL is available. Status isConfirmationPromptSupported(bool* aidl_return); // Gets the latest confirmation token received from the ConfirmationUI HAL. hidl_vec<uint8_t> getLatestConfirmationToken(); // Called by KeyStoreService when a client binder has died. void binderDied(const android::wp<android::IBinder>& who); // hidl_death_recipient overrides: virtual void serviceDied(uint64_t cookie, const android::wp<android::hidl::base::V1_0::IBase>& who) override; // IConfirmationResultCallback overrides: android::hardware::Return<void> result(ConfirmationResponseCode responseCode, const hidl_vec<uint8_t>& dataThatWasConfirmed, const hidl_vec<uint8_t>& confirmationToken) override; private: friend class ConfirmationResultCallback; void finalizeTransaction(ConfirmationResponseCode responseCode, hidl_vec<uint8_t> dataThatWasConfirmed, bool callAbortOnHal); // This mutex protects all data below it. std::mutex mMutex; // The mCurrentListener and mCurrentConfirmationUI fields are set // if and only if a prompt is currently showing. android::sp<android::IBinder> mCurrentListener; android::sp<android::hardware::confirmationui::V1_0::IConfirmationUI> mCurrentConfirmationUI; android::IBinder::DeathRecipient* mDeathRecipient; hidl_vec<uint8_t> mLatestConfirmationToken; RateLimiting<> mRateLimiting; }; } // namespace keystore #endif // KEYSTORE_CONFIRMATION_MANAGER_H_