#ifndef FIDO_APDU_H
#define FIDO_APDU_H

#include "sec_apdu.h"

typedef uint16_t FIDOSTATUS;

#define FIDOSTATUS_SUCCESS                           0x0000
#define FIDOSTATUS_FAILED                            0x0001
#define FIDOSTATUS_ESE_FAILED                        0x0002
#define FIDOSTATUS_SPI_OPEN_FAILED                        0x0003
#define FIDOSTATUS_SPI_CLOSE_FAILED                        0x0004
#define FIDOSTATUS_APPLET_SELECT_FAILED             0x0005
#define FIDOSTATUS_INVALID_ARGUMENTS             0x0006 // Returned when more than one arguments are invalid

#define FIDOSTATUS_INVALID_TOKEN                0x0010
#define FIDOSTATUS_INVALID_USERNAME             0x0011
#define FIDOSTATUS_INVALID_APPID                0x0012
#define FIDOSTATUS_INVALID_AAID                 0x0013
#define FIDOSTATUS_INVALID_ATT_TYPE             0x0014
#define FIDOSTATUS_INVALID_KEYID                  0x0015
#define FIDOSTATUS_INVALID_AUTH_MODE            0x0016
#define FIDOSTATUS_INVALID_CHALLENGE_HASH       0x0017
#define FIDOSTATUS_INVALID_TC_HASH              0x0018
#define FIDOSTATUS_INVALID_NONCE                0x0019
#define FIDOSTATUS_INVALID_SIGNALGO                0x0020
#define FIDOSTATUS_INVALID_PUBKALGO                0x0021

#define FIDOSTATUS_WRONG_LENGTH                0x0030
#define FIDOSTATUS_WRONG_TOKEN_LEN                0x0031
#define FIDOSTATUS_WRONG_USERNAME_LEN            0x0032
#define FIDOSTATUS_WRONG_APPID_LEN                0x0033
#define FIDOSTATUS_WRONG_AAID_LEN                 0x0034
#define FIDOSTATUS_WRONG_CHALLENGE_HASH_LEN       0x0035
#define FIDOSTATUS_WRONG_TC_HASH_LEN              0x0036
#define FIDOSTATUS_WRONG_NONCE_LEN                0x0037

FIDOSTATUS fido_spi_open();
FIDOSTATUS fido_spi_close();

FIDOSTATUS fido_get_AAID(uint8_t* p_out_aaid1, uint16_t* p_out_aaid1_len, uint8_t* p_out_aaid2, uint16_t* p_out_aaid2_len);

FIDOSTATUS fido_register (uint8_t* p_in_aaid, uint16_t in_aaid_len,
                        uint8_t* p_in_appid, uint16_t in_appid_len,
						uint8_t* p_in_finalchallengehash, uint16_t in_finalchallengehash_len,
						uint8_t* p_in_username, uint8_t in_username_len,
						uint8_t* p_in_attestationtype,  uint16_t in_attestationtype_len,
						uint8_t* p_in_keyhandleaccesstoken, uint16_t in_keyhandleaccesstoken_len,
						/*uint16_t in_authenticatorversion,*/ uint16_t in_signalgandencoding, uint16_t in_publickeyalgandencoding,
						uint8_t* p_out_tlvregisterresponse, uint16_t* p_out_tlvregisterresponse_len);
FIDOSTATUS fido_sign (uint8_t* p_in_aaid, uint16_t in_aaid_len,
					uint8_t* p_in_appid, uint16_t in_appid_len,
					uint8_t* p_in_finalchallengehash, uint16_t in_finalchallengehash_len,
					uint8_t* p_in_transactioncontenthash, uint16_t in_transactioncontenthash_len,
					uint8_t* p_in_keyhandleaccesstoken , uint16_t in_keyhandleaccesstoken_len,
					uint8_t* p_in_keyid , uint16_t in_keyid_len,
					uint8_t in_authenticationmode, uint16_t in_signalgandencoding,
					uint8_t* p_in_authenticatornonce , uint16_t in_authenticatornonce_len,
					uint8_t* p_out_tlvsignresponse, uint16_t* p_out_tlvsignresponse_len);
						
FIDOSTATUS fido_deregister (uint8_t* p_in_appid, uint16_t in_appid_len,
						uint8_t* p_in_keyid, uint16_t in_keyid_len,
						uint8_t* p_in_keyhandleaccesstoken, uint16_t in_keyhandleaccesstoken_len,
						uint8_t* p_out_tlvderegisterresponse, uint16_t* p_out_tlvderegisterresponse_len);

#endif /* FIDO_APDU_H */