* Copyright (C) 2021 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "smp_receive.h"
#include <string.h>
#include "btm/btm_thread.h"
#include "log.h"
#include "platform/include/allocator.h"
#include "smp.h"
#include "smp_cmd.h"
#include "smp_common.h"
#include "smp_def.h"
#include "smp_legacy.h"
#include "smp_oob.h"
#include "smp_sc_accepter.h"
#include "smp_sc_initiator.h"
#include "smp_send.h"
#include "smp_tool.h"
static void SMP_ReceivePairingRequest(uint16_t handle, const Buffer *buffer);
static void SMP_ReceivePairingResponse(uint16_t handle, const Buffer *buffer);
static void SMP_ReceivePairingConfirm(uint16_t handle, const Buffer *buffer);
static void SMP_ReceivePairingRandom(uint16_t handle, const Buffer *buffer);
static void SMP_ReceiveEncryptionInformation(uint16_t handle, const Buffer *buffer);
static void SMP_ReceiveMasterIdentification(uint16_t handle, const Buffer *buffer);
static void SMP_ReceiveIdentityInformation(uint16_t handle, const Buffer *buffer);
static void SMP_ReceiveIdentityAddressInformation(uint16_t handle, const Buffer *buffer);
static void SMP_ReceiveSigningInformation(uint16_t handle, const Buffer *buffer);
static void SMP_ReceivePairingFailed(uint16_t handle, const Buffer *buffer);
static void SMP_ReceiveSecurityRequest(uint16_t handle, const Buffer *buffer);
static void SMP_ReceivePairingPublicKey(uint16_t handle, const Buffer *buffer);
static void SMP_ReceivePairingDHKeyCheck(uint16_t handle, const Buffer *buffer);
static void SMP_RecvEncInfoProcessMaster(const Buffer *buffer);
static void SMP_RecvEncInfoProcessSlave(const Buffer *buffer);
static void SMP_RecvMasterIdentProcessMaster(const Buffer *buffer);
static void SMP_RecvMasterIdentProcessSlave(const Buffer *buffer);
static void SMP_RecvIdentInfoProcessMaster(const Buffer *buffer);
static void SMP_RecvIdentInfoProcessSlave(const Buffer *buffer);
static void SMP_RecvIdentAddrInfoProcessMaster(const Buffer *buffer);
static void SMP_RecvIdentAddrInfoProcessSlave(const Buffer *buffer);
static void SMP_RecvSignInfoProcessMaster(const Buffer *buffer);
static void SMP_RecvSignInfoProcessSlave(const Buffer *buffer);
static void SMP_RecvDataCmdDistribution(uint16_t handle, uint8_t code, const Buffer *buffer);
static int SMP_RecvPairReqJudgeException(uint16_t handle, const SMP_PairParam *pairParam);
static int SMP_RecvPairRspJudgeException(uint16_t handle, const SMP_PairParam *pairParam);
static void SMP_RecvPairCfmStepDistribution(uint16_t step, const SMP_StepParam *param);
static void SMP_RecvPairRandStepDistribution(uint16_t step, const SMP_StepParam *param);
static void SMP_RecvPairPubKeyStepDistribution(uint16_t step, const SMP_StepParam *param);
static void SMP_RecvDataTask(void *context);
static void SMP_DisconnectedTask(void *context);
void SMP_ReceiveData(uint16_t handle, const Packet *pkt)
{
LOG_INFO("%{public}s", __FUNCTION__);
Packet *pktPtr = PacketRefMalloc(pkt);
SMP_RecvDataTask_t *ctx = MEM_MALLOC.alloc(sizeof(SMP_RecvDataTask_t));
if (ctx == NULL) {
LOG_ERROR("%{public}s: Alloc error.", __FUNCTION__);
return;
}
(void)memset_s(ctx, sizeof(SMP_RecvDataTask_t), 0x00, sizeof(SMP_RecvDataTask_t));
ctx->handle = handle;
ctx->pkt = pktPtr;
int ret = BTM_RunTaskInProcessingQueue(PROCESSING_QUEUE_ID_SMP, SMP_RecvDataTask, (void *)ctx);
if (ret != SMP_SUCCESS) {
PacketFree(ctx->pkt);
MEM_MALLOC.free(ctx);
return;
}
}
static void SMP_RecvDataTask(void *context)
{
uint8_t code = 0x00;
Buffer *buffer = NULL;
SMP_RecvDataTask_t *param = (SMP_RecvDataTask_t *)context;
LOG_DEBUG("%{public}s", __FUNCTION__);
PacketExtractHead(param->pkt, &code, sizeof(code));
buffer = PacketContinuousPayload(param->pkt);
SMP_RecvDataCmdDistribution(param->handle, code, buffer);
PacketFree(param->pkt);
MEM_MALLOC.free(param);
}
void SMP_Connected(const BtAddr *addr, uint16_t handle, uint8_t role, uint8_t status)
{
LOG_INFO("%{public}s", __FUNCTION__);
(void)addr;
(void)handle;
(void)role;
(void)status;
}
void SMP_Disconnected(uint16_t handle, uint8_t role, uint8_t reason)
{
LOG_INFO("%{public}s", __FUNCTION__);
SMP_DisconnectedTask_t *ctx = MEM_MALLOC.alloc(sizeof(SMP_DisconnectedTask_t));
if (ctx == NULL) {
LOG_ERROR("%{public}s: Alloc error.", __FUNCTION__);
return;
}
(void)memset_s(ctx, sizeof(SMP_DisconnectedTask_t), 0x00, sizeof(SMP_DisconnectedTask_t));
ctx->handle = handle;
int ret = BTM_RunTaskInProcessingQueue(PROCESSING_QUEUE_ID_SMP, SMP_DisconnectedTask, (void *)ctx);
if (ret != SMP_SUCCESS) {
MEM_MALLOC.free(ctx);
return;
}
(void)role;
(void)reason;
}
static void SMP_DisconnectedTask(void *context)
{
SMP_DisconnectedTask_t *param = (SMP_DisconnectedTask_t *)context;
LOG_DEBUG("%{public}s", __FUNCTION__);
if ((SMP_GetPairMng()->state == SMP_STATE_PAIRING) && (SMP_GetPairMng()->handle == param->handle)) {
SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, 0x00, SMP_GetPairMng()->alarm);
MEM_MALLOC.free(param);
return;
}
MEM_MALLOC.free(param);
}
static void SMP_RecvDataCmdDistribution(uint16_t handle, uint8_t code, const Buffer *buffer)
{
switch (code) {
case SMP_CODE_PAIRING_REQ:
SMP_ReceivePairingRequest(handle, buffer);
break;
case SMP_CODE_PAIRING_RSP:
SMP_ReceivePairingResponse(handle, buffer);
break;
case SMP_CODE_PAIRING_CFM:
SMP_ReceivePairingConfirm(handle, buffer);
break;
case SMP_CODE_PAIRING_RAND:
SMP_ReceivePairingRandom(handle, buffer);
break;
case SMP_CODE_ENCRYPTION_INFO:
SMP_ReceiveEncryptionInformation(handle, buffer);
break;
case SMP_CODE_MASTER_IDENTITY:
SMP_ReceiveMasterIdentification(handle, buffer);
break;
case SMP_CODE_IDENTITY_INFO:
SMP_ReceiveIdentityInformation(handle, buffer);
break;
case SMP_CODE_IDENTITY_ADDR_INFO:
SMP_ReceiveIdentityAddressInformation(handle, buffer);
break;
case SMP_CODE_SIGNING_INFO:
SMP_ReceiveSigningInformation(handle, buffer);
break;
case SMP_CODE_PAIRING_FAIL:
SMP_ReceivePairingFailed(handle, buffer);
break;
case SMP_CODE_SECURITY_REQ:
SMP_ReceiveSecurityRequest(handle, buffer);
break;
case SMP_CODE_PAIRING_PUBLIC_KEY:
SMP_ReceivePairingPublicKey(handle, buffer);
break;
case SMP_CODE_PAIRING_DHKEY_CHECK:
SMP_ReceivePairingDHKeyCheck(handle, buffer);
break;
default:
break;
}
}
static void SMP_ReceivePairingRequest(uint16_t handle, const Buffer *buffer)
{
uint8_t *pData = NULL;
SMP_PairParam pairParamTemp;
LOG_INFO("%{public}s", __FUNCTION__);
pData = (uint8_t *)BufferPtr(buffer);
int offset = 0;
pairParamTemp.ioCapability = pData[offset];
offset += sizeof(pairParamTemp.ioCapability);
pairParamTemp.oobDataFlag = pData[offset];
offset += sizeof(pairParamTemp.oobDataFlag);
pairParamTemp.authReq = pData[offset];
offset += sizeof(pairParamTemp.authReq);
pairParamTemp.maxEncKeySize = pData[offset];
offset += sizeof(pairParamTemp.maxEncKeySize);
pairParamTemp.initKeyDist = pData[offset];
offset += sizeof(pairParamTemp.initKeyDist);
pairParamTemp.respKeyDist = pData[offset];
if (SMP_RecvPairReqJudgeException(handle, &pairParamTemp)) {
return;
}
(void)memset_s(SMP_GetPairMng(), sizeof(SMP_PairMng), 0x00, sizeof(SMP_PairMng));
SMP_GetPairMng()->state = SMP_STATE_PAIRING;
SMP_GetPairMng()->handle = handle;
SMP_GetPairMng()->role = SMP_ROLE_SLAVE;
SMP_GetPairMng()->alarm = AlarmCreate("", false);
(void)memcpy_s(&SMP_GetPairMng()->peer.pairParam, sizeof(SMP_PairParam), &pairParamTemp, sizeof(SMP_PairParam));
SMP_GetPairMng()->step = SMP_LEGACY_PAIR_SLAVE_STEP_1;
LOG_INFO("SMP_LEGACY_PAIR_SLAVE_STEP_1 started.");
AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
SMP_NotifyCbPairReq(handle, &pairParamTemp);
}
static int SMP_RecvPairReqJudgeException(uint16_t handle, const SMP_PairParam *pairParam)
{
int ret = SMP_SUCCESS;
uint8_t reason = 0x00;
if ((SMP_GetPairMng()->state == SMP_STATE_PAIRING) ||
(SMP_GetScOobMng()->state == SMP_STATE_SC_OOB_DATA_GENERATING)) {
LOG_ERROR("It's already pairing state or SC OOB data generating state.");
if (handle == SMP_GetPairMng()->handle) {
SMP_SendPairingFailed(handle, SMP_PAIR_FAILED_REPAETED_ATTEMPTS, SMP_SendPairingFailedCallback);
} else {
SMP_SendPairingFailed(handle, SMP_PAIR_FAILED_PAIRING_NOT_SUPPORTED, SMP_SendPairingFailedCallback);
}
ret = SMP_ERR_INVAL_STATE;
return ret;
}
if (SMP_CheckRemotePairParam(pairParam, &reason)) {
LOG_ERROR("Check Remote Pair Param failed.");
SMP_SendPairingFailed(handle, reason, SMP_SendPairingFailedCallback);
ret = SMP_ERR_INVAL_PARAM;
return ret;
}
if (SMP_GetSecureConnOnlyMode() && (!(pairParam->authReq & SMP_AUTH_REQ_BIT_SC))) {
LOG_ERROR("SC bit is not set in authReq.");
SMP_SendPairingFailed(handle, SMP_PAIR_FAILED_AUTH_REQ, SMP_SendPairingFailedCallback);
ret = SMP_ERR_INVAL_STATE;
return ret;
}
return ret;
}
static void SMP_ReceivePairingResponse(uint16_t handle, const Buffer *buffer)
{
SMP_PairParam pairParamTemp;
LOG_INFO("%{public}s", __FUNCTION__);
if (memcpy_s(&pairParamTemp, sizeof(SMP_PairParam), (uint8_t *)BufferPtr(buffer), sizeof(SMP_PairParam)) != EOK) {
LOG_ERROR("[%{public}s][%{public}d] pairParamTemp memcpy_s fail.", __FUNCTION__, __LINE__);
return;
}
if (SMP_RecvPairRspJudgeException(handle, &pairParamTemp)) {
return;
}
AlarmCancel(SMP_GetPairMng()->alarm);
if (memcpy_s(&SMP_GetPairMng()->peer.pairParam,
sizeof(SMP_PairParam), (uint8_t *)BufferPtr(buffer), sizeof(SMP_PairParam)) != EOK) {
LOG_ERROR("[%{public}s][%{public}d] peer.pairParam memcpy_s fail.", __FUNCTION__, __LINE__);
return;
}
AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
SMP_NotifyCbPairRsp(handle, &pairParamTemp);
}
static int SMP_RecvPairRspJudgeException(uint16_t handle, const SMP_PairParam *pairParam)
{
int ret = SMP_SUCCESS;
uint8_t reason = 0x00;
if (SMP_GetPairMng()->state != SMP_STATE_PAIRING) {
LOG_ERROR("It's not pairing state.");
ret = SMP_ERR_INVAL_STATE;
return ret;
}
if (SMP_GetPairMng()->handle != handle) {
LOG_ERROR("Connection handle error.");
ret = SMP_ERR_INVAL_PARAM;
return ret;
}
if (SMP_GetPairMng()->role != SMP_ROLE_MASTER) {
LOG_INFO("It's not initiator role.");
ret = SMP_ERR_INVAL_STATE;
return ret;
}
if (SMP_GetPairMng()->step != SMP_LEGACY_PAIR_MASTER_STEP_1) {
LOG_INFO("It's not SMP_LEGACY_PAIR_MASTER_STEP_1.");
SMP_GeneratePairResult(handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
ret = SMP_ERR_INVAL_STATE;
return ret;
}
if (SMP_CheckRemotePairParam(pairParam, &reason)) {
LOG_ERROR("Check Remote Pair Param failed.");
SMP_GeneratePairResult(handle, SMP_PAIR_STATUS_FAILED, reason, SMP_GetPairMng()->alarm);
ret = SMP_ERR_INVAL_PARAM;
return ret;
}
if (SMP_GetSecureConnOnlyMode() && (!(pairParam->authReq & SMP_AUTH_REQ_BIT_SC))) {
LOG_ERROR("SC bit is not set in authReq.");
SMP_GeneratePairResult(handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_AUTH_REQ, SMP_GetPairMng()->alarm);
ret = SMP_ERR_INVAL_STATE;
return ret;
}
return ret;
}
static void SMP_ReceivePairingConfirm(uint16_t handle, const Buffer *buffer)
{
SMP_StepParam param = {.data = (void *)BufferPtr(buffer)};
LOG_INFO("%{public}s", __FUNCTION__);
if (SMP_GetPairMng()->state != SMP_STATE_PAIRING) {
LOG_ERROR("It's Not Pairing State");
return;
}
if (SMP_GetPairMng()->handle != handle) {
LOG_ERROR("Connection Handle Error");
return;
}
SMP_RecvPairCfmStepDistribution(SMP_GetPairMng()->step, ¶m);
}
static void SMP_RecvPairCfmStepDistribution(uint16_t step, const SMP_StepParam *param)
{
switch (step) {
case SMP_LEGACY_PAIR_MASTER_STEP_6:
SMP_LegacyPairMasterStep6(param);
break;
case SMP_LEGACY_PAIR_SLAVE_STEP_1:
case SMP_LEGACY_PAIR_SLAVE_STEP_2:
SMP_LegacyPairSlaveStep2(param);
break;
case SMP_LEGACY_PAIR_SLAVE_STEP_3:
SMP_LegacyPairSlaveStep3(param);
break;
case SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_3:
SMP_ScPairJustworkOrNumericMasterStep3(param);
break;
case SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_4:
SMP_ScPairJustworkOrNumericMasterStep4(param);
break;
case SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_11:
SMP_ScPairPasskeyEntryMasterStep11(param);
break;
case SMP_SC_PAIR_PASSKEYENTRY_SLAVE_STEP_5:
SMP_ScPairPasskeyEntrySlaveStep5(param);
break;
case SMP_SC_PAIR_PASSKEYENTRY_SLAVE_STEP_6:
SMP_ScPairPasskeyEntrySlaveStep6(param);
break;
default:
LOG_ERROR("It's invalid step:%hu.", step);
SMP_GeneratePairResult(
SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
break;
}
}
static void SMP_ReceivePairingRandom(uint16_t handle, const Buffer *buffer)
{
SMP_StepParam param = {.data = (void *)BufferPtr(buffer)};
LOG_INFO("%{public}s", __FUNCTION__);
if (SMP_GetPairMng()->state != SMP_STATE_PAIRING) {
LOG_ERROR("It is not pairing state.");
return;
}
if (SMP_GetPairMng()->handle != handle) {
LOG_ERROR("Connection handle is error.");
return;
}
AlarmCancel(SMP_GetPairMng()->alarm);
SMP_RecvPairRandStepDistribution(SMP_GetPairMng()->step, ¶m);
}
static void SMP_RecvPairRandStepDistribution(uint16_t step, const SMP_StepParam *param)
{
switch (step) {
case SMP_LEGACY_PAIR_MASTER_STEP_7:
SMP_LegacyPairMasterStep7(param);
break;
case SMP_LEGACY_PAIR_SLAVE_STEP_8:
SMP_LegacyPairSlaveStep8(param);
break;
case SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_7:
SMP_ScPairJustworkOrNumericMasterStep7(param);
break;
case SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_12:
SMP_ScPairPasskeyEntryMasterStep12(param);
break;
case SMP_SC_PAIR_OOB_MASTER_STEP_15:
SMP_ScPairOobMasterStep15(param);
break;
case SMP_SC_PAIR_JUSTWORKORNUMERIC_SLAVE_STEP_9:
SMP_ScPairJustworkOrNumericSlaveStep9(param);
break;
case SMP_SC_PAIR_PASSKEYENTRY_SLAVE_STEP_12:
SMP_ScPairPasskeyEntrySlaveStep12(param);
break;
case SMP_SC_PAIR_OOB_SLAVE_STEP_13:
SMP_ScPairOobSlaveStep13(param);
break;
default:
LOG_ERROR("It's invalid step:%hu.", step);
SMP_GeneratePairResult(
SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
break;
}
}
static void SMP_ReceiveEncryptionInformation(uint16_t handle, const Buffer *buffer)
{
LOG_INFO("%{public}s", __FUNCTION__);
if (SMP_GetPairMng()->state != SMP_STATE_PAIRING) {
LOG_ERROR("It's not pairing state");
return;
}
if (SMP_GetPairMng()->handle != handle) {
LOG_ERROR("Connection handle error");
return;
}
if (SMP_GetPairMng()->role == SMP_ROLE_MASTER) {
LOG_INFO("It's initiator role");
SMP_RecvEncInfoProcessMaster(buffer);
} else {
LOG_INFO("It's accepter role.");
SMP_RecvEncInfoProcessSlave(buffer);
}
}
static void SMP_ReceiveMasterIdentification(uint16_t handle, const Buffer *buffer)
{
LOG_INFO("%{public}s", __FUNCTION__);
if (SMP_GetPairMng()->state != SMP_STATE_PAIRING) {
LOG_ERROR("It's Not pairing state");
return;
}
if (SMP_GetPairMng()->handle != handle) {
LOG_ERROR("Connection Handle error");
return;
}
if (SMP_GetPairMng()->role == SMP_ROLE_MASTER) {
LOG_INFO("It's initiator role");
SMP_RecvMasterIdentProcessMaster(buffer);
} else {
LOG_INFO("It's accepter role.");
SMP_RecvMasterIdentProcessSlave(buffer);
}
}
static void SMP_ReceiveIdentityInformation(uint16_t handle, const Buffer *buffer)
{
LOG_INFO("%{public}s", __FUNCTION__);
if (SMP_GetPairMng()->state != SMP_STATE_PAIRING) {
LOG_ERROR("It's Not pairing state.");
return;
}
if (SMP_GetPairMng()->handle != handle) {
LOG_ERROR("Connection Handle error.");
return;
}
if (SMP_GetPairMng()->role == SMP_ROLE_MASTER) {
LOG_INFO("It's initiator role.");
SMP_RecvIdentInfoProcessMaster(buffer);
} else {
LOG_INFO("It's accepter role.");
SMP_RecvIdentInfoProcessSlave(buffer);
}
}
static void SMP_ReceiveIdentityAddressInformation(uint16_t handle, const Buffer *buffer)
{
LOG_INFO("%{public}s", __FUNCTION__);
if (SMP_GetPairMng()->state != SMP_STATE_PAIRING) {
LOG_ERROR("It's not pairing state!");
return;
}
if (SMP_GetPairMng()->handle != handle) {
LOG_ERROR("Connection handle error!");
return;
}
if (SMP_GetPairMng()->role == SMP_ROLE_MASTER) {
LOG_INFO("It's initiator role!");
SMP_RecvIdentAddrInfoProcessMaster(buffer);
} else {
LOG_INFO("It's accepter role.");
SMP_RecvIdentAddrInfoProcessSlave(buffer);
}
}
static void SMP_ReceiveSigningInformation(uint16_t handle, const Buffer *buffer)
{
LOG_INFO("%{public}s", __FUNCTION__);
if (SMP_GetPairMng()->state != SMP_STATE_PAIRING) {
LOG_ERROR("It's not pairing state.");
return;
}
if (SMP_GetPairMng()->handle != handle) {
LOG_ERROR("Connection handle error.");
return;
}
if (SMP_GetPairMng()->role == SMP_ROLE_MASTER) {
LOG_INFO("It's initiator role.");
SMP_RecvSignInfoProcessMaster(buffer);
} else {
LOG_INFO("It's accepter role.");
SMP_RecvSignInfoProcessSlave(buffer);
}
}
static void SMP_ReceivePairingFailed(uint16_t handle, const Buffer *buffer)
{
uint8_t reason = *((uint8_t *)BufferPtr(buffer));
LOG_INFO("%{public}s", __FUNCTION__);
if (SMP_GetPairMng()->state != SMP_STATE_PAIRING) {
LOG_ERROR("It Is Not Pairing State!");
return;
}
if (SMP_GetPairMng()->handle != handle) {
LOG_ERROR("Connection Handle Is Error!");
return;
}
if (SMP_GetPairMng()->role == SMP_ROLE_MASTER) {
LOG_ERROR("Initiator, step :%hu.", SMP_GetPairMng()->step);
} else {
LOG_ERROR("Accepter, step :%hu.", SMP_GetPairMng()->step);
}
if (reason != SMP_PAIR_FAILED_REPAETED_ATTEMPTS) {
SMP_GeneratePairResult(handle, SMP_PAIR_STATUS_FAILED, 0x00, NULL);
}
}
static void SMP_ReceiveSecurityRequest(uint16_t handle, const Buffer *buffer)
{
uint8_t authReq = *((uint8_t *)BufferPtr(buffer));
LOG_INFO("%{public}s", __FUNCTION__);
if ((SMP_GetPairMng()->state == SMP_STATE_PAIRING) && (SMP_GetPairMng()->handle == handle)) {
return;
}
if (SMP_GetSecureConnOnlyMode() && (!(authReq & SMP_AUTH_REQ_BIT_SC))) {
LOG_ERROR("SC bit is not set in authReq.");
SMP_SendPairingFailed(handle, SMP_PAIR_FAILED_AUTH_REQ, SMP_SendPairingFailedCallback);
return;
}
SMP_NotifyCbSecReq(handle, authReq);
}
static void SMP_ReceivePairingPublicKey(uint16_t handle, const Buffer *buffer)
{
SMP_StepParam param = {.data = (void *)BufferPtr(buffer)};
LOG_INFO("%{public}s", __FUNCTION__);
if (SMP_GetPairMng()->state != SMP_STATE_PAIRING) {
LOG_ERROR("It is Not Pairing state!");
return;
}
if (SMP_GetPairMng()->handle != handle) {
LOG_ERROR("Connection Handle is error!");
return;
}
SMP_RecvPairPubKeyStepDistribution(SMP_GetPairMng()->step, ¶m);
}
static void SMP_RecvPairPubKeyStepDistribution(uint16_t step, const SMP_StepParam *param)
{
switch (step) {
case SMP_SC_PAIR_JUSTWORKORNUMERIC_MASTER_STEP_2:
SMP_ScPairJustworkOrNumericMasterStep2(param);
break;
case SMP_SC_PAIR_PASSKEYENTRY_MASTER_STEP_2:
SMP_ScPairPasskeyEntryMasterStep2(param);
break;
case SMP_SC_PAIR_JUSTWORKORNUMERIC_SLAVE_STEP_1:
SMP_ScPairJustworkOrNumericSlaveStep1(param);
break;
case SMP_SC_PAIR_PASSKEYENTRY_SLAVE_STEP_1:
SMP_ScPairPasskeyEntrySlaveStep1(param);
break;
case SMP_SC_PAIR_OOB_MASTER_STEP_8:
SMP_ScPairOobMasterStep8(param);
break;
case SMP_SC_PAIR_OOB_SLAVE_STEP_7:
SMP_ScPairOobSlaveStep7(param);
break;
case SMP_SC_PAIR_OOB_SLAVE_STEP_8:
SMP_ScPairOobSlaveStep8(param);
break;
default:
LOG_ERROR("It's invalid step:%hu.", step);
SMP_GeneratePairResult(
SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
break;
}
}
static void SMP_ReceivePairingDHKeyCheck(uint16_t handle, const Buffer *buffer)
{
SMP_StepParam param = {.data = (void *)BufferPtr(buffer)};
LOG_INFO("%{public}s", __FUNCTION__);
if (SMP_GetPairMng()->state != SMP_STATE_PAIRING) {
LOG_ERROR("It Is Not Pairing State");
return;
}
if (SMP_GetPairMng()->handle != handle) {
LOG_ERROR("Connection Handle Is Error");
return;
}
switch (SMP_GetPairMng()->step) {
case SMP_SC_PAIR_COMMON_MASTER_STEP_13:
SMP_ScPairCommonMasterStep13(¶m);
break;
case SMP_SC_PAIR_JUSTWORKORNUMERIC_SLAVE_STEP_13:
SMP_ScPairJustworkOrNumericSlaveStep13(¶m);
break;
case SMP_SC_PAIR_COMMON_SLAVE_STEP_1:
SMP_ScPairCommonSlaveStep1(¶m);
break;
default:
LOG_ERROR("It's invalid step:%hu.", SMP_GetPairMng()->step);
SMP_GeneratePairResult(handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
break;
}
}
static void SMP_RecvEncInfoProcessMaster(const Buffer *buffer)
{
LOG_INFO("%{public}s", __FUNCTION__);
if ((SMP_GetPairMng()->step != SMP_LEGACY_PAIR_MASTER_STEP_11) &&
(SMP_GetPairMng()->step != SMP_LEGACY_PAIR_MASTER_STEP_12)) {
LOG_ERROR("It's invalid step.");
return;
}
if (memcpy_s(SMP_GetPairMng()->peer.LTK, SMP_LTK_LEN, (uint8_t *)BufferPtr(buffer), SMP_LTK_LEN) != EOK) {
LOG_ERROR("[%{public}s][%{public}d] memcpy_s fail.", __FUNCTION__, __LINE__);
return;
}
SMP_GetPairMng()->peer.keyDistCmdFlag =
SMP_GetPairMng()->peer.keyDistCmdFlag & (~SMP_KEY_DIST_CMD_FLAG_BIT_ENC_INFO);
if ((SMP_GetPairMng()->peer.keyDistCmdFlag != 0x00) ||
(SMP_GetPairMng()->masterEncryptedFlag == SMP_MASTER_ENCRYPTED_FLAG_NO)) {
return;
}
LOG_INFO("g_smpPairMng.peer.keyDistCmdFlag is 0");
AlarmCancel(SMP_GetPairMng()->alarm);
if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ENC_KEY) {
LOG_INFO("Local need to send ENC_KEY");
LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_13 started");
int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_13);
if (ret != SMP_SUCCESS) {
SMP_GeneratePairResult(
SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
}
} else if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_SIGN_KEY) {
LOG_INFO("Local need to send SIGN_KEY");
LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_17 started");
int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_17);
if (ret != SMP_SUCCESS) {
SMP_GeneratePairResult(
SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
}
} else if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ID_KEY) {
LOG_INFO("Send keys to remote");
if (SMP_SendDistributionKeysToRemote()) {
SMP_GeneratePairResult(
SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
LOG_INFO("Pair failed.");
}
} else {
LOG_INFO("Pair success.");
SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_SUCCESS, 0x00, NULL);
}
}
static void SMP_RecvEncInfoProcessSlave(const Buffer *buffer)
{
LOG_INFO("%{public}s", __FUNCTION__);
if (SMP_GetPairMng()->step != SMP_LEGACY_PAIR_SLAVE_STEP_20) {
LOG_ERROR("It's not SMP_LEGACY_PAIR_SLAVE_STEP_20.");
return;
}
if (memcpy_s(SMP_GetPairMng()->peer.LTK, SMP_LTK_LEN, (uint8_t *)BufferPtr(buffer), SMP_LTK_LEN) != EOK) {
LOG_ERROR("[%{public}s][%{public}d] memcpy_s fail.", __FUNCTION__, __LINE__);
return;
}
SMP_GetPairMng()->peer.keyDistCmdFlag =
SMP_GetPairMng()->peer.keyDistCmdFlag & (~SMP_KEY_DIST_CMD_FLAG_BIT_ENC_INFO);
if (SMP_GetPairMng()->peer.keyDistCmdFlag == 0x00) {
LOG_INFO("g_smpPairMng.peer.keyDistCmdFlag is 0.");
AlarmCancel(SMP_GetPairMng()->alarm);
SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_SUCCESS, 0x00, NULL);
}
}
static void SMP_RecvMasterIdentProcessMaster(const Buffer *buffer)
{
uint8_t *pData = (uint8_t *)BufferPtr(buffer);
LOG_INFO("%{public}s", __FUNCTION__);
if ((SMP_GetPairMng()->step != SMP_LEGACY_PAIR_MASTER_STEP_11) &&
(SMP_GetPairMng()->step != SMP_LEGACY_PAIR_MASTER_STEP_12)) {
LOG_ERROR("It's invalid step.");
return;
}
SMP_GetPairMng()->peer.masterIdEdiv = *(uint16_t *)pData;
SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.masterIdRand, &(pData[0x02]), SMP_MASTER_RAND_LEN);
SMP_GetPairMng()->peer.keyDistCmdFlag =
SMP_GetPairMng()->peer.keyDistCmdFlag & (~SMP_KEY_DIST_CMD_FLAG_BIT_MASTER_IDENT);
if ((SMP_GetPairMng()->peer.keyDistCmdFlag != 0x00) ||
(SMP_GetPairMng()->masterEncryptedFlag == SMP_MASTER_ENCRYPTED_FLAG_NO)) {
return;
}
LOG_INFO("g_smpPairMng.peer.keyDistCmdFlag is 0!");
AlarmCancel(SMP_GetPairMng()->alarm);
if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ENC_KEY) {
LOG_INFO("Local need to send ENC_KEY!");
LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_13 started!");
int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_13);
if (ret != SMP_SUCCESS) {
SMP_GeneratePairResult(
SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
}
} else if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_SIGN_KEY) {
LOG_INFO("Local need to send SIGN_KEY!");
LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_17 started!");
int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_17);
if (ret != SMP_SUCCESS) {
SMP_GeneratePairResult(
SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
}
} else if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ID_KEY) {
LOG_INFO("Send Keys to remote.");
if (SMP_SendDistributionKeysToRemote()) {
SMP_GeneratePairResult(
SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
LOG_INFO("Pair is failed.");
}
} else {
SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_SUCCESS, 0x00, NULL);
}
}
static void SMP_RecvMasterIdentProcessSlave(const Buffer *buffer)
{
uint8_t *pData = NULL;
LOG_INFO("%{public}s", __FUNCTION__);
if (SMP_GetPairMng()->step != SMP_LEGACY_PAIR_SLAVE_STEP_20) {
LOG_ERROR("It's not SMP_LEGACY_PAIR_SLAVE_STEP_20.");
return;
}
pData = (uint8_t *)BufferPtr(buffer);
SMP_GetPairMng()->peer.masterIdEdiv = *(uint16_t *)pData;
SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.masterIdRand, &(pData[0x02]), SMP_MASTER_RAND_LEN);
SMP_GetPairMng()->peer.keyDistCmdFlag =
SMP_GetPairMng()->peer.keyDistCmdFlag & (~SMP_KEY_DIST_CMD_FLAG_BIT_MASTER_IDENT);
if (SMP_GetPairMng()->peer.keyDistCmdFlag == 0x00) {
LOG_INFO("g_smpPairMng.peer.keyDistCmdFlag is 0.");
AlarmCancel(SMP_GetPairMng()->alarm);
SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_SUCCESS, 0x00, NULL);
}
}
static void SMP_RecvIdentInfoProcessMaster(const Buffer *buffer)
{
int ret = SMP_SUCCESS;
LOG_INFO("%{public}s", __FUNCTION__);
if ((SMP_GetPairMng()->step != SMP_LEGACY_PAIR_MASTER_STEP_11) &&
(SMP_GetPairMng()->step != SMP_LEGACY_PAIR_MASTER_STEP_12) &&
(SMP_GetPairMng()->step != SMP_SC_PAIR_COMMON_MASTER_STEP_17) &&
(SMP_GetPairMng()->step != SMP_SC_PAIR_COMMON_MASTER_STEP_18)) {
LOG_ERROR("It's invalid step.");
return;
}
if (memcpy_s(SMP_GetPairMng()->peer.IRK, SMP_IRK_LEN, (uint8_t *)BufferPtr(buffer), SMP_IRK_LEN) != EOK) {
LOG_ERROR("[%{public}s][%{public}d] memcpy_s fail.", __FUNCTION__, __LINE__);
return;
}
SMP_GetPairMng()->peer.keyDistCmdFlag =
SMP_GetPairMng()->peer.keyDistCmdFlag & (~SMP_KEY_DIST_CMD_FLAG_BIT_IDENT_INFO);
if ((SMP_GetPairMng()->peer.keyDistCmdFlag != 0x00) ||
(SMP_GetPairMng()->masterEncryptedFlag == SMP_MASTER_ENCRYPTED_FLAG_NO)) {
return;
}
AlarmCancel(SMP_GetPairMng()->alarm);
LOG_INFO("g_smpPairMng.peer.keyDistCmdFlag is 0.");
if ((SMP_GetPairMng()->pairType == SMP_PAIR_TYPE_LEGACY) &&
(SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ENC_KEY)) {
LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_13 is started.");
LOG_INFO("Local is need to send ENC_KEY.");
ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_13);
} else if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_SIGN_KEY) {
LOG_INFO("Local is need to send SIGN_KEY.");
if (SMP_GetPairMng()->pairType == SMP_PAIR_TYPE_LEGACY) {
LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_17 is started.");
ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_17);
} else {
LOG_DEBUG("SMP_SC_PAIR_COMMON_MASTER_STEP_19 is started.");
ret = SMP_SendHciLeRandCmd(SMP_SC_PAIR_COMMON_MASTER_STEP_19);
}
} else if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ID_KEY) {
LOG_INFO("Send keys to Remote.");
ret = SMP_SendDistributionKeysToRemote();
} else {
SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_SUCCESS, 0x00, NULL);
LOG_INFO("Pair success!");
return;
}
if (ret != SMP_SUCCESS) {
SMP_GeneratePairResult(
SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
LOG_INFO("Pair failed!");
}
}
static void SMP_RecvIdentInfoProcessSlave(const Buffer *buffer)
{
LOG_INFO("%{public}s", __FUNCTION__);
if ((SMP_GetPairMng()->step != SMP_LEGACY_PAIR_SLAVE_STEP_20) &&
(SMP_GetPairMng()->step != SMP_SC_PAIR_COMMON_SLAVE_STEP_21)) {
LOG_ERROR("It's not SMP_LEGACY_PAIR_SLAVE_STEP_20");
LOG_ERROR("and It's not SMP_SC_PAIR_COMMON_SLAVE_STEP_21");
return;
}
if (memcpy_s(SMP_GetPairMng()->peer.IRK, SMP_IRK_LEN, (uint8_t *)BufferPtr(buffer), SMP_IRK_LEN) != EOK) {
LOG_ERROR("[%{public}s][%{public}d] memcpy_s fail.", __FUNCTION__, __LINE__);
return;
}
SMP_GetPairMng()->peer.keyDistCmdFlag =
SMP_GetPairMng()->peer.keyDistCmdFlag & (~SMP_KEY_DIST_CMD_FLAG_BIT_IDENT_INFO);
if (SMP_GetPairMng()->peer.keyDistCmdFlag == 0x00) {
LOG_INFO("g_smpPairMng.peer.keyDistCmdFlag is 0.");
AlarmCancel(SMP_GetPairMng()->alarm);
SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_SUCCESS, 0x00, NULL);
}
}
static void SMP_RecvIdentAddrInfoProcessMaster(const Buffer *buffer)
{
int ret = SMP_SUCCESS;
uint8_t *pData1 = (uint8_t *)BufferPtr(buffer);
LOG_INFO("%{public}s", __FUNCTION__);
if ((SMP_GetPairMng()->step != SMP_LEGACY_PAIR_MASTER_STEP_11) &&
(SMP_GetPairMng()->step != SMP_LEGACY_PAIR_MASTER_STEP_12) &&
(SMP_GetPairMng()->step != SMP_SC_PAIR_COMMON_MASTER_STEP_17) &&
(SMP_GetPairMng()->step != SMP_SC_PAIR_COMMON_MASTER_STEP_18)) {
LOG_ERROR("It's invalid step.");
return;
}
SMP_GetPairMng()->peer.identityAddr.type = pData1[0x00];
if (memcpy_s(SMP_GetPairMng()->peer.identityAddr.addr, BT_ADDRESS_SIZE, &(pData1[0x01]), BT_ADDRESS_SIZE) != EOK) {
LOG_ERROR("[%{public}s][%{public}d] memcpy_s fail.", __FUNCTION__, __LINE__);
return;
}
SMP_GetPairMng()->peer.keyDistCmdFlag =
SMP_GetPairMng()->peer.keyDistCmdFlag & (~SMP_KEY_DIST_CMD_FLAG_BIT_IDENT_ADDR);
if ((SMP_GetPairMng()->peer.keyDistCmdFlag != 0x00) ||
(SMP_GetPairMng()->masterEncryptedFlag == SMP_MASTER_ENCRYPTED_FLAG_NO)) {
return;
}
LOG_INFO("g_smpPairMng.peer.keyDistCmdFlag is 0");
AlarmCancel(SMP_GetPairMng()->alarm);
if ((SMP_GetPairMng()->pairType == SMP_PAIR_TYPE_LEGACY) &&
(SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ENC_KEY)) {
LOG_INFO("Local is need to send ENC_KEY!");
LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_13 is started!");
ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_13);
} else if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_SIGN_KEY) {
LOG_INFO("Local is need to send SIGN_KEY!");
if (SMP_GetPairMng()->pairType == SMP_PAIR_TYPE_LEGACY) {
LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_17 is started!");
ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_17);
} else {
LOG_DEBUG("SMP_SC_PAIR_COMMON_MASTER_STEP_19 is started!");
ret = SMP_SendHciLeRandCmd(SMP_SC_PAIR_COMMON_MASTER_STEP_19);
}
} else if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ID_KEY) {
LOG_INFO("Send Keys to Remote.");
ret = SMP_SendDistributionKeysToRemote();
} else {
SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_SUCCESS, 0x00, NULL);
LOG_INFO("Pair Success");
return;
}
if (ret != SMP_SUCCESS) {
SMP_GeneratePairResult(
SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
LOG_INFO("Pair Failed");
}
}
static void SMP_RecvIdentAddrInfoProcessSlave(const Buffer *buffer)
{
uint8_t *pData2 = NULL;
LOG_INFO("%{public}s", __FUNCTION__);
if ((SMP_GetPairMng()->step != SMP_LEGACY_PAIR_SLAVE_STEP_20) &&
(SMP_GetPairMng()->step != SMP_SC_PAIR_COMMON_SLAVE_STEP_21)) {
LOG_ERROR("It's not SMP_LEGACY_PAIR_SLAVE_STEP_20.");
LOG_ERROR("and It's not SMP_SC_PAIR_COMMON_SLAVE_STEP_21.");
return;
}
pData2 = (uint8_t *)BufferPtr(buffer);
SMP_GetPairMng()->peer.identityAddr.type = pData2[0x00];
if (memcpy_s(SMP_GetPairMng()->peer.identityAddr.addr,
sizeof(SMP_GetPairMng()->peer.identityAddr.addr),
&(pData2[0x01]),
sizeof(SMP_GetPairMng()->peer.identityAddr.addr)) != EOK) {
LOG_ERROR("[%{public}s][%{public}d] memcpy_s fail.", __FUNCTION__, __LINE__);
return;
}
SMP_GetPairMng()->peer.keyDistCmdFlag =
SMP_GetPairMng()->peer.keyDistCmdFlag & (~SMP_KEY_DIST_CMD_FLAG_BIT_IDENT_ADDR);
if (SMP_GetPairMng()->peer.keyDistCmdFlag == 0x00) {
AlarmCancel(SMP_GetPairMng()->alarm);
LOG_INFO("g_smpPairMng.peer.keyDistCmdFlag is 0.");
SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_SUCCESS, 0x00, NULL);
}
}
static void SMP_RecvSignInfoProcessMaster(const Buffer *buffer)
{
int ret = SMP_SUCCESS;
LOG_INFO("%{public}s", __FUNCTION__);
if ((SMP_GetPairMng()->step != SMP_LEGACY_PAIR_MASTER_STEP_11) &&
(SMP_GetPairMng()->step != SMP_LEGACY_PAIR_MASTER_STEP_12) &&
(SMP_GetPairMng()->step != SMP_SC_PAIR_COMMON_MASTER_STEP_17) &&
(SMP_GetPairMng()->step != SMP_SC_PAIR_COMMON_MASTER_STEP_18)) {
LOG_ERROR("It's invalid step.");
return;
}
if (memcpy_s(SMP_GetPairMng()->peer.CSRK, SMP_CSRK_LEN, (uint8_t *)BufferPtr(buffer), SMP_CSRK_LEN) != EOK) {
LOG_ERROR("[%{public}s][%{public}d] memcpy_s fail.", __FUNCTION__, __LINE__);
return;
}
SMP_GetPairMng()->peer.keyDistCmdFlag =
SMP_GetPairMng()->peer.keyDistCmdFlag & (~SMP_KEY_DIST_CMD_FLAG_BIT_SIGN_INFO);
if ((SMP_GetPairMng()->peer.keyDistCmdFlag != 0x00) ||
(SMP_GetPairMng()->masterEncryptedFlag == SMP_MASTER_ENCRYPTED_FLAG_NO)) {
return;
}
LOG_INFO("g_smpPairMng.peer.keyDistCmdFlag is 0.");
AlarmCancel(SMP_GetPairMng()->alarm);
if ((SMP_GetPairMng()->pairType == SMP_PAIR_TYPE_LEGACY) &&
(SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ENC_KEY)) {
LOG_INFO("Local is need to send ENC_KEY");
LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_13 is started");
ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_13);
} else if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_SIGN_KEY) {
LOG_INFO("Local is need to send SIGN_KEY");
if (SMP_GetPairMng()->pairType == SMP_PAIR_TYPE_LEGACY) {
LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_17 is started");
ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_17);
} else {
LOG_DEBUG("SMP_SC_PAIR_COMMON_MASTER_STEP_19 is started");
ret = SMP_SendHciLeRandCmd(SMP_SC_PAIR_COMMON_MASTER_STEP_19);
}
} else if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ID_KEY) {
LOG_INFO("Send Keys to Remote!");
ret = SMP_SendDistributionKeysToRemote();
} else {
SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_SUCCESS, 0x00, NULL);
LOG_INFO("Pair is Success!");
return;
}
if (ret != SMP_SUCCESS) {
SMP_GeneratePairResult(
SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
LOG_INFO("Pair is Failed!");
}
}
static void SMP_RecvSignInfoProcessSlave(const Buffer *buffer)
{
LOG_INFO("%{public}s", __FUNCTION__);
if ((SMP_GetPairMng()->step != SMP_LEGACY_PAIR_SLAVE_STEP_20) &&
(SMP_GetPairMng()->step != SMP_SC_PAIR_COMMON_SLAVE_STEP_21)) {
LOG_ERROR("It's not SMP_LEGACY_PAIR_SLAVE_STEP_20.");
LOG_ERROR("and It's not SMP_SC_PAIR_COMMON_SLAVE_STEP_21.");
return;
}
if (memcpy_s(SMP_GetPairMng()->peer.CSRK, SMP_CSRK_LEN, (uint8_t *)BufferPtr(buffer), SMP_CSRK_LEN) != EOK) {
LOG_ERROR("%{public}s, memcpy_s fail", __FUNCTION__);
return;
}
SMP_GetPairMng()->peer.keyDistCmdFlag =
SMP_GetPairMng()->peer.keyDistCmdFlag & (~SMP_KEY_DIST_CMD_FLAG_BIT_SIGN_INFO);
if (SMP_GetPairMng()->peer.keyDistCmdFlag == 0x00) {
LOG_INFO("g_smpPairMng.peer.keyDistCmdFlag is 0.");
AlarmCancel(SMP_GetPairMng()->alarm);
SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_SUCCESS, 0x00, NULL);
}
}