diff options
-rw-r--r-- | confirmationui/1.0/default/Android.bp | 43 | ||||
-rw-r--r-- | confirmationui/1.0/default/ConfirmationUI.cpp | 66 | ||||
-rw-r--r-- | confirmationui/1.0/default/ConfirmationUI.h | 57 | ||||
-rw-r--r-- | confirmationui/1.0/default/OWNERS | 2 | ||||
-rw-r--r-- | confirmationui/1.0/default/PlatformSpecifics.cpp | 62 | ||||
-rw-r--r-- | confirmationui/1.0/default/PlatformSpecifics.h | 64 | ||||
-rw-r--r-- | confirmationui/1.0/default/android.hardware.confirmationui@1.0-service.rc | 4 | ||||
-rw-r--r-- | confirmationui/1.0/default/service.cpp | 38 |
8 files changed, 336 insertions, 0 deletions
diff --git a/confirmationui/1.0/default/Android.bp b/confirmationui/1.0/default/Android.bp new file mode 100644 index 0000000000..10018e8720 --- /dev/null +++ b/confirmationui/1.0/default/Android.bp @@ -0,0 +1,43 @@ +// +// 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. +// + +cc_binary { + name: "android.hardware.confirmationui@1.0-service", + init_rc: ["android.hardware.confirmationui@1.0-service.rc"], + vendor: true, + relative_install_path: "hw", + cflags: [ + "-Wall", + "-Wextra", + "-Werror", + ], + srcs: [ + "service.cpp", + "ConfirmationUI.cpp", + "PlatformSpecifics.cpp", + ], + shared_libs: [ + "android.hardware.confirmationui@1.0", + "android.hardware.confirmationui-support-lib", + "android.hardware.keymaster@4.0", + "libcrypto", + "libbase", + "libhidlbase", + "libhidltransport", + "liblog", + "libutils", + ], +}
\ No newline at end of file diff --git a/confirmationui/1.0/default/ConfirmationUI.cpp b/confirmationui/1.0/default/ConfirmationUI.cpp new file mode 100644 index 0000000000..f241a76096 --- /dev/null +++ b/confirmationui/1.0/default/ConfirmationUI.cpp @@ -0,0 +1,66 @@ +/* +** +** Copyright 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. +*/ + +#include "ConfirmationUI.h" + +#include "PlatformSpecifics.h" + +#include <android/hardware/confirmationui/support/cbor.h> +#include <android/hardware/confirmationui/support/confirmationui_utils.h> + +#include <android/hardware/confirmationui/1.0/generic/GenericOperation.h> + +#include <time.h> + +namespace android { +namespace hardware { +namespace confirmationui { +namespace V1_0 { +namespace implementation { + +using ::android::hardware::confirmationui::V1_0::generic::Operation; +using ::android::hardware::keymaster::V4_0::HardwareAuthToken; + +uint8_t hmacKey[32]; + +// Methods from ::android::hardware::confirmationui::V1_0::IConfirmationUI follow. +Return<ResponseCode> ConfirmationUI::promptUserConfirmation( + const sp<IConfirmationResultCallback>& resultCB, const hidl_string& promptText, + const hidl_vec<uint8_t>& extraData, const hidl_string& locale, + const hidl_vec<UIOption>& uiOptions) { + auto& operation = MyOperation::get(); + return operation.init(resultCB, promptText, extraData, locale, uiOptions); +} + +Return<ResponseCode> ConfirmationUI::deliverSecureInputEvent( + const HardwareAuthToken& secureInputToken) { + auto& operation = MyOperation::get(); + return operation.deliverSecureInputEvent(secureInputToken); +} + +Return<void> ConfirmationUI::abort() { + auto& operation = MyOperation::get(); + operation.abort(); + operation.finalize(hmacKey); + return Void(); +} + +} // namespace implementation +} // namespace V1_0 +} // namespace confirmationui +} // namespace hardware +} // namespace android diff --git a/confirmationui/1.0/default/ConfirmationUI.h b/confirmationui/1.0/default/ConfirmationUI.h new file mode 100644 index 0000000000..e9e7f993b8 --- /dev/null +++ b/confirmationui/1.0/default/ConfirmationUI.h @@ -0,0 +1,57 @@ +/* +** +** Copyright 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 ANDROID_HARDWARE_CONFIRMATIONUI_V1_0_CONFIRMATIONUI_H +#define ANDROID_HARDWARE_CONFIRMATIONUI_V1_0_CONFIRMATIONUI_H + +#include <android/hardware/confirmationui/1.0/IConfirmationUI.h> +#include <hidl/MQDescriptor.h> +#include <hidl/Status.h> + +namespace android { +namespace hardware { +namespace confirmationui { +namespace V1_0 { +namespace implementation { + +using ::android::hardware::hidl_array; +using ::android::hardware::hidl_memory; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +struct ConfirmationUI : public IConfirmationUI { + // Methods from ::android::hardware::confirmationui::V1_0::IConfirmationUI follow. + Return<ResponseCode> promptUserConfirmation(const sp<IConfirmationResultCallback>& resultCB, + const hidl_string& promptText, + const hidl_vec<uint8_t>& extraData, + const hidl_string& locale, + const hidl_vec<UIOption>& uiOptions) override; + Return<ResponseCode> deliverSecureInputEvent( + const ::android::hardware::keymaster::V4_0::HardwareAuthToken& secureInputToken) override; + Return<void> abort() override; +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace confirmationui +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_CONFIRMATIONUI_V1_0_CONFIRMATIONUI_H diff --git a/confirmationui/1.0/default/OWNERS b/confirmationui/1.0/default/OWNERS new file mode 100644 index 0000000000..335660da3b --- /dev/null +++ b/confirmationui/1.0/default/OWNERS @@ -0,0 +1,2 @@ +jdanis@google.com +swillden@google.com diff --git a/confirmationui/1.0/default/PlatformSpecifics.cpp b/confirmationui/1.0/default/PlatformSpecifics.cpp new file mode 100644 index 0000000000..dd039e22ba --- /dev/null +++ b/confirmationui/1.0/default/PlatformSpecifics.cpp @@ -0,0 +1,62 @@ +/* +** +** Copyright 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. +*/ + +#include "PlatformSpecifics.h" + +#include <openssl/hmac.h> +#include <openssl/sha.h> +#include <time.h> + +namespace android { +namespace hardware { +namespace confirmationui { +namespace V1_0 { +namespace implementation { + +MonotonicClockTimeStamper::TimeStamp MonotonicClockTimeStamper::now() { + timespec ts; + if (!clock_gettime(CLOCK_BOOTTIME, &ts)) { + return TimeStamp(ts.tv_sec * UINT64_C(1000) + ts.tv_nsec / UINT64_C(1000000)); + } else { + return {}; + } +} + +support::NullOr<support::array<uint8_t, 32>> HMacImplementation::hmac256( + const uint8_t key[32], std::initializer_list<support::ByteBufferProxy> buffers) { + HMAC_CTX hmacCtx; + HMAC_CTX_init(&hmacCtx); + if (!HMAC_Init_ex(&hmacCtx, key, 32, EVP_sha256(), nullptr)) { + return {}; + } + for (auto& buffer : buffers) { + if (!HMAC_Update(&hmacCtx, buffer.data(), buffer.size())) { + return {}; + } + } + support::array<uint8_t, 32> result; + if (!HMAC_Final(&hmacCtx, result.data(), nullptr)) { + return {}; + } + return result; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace confirmationui +} // namespace hardware +} // namespace android diff --git a/confirmationui/1.0/default/PlatformSpecifics.h b/confirmationui/1.0/default/PlatformSpecifics.h new file mode 100644 index 0000000000..18b88c8fcc --- /dev/null +++ b/confirmationui/1.0/default/PlatformSpecifics.h @@ -0,0 +1,64 @@ +/* +** +** Copyright 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 CONFIRMATIONUI_1_0_DEFAULT_PLATFORMSPECIFICS_H_ +#define CONFIRMATIONUI_1_0_DEFAULT_PLATFORMSPECIFICS_H_ + +#include <stdint.h> +#include <time.h> + +#include <android/hardware/confirmationui/1.0/IConfirmationResultCallback.h> +#include <android/hardware/confirmationui/1.0/generic/GenericOperation.h> +#include <android/hardware/confirmationui/support/confirmationui_utils.h> + +namespace android { +namespace hardware { +namespace confirmationui { +namespace V1_0 { +namespace implementation { + +struct MonotonicClockTimeStamper { + class TimeStamp { + public: + explicit TimeStamp(uint64_t ts) : timestamp_(ts), ok_(true) {} + TimeStamp() : timestamp_(0), ok_(false) {} + bool isOk() const { return ok_; } + operator const uint64_t() const { return timestamp_; } + + private: + uint64_t timestamp_; + bool ok_; + }; + static TimeStamp now(); +}; + +class HMacImplementation { + public: + static support::NullOr<support::array<uint8_t, 32>> hmac256( + const uint8_t key[32], std::initializer_list<support::ByteBufferProxy> buffers); +}; + +using MyOperation = generic::Operation<sp<IConfirmationResultCallback>, MonotonicClockTimeStamper, + HMacImplementation>; + +} // namespace implementation +} // namespace V1_0 +} // namespace confirmationui +} // namespace hardware +} // namespace android + +#endif // CONFIRMATIONUI_1_0_DEFAULT_PLATFORMSPECIFICS_H_ diff --git a/confirmationui/1.0/default/android.hardware.confirmationui@1.0-service.rc b/confirmationui/1.0/default/android.hardware.confirmationui@1.0-service.rc new file mode 100644 index 0000000000..a278028348 --- /dev/null +++ b/confirmationui/1.0/default/android.hardware.confirmationui@1.0-service.rc @@ -0,0 +1,4 @@ +service vendor.confirmationui-1-0 /vendor/bin/hw/android.hardware.confirmationui@1.0-service + class hal + user system + group system drmrpc diff --git a/confirmationui/1.0/default/service.cpp b/confirmationui/1.0/default/service.cpp new file mode 100644 index 0000000000..58ec66aba5 --- /dev/null +++ b/confirmationui/1.0/default/service.cpp @@ -0,0 +1,38 @@ +/* +** +** Copyright 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. +*/ + +#define LOG_TAG "android.hardware.confirmationui@1.0-service" + +#include <android-base/logging.h> +#include <hidl/HidlTransportSupport.h> + +#include "ConfirmationUI.h" + +using android::hardware::joinRpcThreadpool; + +using android::hardware::confirmationui::V1_0::implementation::ConfirmationUI; + +int main() { + auto confirmationui = new ConfirmationUI(); + auto status = confirmationui->registerAsService(); + if (status != android::OK) { + LOG(FATAL) << "Could not register service for ConfirmationIU 1.0 (" << status << ")"; + } + + joinRpcThreadpool(); + return -1; // Should never get here. +} |