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中的代碼,該部分代碼的注釋詳解之後的文章。