您当前的位置: 首页 > 

小生叫安辰

暂无认证

  • 6浏览

    0关注

    105博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

鸿蒙源码分析(三十五)

小生叫安辰 发布时间:2021-08-19 11:14:10 ,浏览量:6

本篇主要分析hks_mbedtls_ecdsa.c代码

主要是基于ECDSA算法的签名过程和验证过程。密钥的生成在调用时使用其他位置函数即可。 文件路径(security_huks\frameworks\huks_standard\main\crypto_engine\mbedtls\src\hks_mbedtls_ecdsa.c)

一、背景知识

ecdsa签名算法介绍

二、代码分析

签名函数 实现ecdsa算法的签名过程,函数传入的参数不能有null值。 该函数主要基于mbedtls_ecdsa_write_signature实现签名的生成,根据传入的参数计算消息的签名

//签名函数
int32_t HksMbedtlsEcdsaSign(const struct HksBlob *key, const struct HksUsageSpec *usageSpec,
    const struct HksBlob *message, struct HksBlob *signature)
{
    int32_t ret = EccKeyCheck(key);
    //检查key的size和key->data的三个维度的size
    if (ret != HKS_SUCCESS) {
        return ret;
    }

    mbedtls_ecp_group_id curveNist = MBEDTLS_ECP_DP_NONE;
    ret = HksMbedtlsEccGetKeyCurveNist((struct KeyMaterialEcc *)(key->data), &curveNist);
    if (ret != HKS_SUCCESS) {
        return ret;
    }

    mbedtls_ctr_drbg_context ctrDrbg;
    mbedtls_entropy_context entropy;
    ret = HksCtrDrbgSeed(&ctrDrbg, &entropy);
    //在ctrDrbg中生成一个伪随机数
    if (ret != HKS_SUCCESS) {
        return ret;
    }

    mbedtls_ecdsa_context ctx;
    mbedtls_ecdsa_init(&ctx);

    do {
        ret = mbedtls_ecp_group_load(&(ctx.grp), curveNist);
        //加载曲线群的参数
        if (ret != HKS_MBEDTLS_SUCCESS) {
            HKS_LOG_E("Mbedtls ecp group load fail! mbedtls ret = 0x%X", ret);
            break;
        }

        ret = HksEccKeyMaterialToPri(key, &(ctx.d));
        //将key中内容转换为私钥存进ctx.d
        if (ret != HKS_SUCCESS) {
            break;
        }

        uint32_t mbedtlsAlg;
        ret = HksToMbedtlsDigestAlg(usageSpec->digest, &mbedtlsAlg);
        //将不同usageSpec->digest对应算法名称写进mbedtlsAlg
        if (ret != HKS_SUCCESS) {
            break;
        }

        ret = mbedtls_ecdsa_write_signature(&ctx, mbedtlsAlg, message->data, (size_t)message->size,
            signature->data, (size_t *)&(signature->size), mbedtls_ctr_drbg_random, &ctrDrbg);
        //生成签名在ctx中
        if (ret != HKS_MBEDTLS_SUCCESS) {
            HKS_LOG_E("Ecc mbedtls sign fail! mbedtls ret = 0x%X", ret);
            //生成失败就初始化签名域
            (void)memset_s(signature->data, signature->size, 0, signature->size);
        }
    } while (0);

    mbedtls_ctr_drbg_free(&ctrDrbg);
    mbedtls_entropy_free(&entropy);
    mbedtls_ecdsa_free(&ctx);
    //释放相关空间
    return ret;
}

验证函数 该函数主要基于mbedtls_ecdsa_read_signature读取签名信息进行验证。根据函数传入的公钥和传来的消息进性验证过程,得到一个是否通过的结果,不进行密钥的交换

/* users must ensure the input params not null */
//验证过程
int32_t HksMbedtlsEcdsaVerify(const struct HksBlob *key, const struct HksUsageSpec *usageSpec,
    const struct HksBlob *message, const struct HksBlob *signature)
{
    (void)usageSpec;
    int32_t ret = EccKeyCheck(key);
    if (ret != HKS_SUCCESS) {
        return ret;
    }

    mbedtls_ecp_group_id curveNist = MBEDTLS_ECP_DP_NONE;
    ret = HksMbedtlsEccGetKeyCurveNist((struct KeyMaterialEcc *)(key->data), &curveNist);
    //获取密钥的曲线dist,将所用曲线加密算法写进curvedist
    if (ret != HKS_SUCCESS) {
        HKS_LOG_E("Get ecc KeyCureNist fail! ret = 0x%X", ret);
        return ret;
    }

    mbedtls_ecdsa_context ctx;
    mbedtls_ecdsa_init(&ctx);

    do {
        ret = mbedtls_ecp_group_load(&(ctx.grp), curveNist);
        //加载曲线群参数
        if (ret != HKS_MBEDTLS_SUCCESS) {
            HKS_LOG_E("Mbedtls ecp group load fail! mbedtls ret = 0x%X", ret);
            break;
        }

        ret = HksEccKeyMaterialToPub(key, &(ctx.Q));
        if (ret != HKS_SUCCESS) {
            break;
        }

        ret = mbedtls_ecdsa_read_signature(&ctx,
            message->data, message->size, signature->data, signature->size);
        //调用mbedtls_ecdsa_read_signature是实现验证,从ctx和signature->data和message->data比对验证关系是否成立
        if (ret != HKS_MBEDTLS_SUCCESS) {
            HKS_LOG_E("Ecc mbedtls verify fail! mbedtls ret = 0x%X", ret);
        }
    }while (0);

    mbedtls_ecdsa_free(&ctx);
    //释放相关空间
    return ret;
}
感谢阅读和点赞
关注
打赏
1635606302
查看更多评论
立即登录/注册

微信扫码登录

0.1022s