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 }