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 "gap.h"
17 #include "gap_internal.h"
18 #include "gap_task_internal.h"
19
20 #include <securec.h>
21
22 #include "allocator.h"
23 #include "log.h"
24 #include "thread.h"
25
26 #include "btm.h"
27 #include "btm/btm_interop.h"
28 #include "btm/btm_thread.h"
29
30 typedef struct {
31 GapSecurityCallback callback;
32 void *context;
33 } SecurityCallback;
34
35 typedef struct {
36 GapAuthenticationCallback callback;
37 void *context;
38 } AuthenticationCallback;
39
40 static SecurityCallback g_securityCallback;
41 static AuthenticationCallback g_authenticationCallback;
42
43 static int GapAuthenticationRequested(uint16_t handle);
44 static int GapSetConnectionEncryption(uint16_t handle, uint8_t encryptionEnable);
45
GapCompareServiceSecurityInfo(const GapServiceSecurityInfo * info1,const GapServiceSecurityInfo * info2)46 static bool GapCompareServiceSecurityInfo(const GapServiceSecurityInfo *info1, const GapServiceSecurityInfo *info2)
47 {
48 return ((info1->direction == info2->direction) && (info1->protocolId == info2->protocolId) &&
49 (GapCompareChannelID(info2->protocolId, info1->channelId, info2->channelId)) &&
50 ((info1->serviceId == info2->serviceId) || (info1->serviceId == UNKNOWN_SERVICE) ||
51 (info2->serviceId == UNKNOWN_SERVICE)));
52 }
53
GapAllocReqSecInfo(const BtAddr * addr,GapSecurityResultCallback callback,void * context,const ProfileSecurityInfo * info)54 static RequestSecInfo *GapAllocReqSecInfo(
55 const BtAddr *addr, GapSecurityResultCallback callback, void *context, const ProfileSecurityInfo *info)
56 {
57 RequestSecInfo *reqInfo = NULL;
58
59 reqInfo = MEM_MALLOC.alloc(sizeof(RequestSecInfo));
60 if (reqInfo == NULL) {
61 LOG_ERROR("%{public}s:malloc error.", __FUNCTION__);
62 } else {
63 (void)memset_s(reqInfo, sizeof(RequestSecInfo), 0x00, sizeof(RequestSecInfo));
64 reqInfo->addr = *addr;
65 reqInfo->callback = callback;
66 reqInfo->info = info->info;
67 reqInfo->context = context;
68 reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_ACTION;
69 if (info->info.direction == OUTGOING) {
70 reqInfo->needAuthentication = !!(info->securityMode & GAP_SEC_OUT_AUTHENTICATION);
71 reqInfo->needEncryption = !!(info->securityMode & GAP_SEC_OUT_ENCRYPTION);
72 reqInfo->needAuthorization = false;
73 if (*GapGetSecurityMode() != SEC_MODE_2) {
74 reqInfo->needEncryption = true;
75 }
76 } else if (info->info.direction == INCOMING) {
77 reqInfo->needAuthentication = !!(info->securityMode & GAP_SEC_IN_AUTHENTICATION);
78 reqInfo->needEncryption = !!(info->securityMode & GAP_SEC_IN_ENCRYPTION);
79 reqInfo->needAuthorization = !!(info->securityMode & GAP_SEC_IN_AUTHORIZATION);
80 }
81 reqInfo->needUnauthentication = reqInfo->needEncryption && !reqInfo->needAuthentication;
82 reqInfo->needMITM = !!(info->securityMode & GAP_SEC_MITM);
83 }
84
85 return reqInfo;
86 }
87
GapDoAuthenticationCallback(const void * req)88 void GapDoAuthenticationCallback(const void *req)
89 {
90 const RequestSecInfo *reqInfo = req;
91 BtAddr addr = BT_ADDR_NULL;
92 uint8_t result = GAP_STATUS_FAILED;
93 if (reqInfo != NULL && reqInfo->status == GAP_SEC_REQ_STATUS_SUCCESS) {
94 result = GAP_STATUS_SUCCESS;
95 }
96 if (reqInfo != NULL) {
97 addr = reqInfo->addr;
98 }
99
100 if (g_authenticationCallback.callback.authenticationComplete) {
101 g_authenticationCallback.callback.authenticationComplete(&addr, result, g_authenticationCallback.context);
102 }
103 }
104
GapTrySecurityCallback(RequestSecInfo * reqInfo)105 static void GapTrySecurityCallback(RequestSecInfo *reqInfo)
106 {
107 if (!reqInfo->doCallback) {
108 reqInfo->doCallback = true;
109 GapDoSecurityCallback(reqInfo);
110 }
111 }
112
GapDoSecurityCallback(void * req)113 void GapDoSecurityCallback(void *req)
114 {
115 RequestSecInfo *reqInfo = (RequestSecInfo *)req;
116 uint16_t result = GAP_STATUS_FAILED;
117
118 if (GapIsBredrEnable() == false) {
119 return;
120 }
121
122 if (reqInfo->status == GAP_SEC_REQ_STATUS_SUCCESS) {
123 result = GAP_STATUS_SUCCESS;
124 } else if (reqInfo->hciStatus != HCI_SUCCESS) {
125 result = reqInfo->hciStatus;
126 }
127
128 LOG_INFO("%{public}s:%{public}s-%02d-%{public}s result:%02x:",
129 __FUNCTION__,
130 reqInfo->info.direction ? "IN" : "OUT",
131 reqInfo->info.serviceId,
132 reqInfo->info.protocolId ? "RFCOMM" : "L2CAP",
133 result);
134
135 if (reqInfo->callback) {
136 reqInfo->callback(result, reqInfo->info, reqInfo->context);
137 }
138
139 ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
140 ListRemoveNode(profileSecurityBlock->requestlist, req);
141 }
142
GapDoAuthorizationCallback(const void * req)143 static void GapDoAuthorizationCallback(const void *req)
144 {
145 const RequestSecInfo *reqInfo = req;
146 bool reject = false;
147
148 if (g_securityCallback.callback.authorizeInd) {
149 g_securityCallback.callback.authorizeInd(&reqInfo->addr, reqInfo->info.serviceId, reqInfo->context);
150 } else {
151 reject = true;
152 }
153
154 if (reject) {
155 GAP_AuthorizeRes(&reqInfo->addr, reqInfo->info.serviceId, GAP_NOT_ACCEPT);
156 }
157 }
158
GapDoSecurityAction(RequestSecInfo * reqInfo,DeviceInfo * devInfo)159 static void GapDoSecurityAction(RequestSecInfo *reqInfo, DeviceInfo *devInfo)
160 {
161 int ret;
162
163 if (devInfo->status != GAP_DEV_SEC_STATUS_ACTION) {
164 if (devInfo->status == GAP_DEV_SEC_STATUS_IDLE) {
165 BTM_AclAddRef(devInfo->handle);
166 } else {
167 AlarmCancel(devInfo->alarm);
168 }
169 devInfo->status = GAP_DEV_SEC_STATUS_ACTION;
170 }
171 if (reqInfo->needAuthorization) {
172 GapDoAuthorizationCallback(reqInfo);
173 } else if (reqInfo->needAuthentication || reqInfo->needUnauthentication) {
174 if (devInfo->authenticationStatus == GAP_AUTH_STATUS_IDLE) {
175 devInfo->authenticationStatus = GAP_AUTH_STATUS_ACTION;
176 }
177 ret = GapAuthenticationRequested(devInfo->handle);
178 if (ret != BT_NO_ERROR) {
179 reqInfo->status = GAP_SEC_REQ_STATUS_FAILED;
180 devInfo->status = GAP_DEV_SEC_STATUS_IDLE;
181 devInfo->authenticationStatus = GAP_AUTH_STATUS_IDLE;
182 GapDoAuthenticationCallback(reqInfo);
183 GapTrySecurityCallback(reqInfo);
184 }
185 } else if (reqInfo->needEncryption) {
186 if (devInfo->encryptionStatus == GAP_ENC_STATUS_IDLE) {
187 devInfo->encryptionStatus = GAP_ENC_STATUS_ACTION;
188 }
189 ret = GapSetConnectionEncryption(devInfo->handle, LINK_LEVEL_ENCRYPTION_ON);
190 if (ret != BT_NO_ERROR) {
191 reqInfo->status = GAP_SEC_REQ_STATUS_FAILED;
192 devInfo->status = GAP_DEV_SEC_STATUS_IDLE;
193 devInfo->encryptionStatus = GAP_ENC_STATUS_IDLE;
194 GapTrySecurityCallback(reqInfo);
195 }
196 } else {
197 devInfo->status = GAP_DEV_SEC_STATUS_IDLE;
198 }
199 }
200
GapDoReleaseACLConnection(const void * dev)201 static void GapDoReleaseACLConnection(const void *dev)
202 {
203 const DeviceInfo *devInfo = dev;
204
205 ListNode *node = ListGetFirstNode(GapGetConnectionInfoBlock()->devicelist);
206 while (node != NULL) {
207 if (dev == ListGetNodeData(node)) {
208 break;
209 }
210 node = ListGetNextNode(node);
211 }
212
213 if (node != NULL) {
214 BTM_AclRelease(devInfo->handle);
215 }
216 }
217
GapDiscACLTimerTimeoutTask(void * ctx)218 static void GapDiscACLTimerTimeoutTask(void *ctx)
219 {
220 const DeviceInfo *dev = ((const GapGeneralPointerInfo *)ctx)->pointer;
221
222 if (GapIsBredrEnable()) {
223 GapDoReleaseACLConnection(dev);
224 }
225 }
226
GapDiscACLTimerTimeout(void * dev)227 static void GapDiscACLTimerTimeout(void *dev)
228 {
229 LOG_INFO("%{public}s: ", __FUNCTION__);
230 GapGeneralPointerInfo *ctx = MEM_MALLOC.alloc(sizeof(GapGeneralPointerInfo));
231 if (ctx == NULL) {
232 LOG_ERROR("%{public}s: Alloc error.", __FUNCTION__);
233 return;
234 }
235
236 ctx->pointer = dev;
237
238 int ret = GapRunTaskUnBlockProcess(GapDiscACLTimerTimeoutTask, ctx, NULL);
239 if (ret != BT_NO_ERROR) {
240 LOG_ERROR("%{public}s: Task error:%{public}d.", __FUNCTION__, ret);
241 }
242 }
243
GapCheckConnection(void)244 static void GapCheckConnection(void)
245 {
246 ListNode *node = NULL;
247 ConnectionInfoBlock *connectionInfoBlock = NULL;
248 DeviceInfo *devInfo = NULL;
249 connectionInfoBlock = GapGetConnectionInfoBlock();
250 node = ListGetFirstNode(connectionInfoBlock->devicelist);
251 while (node != 0) {
252 devInfo = ListGetNodeData(node);
253 if (devInfo->status == GAP_DEV_SEC_STATUS_WAIT_DISC) {
254 LOG_DEBUG("%{public}s: " BT_ADDR_FMT " 4s disconnect ACL", __FUNCTION__, BT_ADDR_FMT_OUTPUT(devInfo->addr.addr));
255 AlarmCancel(devInfo->alarm);
256 AlarmSet(devInfo->alarm, GAP_DISC_ACL_WAIT_TIME, GapDiscACLTimerTimeout, devInfo);
257 devInfo->status = GAP_DEV_SEC_STATUS_IDLE;
258 }
259 node = ListGetNextNode(node);
260 }
261 }
262
GapRequestSecurityProcess(void)263 void GapRequestSecurityProcess(void)
264 {
265 ListNode *requestNode = ListGetFirstNode(GapGetProfileSecurityBlock()->requestlist);
266 while (requestNode != 0) {
267 RequestSecInfo *reqInfo = ListGetNodeData(requestNode);
268 requestNode = ListGetNextNode(requestNode);
269
270 if (reqInfo->status == GAP_SEC_REQ_STATUS_FAILED) {
271 GapTrySecurityCallback(reqInfo);
272 continue;
273 }
274
275 if (reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_CONNECT || reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_FEATURE ||
276 reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_ENCRYPT) {
277 continue;
278 }
279
280 DeviceInfo *devInfo =
281 ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindConnectionDeviceByAddr, &reqInfo->addr);
282 if (devInfo == NULL) {
283 continue;
284 }
285
286 if (reqInfo->info.serviceId == GAP) {
287 devInfo->inDedicatedBonding = true;
288 } else {
289 if (devInfo->isAuthentication) {
290 reqInfo->needAuthentication = false;
291 reqInfo->needUnauthentication = false;
292 }
293 if (devInfo->isEncryption) {
294 reqInfo->needEncryption = false;
295 }
296 }
297
298 if (reqInfo->needAuthorization) {
299 reqInfo->status = GAP_SEC_REQ_STATUS_ACTION;
300 GapDoSecurityAction(reqInfo, devInfo);
301 } else if (reqInfo->needAuthentication || reqInfo->needUnauthentication || reqInfo->needEncryption) {
302 if (devInfo->actionReq != NULL) {
303 continue;
304 } else {
305 reqInfo->status = GAP_SEC_REQ_STATUS_ACTION;
306 devInfo->actionReq = reqInfo;
307 GapDoSecurityAction(reqInfo, devInfo);
308 }
309 } else {
310 reqInfo->status = GAP_SEC_REQ_STATUS_SUCCESS;
311 GapTrySecurityCallback(reqInfo);
312 }
313 }
314
315 GapCheckConnection();
316 }
317
GapDoDiscACLConnection(void * dev)318 static void GapDoDiscACLConnection(void *dev)
319 {
320 DeviceInfo *deviceInfo = dev;
321
322 ListNode *node = ListGetFirstNode(GapGetConnectionInfoBlock()->devicelist);
323 while (node != NULL) {
324 if (deviceInfo == ListGetNodeData(node)) {
325 break;
326 }
327 node = ListGetNextNode(node);
328 }
329
330 if (node != NULL) {
331 BTM_AclDisconnect(deviceInfo->handle, GAP_HCI_DISC_REASON_AUTH_FAIL);
332 }
333 }
334
GapWaitEncryptTimeoutTask(void * ctx)335 static void GapWaitEncryptTimeoutTask(void *ctx)
336 {
337 DeviceInfo *dev = ((GapGeneralPointerInfo *)ctx)->pointer;
338
339 GapDoDiscACLConnection(dev);
340 GapUpdateSecurityRequest(dev, GAP_SEC_EVENT_WAIT_ENC_TIMEOUT, HCI_SUCCESS);
341 GapRequestSecurityProcess();
342 }
343
GapWaitEncryptTimeout(void * dev)344 static void GapWaitEncryptTimeout(void *dev)
345 {
346 LOG_INFO("%{public}s: ", __FUNCTION__);
347 GapGeneralPointerInfo *ctx = MEM_MALLOC.alloc(sizeof(GapGeneralPointerInfo));
348 if (ctx == NULL) {
349 LOG_ERROR("%{public}s: Alloc error.", __FUNCTION__);
350 return;
351 }
352
353 ctx->pointer = dev;
354
355 int ret = GapRunTaskUnBlockProcess(GapWaitEncryptTimeoutTask, ctx, NULL);
356 if (ret != BT_NO_ERROR) {
357 LOG_ERROR("%{public}s: Task error:%{public}d.", __FUNCTION__, ret);
358 }
359 }
360
GapRemoteDeviceSupportHostSecureSimplePairingCallback(const BtAddr * addr,bool support)361 void GapRemoteDeviceSupportHostSecureSimplePairingCallback(const BtAddr *addr, bool support)
362 {
363 DeviceInfo *devInfo =
364 ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
365 if (devInfo != NULL) {
366 devInfo->supportSSP = support;
367 GapUpdateSecurityRequest(devInfo, GAP_SEC_EVENT_FEATURE_COMP, HCI_SUCCESS);
368 if (devInfo->waitEncryptAlarm != NULL) {
369 AlarmSet(devInfo->waitEncryptAlarm, GAP_SEC_WAIT_ENCRYPT_TIME, GapWaitEncryptTimeout, devInfo);
370 }
371 GapRequestSecurityProcess();
372 }
373 }
374
GAP_RequestSecurity(const BtAddr * addr,const GapRequestSecurityParam * param)375 int GAP_RequestSecurity(const BtAddr *addr, const GapRequestSecurityParam *param)
376 {
377 int ret = GAP_SUCCESS;
378 ProfileSecurityInfo *regInfo = NULL;
379
380 LOG_INFO("%{public}s:%{public}s-%02d-%{public}s",
381 __FUNCTION__,
382 param->info.direction ? "IN" : "OUT",
383 param->info.serviceId,
384 param->info.protocolId ? "RFCOMM" : "L2CAP");
385
386 do {
387 ListNode *node = ListGetFirstNode(GapGetProfileSecurityBlock()->registerlist);
388 while (node != 0) {
389 regInfo = ListGetNodeData(node);
390 if ((GapIsEmptyAddr(regInfo->addr.addr) || GapAddrCompare(®Info->addr, addr)) &&
391 GapCompareServiceSecurityInfo(®Info->info, ¶m->info)) {
392 break;
393 }
394 node = ListGetNextNode(node);
395 }
396
397 if (node == NULL) {
398 LOG_ERROR("%{public}s:Register(%{public}d, %{public}d)not found.", __FUNCTION__, param->info.serviceId, param->info.direction);
399 ret = GAP_ERR_INVAL_PARAM;
400 break;
401 }
402
403 RequestSecInfo *reqInfo = GapAllocReqSecInfo(addr, param->callback, param->context, regInfo);
404 if (reqInfo == NULL) {
405 LOG_ERROR("%{public}s:reqInfo alloc failed.", __FUNCTION__);
406 ret = GAP_ERR_OUT_OF_RES;
407 break;
408 }
409 ListAddLast(GapGetProfileSecurityBlock()->requestlist, reqInfo);
410
411 DeviceInfo *deviceInfo =
412 ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
413 if (deviceInfo != NULL) {
414 if (*GapGetSecurityMode() != SEC_MODE_2) {
415 GapIsRemoteDeviceSupportHostSecureSimplePairingAsync(addr);
416 reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_FEATURE;
417 }
418 GapRequestSecurityProcess();
419 } else {
420 ret = BTM_AclConnect(addr);
421 reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_CONNECT;
422 }
423 } while (0);
424
425 if (ret != BT_NO_ERROR) {
426 param->callback(GAP_STATUS_FAILED, param->info, param->context);
427 ret = BT_NO_ERROR;
428 }
429
430 return ret;
431 }
432
GapWriteSimplePairingMode(uint8_t simplePairingMode)433 static int GapWriteSimplePairingMode(uint8_t simplePairingMode)
434 {
435 int ret;
436
437 if (BTM_IsControllerSupportSecureSimplePairing()) {
438 HciWriteSimplePairingModeParam hciCmdParam = {
439 .simplePairingMode = simplePairingMode,
440 };
441 ret = HCI_WriteSimplePairingMode(&hciCmdParam);
442 } else {
443 ret = GAP_ERR_NOT_SUPPORT;
444 }
445
446 return ret;
447 }
448
GapWriteSecureConnectionsHostSupport(uint8_t support)449 static int GapWriteSecureConnectionsHostSupport(uint8_t support)
450 {
451 int ret;
452 if (BTM_IsControllerSupportSecureConnections()) {
453 HciWriteSecureConnectionsHostSupportParam hciCmdParam = {
454 .secureConnectionsHostSupport = support,
455 };
456
457 ret = HCI_WriteSecureConnectionsHostSupport(&hciCmdParam);
458 } else {
459 ret = GAP_SUCCESS;
460 }
461
462 return ret;
463 }
464
GAP_RegisterSecurityCallback(const GapSecurityCallback * callback,void * context)465 int GAP_RegisterSecurityCallback(const GapSecurityCallback *callback, void *context)
466 {
467 LOG_INFO("%{public}s:%{public}s", __FUNCTION__, callback ? "register" : "NULL");
468 if (callback == NULL) {
469 (void)memset_s(&g_securityCallback.callback,
470 sizeof(g_securityCallback.callback),
471 0x00,
472 sizeof(g_securityCallback.callback));
473 } else {
474 g_securityCallback.callback = *callback;
475 }
476 g_securityCallback.context = context;
477 return GAP_SUCCESS;
478 }
479
GAP_DeregisterSecurityCallback(void)480 int GAP_DeregisterSecurityCallback(void)
481 {
482 (void)memset_s(
483 &g_securityCallback.callback, sizeof(g_securityCallback.callback), 0x00, sizeof(g_securityCallback.callback));
484 g_securityCallback.context = NULL;
485 return GAP_SUCCESS;
486 }
487
GAP_SetSecurityMode(GAP_SecurityMode mode)488 int GAP_SetSecurityMode(GAP_SecurityMode mode)
489 {
490 LOG_INFO("%{public}s:mode[%{public}d]", __FUNCTION__, mode);
491
492 if (mode != SEC_MODE_2 && mode != SEC_MODE_4) {
493 return GAP_ERR_INVAL_PARAM;
494 }
495
496 if (GapIsBredrEnable() == false) {
497 return GAP_ERR_NOT_ENABLE;
498 }
499
500 int ret;
501 if (mode == SEC_MODE_4) {
502 ret = GapWriteSimplePairingMode(SIMPLE_PAIRING_ENABLED);
503 if (ret == BT_NO_ERROR) {
504 ret = GapWriteSecureConnectionsHostSupport(SUPPORT_SECURE_CONNECTIONS);
505 }
506 } else {
507 ret = GapWriteSimplePairingMode(SIMPLE_PAIRING_DISABLED);
508 ret |= GapWriteSecureConnectionsHostSupport(UNSUPPORT_SECURE_CONNECTIONS);
509 }
510
511 if (ret == BT_NO_ERROR) {
512 GAP_SecurityMode *secMode = GapGetSecurityMode();
513 *secMode = mode;
514 }
515
516 return GAP_SUCCESS;
517 }
518
GAP_AuthorizeRes(const BtAddr * addr,GAP_Service service,uint8_t accept)519 int GAP_AuthorizeRes(const BtAddr *addr, GAP_Service service, uint8_t accept)
520 {
521 int ret = GAP_SUCCESS;
522 ProfileSecurityBlock *profileSecurityBlock = NULL;
523 ConnectionInfoBlock *connectionInfoBlock = NULL;
524 ListNode *node = NULL;
525 RequestSecInfo *reqInfo = NULL;
526 DeviceInfo *devInfo = NULL;
527
528 LOG_INFO("%{public}s:" BT_ADDR_FMT " %{public}d, accept[%hhu]", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr), service, accept);
529
530 if (GapIsBredrEnable() == false) {
531 return GAP_ERR_NOT_ENABLE;
532 }
533
534 profileSecurityBlock = GapGetProfileSecurityBlock();
535 node = ListGetFirstNode(profileSecurityBlock->requestlist);
536 while (node != 0) {
537 reqInfo = ListGetNodeData(node);
538 if (reqInfo->info.direction == OUTGOING) {
539 node = ListGetNextNode(node);
540 continue;
541 }
542 if (reqInfo->info.serviceId == service && reqInfo->status == GAP_SEC_REQ_STATUS_ACTION) {
543 reqInfo->needAuthorization = false;
544 break;
545 } else {
546 ret = GAP_ERR_INVAL_STATE;
547 }
548 node = ListGetNextNode(node);
549 }
550
551 connectionInfoBlock = GapGetConnectionInfoBlock();
552 devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
553 if (devInfo != NULL) {
554 if (devInfo->status == GAP_DEV_SEC_STATUS_ACTION) {
555 devInfo->status = GAP_DEV_SEC_STATUS_WAIT_DISC;
556 }
557 }
558
559 GapRequestSecurityProcess();
560 return ret;
561 }
562
GapDeviceLinkkeyIsAuthenticated(const DeviceInfo * deviceInfo)563 static bool GapDeviceLinkkeyIsAuthenticated(const DeviceInfo *deviceInfo)
564 {
565 if (deviceInfo->linkkeyType == AUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P192 ||
566 deviceInfo->linkkeyType == AUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P256 ||
567 deviceInfo->linkkeyType == COMBINATION_KEY) {
568 return true;
569 } else {
570 return false;
571 }
572 }
573
GapUpdateSecurityStatusUnauthenticationSuccess(const DeviceInfo * devInfo)574 static void GapUpdateSecurityStatusUnauthenticationSuccess(const DeviceInfo *devInfo)
575 {
576 if (devInfo->actionReq != NULL) {
577 if (devInfo->actionReq->needAuthentication) {
578 devInfo->actionReq->needAuthentication = false;
579 if (devInfo->actionReq->needMITM) {
580 devInfo->actionReq->status = GAP_SEC_REQ_STATUS_FAILED;
581 } else {
582 devInfo->actionReq->status = GAP_SEC_REQ_STATUS_SUCCESS;
583 }
584 }
585 if (devInfo->actionReq->needUnauthentication) {
586 devInfo->actionReq->needUnauthentication = false;
587 }
588 }
589 }
590
GapUpdateSecurityStatusAuthenticationSuccess(const DeviceInfo * devInfo)591 static void GapUpdateSecurityStatusAuthenticationSuccess(const DeviceInfo *devInfo)
592 {
593 ListNode *node = NULL;
594 ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
595 RequestSecInfo *reqInfo = NULL;
596
597 node = ListGetFirstNode(profileSecurityBlock->requestlist);
598 while (node != 0) {
599 reqInfo = ListGetNodeData(node);
600 if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->needAuthentication) {
601 reqInfo->needAuthentication = false;
602 }
603 node = ListGetNextNode(node);
604 }
605 }
606
GapUpdateSecurityStatusEncryptionSuccess(const DeviceInfo * devInfo)607 static void GapUpdateSecurityStatusEncryptionSuccess(const DeviceInfo *devInfo)
608 {
609 ListNode *node = NULL;
610 ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
611 RequestSecInfo *reqInfo = NULL;
612
613 node = ListGetFirstNode(profileSecurityBlock->requestlist);
614 while (node != 0) {
615 reqInfo = ListGetNodeData(node);
616 if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->needEncryption) {
617 reqInfo->needEncryption = false;
618 }
619 if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_ENCRYPT) {
620 reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_ACTION;
621 }
622 node = ListGetNextNode(node);
623 }
624 }
625
GapUpdateSecurityStatusFailed(const DeviceInfo * devInfo,uint8_t hciStatus)626 static void GapUpdateSecurityStatusFailed(const DeviceInfo *devInfo, uint8_t hciStatus)
627 {
628 ListNode *node = NULL;
629 ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
630 RequestSecInfo *reqInfo = NULL;
631
632 node = ListGetFirstNode(profileSecurityBlock->requestlist);
633 while (node != 0) {
634 reqInfo = ListGetNodeData(node);
635 if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->status == GAP_SEC_REQ_STATUS_ACTION) {
636 reqInfo->status = GAP_SEC_REQ_STATUS_FAILED;
637 reqInfo->hciStatus = hciStatus;
638 }
639 if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_ENCRYPT) {
640 reqInfo->status = GAP_SEC_REQ_STATUS_FAILED;
641 reqInfo->hciStatus = hciStatus;
642 }
643 node = ListGetNextNode(node);
644 }
645 }
646
GapUpdateSecurityStatusEncryptionTimeout(const DeviceInfo * devInfo)647 static void GapUpdateSecurityStatusEncryptionTimeout(const DeviceInfo *devInfo)
648 {
649 ListNode *node = NULL;
650 ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
651 RequestSecInfo *reqInfo = NULL;
652
653 node = ListGetFirstNode(profileSecurityBlock->requestlist);
654 while (node != 0) {
655 reqInfo = ListGetNodeData(node);
656 if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_ENCRYPT) {
657 reqInfo->status = GAP_SEC_REQ_STATUS_FAILED;
658 }
659 node = ListGetNextNode(node);
660 }
661 }
662
GapUpdateSecurityStatusAclDisconnect(const DeviceInfo * devInfo,uint8_t hciStatus)663 static void GapUpdateSecurityStatusAclDisconnect(const DeviceInfo *devInfo, uint8_t hciStatus)
664 {
665 ListNode *node = NULL;
666 ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
667 RequestSecInfo *reqInfo = NULL;
668
669 node = ListGetFirstNode(profileSecurityBlock->requestlist);
670 while (node != 0) {
671 reqInfo = ListGetNodeData(node);
672 if (GapAddrCompare(&devInfo->addr, &reqInfo->addr)) {
673 reqInfo->status = GAP_SEC_REQ_STATUS_FAILED;
674 reqInfo->hciStatus = hciStatus;
675 }
676 node = ListGetNextNode(node);
677 }
678 }
679
GapUpdateSecurityStatusConnectComplete(const DeviceInfo * devInfo)680 static void GapUpdateSecurityStatusConnectComplete(const DeviceInfo *devInfo)
681 {
682 ListNode *node = NULL;
683 ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
684 RequestSecInfo *reqInfo = NULL;
685
686 node = ListGetFirstNode(profileSecurityBlock->requestlist);
687 while (node != 0) {
688 reqInfo = ListGetNodeData(node);
689 if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_CONNECT) {
690 if (*GapGetSecurityMode() == SEC_MODE_2) {
691 reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_ACTION;
692 } else {
693 reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_FEATURE;
694 }
695 }
696 node = ListGetNextNode(node);
697 }
698 }
699
GapUpdateSecurityStatusFeatureComplete(DeviceInfo * devInfo)700 static void GapUpdateSecurityStatusFeatureComplete(DeviceInfo *devInfo)
701 {
702 ListNode *node = NULL;
703 ProfileSecurityBlock *profileSecurityBlock = GapGetProfileSecurityBlock();
704 RequestSecInfo *reqInfo = NULL;
705
706 node = ListGetFirstNode(profileSecurityBlock->requestlist);
707 while (node != NULL) {
708 reqInfo = ListGetNodeData(node);
709 node = ListGetNextNode(node);
710 if (GapAddrCompare(&devInfo->addr, &reqInfo->addr) && reqInfo->status == GAP_SEC_REQ_STATUS_WAIT_FEATURE) {
711 if (!devInfo->supportSSP || reqInfo->info.direction == OUTGOING || devInfo->isEncryption) {
712 reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_ACTION;
713 continue;
714 }
715 reqInfo->status = GAP_SEC_REQ_STATUS_WAIT_ENCRYPT;
716 if (devInfo->waitEncryptAlarm == NULL) {
717 devInfo->waitEncryptAlarm = AlarmCreate("wait encrypt", false);
718 }
719 }
720 }
721 }
722
GapUpdateSecurityRequest(DeviceInfo * devInfo,enum DeviceSecurityEvent event,uint8_t hciStatus)723 void GapUpdateSecurityRequest(DeviceInfo *devInfo, enum DeviceSecurityEvent event, uint8_t hciStatus)
724 {
725 switch (event) {
726 case GAP_SEC_EVENT_CONNECT_COMP:
727 GapUpdateSecurityStatusConnectComplete(devInfo);
728 break;
729 case GAP_SEC_EVENT_FEATURE_COMP:
730 GapUpdateSecurityStatusFeatureComplete(devInfo);
731 break;
732 case GAP_SEC_EVENT_UNAUTH_SUCCESS:
733 GapUpdateSecurityStatusUnauthenticationSuccess(devInfo);
734 break;
735 case GAP_SEC_EVENT_AUTH_SUCCESS:
736 GapUpdateSecurityStatusAuthenticationSuccess(devInfo);
737 break;
738 case GAP_SEC_EVENT_ENC_SUCCESS:
739 if (devInfo->waitEncryptAlarm != NULL) {
740 AlarmCancel(devInfo->waitEncryptAlarm);
741 AlarmDelete(devInfo->waitEncryptAlarm);
742 devInfo->waitEncryptAlarm = NULL;
743 }
744 GapUpdateSecurityStatusEncryptionSuccess(devInfo);
745 break;
746 case GAP_SEC_EVENT_ENC_FAILED:
747 if (devInfo->waitEncryptAlarm != NULL) {
748 AlarmCancel(devInfo->waitEncryptAlarm);
749 AlarmDelete(devInfo->waitEncryptAlarm);
750 devInfo->waitEncryptAlarm = NULL;
751 }
752 GapUpdateSecurityStatusFailed(devInfo, hciStatus);
753 break;
754 case GAP_SEC_EVENT_AUTH_FAILED:
755 GapUpdateSecurityStatusFailed(devInfo, hciStatus);
756 break;
757 case GAP_SEC_EVENT_WAIT_ENC_TIMEOUT:
758 GapUpdateSecurityStatusEncryptionTimeout(devInfo);
759 break;
760 case GAP_SEC_EVENT_ACL_DISCONNECT:
761 GapUpdateSecurityStatusAclDisconnect(devInfo, hciStatus);
762 break;
763 default:
764 break;
765 }
766 }
767
GapAuthenticationRequested(uint16_t handle)768 static int GapAuthenticationRequested(uint16_t handle)
769 {
770 HciAuthenticationRequestedParam hciCmdParam = {
771 .connectionHandle = handle,
772 };
773
774 return HCI_AuthenticationRequested(&hciCmdParam);
775 }
776
GapAuthenticationWaitRetryTimeoutTask(void * ctx)777 static void GapAuthenticationWaitRetryTimeoutTask(void *ctx)
778 {
779 RequestSecInfo *reqInfo = ListForEachData(
780 GapGetProfileSecurityBlock()->requestlist, GapFindCmpListData, ((GapGeneralPointerInfo *)ctx)->pointer);
781 if (reqInfo != NULL) {
782 DeviceInfo *deviceInfo =
783 ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindConnectionDeviceByAddr, &reqInfo->addr);
784 if (deviceInfo != NULL) {
785 deviceInfo->authenticationStatus = GAP_AUTH_STATUS_RETRY;
786 deviceInfo->actionReq = NULL;
787 GapRequestSecurityProcess();
788 } else {
789 BTM_AclConnect(&reqInfo->addr);
790 }
791 }
792 }
793
GapAuthenticationWaitRetryTimeout(void * parameter)794 static void GapAuthenticationWaitRetryTimeout(void *parameter)
795 {
796 LOG_INFO("%{public}s: ", __FUNCTION__);
797 GapGeneralPointerInfo *ctx = MEM_MALLOC.alloc(sizeof(GapGeneralPointerInfo));
798 if (ctx == NULL) {
799 LOG_ERROR("%{public}s: Alloc error.", __FUNCTION__);
800 return;
801 }
802
803 ctx->pointer = parameter;
804
805 int ret = GapRunTaskUnBlockProcess(GapAuthenticationWaitRetryTimeoutTask, ctx, NULL);
806 if (ret != BT_NO_ERROR) {
807 LOG_ERROR("%{public}s: Task error:%{public}d.", __FUNCTION__, ret);
808 }
809 }
810
GapAuthenticationClearInfo(RequestSecInfo * reqInfo)811 void GapAuthenticationClearInfo(RequestSecInfo *reqInfo)
812 {
813 if (reqInfo->waitRetryalarm != NULL) {
814 AlarmCancel(reqInfo->waitRetryalarm);
815 AlarmDelete(reqInfo->waitRetryalarm);
816 reqInfo->waitRetryalarm = NULL;
817 }
818 }
819
GapAuthenticationRetry(DeviceInfo * deviceInfo,RequestSecInfo * reqInfo,uint8_t hciStatus)820 void GapAuthenticationRetry(DeviceInfo *deviceInfo, RequestSecInfo *reqInfo, uint8_t hciStatus)
821 {
822 if (reqInfo == NULL) {
823 return;
824 }
825
826 if (reqInfo->waitRetryalarm == NULL) {
827 reqInfo->waitRetryalarm = AlarmCreate("retry pair", false);
828 }
829
830 if (++reqInfo->retryCount <= GAP_PAIR_RETRY_COUNT) {
831 AlarmCancel(reqInfo->waitRetryalarm);
832 AlarmSet(reqInfo->waitRetryalarm, GAP_PAIR_RETRY_WAIT_TIME, GapAuthenticationWaitRetryTimeout, reqInfo);
833 } else {
834 if (deviceInfo != NULL) {
835 GapUpdateSecurityRequest(deviceInfo, GAP_SEC_EVENT_AUTH_FAILED, hciStatus);
836 } else {
837 reqInfo->status = GAP_SEC_REQ_STATUS_FAILED;
838 reqInfo->hciStatus = hciStatus;
839 if (reqInfo->info.serviceId == GAP) {
840 GapDoAuthenticationCallback(reqInfo);
841 }
842 if (!reqInfo->doCallback) {
843 reqInfo->doCallback = true;
844 GapDoSecurityCallback(reqInfo);
845 }
846 }
847 }
848 }
849
GapOnAuthenticationComplete(const HciAuthenticationCompleteEventParam * eventParam)850 void GapOnAuthenticationComplete(const HciAuthenticationCompleteEventParam *eventParam)
851 {
852 LOG_DEBUG("%{public}s:", __FUNCTION__);
853 bool inDedicatedBonding = false;
854 bool isGapRequest = false;
855 bool callback = true;
856 BtAddr addr = {0};
857
858 ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
859 DeviceInfo *deviceInfo = ListForEachData(
860 connectionInfoBlock->devicelist, GapFindConnectionDeviceByHandle, (void *)&eventParam->connectionHandle);
861 if (deviceInfo != NULL) {
862 isGapRequest = (deviceInfo->actionReq && deviceInfo->actionReq->info.serviceId == GAP);
863 deviceInfo->authenticationStatus = GAP_AUTH_STATUS_IDLE;
864 if (eventParam->status == HCI_SUCCESS) {
865 if (GapDeviceLinkkeyIsAuthenticated(deviceInfo)) {
866 deviceInfo->isAuthentication = true;
867 GapUpdateSecurityRequest(deviceInfo, GAP_SEC_EVENT_AUTH_SUCCESS, eventParam->status);
868 } else {
869 GapUpdateSecurityRequest(deviceInfo, GAP_SEC_EVENT_UNAUTH_SUCCESS, eventParam->status);
870 }
871 GapReadNewLocalOOBData();
872 GapAuthenticationClearInfo(deviceInfo->actionReq);
873 deviceInfo->actionReq = NULL;
874 } else if ((eventParam->status == HCI_PIN_OR_KEY_MISSING && GapIsKeyMissingRetry()) ||
875 BtmInteropIsMatchedAddr(INTEROP_AUTO_RETRY_PAIRING, &deviceInfo->addr)) {
876 deviceInfo->authenticationStatus = GAP_AUTH_STATUS_WAIT_RETRY;
877 GapAuthenticationRetry(deviceInfo, deviceInfo->actionReq, eventParam->status);
878 callback = false;
879 } else {
880 GapUpdateSecurityRequest(deviceInfo, GAP_SEC_EVENT_AUTH_FAILED, eventParam->status);
881 deviceInfo->actionReq = NULL;
882 }
883 inDedicatedBonding = deviceInfo->inDedicatedBonding;
884 (void)memcpy_s(&addr, sizeof(BtAddr), &deviceInfo->addr, sizeof(BtAddr));
885 if (deviceInfo->status == GAP_DEV_SEC_STATUS_ACTION) {
886 deviceInfo->status = GAP_DEV_SEC_STATUS_WAIT_DISC;
887 }
888 }
889
890 GapRequestSecurityProcess();
891
892 if (g_authenticationCallback.callback.authenticationComplete) {
893 if (inDedicatedBonding == true) {
894 if (isGapRequest || callback) {
895 g_authenticationCallback.callback.authenticationComplete(
896 &addr, eventParam->status, g_authenticationCallback.context);
897 }
898 } else if (inDedicatedBonding == false && callback) {
899 g_authenticationCallback.callback.authenticationComplete(
900 &addr, eventParam->status, g_authenticationCallback.context);
901 }
902 }
903 }
904
GapIOCapabilityRequestReply(const BtAddr * addr,uint8_t ioCapability,uint8_t authReq,uint8_t oobDataPresent)905 static int GapIOCapabilityRequestReply(
906 const BtAddr *addr, uint8_t ioCapability, uint8_t authReq, uint8_t oobDataPresent)
907 {
908 bool isDedicatedBonding = false;
909 uint8_t authenticationRequirements = AUTHENTICATION_UNKNOWN_MITM;
910
911 ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
912 DeviceInfo *devInfo = NULL;
913 devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
914 if (devInfo != NULL) {
915 devInfo->localIOCap = ioCapability;
916 isDedicatedBonding = devInfo->inDedicatedBonding;
917 authenticationRequirements = devInfo->remoteAuthReq;
918 }
919
920 if (authenticationRequirements == AUTHENTICATION_UNKNOWN_MITM) {
921 if (!GapIsBondMode()) {
922 authenticationRequirements = AUTHENTICATION_NO_MITM_NO_BONDING + authReq;
923 } else if (isDedicatedBonding) {
924 authenticationRequirements = AUTHENTICATION_NO_MITM_DEDICATED_BONDING + authReq;
925 } else {
926 authenticationRequirements = AUTHENTICATION_NO_MITM_GENERAL_BONDING + authReq;
927 }
928 }
929
930 HciIOCapabilityRequestReplyParam hciCmdParam;
931 (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
932 hciCmdParam.ioCapability = ioCapability;
933 hciCmdParam.authenticationRequirements = authenticationRequirements;
934 hciCmdParam.oobDataPresent = oobDataPresent;
935
936 return HCI_IOCapabilityRequestReply(&hciCmdParam);
937 }
938
GapIOCapabilityRequestNegativeReply(const BtAddr * addr,uint8_t reason)939 static int GapIOCapabilityRequestNegativeReply(const BtAddr *addr, uint8_t reason)
940 {
941 HciIoCapabilityRequestNegativeReplyParam hciCmdParam;
942
943 (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
944 hciCmdParam.reason = reason;
945
946 return HCI_IOCapabilityRequestNegativeReply(&hciCmdParam);
947 }
948
GapOnIOCapabilityRequestEvent(const HciIoCapabilityRequestEventParam * eventParam)949 void GapOnIOCapabilityRequestEvent(const HciIoCapabilityRequestEventParam *eventParam)
950 {
951 LOG_DEBUG("%{public}s:" BT_ADDR_FMT "", __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
952 BtAddr addr = BT_ADDR_NULL;
953 bool doReject = false;
954 GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
955
956 ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
957 DeviceInfo *devInfo = NULL;
958 devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)&addr);
959 if (devInfo != NULL) {
960 if (devInfo->authenticationStatus == GAP_AUTH_STATUS_IDLE) {
961 GapStartUseAclConnection(devInfo, GAP_USE_ACL_CONNECTION_TIME);
962 }
963 if ((GapIsBondMode() == false) && (devInfo->remoteAuthReq != AUTHENTICATION_UNKNOWN_MITM) &&
964 (devInfo->remoteAuthReq != AUTHENTICATION_MITM_NO_BONDING) &&
965 (devInfo->remoteAuthReq != AUTHENTICATION_NO_MITM_NO_BONDING)) {
966 doReject = true;
967 }
968 }
969
970 if (doReject) {
971 GapIOCapabilityRequestNegativeReply(&addr, HCI_PAIRING_NOT_ALLOWED);
972 } else {
973 if (g_authenticationCallback.callback.IOCapabilityReq) {
974 g_authenticationCallback.callback.IOCapabilityReq(&addr, g_authenticationCallback.context);
975 } else {
976 LOG_INFO("Not Register");
977 GapIOCapabilityRequestNegativeReply(&addr, HCI_PAIRING_NOT_ALLOWED);
978 }
979 }
980 }
981
GapIOCapabilityRequestReplyComplete(const HciIOCapabilityRequestReplyReturnParam * param)982 void GapIOCapabilityRequestReplyComplete(const HciIOCapabilityRequestReplyReturnParam *param)
983 {
984 if (param->status != HCI_SUCCESS) {
985 BtAddr addr = BT_ADDR_NULL;
986 GapChangeHCIAddr(&addr, ¶m->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
987 LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed: %02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(param->bdAddr.raw), param->status);
988 GapIOCapabilityRequestNegativeReply(&addr, HCI_PAIRING_NOT_ALLOWED);
989 }
990 }
991
GapIOCapabilityRequestNegativeReplyComplete(const HciIoCapabilityRequestNegativeReplyReturnParam * param)992 void GapIOCapabilityRequestNegativeReplyComplete(const HciIoCapabilityRequestNegativeReplyReturnParam *param)
993 {
994 if (param->status != HCI_SUCCESS) {
995 LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed: %02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(param->bdAddr.raw), param->status);
996 }
997 }
998
GapOnIOCapabilityResponseEvent(const HciIoCapabilityResponseEventParam * eventParam)999 void GapOnIOCapabilityResponseEvent(const HciIoCapabilityResponseEventParam *eventParam)
1000 {
1001 LOG_DEBUG("%{public}s:" BT_ADDR_FMT "", __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1002 BtAddr addr = BT_ADDR_NULL;
1003
1004 GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1005
1006 DeviceInfo *devInfo = NULL;
1007 devInfo = ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindConnectionDeviceByAddr, (void *)&addr);
1008 if (devInfo != NULL) {
1009 devInfo->remoteAuthReq = eventParam->authenticationRequirements;
1010 }
1011
1012 if (g_authenticationCallback.callback.IOCapabilityRsp) {
1013 g_authenticationCallback.callback.IOCapabilityRsp(
1014 &addr, eventParam->IOCapability, g_authenticationCallback.context);
1015 }
1016 }
1017
GAP_RegisterAuthenticationCallback(const GapAuthenticationCallback * callback,void * context)1018 int GAP_RegisterAuthenticationCallback(const GapAuthenticationCallback *callback, void *context)
1019 {
1020 LOG_INFO("%{public}s:%{public}s", __FUNCTION__, callback ? "register" : "NULL");
1021 if (callback == NULL) {
1022 (void)memset_s(&g_authenticationCallback.callback,
1023 sizeof(g_authenticationCallback.callback),
1024 0x00,
1025 sizeof(g_authenticationCallback.callback));
1026 } else {
1027 g_authenticationCallback.callback = *callback;
1028 }
1029 g_authenticationCallback.context = context;
1030 return GAP_SUCCESS;
1031 }
1032
GAP_DeregisterAuthenticationCallback(void)1033 int GAP_DeregisterAuthenticationCallback(void)
1034 {
1035 (void)memset_s(&g_authenticationCallback.callback,
1036 sizeof(g_authenticationCallback.callback),
1037 0x00,
1038 sizeof(g_authenticationCallback.callback));
1039 g_authenticationCallback.context = NULL;
1040 return GAP_SUCCESS;
1041 }
1042
GAP_AuthenticationReq(const BtAddr * addr)1043 int GAP_AuthenticationReq(const BtAddr *addr)
1044 {
1045 int ret = GAP_SUCCESS;
1046 ConnectionInfoBlock *connectionInfoBlock = NULL;
1047 ProfileSecurityBlock *profileSecurityBlock = NULL;
1048 DeviceInfo *deviceInfo = NULL;
1049
1050 LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr));
1051
1052 if (GapIsBredrEnable() == false) {
1053 return GAP_ERR_NOT_ENABLE;
1054 }
1055
1056 if (!GapIsBondMode()) {
1057 ret = GAP_ERR_INVAL_STATE;
1058 } else {
1059 RequestSecInfo *secInfo = NULL;
1060 ProfileSecurityInfo tempInfo = {0};
1061 tempInfo.info.serviceId = GAP;
1062 tempInfo.info.direction = OUTGOING;
1063 tempInfo.securityMode = GAP_SEC_OUT_AUTHENTICATION;
1064 connectionInfoBlock = GapGetConnectionInfoBlock();
1065 profileSecurityBlock = GapGetProfileSecurityBlock();
1066 secInfo = GapAllocReqSecInfo(addr, NULL, NULL, &tempInfo);
1067 if (secInfo != NULL) {
1068 ListAddFirst(profileSecurityBlock->requestlist, secInfo);
1069 deviceInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
1070 if (deviceInfo != NULL) {
1071 GapRequestSecurityProcess();
1072 } else {
1073 ret = BTM_AclConnect(addr);
1074 }
1075 } else {
1076 ret = GAP_ERR_OUT_OF_RES;
1077 }
1078 }
1079
1080 return ret;
1081 }
1082
GAP_CancelAuthenticationReq(const BtAddr * addr)1083 int GAP_CancelAuthenticationReq(const BtAddr *addr)
1084 {
1085 if (GapIsBredrEnable() == false) {
1086 return GAP_ERR_NOT_ENABLE;
1087 }
1088
1089 DeviceInfo *devInfo = NULL;
1090 devInfo = ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
1091 if (devInfo != NULL) {
1092 if (devInfo->status == GAP_DEV_SEC_STATUS_ACTION) {
1093 devInfo->status = GAP_DEV_SEC_STATUS_IDLE;
1094 BTM_AclRelease(devInfo->handle);
1095 }
1096 }
1097
1098 return GAP_SUCCESS;
1099 }
1100
GAP_IOCapabilityRsp(const BtAddr * addr,uint8_t accept,uint8_t ioCapability,uint8_t oobDataPresent,uint8_t authReq)1101 int GAP_IOCapabilityRsp(
1102 const BtAddr *addr, uint8_t accept, uint8_t ioCapability, uint8_t oobDataPresent, uint8_t authReq)
1103 {
1104 int ret;
1105
1106 LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr));
1107
1108 if (GapIsBredrEnable() == false) {
1109 return GAP_ERR_NOT_ENABLE;
1110 }
1111
1112 DeviceInfo *devInfo = NULL;
1113 devInfo = ListForEachData(GapGetConnectionInfoBlock()->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
1114 if (devInfo != NULL && devInfo->actionReq != NULL) {
1115 if (!devInfo->actionReq->needAuthentication && devInfo->actionReq->needUnauthentication) {
1116 if (authReq == GAP_MITM_REQUIRED) {
1117 authReq = GAP_MITM_NOT_REQUIRED;
1118 }
1119 }
1120 }
1121
1122 if (accept == GAP_ACCEPT) {
1123 ret = GapIOCapabilityRequestReply(addr, ioCapability, authReq, oobDataPresent);
1124 } else if (accept == GAP_NOT_ACCEPT) {
1125 ret = GapIOCapabilityRequestNegativeReply(addr, HCI_PAIRING_NOT_ALLOWED);
1126 } else {
1127 ret = GAP_ERR_INVAL_PARAM;
1128 }
1129
1130 return ret;
1131 }
1132
GapUserConfirmationRequestReply(const BtAddr * addr)1133 static int GapUserConfirmationRequestReply(const BtAddr *addr)
1134 {
1135 HciUserConfirmationRequestReplyParam hciCmdParam;
1136
1137 (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1138
1139 return HCI_UserConfirmationRequestReply(&hciCmdParam);
1140 }
1141
GapUserConfirmationRequestNegativeReply(const BtAddr * addr)1142 static int GapUserConfirmationRequestNegativeReply(const BtAddr *addr)
1143 {
1144 HciUserConfirmationRequestNegativeReplyParam hciCmdParam;
1145
1146 (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1147
1148 return HCI_UserConfirmationRequestNegativeReply(&hciCmdParam);
1149 }
1150
GapOnUserConfirmationRequestEvent(const HciUserConfirmationRequestEventParam * eventParam)1151 void GapOnUserConfirmationRequestEvent(const HciUserConfirmationRequestEventParam *eventParam)
1152 {
1153 LOG_INFO("%{public}s:" BT_ADDR_FMT "", __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1154 BtAddr addr = BT_ADDR_NULL;
1155 GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1156 if (g_authenticationCallback.callback.userConfirmReq) {
1157 g_authenticationCallback.callback.userConfirmReq(
1158 &addr, eventParam->numericValue, g_authenticationCallback.context);
1159 } else {
1160 GapUserConfirmationRequestNegativeReply(&addr);
1161 }
1162 }
1163
GapUserConfirmationRequestReplyComplete(const HciUserConfirmationRequestReplyReturnParam * param)1164 void GapUserConfirmationRequestReplyComplete(const HciUserConfirmationRequestReplyReturnParam *param)
1165 {
1166 if (param->status != HCI_SUCCESS) {
1167 BtAddr addr = BT_ADDR_NULL;
1168 GapChangeHCIAddr(&addr, ¶m->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1169 LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr), param->status);
1170 GapUserConfirmationRequestNegativeReply(&addr);
1171 }
1172 }
1173
GapUserConfirmationRequestNegativeReplyComplete(const HciUserConfirmationRequestNegativeReplyReturnParam * param)1174 void GapUserConfirmationRequestNegativeReplyComplete(const HciUserConfirmationRequestNegativeReplyReturnParam *param)
1175 {
1176 if (param->status != HCI_SUCCESS) {
1177 LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(param->bdAddr.raw), param->status);
1178 }
1179 }
1180
GAP_UserConfirmRsp(const BtAddr * addr,uint8_t accept)1181 int GAP_UserConfirmRsp(const BtAddr *addr, uint8_t accept)
1182 {
1183 int ret;
1184
1185 LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr));
1186
1187 if (GapIsBredrEnable() == false) {
1188 return GAP_ERR_NOT_ENABLE;
1189 }
1190
1191 if (accept == GAP_ACCEPT) {
1192 ret = GapUserConfirmationRequestReply(addr);
1193 } else if (accept == GAP_NOT_ACCEPT) {
1194 ret = GapUserConfirmationRequestNegativeReply(addr);
1195 } else {
1196 ret = GAP_ERR_INVAL_PARAM;
1197 }
1198
1199 return ret;
1200 }
1201
GapUserPasskeyRequestReply(const BtAddr * addr,int numericValue)1202 static int GapUserPasskeyRequestReply(const BtAddr *addr, int numericValue)
1203 {
1204 HciUserPasskeyRequestReplyParam hciCmdParam;
1205
1206 (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1207 hciCmdParam.numericValue = numericValue;
1208
1209 return HCI_UserPasskeyRequestReply(&hciCmdParam);
1210 }
1211
GapUserPasskeyRequestNegativeReply(const BtAddr * addr)1212 static int GapUserPasskeyRequestNegativeReply(const BtAddr *addr)
1213 {
1214 HciUserPasskeyRequestNegativeReplyParam hciCmdParam;
1215
1216 (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1217
1218 return HCI_UserPasskeyRequestNegativeReply(&hciCmdParam);
1219 }
1220
GapOnUserPasskeyNotificationEvent(const HciUserPasskeyNotificationEventParam * eventParam)1221 void GapOnUserPasskeyNotificationEvent(const HciUserPasskeyNotificationEventParam *eventParam)
1222 {
1223 LOG_DEBUG("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1224 BtAddr addr = BT_ADDR_NULL;
1225
1226 GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1227 if (g_authenticationCallback.callback.userPasskeyNotification) {
1228 g_authenticationCallback.callback.userPasskeyNotification(
1229 &addr, eventParam->passkey, g_authenticationCallback.context);
1230 } else {
1231 LOG_WARN("%{public}s:not register callback", __FUNCTION__);
1232 }
1233 }
1234
GapOnUserPasskeyRequestEvent(const HciUserPasskeyRequestEventParam * eventParam)1235 void GapOnUserPasskeyRequestEvent(const HciUserPasskeyRequestEventParam *eventParam)
1236 {
1237 LOG_DEBUG("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1238 BtAddr addr = BT_ADDR_NULL;
1239
1240 GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1241
1242 if (g_authenticationCallback.callback.userPasskeyReq) {
1243 g_authenticationCallback.callback.userPasskeyReq(&addr, g_authenticationCallback.context);
1244 } else {
1245 GapUserPasskeyRequestNegativeReply(&addr);
1246 }
1247 }
1248
GapUserPasskeyRequestReplyComplete(const HciUserPasskeyRequestReplyReturnParam * param)1249 void GapUserPasskeyRequestReplyComplete(const HciUserPasskeyRequestReplyReturnParam *param)
1250 {
1251 if (param->status != HCI_SUCCESS) {
1252 BtAddr addr = BT_ADDR_NULL;
1253 GapChangeHCIAddr(&addr, ¶m->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1254 LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr), param->status);
1255 GapUserPasskeyRequestNegativeReply(&addr);
1256 }
1257 }
1258
GapUserPasskeyRequestNegativeReplyComplete(const HciUserPasskeyRequestNegativeReplyReturnParam * param)1259 void GapUserPasskeyRequestNegativeReplyComplete(const HciUserPasskeyRequestNegativeReplyReturnParam *param)
1260 {
1261 if (param->status != HCI_SUCCESS) {
1262 LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(param->bdAddr.raw), param->status);
1263 }
1264 }
1265
GAP_UserPasskeyRsp(const BtAddr * addr,uint8_t accept,uint32_t number)1266 int GAP_UserPasskeyRsp(const BtAddr *addr, uint8_t accept, uint32_t number)
1267 {
1268 int ret;
1269
1270 LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr));
1271
1272 if (GapIsBredrEnable() == false) {
1273 return GAP_ERR_NOT_ENABLE;
1274 }
1275
1276 if (accept == GAP_ACCEPT) {
1277 ret = GapUserPasskeyRequestReply(addr, number);
1278 } else if (accept == GAP_NOT_ACCEPT) {
1279 ret = GapUserPasskeyRequestNegativeReply(addr);
1280 } else {
1281 ret = GAP_ERR_INVAL_PARAM;
1282 }
1283
1284 return ret;
1285 }
1286
GapRemoteOOBDataRequestReply(const BtAddr * addr,const uint8_t * c,const uint8_t * r)1287 static int GapRemoteOOBDataRequestReply(const BtAddr *addr, const uint8_t *c, const uint8_t *r)
1288 {
1289 HciRemoteOobDataRequestReplyParam hciCmdParam;
1290 (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1291 (void)memcpy_s(hciCmdParam.C, GAP_OOB_DATA_CONFIRM_SIZE, c, GAP_OOB_DATA_CONFIRM_SIZE);
1292 (void)memcpy_s(hciCmdParam.r, GAP_OOB_DATA_RANDOM_SIZE, r, GAP_OOB_DATA_RANDOM_SIZE);
1293
1294 return HCI_RemoteOOBDataRequestReply(&hciCmdParam);
1295 }
1296
GapRemoteOOBDataRequestNegativeReply(const BtAddr * addr)1297 static int GapRemoteOOBDataRequestNegativeReply(const BtAddr *addr)
1298 {
1299 HciRemoteOobDataRequestNegativeReplyParam hciCmdParam;
1300
1301 (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1302
1303 return HCI_RemoteOOBDataRequestNegativeReply(&hciCmdParam);
1304 }
1305
GapOnRemoteOOBDataRequestEvent(const HciRemoteOobDataRequestEventParam * eventParam)1306 void GapOnRemoteOOBDataRequestEvent(const HciRemoteOobDataRequestEventParam *eventParam)
1307 {
1308 LOG_DEBUG("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1309 BtAddr addr;
1310
1311 GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1312
1313 if (g_authenticationCallback.callback.remoteOobReq) {
1314 g_authenticationCallback.callback.remoteOobReq(&addr, g_authenticationCallback.context);
1315 } else {
1316 GapRemoteOOBDataRequestNegativeReply(&addr);
1317 }
1318 }
1319
GapRemoteOOBDataRequestReplyComplete(const HciRemoteOobDataRequestReplyReturnParam * param)1320 void GapRemoteOOBDataRequestReplyComplete(const HciRemoteOobDataRequestReplyReturnParam *param)
1321 {
1322 if (param->status != HCI_SUCCESS) {
1323 BtAddr addr;
1324 GapChangeHCIAddr(&addr, ¶m->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1325 LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr), param->status);
1326 GapRemoteOOBDataRequestNegativeReply(&addr);
1327 }
1328 }
1329
GapRemoteOOBExtendedDataRequestReplyComplete(const HciRemoteOobExtendedDataRequestReplyReturnParam * param)1330 void GapRemoteOOBExtendedDataRequestReplyComplete(const HciRemoteOobExtendedDataRequestReplyReturnParam *param)
1331 {
1332 if (param->status != HCI_SUCCESS) {
1333 BtAddr addr;
1334 GapChangeHCIAddr(&addr, ¶m->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1335 LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr), param->status);
1336 GapRemoteOOBDataRequestNegativeReply(&addr);
1337 }
1338 }
1339
GapRemoteOOBDataRequestNegativeReplyComplete(const HciRemoteOobDataRequestNegativeReplyReturnParam * param)1340 void GapRemoteOOBDataRequestNegativeReplyComplete(const HciRemoteOobDataRequestNegativeReplyReturnParam *param)
1341 {
1342 if (param->status != HCI_SUCCESS) {
1343 LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(param->bdAddr.raw), param->status);
1344 }
1345 }
1346
GAP_RemoteOobRsp(const BtAddr * addr,uint8_t accept,const GapOOBData * data)1347 int GAP_RemoteOobRsp(const BtAddr *addr, uint8_t accept, const GapOOBData *data)
1348 {
1349 int ret;
1350
1351 if (GapIsBredrEnable() == false) {
1352 return GAP_ERR_NOT_ENABLE;
1353 }
1354
1355 if (addr == NULL || data == NULL) {
1356 return GAP_ERR_INVAL_PARAM;
1357 }
1358
1359 LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr));
1360
1361 if (accept == GAP_ACCEPT) {
1362 ret = GapRemoteOOBDataRequestReply(addr, (uint8_t *)data->C, (uint8_t *)data->R);
1363 } else if (accept == GAP_NOT_ACCEPT) {
1364 ret = GapRemoteOOBDataRequestNegativeReply(addr);
1365 } else {
1366 ret = GAP_ERR_INVAL_PARAM;
1367 }
1368
1369 return ret;
1370 }
1371
GapPINCodeRequestReply(const BtAddr * addr,uint8_t pinCode[GAP_PINCODE_SIZE],uint8_t pinCodeLength)1372 static int GapPINCodeRequestReply(const BtAddr *addr, uint8_t pinCode[GAP_PINCODE_SIZE], uint8_t pinCodeLength)
1373 {
1374 HciPinCodeRequestReplyParam hciCmdParam;
1375
1376 (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1377 (void)memcpy_s(hciCmdParam.pinCode, GAP_PINCODE_SIZE, pinCode, GAP_PINCODE_SIZE);
1378 hciCmdParam.pinCodeLength = pinCodeLength;
1379
1380 return HCI_PINCodeRequestReply(&hciCmdParam);
1381 }
1382
GapPINCodeRequestNegativeReply(const BtAddr * addr)1383 static int GapPINCodeRequestNegativeReply(const BtAddr *addr)
1384 {
1385 HciPinCodeRequestNegativeReplyParam hciCmdParam;
1386
1387 (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1388
1389 return HCI_PINCodeRequestNegativeReply(&hciCmdParam);
1390 }
1391
GapOnPINCodeRequestEvent(const HciPinCodeRequestEventParam * eventParam)1392 void GapOnPINCodeRequestEvent(const HciPinCodeRequestEventParam *eventParam)
1393 {
1394 LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1395 BtAddr addr;
1396 bool isBondableMode = false;
1397
1398 GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1399
1400 ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
1401 DeviceInfo *devInfo = NULL;
1402 devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)&addr);
1403 if (devInfo != NULL) {
1404 if (devInfo->authenticationStatus == GAP_AUTH_STATUS_IDLE) {
1405 GapStartUseAclConnection(devInfo, GAP_USE_ACL_CONNECTION_TIME);
1406 }
1407 }
1408
1409 isBondableMode = GapIsBondMode();
1410 if (isBondableMode == false) {
1411 GapPINCodeRequestNegativeReply(&addr);
1412 } else if (g_authenticationCallback.callback.pinCodeReq) {
1413 g_authenticationCallback.callback.pinCodeReq(&addr, g_authenticationCallback.context);
1414 } else {
1415 GapPINCodeRequestNegativeReply(&addr);
1416 }
1417 }
1418
GapPINCodeRequestReplyComplete(const HciPinCodeRequestReplyReturnParam * param)1419 void GapPINCodeRequestReplyComplete(const HciPinCodeRequestReplyReturnParam *param)
1420 {
1421 if (param->status != HCI_SUCCESS) {
1422 BtAddr addr;
1423 GapChangeHCIAddr(&addr, ¶m->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1424 LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr), param->status);
1425 GapPINCodeRequestNegativeReply(&addr);
1426 }
1427 }
1428
GapPINCodeRequestNegativeReplyComplete(const HciPinCodeRequestNegativeReplyReturnParam * param)1429 void GapPINCodeRequestNegativeReplyComplete(const HciPinCodeRequestNegativeReplyReturnParam *param)
1430 {
1431 if (param->status != HCI_SUCCESS) {
1432 LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(param->bdAddr.raw), param->status);
1433 }
1434 }
1435
GAP_PinCodeRsp(const BtAddr * addr,uint8_t accept,const uint8_t * pinCode,uint8_t pinCodeLength)1436 int GAP_PinCodeRsp(const BtAddr *addr, uint8_t accept, const uint8_t *pinCode, uint8_t pinCodeLength)
1437 {
1438 int ret;
1439
1440 if (GapIsBredrEnable() == false) {
1441 return GAP_ERR_NOT_ENABLE;
1442 }
1443
1444 if (addr == NULL) {
1445 return GAP_ERR_INVAL_PARAM;
1446 } else if (accept == GAP_ACCEPT && (pinCode == NULL || pinCodeLength > GAP_PINCODE_SIZE)) {
1447 return GAP_ERR_INVAL_PARAM;
1448 }
1449
1450 LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr));
1451
1452 if (accept == GAP_ACCEPT) {
1453 uint8_t pin[GAP_PINCODE_SIZE] = {0};
1454 (void)memcpy_s(pin, GAP_PINCODE_SIZE, pinCode, pinCodeLength);
1455 ret = GapPINCodeRequestReply(addr, pin, pinCodeLength);
1456 } else if (accept == GAP_NOT_ACCEPT) {
1457 ret = GapPINCodeRequestNegativeReply(addr);
1458 } else {
1459 ret = GAP_ERR_INVAL_PARAM;
1460 }
1461
1462 return ret;
1463 }
1464
GapLinkKeyRequestReply(const BtAddr * addr,const uint8_t * linkKey)1465 static int GapLinkKeyRequestReply(const BtAddr *addr, const uint8_t *linkKey)
1466 {
1467 HciLinkKeyRequestReplyParam hciCmdParam;
1468 (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1469 if (memcpy_s(hciCmdParam.linkKey, GAP_LINKKEY_SIZE, linkKey, GAP_LINKKEY_SIZE) != EOK) {
1470 return GAP_STATUS_FAILED;
1471 }
1472
1473 return HCI_LinkKeyRequestReply(&hciCmdParam);
1474 }
1475
GapLinkKeyRequestNegativeReply(const BtAddr * addr)1476 static int GapLinkKeyRequestNegativeReply(const BtAddr *addr)
1477 {
1478 HciLinkKeyRequestNegativeReplyParam hciCmdParam;
1479
1480 (void)memcpy_s(hciCmdParam.bdAddr.raw, BT_ADDRESS_SIZE, addr->addr, BT_ADDRESS_SIZE);
1481
1482 return HCI_LinkKeyRequestNegativeReply(&hciCmdParam);
1483 }
1484
GAP_PairIsFromLocal(const BtAddr * addr,bool * isLocal)1485 int GAP_PairIsFromLocal(const BtAddr *addr, bool *isLocal)
1486 {
1487 int ret = GAP_SUCCESS;
1488
1489 LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr));
1490
1491 if (GapIsBredrEnable() == false) {
1492 return GAP_ERR_NOT_ENABLE;
1493 }
1494
1495 ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
1496 DeviceInfo *devInfo = NULL;
1497 devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
1498 if (devInfo != NULL) {
1499 *isLocal = !!devInfo->authenticationStatus;
1500 } else {
1501 ret = GAP_ERR_INVAL_STATE;
1502 }
1503
1504 return ret;
1505 }
1506
GapOnLinkKeyNotificationEvent(const HciLinkKeyNotificationEventParam * eventParam)1507 void GapOnLinkKeyNotificationEvent(const HciLinkKeyNotificationEventParam *eventParam)
1508 {
1509 LOG_DEBUG("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1510 BtAddr addr;
1511
1512 GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1513
1514 ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
1515 DeviceInfo *devInfo = NULL;
1516 devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)&addr);
1517 if (devInfo != NULL) {
1518 devInfo->linkkeyType = eventParam->keyType;
1519 }
1520
1521 if (g_authenticationCallback.callback.linkKeyNotification) {
1522 g_authenticationCallback.callback.linkKeyNotification(
1523 &addr, (uint8_t *)eventParam->linkKey, eventParam->keyType, g_authenticationCallback.context);
1524 }
1525 }
1526
GapOnLinkKeyRequestEvent(const HciLinkKeyRequestEventParam * eventParam)1527 void GapOnLinkKeyRequestEvent(const HciLinkKeyRequestEventParam *eventParam)
1528 {
1529 LOG_DEBUG("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1530 BtAddr addr;
1531 bool callback = true;
1532
1533 GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1534
1535 ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
1536 DeviceInfo *devInfo = NULL;
1537 devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)&addr);
1538 if (devInfo != NULL && devInfo->authenticationStatus == GAP_AUTH_STATUS_RETRY) {
1539 callback = false;
1540 devInfo->authenticationStatus = GAP_AUTH_STATUS_ACTION;
1541 } else if (devInfo != NULL && devInfo->linkkeyType != GAP_LINK_KEY_TYPE_UNKNOWN &&
1542 !GapDeviceLinkkeyIsAuthenticated(devInfo) && devInfo->actionReq != NULL &&
1543 devInfo->actionReq->needAuthentication && devInfo->actionReq->needMITM) {
1544 callback = false;
1545 }
1546
1547 if (g_authenticationCallback.callback.linkKeyReq) {
1548 if (callback) {
1549 g_authenticationCallback.callback.linkKeyReq(&addr, g_authenticationCallback.context);
1550 } else {
1551 GapLinkKeyRequestNegativeReply(&addr);
1552 }
1553 } else {
1554 GapLinkKeyRequestNegativeReply(&addr);
1555 }
1556 }
1557
GapLinkKeyRequestReplyComplete(const HciLinkKeyRequestReplyReturnParam * param)1558 void GapLinkKeyRequestReplyComplete(const HciLinkKeyRequestReplyReturnParam *param)
1559 {
1560 if (param->status != HCI_SUCCESS) {
1561 BtAddr addr;
1562 GapChangeHCIAddr(&addr, ¶m->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1563 LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr), param->status);
1564 GapLinkKeyRequestNegativeReply(&addr);
1565 }
1566 }
1567
GapLinkKeyRequestNegativeReplyComplete(const HciLinkKeyRequestNegativeReplyReturnParam * param)1568 void GapLinkKeyRequestNegativeReplyComplete(const HciLinkKeyRequestNegativeReplyReturnParam *param)
1569 {
1570 if (param->status != HCI_SUCCESS) {
1571 LOG_WARN("%{public}s:" BT_ADDR_FMT "Failed:%02x", __FUNCTION__, BT_ADDR_FMT_OUTPUT(param->bdAddr.raw), param->status);
1572 }
1573 }
1574
GAP_LinkKeyRsp(const BtAddr * addr,uint8_t accept,const uint8_t linkKey[GAP_LINKKEY_SIZE],uint8_t keyType)1575 int GAP_LinkKeyRsp(const BtAddr *addr, uint8_t accept, const uint8_t linkKey[GAP_LINKKEY_SIZE], uint8_t keyType)
1576 {
1577 int ret;
1578
1579 if (GapIsBredrEnable() == false) {
1580 return GAP_ERR_NOT_ENABLE;
1581 }
1582
1583 if (addr == NULL || linkKey == NULL) {
1584 return GAP_ERR_INVAL_PARAM;
1585 }
1586
1587 LOG_INFO("%{public}s:" BT_ADDR_FMT " %hhu, keyType[%hhu]", __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr->addr), accept, keyType);
1588
1589 if (accept == GAP_ACCEPT) {
1590 ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
1591 DeviceInfo *devInfo = NULL;
1592 devInfo = ListForEachData(connectionInfoBlock->devicelist, GapFindConnectionDeviceByAddr, (void *)addr);
1593 if (devInfo != NULL) {
1594 devInfo->linkkeyType = keyType;
1595 }
1596 ret = GapLinkKeyRequestReply(addr, linkKey);
1597 } else if (accept == GAP_NOT_ACCEPT) {
1598 ret = GapLinkKeyRequestNegativeReply(addr);
1599 } else {
1600 ret = GAP_ERR_INVAL_PARAM;
1601 }
1602
1603 return ret;
1604 }
1605
GapOnSimplePairingComplete(const HciSimplePairingCompleteEventParam * eventParam)1606 void GapOnSimplePairingComplete(const HciSimplePairingCompleteEventParam *eventParam)
1607 {
1608 LOG_INFO("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(eventParam->bdAddr.raw));
1609 BtAddr addr;
1610
1611 GapChangeHCIAddr(&addr, &eventParam->bdAddr, BT_PUBLIC_DEVICE_ADDRESS);
1612
1613 if (g_authenticationCallback.callback.simplePairComplete) {
1614 g_authenticationCallback.callback.simplePairComplete(
1615 &addr, eventParam->status, g_authenticationCallback.context);
1616 }
1617 }
1618
GapOnEncryptionChangeEvent(const HciEncryptionChangeEventParam * eventParam)1619 void GapOnEncryptionChangeEvent(const HciEncryptionChangeEventParam *eventParam)
1620 {
1621 BtAddr addr = {0};
1622 GapEncryptionChangeCallback callback = NULL;
1623 void *context = NULL;
1624
1625 ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
1626 DeviceInfo *devInfo = NULL;
1627 devInfo = ListForEachData(
1628 connectionInfoBlock->devicelist, GapFindConnectionDeviceByHandle, (void *)&eventParam->connectionHandle);
1629 if (devInfo != NULL) {
1630 devInfo->encryptionStatus = GAP_ENC_STATUS_IDLE;
1631 (void)memcpy_s(&addr, sizeof(BtAddr), &devInfo->addr, sizeof(BtAddr));
1632 if (eventParam->status == HCI_SUCCESS) {
1633 if (eventParam->encryptionEnabled) {
1634 devInfo->isEncryption = true;
1635 } else {
1636 devInfo->isEncryption = false;
1637 }
1638 GapUpdateSecurityRequest(devInfo, GAP_SEC_EVENT_ENC_SUCCESS, eventParam->status);
1639 } else {
1640 GapUpdateSecurityRequest(devInfo, GAP_SEC_EVENT_ENC_FAILED, eventParam->status);
1641 }
1642 devInfo->actionReq = NULL;
1643 if (devInfo->status == GAP_DEV_SEC_STATUS_ACTION) {
1644 devInfo->status = GAP_DEV_SEC_STATUS_WAIT_DISC;
1645 }
1646 }
1647
1648 GapRequestSecurityProcess();
1649
1650 EncryptionBlock *encryptionBlock = GapGetEncryptionBlock();
1651 if (encryptionBlock->status == GAP_SET_ENCRYPTION_STATUS_SETTING) {
1652 callback = encryptionBlock->callback;
1653 context = encryptionBlock->context;
1654 }
1655
1656 LOG_DEBUG("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr));
1657
1658 if (devInfo != NULL) {
1659 if (g_authenticationCallback.callback.encryptionChangeCallback) {
1660 g_authenticationCallback.callback.encryptionChangeCallback(&addr,
1661 eventParam->encryptionEnabled ? GAP_ENCRYPTION_ON : GAP_ENCRYPTION_OFF,
1662 g_authenticationCallback.context);
1663 }
1664 if (callback) {
1665 callback(&addr, eventParam->encryptionEnabled ? GAP_ENCRYPTION_ON : GAP_ENCRYPTION_OFF, context);
1666 }
1667 }
1668
1669 GapLeEncryptionComplete(eventParam->connectionHandle, eventParam->status);
1670 }
1671
GapOnEncryptionKeyRefreshComplete(const HciEncryptionKeyRefreshCompleteEventParam * eventParam)1672 void GapOnEncryptionKeyRefreshComplete(const HciEncryptionKeyRefreshCompleteEventParam *eventParam)
1673 {
1674 BtAddr addr = {0};
1675
1676 ConnectionInfoBlock *connectionInfoBlock = GapGetConnectionInfoBlock();
1677 DeviceInfo *devInfo = NULL;
1678 devInfo = ListForEachData(
1679 connectionInfoBlock->devicelist, GapFindConnectionDeviceByHandle, (void *)&eventParam->connectionHandle);
1680 if (devInfo != NULL) {
1681 devInfo->encryptionStatus = GAP_ENC_STATUS_IDLE;
1682 (void)memcpy_s(&addr, sizeof(BtAddr), &devInfo->addr, sizeof(BtAddr));
1683 if (eventParam->status == HCI_SUCCESS) {
1684 GapUpdateSecurityRequest(devInfo, GAP_SEC_EVENT_ENC_SUCCESS, eventParam->status);
1685 } else {
1686 GapUpdateSecurityRequest(devInfo, GAP_SEC_EVENT_ENC_FAILED, eventParam->status);
1687 }
1688 devInfo->actionReq = NULL;
1689 if (devInfo->status == GAP_DEV_SEC_STATUS_ACTION) {
1690 devInfo->status = GAP_DEV_SEC_STATUS_WAIT_DISC;
1691 }
1692 }
1693 GapRequestSecurityProcess();
1694 LOG_DEBUG("%{public}s:" BT_ADDR_FMT, __FUNCTION__, BT_ADDR_FMT_OUTPUT(addr.addr));
1695 }
1696
GapSetConnectionEncryption(uint16_t handle,uint8_t encryptionEnable)1697 static int GapSetConnectionEncryption(uint16_t handle, uint8_t encryptionEnable)
1698 {
1699 HciSetConnectionEncryptionParam hciCmdParam = {
1700 .connectionHandle = handle,
1701 .encryptionEnable = encryptionEnable,
1702 };
1703
1704 return HCI_SetConnectionEncryption(&hciCmdParam);
1705 }