1*042d53a7SEvalZero /* 2*042d53a7SEvalZero * Licensed to the Apache Software Foundation (ASF) under one 3*042d53a7SEvalZero * or more contributor license agreements. See the NOTICE file 4*042d53a7SEvalZero * distributed with this work for additional information 5*042d53a7SEvalZero * regarding copyright ownership. The ASF licenses this file 6*042d53a7SEvalZero * to you under the Apache License, Version 2.0 (the 7*042d53a7SEvalZero * "License"); you may not use this file except in compliance 8*042d53a7SEvalZero * with the License. You may obtain a copy of the License at 9*042d53a7SEvalZero * 10*042d53a7SEvalZero * http://www.apache.org/licenses/LICENSE-2.0 11*042d53a7SEvalZero * 12*042d53a7SEvalZero * Unless required by applicable law or agreed to in writing, 13*042d53a7SEvalZero * software distributed under the License is distributed on an 14*042d53a7SEvalZero * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15*042d53a7SEvalZero * KIND, either express or implied. See the License for the 16*042d53a7SEvalZero * specific language governing permissions and limitations 17*042d53a7SEvalZero * under the License. 18*042d53a7SEvalZero */ 19*042d53a7SEvalZero 20*042d53a7SEvalZero #ifndef H_BLE_SM_PRIV_ 21*042d53a7SEvalZero #define H_BLE_SM_PRIV_ 22*042d53a7SEvalZero 23*042d53a7SEvalZero #include <inttypes.h> 24*042d53a7SEvalZero #include "syscfg/syscfg.h" 25*042d53a7SEvalZero #include "os/queue.h" 26*042d53a7SEvalZero #include "nimble/nimble_opt.h" 27*042d53a7SEvalZero 28*042d53a7SEvalZero #ifdef __cplusplus 29*042d53a7SEvalZero extern "C" { 30*042d53a7SEvalZero #endif 31*042d53a7SEvalZero 32*042d53a7SEvalZero struct ble_gap_sec_state; 33*042d53a7SEvalZero struct hci_le_lt_key_req; 34*042d53a7SEvalZero struct hci_encrypt_change; 35*042d53a7SEvalZero 36*042d53a7SEvalZero #define BLE_SM_MTU 65 37*042d53a7SEvalZero 38*042d53a7SEvalZero #define BLE_SM_OP_PAIR_REQ 0x01 39*042d53a7SEvalZero #define BLE_SM_OP_PAIR_RSP 0x02 40*042d53a7SEvalZero #define BLE_SM_OP_PAIR_CONFIRM 0x03 41*042d53a7SEvalZero #define BLE_SM_OP_PAIR_RANDOM 0x04 42*042d53a7SEvalZero #define BLE_SM_OP_PAIR_FAIL 0x05 43*042d53a7SEvalZero #define BLE_SM_OP_ENC_INFO 0x06 44*042d53a7SEvalZero #define BLE_SM_OP_MASTER_ID 0x07 45*042d53a7SEvalZero #define BLE_SM_OP_IDENTITY_INFO 0x08 46*042d53a7SEvalZero #define BLE_SM_OP_IDENTITY_ADDR_INFO 0x09 47*042d53a7SEvalZero #define BLE_SM_OP_SIGN_INFO 0x0a 48*042d53a7SEvalZero #define BLE_SM_OP_SEC_REQ 0x0b 49*042d53a7SEvalZero #define BLE_SM_OP_PAIR_PUBLIC_KEY 0x0c 50*042d53a7SEvalZero #define BLE_SM_OP_PAIR_DHKEY_CHECK 0x0d 51*042d53a7SEvalZero #define BLE_SM_OP_PAIR_KEYPRESS_NOTIFY 0x0e 52*042d53a7SEvalZero 53*042d53a7SEvalZero struct ble_sm_hdr { 54*042d53a7SEvalZero uint8_t opcode; 55*042d53a7SEvalZero uint8_t data[0]; 56*042d53a7SEvalZero } __attribute__((packed)); 57*042d53a7SEvalZero 58*042d53a7SEvalZero /** 59*042d53a7SEvalZero * | Parameter | Size (octets) | 60*042d53a7SEvalZero * +------------------------------------+-------------------+ 61*042d53a7SEvalZero * | (Code=0x01/0x02 [req/rsp]) | 1 | 62*042d53a7SEvalZero * | IO Capability | 1 | 63*042d53a7SEvalZero * | OOB data flag | 1 | 64*042d53a7SEvalZero * | AuthReq | 1 | 65*042d53a7SEvalZero * | Maximum Encryption Key Size | 1 | 66*042d53a7SEvalZero * | Initiator Key Distribution | 1 | 67*042d53a7SEvalZero * | Responder Key Distribution | 1 | 68*042d53a7SEvalZero */ 69*042d53a7SEvalZero 70*042d53a7SEvalZero struct ble_sm_pair_cmd { 71*042d53a7SEvalZero uint8_t io_cap; 72*042d53a7SEvalZero uint8_t oob_data_flag; 73*042d53a7SEvalZero uint8_t authreq; 74*042d53a7SEvalZero uint8_t max_enc_key_size; 75*042d53a7SEvalZero uint8_t init_key_dist; 76*042d53a7SEvalZero uint8_t resp_key_dist; 77*042d53a7SEvalZero } __attribute__((packed)); 78*042d53a7SEvalZero 79*042d53a7SEvalZero /** 80*042d53a7SEvalZero * | Parameter | Size (octets) | 81*042d53a7SEvalZero * +------------------------------------+-------------------+ 82*042d53a7SEvalZero * | (Code=0x03) | 1 | 83*042d53a7SEvalZero * | Confirm Value | 16 | 84*042d53a7SEvalZero */ 85*042d53a7SEvalZero 86*042d53a7SEvalZero struct ble_sm_pair_confirm { 87*042d53a7SEvalZero uint8_t value[16]; 88*042d53a7SEvalZero } __attribute__((packed)); 89*042d53a7SEvalZero 90*042d53a7SEvalZero /** 91*042d53a7SEvalZero * | Parameter | Size (octets) | 92*042d53a7SEvalZero * +------------------------------------+-------------------+ 93*042d53a7SEvalZero * | (Code=0x04) | 1 | 94*042d53a7SEvalZero * | Random Value | 16 | 95*042d53a7SEvalZero */ 96*042d53a7SEvalZero struct ble_sm_pair_random { 97*042d53a7SEvalZero uint8_t value[16]; 98*042d53a7SEvalZero } __attribute__((packed)); 99*042d53a7SEvalZero 100*042d53a7SEvalZero /** 101*042d53a7SEvalZero * | Parameter | Size (octets) | 102*042d53a7SEvalZero * +------------------------------------+-------------------+ 103*042d53a7SEvalZero * | (Code=0x05) | 1 | 104*042d53a7SEvalZero * | Reason | 1 | 105*042d53a7SEvalZero */ 106*042d53a7SEvalZero struct ble_sm_pair_fail { 107*042d53a7SEvalZero uint8_t reason; 108*042d53a7SEvalZero } __attribute__((packed)); 109*042d53a7SEvalZero 110*042d53a7SEvalZero /** 111*042d53a7SEvalZero * | Parameter | Size (octets) | 112*042d53a7SEvalZero * +------------------------------------+-------------------+ 113*042d53a7SEvalZero * | (Code=0x06) | 1 | 114*042d53a7SEvalZero * | ltk | 16 | 115*042d53a7SEvalZero */ 116*042d53a7SEvalZero struct ble_sm_enc_info { 117*042d53a7SEvalZero uint8_t ltk[16]; 118*042d53a7SEvalZero } __attribute__((packed)); 119*042d53a7SEvalZero 120*042d53a7SEvalZero /** 121*042d53a7SEvalZero * | Parameter | Size (octets) | 122*042d53a7SEvalZero * +------------------------------------+-------------------+ 123*042d53a7SEvalZero * | (Code=0x07) | 1 | 124*042d53a7SEvalZero * | EDIV | 2 | 125*042d53a7SEvalZero * | RAND | 8 | 126*042d53a7SEvalZero */ 127*042d53a7SEvalZero struct ble_sm_master_id { 128*042d53a7SEvalZero uint16_t ediv; 129*042d53a7SEvalZero uint64_t rand_val; 130*042d53a7SEvalZero } __attribute__((packed)); 131*042d53a7SEvalZero 132*042d53a7SEvalZero /** 133*042d53a7SEvalZero * | Parameter | Size (octets) | 134*042d53a7SEvalZero * +------------------------------------+-------------------+ 135*042d53a7SEvalZero * | (Code=0x08) | 1 | 136*042d53a7SEvalZero * | irk | 16 | 137*042d53a7SEvalZero */ 138*042d53a7SEvalZero struct ble_sm_id_info { 139*042d53a7SEvalZero uint8_t irk[16]; 140*042d53a7SEvalZero } __attribute__((packed)); 141*042d53a7SEvalZero 142*042d53a7SEvalZero /** 143*042d53a7SEvalZero * | Parameter | Size (octets) | 144*042d53a7SEvalZero * +------------------------------------+-------------------+ 145*042d53a7SEvalZero * | (Code=0x09) | 1 | 146*042d53a7SEvalZero * | addr_type | 1 | 147*042d53a7SEvalZero * | address | 6 | 148*042d53a7SEvalZero */ 149*042d53a7SEvalZero struct ble_sm_id_addr_info { 150*042d53a7SEvalZero uint8_t addr_type; 151*042d53a7SEvalZero uint8_t bd_addr[6]; 152*042d53a7SEvalZero } __attribute__((packed)); 153*042d53a7SEvalZero 154*042d53a7SEvalZero /** 155*042d53a7SEvalZero * | Parameter | Size (octets) | 156*042d53a7SEvalZero * +------------------------------------+-------------------+ 157*042d53a7SEvalZero * | (Code=0x0A) | 1 | 158*042d53a7SEvalZero * | csrk | 16 | 159*042d53a7SEvalZero */ 160*042d53a7SEvalZero struct ble_sm_sign_info { 161*042d53a7SEvalZero uint8_t sig_key[16]; 162*042d53a7SEvalZero } __attribute__((packed)); 163*042d53a7SEvalZero 164*042d53a7SEvalZero /** 165*042d53a7SEvalZero * | Parameter | Size (octets) | 166*042d53a7SEvalZero * +------------------------------------+-------------------+ 167*042d53a7SEvalZero * | (Code=0x0B) | 1 | 168*042d53a7SEvalZero * | authreq | 1 | 169*042d53a7SEvalZero */ 170*042d53a7SEvalZero struct ble_sm_sec_req { 171*042d53a7SEvalZero uint8_t authreq; 172*042d53a7SEvalZero } __attribute__((packed)); 173*042d53a7SEvalZero 174*042d53a7SEvalZero /** 175*042d53a7SEvalZero * | Parameter | Size (octets) | 176*042d53a7SEvalZero * +------------------------------------+-------------------+ 177*042d53a7SEvalZero * | (Code=0x0c) | 1 | 178*042d53a7SEvalZero * | Public Key X | 32 | 179*042d53a7SEvalZero * | Public Key Y | 32 | 180*042d53a7SEvalZero */ 181*042d53a7SEvalZero struct ble_sm_public_key { 182*042d53a7SEvalZero uint8_t x[32]; 183*042d53a7SEvalZero uint8_t y[32]; 184*042d53a7SEvalZero } __attribute__((packed)); 185*042d53a7SEvalZero 186*042d53a7SEvalZero /** 187*042d53a7SEvalZero * | Parameter | Size (octets) | 188*042d53a7SEvalZero * +------------------------------------+-------------------+ 189*042d53a7SEvalZero * | (Code=0x0d) | 1 | 190*042d53a7SEvalZero * | DHKey Check | 16 | 191*042d53a7SEvalZero */ 192*042d53a7SEvalZero struct ble_sm_dhkey_check { 193*042d53a7SEvalZero uint8_t value[16]; 194*042d53a7SEvalZero } __attribute__((packed)); 195*042d53a7SEvalZero 196*042d53a7SEvalZero #if NIMBLE_BLE_SM 197*042d53a7SEvalZero 198*042d53a7SEvalZero #define BLE_SM_PROC_STATE_NONE ((uint8_t)-1) 199*042d53a7SEvalZero 200*042d53a7SEvalZero #define BLE_SM_PROC_STATE_PAIR 0 201*042d53a7SEvalZero #define BLE_SM_PROC_STATE_CONFIRM 1 202*042d53a7SEvalZero #define BLE_SM_PROC_STATE_RANDOM 2 203*042d53a7SEvalZero #define BLE_SM_PROC_STATE_LTK_START 3 204*042d53a7SEvalZero #define BLE_SM_PROC_STATE_LTK_RESTORE 4 205*042d53a7SEvalZero #define BLE_SM_PROC_STATE_ENC_START 5 206*042d53a7SEvalZero #define BLE_SM_PROC_STATE_ENC_RESTORE 6 207*042d53a7SEvalZero #define BLE_SM_PROC_STATE_KEY_EXCH 7 208*042d53a7SEvalZero #define BLE_SM_PROC_STATE_SEC_REQ 8 209*042d53a7SEvalZero #define BLE_SM_PROC_STATE_PUBLIC_KEY 9 210*042d53a7SEvalZero #define BLE_SM_PROC_STATE_DHKEY_CHECK 10 211*042d53a7SEvalZero #define BLE_SM_PROC_STATE_CNT 11 212*042d53a7SEvalZero 213*042d53a7SEvalZero #define BLE_SM_PROC_F_INITIATOR 0x01 214*042d53a7SEvalZero #define BLE_SM_PROC_F_IO_INJECTED 0x02 215*042d53a7SEvalZero #define BLE_SM_PROC_F_ADVANCE_ON_IO 0x04 216*042d53a7SEvalZero #define BLE_SM_PROC_F_AUTHENTICATED 0x08 217*042d53a7SEvalZero #define BLE_SM_PROC_F_SC 0x10 218*042d53a7SEvalZero #define BLE_SM_PROC_F_BONDING 0x20 219*042d53a7SEvalZero 220*042d53a7SEvalZero #define BLE_SM_KE_F_ENC_INFO 0x01 221*042d53a7SEvalZero #define BLE_SM_KE_F_MASTER_ID 0x02 222*042d53a7SEvalZero #define BLE_SM_KE_F_ID_INFO 0x04 223*042d53a7SEvalZero #define BLE_SM_KE_F_ADDR_INFO 0x08 224*042d53a7SEvalZero #define BLE_SM_KE_F_SIGN_INFO 0x10 225*042d53a7SEvalZero 226*042d53a7SEvalZero typedef uint8_t ble_sm_proc_flags; 227*042d53a7SEvalZero 228*042d53a7SEvalZero struct ble_sm_keys { 229*042d53a7SEvalZero unsigned ltk_valid:1; 230*042d53a7SEvalZero unsigned ediv_rand_valid:1; 231*042d53a7SEvalZero unsigned irk_valid:1; 232*042d53a7SEvalZero unsigned csrk_valid:1; 233*042d53a7SEvalZero unsigned addr_valid:1; 234*042d53a7SEvalZero uint16_t ediv; 235*042d53a7SEvalZero uint64_t rand_val; 236*042d53a7SEvalZero uint8_t addr_type; 237*042d53a7SEvalZero uint8_t key_size; 238*042d53a7SEvalZero uint8_t ltk[16]; /* Little endian. */ 239*042d53a7SEvalZero uint8_t irk[16]; /* Little endian. */ 240*042d53a7SEvalZero uint8_t csrk[16]; /* Little endian. */ 241*042d53a7SEvalZero uint8_t addr[6]; /* Little endian. */ 242*042d53a7SEvalZero }; 243*042d53a7SEvalZero 244*042d53a7SEvalZero struct ble_sm_proc { 245*042d53a7SEvalZero STAILQ_ENTRY(ble_sm_proc) next; 246*042d53a7SEvalZero 247*042d53a7SEvalZero ble_npl_time_t exp_os_ticks; 248*042d53a7SEvalZero ble_sm_proc_flags flags; 249*042d53a7SEvalZero uint16_t conn_handle; 250*042d53a7SEvalZero uint8_t pair_alg; 251*042d53a7SEvalZero uint8_t state; 252*042d53a7SEvalZero uint8_t rx_key_flags; 253*042d53a7SEvalZero uint8_t key_size; 254*042d53a7SEvalZero 255*042d53a7SEvalZero uint8_t pair_req[sizeof(struct ble_sm_hdr) + sizeof(struct ble_sm_pair_cmd)]; 256*042d53a7SEvalZero uint8_t pair_rsp[sizeof(struct ble_sm_hdr) + sizeof(struct ble_sm_pair_cmd)]; 257*042d53a7SEvalZero uint8_t tk[16]; 258*042d53a7SEvalZero uint8_t confirm_peer[16]; 259*042d53a7SEvalZero uint8_t randm[16]; 260*042d53a7SEvalZero uint8_t rands[16]; 261*042d53a7SEvalZero uint8_t ltk[16]; /* Little endian. */ 262*042d53a7SEvalZero struct ble_sm_keys our_keys; 263*042d53a7SEvalZero struct ble_sm_keys peer_keys; 264*042d53a7SEvalZero 265*042d53a7SEvalZero #if MYNEWT_VAL(BLE_SM_SC) 266*042d53a7SEvalZero /* Secure connections. */ 267*042d53a7SEvalZero uint8_t passkey_bits_exchanged; 268*042d53a7SEvalZero uint8_t ri; 269*042d53a7SEvalZero struct ble_sm_public_key pub_key_peer; 270*042d53a7SEvalZero uint8_t mackey[16]; 271*042d53a7SEvalZero uint8_t dhkey[32]; 272*042d53a7SEvalZero #endif 273*042d53a7SEvalZero }; 274*042d53a7SEvalZero 275*042d53a7SEvalZero struct ble_sm_result { 276*042d53a7SEvalZero int app_status; 277*042d53a7SEvalZero uint8_t sm_err; 278*042d53a7SEvalZero struct ble_gap_passkey_params passkey_params; 279*042d53a7SEvalZero void *state_arg; 280*042d53a7SEvalZero unsigned execute:1; 281*042d53a7SEvalZero unsigned enc_cb:1; 282*042d53a7SEvalZero unsigned persist_keys:1; 283*042d53a7SEvalZero unsigned restore:1; 284*042d53a7SEvalZero }; 285*042d53a7SEvalZero 286*042d53a7SEvalZero #if MYNEWT_VAL(BLE_HS_DEBUG) 287*042d53a7SEvalZero void ble_sm_dbg_set_next_pair_rand(uint8_t *next_pair_rand); 288*042d53a7SEvalZero void ble_sm_dbg_set_next_ediv(uint16_t next_ediv); 289*042d53a7SEvalZero void ble_sm_dbg_set_next_master_id_rand(uint64_t next_master_id_rand); 290*042d53a7SEvalZero void ble_sm_dbg_set_next_ltk(uint8_t *next_ltk); 291*042d53a7SEvalZero void ble_sm_dbg_set_next_csrk(uint8_t *next_csrk); 292*042d53a7SEvalZero void ble_sm_dbg_set_sc_keys(uint8_t *pubkey, uint8_t *privkey); 293*042d53a7SEvalZero #endif 294*042d53a7SEvalZero 295*042d53a7SEvalZero int ble_sm_num_procs(void); 296*042d53a7SEvalZero 297*042d53a7SEvalZero void ble_sm_pair_cmd_log(struct ble_sm_pair_cmd *cmd); 298*042d53a7SEvalZero void ble_sm_pair_confirm_log(struct ble_sm_pair_confirm *cmd); 299*042d53a7SEvalZero void ble_sm_pair_random_log(struct ble_sm_pair_random *cmd); 300*042d53a7SEvalZero void ble_sm_pair_fail_log(struct ble_sm_pair_fail *cmd); 301*042d53a7SEvalZero void ble_sm_enc_info_log(struct ble_sm_enc_info *cmd); 302*042d53a7SEvalZero void ble_sm_master_id_log(struct ble_sm_master_id *cmd); 303*042d53a7SEvalZero void ble_sm_id_info_log(struct ble_sm_id_info *cmd); 304*042d53a7SEvalZero void ble_sm_id_addr_info_log(struct ble_sm_id_addr_info *cmd); 305*042d53a7SEvalZero void ble_sm_sign_info_log(struct ble_sm_sign_info *cmd); 306*042d53a7SEvalZero void ble_sm_sec_req_log(struct ble_sm_sec_req *cmd); 307*042d53a7SEvalZero void ble_sm_public_key_log(struct ble_sm_public_key *cmd); 308*042d53a7SEvalZero void ble_sm_dhkey_check_log(struct ble_sm_dhkey_check *cmd); 309*042d53a7SEvalZero 310*042d53a7SEvalZero int ble_sm_alg_s1(uint8_t *k, uint8_t *r1, uint8_t *r2, uint8_t *out); 311*042d53a7SEvalZero int ble_sm_alg_c1(uint8_t *k, uint8_t *r, 312*042d53a7SEvalZero uint8_t *preq, uint8_t *pres, 313*042d53a7SEvalZero uint8_t iat, uint8_t rat, 314*042d53a7SEvalZero uint8_t *ia, uint8_t *ra, 315*042d53a7SEvalZero uint8_t *out_enc_data); 316*042d53a7SEvalZero int ble_sm_alg_f4(uint8_t *u, uint8_t *v, uint8_t *x, uint8_t z, 317*042d53a7SEvalZero uint8_t *out_enc_data); 318*042d53a7SEvalZero int ble_sm_alg_g2(uint8_t *u, uint8_t *v, uint8_t *x, uint8_t *y, 319*042d53a7SEvalZero uint32_t *passkey); 320*042d53a7SEvalZero int ble_sm_alg_f5(uint8_t *w, uint8_t *n1, uint8_t *n2, uint8_t a1t, 321*042d53a7SEvalZero uint8_t *a1, uint8_t a2t, uint8_t *a2, 322*042d53a7SEvalZero uint8_t *mackey, uint8_t *ltk); 323*042d53a7SEvalZero int ble_sm_alg_f6(const uint8_t *w, const uint8_t *n1, const uint8_t *n2, 324*042d53a7SEvalZero const uint8_t *r, const uint8_t *iocap, uint8_t a1t, 325*042d53a7SEvalZero const uint8_t *a1, uint8_t a2t, const uint8_t *a2, 326*042d53a7SEvalZero uint8_t *check); 327*042d53a7SEvalZero int ble_sm_alg_gen_dhkey(uint8_t *peer_pub_key_x, uint8_t *peer_pub_key_y, 328*042d53a7SEvalZero uint8_t *our_priv_key, uint8_t *out_dhkey); 329*042d53a7SEvalZero int ble_sm_alg_gen_key_pair(uint8_t *pub, uint8_t *priv); 330*042d53a7SEvalZero void ble_sm_alg_ecc_init(void); 331*042d53a7SEvalZero 332*042d53a7SEvalZero void ble_sm_enc_change_rx(struct hci_encrypt_change *evt); 333*042d53a7SEvalZero void ble_sm_enc_key_refresh_rx(struct hci_encrypt_key_refresh *evt); 334*042d53a7SEvalZero int ble_sm_ltk_req_rx(struct hci_le_lt_key_req *evt); 335*042d53a7SEvalZero 336*042d53a7SEvalZero #if MYNEWT_VAL(BLE_SM_LEGACY) 337*042d53a7SEvalZero int ble_sm_lgcy_io_action(struct ble_sm_proc *proc, uint8_t *action); 338*042d53a7SEvalZero void ble_sm_lgcy_confirm_exec(struct ble_sm_proc *proc, 339*042d53a7SEvalZero struct ble_sm_result *res); 340*042d53a7SEvalZero void ble_sm_lgcy_random_exec(struct ble_sm_proc *proc, 341*042d53a7SEvalZero struct ble_sm_result *res); 342*042d53a7SEvalZero void ble_sm_lgcy_random_rx(struct ble_sm_proc *proc, 343*042d53a7SEvalZero struct ble_sm_result *res); 344*042d53a7SEvalZero #else 345*042d53a7SEvalZero #define ble_sm_lgcy_io_action(proc, action) (BLE_HS_ENOTSUP) 346*042d53a7SEvalZero #define ble_sm_lgcy_confirm_exec(proc, res) 347*042d53a7SEvalZero #define ble_sm_lgcy_random_exec(proc, res) 348*042d53a7SEvalZero #define ble_sm_lgcy_random_rx(proc, res) 349*042d53a7SEvalZero #endif 350*042d53a7SEvalZero 351*042d53a7SEvalZero #if MYNEWT_VAL(BLE_SM_SC) 352*042d53a7SEvalZero int ble_sm_sc_io_action(struct ble_sm_proc *proc, uint8_t *action); 353*042d53a7SEvalZero void ble_sm_sc_confirm_exec(struct ble_sm_proc *proc, 354*042d53a7SEvalZero struct ble_sm_result *res); 355*042d53a7SEvalZero void ble_sm_sc_random_exec(struct ble_sm_proc *proc, 356*042d53a7SEvalZero struct ble_sm_result *res); 357*042d53a7SEvalZero void ble_sm_sc_random_rx(struct ble_sm_proc *proc, struct ble_sm_result *res); 358*042d53a7SEvalZero void ble_sm_sc_public_key_exec(struct ble_sm_proc *proc, 359*042d53a7SEvalZero struct ble_sm_result *res, 360*042d53a7SEvalZero void *arg); 361*042d53a7SEvalZero void ble_sm_sc_public_key_rx(uint16_t conn_handle, struct os_mbuf **rxom, 362*042d53a7SEvalZero struct ble_sm_result *res); 363*042d53a7SEvalZero void ble_sm_sc_dhkey_check_exec(struct ble_sm_proc *proc, 364*042d53a7SEvalZero struct ble_sm_result *res, void *arg); 365*042d53a7SEvalZero void ble_sm_sc_dhkey_check_rx(uint16_t conn_handle, struct os_mbuf **rxom, 366*042d53a7SEvalZero struct ble_sm_result *res); 367*042d53a7SEvalZero void ble_sm_sc_init(void); 368*042d53a7SEvalZero #else 369*042d53a7SEvalZero #define ble_sm_sc_io_action(proc, action) (BLE_HS_ENOTSUP) 370*042d53a7SEvalZero #define ble_sm_sc_confirm_exec(proc, res) 371*042d53a7SEvalZero #define ble_sm_sc_random_exec(proc, res) 372*042d53a7SEvalZero #define ble_sm_sc_random_rx(proc, res) 373*042d53a7SEvalZero #define ble_sm_sc_public_key_exec(proc, res, arg) 374*042d53a7SEvalZero #define ble_sm_sc_public_key_rx(conn_handle, op, om, res) 375*042d53a7SEvalZero #define ble_sm_sc_dhkey_check_exec(proc, res, arg) 376*042d53a7SEvalZero #define ble_sm_sc_dhkey_check_rx(conn_handle, op, om, res) 377*042d53a7SEvalZero #define ble_sm_sc_init() 378*042d53a7SEvalZero 379*042d53a7SEvalZero #endif 380*042d53a7SEvalZero 381*042d53a7SEvalZero struct ble_sm_proc *ble_sm_proc_find(uint16_t conn_handle, uint8_t state, 382*042d53a7SEvalZero int is_initiator, 383*042d53a7SEvalZero struct ble_sm_proc **out_prev); 384*042d53a7SEvalZero int ble_sm_gen_pair_rand(uint8_t *pair_rand); 385*042d53a7SEvalZero uint8_t *ble_sm_our_pair_rand(struct ble_sm_proc *proc); 386*042d53a7SEvalZero uint8_t *ble_sm_peer_pair_rand(struct ble_sm_proc *proc); 387*042d53a7SEvalZero int ble_sm_ioact_state(uint8_t action); 388*042d53a7SEvalZero int ble_sm_proc_can_advance(struct ble_sm_proc *proc); 389*042d53a7SEvalZero void ble_sm_process_result(uint16_t conn_handle, struct ble_sm_result *res); 390*042d53a7SEvalZero void ble_sm_confirm_advance(struct ble_sm_proc *proc); 391*042d53a7SEvalZero void ble_sm_ia_ra(struct ble_sm_proc *proc, 392*042d53a7SEvalZero uint8_t *out_iat, uint8_t *out_ia, 393*042d53a7SEvalZero uint8_t *out_rat, uint8_t *out_ra); 394*042d53a7SEvalZero 395*042d53a7SEvalZero int32_t ble_sm_timer(void); 396*042d53a7SEvalZero void ble_sm_connection_broken(uint16_t conn_handle); 397*042d53a7SEvalZero int ble_sm_pair_initiate(uint16_t conn_handle); 398*042d53a7SEvalZero int ble_sm_slave_initiate(uint16_t conn_handle); 399*042d53a7SEvalZero int ble_sm_enc_initiate(uint16_t conn_handle, const uint8_t *ltk, 400*042d53a7SEvalZero uint16_t ediv, uint64_t rand_val, int auth); 401*042d53a7SEvalZero int ble_sm_init(void); 402*042d53a7SEvalZero 403*042d53a7SEvalZero #define BLE_SM_LOG_CMD(is_tx, cmd_name, conn_handle, log_cb, cmd) \ 404*042d53a7SEvalZero BLE_HS_LOG_CMD((is_tx), "sm", (cmd_name), (conn_handle), (log_cb), (cmd)) 405*042d53a7SEvalZero 406*042d53a7SEvalZero #else 407*042d53a7SEvalZero 408*042d53a7SEvalZero #define ble_sm_enc_change_rx(evt) ((void)(evt)) 409*042d53a7SEvalZero #define ble_sm_ltk_req_rx(evt) ((void)(evt)) 410*042d53a7SEvalZero #define ble_sm_enc_key_refresh_rx(evt) ((void)(evt)) 411*042d53a7SEvalZero 412*042d53a7SEvalZero #define ble_sm_timer() BLE_HS_FOREVER 413*042d53a7SEvalZero #define ble_sm_connection_broken(conn_handle) 414*042d53a7SEvalZero #define ble_sm_pair_initiate(conn_handle) BLE_HS_ENOTSUP 415*042d53a7SEvalZero #define ble_sm_slave_initiate(conn_handle) BLE_HS_ENOTSUP 416*042d53a7SEvalZero #define ble_sm_enc_initiate(conn_handle, ltk, ediv, rand_val, auth) \ 417*042d53a7SEvalZero BLE_HS_ENOTSUP 418*042d53a7SEvalZero 419*042d53a7SEvalZero #define ble_sm_init() 0 420*042d53a7SEvalZero 421*042d53a7SEvalZero #endif 422*042d53a7SEvalZero 423*042d53a7SEvalZero struct ble_l2cap_chan *ble_sm_create_chan(uint16_t handle); 424*042d53a7SEvalZero void *ble_sm_cmd_get(uint8_t opcode, size_t len, struct os_mbuf **txom); 425*042d53a7SEvalZero int ble_sm_tx(uint16_t conn_handle, struct os_mbuf *txom); 426*042d53a7SEvalZero 427*042d53a7SEvalZero #ifdef __cplusplus 428*042d53a7SEvalZero } 429*042d53a7SEvalZero #endif 430*042d53a7SEvalZero 431*042d53a7SEvalZero #endif 432