#ifndef __U2FHID_CAPI
#define __U2FHID_CAPI
#include <stdlib.h>
#include "nsString.h"
extern "C" {
const uint8_t U2F_RESBUF_ID_REGISTRATION = 0;
const uint8_t U2F_RESBUF_ID_KEYHANDLE = 1;
const uint8_t U2F_RESBUF_ID_SIGNATURE = 2;
const uint8_t U2F_RESBUF_ID_APPID = 3;
const uint8_t U2F_RESBUF_ID_VENDOR_NAME = 4;
const uint8_t U2F_RESBUF_ID_DEVICE_NAME = 5;
const uint8_t U2F_RESBUF_ID_FIRMWARE_MAJOR = 6;
const uint8_t U2F_RESBUF_ID_FIRMWARE_MINOR = 7;
const uint8_t U2F_RESBUF_ID_FIRMWARE_BUILD = 8;
const uint64_t U2F_FLAG_REQUIRE_RESIDENT_KEY = 1;
const uint64_t U2F_FLAG_REQUIRE_USER_VERIFICATION = 2;
const uint64_t U2F_FLAG_REQUIRE_PLATFORM_ATTACHMENT = 4;
const uint8_t U2F_AUTHENTICATOR_TRANSPORT_USB = 1;
const uint8_t U2F_AUTHENTICATOR_TRANSPORT_NFC = 2;
const uint8_t U2F_AUTHENTICATOR_TRANSPORT_BLE = 4;
const uint8_t CTAP_AUTHENTICATOR_TRANSPORT_INTERNAL = 8;
const uint8_t U2F_OK = 0;
const uint8_t U2F_ERROR_UKNOWN = 1;
const uint8_t U2F_ERROR_NOT_SUPPORTED = 2;
const uint8_t U2F_ERROR_INVALID_STATE = 3;
const uint8_t U2F_ERROR_CONSTRAINT = 4;
const uint8_t U2F_ERROR_NOT_ALLOWED = 5;
const uint8_t CTAP_ERROR_PIN_REQUIRED = 6;
const uint8_t CTAP_ERROR_PIN_INVALID = 7;
const uint8_t CTAP_ERROR_PIN_AUTH_BLOCKED = 8;
const uint8_t CTAP_ERROR_PIN_BLOCKED = 9;
struct rust_ctap_manager;
struct rust_u2f_app_ids;
struct rust_u2f_key_handles;
struct rust_u2f_result;
typedef void (*rust_u2f_callback)(uint64_t, rust_u2f_result*);
rust_ctap_manager* rust_u2f_mgr_new();
void rust_u2f_mgr_free(rust_ctap_manager* mgr);
uint64_t rust_u2f_mgr_register(rust_ctap_manager* mgr, uint64_t flags,
uint64_t timeout, rust_u2f_callback,
const uint8_t* challenge_ptr,
size_t challenge_len,
const uint8_t* application_ptr,
size_t application_len,
const rust_u2f_key_handles* khs);
uint64_t rust_u2f_mgr_sign(rust_ctap_manager* mgr, uint64_t flags,
uint64_t timeout, rust_u2f_callback,
const uint8_t* challenge_ptr, size_t challenge_len,
const rust_u2f_app_ids* app_ids,
const rust_u2f_key_handles* khs);
void rust_u2f_mgr_cancel(rust_ctap_manager* mgr);
rust_u2f_app_ids* rust_u2f_app_ids_new();
void rust_u2f_app_ids_add(rust_u2f_app_ids* ids, const uint8_t* id,
size_t id_len);
void rust_u2f_app_ids_free(rust_u2f_app_ids* ids);
rust_u2f_key_handles* rust_u2f_khs_new();
void rust_u2f_khs_add(rust_u2f_key_handles* khs, const uint8_t* key_handle,
size_t key_handle_len, uint8_t transports);
void rust_u2f_khs_free(rust_u2f_key_handles* khs);
uint8_t rust_u2f_result_error(const rust_u2f_result* res);
bool rust_u2f_resbuf_length(const rust_u2f_result* res, uint8_t bid,
size_t* len);
bool rust_u2f_resbuf_contains(const rust_u2f_result* res, uint8_t bid);
bool rust_u2f_resbuf_copy(const rust_u2f_result* res, uint8_t bid,
uint8_t* dst);
void rust_u2f_res_free(rust_u2f_result* res);
}
#endif