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中的代码,该部分代码的注释详解之后的文章。