/* * Copyright (C) 2020 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. */ #pragma once #include #include using ApcCompatServiceHandle = void*; #define APC_COMPAT_ERROR_OK 0 #define APC_COMPAT_ERROR_CANCELLED 1 #define APC_COMPAT_ERROR_ABORTED 2 #define APC_COMPAT_ERROR_OPERATION_PENDING 3 #define APC_COMPAT_ERROR_IGNORED 4 #define APC_COMPAT_ERROR_SYSTEM_ERROR 5 extern "C" { extern const ApcCompatServiceHandle INVALID_SERVICE_HANDLE; /** * This struct holds the ui options for the protected confirmation dialog. */ struct ApcCompatUiOptions { /** * If set to true inverted color mode is used. */ bool inverted; /** * If set to true magnified fonts are used. */ bool magnified; }; /** * Represents a result callback that is called when a confirmation session was successfully * started. * The field `data` is an opaque callback context handle. It must be passed to the `result` * function. * * IMPORTANT: The life cycle of `data` ends when `result` is called. The callback must not * be called a second time. * * The callback function `result` has the prototype: * void result( * void* data, * uint32_t rc, * const uint8_t* tbs_message, * size_t tbs_message_size, * const uint8_t* confirmation_token, * size_t confirmation_token_size) * * * data - must be the data field of the structure. * * rc - response code, one of: * * APC_COMPAT_ERROR_OK - The user confirmed the prompt text. * * APC_COMPAT_ERROR_CANCELLED - The user rejected the prompt text. * * APC_COMPAT_ERROR_ABORTED - `abortUserConfirmation` was called. * * APC_COMPAT_ERROR_SYSTEM_ERROR - An unspecified system error occurred. * * tbs_message(_size) - Pointer to and size of the to-be-signed message. Must * be NULL and 0 respectively if `rc != APC_COMPAT_ERROR_OK`. * * confirmation_token(_size) - Pointer to and size of the confirmation token. Must * be NULL and 0 respectively if `rc != APC_COMPAT_ERROR_OK`. */ struct ApcCompatCallback { void* data; void (*result)(void*, uint32_t, const uint8_t*, size_t, const uint8_t*, size_t); }; /** * Attempts to make a connection to the confirmationui HIDL backend. * If a valid service handle is returned it stays valid until * `closeUserConfirmationService` is called. * * @return A valid service handle on success or INVALID_SERVICE_HANDLE * on failure. */ ApcCompatServiceHandle tryGetUserConfirmationService(); /** * Attempts to start a protected confirmation session on the given service handle. * The function takes ownership of the callback object (`cb`) IFF APC_COMPAT_ERROR_OK * is returned. The resources referenced by the callback object must stay valid * until the callback is called. * * @param handle A valid service handle as returned by `tryGetUserConfirmationService()`. * @cb A ApcCompatCallback structure that represents a callback function with session data. * @param prompt_text A UTF-8 encoded prompt string. * @param extra_data Free form extra data. * @param extra_data_size size of the extra data buffer in bytes. * @param locale A locale string. * @param ui_options A UI options. See ApcCompatUiOptions above. * @retval APC_COMPAT_ERROR_OK on success. * @retval APC_COMPAT_ERROR_OPERATION_PENDING if another operation was already in progress. * @retval APC_COMPAT_ERROR_SYSTEM_ERROR if an unspecified system error occurred. */ uint32_t promptUserConfirmation(ApcCompatServiceHandle handle, struct ApcCompatCallback cb, const char* prompt_text, const uint8_t* extra_data, size_t extra_data_size, char const* locale, ApcCompatUiOptions ui_options); /** * Aborts a running confirmation session or no-op if no session is running. * If a session is running this results in a `result` callback with * `rc == APC_COMPAT_ERROR_ABORTED`. Mind though that the callback can still yield other * results even after this function was called, because it may race with an actual user * response. In any case, there will be only one callback response for each session * successfully started with promptUserConfirmation. * * @param handle A valid session handle as returned by `tryGetUserConfirmationService()` */ void abortUserConfirmation(ApcCompatServiceHandle handle); /** * Closes a valid service session as returned by `tryGetUserConfirmationService()`. * If a session is still running it is implicitly aborted. In this case, freeing up of the resources * referenced by the service handle is deferred until the callback has completed. * * @param handle A valid session handle as returned by `tryGetUserConfirmationService()` */ void closeUserConfirmationService(ApcCompatServiceHandle); }