• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright (C) 2003-2012 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 #include "bt_target.h"
20 
21 #include <string.h>
22 #include "smp_int.h"
23 
24 const char* const smp_state_name[] = {
25     "SMP_STATE_IDLE",
26     "SMP_STATE_WAIT_APP_RSP",
27     "SMP_STATE_SEC_REQ_PENDING",
28     "SMP_STATE_PAIR_REQ_RSP",
29     "SMP_STATE_WAIT_CONFIRM",
30     "SMP_STATE_CONFIRM",
31     "SMP_STATE_RAND",
32     "SMP_STATE_PUBLIC_KEY_EXCH",
33     "SMP_STATE_SEC_CONN_PHS1_START",
34     "SMP_STATE_WAIT_COMMITMENT",
35     "SMP_STATE_WAIT_NONCE",
36     "SMP_STATE_SEC_CONN_PHS2_START",
37     "SMP_STATE_WAIT_DHK_CHECK",
38     "SMP_STATE_DHK_CHECK",
39     "SMP_STATE_ENCRYPTION_PENDING",
40     "SMP_STATE_BOND_PENDING",
41     "SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA",
42     "SMP_STATE_MAX"};
43 
44 const char* const smp_event_name[] = {"PAIRING_REQ_EVT",
45                                       "PAIRING_RSP_EVT",
46                                       "CONFIRM_EVT",
47                                       "RAND_EVT",
48                                       "PAIRING_FAILED_EVT",
49                                       "ENC_INFO_EVT",
50                                       "MASTER_ID_EVT",
51                                       "ID_INFO_EVT",
52                                       "ID_ADDR_EVT",
53                                       "SIGN_INFO_EVT",
54                                       "SECURITY_REQ_EVT",
55                                       "PAIR_PUBLIC_KEY_EVT",
56                                       "PAIR_DHKEY_CHECK_EVT",
57                                       "PAIR_KEYPRESS_NOTIFICATION_EVT",
58                                       "PAIR_COMMITMENT_EVT",
59                                       "KEY_READY_EVT",
60                                       "ENCRYPTED_EVT",
61                                       "L2CAP_CONN_EVT",
62                                       "L2CAP_DISCONN_EVT",
63                                       "API_IO_RSP_EVT",
64                                       "API_SEC_GRANT_EVT",
65                                       "TK_REQ_EVT",
66                                       "AUTH_CMPL_EVT",
67                                       "ENC_REQ_EVT",
68                                       "BOND_REQ_EVT",
69                                       "DISCARD_SEC_REQ_EVT",
70                                       "PUBLIC_KEY_EXCHANGE_REQ_EVT",
71                                       "LOCAL_PUBLIC_KEY_CRTD_EVT",
72                                       "BOTH_PUBLIC_KEYS_RCVD_EVT",
73                                       "SEC_CONN_DHKEY_COMPLETE_EVT",
74                                       "HAVE_LOCAL_NONCE_EVT",
75                                       "SEC_CONN_PHASE1_CMPLT_EVT",
76                                       "SEC_CONN_CALC_NC_EVT",
77                                       "SEC_CONN_DISPLAY_NC_EVT",
78                                       "SEC_CONN_OK_EVT",
79                                       "SEC_CONN_2_DHCK_CHECKS_PRESENT_EVT",
80                                       "SEC_CONN_KEY_READY_EVT",
81                                       "KEYPRESS_NOTIFICATION_EVT",
82                                       "SEC_CONN_OOB_DATA_EVT",
83                                       "CREATE_LOCAL_SEC_CONN_OOB_DATA_EVT",
84                                       "OUT_OF_RANGE_EVT"};
85 
86 const char* smp_get_event_name(tSMP_EVENT event);
87 const char* smp_get_state_name(tSMP_STATE state);
88 
89 #define SMP_SM_IGNORE 0
90 #define SMP_NUM_ACTIONS 2
91 #define SMP_SME_NEXT_STATE 2
92 #define SMP_SM_NUM_COLS 3
93 
94 typedef const uint8_t (*tSMP_SM_TBL)[SMP_SM_NUM_COLS];
95 
96 enum {
97   SMP_PROC_SEC_REQ,
98   SMP_SEND_PAIR_REQ,
99   SMP_SEND_PAIR_RSP,
100   SMP_SEND_CONFIRM,
101   SMP_SEND_PAIR_FAIL,
102   SMP_SEND_RAND,
103   SMP_SEND_ENC_INFO,
104   SMP_SEND_ID_INFO,
105   SMP_SEND_LTK_REPLY,
106   SMP_PROC_PAIR_CMD,
107   SMP_PROC_PAIR_FAIL,
108   SMP_PROC_CONFIRM,
109   SMP_PROC_RAND,
110   SMP_PROC_ENC_INFO,
111   SMP_PROC_MASTER_ID,
112   SMP_PROC_ID_INFO,
113   SMP_PROC_ID_ADDR,
114   SMP_PROC_SRK_INFO,
115   SMP_PROC_SEC_GRANT,
116   SMP_PROC_SL_KEY,
117   SMP_PROC_COMPARE,
118   SMP_PROC_IO_RSP,
119   SMP_GENERATE_COMPARE,
120   SMP_GENERATE_CONFIRM,
121   SMP_GENERATE_STK,
122   SMP_KEY_DISTRIBUTE,
123   SMP_START_ENC,
124   SMP_PAIRING_CMPL,
125   SMP_DECIDE_ASSO_MODEL,
126   SMP_SEND_APP_CBACK,
127   SMP_CHECK_AUTH_REQ,
128   SMP_PAIR_TERMINATE,
129   SMP_ENC_CMPL,
130   SMP_PROC_DISCARD,
131   SMP_CREATE_PRIVATE_KEY,
132   SMP_USE_OOB_PRIVATE_KEY,
133   SMP_SEND_PAIR_PUBLIC_KEY,
134   SMP_PROCESS_PAIR_PUBLIC_KEY,
135   SMP_HAVE_BOTH_PUBLIC_KEYS,
136   SMP_START_SEC_CONN_PHASE1,
137   SMP_PROCESS_LOCAL_NONCE,
138   SMP_SEND_COMMITMENT,
139   SMP_PROCESS_PAIRING_COMMITMENT,
140   SMP_PROCESS_PEER_NONCE,
141   SMP_CALCULATE_LOCAL_DHKEY_CHECK,
142   SMP_SEND_DHKEY_CHECK,
143   SMP_PROCESS_DHKEY_CHECK,
144   SMP_CALCULATE_PEER_DHKEY_CHECK,
145   SMP_MATCH_DHKEY_CHECKS,
146   SMP_CALCULATE_NUMERIC_COMPARISON_DISPLAY_NUMBER,
147   SMP_MOVE_TO_SEC_CONN_PHASE2,
148   SMP_PH2_DHKEY_CHECKS_ARE_PRESENT,
149   SMP_WAIT_FOR_BOTH_PUBLIC_KEYS,
150   SMP_START_PASSKEY_VERIFICATION,
151   SMP_SEND_KEYPRESS_NOTIFICATION,
152   SMP_PROCESS_KEYPRESS_NOTIFICATION,
153   SMP_PROCESS_SECURE_CONNECTION_OOB_DATA,
154   SMP_SET_LOCAL_OOB_KEYS,
155   SMP_SET_LOCAL_OOB_RAND_COMMITMENT,
156   SMP_IDLE_TERMINATE,
157   SMP_FAST_CONN_PARAM,
158   SMP_SM_NO_ACTION
159 };
160 
161 static const tSMP_ACT smp_sm_action[] = {
162     smp_proc_sec_req,
163     smp_send_pair_req,
164     smp_send_pair_rsp,
165     smp_send_confirm,
166     smp_send_pair_fail,
167     smp_send_rand,
168     smp_send_enc_info,
169     smp_send_id_info,
170     smp_send_ltk_reply,
171     smp_proc_pair_cmd,
172     smp_proc_pair_fail,
173     smp_proc_confirm,
174     smp_proc_rand,
175     smp_proc_enc_info,
176     smp_proc_master_id,
177     smp_proc_id_info,
178     smp_proc_id_addr,
179     smp_proc_srk_info,
180     smp_proc_sec_grant,
181     smp_proc_sl_key,
182     smp_proc_compare,
183     smp_process_io_response,
184     smp_generate_compare,
185     smp_generate_srand_mrand_confirm,
186     smp_generate_stk,
187     smp_key_distribution,
188     smp_start_enc,
189     smp_pairing_cmpl,
190     smp_decide_association_model,
191     smp_send_app_cback,
192     smp_check_auth_req,
193     smp_pair_terminate,
194     smp_enc_cmpl,
195     smp_proc_discard,
196     smp_create_private_key,
197     smp_use_oob_private_key,
198     smp_send_pair_public_key,
199     smp_process_pairing_public_key,
200     smp_both_have_public_keys,
201     smp_start_secure_connection_phase1,
202     smp_process_local_nonce,
203     smp_send_commitment,
204     smp_process_pairing_commitment,
205     smp_process_peer_nonce,
206     smp_calculate_local_dhkey_check,
207     smp_send_dhkey_check,
208     smp_process_dhkey_check,
209     smp_calculate_peer_dhkey_check,
210     smp_match_dhkey_checks,
211     smp_calculate_numeric_comparison_display_number,
212     smp_move_to_secure_connections_phase2,
213     smp_phase_2_dhkey_checks_are_present,
214     smp_wait_for_both_public_keys,
215     smp_start_passkey_verification,
216     smp_send_keypress_notification,
217     smp_process_keypress_notification,
218     smp_process_secure_connection_oob_data,
219     smp_set_local_oob_keys,
220     smp_set_local_oob_random_commitment,
221     smp_idle_terminate,
222     smp_fast_conn_param};
223 
224 /************ SMP Master FSM State/Event Indirection Table **************/
225 static const uint8_t smp_master_entry_map[][SMP_STATE_MAX] = {
226     /* state name: */
227     /* Idle, WaitApp Rsp, SecReq Pend, Pair ReqRsp, Wait Cfm, Confirm, Rand,
228        PublKey Exch, SCPhs1 Strt, Wait Cmtm, Wait Nonce, SCPhs2 Strt, Wait
229        DHKChk, DHKChk, Enc Pend, Bond Pend, CrLocSc OobData */
230     /* PAIR_REQ */
231     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
232     /* PAIR_RSP */
233     {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
234     /* CONFIRM */
235     {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
236     /* RAND */
237     {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
238     /* PAIR_FAIL */
239     {0, 0x81, 0, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
240      0x81, 0, 0x81, 0},
241     /* ENC_INFO */
242     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
243     /* MASTER_ID */
244     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0},
245     /* ID_INFO */
246     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0},
247     /* ID_ADDR */
248     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0},
249     /* SIGN_INFO */
250     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0},
251     /* SEC_REQ */
252     {2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
253     /* PAIR_PUBLIC_KEY */
254     {0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0},
255     /* PAIR_DHKEY_CHCK */
256     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
257     /* PAIR_KEYPR_NOTIF */
258     {0, 8, 0, 0, 0, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0},
259     /* PAIR_COMMITM */
260     {0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0},
261     /* KEY_READY */
262     {0, 3, 0, 3, 1, 0, 2, 0, 4, 0, 0, 0, 0, 0, 1, 6, 0},
263     /* ENC_CMPL */
264     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0},
265     /* L2C_CONN */
266     {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
267     /* L2C_DISC */
268     {3, 0x83, 0, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
269      0x83, 0x83, 0x83, 0},
270     /* IO_RSP */
271     {0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
272     /* SEC_GRANT */
273     {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
274     /* TK_REQ */
275     {0, 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0},
276     /* AUTH_CMPL */
277     {4, 0x82, 0, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
278      0x82, 0x82, 0x82, 0},
279     /* ENC_REQ */
280     {0, 4, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0},
281     /* BOND_REQ */
282     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0},
283     /* DISCARD_SEC_REQ */
284     {0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0},
285     /* PUBL_KEY_EXCH_REQ */
286     {0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
287     /* LOC_PUBL_KEY_CRTD */
288     {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
289     /* BOTH_PUBL_KEYS_RCVD */
290     {0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0},
291     /* SC_DHKEY_CMPLT */
292     {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
293     /* HAVE_LOC_NONCE */
294     {0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2},
295     /* SC_PHASE1_CMPLT */
296     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
297     /* SC_CALC_NC */
298     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0},
299     /* SC_DSPL_NC */
300     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0},
301     /* SC_NC_OK */
302     {0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
303     /* SC_2_DHCK_CHKS_PRES */
304     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
305     /* SC_KEY_READY */
306     {0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
307     /* KEYPR_NOTIF */
308     {0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
309     /* SC_OOB_DATA */
310     {0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
311     /* CR_LOC_SC_OOB_DATA */
312     {5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
313 };
314 
315 static const uint8_t smp_all_table[][SMP_SM_NUM_COLS] = {
316     /* Event                  Action             Next State */
317     /* PAIR_FAIL */
318     {SMP_PROC_PAIR_FAIL, SMP_PAIRING_CMPL, SMP_STATE_IDLE},
319     /* AUTH_CMPL */
320     {SMP_SEND_PAIR_FAIL, SMP_PAIRING_CMPL, SMP_STATE_IDLE},
321     /* L2C_DISC */
322     {SMP_PAIR_TERMINATE, SMP_SM_NO_ACTION, SMP_STATE_IDLE}};
323 
324 static const uint8_t smp_master_idle_table[][SMP_SM_NUM_COLS] = {
325     /* Event                  Action               Next State */
326     /* L2C_CONN */
327     {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP},
328     /* SEC_REQ */
329     {SMP_PROC_SEC_REQ, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP},
330     /* L2C_DISC */
331     {SMP_IDLE_TERMINATE, SMP_SM_NO_ACTION, SMP_STATE_IDLE},
332     /* AUTH_CMPL */
333     {SMP_PAIRING_CMPL, SMP_SM_NO_ACTION, SMP_STATE_IDLE},
334     /* CR_LOC_SC_OOB_DATA */
335     {SMP_CREATE_PRIVATE_KEY, SMP_SM_NO_ACTION,
336      SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA}
337 
338 };
339 
340 static const uint8_t smp_master_wait_for_app_response_table[][SMP_SM_NUM_COLS] =
341     {
342         /* Event                Action               Next State */
343         /* SEC_GRANT */
344         {SMP_PROC_SEC_GRANT, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP},
345         /* IO_RSP */
346         {SMP_SEND_PAIR_REQ, SMP_FAST_CONN_PARAM, SMP_STATE_PAIR_REQ_RSP},
347 
348         /* TK ready */
349         /* KEY_READY */
350         {SMP_GENERATE_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_WAIT_CONFIRM},
351 
352         /* start enc mode setup */
353         /* ENC_REQ */
354         {SMP_START_ENC, SMP_FAST_CONN_PARAM, SMP_STATE_ENCRYPTION_PENDING},
355         /* DISCARD_SEC_REQ */
356         {SMP_PROC_DISCARD, SMP_SM_NO_ACTION, SMP_STATE_IDLE}
357         /* user confirms NC 'OK', i.e. phase 1 is completed */
358         /* SC_NC_OK */,
359         {SMP_MOVE_TO_SEC_CONN_PHASE2, SMP_SM_NO_ACTION,
360          SMP_STATE_SEC_CONN_PHS2_START},
361         /* user-provided passkey is rcvd */
362         /* SC_KEY_READY */
363         {SMP_START_PASSKEY_VERIFICATION, SMP_SM_NO_ACTION,
364          SMP_STATE_SEC_CONN_PHS1_START},
365         /* PAIR_KEYPR_NOTIF */
366         {SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK,
367          SMP_STATE_WAIT_APP_RSP},
368         /* KEYPR_NOTIF */
369         {SMP_SEND_KEYPRESS_NOTIFICATION, SMP_SM_NO_ACTION,
370          SMP_STATE_WAIT_APP_RSP},
371         /* SC_OOB_DATA */
372         {SMP_USE_OOB_PRIVATE_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH}};
373 
374 static const uint8_t smp_master_pair_request_response_table[][SMP_SM_NUM_COLS] =
375     {
376         /* Event                  Action            Next State */
377         /* PAIR_RSP */
378         {SMP_PROC_PAIR_CMD, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP},
379         /* TK_REQ */
380         {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP},
381 
382         /* TK ready */
383         /* KEY_READY */
384         {SMP_GENERATE_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_WAIT_CONFIRM}
385         /* PUBL_KEY_EXCH_REQ */,
386         {SMP_CREATE_PRIVATE_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH}};
387 
388 static const uint8_t smp_master_wait_for_confirm_table[][SMP_SM_NUM_COLS] = {
389     /* Event                Action            Next State */
390     /* KEY_READY*/
391     /* CONFIRM ready */
392     {SMP_SEND_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_CONFIRM}};
393 
394 static const uint8_t smp_master_confirm_table[][SMP_SM_NUM_COLS] = {
395     /* Event            Action         Next State */
396     /* CONFIRM */
397     {SMP_PROC_CONFIRM, SMP_SEND_RAND, SMP_STATE_RAND}};
398 
399 static const uint8_t smp_master_rand_table[][SMP_SM_NUM_COLS] = {
400     /*               Event                  Action Next State */
401     /* RAND */
402     {SMP_PROC_RAND, SMP_GENERATE_COMPARE, SMP_STATE_RAND},
403     /* KEY_READY */
404     {SMP_PROC_COMPARE, SMP_SM_NO_ACTION, SMP_STATE_RAND}, /* Compare ready */
405     /* ENC_REQ */
406     {SMP_GENERATE_STK, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}};
407 
408 static const uint8_t smp_master_public_key_exchange_table[][SMP_SM_NUM_COLS] = {
409     /* Event                        Action              Next State */
410     /* LOC_PUBL_KEY_CRTD */
411     {SMP_SEND_PAIR_PUBLIC_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH},
412     /* PAIR_PUBLIC_KEY */
413     {SMP_PROCESS_PAIR_PUBLIC_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH},
414     /* BOTH_PUBL_KEYS_RCVD */
415     {SMP_HAVE_BOTH_PUBLIC_KEYS, SMP_SM_NO_ACTION,
416      SMP_STATE_SEC_CONN_PHS1_START},
417 };
418 
419 static const uint8_t smp_master_sec_conn_phs1_start_table[][SMP_SM_NUM_COLS] = {
420     /* Event                  Action                Next State */
421     /* SC_DHKEY_CMPLT */
422     {SMP_START_SEC_CONN_PHASE1, SMP_SM_NO_ACTION,
423      SMP_STATE_SEC_CONN_PHS1_START},
424     /* HAVE_LOC_NONCE */
425     {SMP_PROCESS_LOCAL_NONCE, SMP_SM_NO_ACTION, SMP_STATE_WAIT_COMMITMENT},
426     /* TK_REQ */
427     {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP},
428     /* SMP_MODEL_SEC_CONN_PASSKEY_DISP model, passkey is sent up to display,*/
429     /* It's time to start commitment calculation */
430     /* KEY_READY */
431     {SMP_START_PASSKEY_VERIFICATION, SMP_SM_NO_ACTION,
432      SMP_STATE_SEC_CONN_PHS1_START},
433     /* PAIR_KEYPR_NOTIF */
434     {SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK,
435      SMP_STATE_SEC_CONN_PHS1_START},
436     /* PAIR_COMMITM */
437     {SMP_PROCESS_PAIRING_COMMITMENT, SMP_SM_NO_ACTION,
438      SMP_STATE_SEC_CONN_PHS1_START},
439 };
440 
441 static const uint8_t smp_master_wait_commitment_table[][SMP_SM_NUM_COLS] = {
442     /* Event                  Action                 Next State */
443     /* PAIR_COMMITM */
444     {SMP_PROCESS_PAIRING_COMMITMENT, SMP_SEND_RAND, SMP_STATE_WAIT_NONCE},
445     /* PAIR_KEYPR_NOTIF */
446     {SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK,
447      SMP_STATE_WAIT_COMMITMENT},
448 };
449 
450 static const uint8_t smp_master_wait_nonce_table[][SMP_SM_NUM_COLS] = {
451     /* Event                  Action                 Next State */
452     /* peer nonce is received */
453     /* RAND */
454     {SMP_PROC_RAND, SMP_PROCESS_PEER_NONCE, SMP_STATE_SEC_CONN_PHS2_START},
455     /* NC model, time to calculate number for NC */
456     /* SC_CALC_NC */
457     {SMP_CALCULATE_NUMERIC_COMPARISON_DISPLAY_NUMBER, SMP_SM_NO_ACTION,
458      SMP_STATE_WAIT_NONCE},
459     /* NC model, time to display calculated number for NC to the user */
460     /* SC_DSPL_NC */
461     {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP},
462 };
463 
464 static const uint8_t smp_master_sec_conn_phs2_start_table[][SMP_SM_NUM_COLS] = {
465     /* Event                           Action                 Next State */
466     /* SC_PHASE1_CMPLT */
467     {SMP_CALCULATE_LOCAL_DHKEY_CHECK, SMP_SEND_DHKEY_CHECK,
468      SMP_STATE_WAIT_DHK_CHECK},
469 };
470 
471 static const uint8_t smp_master_wait_dhk_check_table[][SMP_SM_NUM_COLS] = {
472     /* Event                  Action                          Next State */
473     /* PAIR_DHKEY_CHCK */
474     {SMP_PROCESS_DHKEY_CHECK, SMP_CALCULATE_PEER_DHKEY_CHECK,
475      SMP_STATE_DHK_CHECK},
476 };
477 
478 static const uint8_t smp_master_dhk_check_table[][SMP_SM_NUM_COLS] = {
479     /* Event                  Action                 Next State */
480     /* locally calculated peer dhkey check is ready -> compare it withs DHKey
481      * Check
482      * actually received from peer */
483     /* SC_KEY_READY */
484     {SMP_MATCH_DHKEY_CHECKS, SMP_SM_NO_ACTION, SMP_STATE_DHK_CHECK},
485     /* locally calculated peer dhkey check is ready -> calculate STK, go to
486      * sending
487      */
488     /* HCI LE Start Encryption command */
489     /* ENC_REQ */
490     {SMP_GENERATE_STK, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING},
491 };
492 
493 static const uint8_t smp_master_enc_pending_table[][SMP_SM_NUM_COLS] = {
494     /* Event                  Action                 Next State */
495     /* STK ready */
496     /* KEY_READY */
497     {SMP_START_ENC, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING},
498     /* ENCRYPTED */
499     {SMP_CHECK_AUTH_REQ, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING},
500     /* BOND_REQ */
501     {SMP_KEY_DISTRIBUTE, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}};
502 static const uint8_t smp_master_bond_pending_table[][SMP_SM_NUM_COLS] = {
503     /* Event                  Action                 Next State */
504     /* ENC_INFO */
505     {SMP_PROC_ENC_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING},
506     /* ID_INFO */
507     {SMP_PROC_ID_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING},
508     /* SIGN_INFO */
509     {SMP_PROC_SRK_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING},
510     /* MASTER_ID */
511     {SMP_PROC_MASTER_ID, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING},
512     /* ID_ADDR */
513     {SMP_PROC_ID_ADDR, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING},
514     /* KEY_READY */
515     /* LTK ready */
516     {SMP_SEND_ENC_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}};
517 
518 static const uint8_t
519     smp_master_create_local_sec_conn_oob_data[][SMP_SM_NUM_COLS] = {
520         /* Event                   Action            Next State */
521         /* LOC_PUBL_KEY_CRTD */
522         {SMP_SET_LOCAL_OOB_KEYS, SMP_SM_NO_ACTION,
523          SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA},
524         /* HAVE_LOC_NONCE */
525         {SMP_SET_LOCAL_OOB_RAND_COMMITMENT, SMP_SM_NO_ACTION, SMP_STATE_IDLE}};
526 
527 /************ SMP Slave FSM State/Event Indirection Table **************/
528 static const uint8_t smp_slave_entry_map[][SMP_STATE_MAX] = {
529     /* state name: */
530     /* Idle, WaitApp Rsp, SecReq Pend, Pair ReqRsp, Wait Cfm, Confirm, Rand,
531        PublKey Exch, SCPhs1 Strt, Wait Cmtm, Wait Nonce, SCPhs2 Strt, Wait
532        DHKChk, DHKChk, Enc Pend, Bond Pend, CrLocSc OobData */
533     /* PAIR_REQ */
534     {2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
535     /* PAIR_RSP */
536     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
537     /* CONFIRM */
538     {0, 4, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
539     /* RAND */
540     {0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
541     /* PAIR_FAIL */
542     {0, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
543      0x81, 0x81, 0, 0},
544     /* ENC_INFO */
545     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0},
546     /* MASTER_ID */
547     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0},
548     /* ID_INFO */
549     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0},
550     /* ID_ADDR */
551     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0},
552     /* SIGN_INFO */
553     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0},
554     /* SEC_REQ */
555     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
556     /* PAIR_PUBLIC_KEY */
557     {0, 0, 0, 5, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0},
558     /* PAIR_DHKEY_CHCK */
559     {0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, 0},
560     /* PAIR_KEYPR_NOTIF */
561     {0, 9, 0, 0, 0, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0},
562     /* PAIR_COMMITM */
563     {0, 8, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0},
564     /* KEY_READY */
565     {0, 3, 0, 3, 2, 2, 1, 0, 4, 0, 0, 0, 0, 0, 2, 1, 0},
566     /* ENC_CMPL */
567     {0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0},
568     /* L2C_CONN */
569     {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
570     /* L2C_DISC */
571     {0, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
572      0x83, 0x83, 0x83, 0},
573     /* IO_RSP */
574     {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
575     /* SEC_GRANT */
576     {0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
577     /* TK_REQ */
578     {0, 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0},
579     /* AUTH_CMPL */
580     {0, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
581      0x82, 0x82, 0x82, 0},
582     /* ENC_REQ */
583     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
584     /* BOND_REQ */
585     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0},
586     /* DISCARD_SEC_REQ */
587     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
588     /* PUBL_KEY_EXCH_REQ */
589     {0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
590     /* LOC_PUBL_KEY_CRTD */
591     {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
592     /* BOTH_PUBL_KEYS_RCVD */
593     {0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0},
594     /* SC_DHKEY_CMPLT */
595     {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
596     /* HAVE_LOC_NONCE */
597     {0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2},
598     /* SC_PHASE1_CMPLT */
599     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
600     /* SC_CALC_NC */
601     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0},
602     /* SC_DSPL_NC */
603     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0},
604     /* SC_NC_OK */
605     {0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
606     /* SC_2_DHCK_CHKS_PRES */
607     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0},
608     /* SC_KEY_READY */
609     {0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
610     /* KEYPR_NOTIF */
611     {0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
612     /* SC_OOB_DATA */
613     {0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
614     /* CR_LOC_SC_OOB_DATA */
615     {3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
616 };
617 
618 static const uint8_t smp_slave_idle_table[][SMP_SM_NUM_COLS] = {
619     /* Event                 Action                Next State */
620     /* L2C_CONN */
621     {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP},
622     /* PAIR_REQ */
623     {SMP_PROC_PAIR_CMD, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP},
624     /* CR_LOC_SC_OOB_DATA */
625     {SMP_CREATE_PRIVATE_KEY, SMP_SM_NO_ACTION,
626      SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA}};
627 
628 static const uint8_t smp_slave_wait_for_app_response_table[][SMP_SM_NUM_COLS] =
629     {
630         /* Event                   Action                 Next State */
631         /* IO_RSP */
632         {SMP_PROC_IO_RSP, SMP_FAST_CONN_PARAM, SMP_STATE_PAIR_REQ_RSP},
633         /* SEC_GRANT */
634         {SMP_PROC_SEC_GRANT, SMP_SEND_APP_CBACK, SMP_STATE_WAIT_APP_RSP},
635 
636         /* TK ready */
637         /* KEY_READY */
638         {SMP_PROC_SL_KEY, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP},
639         /* CONFIRM */
640         {SMP_PROC_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_CONFIRM},
641         /* DHKey Check from master is received before phase 1 is completed -
642            race */
643         /* PAIR_DHKEY_CHCK */
644         {SMP_PROCESS_DHKEY_CHECK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP},
645         /* user confirms NC 'OK', i.e. phase 1 is completed */
646         /* SC_NC_OK */
647         {SMP_MOVE_TO_SEC_CONN_PHASE2, SMP_SM_NO_ACTION,
648          SMP_STATE_SEC_CONN_PHS2_START},
649         /* user-provided passkey is rcvd */
650         /* SC_KEY_READY */
651         {SMP_START_PASSKEY_VERIFICATION, SMP_SM_NO_ACTION,
652          SMP_STATE_SEC_CONN_PHS1_START},
653         /* PAIR_COMMITM */
654         {SMP_PROCESS_PAIRING_COMMITMENT, SMP_SM_NO_ACTION,
655          SMP_STATE_WAIT_APP_RSP},
656         /* PAIR_KEYPR_NOTIF */
657         {SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK,
658          SMP_STATE_WAIT_APP_RSP},
659         /* KEYPR_NOTIF */
660         {SMP_SEND_KEYPRESS_NOTIFICATION, SMP_SM_NO_ACTION,
661          SMP_STATE_WAIT_APP_RSP},
662         /* SC_OOB_DATA */
663         {SMP_SEND_PAIR_RSP, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP},
664 };
665 
666 static const uint8_t smp_slave_sec_request_table[][SMP_SM_NUM_COLS] = {
667     /* Event                  Action                 Next State */
668     /* PAIR_REQ */
669     {SMP_PROC_PAIR_CMD, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP},
670     /* ENCRYPTED*/
671     {SMP_ENC_CMPL, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP},
672 };
673 
674 static const uint8_t smp_slave_pair_request_response_table[][SMP_SM_NUM_COLS] =
675     {
676         /* Event                  Action                 Next State */
677         /* CONFIRM */
678         {SMP_PROC_CONFIRM, SMP_SM_NO_ACTION, SMP_STATE_CONFIRM},
679         /* TK_REQ */
680         {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP},
681 
682         /* TK/Confirm ready */
683         /* KEY_READY */
684         {SMP_PROC_SL_KEY, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP},
685         /* PUBL_KEY_EXCH_REQ */
686         {SMP_CREATE_PRIVATE_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH},
687         /* PAIR_PUBLIC_KEY */
688         {SMP_PROCESS_PAIR_PUBLIC_KEY, SMP_SM_NO_ACTION, SMP_STATE_PAIR_REQ_RSP},
689 };
690 
691 static const uint8_t smp_slave_wait_confirm_table[][SMP_SM_NUM_COLS] = {
692     /* Event                  Action                 Next State */
693     /* CONFIRM */
694     {SMP_PROC_CONFIRM, SMP_SEND_CONFIRM, SMP_STATE_CONFIRM},
695     /* KEY_READY*/
696     {SMP_PROC_SL_KEY, SMP_SM_NO_ACTION, SMP_STATE_WAIT_CONFIRM}};
697 
698 static const uint8_t smp_slave_confirm_table[][SMP_SM_NUM_COLS] = {
699     /* Event                  Action                 Next State */
700     /* RAND */
701     {SMP_PROC_RAND, SMP_GENERATE_COMPARE, SMP_STATE_RAND},
702 
703     /* TK/Confirm ready */
704     /* KEY_READY*/
705     {SMP_PROC_SL_KEY, SMP_SM_NO_ACTION, SMP_STATE_CONFIRM}};
706 
707 static const uint8_t smp_slave_rand_table[][SMP_SM_NUM_COLS] = {
708     /* Event                  Action                 Next State */
709     /* KEY_READY */
710     {SMP_PROC_COMPARE, SMP_SM_NO_ACTION, SMP_STATE_RAND}, /* compare match */
711     /* RAND */
712     {SMP_SEND_RAND, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING}};
713 
714 static const uint8_t smp_slave_public_key_exch_table[][SMP_SM_NUM_COLS] = {
715     /* Event                  Action                 Next State */
716     /* LOC_PUBL_KEY_CRTD */
717     {SMP_WAIT_FOR_BOTH_PUBLIC_KEYS, SMP_SM_NO_ACTION,
718      SMP_STATE_PUBLIC_KEY_EXCH},
719     /* PAIR_PUBLIC_KEY */
720     {SMP_PROCESS_PAIR_PUBLIC_KEY, SMP_SM_NO_ACTION, SMP_STATE_PUBLIC_KEY_EXCH},
721     /* BOTH_PUBL_KEYS_RCVD */
722     {SMP_HAVE_BOTH_PUBLIC_KEYS, SMP_SM_NO_ACTION,
723      SMP_STATE_SEC_CONN_PHS1_START},
724 };
725 
726 static const uint8_t smp_slave_sec_conn_phs1_start_table[][SMP_SM_NUM_COLS] = {
727     /* Event                  Action                 Next State */
728     /* SC_DHKEY_CMPLT */
729     {SMP_START_SEC_CONN_PHASE1, SMP_SM_NO_ACTION,
730      SMP_STATE_SEC_CONN_PHS1_START},
731     /* HAVE_LOC_NONCE */
732     {SMP_PROCESS_LOCAL_NONCE, SMP_SM_NO_ACTION, SMP_STATE_WAIT_COMMITMENT},
733     /* TK_REQ */
734     {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP},
735     /* SMP_MODEL_SEC_CONN_PASSKEY_DISP model, passkey is sent up to display,
736      * it's
737      * time to start */
738     /* commitment calculation */
739     /* KEY_READY */
740     {SMP_START_PASSKEY_VERIFICATION, SMP_SM_NO_ACTION,
741      SMP_STATE_SEC_CONN_PHS1_START},
742     /* PAIR_KEYPR_NOTIF */
743     {SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK,
744      SMP_STATE_SEC_CONN_PHS1_START},
745     /*COMMIT*/
746     {SMP_PROCESS_PAIRING_COMMITMENT, SMP_SM_NO_ACTION,
747      SMP_STATE_SEC_CONN_PHS1_START},
748 };
749 
750 static const uint8_t smp_slave_wait_commitment_table[][SMP_SM_NUM_COLS] = {
751     /* Event                  Action                 Next State */
752     /* PAIR_COMMITM */
753     {SMP_PROCESS_PAIRING_COMMITMENT, SMP_SEND_COMMITMENT, SMP_STATE_WAIT_NONCE},
754     /* PAIR_KEYPR_NOTIF */
755     {SMP_PROCESS_KEYPRESS_NOTIFICATION, SMP_SEND_APP_CBACK,
756      SMP_STATE_WAIT_COMMITMENT},
757 };
758 
759 static const uint8_t smp_slave_wait_nonce_table[][SMP_SM_NUM_COLS] = {
760     /* Event                  Action                 Next State */
761     /* peer nonce is received */
762     /* RAND */
763     {SMP_PROC_RAND, SMP_PROCESS_PEER_NONCE, SMP_STATE_SEC_CONN_PHS2_START},
764     /* NC model, time to calculate number for NC */
765     /* SC_CALC_NC */
766     {SMP_CALCULATE_NUMERIC_COMPARISON_DISPLAY_NUMBER, SMP_SM_NO_ACTION,
767      SMP_STATE_WAIT_NONCE},
768     /* NC model, time to display calculated number for NC to the user */
769     /* SC_DSPL_NC */
770     {SMP_SEND_APP_CBACK, SMP_SM_NO_ACTION, SMP_STATE_WAIT_APP_RSP},
771 };
772 
773 static const uint8_t smp_slave_sec_conn_phs2_start_table[][SMP_SM_NUM_COLS] = {
774     /* Event                  Action                 Next State */
775     /* SC_PHASE1_CMPLT */
776     {SMP_CALCULATE_LOCAL_DHKEY_CHECK, SMP_PH2_DHKEY_CHECKS_ARE_PRESENT,
777      SMP_STATE_WAIT_DHK_CHECK},
778     /* DHKey Check from master is received before slave DHKey calculation is
779      * completed - race */
780     /* PAIR_DHKEY_CHCK */
781     {SMP_PROCESS_DHKEY_CHECK, SMP_SM_NO_ACTION, SMP_STATE_SEC_CONN_PHS2_START},
782 };
783 
784 static const uint8_t smp_slave_wait_dhk_check_table[][SMP_SM_NUM_COLS] = {
785     /* Event                  Action                 Next State */
786     /* PAIR_DHKEY_CHCK */
787     {SMP_PROCESS_DHKEY_CHECK, SMP_CALCULATE_PEER_DHKEY_CHECK,
788      SMP_STATE_DHK_CHECK},
789     /* DHKey Check from master was received before slave came to this state */
790     /* SC_2_DHCK_CHKS_PRES */
791     {SMP_CALCULATE_PEER_DHKEY_CHECK, SMP_SM_NO_ACTION, SMP_STATE_DHK_CHECK},
792 };
793 
794 static const uint8_t smp_slave_dhk_check_table[][SMP_SM_NUM_COLS] = {
795     /* Event                  Action                 Next State */
796 
797     /* locally calculated peer dhkey check is ready -> compare it withs DHKey
798      * Check
799      */
800     /* actually received from peer */
801     /* SC_KEY_READY */
802     {SMP_MATCH_DHKEY_CHECKS, SMP_SM_NO_ACTION, SMP_STATE_DHK_CHECK},
803 
804     /* dhkey checks match -> send local dhkey check to master, go to wait for
805      * HCI LE
806      */
807     /* Long Term Key Request Event */
808     /* PAIR_DHKEY_CHCK */
809     {SMP_SEND_DHKEY_CHECK, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING},
810 };
811 
812 static const uint8_t smp_slave_enc_pending_table[][SMP_SM_NUM_COLS] = {
813     /* Event                  Action                 Next State */
814     /* ENC_REQ */
815     {SMP_GENERATE_STK, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING},
816 
817     /* STK ready */
818     /* KEY_READY */
819     {SMP_SEND_LTK_REPLY, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING},
820     /* ENCRYPTED */
821     {SMP_CHECK_AUTH_REQ, SMP_SM_NO_ACTION, SMP_STATE_ENCRYPTION_PENDING},
822     /* BOND_REQ */
823     {SMP_KEY_DISTRIBUTE, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}};
824 static const uint8_t smp_slave_bond_pending_table[][SMP_SM_NUM_COLS] = {
825     /* Event                  Action                 Next State */
826 
827     /* LTK ready */
828     /* KEY_READY */
829     {SMP_SEND_ENC_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING},
830 
831     /* rev SRK */
832     /* SIGN_INFO */
833     {SMP_PROC_SRK_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING},
834     /* ENC_INFO */
835     {SMP_PROC_ENC_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING},
836     /* ID_INFO */
837     {SMP_PROC_ID_INFO, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING},
838     /* MASTER_ID*/
839     {SMP_PROC_MASTER_ID, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING},
840     /* ID_ADDR */
841     {SMP_PROC_ID_ADDR, SMP_SM_NO_ACTION, SMP_STATE_BOND_PENDING}
842 
843 };
844 
845 static const uint8_t
846     smp_slave_create_local_sec_conn_oob_data[][SMP_SM_NUM_COLS] = {
847         /* Event                  Action                 Next State */
848         /* LOC_PUBL_KEY_CRTD */
849         {SMP_SET_LOCAL_OOB_KEYS, SMP_SM_NO_ACTION,
850          SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA},
851         /* HAVE_LOC_NONCE */
852         {SMP_SET_LOCAL_OOB_RAND_COMMITMENT, SMP_SM_NO_ACTION, SMP_STATE_IDLE}};
853 
854 static const tSMP_SM_TBL smp_state_table[][2] = {
855     /* SMP_STATE_IDLE */
856     {smp_master_idle_table, smp_slave_idle_table},
857 
858     /* SMP_STATE_WAIT_APP_RSP */
859     {smp_master_wait_for_app_response_table,
860      smp_slave_wait_for_app_response_table},
861 
862     /* SMP_STATE_SEC_REQ_PENDING */
863     {NULL, smp_slave_sec_request_table},
864 
865     /* SMP_STATE_PAIR_REQ_RSP */
866     {smp_master_pair_request_response_table,
867      smp_slave_pair_request_response_table},
868 
869     /* SMP_STATE_WAIT_CONFIRM */
870     {smp_master_wait_for_confirm_table, smp_slave_wait_confirm_table},
871 
872     /* SMP_STATE_CONFIRM */
873     {smp_master_confirm_table, smp_slave_confirm_table},
874 
875     /* SMP_STATE_RAND */
876     {smp_master_rand_table, smp_slave_rand_table},
877 
878     /* SMP_STATE_PUBLIC_KEY_EXCH */
879     {smp_master_public_key_exchange_table, smp_slave_public_key_exch_table},
880 
881     /* SMP_STATE_SEC_CONN_PHS1_START */
882     {smp_master_sec_conn_phs1_start_table, smp_slave_sec_conn_phs1_start_table},
883 
884     /* SMP_STATE_WAIT_COMMITMENT */
885     {smp_master_wait_commitment_table, smp_slave_wait_commitment_table},
886 
887     /* SMP_STATE_WAIT_NONCE */
888     {smp_master_wait_nonce_table, smp_slave_wait_nonce_table},
889 
890     /* SMP_STATE_SEC_CONN_PHS2_START */
891     {smp_master_sec_conn_phs2_start_table, smp_slave_sec_conn_phs2_start_table},
892 
893     /* SMP_STATE_WAIT_DHK_CHECK */
894     {smp_master_wait_dhk_check_table, smp_slave_wait_dhk_check_table},
895 
896     /* SMP_STATE_DHK_CHECK */
897     {smp_master_dhk_check_table, smp_slave_dhk_check_table},
898 
899     /* SMP_STATE_ENCRYPTION_PENDING */
900     {smp_master_enc_pending_table, smp_slave_enc_pending_table},
901 
902     /* SMP_STATE_BOND_PENDING */
903     {smp_master_bond_pending_table, smp_slave_bond_pending_table},
904 
905     /* SMP_STATE_CREATE_LOCAL_SEC_CONN_OOB_DATA */
906     {smp_master_create_local_sec_conn_oob_data,
907      smp_slave_create_local_sec_conn_oob_data}};
908 
909 typedef const uint8_t (*tSMP_ENTRY_TBL)[SMP_STATE_MAX];
910 static const tSMP_ENTRY_TBL smp_entry_table[] = {smp_master_entry_map,
911                                                  smp_slave_entry_map};
912 
913 tSMP_CB smp_cb;
914 
915 #define SMP_ALL_TBL_MASK 0x80
916 
917 /*******************************************************************************
918  * Function     smp_set_state
919  * Returns      None
920  ******************************************************************************/
smp_set_state(tSMP_STATE state)921 void smp_set_state(tSMP_STATE state) {
922   if (state < SMP_STATE_MAX) {
923     SMP_TRACE_DEBUG("State change: %s(%d) ==> %s(%d)",
924                     smp_get_state_name(smp_cb.state), smp_cb.state,
925                     smp_get_state_name(state), state);
926     smp_cb.state = state;
927   } else {
928     SMP_TRACE_DEBUG("smp_set_state invalid state =%d", state);
929   }
930 }
931 
932 /*******************************************************************************
933  * Function     smp_get_state
934  * Returns      The smp state
935  ******************************************************************************/
smp_get_state(void)936 tSMP_STATE smp_get_state(void) { return smp_cb.state; }
937 
938 /*******************************************************************************
939  *
940  * Function     smp_sm_event
941  *
942  * Description  Handle events to the state machine. It looks up the entry
943  *              in the smp_entry_table array.
944  *              If it is a valid entry, it gets the state table. Set the next
945  *              state, if not NULL state. Execute the action function according
946  *              to the state table. If the state returned by action function is
947  *              not NULL state, adjust the new state to the returned state. If
948  *              (api_evt != MAX), call callback function.
949  *
950  * Returns      void.
951  *
952  ******************************************************************************/
smp_sm_event(tSMP_CB * p_cb,tSMP_EVENT event,void * p_data)953 void smp_sm_event(tSMP_CB* p_cb, tSMP_EVENT event, void* p_data) {
954   uint8_t curr_state = p_cb->state;
955   tSMP_SM_TBL state_table;
956   uint8_t action, entry, i;
957   tSMP_ENTRY_TBL entry_table = smp_entry_table[p_cb->role];
958 
959   SMP_TRACE_EVENT("main smp_sm_event");
960   if (curr_state >= SMP_STATE_MAX) {
961     SMP_TRACE_DEBUG("Invalid state: %d", curr_state);
962     return;
963   }
964 
965   SMP_TRACE_DEBUG("SMP Role: %s State: [%s (%d)], Event: [%s (%d)]",
966                   (p_cb->role == 0x01) ? "Slave" : "Master",
967                   smp_get_state_name(p_cb->state), p_cb->state,
968                   smp_get_event_name(event), event);
969 
970   /* look up the state table for the current state */
971   /* lookup entry /w event & curr_state */
972   /* If entry is ignore, return.
973    * Otherwise, get state table (according to curr_state or all_state) */
974   if ((event <= SMP_MAX_EVT) &&
975       ((entry = entry_table[event - 1][curr_state]) != SMP_SM_IGNORE)) {
976     if (entry & SMP_ALL_TBL_MASK) {
977       entry &= ~SMP_ALL_TBL_MASK;
978       state_table = smp_all_table;
979     } else
980       state_table = smp_state_table[curr_state][p_cb->role];
981   } else {
982     SMP_TRACE_DEBUG("Ignore event [%s (%d)] in state [%s (%d)]",
983                     smp_get_event_name(event), event,
984                     smp_get_state_name(curr_state), curr_state);
985     return;
986   }
987 
988   /* Get possible next state from state table. */
989 
990   smp_set_state(state_table[entry - 1][SMP_SME_NEXT_STATE]);
991 
992   /* If action is not ignore, clear param, exec action and get next state.
993    * The action function may set the Param for cback.
994    * Depending on param, call cback or free buffer. */
995   /* execute action */
996   /* execute action functions */
997   for (i = 0; i < SMP_NUM_ACTIONS; i++) {
998     action = state_table[entry - 1][i];
999     if (action != SMP_SM_NO_ACTION) {
1000       (*smp_sm_action[action])(p_cb, (tSMP_INT_DATA*)p_data);
1001     } else {
1002       break;
1003     }
1004   }
1005   SMP_TRACE_DEBUG("result state = %s", smp_get_state_name(p_cb->state));
1006 }
1007 
1008 /*******************************************************************************
1009  * Function     smp_get_state_name
1010  * Returns      The smp state name.
1011  ******************************************************************************/
smp_get_state_name(tSMP_STATE state)1012 const char* smp_get_state_name(tSMP_STATE state) {
1013   const char* p_str = smp_state_name[SMP_STATE_MAX];
1014 
1015   if (state < SMP_STATE_MAX) {
1016     p_str = smp_state_name[state];
1017   }
1018   return p_str;
1019 }
1020 
1021 /*******************************************************************************
1022  * Function     smp_get_event_name
1023  * Returns      The smp event name.
1024  ******************************************************************************/
smp_get_event_name(tSMP_EVENT event)1025 const char* smp_get_event_name(tSMP_EVENT event) {
1026   const char* p_str = smp_event_name[SMP_MAX_EVT];
1027 
1028   if (event <= SMP_MAX_EVT) {
1029     p_str = smp_event_name[event - 1];
1030   }
1031   return p_str;
1032 }
1033