279 lines
7.9 KiB
C
279 lines
7.9 KiB
C
|
#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_
|