• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright 2020, The Android Open Source Project
3   *
4   * Licensed under the Apache License, Version 2.0 (the "License");
5   * you may not use this file except in compliance with the License.
6   * You may obtain a copy of the License at
7   *
8   *     http://www.apache.org/licenses/LICENSE-2.0
9   *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  #ifndef ANDROID_HARDWARE_CONFIRMATIONUI_V1_0_TRUSTY_CONFIRMATIONUI_H
18  #define ANDROID_HARDWARE_CONFIRMATIONUI_V1_0_TRUSTY_CONFIRMATIONUI_H
19  
20  #include <android/hardware/confirmationui/1.0/IConfirmationUI.h>
21  #include <android/hardware/keymaster/4.0/types.h>
22  #include <hidl/Status.h>
23  
24  #include <atomic>
25  #include <condition_variable>
26  #include <memory>
27  #include <mutex>
28  #include <teeui/generic_messages.h>
29  #include <thread>
30  
31  #include "TrustyApp.h"
32  
33  namespace android {
34  namespace hardware {
35  namespace confirmationui {
36  namespace V1_0 {
37  namespace implementation {
38  
39  using ::android::sp;
40  using ::android::hardware::hidl_array;
41  using ::android::hardware::hidl_string;
42  using ::android::hardware::hidl_vec;
43  using ::android::hardware::Return;
44  using ::android::hardware::Void;
45  
46  using ::android::trusty::confirmationui::TrustyApp;
47  
48  class TrustyConfirmationUI : public IConfirmationUI {
49    public:
50      TrustyConfirmationUI();
51      virtual ~TrustyConfirmationUI();
52      // Methods from ::android::hardware::confirmationui::V1_0::IConfirmationUI
53      // follow.
54      Return<ResponseCode> promptUserConfirmation(const sp<IConfirmationResultCallback>& resultCB,
55                                                  const hidl_string& promptText,
56                                                  const hidl_vec<uint8_t>& extraData,
57                                                  const hidl_string& locale,
58                                                  const hidl_vec<UIOption>& uiOptions) override;
59      Return<ResponseCode> deliverSecureInputEvent(
60          const ::android::hardware::keymaster::V4_0::HardwareAuthToken& secureInputToken) override;
61      Return<void> abort() override;
62  
63    private:
64      std::weak_ptr<TrustyApp> app_;
65      std::thread callback_thread_;
66  
67      enum class ListenerState : uint32_t {
68          None,
69          Starting,
70          SetupDone,
71          Interactive,
72          Terminating,
73      };
74  
75      /*
76       * listener_state is protected by listener_state_lock. It makes transitions between phases
77       * of the confirmation operation atomic.
78       * (See TrustyConfirmationUI.cpp#promptUserConfirmation_ for details about operation phases)
79       */
80      ListenerState listener_state_;
81      /*
82       * abort_called_ is also protected by listener_state_lock_ and indicates that the HAL user
83       * called abort.
84       */
85      bool abort_called_;
86      std::mutex listener_state_lock_;
87      std::condition_variable listener_state_condv_;
88      ResponseCode prompt_result_;
89      bool secureInputDelivered_;
90  
91      std::tuple<teeui::ResponseCode, teeui::MsgVector<uint8_t>, teeui::MsgVector<uint8_t>>
92      promptUserConfirmation_(const teeui::MsgString& promptText,
93                              const teeui::MsgVector<uint8_t>& extraData,
94                              const teeui::MsgString& locale,
95                              const teeui::MsgVector<teeui::UIOption>& uiOptions);
96  };
97  
98  }  // namespace implementation
99  }  // namespace V1_0
100  }  // namespace confirmationui
101  }  // namespace hardware
102  }  // namespace android
103  
104  #endif  // ANDROID_HARDWARE_CONFIRMATIONUI_V1_0_TRUSTY_CONFIRMATIONUI_H
105