#ifndef __CTAP2_CAPI
#define __CTAP2_CAPI
#include <stdlib.h>
#include "nsString.h"
extern "C" {
const uint8_t CTAP2_SIGN_RESULT_PUBKEY_CRED_ID = 1;
const uint8_t CTAP2_SIGN_RESULT_AUTH_DATA = 2;
const uint8_t CTAP2_SIGN_RESULT_SIGNATURE = 3;
const uint8_t CTAP2_SIGN_RESULT_USER_ID = 4;
const uint8_t CTAP2_SIGN_RESULT_USER_NAME = 5;
typedef struct {
const uint8_t *id_ptr;
size_t id_len;
const char *name;
} AuthenticatorArgsUser;
typedef struct {
const uint8_t *ptr;
size_t len;
} AuthenticatorArgsChallenge;
typedef struct {
const int32_t *ptr;
size_t len;
} AuthenticatorArgsPubCred;
typedef struct {
bool resident_key;
bool user_verification;
bool user_presence;
bool force_none_attestation;
} AuthenticatorArgsOptions;
struct rust_ctap2_pub_key_cred_descriptors;
rust_ctap2_pub_key_cred_descriptors* rust_ctap2_pkcd_new();
void rust_ctap2_pkcd_add(rust_ctap2_pub_key_cred_descriptors* pkcd, const uint8_t* id_ptr,
size_t id_len, uint8_t transports);
void rust_ctap2_pkcd_free(rust_ctap2_pub_key_cred_descriptors* khs);
struct rust_ctap2_register_result;
struct rust_ctap2_sign_result;
typedef void (*rust_ctap2_register_callback)(uint64_t, rust_ctap2_register_result*);
typedef void (*rust_ctap2_sign_callback)(uint64_t, rust_ctap2_sign_result*);
struct rust_ctap2_status_update_res;
typedef void (*rust_ctap2_status_update_callback)(rust_ctap2_status_update_res*);
rust_ctap_manager* rust_ctap2_mgr_new();
void rust_ctap2_mgr_free(rust_ctap_manager* mgr);
void rust_ctap2_register_res_free(rust_ctap2_register_result* res);
void rust_ctap2_sign_res_free(rust_ctap2_sign_result* res);
uint64_t rust_ctap2_mgr_register(
rust_ctap_manager* mgr, uint64_t timeout, rust_ctap2_register_callback, rust_ctap2_status_update_callback,
AuthenticatorArgsChallenge challenge,
const char* relying_party_id, const char *origin_ptr,
AuthenticatorArgsUser user, AuthenticatorArgsPubCred pub_cred_params,
const rust_ctap2_pub_key_cred_descriptors* exclude_list, AuthenticatorArgsOptions options,
const char *pin
);
uint64_t rust_ctap2_mgr_sign(
rust_ctap_manager* mgr, uint64_t timeout, rust_ctap2_sign_callback, rust_ctap2_status_update_callback,
AuthenticatorArgsChallenge challenge,
const char* relying_party_id, const char *origin_ptr,
const rust_ctap2_pub_key_cred_descriptors* allow_list, AuthenticatorArgsOptions options,
const char *pin
);
void rust_ctap2_mgr_cancel(rust_ctap_manager* mgr);
uint8_t rust_ctap2_register_result_error(const rust_ctap2_register_result* res);
uint8_t rust_ctap2_sign_result_error(const rust_ctap2_sign_result* res);
bool rust_ctap2_register_result_client_data_len(
const rust_ctap2_register_result *res,
size_t *len
);
bool rust_ctap2_register_result_client_data_copy(
const rust_ctap2_register_result *res,
const char *dst
);
bool rust_ctap2_register_result_attestation_len(
const rust_ctap2_register_result *res,
size_t *len
);
bool rust_ctap2_register_result_attestation_copy(
const rust_ctap2_register_result* res,
uint8_t *dst
);
bool rust_ctap2_register_result_credential_id_len(
const rust_ctap2_register_result *res,
size_t *len
);
bool rust_ctap2_register_result_credential_id_copy(
const rust_ctap2_register_result* res,
uint8_t *dst
);
bool rust_ctap2_sign_result_client_data_len(
const rust_ctap2_sign_result *res,
size_t *len
);
bool rust_ctap2_sign_result_client_data_copy(
const rust_ctap2_sign_result *res,
const char *dst
);
bool rust_ctap2_sign_result_assertions_len(
const rust_ctap2_sign_result *res,
size_t *len
);
bool rust_ctap2_sign_result_item_contains(
const rust_ctap2_sign_result *res,
size_t assertion_idx,
uint8_t item_idx
);
bool rust_ctap2_sign_result_item_len(
const rust_ctap2_sign_result *res,
size_t assertion_idx,
uint8_t item_idx,
size_t *len
);
bool rust_ctap2_sign_result_item_copy(
const rust_ctap2_sign_result* res,
size_t assertion_idx,
uint8_t item_idx,
uint8_t *dst
);
bool rust_ctap2_sign_result_contains_username(
const rust_ctap2_sign_result *res,
size_t assertion_idx
);
bool rust_ctap2_sign_result_username_len(
const rust_ctap2_sign_result *res,
size_t assertion_idx,
size_t *len
);
bool rust_ctap2_sign_result_username_copy(
const rust_ctap2_sign_result* res,
size_t assertion_idx,
const char *dst
);
bool rust_ctap2_status_update_len(
const rust_ctap2_status_update_res *res,
size_t *len
);
bool rust_ctap2_status_update_copy_json(
const rust_ctap2_status_update_res *res,
const char *dst
);
bool rust_ctap2_status_update_send_pin(
const rust_ctap2_status_update_res *res,
const char *pin
);
bool rust_ctap2_destroy_status_update_res(
rust_ctap2_status_update_res *res
);
}
#endif