xref: /nrf52832-nimble/packages/NimBLE-latest/nimble/host/src/ble_sm_priv.h (revision 042d53a763ad75cb1465103098bb88c245d95138)
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