39d8477c创建于 2023年6月27日历史提交
/*
 * 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_legacy.h"

#include <string.h>

#include "log.h"
#include "smp.h"
#include "smp_cmd.h"
#include "smp_common.h"
#include "smp_send.h"
#include "smp_tool.h"

void SMP_LegacyPairMasterStep1(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    uint32_t passkey;
    uint16_t handle = SMP_GetPairMng()->handle;
    uint8_t pairMethod = SMP_GetPairMng()->local.pairMethod;
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    passkey = *((uint32_t *)returnParam->randomNumber);
    passkey = passkey % (SMP_MAX_PASSKEY_VALUE + 0x01);
    LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_2 started.");
    SMP_GetPairMng()->step = SMP_LEGACY_PAIR_MASTER_STEP_2;
    AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
    SMP_NotifyCbAuthReq(handle, pairMethod, (uint8_t *)&passkey);
}

void SMP_LegacyPairMasterStep2(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    (void)memcpy_s(SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
    LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_3 started.");
    int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_3);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairMasterStep3(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
    SMP_CryptC1Step1Param cryptC1Step1Param;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    (void)memcpy_s(SMP_GetPairMng()->local.random + SMP_RAND_NUM_LEN,
        SMP_RAND_NUM_LEN,
        returnParam->randomNumber,
        SMP_RAND_NUM_LEN);
    SMP_ConstituteC1Step1Param(
        SMP_ROLE_MASTER, SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN, &cryptC1Step1Param);
    LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_4 started.");
    int ret = SMP_CryptographicC1Step1(SMP_LEGACY_PAIR_MASTER_STEP_4, &cryptC1Step1Param);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairMasterStep4(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    SMP_EncData *encData = (SMP_EncData *)param->data;
    SMP_CryptC1Step2Param cryptC1Step2Param;
    LOG_DEBUG("%{public}s", __FUNCTION__);
    int ret = SMP_ConstituteC1Step2Param(encData, SMP_ROLE_MASTER, &cryptC1Step2Param);
    if (ret != SMP_SUCCESS) {
        return;
    }
    LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_5 started.");
    ret = SMP_CryptographicC1Step2(SMP_LEGACY_PAIR_MASTER_STEP_5, &cryptC1Step2Param);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairMasterStep5(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    SMP_EncData *encData = (SMP_EncData *)param->data;
    const HciLeEncryptReturnParam *returnParam = encData->encRetParam;
    uint8_t confirmTemp[SMP_CONFIRM_DATA_LEN] = {0};
    LOG_DEBUG("%{public}s", __FUNCTION__);
    int ret = SMP_EncryptCompleteJudgeException(returnParam->status, SMP_ROLE_MASTER);
    if (ret != SMP_SUCCESS) {
        return;
    }
    SMP_MemoryReverseCopy(SMP_GetPairMng()->local.confirm, returnParam->encryptedData, SMP_CONFIRM_DATA_LEN);
    SMP_MemoryReverseCopy(confirmTemp, SMP_GetPairMng()->local.confirm, SMP_CONFIRM_DATA_LEN);
    LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_6 started.");
    SMP_GetPairMng()->step = SMP_LEGACY_PAIR_MASTER_STEP_6;
    AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
    ret = SMP_SendPairingConfirm(SMP_GetPairMng()->handle, confirmTemp, SMP_SendDataCallback);
    if (ret != SMP_SUCCESS) {
        LOG_ERROR("Send Pairing Confirm failed.");
        SMP_GeneratePairResult(SMP_GetPairMng()->handle,
            SMP_PAIR_STATUS_FAILED,
            SMP_PAIR_FAILED_UNSPECIFIED_REASION,
            SMP_GetPairMng()->alarm);
    }
}

void SMP_LegacyPairMasterStep6(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    uint8_t randomTemp[SMP_RANDOM_DATA_LEN] = {0x00};

    LOG_DEBUG("%{public}s", __FUNCTION__);
    AlarmCancel(SMP_GetPairMng()->alarm);
    SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.confirm, (uint8_t *)param->data, SMP_CONFIRM_DATA_LEN);
    SMP_MemoryReverseCopy(randomTemp, SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN);
    SMP_GetPairMng()->step = SMP_LEGACY_PAIR_MASTER_STEP_7;
    LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_7 started.");
    AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
    int ret = SMP_SendPairingRandom(SMP_GetPairMng()->handle, randomTemp, SMP_SendDataCallback);
    if (ret != SMP_SUCCESS) {
        LOG_ERROR("Send Pairing random error");
        SMP_GeneratePairResult(SMP_GetPairMng()->handle,
            SMP_PAIR_STATUS_FAILED,
            SMP_PAIR_FAILED_UNSPECIFIED_REASION,
            SMP_GetPairMng()->alarm);
    }
}

void SMP_LegacyPairMasterStep7(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    SMP_CryptC1Step1Param cryptC1Step1Param;
    LOG_DEBUG("%{public}s", __FUNCTION__);
    SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.random, (uint8_t *)param->data, SMP_RANDOM_DATA_LEN);
    SMP_ConstituteC1Step1Param(SMP_ROLE_MASTER, SMP_GetPairMng()->peer.random, SMP_RANDOM_DATA_LEN, &cryptC1Step1Param);
    LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_8 started.");
    int ret = SMP_CryptographicC1Step1(SMP_LEGACY_PAIR_MASTER_STEP_8, &cryptC1Step1Param);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairMasterStep8(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    SMP_EncData *encData = (SMP_EncData *)param->data;
    SMP_CryptC1Step2Param cryptC1Step2Param;
    LOG_DEBUG("%{public}s", __FUNCTION__);
    int ret = SMP_ConstituteC1Step2Param(encData, SMP_ROLE_MASTER, &cryptC1Step2Param);
    if (ret != SMP_SUCCESS) {
        return;
    }
    LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_9 started.");
    ret = SMP_CryptographicC1Step2(SMP_LEGACY_PAIR_MASTER_STEP_9, &cryptC1Step2Param);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairMasterStep9(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    SMP_EncData *encData = (SMP_EncData *)param->data;
    const HciLeEncryptReturnParam *returnParam = encData->encRetParam;
    HciLeEncryptParam encryptParam;
    uint8_t confirmTemp[SMP_CONFIRM_DATA_LEN] = {0x00};
    SMP_CryptS1Param cryptS1Param;
    LOG_DEBUG("%{public}s", __FUNCTION__);
    int ret = SMP_EncryptCompleteJudgeException(returnParam->status, SMP_ROLE_MASTER);
    if (ret != SMP_SUCCESS) {
        return;
    }
    SMP_MemoryReverseCopy(confirmTemp, returnParam->encryptedData, SMP_CONFIRM_DATA_LEN);
    if (memcmp(confirmTemp, SMP_GetPairMng()->peer.confirm, SMP_CONFIRM_DATA_LEN) != 0x00) {
        LOG_ERROR("Confirm check failed.");
        SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_CONFIRM_VALUE, NULL);
    } else {
        LOG_INFO("Confirm  check  success.");
        LOG_INFO("Start  generate  STK.");
        (void)memcpy_s(
            cryptS1Param.r1, sizeof(cryptS1Param.r1), SMP_GetPairMng()->peer.random, sizeof(cryptS1Param.r1));
        (void)memcpy_s(
            cryptS1Param.r2, sizeof(cryptS1Param.r2), SMP_GetPairMng()->local.random, sizeof(cryptS1Param.r2));
        SMP_CryptographicS1(&cryptS1Param);
        SMP_MemoryReverseCopy(encryptParam.key, SMP_GetPairMng()->TK, SMP_TK_LEN);
        SMP_MemoryReverseCopy(encryptParam.plaintextData, cryptS1Param.output, sizeof(cryptS1Param.output));
        LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_10 started.");
        ret = SMP_SendLeEncryptCmd(&encryptParam, SMP_LEGACY_PAIR_MASTER_STEP_10, NULL, SMP_USING_HW_AES128_PAIR);
        if (ret != SMP_SUCCESS) {
            SMP_GeneratePairResult(
                SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
        }
    }
}

void SMP_LegacyPairMasterStep10(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    HciLeStartEncryptionParam startEncParam;
    SMP_EncData *encData = (SMP_EncData *)param->data;
    const HciLeEncryptReturnParam *returnParam = encData->encRetParam;
    LOG_DEBUG("%{public}s", __FUNCTION__);
    int ret = SMP_EncryptCompleteJudgeException(returnParam->status, SMP_ROLE_MASTER);
    if (ret != SMP_SUCCESS) {
        return;
    }
    (void)memcpy_s(SMP_GetPairMng()->STK, SMP_STK_LEN, returnParam->encryptedData, SMP_STK_LEN);
    if (SMP_GetPairMng()->encKeySize < SMP_STK_LEN) {
        (void)memset_s(SMP_GetPairMng()->STK + SMP_GetPairMng()->encKeySize,
            (SMP_STK_LEN - SMP_GetPairMng()->encKeySize),
            0x00,
            (SMP_STK_LEN - SMP_GetPairMng()->encKeySize));
    }
    startEncParam.connectionHandle = SMP_GetPairMng()->handle;
    startEncParam.encryptDiversifier = 0x00;
    (void)memset_s(startEncParam.randomNumber, SMP_MASTER_RAND_LEN, 0x00, SMP_MASTER_RAND_LEN);
    (void)memcpy_s(startEncParam.longTermKey, SMP_LTK_LEN, SMP_GetPairMng()->STK, SMP_STK_LEN);
    LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_11 started.");
    SMP_GetPairMng()->step = SMP_LEGACY_PAIR_MASTER_STEP_11;
    AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
    SMP_GetPairMng()->masterEncryptedFlag = SMP_MASTER_ENCRYPTED_FLAG_NO;
    ret = HCI_LeStartEncryption(&startEncParam);
    if (ret != SMP_SUCCESS) {
        LOG_ERROR("HCI_LeStartEncryption failed.");
        SMP_GeneratePairResult(SMP_GetPairMng()->handle,
            SMP_PAIR_STATUS_FAILED,
            SMP_PAIR_FAILED_UNSPECIFIED_REASION,
            SMP_GetPairMng()->alarm);
    }
}

void SMP_LegacyPairMasterStep13(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    (void)memcpy_s(SMP_GetPairMng()->local.LTK, SMP_LTK_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
    LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_14 started.");
    int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_14);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairMasterStep14(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    (void)memcpy_s(
        SMP_GetPairMng()->local.LTK + SMP_RAND_NUM_LEN, SMP_RAND_NUM_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
    SMP_LongTermKeyCopy(SMP_GetPairMng()->local.LTK, SMP_GetPairMng()->local.LTK, SMP_GetPairMng()->encKeySize);
    LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_15 started.");
    int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_15);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairMasterStep15(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    (void)memcpy_s(&SMP_GetPairMng()->local.masterIdEdiv,
        sizeof(SMP_GetPairMng()->local.masterIdEdiv),
        returnParam->randomNumber,
        sizeof(SMP_GetPairMng()->local.masterIdEdiv));
    LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_16 started.");
    int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_16);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairMasterStep16(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    (void)memcpy_s(
        SMP_GetPairMng()->local.masterIdRand, SMP_MASTER_RAND_LEN, returnParam->randomNumber, SMP_MASTER_RAND_LEN);
    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_ENC_KEY) ||
               (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ID_KEY)) {
        LOG_INFO("Local Need to Send ENC_KEY or SIGN_KEY.");
        if (SMP_SendDistributionKeysToRemote()) {
            SMP_GeneratePairResult(
                SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
        }
    } else {
        LOG_INFO("Pair  Success.");
        SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_SUCCESS, 0x00, NULL);
    }
}

void SMP_LegacyPairMasterStep17(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    (void)memcpy_s(SMP_GetPairMng()->local.CSRK, SMP_CSRK_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
    LOG_DEBUG("SMP_LEGACY_PAIR_MASTER_STEP_18 started.");
    int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_MASTER_STEP_18);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairMasterStep18(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    (void)memcpy_s(
        SMP_GetPairMng()->local.CSRK + SMP_RAND_NUM_LEN, SMP_RAND_NUM_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
    LOG_INFO("Send Keys to remote.");
    if (SMP_SendDistributionKeysToRemote()) {
        LOG_INFO("Pair  failed");
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairSlaveStep1(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    uint32_t passkey;
    uint16_t handle = SMP_GetPairMng()->handle;
    uint8_t pairMethod = SMP_GetPairMng()->local.pairMethod;
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    passkey = *((uint32_t *)returnParam->randomNumber);
    passkey = passkey % (SMP_MAX_PASSKEY_VALUE + 0x01);
    LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_2 started.");
    SMP_GetPairMng()->step = SMP_LEGACY_PAIR_SLAVE_STEP_2;
    AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
    SMP_NotifyCbAuthReq(handle, pairMethod, (uint8_t *)&passkey);
}

void SMP_LegacyPairSlaveStep2(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }

    LOG_DEBUG("%{public}s", __FUNCTION__);
    SMP_GetPairMng()->slaveConfirmRecvFlag = SMP_SLAVE_CONFIRM_RECV_FLAG_YES;
    SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.confirm, (uint8_t *)param->data, SMP_CONFIRM_DATA_LEN);
}

void SMP_LegacyPairSlaveStep3(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }

    LOG_DEBUG("%{public}s", __FUNCTION__);
    AlarmCancel(SMP_GetPairMng()->alarm);
    SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.confirm, (uint8_t *)param->data, SMP_CONFIRM_DATA_LEN);
    LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_4 started.");
    int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_SLAVE_STEP_4);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairSlaveStep4(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    (void)memcpy_s(SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
    LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_5 started.");
    int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_SLAVE_STEP_5);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairSlaveStep5(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
    SMP_CryptC1Step1Param cryptC1Step1Param;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    (void)memcpy_s(SMP_GetPairMng()->local.random + SMP_RAND_NUM_LEN,
        SMP_RAND_NUM_LEN,
        returnParam->randomNumber,
        SMP_RAND_NUM_LEN);
    SMP_ConstituteC1Step1Param(SMP_ROLE_SLAVE, SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN, &cryptC1Step1Param);
    LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_6 started.");
    int ret = SMP_CryptographicC1Step1(SMP_LEGACY_PAIR_SLAVE_STEP_6, &cryptC1Step1Param);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairSlaveStep6(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    SMP_EncData *encData = (SMP_EncData *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    SMP_CryptC1Step2Param cryptC1Step2Param;
    LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_7 started.");
    int ret = SMP_ConstituteC1Step2Param(encData, SMP_ROLE_SLAVE, &cryptC1Step2Param);
    if (ret != SMP_SUCCESS) {
        return;
    }
    ret = SMP_CryptographicC1Step2(SMP_LEGACY_PAIR_SLAVE_STEP_7, &cryptC1Step2Param);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairSlaveStep7(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    uint8_t confirm[SMP_CONFIRM_DATA_LEN] = {0x00};
    SMP_EncData *encData1 = (SMP_EncData *)param->data;
    const HciLeEncryptReturnParam *returnParam = encData1->encRetParam;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    int ret = SMP_EncryptCompleteJudgeException(returnParam->status, SMP_ROLE_SLAVE);
    if (ret != SMP_SUCCESS) {
        return;
    }

    SMP_MemoryReverseCopy(SMP_GetPairMng()->local.confirm, returnParam->encryptedData, SMP_CONFIRM_DATA_LEN);
    SMP_MemoryReverseCopy(confirm, SMP_GetPairMng()->local.confirm, SMP_CONFIRM_DATA_LEN);
    LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_8 started.");
    SMP_GetPairMng()->step = SMP_LEGACY_PAIR_SLAVE_STEP_8;
    AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
    ret = SMP_SendPairingConfirm(SMP_GetPairMng()->handle, confirm, SMP_SendDataCallback);
    if (ret != SMP_SUCCESS) {
        LOG_ERROR("Send Pairing Confirm failed.");
        SMP_GeneratePairResult(SMP_GetPairMng()->handle,
            SMP_PAIR_STATUS_FAILED,
            SMP_PAIR_FAILED_UNSPECIFIED_REASION,
            SMP_GetPairMng()->alarm);
    }
}

void SMP_LegacyPairSlaveStep8(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    SMP_CryptC1Step1Param cryptC1Step1Param;
    LOG_DEBUG("%{public}s", __FUNCTION__);
    SMP_MemoryReverseCopy(SMP_GetPairMng()->peer.random, (uint8_t *)param->data, SMP_RANDOM_DATA_LEN);
    SMP_ConstituteC1Step1Param(SMP_ROLE_SLAVE, SMP_GetPairMng()->peer.random, SMP_RANDOM_DATA_LEN, &cryptC1Step1Param);
    LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_9 started.");
    int ret = SMP_CryptographicC1Step1(SMP_LEGACY_PAIR_SLAVE_STEP_9, &cryptC1Step1Param);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairSlaveStep9(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    SMP_EncData *encData = (SMP_EncData *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    SMP_CryptC1Step2Param cryptC1Step2Param;
    LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_10 started.");
    int ret = SMP_ConstituteC1Step2Param(encData, SMP_ROLE_SLAVE, &cryptC1Step2Param);
    if (ret != SMP_SUCCESS) {
        return;
    }
    ret = SMP_CryptographicC1Step2(SMP_LEGACY_PAIR_SLAVE_STEP_10, &cryptC1Step2Param);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairSlaveStep10(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    SMP_EncData *encData = (SMP_EncData *)param->data;
    const HciLeEncryptReturnParam *returnParam = encData->encRetParam;
    uint8_t confirm[SMP_CONFIRM_DATA_LEN] = {0x00};
    HciLeEncryptParam encryptParam;
    SMP_CryptS1Param cryptS1Param;

    LOG_DEBUG("%{public}s", __FUNCTION__);
    int ret = SMP_EncryptCompleteJudgeException(returnParam->status, SMP_ROLE_SLAVE);
    if (ret != SMP_SUCCESS) {
        return;
    }
    SMP_MemoryReverseCopy(confirm, returnParam->encryptedData, SMP_CONFIRM_DATA_LEN);
    if (memcmp(confirm, SMP_GetPairMng()->peer.confirm, SMP_CONFIRM_DATA_LEN)) {
        SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_CONFIRM_VALUE, NULL);
        LOG_ERROR("Confirm Check Failed");
    } else {
        LOG_INFO("Confirm Check Success");
        LOG_INFO("Start Generate STK");
        (void)memcpy_s(
            cryptS1Param.r1, sizeof(cryptS1Param.r1), SMP_GetPairMng()->local.random, sizeof(cryptS1Param.r1));
        (void)memcpy_s(
            cryptS1Param.r2, sizeof(cryptS1Param.r2), SMP_GetPairMng()->peer.random, sizeof(cryptS1Param.r2));
        SMP_CryptographicS1(&cryptS1Param);
        SMP_MemoryReverseCopy(encryptParam.key, SMP_GetPairMng()->TK, SMP_TK_LEN);
        SMP_MemoryReverseCopy(encryptParam.plaintextData, cryptS1Param.output, sizeof(cryptS1Param.output));
        LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_11 started.");
        ret = SMP_SendLeEncryptCmd(&encryptParam, SMP_LEGACY_PAIR_SLAVE_STEP_11, NULL, SMP_USING_HW_AES128_PAIR);
        if (ret != SMP_SUCCESS) {
            SMP_GeneratePairResult(
                SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
        }
    }
}

void SMP_LegacyPairSlaveStep11(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    SMP_EncData *encData = (SMP_EncData *)param->data;
    const HciLeEncryptReturnParam *returnParam = encData->encRetParam;
    uint8_t randomTemp[SMP_RANDOM_DATA_LEN] = {0x00};

    LOG_DEBUG("%{public}s", __FUNCTION__);
    int ret = SMP_EncryptCompleteJudgeException(returnParam->status, SMP_ROLE_SLAVE);
    if (ret != SMP_SUCCESS) {
        return;
    }

    (void)memcpy_s(SMP_GetPairMng()->STK, SMP_STK_LEN, returnParam->encryptedData, SMP_STK_LEN);
    if (SMP_GetPairMng()->encKeySize < SMP_STK_LEN) {
        (void)memset_s(SMP_GetPairMng()->STK + SMP_GetPairMng()->encKeySize,
            (SMP_STK_LEN - SMP_GetPairMng()->encKeySize),
            0x00,
            (SMP_STK_LEN - SMP_GetPairMng()->encKeySize));
    }
    SMP_MemoryReverseCopy(randomTemp, SMP_GetPairMng()->local.random, SMP_RANDOM_DATA_LEN);
    LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_12 started.");
    SMP_GetPairMng()->step = SMP_LEGACY_PAIR_SLAVE_STEP_12;
    AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
    ret = SMP_SendPairingRandom(SMP_GetPairMng()->handle, randomTemp, SMP_SendDataCallback);
    if (ret != SMP_SUCCESS) {
        LOG_ERROR("Send Pairing Random failed.");
        SMP_GeneratePairResult(SMP_GetPairMng()->handle,
            SMP_PAIR_STATUS_FAILED,
            SMP_PAIR_FAILED_UNSPECIFIED_REASION,
            SMP_GetPairMng()->alarm);
    }
}

void SMP_LegacyPairSlaveStep14(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);

    (void)memcpy_s(SMP_GetPairMng()->local.LTK, SMP_LTK_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);

    LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_15 started.");
    int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_SLAVE_STEP_15);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairSlaveStep15(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);

    (void)memcpy_s(
        SMP_GetPairMng()->local.LTK + SMP_RAND_NUM_LEN, SMP_RAND_NUM_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);
    SMP_LongTermKeyCopy(SMP_GetPairMng()->local.LTK, SMP_GetPairMng()->local.LTK, SMP_GetPairMng()->encKeySize);

    LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_16 started.");
    int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_SLAVE_STEP_16);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairSlaveStep16(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);

    (void)memcpy_s(&SMP_GetPairMng()->local.masterIdEdiv,
        sizeof(SMP_GetPairMng()->local.masterIdEdiv),
        returnParam->randomNumber,
        sizeof(SMP_GetPairMng()->local.masterIdEdiv));

    LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_17 started.");
    int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_SLAVE_STEP_17);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairSlaveStep17(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;
    LOG_DEBUG("%{public}s", __FUNCTION__);
    (void)memcpy_s(
        SMP_GetPairMng()->local.masterIdRand, SMP_MASTER_RAND_LEN, returnParam->randomNumber, SMP_MASTER_RAND_LEN);
    if (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_SIGN_KEY) {
        LOG_INFO("Local need to send SIGN_KEY.");
        LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_18 started.");
        int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_SLAVE_STEP_18);
        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_ENC_KEY) ||
               (SMP_GetPairMng()->local.keyDist & SMP_KEY_DIST_BIT_ID_KEY)) {
        LOG_INFO("Local need to send ENC_KEY or SIGN_KEY");
        SMP_GetPairMng()->step = SMP_LEGACY_PAIR_SLAVE_STEP_20;
        AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
        LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_20 Started");
        if (SMP_SendDistributionKeysToRemote()) {
            SMP_GeneratePairResult(SMP_GetPairMng()->handle,
                SMP_PAIR_STATUS_FAILED,
                SMP_PAIR_FAILED_UNSPECIFIED_REASION,
                SMP_GetPairMng()->alarm);
        }
    } else {
        if (!SMP_GetPairMng()->peer.keyDist) {
            SMP_GeneratePairResult(SMP_GetPairMng()->handle, SMP_PAIR_STATUS_SUCCESS, 0x00, NULL);
        } else {
            SMP_GetPairMng()->step = SMP_LEGACY_PAIR_SLAVE_STEP_20;
            LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_20 started");
            AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
        }
    }
}

void SMP_LegacyPairSlaveStep18(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);

    (void)memcpy_s(SMP_GetPairMng()->local.CSRK, SMP_CSRK_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);

    LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_19 started.");
    int ret = SMP_SendHciLeRandCmd(SMP_LEGACY_PAIR_SLAVE_STEP_19);
    if (ret != SMP_SUCCESS) {
        SMP_GeneratePairResult(
            SMP_GetPairMng()->handle, SMP_PAIR_STATUS_FAILED, SMP_PAIR_FAILED_UNSPECIFIED_REASION, NULL);
    }
}

void SMP_LegacyPairSlaveStep19(const SMP_StepParam *param)
{
    if (SMP_ParamIsNULL(param) != SMP_SUCCESS) {
        return;
    }
    const HciLeRandReturnParam *returnParam = (HciLeRandReturnParam *)param->data;

    LOG_DEBUG("%{public}s", __FUNCTION__);

    (void)memcpy_s(
        SMP_GetPairMng()->local.CSRK + SMP_RAND_NUM_LEN, SMP_RAND_NUM_LEN, returnParam->randomNumber, SMP_RAND_NUM_LEN);

    LOG_INFO("Send keys to remote.");
    LOG_DEBUG("SMP_LEGACY_PAIR_SLAVE_STEP_20 started.");
    SMP_GetPairMng()->step = SMP_LEGACY_PAIR_SLAVE_STEP_20;
    AlarmSet(SMP_GetPairMng()->alarm, SMP_PAIR_WAIT_TIME, SMP_PairTimeout, NULL);
    if (SMP_SendDistributionKeysToRemote()) {
        SMP_GeneratePairResult(SMP_GetPairMng()->handle,
            SMP_PAIR_STATUS_FAILED,
            SMP_PAIR_FAILED_UNSPECIFIED_REASION,
            SMP_GetPairMng()->alarm);
    }
}