天天看點

鴻蒙源碼分析(四十一)hks_mbedtls_engine.c檔案分析

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

繼續閱讀