You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
5.3 KiB

/*
* 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 <stddef.h>
#include <stdint.h>
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);
}