鸿蒙源码分析(四十一)

hks_mbedtls_engine.c文件分析

一、文件功能

该文件是hks和mbedtls库中相关函数的调用,设计加密解密的功能实现的封装。主要的功能都是调用该文件夹下相应加密算法文件,不同情况调用不同的方法实现一些功能(比如密钥的生成、随机数的生成、签名生成、验证等等)该文件夹下每个函数都有这些功能的实现,所以使用engine这个文件,对这些功能进行整理和封装使用。不同情况调用不同的算法实现各部分功能。

二、部分代码分析

代码节构过于单调,本篇主要选取部分经典功能实现函数进行博客书写。
1.签名实现
usageSpec参数中的算法类型属性,指定了选取何方式进行签名的生成。
参数详解

  • usageSpec存取了相关算法名
  • key:签名对应密钥
  • message:输入数据message
  • signature:签名数据的存放
//签名函数
int32_t HksCryptoHalSign(const struct HksBlob *key, const struct HksUsageSpec *usageSpec,
    const struct HksBlob *message, struct HksBlob *signature)
{
    
    
    switch (usageSpec->algType) {
    
    
#if defined(HKS_SUPPORT_RSA_C) && defined(HKS_SUPPORT_RSA_SIGN_VERIFY)
        case HKS_ALG_RSA:
            return HksMbedtlsRsaSign(key, usageSpec, message, signature);
#endif
#if defined(HKS_SUPPORT_ECC_C) && defined(HKS_SUPPORT_ECDSA_C)
        case HKS_ALG_ECC:
            return HksMbedtlsEcdsaSign(key, usageSpec, message, signature);
#endif
#if defined(HKS_SUPPORT_ED25519_C) && defined(HKS_SUPPORT_ED25519_SIGN_VERIFY)
        case HKS_ALG_ED25519:
            return HksEd25519Sign(key, message, signature);
#endif
        default:
            HKS_LOG_E("Unsupport alg or macro is not on! alg = 0x%X", usageSpec->algType);
            return HKS_ERROR_INVALID_ARGUMENT;
    }
}

2.验证函数
签名的验证和签名生成的流程大致类似,该函数结构同上面,参数功能相似。主要是针对不同算法实现不同算法的验签过程。

//验证函数
int32_t HksCryptoHalVerify(const struct HksBlob *key, const struct HksUsageSpec *usageSpec,
    const struct HksBlob *message, const struct HksBlob *signature)
{
    
    
    switch (usageSpec->algType) {
    
    
#if defined(HKS_SUPPORT_RSA_C) && defined(HKS_SUPPORT_RSA_SIGN_VERIFY)
        case HKS_ALG_RSA:
            return HksMbedtlsRsaVerify(key, usageSpec, message, signature);
#endif
#if defined(HKS_SUPPORT_ECC_C) && defined(HKS_SUPPORT_ECDSA_C)
        case HKS_ALG_ECC:
            return HksMbedtlsEcdsaVerify(key, usageSpec, message, signature);
#endif
#if defined(HKS_SUPPORT_ED25519_C) && defined(HKS_SUPPORT_ED25519_SIGN_VERIFY)
        case HKS_ALG_ED25519:
            return HksEd25519Verify(key, message, signature);
#endif
        default:
            HKS_LOG_E("Unsupport alg or macro is not on! alg = 0x%X", usageSpec->algType);
            return HKS_ERROR_INVALID_ARGUMENT;
    }
}
#endif /* _CUT_AUTHENTICATE_ */

3.随机数生成
函数功能:生成指定长度的随机数,写进randomData。

//随机数的填充
//将随机数写进randomData->data,指定长度size
int32_t HksCryptoHalFillRandom(struct HksBlob *randomData)
{
    
    
    mbedtls_entropy_context entropy;
    mbedtls_ctr_drbg_context ctrDrbg;
    int32_t ret = HksCtrDrbgSeed(&ctrDrbg, &entropy);
    //先定义生成随机数种子
    if (ret != HKS_SUCCESS) {
    
    
        return ret;
    }

    do {
    
    
        ret = mbedtls_ctr_drbg_random(&ctrDrbg, randomData->data, randomData->size);
        //生成指定长度的随机数
        if (ret != HKS_MBEDTLS_SUCCESS) {
    
    
            HKS_LOG_E("Mbedtls random failed! mbedtls ret = 0x%X", ret);
            (void)memset_s(randomData->data, randomData->size, 0, randomData->size);
        }
    } while (0);
    //while(0)表示循环只进行一次
    mbedtls_ctr_drbg_free(&ctrDrbg);
    mbedtls_entropy_free(&entropy);
    return ret;
    //释放随机数生成器都占用的空间
}

4.加密实现
加密过程的实现,分支基于usageSpec存储的算法名字。参数中tagAead是aes的加密过程所特有的参数,而rsa的加密是不需要该变量的。具体的加密函数在对应文件下有相关分析,这里只是函数的封装和调用。


//加密算法
int32_t HksCryptoHalEncrypt(const struct HksBlob *key, const struct HksUsageSpec *usageSpec,
    const struct HksBlob *message, struct HksBlob *cipherText, struct HksBlob *tagAead)
{
    
    
    switch (usageSpec->algType) {
    
    
#ifdef HKS_SUPPORT_AES_Csi1
        case HKS_ALG_AES:
            return HksMbedtlsAesEncrypt(key, usageSpec, message, cipherText, tagAead);
            //基于aes的加密
#endif
#if defined(HKS_SUPPORT_RSA_C) && defined(HKS_SUPPORT_RSA_CRYPT)
        case HKS_ALG_RSA:
            return HksMbedtlsRsaCrypt(key, usageSpec, message, true, cipherText);
            //基于rsa的加密
#endif
        default:
            HKS_LOG_E("Unsupport alg or macro is not on! alg = 0x%X", usageSpec->algType);
            return HKS_ERROR_INVALID_ARGUMENT;
    }
}

5.解密实现
解密和加密是两个相逆的过程,这里不多赘述。具体的函数可以见aes.c文件和rsa.c文件。

//解密过程
int32_t HksCryptoHalDecrypt(const struct HksBlob *key, const struct HksUsageSpec *usageSpec,
    const struct HksBlob *message, struct HksBlob *cipherText)
{
    
    
    switch (usageSpec->algType) {
    
    
#ifdef HKS_SUPPORT_AES_C
        case HKS_ALG_AES:
            return HksMbedtlsAesDecrypt(key, usageSpec, message, cipherText);
            //aes对应的解密函数
#endif
#if defined(HKS_SUPPORT_RSA_C) && defined(HKS_SUPPORT_RSA_CRYPT)
        case HKS_ALG_RSA:
            return HksMbedtlsRsaCrypt(key, usageSpec, message, false, cipherText);
            //rsa对应的解密函数
#endif
        default:
            HKS_LOG_E("Unsupport alg or macro is not on! alg = 0x%X", usageSpec->algType);
            return HKS_ERROR_INVALID_ARGUMENT;
    }
}

函数具体的解释

engine引擎文件主要是实现各部分功能的整合,自建函数只有随机数的填写。主要封装的hks_mbedtls_aes.c和hks_mbedtls_rsa.c中的代码,该部分代码的注释详解之后的文章。

猜你喜欢

转载自blog.csdn.net/m0_46976252/article/details/119929959