/* Bluetooth Mesh */ /* * Copyright (c) 2017 Intel Corporation * Copyright (c) 2020 Lingao Meng * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_SUBSYS_BLUETOOTH_MESH_PROV_H_ #define ZEPHYR_SUBSYS_BLUETOOTH_MESH_PROV_H_ #include "prov_bearer.h" #define PROV_ERR_NONE 0x00 #define PROV_ERR_NVAL_PDU 0x01 #define PROV_ERR_NVAL_FMT 0x02 #define PROV_ERR_UNEXP_PDU 0x03 #define PROV_ERR_CFM_FAILED 0x04 #define PROV_ERR_RESOURCES 0x05 #define PROV_ERR_DECRYPT 0x06 #define PROV_ERR_UNEXP_ERR 0x07 #define PROV_ERR_ADDR 0x08 #define AUTH_METHOD_NO_OOB 0x00 #define AUTH_METHOD_STATIC 0x01 #define AUTH_METHOD_OUTPUT 0x02 #define AUTH_METHOD_INPUT 0x03 #define OUTPUT_OOB_BLINK 0x00 #define OUTPUT_OOB_BEEP 0x01 #define OUTPUT_OOB_VIBRATE 0x02 #define OUTPUT_OOB_NUMBER 0x03 #define OUTPUT_OOB_STRING 0x04 #define INPUT_OOB_PUSH 0x00 #define INPUT_OOB_TWIST 0x01 #define INPUT_OOB_NUMBER 0x02 #define INPUT_OOB_STRING 0x03 #define PUB_KEY_NO_OOB 0x00 #define PUB_KEY_OOB 0x01 #define PROV_INVITE 0x00 #define PROV_CAPABILITIES 0x01 #define PROV_START 0x02 #define PROV_PUB_KEY 0x03 #define PROV_INPUT_COMPLETE 0x04 #define PROV_CONFIRM 0x05 #define PROV_RANDOM 0x06 #define PROV_DATA 0x07 #define PROV_COMPLETE 0x08 #define PROV_FAILED 0x09 #define PROV_NO_PDU 0xff #define PROV_ALG_P256 0x00 #define PROV_BUF(name, len) \ NET_BUF_SIMPLE_DEFINE(name, PROV_BEARER_BUF_HEADROOM + len) enum { WAIT_PUB_KEY, /* Waiting for local PubKey to be generated */ LINK_ACTIVE, /* Link has been opened */ WAIT_NUMBER, /* Waiting for number input from user */ WAIT_STRING, /* Waiting for string input from user */ NOTIFY_INPUT_COMPLETE, /* Notify that input has been completed. */ PROVISIONER, /* The link was opened as provisioner */ OOB_PUB_KEY, /* OOB Public key used */ PUB_KEY_SENT, /* Public key has been sent */ REMOTE_PUB_KEY, /* Remote key has been received */ INPUT_COMPLETE, /* Device input completed */ WAIT_CONFIRM, /* Wait for send confirm */ WAIT_AUTH, /* Wait for auth response */ OOB_STATIC_KEY, /* OOB Static Authentication */ NUM_FLAGS, }; /** Provisioning role */ struct bt_mesh_prov_role { void (*link_opened)(void); void (*link_closed)(void); void (*error)(uint8_t reason); void (*input_complete)(void); void (*op[10])(const uint8_t *data); }; struct bt_mesh_prov_link { ATOMIC_DEFINE(flags, NUM_FLAGS); const struct prov_bearer *bearer; const struct bt_mesh_prov_role *role; uint8_t oob_method; /* Authen method */ uint8_t oob_action; /* Authen action */ uint8_t oob_size; /* Authen size */ uint8_t auth[16]; /* Authen value */ uint8_t dhkey[32]; /* Calculated DHKey */ uint8_t expect; /* Next expected PDU */ uint8_t conf[16]; /* Remote Confirmation */ uint8_t rand[16]; /* Local Random */ uint8_t conf_salt[16]; /* ConfirmationSalt */ uint8_t conf_key[16]; /* ConfirmationKey */ uint8_t conf_inputs[145]; /* ConfirmationInputs */ uint8_t prov_salt[16]; /* Provisioning Salt */ }; extern struct bt_mesh_prov_link bt_mesh_prov_link; extern const struct bt_mesh_prov *bt_mesh_prov; static inline int bt_mesh_prov_send(struct net_buf_simple *buf, prov_bearer_send_complete_t cb) { return bt_mesh_prov_link.bearer->send(buf, cb, NULL); } static inline void bt_mesh_prov_buf_init(struct net_buf_simple *buf, uint8_t type) { net_buf_simple_reserve(buf, PROV_BEARER_BUF_HEADROOM); net_buf_simple_add_u8(buf, type); } int bt_mesh_prov_reset_state(void (*func)(const uint8_t key[64])); bool bt_mesh_prov_active(void); int bt_mesh_prov_auth(uint8_t method, uint8_t action, uint8_t size); int bt_mesh_pb_gatt_open(struct bt_conn *conn); int bt_mesh_pb_gatt_close(struct bt_conn *conn); int bt_mesh_pb_gatt_recv(struct bt_conn *conn, struct net_buf_simple *buf); const struct bt_mesh_prov *bt_mesh_prov_get(void); void bt_mesh_prov_complete(uint16_t net_idx, uint16_t addr); void bt_mesh_prov_reset(void); const struct prov_bearer_cb *bt_mesh_prov_bearer_cb_get(void); void bt_mesh_pb_adv_recv(struct net_buf_simple *buf); int bt_mesh_prov_init(const struct bt_mesh_prov *prov); #endif /* ZEPHYR_SUBSYS_BLUETOOTH_MESH_PROV_H_ */