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