pinebuds/services/ble_profiles/gfps/gfps_provider/api/gfps_provider.h

279 lines
7.9 KiB
C
Raw Normal View History

2022-08-15 04:20:27 -05:00
#ifndef GFPSP_H_
#define GFPSP_H_
/**
****************************************************************************************
* @addtogroup GFPSP google fast pair s
* @ingroup DIS
* @brief Device Information Service Server
* @{
****************************************************************************************
*/
/*
* INCLUDE FILES
****************************************************************************************
*/
#include "rwip_config.h"
#if (BLE_GFPS_PROVIDER)
#include "prf_types.h"
#include "prf.h"
/*
* DEFINES
****************************************************************************************
*/
#define RAW_REQ_FLAGS_DISCOVERABILITY_BIT0_EN (1)
#define RAW_REQ_FLAGS_DISCOVERABILITY_BIT0_DIS (0)
#define RAW_REQ_FLAGS_INTBONDING_SEEKERADDR_BIT1_EN (1)
#define RAW_REQ_FLAGS_INTBONDING_SEEKERADDR_BIT1_DIS (0)
#define GFPSP_KEY_BASED_PAIRING_REQ_LEN_WITH_PUBLIC_KEY (80)
#define GFPSP_KEY_BASED_PAIRING_REQ_LEN_WITHOUT_PUBLIC_KEY (16)
#define GFPSP_IDX_MAX (BLE_CONNECTION_MAX)
#define GFPSP_ENCRYPTED_RSP_LEN 16
/*
* ENUMERATIONS
****************************************************************************************
*/
/// Possible states of the GFPSP task
enum
{
/// Idle state
GFPSP_IDLE,
/// Busy state
GFPSP_BUSY,
/// Number of defined states.
GFPSP_STATE_MAX
};
/// GFPSP Attributes database handle list
enum gfpsp_att_db_handles
{
GFPSP_IDX_SVC,
GFPSP_IDX_KEY_BASED_PAIRING_CHAR,
GFPSP_IDX_KEY_BASED_PAIRING_VAL,
GFPSP_IDX_KEY_BASED_PAIRING_NTF_CFG,
GFPSP_IDX_PASSKEY_CHAR,
GFPSP_IDX_PASSKEY_VAL,
GFPSP_IDX_PASSKEY_NTF_CFG,
GFPSP_IDX_ACCOUNT_KEY_CHAR,
GFPSP_IDX_ACCOUNT_KEY_VAL,
GFPSP_IDX_ACCOUNT_KEY_CFG,
GFPSP_IDX_NAME_CHAR,
GFPSP_IDX_NAME_VAL,
GFPSP_IDX_NAME_CFG,
GFPSP_IDX_NB,
};
/// Value element
struct gfpsp_val_elmt
{
/// list element header
struct co_list_hdr hdr;
/// value identifier
uint8_t value;
/// value length
uint8_t length;
/// value data
uint8_t data[__ARRAY_EMPTY];
};
///Device Information Service Server Environment Variable
struct gfpsp_env_tag
{
/// profile environment
prf_env_t prf_env;
/// List of values set by application
struct co_list values;
/// Service Attribute Start Handle
uint16_t start_hdl;
/// Services features
uint16_t features;
/// Last requested value
uint8_t req_val;
/// Last connection index which request value
uint8_t req_conidx;
/// GFPSP task state
ke_state_t state[GFPSP_IDX_MAX];
};
typedef struct _gfpsp_encrypted_req_uint128{
uint8_t uint128_array[16];
}gfpsp_encrypted_req_uint128;
typedef struct _gfpsp_64B_public_key_{
uint8_t public_key_64B[64];
}gfpsp_64B_public_key;
typedef enum
{
KEY_BASED_PAIRING_REQ = 0x00,
KEY_BASED_PAIRING_RSP = 0x01,
ACTION_REQUEST = 0x10,
} GFPS_MESSAGE_TYPE_E;
typedef struct {
uint8_t message_type;
uint8_t reserved[15];
} gfpsp_raw_req_t;
typedef struct {
uint8_t message_type; // KEY_BASED_PAIRING_REQ
uint8_t flags_reserved : 4;
uint8_t flags_retroactively_write_account_key : 1;
uint8_t flags_get_existing_name : 1;
uint8_t flags_bonding_addr : 1;
uint8_t flags_discoverability : 1;
uint8_t provider_addr[6];
uint8_t seeker_addr[6];
uint8_t reserved[2];
} gfpsp_key_based_pairing_req_t;
typedef struct {
uint8_t message_type; // ACTION_REQUEST
uint8_t flags_reserved : 6;
uint8_t isFollowedByAdditionalDataCh : 1;
uint8_t isDeviceAction : 1;
uint8_t provider_addr[6];
uint8_t messageGroup; // Mandatory if Flags Bit 1 is set.
uint8_t messageCode; // Mandatory if Flags Bit 1 is set.
uint8_t additionalDataLen; // Mandatory if Flags Bit 1 is set. Less than 6
uint8_t additionalData[6]; // Mandatory if Flags Bit 1 is set.
} gfpsp_action_req_t;
typedef struct {
uint8_t message_type; // KEY_BASED_PAIRING_RSP
uint8_t provider_addr[6];
uint8_t salt[9];
}gfpsp_raw_resp;
typedef struct _gfpsp_raw_passkey_resp{
uint8_t message_type;
uint8_t passkey[3];
uint8_t reserved[12];
}gfpsp_raw_pass_key_resp;
typedef struct _gfpsp_encrypted_resp{
uint8_t uint128_array[GFPSP_ENCRYPTED_RSP_LEN];
}gfpsp_encrypted_resp;
typedef struct _gfpsp_req_resp{
union{
gfpsp_raw_req_t raw_req;
gfpsp_encrypted_req_uint128 en_req;
gfpsp_key_based_pairing_req_t key_based_pairing_req;
gfpsp_action_req_t action_req;
gfpsp_raw_resp key_based_pairing_rsp;
gfpsp_encrypted_resp en_rsp;
}rx_tx;
}gfpsp_req_resp;
typedef struct _gfpsp_Key_based_Pairing_req{
gfpsp_encrypted_req_uint128 * en_req;
gfpsp_64B_public_key * pub_key;
}gfpsp_Key_based_Pairing_req;
/*
* GLOBAL VARIABLE DECLARATIONS
****************************************************************************************
*/
/*
* FUNCTION DECLARATIONS
****************************************************************************************
*/
/**
****************************************************************************************
* @brief Retrieve DIS service profile interface
*
* @return DIS service profile interface
****************************************************************************************
*/
const struct prf_task_cbs* gfpsp_prf_itf_get(void);
/**
****************************************************************************************
* @brief Check if an attribute shall be added or not in the database
*
* @param features DIS features
*
* @return Feature config flag
****************************************************************************************
*/
uint32_t gfpsp_compute_cfg_flag(uint16_t features);
/**
****************************************************************************************
* @brief Check if the provided value length matches characteristic requirements
* @param char_code Characteristic Code
* @param val_len Length of the Characteristic value
*
* @return status if value length is ok or not
****************************************************************************************
*/
uint8_t gfpsp_check_val_len(uint8_t char_code, uint8_t val_len);
/**
****************************************************************************************
* @brief Retrieve handle attribute from value
*
* @param[in] env Service environment variable
* @param[in] value Value to search
*
* @return Handle attribute from value
****************************************************************************************
*/
uint16_t gfpsp_value_to_handle(struct gfpsp_env_tag* env, uint8_t value);
/**
****************************************************************************************
* @brief Retrieve value from attribute handle
*
* @param[in] env Service environment variable
* @param[in] handle Attribute handle to search
*
* @return Value from attribute handle
****************************************************************************************
*/
uint8_t gfpsp_handle_to_value(struct gfpsp_env_tag* env, uint16_t handle);
/*
* TASK DESCRIPTOR DECLARATIONS
****************************************************************************************
*/
/**
****************************************************************************************
* Initialize task handler
*
* @param task_desc Task descriptor to fill
****************************************************************************************
*/
void gfpsp_task_init(struct ke_task_desc *task_desc);
uint32_t gfpsp_crypto_gen_DHKey(const uint8_t *in_PubKey,const uint8_t *in_PrivateKey,uint8_t *out_DHKey);
uint32_t gfpsp_crypto_make_P256_key(uint8_t * out_public_key,uint8_t * out_private_key);
#endif //BLE_GFPSP_SERVER
/// @} GFPSP
#endif // GFPSP_H_