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_sc_initiator.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
27 static const uint8_t SALT[SMP_ENCRYPT_KEY_LEN] = {
28 0x6C, 0x88, 0x83, 0x91, 0xAA, 0xF5, 0xA5, 0x38, 0x60, 0x37, 0x0B, 0xDB, 0x5A, 0x60, 0x83, 0xBE
29 }; // The key of an encryption algorithm.
30
SMP_ScPairJustworkOrNumericMasterStep1(const SMP_StepParam * param)31 void SMP_ScPairJustworkOrNumericMasterStep1(const SMP_StepParam *param)
32 {
33 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
34 return;
35 }
36 const HciLeReadLocalP256PublicKeyCompleteEventParam *eventParam =
37 (HciLeReadLocalP256PublicKeyCompleteEventParam *)param->data;
38
39 LOG_DEBUG("%{public}s", __FUNCTION__);
40 (void)memcpy_s(
41 SMP_GetPairMng()->local.publicKey, SMP_PUBLICKEY_LEN, eventParam->localP256PublicKey, SMP_PUBLICKEY_LEN);
42 LOG_DEBUG("SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_2 started.");
43 SMP_GetPairMng()->step = SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_2;
44 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
45 int ret =
46 SMP_SendPairingPublicKey(SMP_GetPairMng()->handle, SMP_GetPairMng()->local.publicKey, SMP_SendDataCallback);
47 if (ret != SMP_SUCCESS) {
48 LOG_ERROR("Send pairing public key failed.");
49 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
50 SMP_PAIR_STATUS_FAILED,
51 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
52 SMP_GetPairMng()->alarm);
53 }
54 }
55
SMP_ScPairJustworkOrNumericMasterStep2(const SMP_StepParam * param)56 void SMP_ScPairJustworkOrNumericMasterStep2(const SMP_StepParam *param)
57 {
58 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
59 return;
60 }
61 HciLeGenerateDHKeyParam DHKeyParam;
62
63 LOG_DEBUG("%{public}s", __FUNCTION__);
64 AlarmCancel(SMP_GetPairMng()->alarm);
65 (void)memcpy_s(SMP_GetPairMng()->peer.publicKey, SMP_PUBLICKEY_LEN, (uint8_t *)param->data, SMP_PUBLICKEY_LEN);
66 SMP_GetPairMng()->step = SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_3;
67 (void)memcpy_s(
68 DHKeyParam.remoteP256PublicKey, SMP_PUBLICKEY_LEN, SMP_GetPairMng()->peer.publicKey, SMP_PUBLICKEY_LEN);
69 LOG_DEBUG("SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_3 started.");
70 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
71 int ret = HCI_LeGenerateDHKey(&DHKeyParam);
72 if (ret != SMP_SUCCESS) {
73 LOG_ERROR("HCI_LeGenerateDHKey Failed");
74 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
75 SMP_PAIR_STATUS_FAILED,
76 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
77 SMP_GetPairMng()->alarm);
78 }
79 }
80
SMP_ScPairJustworkOrNumericMasterStep3(const SMP_StepParam * param)81 void SMP_ScPairJustworkOrNumericMasterStep3(const SMP_StepParam *param)
82 {
83 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
84 return;
85 }
86
87 LOG_DEBUG("%{public}s", __FUNCTION__);
88 AlarmCancel(SMP_GetPairMng()->alarm);
89 SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.confirm, (uint8_t *)param->data, SMP_CONFIRM_DATA_LEN);
90 LOG_DEBUG("SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_4 started.");
91 SMP_GetPairMng()->step = SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_4;
92 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
93 }
94
SMP_ScPairJustworkOrNumericMasterStep4(const SMP_StepParam * param)95 void SMP_ScPairJustworkOrNumericMasterStep4(const SMP_StepParam *param)
96 {
97 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
98 return;
99 }
100 LOG_DEBUG("%{public}s", __FUNCTION__);
101 AlarmCancel(SMP_GetPairMng()->alarm);
102 SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.confirm, (uint8_t *)param->data, SMP_CONFIRM_DATA_LEN);
103 LOG_DEBUG("SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_5 started.");
104 int ret = SMP_SendHciLeRandCmd(SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_5);
105 if (ret != SMP_SUCCESS) {
106 SMP_GeneratePairResult(
107 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
108 }
109 }
110
SMP_ScPairJustworkOrNumericMasterStep5(const SMP_StepParam * param)111 void SMP_ScPairJustworkOrNumericMasterStep5(const SMP_StepParam *param)
112 {
113 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
114 return;
115 }
116 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
117
118 LOG_DEBUG("%{public}s", __FUNCTION__);
119 (void)memcpy_s(SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
120 LOG_DEBUG("SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_6 started.");
121 int ret = SMP_SendHciLeRandCmd(SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_6);
122 if (ret != SMP_SUCCESS) {
123 SMP_GeneratePairResult(
124 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
125 }
126 }
127
SMP_ScPairJustworkOrNumericMasterStep6(const SMP_StepParam * param)128 void SMP_ScPairJustworkOrNumericMasterStep6(const SMP_StepParam *param)
129 {
130 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
131 return;
132 }
133 uint8_t randomTemp[SMP_RANDOM_DATA_LEN] = {0x00};
134 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
135
136 LOG_DEBUG("%{public}s", __FUNCTION__);
137 (void)memcpy_s(SMP_GetPairMng()->local.random + SMP_RAND_NUM_LEN,
138 SMP_RAND_NUM_LEN,
139 returnParam->randomNumber,
140 SMP_RAND_NUM_LEN);
141 SMP_MemoryReverseCopy(randomTemp, SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN);
142 LOG_DEBUG("SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_7 started.");
143 SMP_GetPairMng()->step = SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_7;
144 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
145 int ret = SMP_SendPairingRandom(SMP_GetPairMng()->handle, randomTemp, SMP_SendDataCallback);
146 if (ret != SMP_SUCCESS) {
147 LOG_ERROR("Send pairing random error.");
148 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
149 SMP_PAIR_STATUS_FAILED,
150 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
151 SMP_GetPairMng()->alarm);
152 }
153 }
154
SMP_ScPairJustworkOrNumericMasterStep7(const SMP_StepParam * param)155 void SMP_ScPairJustworkOrNumericMasterStep7(const SMP_StepParam *param)
156 {
157 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
158 return;
159 }
160 uint8_t cryptAesCmacZ[CRYPT_AESCMAC_Z_LEN] = {0x00};
161 HciLeEncryptParam encryptParam;
162
163 LOG_DEBUG("%{public}s", __FUNCTION__);
164 SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.random, (uint8_t *)param->data, SMP_RANDOM_DATA_LEN);
165 SMP_MemoryReverseCopy(encryptParam.key, SMP_GetPairMng()->peer.random, SMP_RANDOM_DATA_LEN);
166 (void)memcpy_s(encryptParam.plaintextData, sizeof(encryptParam.plaintextData), cryptAesCmacZ, CRYPT_AESCMAC_Z_LEN);
167 LOG_DEBUG("SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_8 started.");
168 int ret = SMP_SendLeEncryptCmd(
169 &encryptParam, SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_8, NULL, SMP_USING_HW_AES128_PAIR);
170 if (ret != SMP_SUCCESS) {
171 SMP_GeneratePairResult(
172 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
173 }
174 (void)memset_s(encryptParam.key, SMP_ENCRYPT_KEY_LEN, 0x00, SMP_ENCRYPT_KEY_LEN);
175 }
176
SMP_ScPairJustworkOrNumericMasterStep8(const SMP_StepParam * param)177 void SMP_ScPairJustworkOrNumericMasterStep8(const SMP_StepParam *param)
178 {
179 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
180 return;
181 }
182 SMP_EncData *encData = (SMP_EncData *)param->data;
183 SMP_CryptF4Param cryptF4Param;
184 bool isPasskey = false;
185 LOG_DEBUG("%{public}s", __FUNCTION__);
186 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
187 if (ret != SMP_SUCCESS) {
188 return;
189 }
190 SMP_GetPublicKeyX(SMP_GetPairMng()->peer.publicKey, cryptF4Param.U, sizeof(cryptF4Param.U));
191 SMP_GetPublicKeyX(SMP_GetPairMng()->local.publicKey, cryptF4Param.V, sizeof(cryptF4Param.V));
192 SMP_ConstituteF4Param(isPasskey, &cryptF4Param);
193 SMP_CryptographicF4(&cryptF4Param);
194 SMP_CryptAesCmacStep3Param cryptAesCmacStep3Param;
195 SMP_ConstituteAesCmacStep3Param(encData, cryptF4Param.output, CRYPT_F4_OUT_LEN, &cryptAesCmacStep3Param);
196 cryptAesCmacStep3Param.stepA = SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_9;
197 cryptAesCmacStep3Param.stepB = SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_10;
198 ret = SMP_CryptographicAesCmacStep3(&cryptAesCmacStep3Param);
199 if (ret != SMP_SUCCESS) {
200 SMP_GeneratePairResult(
201 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
202 }
203 (void)memset_s(cryptAesCmacStep3Param.key, CRYPT_AESCMAC_KEY_LEN, 0x00, CRYPT_AESCMAC_KEY_LEN);
204 }
205
SMP_ScPairJustworkOrNumericMasterStep9(const SMP_StepParam * param)206 void SMP_ScPairJustworkOrNumericMasterStep9(const SMP_StepParam *param)
207 {
208 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
209 return;
210 }
211 SMP_CryptAesCmacStep4Param cryptAesCmacStep4Param;
212 SMP_EncData *encData = (SMP_EncData *)param->data;
213 LOG_DEBUG("%{public}s", __FUNCTION__);
214 int ret = SMP_ConstituteAesCmacStep4Param(encData,
215 SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_9,
216 SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_10,
217 SMP_ROLE_MASTER,
218 &cryptAesCmacStep4Param);
219 if (!ret) {
220 ret = SMP_CryptographicAesCmacStep4(&cryptAesCmacStep4Param);
221 }
222 if (ret != SMP_SUCCESS) {
223 SMP_GeneratePairResult(
224 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
225 }
226 }
227
SMP_ScPairJustworkOrNumericMasterStep10(const SMP_StepParam * param)228 void SMP_ScPairJustworkOrNumericMasterStep10(const SMP_StepParam *param)
229 {
230 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
231 return;
232 }
233 SMP_EncData *encData = (SMP_EncData *)param->data;
234 uint8_t confirmTemp[SMP_CONFIRM_DATA_LEN] = {0x00};
235 HciLeEncryptParam encryptParam;
236 LOG_DEBUG("%{public}s", __FUNCTION__);
237 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
238 if (ret != SMP_SUCCESS) {
239 return;
240 }
241 SMP_MemoryReverseCopy(confirmTemp, encData->encRetParam->encryptedData, SMP_CONFIRM_DATA_LEN);
242 if (memcmp(confirmTemp, SMP_GetPairMng()->peer.confirm, SMP_CONFIRM_DATA_LEN) != 0x00) {
243 LOG_ERROR("Confirm Check Failed.");
244 SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_CONFIRM_VALUE, NULL);
245 } else {
246 LOG_INFO("Confirm Check Success.");
247 uint8_t cryptAesCmacZ[CRYPT_AESCMAC_Z_LEN] = {0x00};
248 if (SMP_GetPairMng()->local.pairMethod == SMP_PAIR_METHOD_JUST_WORK) {
249 SMP_MemoryReverseCopy(encryptParam.key, SALT, sizeof(encryptParam.key));
250 (void)memcpy_s(
251 encryptParam.plaintextData, sizeof(encryptParam.plaintextData), cryptAesCmacZ, CRYPT_AESCMAC_Z_LEN);
252 LOG_DEBUG("SMP_SC_PAIR_COMMON_MASTER_STEP_1 started.");
253 ret = SMP_SendLeEncryptCmd(&encryptParam, SMP_SC_PAIR_COMMON_MASTER_STEP_1, NULL, SMP_USING_HW_AES128_PAIR);
254 } else {
255 SMP_MemoryReverseCopy(encryptParam.key, SMP_GetPairMng()->local.random, sizeof(encryptParam.key));
256 (void)memcpy_s(
257 encryptParam.plaintextData, sizeof(encryptParam.plaintextData), cryptAesCmacZ, CRYPT_AESCMAC_Z_LEN);
258 LOG_DEBUG("SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_11 started.");
259 ret = SMP_SendLeEncryptCmd(
260 &encryptParam, SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_11, NULL, SMP_USING_HW_AES128_PAIR);
261 }
262 if (ret != SMP_SUCCESS) {
263 SMP_GeneratePairResult(
264 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
265 }
266 }
267 (void)memset_s(encryptParam.key, SMP_ENCRYPT_KEY_LEN, 0x00, SMP_ENCRYPT_KEY_LEN);
268 }
269
SMP_ScPairJustworkOrNumericMasterStep11(const SMP_StepParam * param)270 void SMP_ScPairJustworkOrNumericMasterStep11(const SMP_StepParam *param)
271 {
272 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
273 return;
274 }
275 SMP_EncData *encData = (SMP_EncData *)param->data;
276 SMP_CryptAesCmacStep3Param cryptAesCmacStep3Param;
277 SMP_CryptG2Param cryptG2Param;
278 LOG_DEBUG("%{public}s", __FUNCTION__);
279 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
280 if (ret != SMP_SUCCESS) {
281 return;
282 }
283 SMP_GetPublicKeyX(SMP_GetPairMng()->local.publicKey, cryptG2Param.U, sizeof(cryptG2Param.U));
284 SMP_GetPublicKeyX(SMP_GetPairMng()->peer.publicKey, cryptG2Param.V, sizeof(cryptG2Param.V));
285 (void)memcpy_s(cryptG2Param.Y, sizeof(cryptG2Param.Y), SMP_GetPairMng()->peer.random, sizeof(cryptG2Param.Y));
286 SMP_CryptographicG2(&cryptG2Param);
287 SMP_ConstituteAesCmacStep3Param(encData, cryptG2Param.output, CRYPT_G2_OUT_LEN, &cryptAesCmacStep3Param);
288 cryptAesCmacStep3Param.stepA = SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_12;
289 cryptAesCmacStep3Param.stepB = SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_13;
290 ret = SMP_CryptographicAesCmacStep3(&cryptAesCmacStep3Param);
291 if (ret != SMP_SUCCESS) {
292 SMP_GeneratePairResult(
293 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
294 }
295 (void)memset_s(cryptAesCmacStep3Param.key, CRYPT_AESCMAC_KEY_LEN, 0x00, CRYPT_AESCMAC_KEY_LEN);
296 }
297
SMP_ScPairJustworkOrNumericMasterStep12(const SMP_StepParam * param)298 void SMP_ScPairJustworkOrNumericMasterStep12(const SMP_StepParam *param)
299 {
300 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
301 return;
302 }
303 SMP_EncData *encData = (SMP_EncData *)param->data;
304 LOG_DEBUG("%{public}s", __FUNCTION__);
305 SMP_CryptAesCmacStep4Param cryptAesCmacStep4Param;
306 int ret = SMP_ConstituteAesCmacStep4Param(encData,
307 SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_12,
308 SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_13,
309 SMP_ROLE_MASTER,
310 &cryptAesCmacStep4Param);
311 if (!ret) {
312 ret = SMP_CryptographicAesCmacStep4(&cryptAesCmacStep4Param);
313 }
314 if (ret != SMP_SUCCESS) {
315 SMP_GeneratePairResult(
316 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
317 }
318 }
319
SMP_ScPairJustworkOrNumericMasterStep13(const SMP_StepParam * param)320 void SMP_ScPairJustworkOrNumericMasterStep13(const SMP_StepParam *param)
321 {
322 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
323 return;
324 }
325 SMP_EncData *encData = (SMP_EncData *)param->data;
326 uint16_t handle = SMP_GetPairMng()->handle;
327 uint8_t pairMethod = SMP_GetPairMng()->local.pairMethod;
328 uint32_t numeric;
329 LOG_DEBUG("%{public}s", __FUNCTION__);
330 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
331 if (ret != SMP_SUCCESS) {
332 return;
333 }
334 numeric = *((uint32_t *)encData->encRetParam->encryptedData);
335 numeric = numeric % (SMP_MAX_NUMERIC_VALUE + 0x01);
336 LOG_DEBUG("SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_14 started.");
337 SMP_GetPairMng()->step = SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_14;
338 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
339 SMP_NotifyCbAuthReq(handle, pairMethod, (uint8_t *)&numeric);
340 }
341
SMP_ScPairPasskeyEntryMasterStep1(const SMP_StepParam * param)342 void SMP_ScPairPasskeyEntryMasterStep1(const SMP_StepParam *param)
343 {
344 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
345 return;
346 }
347 const HciLeReadLocalP256PublicKeyCompleteEventParam *eventParam =
348 (HciLeReadLocalP256PublicKeyCompleteEventParam *)param->data;
349
350 LOG_DEBUG("%{public}s", __FUNCTION__);
351 (void)memcpy_s(
352 SMP_GetPairMng()->local.publicKey, SMP_PUBLICKEY_LEN, eventParam->localP256PublicKey, SMP_PUBLICKEY_LEN);
353 LOG_DEBUG("SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_2 started.");
354 SMP_GetPairMng()->step = SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_2;
355 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
356 int ret =
357 SMP_SendPairingPublicKey(SMP_GetPairMng()->handle, SMP_GetPairMng()->local.publicKey, SMP_SendDataCallback);
358 if (ret != SMP_SUCCESS) {
359 LOG_ERROR("Send pairing public key failed.");
360 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
361 SMP_PAIR_STATUS_FAILED,
362 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
363 SMP_GetPairMng()->alarm);
364 }
365 }
366
SMP_ScPairPasskeyEntryMasterStep2(const SMP_StepParam * param)367 void SMP_ScPairPasskeyEntryMasterStep2(const SMP_StepParam *param)
368 {
369 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
370 return;
371 }
372 HciLeGenerateDHKeyParam DHKeyParam;
373
374 LOG_DEBUG("%{public}s", __FUNCTION__);
375 AlarmCancel(SMP_GetPairMng()->alarm);
376 (void)memcpy_s(SMP_GetPairMng()->peer.publicKey, SMP_PUBLICKEY_LEN, (uint8_t *)param->data, SMP_PUBLICKEY_LEN);
377 SMP_GetPairMng()->step = SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_3;
378 (void)memcpy_s(
379 DHKeyParam.remoteP256PublicKey, SMP_PUBLICKEY_LEN, SMP_GetPairMng()->peer.publicKey, SMP_PUBLICKEY_LEN);
380 LOG_DEBUG("SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_3 Started.");
381 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
382 int ret = HCI_LeGenerateDHKey(&DHKeyParam);
383 if (ret != SMP_SUCCESS) {
384 LOG_ERROR("HCI_LeGenerateDHKey Failed.");
385 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
386 SMP_PAIR_STATUS_FAILED,
387 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
388 SMP_GetPairMng()->alarm);
389 }
390 }
391
SMP_ScPairPasskeyEntryMasterStep3(const SMP_StepParam * param)392 void SMP_ScPairPasskeyEntryMasterStep3(const SMP_StepParam *param)
393 {
394 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
395 return;
396 }
397 uint16_t handle = SMP_GetPairMng()->handle;
398 uint8_t pairMethod = SMP_GetPairMng()->local.pairMethod;
399 const HciLeGenerateDHKeyCompleteEventParam *eventParam = (HciLeGenerateDHKeyCompleteEventParam *)param->data;
400
401 LOG_DEBUG("%{public}s", __FUNCTION__);
402 SMP_MemoryReverseCopy(SMP_GetPairMng()->DHKey, eventParam->DHKey, SMP_DHKEY_LEN);
403 if (SMP_GetPairMng()->local.pairMethod == SMP_PAIR_METHOD_PASSKEY_DISPLAY) {
404 LOG_DEBUG("SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_4 started.");
405 SMP_GetPairMng()->scConfirmCheckCounter = 0x00;
406 int ret = SMP_SendHciLeRandCmd(SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_4);
407 if (ret != SMP_SUCCESS) {
408 SMP_GeneratePairResult(
409 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
410 }
411 } else {
412 LOG_DEBUG("SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_5 started.");
413 SMP_GetPairMng()->scConfirmCheckCounter = 0x00;
414 SMP_GetPairMng()->step = SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_5;
415 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
416 SMP_NotifyCbAuthReq(handle, pairMethod, NULL);
417 }
418 }
419
SMP_ScPairPasskeyEntryMasterStep4(const SMP_StepParam * param)420 void SMP_ScPairPasskeyEntryMasterStep4(const SMP_StepParam *param)
421 {
422 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
423 return;
424 }
425 uint32_t passkey;
426 uint16_t handle = SMP_GetPairMng()->handle;
427 uint8_t pairMethod = SMP_GetPairMng()->local.pairMethod;
428 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
429
430 LOG_DEBUG("%{public}s", __FUNCTION__);
431 passkey = *((uint32_t *)returnParam->randomNumber);
432 passkey = passkey % (SMP_MAX_PASSKEY_VALUE + 0x01);
433 LOG_DEBUG("SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_5 started.");
434 SMP_GetPairMng()->step = SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_5;
435 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
436 SMP_NotifyCbAuthReq(handle, pairMethod, (uint8_t *)&passkey);
437 }
438
SMP_ScPairPasskeyEntryMasterStep6(const SMP_StepParam * param)439 void SMP_ScPairPasskeyEntryMasterStep6(const SMP_StepParam *param)
440 {
441 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
442 return;
443 }
444 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
445
446 LOG_DEBUG("%{public}s", __FUNCTION__);
447 (void)memcpy_s(SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
448 LOG_DEBUG("SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_7 started.");
449 int ret = SMP_SendHciLeRandCmd(SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_7);
450 if (ret != SMP_SUCCESS) {
451 SMP_GeneratePairResult(
452 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
453 }
454 }
455
SMP_ScPairPasskeyEntryMasterStep7(const SMP_StepParam * param)456 void SMP_ScPairPasskeyEntryMasterStep7(const SMP_StepParam *param)
457 {
458 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
459 return;
460 }
461 uint8_t cryptAesCmacZ[CRYPT_AESCMAC_Z_LEN] = {0x00};
462 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
463 HciLeEncryptParam encryptParam;
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_MemoryReverseCopy(encryptParam.key, SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN);
471 (void)memcpy_s(encryptParam.plaintextData, sizeof(encryptParam.plaintextData), cryptAesCmacZ, CRYPT_AESCMAC_Z_LEN);
472 LOG_DEBUG("SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_8 started.");
473 int ret =
474 SMP_SendLeEncryptCmd(&encryptParam, SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_8, NULL, SMP_USING_HW_AES128_PAIR);
475 if (ret != SMP_SUCCESS) {
476 SMP_GeneratePairResult(
477 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
478 }
479 (void)memset_s(encryptParam.key, SMP_ENCRYPT_KEY_LEN, 0x00, SMP_ENCRYPT_KEY_LEN);
480 }
481
SMP_ScPairPasskeyEntryMasterStep8(const SMP_StepParam * param)482 void SMP_ScPairPasskeyEntryMasterStep8(const SMP_StepParam *param)
483 {
484 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
485 return;
486 }
487 SMP_EncData *encData = (SMP_EncData *)param->data;
488 SMP_CryptF4Param cryptF4Param;
489 bool isPasskey = true;
490 LOG_DEBUG("%{public}s", __FUNCTION__);
491 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
492 if (ret != SMP_SUCCESS) {
493 return;
494 }
495 SMP_GetPublicKeyX(SMP_GetPairMng()->local.publicKey, cryptF4Param.U, sizeof(cryptF4Param.U));
496 SMP_GetPublicKeyX(SMP_GetPairMng()->peer.publicKey, cryptF4Param.V, sizeof(cryptF4Param.V));
497 SMP_ConstituteF4Param(isPasskey, &cryptF4Param);
498 SMP_CryptographicF4(&cryptF4Param);
499 SMP_CryptAesCmacStep3Param cryptAesCmacStep3Param;
500 SMP_ConstituteAesCmacStep3Param(encData, cryptF4Param.output, CRYPT_F4_OUT_LEN, &cryptAesCmacStep3Param);
501 cryptAesCmacStep3Param.stepA = SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_9;
502 cryptAesCmacStep3Param.stepB = SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_10;
503 ret = SMP_CryptographicAesCmacStep3(&cryptAesCmacStep3Param);
504 if (ret != SMP_SUCCESS) {
505 SMP_GeneratePairResult(
506 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
507 }
508 (void)memset_s(cryptAesCmacStep3Param.key, CRYPT_AESCMAC_KEY_LEN, 0x00, CRYPT_AESCMAC_KEY_LEN);
509 }
510
SMP_ScPairPasskeyEntryMasterStep9(const SMP_StepParam * param)511 void SMP_ScPairPasskeyEntryMasterStep9(const SMP_StepParam *param)
512 {
513 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
514 return;
515 }
516 SMP_EncData *encData = (SMP_EncData *)param->data;
517 LOG_DEBUG("%{public}s", __FUNCTION__);
518 SMP_CryptAesCmacStep4Param cryptAesCmacStep4Param;
519 int ret = SMP_ConstituteAesCmacStep4Param(encData,
520 SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_9,
521 SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_10,
522 SMP_ROLE_MASTER,
523 &cryptAesCmacStep4Param);
524 if (!ret) {
525 ret = SMP_CryptographicAesCmacStep4(&cryptAesCmacStep4Param);
526 }
527 if (ret != SMP_SUCCESS) {
528 SMP_GeneratePairResult(
529 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
530 }
531 }
532
SMP_ScPairPasskeyEntryMasterStep10(const SMP_StepParam * param)533 void SMP_ScPairPasskeyEntryMasterStep10(const SMP_StepParam *param)
534 {
535 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
536 return;
537 }
538 uint8_t confirmTemp[SMP_CONFIRM_DATA_LEN] = {0x00};
539 SMP_EncData *encData = (SMP_EncData *)param->data;
540 LOG_DEBUG("%{public}s", __FUNCTION__);
541 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
542 if (ret != SMP_SUCCESS) {
543 return;
544 }
545
546 SMP_MemoryReverseCopy(SMP_GetPairMng()->local.confirm, encData->encRetParam->encryptedData, SMP_CONFIRM_DATA_LEN);
547 SMP_MemoryReverseCopy(confirmTemp, SMP_GetPairMng()->local.confirm, SMP_CONFIRM_DATA_LEN);
548 LOG_DEBUG("SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_11 started.");
549 SMP_GetPairMng()->step = SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_11;
550 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
551 ret = SMP_SendPairingConfirm(SMP_GetPairMng()->handle, confirmTemp, SMP_SendDataCallback);
552 if (ret != SMP_SUCCESS) {
553 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
554 SMP_PAIR_STATUS_FAILED,
555 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
556 SMP_GetPairMng()->alarm);
557 LOG_ERROR("Send Pairing Confirm failed.");
558 }
559 }
560
SMP_ScPairPasskeyEntryMasterStep11(const SMP_StepParam * param)561 void SMP_ScPairPasskeyEntryMasterStep11(const SMP_StepParam *param)
562 {
563 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
564 return;
565 }
566 uint8_t randomTemp[SMP_RANDOM_DATA_LEN] = {0x00};
567
568 LOG_DEBUG("%{public}s", __FUNCTION__);
569 AlarmCancel(SMP_GetPairMng()->alarm);
570 SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.confirm, (uint8_t *)param->data, SMP_CONFIRM_DATA_LEN);
571 SMP_MemoryReverseCopy(randomTemp, SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN);
572 LOG_DEBUG("SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_12 started.");
573 SMP_GetPairMng()->step = SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_12;
574 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
575 int ret = SMP_SendPairingRandom(SMP_GetPairMng()->handle, randomTemp, SMP_SendDataCallback);
576 if (ret != SMP_SUCCESS) {
577 LOG_ERROR("Send Pairing random error.");
578 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
579 SMP_PAIR_STATUS_FAILED,
580 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
581 SMP_GetPairMng()->alarm);
582 }
583 }
584
SMP_ScPairPasskeyEntryMasterStep12(const SMP_StepParam * param)585 void SMP_ScPairPasskeyEntryMasterStep12(const SMP_StepParam *param)
586 {
587 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
588 return;
589 }
590 uint8_t cryptAesCmacZ[CRYPT_AESCMAC_Z_LEN] = {0x00};
591 HciLeEncryptParam encryptParam;
592
593 LOG_DEBUG("%{public}s", __FUNCTION__);
594 SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.random, (uint8_t *)param->data, SMP_RANDOM_DATA_LEN);
595 SMP_MemoryReverseCopy(encryptParam.key, SMP_GetPairMng()->peer.random, SMP_RANDOM_DATA_LEN);
596 (void)memcpy_s(encryptParam.plaintextData, sizeof(encryptParam.plaintextData), cryptAesCmacZ, CRYPT_AESCMAC_Z_LEN);
597 LOG_DEBUG("SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_13 started.");
598 int ret =
599 SMP_SendLeEncryptCmd(&encryptParam, SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_13, 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 (void)memset_s(encryptParam.key, SMP_ENCRYPT_KEY_LEN, 0x00, SMP_ENCRYPT_KEY_LEN);
605 }
606
SMP_ScPairPasskeyEntryMasterStep13(const SMP_StepParam * param)607 void SMP_ScPairPasskeyEntryMasterStep13(const SMP_StepParam *param)
608 {
609 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
610 return;
611 }
612 SMP_CryptAesCmacStep3Param cryptAesCmcStep3Param;
613 SMP_CryptF4Param cryptF4Param;
614 SMP_EncData *encData = (SMP_EncData *)param->data;
615 bool isPasskey = true;
616 LOG_DEBUG("%{public}s", __FUNCTION__);
617 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
618 if (ret != SMP_SUCCESS) {
619 return;
620 }
621 SMP_GetPublicKeyX(SMP_GetPairMng()->peer.publicKey, cryptF4Param.U, sizeof(cryptF4Param.U));
622 SMP_GetPublicKeyX(SMP_GetPairMng()->local.publicKey, cryptF4Param.V, sizeof(cryptF4Param.V));
623 SMP_ConstituteF4Param(isPasskey, &cryptF4Param);
624 SMP_CryptographicF4(&cryptF4Param);
625 SMP_CryptAesCmacStep3Param cryptAesCmacStep3Param;
626 SMP_ConstituteAesCmacStep3Param(encData, cryptF4Param.output, CRYPT_F4_OUT_LEN, &cryptAesCmacStep3Param);
627 cryptAesCmacStep3Param.stepA = SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_14;
628 cryptAesCmacStep3Param.stepB = SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_15;
629 ret = SMP_CryptographicAesCmacStep3(&cryptAesCmacStep3Param);
630 if (ret != SMP_SUCCESS) {
631 SMP_GeneratePairResult(
632 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
633 }
634 (void)memset_s(cryptAesCmcStep3Param.key, CRYPT_AESCMAC_KEY_LEN, 0x00, CRYPT_AESCMAC_KEY_LEN);
635 }
636
SMP_ScPairPasskeyEntryMasterStep14(const SMP_StepParam * param)637 void SMP_ScPairPasskeyEntryMasterStep14(const SMP_StepParam *param)
638 {
639 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
640 return;
641 }
642 SMP_EncData *encData = (SMP_EncData *)param->data;
643 LOG_DEBUG("%{public}s", __FUNCTION__);
644 SMP_CryptAesCmacStep4Param cryptAesCmacStep4Param;
645 int ret = SMP_ConstituteAesCmacStep4Param(encData,
646 SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_14,
647 SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_15,
648 SMP_ROLE_MASTER,
649 &cryptAesCmacStep4Param);
650 if (!ret) {
651 ret = SMP_CryptographicAesCmacStep4(&cryptAesCmacStep4Param);
652 }
653 if (ret != SMP_SUCCESS) {
654 SMP_GeneratePairResult(
655 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
656 }
657 }
658
SMP_ScPairPasskeyEntryMasterStep15(const SMP_StepParam * param)659 void SMP_ScPairPasskeyEntryMasterStep15(const SMP_StepParam *param)
660 {
661 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
662 return;
663 }
664 SMP_EncData *encData = (SMP_EncData *)param->data;
665 uint8_t confirmTemp[SMP_CONFIRM_DATA_LEN] = {0x00};
666 HciLeEncryptParam encryptParam;
667 LOG_DEBUG("%{public}s", __FUNCTION__);
668 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
669 if (ret != SMP_SUCCESS) {
670 return;
671 }
672 SMP_MemoryReverseCopy(confirmTemp, encData->encRetParam->encryptedData, SMP_CONFIRM_DATA_LEN);
673 if (memcmp(confirmTemp, SMP_GetPairMng()->peer.confirm, SMP_CONFIRM_DATA_LEN) != 0x00) {
674 SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_CONFIRM_VALUE, NULL);
675 LOG_ERROR("Confirm Check Failed.");
676 } else {
677 LOG_INFO("Confirm Check Success");
678 SMP_GetPairMng()->scConfirmCheckCounter++;
679 if (SMP_GetPairMng()->scConfirmCheckCounter == 0x14) {
680 SMP_MemoryReverseCopy(encryptParam.key, SALT, sizeof(encryptParam.key));
681 uint8_t cryptAesCmacZ[CRYPT_AESCMAC_Z_LEN] = {0x00};
682 (void)memcpy_s(
683 encryptParam.plaintextData, sizeof(encryptParam.plaintextData), cryptAesCmacZ, CRYPT_AESCMAC_Z_LEN);
684 LOG_DEBUG("SMP_SC_PAIR_COMMON_MASTER_STEP_1 started.");
685 ret = SMP_SendLeEncryptCmd(&encryptParam, SMP_SC_PAIR_COMMON_MASTER_STEP_1, NULL, SMP_USING_HW_AES128_PAIR);
686 } else {
687 LOG_DEBUG("SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_6 started.");
688 ret = SMP_SendHciLeRandCmd(SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_6);
689 }
690 if (ret != SMP_SUCCESS) {
691 SMP_GeneratePairResult(
692 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
693 }
694 }
695 (void)memset_s(encryptParam.key, SMP_ENCRYPT_KEY_LEN, 0x00, SMP_ENCRYPT_KEY_LEN);
696 }
697
SMP_ScPairOobMasterStep1(const SMP_StepParam * param)698 void SMP_ScPairOobMasterStep1(const SMP_StepParam *param)
699 {
700 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
701 return;
702 }
703 uint16_t handle = SMP_GetPairMng()->handle;
704 uint8_t pairMethod = SMP_GetPairMng()->local.pairMethod;
705 const HciLeReadLocalP256PublicKeyCompleteEventParam *eventParam =
706 (HciLeReadLocalP256PublicKeyCompleteEventParam *)param->data;
707
708 LOG_DEBUG("%{public}s", __FUNCTION__);
709 (void)memcpy_s(
710 SMP_GetPairMng()->local.publicKey, SMP_PUBLICKEY_LEN, eventParam->localP256PublicKey, SMP_PUBLICKEY_LEN);
711 LOG_DEBUG("SMP_SC_PAIR_OOB_MASTER_STEP_7 started.");
712 SMP_GetPairMng()->step = SMP_SC_PAIR_OOB_MASTER_STEP_7;
713 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
714 SMP_NotifyCbAuthReq(handle, pairMethod, NULL);
715 }
716
SMP_ScPairOobMasterStep8(const SMP_StepParam * param)717 void SMP_ScPairOobMasterStep8(const SMP_StepParam *param)
718 {
719 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
720 return;
721 }
722 HciLeGenerateDHKeyParam DHKeyParam;
723
724 LOG_DEBUG("%{public}s", __FUNCTION__);
725 AlarmCancel(SMP_GetPairMng()->alarm);
726 (void)memcpy_s(SMP_GetPairMng()->peer.publicKey, SMP_PUBLICKEY_LEN, (uint8_t *)param->data, SMP_PUBLICKEY_LEN);
727 SMP_GetPairMng()->step = SMP_SC_PAIR_OOB_MASTER_STEP_9;
728 (void)memcpy_s(
729 DHKeyParam.remoteP256PublicKey, SMP_PUBLICKEY_LEN, SMP_GetPairMng()->peer.publicKey, SMP_PUBLICKEY_LEN);
730 LOG_DEBUG("SMP_SC_PAIR_OOB_MASTER_STEP_9 started.");
731 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
732 int ret = HCI_LeGenerateDHKey(&DHKeyParam);
733 if (ret != SMP_SUCCESS) {
734 LOG_ERROR("HCI_LeGenerateDHKey failed");
735 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
736 SMP_PAIR_STATUS_FAILED,
737 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
738 SMP_GetPairMng()->alarm);
739 }
740 }
741
SMP_ScPairOobMasterStep9(const SMP_StepParam * param)742 void SMP_ScPairOobMasterStep9(const SMP_StepParam *param)
743 {
744 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
745 return;
746 }
747 int ret;
748 HciLeEncryptParam encryptParam;
749 const HciLeGenerateDHKeyCompleteEventParam *eventParam = (HciLeGenerateDHKeyCompleteEventParam *)param->data;
750
751 LOG_DEBUG("%{public}s", __FUNCTION__);
752 SMP_MemoryReverseCopy(SMP_GetPairMng()->DHKey, eventParam->DHKey, SMP_DHKEY_LEN);
753 if ((SMP_GetPairMng()->local.pairMethod == SMP_PAIR_METHOD_OOB_SC_BOTH_SIDE_SEND_RECV) ||
754 (SMP_GetPairMng()->local.pairMethod == SMP_PAIR_METHOD_OOB_SC_LOCAL_RECV_PEER_SEND)) {
755 uint8_t cryptAesCmacZ[CRYPT_AESCMAC_Z_LEN] = {0x00};
756 SMP_MemoryReverseCopy(encryptParam.key, SMP_GetPairMng()->peer.oobRand, SMP_RANDOM_DATA_LEN);
757 (void)memcpy_s(
758 encryptParam.plaintextData, sizeof(encryptParam.plaintextData), cryptAesCmacZ, sizeof(cryptAesCmacZ));
759 LOG_DEBUG("SMP_SC_PAIR_OOB_MASTER_STEP_10 Started.");
760 ret = SMP_SendLeEncryptCmd(&encryptParam, SMP_SC_PAIR_OOB_MASTER_STEP_10, NULL, SMP_USING_HW_AES128_PAIR);
761 if (ret != SMP_SUCCESS) {
762 SMP_GeneratePairResult(
763 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
764 }
765 } else {
766 LOG_DEBUG("SMP_SC_PAIR_OOB_MASTER_STEP_13 started.");
767 ret = SMP_SendHciLeRandCmd(SMP_SC_PAIR_OOB_MASTER_STEP_13);
768 if (ret != SMP_SUCCESS) {
769 SMP_GeneratePairResult(
770 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
771 }
772 }
773 (void)memset_s(encryptParam.key, SMP_ENCRYPT_KEY_LEN, 0x00, SMP_ENCRYPT_KEY_LEN);
774 }
775
SMP_ScPairOobMasterStep10(const SMP_StepParam * param)776 void SMP_ScPairOobMasterStep10(const SMP_StepParam *param)
777 {
778 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
779 return;
780 }
781 SMP_EncData *encData = (SMP_EncData *)param->data;
782 SMP_CryptF4Param cryptF4Param;
783 bool isPasskey = false;
784 LOG_DEBUG("%{public}s", __FUNCTION__);
785 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
786 if (ret != SMP_SUCCESS) {
787 return;
788 }
789 SMP_GetPublicKeyX(SMP_GetPairMng()->peer.publicKey, cryptF4Param.U, sizeof(cryptF4Param.U));
790 SMP_GetPublicKeyX(SMP_GetPairMng()->peer.publicKey, cryptF4Param.V, sizeof(cryptF4Param.V));
791 SMP_ConstituteF4Param(isPasskey, &cryptF4Param);
792 SMP_CryptographicF4(&cryptF4Param);
793 SMP_CryptAesCmacStep3Param cryptAesCmacStep3Param;
794 SMP_ConstituteAesCmacStep3Param(encData, cryptF4Param.output, CRYPT_F4_OUT_LEN, &cryptAesCmacStep3Param);
795 cryptAesCmacStep3Param.stepA = SMP_SC_PAIR_OOB_MASTER_STEP_11;
796 cryptAesCmacStep3Param.stepB = SMP_SC_PAIR_OOB_MASTER_STEP_12;
797 ret = SMP_CryptographicAesCmacStep3(&cryptAesCmacStep3Param);
798 if (ret != SMP_SUCCESS) {
799 SMP_GeneratePairResult(
800 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
801 }
802 (void)memset_s(cryptAesCmacStep3Param.key, CRYPT_AESCMAC_KEY_LEN, 0x00, CRYPT_AESCMAC_KEY_LEN);
803 }
804
SMP_ScPairOobMasterStep11(const SMP_StepParam * param)805 void SMP_ScPairOobMasterStep11(const SMP_StepParam *param)
806 {
807 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
808 return;
809 }
810 SMP_CryptAesCmacStep4Param cryptAesCmacStep4Param;
811 SMP_EncData *encData = (SMP_EncData *)param->data;
812 LOG_DEBUG("%{public}s", __FUNCTION__);
813 int ret = SMP_ConstituteAesCmacStep4Param(encData,
814 SMP_SC_PAIR_OOB_MASTER_STEP_11,
815 SMP_SC_PAIR_OOB_MASTER_STEP_12,
816 SMP_ROLE_MASTER,
817 &cryptAesCmacStep4Param);
818 if (!ret) {
819 ret = SMP_CryptographicAesCmacStep4(&cryptAesCmacStep4Param);
820 }
821 if (ret != SMP_SUCCESS) {
822 SMP_GeneratePairResult(
823 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
824 }
825 }
826
SMP_ScPairOobMasterStep12(const SMP_StepParam * param)827 void SMP_ScPairOobMasterStep12(const SMP_StepParam *param)
828 {
829 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
830 return;
831 }
832 SMP_EncData *encData = (SMP_EncData *)param->data;
833 uint8_t confirmTemp[SMP_CONFIRM_DATA_LEN] = {0x00};
834 LOG_DEBUG("%{public}s", __FUNCTION__);
835 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
836 if (ret != SMP_SUCCESS) {
837 return;
838 }
839 (void)memcpy_s(confirmTemp, SMP_CONFIRM_DATA_LEN, encData->encRetParam->encryptedData, SMP_CONFIRM_DATA_LEN);
840 if (memcmp(confirmTemp, SMP_GetPairMng()->peer.confirm, SMP_CONFIRM_DATA_LEN) != 0x00) {
841 LOG_ERROR("Confirm check failed.");
842 SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_CONFIRM_VALUE, NULL);
843 } else {
844 LOG_INFO("Confirm check success.");
845 LOG_DEBUG("SMP_SC_PAIR_OOB_MASTER_STEP_13 started.");
846 ret = SMP_SendHciLeRandCmd(SMP_SC_PAIR_OOB_MASTER_STEP_13);
847 if (ret != SMP_SUCCESS) {
848 SMP_GeneratePairResult(
849 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
850 }
851 }
852 }
853
SMP_ScPairOobMasterStep13(const SMP_StepParam * param)854 void SMP_ScPairOobMasterStep13(const SMP_StepParam *param)
855 {
856 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
857 return;
858 }
859 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
860
861 LOG_DEBUG("%{public}s", __FUNCTION__);
862 (void)memcpy_s(SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
863 LOG_DEBUG("SMP_SC_PAIR_OOB_MASTER_STEP_14 started.");
864 int ret = SMP_SendHciLeRandCmd(SMP_SC_PAIR_OOB_MASTER_STEP_14);
865 if (ret != SMP_SUCCESS) {
866 SMP_GeneratePairResult(
867 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
868 }
869 }
870
SMP_ScPairOobMasterStep14(const SMP_StepParam * param)871 void SMP_ScPairOobMasterStep14(const SMP_StepParam *param)
872 {
873 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
874 return;
875 }
876 uint8_t randomTemp[SMP_RANDOM_DATA_LEN] = {0x00};
877 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
878
879 LOG_DEBUG("%{public}s", __FUNCTION__);
880 (void)memcpy_s(SMP_GetPairMng()->local.random + SMP_RAND_NUM_LEN,
881 SMP_RAND_NUM_LEN,
882 returnParam->randomNumber,
883 SMP_RAND_NUM_LEN);
884 SMP_MemoryReverseCopy(randomTemp, SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN);
885 LOG_DEBUG("SMP_SC_PAIR_OOB_MASTER_STEP_15 started.");
886 SMP_GetPairMng()->step = SMP_SC_PAIR_OOB_MASTER_STEP_15;
887 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
888 int ret = SMP_SendPairingRandom(SMP_GetPairMng()->handle, randomTemp, SMP_SendDataCallback);
889 if (ret != SMP_SUCCESS) {
890 LOG_ERROR("Send Pairing Random error.");
891 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
892 SMP_PAIR_STATUS_FAILED,
893 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
894 SMP_GetPairMng()->alarm);
895 }
896 }
897
SMP_ScPairOobMasterStep15(const SMP_StepParam * param)898 void SMP_ScPairOobMasterStep15(const SMP_StepParam *param)
899 {
900 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
901 return;
902 }
903 uint8_t cryptAesCmacZ[CRYPT_AESCMAC_Z_LEN] = {0x00};
904 HciLeEncryptParam encryptParam;
905 LOG_DEBUG("%{public}s", __FUNCTION__);
906 SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.random, (uint8_t *)param->data, SMP_RANDOM_DATA_LEN);
907 SMP_MemoryReverseCopy(encryptParam.key, SALT, sizeof(encryptParam.key));
908 (void)memcpy_s(encryptParam.plaintextData, sizeof(encryptParam.plaintextData), cryptAesCmacZ, CRYPT_AESCMAC_Z_LEN);
909 LOG_DEBUG("SMP_SC_PAIR_COMMON_MASTER_STEP_1 started.");
910 int ret = SMP_SendLeEncryptCmd(&encryptParam, SMP_SC_PAIR_COMMON_MASTER_STEP_1, NULL, SMP_USING_HW_AES128_PAIR);
911 if (ret != SMP_SUCCESS) {
912 SMP_GeneratePairResult(
913 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
914 }
915 (void)memset_s(encryptParam.key, SMP_ENCRYPT_KEY_LEN, 0x00, SMP_ENCRYPT_KEY_LEN);
916 }
917
SMP_ScPairCommonMasterStep1(const SMP_StepParam * param)918 void SMP_ScPairCommonMasterStep1(const SMP_StepParam *param)
919 {
920 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
921 return;
922 }
923 SMP_EncData *encData = (SMP_EncData *)param->data;
924 SMP_CryptAesCmacStep3Param cryptAesCmacStep3Param;
925
926 LOG_DEBUG("%{public}s", __FUNCTION__);
927 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
928 if (ret != SMP_SUCCESS) {
929 return;
930 }
931 SMP_ConstituteAesCmacStep3Param(
932 encData, SMP_GetPairMng()->DHKey, sizeof(SMP_GetPairMng()->DHKey), &cryptAesCmacStep3Param);
933 cryptAesCmacStep3Param.stepA = SMP_SC_PAIR_COMMON_MASTER_STEP_2;
934 cryptAesCmacStep3Param.stepB = SMP_SC_PAIR_COMMON_MASTER_STEP_3;
935 ret = SMP_CryptographicAesCmacStep3(&cryptAesCmacStep3Param);
936 if (ret != SMP_SUCCESS) {
937 SMP_GeneratePairResult(
938 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
939 }
940 (void)memset_s(cryptAesCmacStep3Param.key, CRYPT_AESCMAC_KEY_LEN, 0x00, CRYPT_AESCMAC_KEY_LEN);
941 }
942
SMP_ScPairCommonMasterStep2(const SMP_StepParam * param)943 void SMP_ScPairCommonMasterStep2(const SMP_StepParam *param)
944 {
945 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
946 return;
947 }
948 SMP_EncData *encData = (SMP_EncData *)param->data;
949 LOG_DEBUG("%{public}s", __FUNCTION__);
950 SMP_CryptAesCmacStep4Param cryptAesCmacStep4Param;
951 int ret = SMP_ConstituteAesCmacStep4Param(encData,
952 SMP_SC_PAIR_COMMON_MASTER_STEP_2,
953 SMP_SC_PAIR_COMMON_MASTER_STEP_3,
954 SMP_ROLE_MASTER,
955 &cryptAesCmacStep4Param);
956 if (!ret) {
957 ret = SMP_CryptographicAesCmacStep4(&cryptAesCmacStep4Param);
958 }
959 if (ret != SMP_SUCCESS) {
960 SMP_GeneratePairResult(
961 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
962 }
963 }
964
SMP_ScPairCommonMasterStep3(const SMP_StepParam * param)965 void SMP_ScPairCommonMasterStep3(const SMP_StepParam *param)
966 {
967 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
968 return;
969 }
970 uint8_t cryptAesCmacZ[CRYPT_AESCMAC_Z_LEN] = {0x00};
971 HciLeEncryptParam encryptParam;
972 SMP_EncData *encData = (SMP_EncData *)param->data;
973 LOG_DEBUG("%{public}s", __FUNCTION__);
974 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
975 if (ret != SMP_SUCCESS) {
976 return;
977 }
978 (void)memcpy_s(
979 encryptParam.key, sizeof(encryptParam.key), encData->encRetParam->encryptedData, sizeof(encryptParam.key));
980 (void)memcpy_s(encryptParam.plaintextData, sizeof(encryptParam.plaintextData), cryptAesCmacZ, CRYPT_AESCMAC_Z_LEN);
981 LOG_DEBUG("SMP_SC_PAIR_COMMON_MASTER_STEP_4 started.");
982 ret = SMP_SendLeEncryptCmd(&encryptParam, SMP_SC_PAIR_COMMON_MASTER_STEP_4, NULL, SMP_USING_HW_AES128_PAIR);
983 if (ret != SMP_SUCCESS) {
984 SMP_GeneratePairResult(
985 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
986 }
987 (void)memset_s(encryptParam.key, SMP_ENCRYPT_KEY_LEN, 0x00, SMP_ENCRYPT_KEY_LEN);
988 }
989
SMP_ScPairCommonMasterStep4(const SMP_StepParam * param)990 void SMP_ScPairCommonMasterStep4(const SMP_StepParam *param)
991 {
992 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
993 return;
994 }
995 SMP_CryptAesCmacStep3Param cryptAesCmacStep3Param;
996 SMP_EncData *encData = (SMP_EncData *)param->data;
997 SMP_CryptF5Param cryptF5Param;
998 LOG_DEBUG("%{public}s", __FUNCTION__);
999 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
1000 if (ret != SMP_SUCCESS) {
1001 return;
1002 }
1003 SMP_ConstituteF5Param(SMP_ROLE_MASTER, &cryptF5Param);
1004 SMP_CryptographicF5(&cryptF5Param);
1005 SMP_ConstituteAesCmacStep3Param(encData, cryptF5Param.output, CRYPT_F5_OUT_LEN, &cryptAesCmacStep3Param);
1006 cryptAesCmacStep3Param.stepA = SMP_SC_PAIR_COMMON_MASTER_STEP_5;
1007 cryptAesCmacStep3Param.stepB = SMP_SC_PAIR_COMMON_MASTER_STEP_6;
1008 ret = SMP_CryptographicAesCmacStep3(&cryptAesCmacStep3Param);
1009 if (ret != SMP_SUCCESS) {
1010 SMP_GeneratePairResult(
1011 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
1012 }
1013 (void)memset_s(cryptAesCmacStep3Param.key, CRYPT_AESCMAC_KEY_LEN, 0x00, CRYPT_AESCMAC_KEY_LEN);
1014 }
1015
SMP_ScPairCommonMasterStep5(const SMP_StepParam * param)1016 void SMP_ScPairCommonMasterStep5(const SMP_StepParam *param)
1017 {
1018 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
1019 return;
1020 }
1021 SMP_EncData *encData = (SMP_EncData *)param->data;
1022 LOG_DEBUG("%{public}s", __FUNCTION__);
1023 SMP_CryptAesCmacStep4Param cryptAesCmacStep4Param;
1024 int ret = SMP_ConstituteAesCmacStep4Param(encData,
1025 SMP_SC_PAIR_COMMON_MASTER_STEP_5,
1026 SMP_SC_PAIR_COMMON_MASTER_STEP_6,
1027 SMP_ROLE_MASTER,
1028 &cryptAesCmacStep4Param);
1029 if (!ret) {
1030 ret = SMP_CryptographicAesCmacStep4(&cryptAesCmacStep4Param);
1031 }
1032 if (ret != SMP_SUCCESS) {
1033 SMP_GeneratePairResult(
1034 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
1035 }
1036 }
1037
SMP_ScPairCommonMasterStep6(const SMP_StepParam * param)1038 void SMP_ScPairCommonMasterStep6(const SMP_StepParam *param)
1039 {
1040 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
1041 return;
1042 }
1043 uint8_t cryptAesCmacZ[CRYPT_AESCMAC_Z_LEN] = {0x00};
1044 SMP_EncData *encData = (SMP_EncData *)param->data;
1045 HciLeEncryptParam encryptParam;
1046 LOG_DEBUG("%{public}s", __FUNCTION__);
1047 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
1048 if (ret != SMP_SUCCESS) {
1049 return;
1050 }
1051 SMP_MemoryReverseCopy(SMP_GetPairMng()->macKey, encData->encRetParam->encryptedData, SMP_MACKEY_LEN);
1052 (void)memcpy_s(encryptParam.key, sizeof(encryptParam.key), encData->encCmd->key, sizeof(encryptParam.key));
1053 (void)memcpy_s(encryptParam.plaintextData, sizeof(encryptParam.plaintextData), cryptAesCmacZ, CRYPT_AESCMAC_Z_LEN);
1054 LOG_DEBUG("SMP_SC_PAIR_COMMON_MASTER_STEP_7 started.");
1055 ret = SMP_SendLeEncryptCmd(&encryptParam, SMP_SC_PAIR_COMMON_MASTER_STEP_7, NULL, SMP_USING_HW_AES128_PAIR);
1056 if (ret != SMP_SUCCESS) {
1057 SMP_GeneratePairResult(
1058 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
1059 }
1060 (void)memset_s(encryptParam.key, SMP_ENCRYPT_KEY_LEN, 0x00, SMP_ENCRYPT_KEY_LEN);
1061 }
1062
SMP_ScPairCommonMasterStep7(const SMP_StepParam * param)1063 void SMP_ScPairCommonMasterStep7(const SMP_StepParam *param)
1064 {
1065 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
1066 return;
1067 }
1068 SMP_EncData *encData = (SMP_EncData *)param->data;
1069 SMP_CryptF5Param cryptF5Param;
1070 LOG_DEBUG("%{public}s", __FUNCTION__);
1071 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
1072 if (ret != SMP_SUCCESS) {
1073 return;
1074 }
1075 SMP_ConstituteF5Param(SMP_ROLE_MASTER, &cryptF5Param);
1076 SMP_CryptographicF5(&cryptF5Param);
1077 cryptF5Param.output[0x00] = 0x01;
1078 SMP_CryptAesCmacStep3Param cryptAesCmacStep3Param;
1079 SMP_ConstituteAesCmacStep3Param(encData, cryptF5Param.output, CRYPT_F5_OUT_LEN, &cryptAesCmacStep3Param);
1080 cryptAesCmacStep3Param.stepA = SMP_SC_PAIR_COMMON_MASTER_STEP_8;
1081 cryptAesCmacStep3Param.stepB = SMP_SC_PAIR_COMMON_MASTER_STEP_9;
1082 ret = SMP_CryptographicAesCmacStep3(&cryptAesCmacStep3Param);
1083 if (ret != SMP_SUCCESS) {
1084 SMP_GeneratePairResult(
1085 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
1086 }
1087 (void)memset_s(cryptAesCmacStep3Param.key, CRYPT_AESCMAC_KEY_LEN, 0x00, CRYPT_AESCMAC_KEY_LEN);
1088 }
1089
SMP_ScPairCommonMasterStep8(const SMP_StepParam * param)1090 void SMP_ScPairCommonMasterStep8(const SMP_StepParam *param)
1091 {
1092 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
1093 return;
1094 }
1095 SMP_EncData *encData = (SMP_EncData *)param->data;
1096 LOG_DEBUG("%{public}s", __FUNCTION__);
1097 SMP_CryptAesCmacStep4Param cryptAesCmacStep4Param;
1098 int ret = SMP_ConstituteAesCmacStep4Param(encData,
1099 SMP_SC_PAIR_COMMON_MASTER_STEP_8,
1100 SMP_SC_PAIR_COMMON_MASTER_STEP_9,
1101 SMP_ROLE_MASTER,
1102 &cryptAesCmacStep4Param);
1103 if (!ret) {
1104 ret = SMP_CryptographicAesCmacStep4(&cryptAesCmacStep4Param);
1105 }
1106 if (ret != SMP_SUCCESS) {
1107 SMP_GeneratePairResult(
1108 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
1109 }
1110 }
1111
SMP_ScPairCommonMasterStep9(const SMP_StepParam * param)1112 void SMP_ScPairCommonMasterStep9(const SMP_StepParam *param)
1113 {
1114 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
1115 return;
1116 }
1117 uint8_t cryptAesCmacZ[CRYPT_AESCMAC_Z_LEN] = {0x00};
1118 SMP_EncData *encData = (SMP_EncData *)param->data;
1119 HciLeEncryptParam encryptParam;
1120 uint8_t tempLTK[SMP_LTK_LEN] = {0x00};
1121 LOG_DEBUG("%{public}s", __FUNCTION__);
1122 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
1123 if (ret != SMP_SUCCESS) {
1124 return;
1125 }
1126 (void)memcpy_s(tempLTK, SMP_LTK_LEN, encData->encRetParam->encryptedData, SMP_LTK_LEN);
1127 SMP_LongTermKeyCopy(SMP_GetPairMng()->local.LTK, tempLTK, SMP_GetPairMng()->encKeySize);
1128 SMP_LongTermKeyCopy(SMP_GetPairMng()->peer.LTK, tempLTK, SMP_GetPairMng()->encKeySize);
1129 SMP_MemoryReverseCopy(encryptParam.key, SMP_GetPairMng()->macKey, SMP_MACKEY_LEN);
1130 (void)memcpy_s(encryptParam.plaintextData, sizeof(encryptParam.plaintextData), cryptAesCmacZ, CRYPT_AESCMAC_Z_LEN);
1131 LOG_DEBUG("SMP_SC_PAIR_COMMON_MASTER_STEP_10 started.");
1132 ret = SMP_SendLeEncryptCmd(&encryptParam, SMP_SC_PAIR_COMMON_MASTER_STEP_10, NULL, SMP_USING_HW_AES128_PAIR);
1133 if (ret != SMP_SUCCESS) {
1134 SMP_GeneratePairResult(
1135 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
1136 }
1137 (void)memset_s(encryptParam.key, SMP_ENCRYPT_KEY_LEN, 0x00, SMP_ENCRYPT_KEY_LEN);
1138 }
1139
SMP_ScPairCommonMasterStep10(const SMP_StepParam * param)1140 void SMP_ScPairCommonMasterStep10(const SMP_StepParam *param)
1141 {
1142 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
1143 return;
1144 }
1145 SMP_EncData *encData = (SMP_EncData *)param->data;
1146 SMP_CryptAesCmacStep3Param cryptAesCmacStep3Param;
1147 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
1148 if (ret != SMP_SUCCESS) {
1149 return;
1150 }
1151 SMP_CryptF6Param cryptF6Param;
1152 bool isCalculatePeer = false;
1153 SMP_ConstituteF6Param(isCalculatePeer, &cryptF6Param);
1154 SMP_CryptographicF6(&cryptF6Param);
1155 SMP_ConstituteAesCmacStep3Param(encData, cryptF6Param.output, CRYPT_F6_OUT_LEN, &cryptAesCmacStep3Param);
1156 cryptAesCmacStep3Param.stepA = SMP_SC_PAIR_COMMON_MASTER_STEP_11;
1157 cryptAesCmacStep3Param.stepB = SMP_SC_PAIR_COMMON_MASTER_STEP_12;
1158 ret = SMP_CryptographicAesCmacStep3(&cryptAesCmacStep3Param);
1159 if (ret != SMP_SUCCESS) {
1160 SMP_GeneratePairResult(
1161 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
1162 }
1163 (void)memset_s(cryptAesCmacStep3Param.key, CRYPT_AESCMAC_KEY_LEN, 0x00, CRYPT_AESCMAC_KEY_LEN);
1164 }
1165
SMP_ScPairCommonMasterStep11(const SMP_StepParam * param)1166 void SMP_ScPairCommonMasterStep11(const SMP_StepParam *param)
1167 {
1168 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
1169 return;
1170 }
1171 SMP_CryptAesCmacStep4Param cryptAesCmacStep4Param;
1172 SMP_EncData *encData = (SMP_EncData *)param->data;
1173 LOG_DEBUG("%{public}s", __FUNCTION__);
1174 int ret = SMP_ConstituteAesCmacStep4Param(encData,
1175 SMP_SC_PAIR_COMMON_MASTER_STEP_11,
1176 SMP_SC_PAIR_COMMON_MASTER_STEP_12,
1177 SMP_ROLE_MASTER,
1178 &cryptAesCmacStep4Param);
1179 if (!ret) {
1180 ret = SMP_CryptographicAesCmacStep4(&cryptAesCmacStep4Param);
1181 }
1182 if (ret != SMP_SUCCESS) {
1183 SMP_GeneratePairResult(
1184 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
1185 }
1186 }
1187
SMP_ScPairCommonMasterStep12(const SMP_StepParam * param)1188 void SMP_ScPairCommonMasterStep12(const SMP_StepParam *param)
1189 {
1190 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
1191 return;
1192 }
1193 SMP_EncData *encData = (SMP_EncData *)param->data;
1194 LOG_DEBUG("%{public}s", __FUNCTION__);
1195 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
1196 if (ret != SMP_SUCCESS) {
1197 return;
1198 }
1199 (void)memcpy_s(SMP_GetPairMng()->local.DHKeyCheck,
1200 SMP_DHKEY_CHECK_LEN,
1201 encData->encRetParam->encryptedData,
1202 SMP_DHKEY_CHECK_LEN);
1203 LOG_DEBUG("SMP_SC_PAIR_COMMON_MASTER_STEP_13 started.");
1204 SMP_GetPairMng()->step = SMP_SC_PAIR_COMMON_MASTER_STEP_13;
1205 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
1206 ret = SMP_SendPairingDHKeyCheck(SMP_GetPairMng()->handle, SMP_GetPairMng()->local.DHKeyCheck, SMP_SendDataCallback);
1207 if (ret != SMP_SUCCESS) {
1208 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
1209 SMP_PAIR_STATUS_FAILED,
1210 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
1211 SMP_GetPairMng()->alarm);
1212 LOG_ERROR("Send Pairing DHKey Check Failed");
1213 }
1214 }
1215
SMP_ScPairCommonMasterStep13(const SMP_StepParam * param)1216 void SMP_ScPairCommonMasterStep13(const SMP_StepParam *param)
1217 {
1218 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
1219 return;
1220 }
1221 uint8_t cryptAesCmacZ[CRYPT_AESCMAC_Z_LEN] = {0x00};
1222 HciLeEncryptParam encryptParam;
1223
1224 LOG_DEBUG("%{public}s", __FUNCTION__);
1225 AlarmCancel(SMP_GetPairMng()->alarm);
1226 (void)memcpy_s(SMP_GetPairMng()->peer.DHKeyCheck, SMP_DHKEY_CHECK_LEN, (uint8_t *)param->data, SMP_DHKEY_CHECK_LEN);
1227 SMP_MemoryReverseCopy(encryptParam.key, SMP_GetPairMng()->macKey, SMP_MACKEY_LEN);
1228 (void)memcpy_s(encryptParam.plaintextData, sizeof(encryptParam.plaintextData), cryptAesCmacZ, CRYPT_AESCMAC_Z_LEN);
1229 LOG_DEBUG("SMP_SC_PAIR_COMMON_MASTER_STEP_14 started.");
1230 int ret = SMP_SendLeEncryptCmd(&encryptParam, SMP_SC_PAIR_COMMON_MASTER_STEP_14, NULL, SMP_USING_HW_AES128_PAIR);
1231 if (ret != SMP_SUCCESS) {
1232 SMP_GeneratePairResult(
1233 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
1234 }
1235 (void)memset_s(encryptParam.key, SMP_ENCRYPT_KEY_LEN, 0x00, SMP_ENCRYPT_KEY_LEN);
1236 }
1237
SMP_ScPairCommonMasterStep14(const SMP_StepParam * param)1238 void SMP_ScPairCommonMasterStep14(const SMP_StepParam *param)
1239 {
1240 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
1241 return;
1242 }
1243 SMP_EncData *encData = (SMP_EncData *)param->data;
1244 SMP_CryptAesCmacStep3Param cryptAesCmacStep3Param;
1245 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
1246 if (ret != SMP_SUCCESS) {
1247 return;
1248 }
1249 SMP_CryptF6Param cryptF6Param;
1250 bool isCalculatePeer = true;
1251 SMP_ConstituteF6Param(isCalculatePeer, &cryptF6Param);
1252 SMP_CryptographicF6(&cryptF6Param);
1253 SMP_ConstituteAesCmacStep3Param(encData, cryptF6Param.output, CRYPT_F6_OUT_LEN, &cryptAesCmacStep3Param);
1254 cryptAesCmacStep3Param.stepA = SMP_SC_PAIR_COMMON_MASTER_STEP_15;
1255 cryptAesCmacStep3Param.stepB = SMP_SC_PAIR_COMMON_MASTER_STEP_16;
1256 ret = SMP_CryptographicAesCmacStep3(&cryptAesCmacStep3Param);
1257 if (ret != SMP_SUCCESS) {
1258 SMP_GeneratePairResult(
1259 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
1260 }
1261 (void)memset_s(cryptAesCmacStep3Param.key, CRYPT_AESCMAC_KEY_LEN, 0x00, CRYPT_AESCMAC_KEY_LEN);
1262 }
1263
SMP_ScPairCommonMasterStep15(const SMP_StepParam * param)1264 void SMP_ScPairCommonMasterStep15(const SMP_StepParam *param)
1265 {
1266 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
1267 return;
1268 }
1269 SMP_EncData *encData = (SMP_EncData *)param->data;
1270 LOG_DEBUG("%{public}s", __FUNCTION__);
1271 SMP_CryptAesCmacStep4Param cryptAesCmacStep4Param;
1272 int ret = SMP_ConstituteAesCmacStep4Param(encData,
1273 SMP_SC_PAIR_COMMON_MASTER_STEP_15,
1274 SMP_SC_PAIR_COMMON_MASTER_STEP_16,
1275 SMP_ROLE_MASTER,
1276 &cryptAesCmacStep4Param);
1277 if (!ret) {
1278 ret = SMP_CryptographicAesCmacStep4(&cryptAesCmacStep4Param);
1279 }
1280 if (ret != SMP_SUCCESS) {
1281 SMP_GeneratePairResult(
1282 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
1283 }
1284 }
1285
SMP_ScPairCommonMasterStep16(const SMP_StepParam * param)1286 void SMP_ScPairCommonMasterStep16(const SMP_StepParam *param)
1287 {
1288 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
1289 return;
1290 }
1291 SMP_EncData *encData = (SMP_EncData *)param->data;
1292 HciLeStartEncryptionParam startEncParam;
1293 uint8_t dhkeyCheckTemp[SMP_DHKEY_CHECK_LEN] = {0x00};
1294 LOG_DEBUG("%{public}s", __FUNCTION__);
1295 int ret = SMP_EncryptCompleteJudgeException(encData->encRetParam->status, SMP_ROLE_MASTER);
1296 if (ret != SMP_SUCCESS) {
1297 return;
1298 }
1299 (void)memcpy_s(dhkeyCheckTemp, SMP_DHKEY_CHECK_LEN, encData->encRetParam->encryptedData, SMP_DHKEY_CHECK_LEN);
1300 if (memcmp(dhkeyCheckTemp, SMP_GetPairMng()->peer.DHKeyCheck, SMP_DHKEY_CHECK_LEN) != 0x00) {
1301 LOG_ERROR("DHKey Check Failed.");
1302 SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_DHKEY_CHECK, NULL);
1303 } else {
1304 LOG_INFO("DHKey Check Success.");
1305 startEncParam.connectionHandle = SMP_GetPairMng()->handle;
1306 startEncParam.encryptDiversifier = 0x00;
1307 (void)memset_s(startEncParam.randomNumber, SMP_MASTER_RAND_LEN, 0x00, SMP_MASTER_RAND_LEN);
1308 (void)memcpy_s(startEncParam.longTermKey, SMP_LTK_LEN, SMP_GetPairMng()->local.LTK, SMP_LTK_LEN);
1309 LOG_DEBUG("SMP_SC_PAIR_COMMON_MASTER_STEP_17 started.");
1310 SMP_GetPairMng()->step = SMP_SC_PAIR_COMMON_MASTER_STEP_17;
1311 AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
1312 SMP_GetPairMng()->masterEncryptedFlag = SMP_MASTER_ENCRYPTED_FLAG_NO;
1313 ret = HCI_LeStartEncryption(&startEncParam);
1314 if (ret != SMP_SUCCESS) {
1315 LOG_ERROR("HCI_LeStartEncryption failed.");
1316 SMP_GeneratePairResult(SMP_GetPairMng()->handle,
1317 SMP_PAIR_STATUS_FAILED,
1318 SMP_PAIR_FAILED_UNSPECIFIED_REASION,
1319 SMP_GetPairMng()->alarm);
1320 }
1321 }
1322 }
1323
SMP_ScPairCommonMasterStep19(const SMP_StepParam * param)1324 void SMP_ScPairCommonMasterStep19(const SMP_StepParam *param)
1325 {
1326 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
1327 return;
1328 }
1329 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
1330 LOG_DEBUG("%{public}s", __FUNCTION__);
1331 (void)memcpy_s(SMP_GetPairMng()->local.CSRK, SMP_CSRK_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
1332 LOG_DEBUG("SMP_SC_PAIR_COMMON_MASTER_STEP_20 started.");
1333 int ret = SMP_SendHciLeRandCmd(SMP_SC_PAIR_COMMON_MASTER_STEP_20);
1334 if (ret != SMP_SUCCESS) {
1335 SMP_GeneratePairResult(
1336 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
1337 }
1338 }
1339
SMP_ScPairCommonMasterStep20(const SMP_StepParam * param)1340 void SMP_ScPairCommonMasterStep20(const SMP_StepParam *param)
1341 {
1342 if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
1343 return;
1344 }
1345 const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
1346 LOG_DEBUG("%{public}s", __FUNCTION__);
1347 (void)memcpy_s(
1348 SMP_GetPairMng()->local.CSRK + SMP_RAND_NUM_LEN, SMP_RAND_NUM_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
1349 LOG_INFO("Send keys to remote.");
1350 if (SMP_SendDistributionKeysToRemote()) {
1351 SMP_GeneratePairResult(
1352 SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
1353 }
1354 }