1 /*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "smp_legacy.h"
17
18 #include <string.h>
19
20 #include "log.h"
21 #include "smp.h"
22 #include "smp_cmd.h"
23 #include "smp_common.h"
24 #include "smp_send.h"
25 #include "smp_tool.h"
26
SMP_LegacyPairMasterStep1(const SMP_StepParam * param)27 void SMP_LegacyPairMasterStep1(const SMP_StepParam *param)
28 {
29 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
30 return;
31 }
32 uint32_t passkey;
33 uint16_t handle = SMP_GetPairMng()->handle;
34 uint8_t pairMethod = SMP_GetPairMng()->local.pairMethod;
35 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
36
37 LOG_DEBUG("%{public}s", __FUNCTION__);
38 passkey = *((uint32_t *)returnParam->randomNumber);
39 passkey = passkey % (SMP_MAX_PASSKEY_VALUE + 0x01);
40 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_2 started.");
41 SMP_GetPairMng()->step = SMP_LEGACY_PAIR_MASTER_STEP_2;
42 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
43 SMP_NotifyCbAuthReq(handle, pairMethod, (uint8_t *)&passkey);
44 }
45
SMP_LegacyPairMasterStep2(const SMP_StepParam * param)46 void SMP_LegacyPairMasterStep2(const SMP_StepParam *param)
47 {
48 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
49 return;
50 }
51 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
52
53 LOG_DEBUG("%{public}s", __FUNCTION__);
54 (void)memcpy_s(SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
55 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_3 started.");
56 int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_3);
57 if (ret != SMP_SUCCESS) {
58 SMP_GeneratePairResult(
59 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
60 }
61 }
62
SMP_LegacyPairMasterStep3(const SMP_StepParam * param)63 void SMP_LegacyPairMasterStep3(const SMP_StepParam *param)
64 {
65 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
66 return;
67 }
68 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
69 SMP_CryptC1Step1Param cryptC1Step1Param;
70
71 LOG_DEBUG("%{public}s", __FUNCTION__);
72 (void)memcpy_s(SMP_GetPairMng()->local.random + SMP_RAND_NUM_LEN,
73 SMP_RAND_NUM_LEN,
74 returnParam->randomNumber,
75 SMP_RAND_NUM_LEN);
76 SMP_ConstituteC1Step1Param(
77 SMP_ROLE_MASTER, SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN, &cryptC1Step1Param);
78 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_4 started.");
79 int ret = SMP_CryptographicC1Step1(SMP_LEGACY_PAIR_MASTER_STEP_4, &cryptC1Step1Param);
80 if (ret != SMP_SUCCESS) {
81 SMP_GeneratePairResult(
82 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
83 }
84 }
85
SMP_LegacyPairMasterStep4(const SMP_StepParam * param)86 void SMP_LegacyPairMasterStep4(const SMP_StepParam *param)
87 {
88 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
89 return;
90 }
91 SMP_EncData *encData = (SMP_EncData *)param->data;
92 SMP_CryptC1Step2Param cryptC1Step2Param;
93 LOG_DEBUG("%{public}s", __FUNCTION__);
94 int ret = SMP_ConstituteC1Step2Param(encData, SMP_ROLE_MASTER, &cryptC1Step2Param);
95 if (ret != SMP_SUCCESS) {
96 return;
97 }
98 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_5 started.");
99 ret = SMP_CryptographicC1Step2(SMP_LEGACY_PAIR_MASTER_STEP_5, &cryptC1Step2Param);
100 if (ret != SMP_SUCCESS) {
101 SMP_GeneratePairResult(
102 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
103 }
104 }
105
SMP_LegacyPairMasterStep5(const SMP_StepParam * param)106 void SMP_LegacyPairMasterStep5(const SMP_StepParam *param)
107 {
108 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
109 return;
110 }
111 SMP_EncData *encData = (SMP_EncData *)param->data;
112 const HciLeEncryptReturnParam *returnParam = encData->encRetParam;
113 uint8_t confirmTemp[SMP_CONFIRM_DATA_LEN] = {0};
114 LOG_DEBUG("%{public}s", __FUNCTION__);
115 int ret = SMP_EncryptCompleteJudgeException(returnParam->status, SMP_ROLE_MASTER);
116 if (ret != SMP_SUCCESS) {
117 return;
118 }
119 SMP_MemoryReverseCopy(SMP_GetPairMng()->local.confirm, returnParam->encryptedData, SMP_CONFIRM_DATA_LEN);
120 SMP_MemoryReverseCopy(confirmTemp, SMP_GetPairMng()->local.confirm, SMP_CONFIRM_DATA_LEN);
121 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_6 started.");
122 SMP_GetPairMng()->step = SMP_LEGACY_PAIR_MASTER_STEP_6;
123 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
124 ret = SMP_SendPairingConfirm(SMP_GetPairMng()->handle, confirmTemp, SMP_SendDataCallback);
125 if (ret != SMP_SUCCESS) {
126 LOG_ERROR("Send Pairing Confirm failed.");
127 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
128 SMP_PAIR_STATUS_FAILED,
129 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
130 SMP_GetPairMng()->alarm);
131 }
132 }
133
SMP_LegacyPairMasterStep6(const SMP_StepParam * param)134 void SMP_LegacyPairMasterStep6(const SMP_StepParam *param)
135 {
136 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
137 return;
138 }
139 uint8_t randomTemp[SMP_RANDOM_DATA_LEN] = {0x00};
140
141 LOG_DEBUG("%{public}s", __FUNCTION__);
142 AlarmCancel(SMP_GetPairMng()->alarm);
143 SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.confirm, (uint8_t *)param->data, SMP_CONFIRM_DATA_LEN);
144 SMP_MemoryReverseCopy(randomTemp, SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN);
145 SMP_GetPairMng()->step = SMP_LEGACY_PAIR_MASTER_STEP_7;
146 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_7 started.");
147 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
148 int ret = SMP_SendPairingRandom(SMP_GetPairMng()->handle, randomTemp, SMP_SendDataCallback);
149 if (ret != SMP_SUCCESS) {
150 LOG_ERROR("Send Pairing random error");
151 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
152 SMP_PAIR_STATUS_FAILED,
153 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
154 SMP_GetPairMng()->alarm);
155 }
156 }
157
SMP_LegacyPairMasterStep7(const SMP_StepParam * param)158 void SMP_LegacyPairMasterStep7(const SMP_StepParam *param)
159 {
160 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
161 return;
162 }
163 SMP_CryptC1Step1Param cryptC1Step1Param;
164 LOG_DEBUG("%{public}s", __FUNCTION__);
165 SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.random, (uint8_t *)param->data, SMP_RANDOM_DATA_LEN);
166 SMP_ConstituteC1Step1Param(SMP_ROLE_MASTER, SMP_GetPairMng()->peer.random, SMP_RANDOM_DATA_LEN, &cryptC1Step1Param);
167 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_8 started.");
168 int ret = SMP_CryptographicC1Step1(SMP_LEGACY_PAIR_MASTER_STEP_8, &cryptC1Step1Param);
169 if (ret != SMP_SUCCESS) {
170 SMP_GeneratePairResult(
171 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
172 }
173 }
174
SMP_LegacyPairMasterStep8(const SMP_StepParam * param)175 void SMP_LegacyPairMasterStep8(const SMP_StepParam *param)
176 {
177 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
178 return;
179 }
180 SMP_EncData *encData = (SMP_EncData *)param->data;
181 SMP_CryptC1Step2Param cryptC1Step2Param;
182 LOG_DEBUG("%{public}s", __FUNCTION__);
183 int ret = SMP_ConstituteC1Step2Param(encData, SMP_ROLE_MASTER, &cryptC1Step2Param);
184 if (ret != SMP_SUCCESS) {
185 return;
186 }
187 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_9 started.");
188 ret = SMP_CryptographicC1Step2(SMP_LEGACY_PAIR_MASTER_STEP_9, &cryptC1Step2Param);
189 if (ret != SMP_SUCCESS) {
190 SMP_GeneratePairResult(
191 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
192 }
193 }
194
SMP_LegacyPairMasterStep9(const SMP_StepParam * param)195 void SMP_LegacyPairMasterStep9(const SMP_StepParam *param)
196 {
197 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
198 return;
199 }
200 SMP_EncData *encData = (SMP_EncData *)param->data;
201 const HciLeEncryptReturnParam *returnParam = encData->encRetParam;
202 HciLeEncryptParam encryptParam;
203 uint8_t confirmTemp[SMP_CONFIRM_DATA_LEN] = {0x00};
204 SMP_CryptS1Param cryptS1Param;
205 LOG_DEBUG("%{public}s", __FUNCTION__);
206 int ret = SMP_EncryptCompleteJudgeException(returnParam->status, SMP_ROLE_MASTER);
207 if (ret != SMP_SUCCESS) {
208 return;
209 }
210 SMP_MemoryReverseCopy(confirmTemp, returnParam->encryptedData, SMP_CONFIRM_DATA_LEN);
211 if (memcmp(confirmTemp, SMP_GetPairMng()->peer.confirm, SMP_CONFIRM_DATA_LEN) != 0x00) {
212 LOG_ERROR("Confirm check failed.");
213 SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_CONFIRM_VALUE, NULL);
214 } else {
215 LOG_INFO("Confirm check success.");
216 LOG_INFO("Start generate STK.");
217 (void)memcpy_s(
218 cryptS1Param.r1, sizeof(cryptS1Param.r1), SMP_GetPairMng()->peer.random, sizeof(cryptS1Param.r1));
219 (void)memcpy_s(
220 cryptS1Param.r2, sizeof(cryptS1Param.r2), SMP_GetPairMng()->local.random, sizeof(cryptS1Param.r2));
221 SMP_CryptographicS1(&cryptS1Param);
222 SMP_MemoryReverseCopy(encryptParam.key, SMP_GetPairMng()->TK, SMP_TK_LEN);
223 SMP_MemoryReverseCopy(encryptParam.plaintextData, cryptS1Param.output, sizeof(cryptS1Param.output));
224 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_10 started.");
225 ret = SMP_SendLeEncryptCmd(&encryptParam, SMP_LEGACY_PAIR_MASTER_STEP_10, NULL, SMP_USING_HW_AES128_PAIR);
226 if (ret != SMP_SUCCESS) {
227 SMP_GeneratePairResult(
228 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
229 }
230 }
231 }
232
SMP_LegacyPairMasterStep10(const SMP_StepParam * param)233 void SMP_LegacyPairMasterStep10(const SMP_StepParam *param)
234 {
235 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
236 return;
237 }
238 HciLeStartEncryptionParam startEncParam;
239 SMP_EncData *encData = (SMP_EncData *)param->data;
240 const HciLeEncryptReturnParam *returnParam = encData->encRetParam;
241 LOG_DEBUG("%{public}s", __FUNCTION__);
242 int ret = SMP_EncryptCompleteJudgeException(returnParam->status, SMP_ROLE_MASTER);
243 if (ret != SMP_SUCCESS) {
244 return;
245 }
246 (void)memcpy_s(SMP_GetPairMng()->STK, SMP_STK_LEN, returnParam->encryptedData, SMP_STK_LEN);
247 if (SMP_GetPairMng()->encKeySize < SMP_STK_LEN) {
248 (void)memset_s(SMP_GetPairMng()->STK + SMP_GetPairMng()->encKeySize,
249 (SMP_STK_LEN - SMP_GetPairMng()->encKeySize),
250 0x00,
251 (SMP_STK_LEN - SMP_GetPairMng()->encKeySize));
252 }
253 startEncParam.connectionHandle = SMP_GetPairMng()->handle;
254 startEncParam.encryptDiversifier = 0x00;
255 (void)memset_s(startEncParam.randomNumber, SMP_MASTER_RAND_LEN, 0x00, SMP_MASTER_RAND_LEN);
256 (void)memcpy_s(startEncParam.longTermKey, SMP_LTK_LEN, SMP_GetPairMng()->STK, SMP_STK_LEN);
257 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_11 started.");
258 SMP_GetPairMng()->step = SMP_LEGACY_PAIR_MASTER_STEP_11;
259 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
260 SMP_GetPairMng()->masterEncryptedFlag = SMP_MASTER_ENCRYPTED_FLAG_NO;
261 ret = HCI_LeStartEncryption(&startEncParam);
262 if (ret != SMP_SUCCESS) {
263 LOG_ERROR("HCI_LeStartEncryption failed.");
264 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
265 SMP_PAIR_STATUS_FAILED,
266 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
267 SMP_GetPairMng()->alarm);
268 }
269 }
270
SMP_LegacyPairMasterStep13(const SMP_StepParam * param)271 void SMP_LegacyPairMasterStep13(const SMP_StepParam *param)
272 {
273 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
274 return;
275 }
276 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
277
278 LOG_DEBUG("%{public}s", __FUNCTION__);
279 (void)memcpy_s(SMP_GetPairMng()->local.LTK, SMP_LTK_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
280 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_14 started.");
281 int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_14);
282 if (ret != SMP_SUCCESS) {
283 SMP_GeneratePairResult(
284 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
285 }
286 }
287
SMP_LegacyPairMasterStep14(const SMP_StepParam * param)288 void SMP_LegacyPairMasterStep14(const SMP_StepParam *param)
289 {
290 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
291 return;
292 }
293 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
294
295 LOG_DEBUG("%{public}s", __FUNCTION__);
296 (void)memcpy_s(
297 SMP_GetPairMng()->local.LTK + SMP_RAND_NUM_LEN, SMP_RAND_NUM_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
298 SMP_LongTermKeyCopy(SMP_GetPairMng()->local.LTK, SMP_GetPairMng()->local.LTK, SMP_GetPairMng()->encKeySize);
299 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_15 started.");
300 int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_15);
301 if (ret != SMP_SUCCESS) {
302 SMP_GeneratePairResult(
303 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
304 }
305 }
306
SMP_LegacyPairMasterStep15(const SMP_StepParam * param)307 void SMP_LegacyPairMasterStep15(const SMP_StepParam *param)
308 {
309 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
310 return;
311 }
312 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
313
314 LOG_DEBUG("%{public}s", __FUNCTION__);
315 (void)memcpy_s(&SMP_GetPairMng()->local.masterIdEdiv,
316 sizeof(SMP_GetPairMng()->local.masterIdEdiv),
317 returnParam->randomNumber,
318 sizeof(SMP_GetPairMng()->local.masterIdEdiv));
319 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_16 started.");
320 int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_16);
321 if (ret != SMP_SUCCESS) {
322 SMP_GeneratePairResult(
323 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
324 }
325 }
326
SMP_LegacyPairMasterStep16(const SMP_StepParam * param)327 void SMP_LegacyPairMasterStep16(const SMP_StepParam *param)
328 {
329 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
330 return;
331 }
332 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
333
334 LOG_DEBUG("%{public}s", __FUNCTION__);
335 (void)memcpy_s(
336 SMP_GetPairMng()->local.masterIdRand, SMP_MASTER_RAND_LEN, returnParam->randomNumber, SMP_MASTER_RAND_LEN);
337 if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_SIGN_KEY) {
338 LOG_INFO("Local Need to send SIGN_KEY.");
339 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_17 started.");
340 int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_17);
341 if (ret != SMP_SUCCESS) {
342 SMP_GeneratePairResult(
343 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
344 }
345 } else if ((SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ENC_KEY) ||
346 (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ID_KEY)) {
347 LOG_INFO("Local Need to Send ENC_KEY or SIGN_KEY.");
348 if (SMP_SendDistributionKeysToRemote()) {
349 SMP_GeneratePairResult(
350 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
351 }
352 } else {
353 LOG_INFO("Pair Success.");
354 SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_SUCCESS, 0x00, NULL);
355 }
356 }
357
SMP_LegacyPairMasterStep17(const SMP_StepParam * param)358 void SMP_LegacyPairMasterStep17(const SMP_StepParam *param)
359 {
360 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
361 return;
362 }
363 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
364
365 LOG_DEBUG("%{public}s", __FUNCTION__);
366 (void)memcpy_s(SMP_GetPairMng()->local.CSRK, SMP_CSRK_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
367 LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_18 started.");
368 int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_18);
369 if (ret != SMP_SUCCESS) {
370 SMP_GeneratePairResult(
371 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
372 }
373 }
374
SMP_LegacyPairMasterStep18(const SMP_StepParam * param)375 void SMP_LegacyPairMasterStep18(const SMP_StepParam *param)
376 {
377 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
378 return;
379 }
380 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
381
382 LOG_DEBUG("%{public}s", __FUNCTION__);
383 (void)memcpy_s(
384 SMP_GetPairMng()->local.CSRK + SMP_RAND_NUM_LEN, SMP_RAND_NUM_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
385 LOG_INFO("Send Keys to remote.");
386 if (SMP_SendDistributionKeysToRemote()) {
387 LOG_INFO("Pair failed");
388 SMP_GeneratePairResult(
389 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
390 }
391 }
392
SMP_LegacyPairSlaveStep1(const SMP_StepParam * param)393 void SMP_LegacyPairSlaveStep1(const SMP_StepParam *param)
394 {
395 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
396 return;
397 }
398 uint32_t passkey;
399 uint16_t handle = SMP_GetPairMng()->handle;
400 uint8_t pairMethod = SMP_GetPairMng()->local.pairMethod;
401 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
402
403 LOG_DEBUG("%{public}s", __FUNCTION__);
404 passkey = *((uint32_t *)returnParam->randomNumber);
405 passkey = passkey % (SMP_MAX_PASSKEY_VALUE + 0x01);
406 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_2 started.");
407 SMP_GetPairMng()->step = SMP_LEGACY_PAIR_SLAVE_STEP_2;
408 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
409 SMP_NotifyCbAuthReq(handle, pairMethod, (uint8_t *)&passkey);
410 }
411
SMP_LegacyPairSlaveStep2(const SMP_StepParam * param)412 void SMP_LegacyPairSlaveStep2(const SMP_StepParam *param)
413 {
414 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
415 return;
416 }
417
418 LOG_DEBUG("%{public}s", __FUNCTION__);
419 SMP_GetPairMng()->slaveConfirmRecvFlag = SMP_SLAVE_CONFIRM_RECV_FLAG_YES;
420 SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.confirm, (uint8_t *)param->data, SMP_CONFIRM_DATA_LEN);
421 }
422
SMP_LegacyPairSlaveStep3(const SMP_StepParam * param)423 void SMP_LegacyPairSlaveStep3(const SMP_StepParam *param)
424 {
425 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
426 return;
427 }
428
429 LOG_DEBUG("%{public}s", __FUNCTION__);
430 AlarmCancel(SMP_GetPairMng()->alarm);
431 SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.confirm, (uint8_t *)param->data, SMP_CONFIRM_DATA_LEN);
432 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_4 started.");
433 int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_SLAVE_STEP_4);
434 if (ret != SMP_SUCCESS) {
435 SMP_GeneratePairResult(
436 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
437 }
438 }
439
SMP_LegacyPairSlaveStep4(const SMP_StepParam * param)440 void SMP_LegacyPairSlaveStep4(const SMP_StepParam *param)
441 {
442 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
443 return;
444 }
445 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
446
447 LOG_DEBUG("%{public}s", __FUNCTION__);
448 (void)memcpy_s(SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
449 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_5 started.");
450 int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_SLAVE_STEP_5);
451 if (ret != SMP_SUCCESS) {
452 SMP_GeneratePairResult(
453 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
454 }
455 }
456
SMP_LegacyPairSlaveStep5(const SMP_StepParam * param)457 void SMP_LegacyPairSlaveStep5(const SMP_StepParam *param)
458 {
459 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
460 return;
461 }
462 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
463 SMP_CryptC1Step1Param cryptC1Step1Param;
464
465 LOG_DEBUG("%{public}s", __FUNCTION__);
466 (void)memcpy_s(SMP_GetPairMng()->local.random + SMP_RAND_NUM_LEN,
467 SMP_RAND_NUM_LEN,
468 returnParam->randomNumber,
469 SMP_RAND_NUM_LEN);
470 SMP_ConstituteC1Step1Param(SMP_ROLE_SLAVE, SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN, &cryptC1Step1Param);
471 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_6 started.");
472 int ret = SMP_CryptographicC1Step1(SMP_LEGACY_PAIR_SLAVE_STEP_6, &cryptC1Step1Param);
473 if (ret != SMP_SUCCESS) {
474 SMP_GeneratePairResult(
475 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
476 }
477 }
478
SMP_LegacyPairSlaveStep6(const SMP_StepParam * param)479 void SMP_LegacyPairSlaveStep6(const SMP_StepParam *param)
480 {
481 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
482 return;
483 }
484 SMP_EncData *encData = (SMP_EncData *)param->data;
485
486 LOG_DEBUG("%{public}s", __FUNCTION__);
487 SMP_CryptC1Step2Param cryptC1Step2Param;
488 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_7 started.");
489 int ret = SMP_ConstituteC1Step2Param(encData, SMP_ROLE_SLAVE, &cryptC1Step2Param);
490 if (ret != SMP_SUCCESS) {
491 return;
492 }
493 ret = SMP_CryptographicC1Step2(SMP_LEGACY_PAIR_SLAVE_STEP_7, &cryptC1Step2Param);
494 if (ret != SMP_SUCCESS) {
495 SMP_GeneratePairResult(
496 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
497 }
498 }
499
SMP_LegacyPairSlaveStep7(const SMP_StepParam * param)500 void SMP_LegacyPairSlaveStep7(const SMP_StepParam *param)
501 {
502 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
503 return;
504 }
505 uint8_t confirm[SMP_CONFIRM_DATA_LEN] = {0x00};
506 SMP_EncData *encData1 = (SMP_EncData *)param->data;
507 const HciLeEncryptReturnParam *returnParam = encData1->encRetParam;
508
509 LOG_DEBUG("%{public}s", __FUNCTION__);
510 int ret = SMP_EncryptCompleteJudgeException(returnParam->status, SMP_ROLE_SLAVE);
511 if (ret != SMP_SUCCESS) {
512 return;
513 }
514
515 SMP_MemoryReverseCopy(SMP_GetPairMng()->local.confirm, returnParam->encryptedData, SMP_CONFIRM_DATA_LEN);
516 SMP_MemoryReverseCopy(confirm, SMP_GetPairMng()->local.confirm, SMP_CONFIRM_DATA_LEN);
517 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_8 started.");
518 SMP_GetPairMng()->step = SMP_LEGACY_PAIR_SLAVE_STEP_8;
519 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
520 ret = SMP_SendPairingConfirm(SMP_GetPairMng()->handle, confirm, SMP_SendDataCallback);
521 if (ret != SMP_SUCCESS) {
522 LOG_ERROR("Send Pairing Confirm failed.");
523 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
524 SMP_PAIR_STATUS_FAILED,
525 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
526 SMP_GetPairMng()->alarm);
527 }
528 }
529
SMP_LegacyPairSlaveStep8(const SMP_StepParam * param)530 void SMP_LegacyPairSlaveStep8(const SMP_StepParam *param)
531 {
532 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
533 return;
534 }
535 SMP_CryptC1Step1Param cryptC1Step1Param;
536 LOG_DEBUG("%{public}s", __FUNCTION__);
537 SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.random, (uint8_t *)param->data, SMP_RANDOM_DATA_LEN);
538 SMP_ConstituteC1Step1Param(SMP_ROLE_SLAVE, SMP_GetPairMng()->peer.random, SMP_RANDOM_DATA_LEN, &cryptC1Step1Param);
539 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_9 started.");
540 int ret = SMP_CryptographicC1Step1(SMP_LEGACY_PAIR_SLAVE_STEP_9, &cryptC1Step1Param);
541 if (ret != SMP_SUCCESS) {
542 SMP_GeneratePairResult(
543 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
544 }
545 }
546
SMP_LegacyPairSlaveStep9(const SMP_StepParam * param)547 void SMP_LegacyPairSlaveStep9(const SMP_StepParam *param)
548 {
549 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
550 return;
551 }
552 SMP_EncData *encData = (SMP_EncData *)param->data;
553
554 LOG_DEBUG("%{public}s", __FUNCTION__);
555 SMP_CryptC1Step2Param cryptC1Step2Param;
556 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_10 started.");
557 int ret = SMP_ConstituteC1Step2Param(encData, SMP_ROLE_SLAVE, &cryptC1Step2Param);
558 if (ret != SMP_SUCCESS) {
559 return;
560 }
561 ret = SMP_CryptographicC1Step2(SMP_LEGACY_PAIR_SLAVE_STEP_10, &cryptC1Step2Param);
562 if (ret != SMP_SUCCESS) {
563 SMP_GeneratePairResult(
564 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
565 }
566 }
567
SMP_LegacyPairSlaveStep10(const SMP_StepParam * param)568 void SMP_LegacyPairSlaveStep10(const SMP_StepParam *param)
569 {
570 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
571 return;
572 }
573 SMP_EncData *encData = (SMP_EncData *)param->data;
574 const HciLeEncryptReturnParam *returnParam = encData->encRetParam;
575 uint8_t confirm[SMP_CONFIRM_DATA_LEN] = {0x00};
576 HciLeEncryptParam encryptParam;
577 SMP_CryptS1Param cryptS1Param;
578
579 LOG_DEBUG("%{public}s", __FUNCTION__);
580 int ret = SMP_EncryptCompleteJudgeException(returnParam->status, SMP_ROLE_SLAVE);
581 if (ret != SMP_SUCCESS) {
582 return;
583 }
584 SMP_MemoryReverseCopy(confirm, returnParam->encryptedData, SMP_CONFIRM_DATA_LEN);
585 if (memcmp(confirm, SMP_GetPairMng()->peer.confirm, SMP_CONFIRM_DATA_LEN)) {
586 SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_CONFIRM_VALUE, NULL);
587 LOG_ERROR("Confirm Check Failed");
588 } else {
589 LOG_INFO("Confirm Check Success");
590 LOG_INFO("Start Generate STK");
591 (void)memcpy_s(
592 cryptS1Param.r1, sizeof(cryptS1Param.r1), SMP_GetPairMng()->local.random, sizeof(cryptS1Param.r1));
593 (void)memcpy_s(
594 cryptS1Param.r2, sizeof(cryptS1Param.r2), SMP_GetPairMng()->peer.random, sizeof(cryptS1Param.r2));
595 SMP_CryptographicS1(&cryptS1Param);
596 SMP_MemoryReverseCopy(encryptParam.key, SMP_GetPairMng()->TK, SMP_TK_LEN);
597 SMP_MemoryReverseCopy(encryptParam.plaintextData, cryptS1Param.output, sizeof(cryptS1Param.output));
598 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_11 started.");
599 ret = SMP_SendLeEncryptCmd(&encryptParam, SMP_LEGACY_PAIR_SLAVE_STEP_11, NULL, SMP_USING_HW_AES128_PAIR);
600 if (ret != SMP_SUCCESS) {
601 SMP_GeneratePairResult(
602 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
603 }
604 }
605 }
606
SMP_LegacyPairSlaveStep11(const SMP_StepParam * param)607 void SMP_LegacyPairSlaveStep11(const SMP_StepParam *param)
608 {
609 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
610 return;
611 }
612 SMP_EncData *encData = (SMP_EncData *)param->data;
613 const HciLeEncryptReturnParam *returnParam = encData->encRetParam;
614 uint8_t randomTemp[SMP_RANDOM_DATA_LEN] = {0x00};
615
616 LOG_DEBUG("%{public}s", __FUNCTION__);
617 int ret = SMP_EncryptCompleteJudgeException(returnParam->status, SMP_ROLE_SLAVE);
618 if (ret != SMP_SUCCESS) {
619 return;
620 }
621
622 (void)memcpy_s(SMP_GetPairMng()->STK, SMP_STK_LEN, returnParam->encryptedData, SMP_STK_LEN);
623 if (SMP_GetPairMng()->encKeySize < SMP_STK_LEN) {
624 (void)memset_s(SMP_GetPairMng()->STK + SMP_GetPairMng()->encKeySize,
625 (SMP_STK_LEN - SMP_GetPairMng()->encKeySize),
626 0x00,
627 (SMP_STK_LEN - SMP_GetPairMng()->encKeySize));
628 }
629 SMP_MemoryReverseCopy(randomTemp, SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN);
630 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_12 started.");
631 SMP_GetPairMng()->step = SMP_LEGACY_PAIR_SLAVE_STEP_12;
632 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
633 ret = SMP_SendPairingRandom(SMP_GetPairMng()->handle, randomTemp, SMP_SendDataCallback);
634 if (ret != SMP_SUCCESS) {
635 LOG_ERROR("Send Pairing Random failed.");
636 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
637 SMP_PAIR_STATUS_FAILED,
638 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
639 SMP_GetPairMng()->alarm);
640 }
641 }
642
SMP_LegacyPairSlaveStep14(const SMP_StepParam * param)643 void SMP_LegacyPairSlaveStep14(const SMP_StepParam *param)
644 {
645 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
646 return;
647 }
648 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
649
650 LOG_DEBUG("%{public}s", __FUNCTION__);
651
652 (void)memcpy_s(SMP_GetPairMng()->local.LTK, SMP_LTK_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
653
654 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_15 started.");
655 int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_SLAVE_STEP_15);
656 if (ret != SMP_SUCCESS) {
657 SMP_GeneratePairResult(
658 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
659 }
660 }
661
SMP_LegacyPairSlaveStep15(const SMP_StepParam * param)662 void SMP_LegacyPairSlaveStep15(const SMP_StepParam *param)
663 {
664 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
665 return;
666 }
667 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
668
669 LOG_DEBUG("%{public}s", __FUNCTION__);
670
671 (void)memcpy_s(
672 SMP_GetPairMng()->local.LTK + SMP_RAND_NUM_LEN, SMP_RAND_NUM_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
673 SMP_LongTermKeyCopy(SMP_GetPairMng()->local.LTK, SMP_GetPairMng()->local.LTK, SMP_GetPairMng()->encKeySize);
674
675 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_16 started.");
676 int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_SLAVE_STEP_16);
677 if (ret != SMP_SUCCESS) {
678 SMP_GeneratePairResult(
679 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
680 }
681 }
682
SMP_LegacyPairSlaveStep16(const SMP_StepParam * param)683 void SMP_LegacyPairSlaveStep16(const SMP_StepParam *param)
684 {
685 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
686 return;
687 }
688 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
689
690 LOG_DEBUG("%{public}s", __FUNCTION__);
691
692 (void)memcpy_s(&SMP_GetPairMng()->local.masterIdEdiv,
693 sizeof(SMP_GetPairMng()->local.masterIdEdiv),
694 returnParam->randomNumber,
695 sizeof(SMP_GetPairMng()->local.masterIdEdiv));
696
697 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_17 started.");
698 int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_SLAVE_STEP_17);
699 if (ret != SMP_SUCCESS) {
700 SMP_GeneratePairResult(
701 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
702 }
703 }
704
SMP_LegacyPairSlaveStep17(const SMP_StepParam * param)705 void SMP_LegacyPairSlaveStep17(const SMP_StepParam *param)
706 {
707 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
708 return;
709 }
710 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
711 LOG_DEBUG("%{public}s", __FUNCTION__);
712 (void)memcpy_s(
713 SMP_GetPairMng()->local.masterIdRand, SMP_MASTER_RAND_LEN, returnParam->randomNumber, SMP_MASTER_RAND_LEN);
714 if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_SIGN_KEY) {
715 LOG_INFO("Local need to send SIGN_KEY.");
716 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_18 started.");
717 int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_SLAVE_STEP_18);
718 if (ret != SMP_SUCCESS) {
719 SMP_GeneratePairResult(
720 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
721 }
722 } else if ((SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ENC_KEY) ||
723 (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ID_KEY)) {
724 LOG_INFO("Local need to send ENC_KEY or SIGN_KEY");
725 SMP_GetPairMng()->step = SMP_LEGACY_PAIR_SLAVE_STEP_20;
726 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
727 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_20 Started");
728 if (SMP_SendDistributionKeysToRemote()) {
729 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
730 SMP_PAIR_STATUS_FAILED,
731 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
732 SMP_GetPairMng()->alarm);
733 }
734 } else {
735 if (!SMP_GetPairMng()->peer.keyDist) {
736 SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_SUCCESS, 0x00, NULL);
737 } else {
738 SMP_GetPairMng()->step = SMP_LEGACY_PAIR_SLAVE_STEP_20;
739 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_20 started");
740 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
741 }
742 }
743 }
744
SMP_LegacyPairSlaveStep18(const SMP_StepParam * param)745 void SMP_LegacyPairSlaveStep18(const SMP_StepParam *param)
746 {
747 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
748 return;
749 }
750 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
751
752 LOG_DEBUG("%{public}s", __FUNCTION__);
753
754 (void)memcpy_s(SMP_GetPairMng()->local.CSRK, SMP_CSRK_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
755
756 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_19 started.");
757 int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_SLAVE_STEP_19);
758 if (ret != SMP_SUCCESS) {
759 SMP_GeneratePairResult(
760 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
761 }
762 }
763
SMP_LegacyPairSlaveStep19(const SMP_StepParam * param)764 void SMP_LegacyPairSlaveStep19(const SMP_StepParam *param)
765 {
766 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
767 return;
768 }
769 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
770
771 LOG_DEBUG("%{public}s", __FUNCTION__);
772
773 (void)memcpy_s(
774 SMP_GetPairMng()->local.CSRK + SMP_RAND_NUM_LEN, SMP_RAND_NUM_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
775
776 LOG_INFO("Send keys to remote.");
777 LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_20 started.");
778 SMP_GetPairMng()->step = SMP_LEGACY_PAIR_SLAVE_STEP_20;
779 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
780 if (SMP_SendDistributionKeysToRemote()) {
781 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
782 SMP_PAIR_STATUS_FAILED,
783 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
784 SMP_GetPairMng()->alarm);
785 }
786 }