天天看點

鴻蒙源碼分析(二十三)安全密鑰庫子產品hks_common.c代碼分析

文章目錄

  • 安全密鑰庫子產品hks_common.c代碼分析
    • 一、背景知識
    • 二、hks_common.c代碼分析
    • 三、總結

安全密鑰庫子產品hks_common.c代碼分析

本篇文章主要分析hks_common.c中的相關内容

檔案路徑(security_huks\frameworks\huks_lite\source\hw_keystore_sdk\common\hks_common.c)

一、背景知識

頭檔案介紹

相關算法介紹

二、hks_common.c代碼分析

生成随機數算法

該函數用來生成一個随機數,其中使用到了ctr_drbg這個僞随機數生成器。

參數解釋

  • random :随機數存儲的緩沖區
  • len :随機數的長度

傳回值:傳回成功或者錯誤碼

//生成随機數函數,傳回錯誤碼或者成功
int32_t hks_gen_random(uint8_t *random, uint32_t len)
{
    if (random == NULL) {
        log_error("invalid random");
        return HKS_ERROR_NULL_POINTER;
    }

    if ((len == 0) || (len > HKS_RANDOM_MAX_LEN)) {
        log_error("invalid len=%u", len);
        return HKS_ERROR_INVALID_ARGUMENT;
    }
    //檢查傳入參數的合理性

    mbedtls_ctr_drbg_context ctr_drbg;
    mbedtls_entropy_context entropy;

    (void)memset_s(&ctr_drbg, sizeof(ctr_drbg), 0, sizeof(ctr_drbg));
    //初始化ctr_drbg内容
    mbedtls_entropy_init(&entropy); //初始化entropy
    int ret = HKS_SUCCESS;

    /* use the g_hks_random_seed_custom without string terminator */
    int32_t rc = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func,
        &entropy, g_hks_random_seed_custom,
        sizeof(g_hks_random_seed_custom));
    //生成一個僞随機數

    if (rc != HKS_STATUS_OK) {
        log_error("ctr drbg seed fail,rc=%d", rc);
        ret = HKS_ERROR_INTERNAL_UNKOWN;
        goto exit;
    }//對生成随機數的成功狀态進行檢查

    rc = mbedtls_ctr_drbg_random(&ctr_drbg, random, len);
    if (rc != HKS_STATUS_OK) {
        log_error("ctr drbg random fail,rc=%d", rc);
        ret = HKS_ERROR_INTERNAL_UNKOWN;
    }
exit:
    mbedtls_ctr_drbg_free(&ctr_drbg);
    mbedtls_entropy_free(&entropy);
    //釋放相關空間,傳回ret值。
    return ret;
}
           

計算sha526相關算法原理

這個函數主要涉及SHA256算法中的計算過程,SHA256算法是一個單向的哈希函數

參數詳解:

  • hash_src :哈希函數的來源、
  • hash_src_num:哈希函數來源的數量
  • hash_result :哈希函數的結果

傳回值:成功則傳回成功值,否則傳回錯誤代碼

//計算sha526相關算法原理
int32_t hks_calc_sha256(const struct hks_blob *hash_src, uint32_t hash_src_num, struct hks_blob *hash_result)
{
    if (hash_src == NULL) {
        log_error("invalid hash src");
        return HKS_ERROR_NULL_POINTER;
    }
    if (hash_result == NULL) {
        log_error("invalid hash result");
        return HKS_ERROR_NULL_POINTER;
    }
    //檢查傳入參數的合理性
    mbedtls_sha256_context sha256_ctx;
    mbedtls_sha256_init(&sha256_ctx);
    //定義SHA256并且完成初始化
    int rc = mbedtls_sha256_starts_ret(&sha256_ctx, HKS_BOOL_FALSE);
    //SHA256開始設定
    if (rc != HKS_SUCCESS) {
        log_error("sha256 starts fail,rc=%d", rc);
        return HKS_ERROR_INTERNAL_UNKOWN;
        //start_ret設定失敗的處理
    }

    do {
        uint32_t i = 0;
        for (; i < hash_src_num; ++i) {
            rc = mbedtls_sha256_update_ret(&sha256_ctx,
                hash_src[i].data, hash_src[i].size);
            //更新相關内容
            if (rc != HKS_SUCCESS) {
                log_error("sha256 update fail,rc=%d,i=%u", rc, i);
                break;
            }
        }
        if (rc != HKS_STATUS_OK)
            break;

        rc = mbedtls_sha256_finish_ret(&sha256_ctx, hash_result->data);
        //結束sha256算法
        if (rc != HKS_SUCCESS) {
            log_error("sha256 finish fail,rc=%d,i=%u", rc, i);
            break;
        }
    } while (0);//用來執行一次的循環

    mbedtls_sha256_free(&sha256_ctx); //釋放sha256_ctx空間
    if (rc != HKS_STATUS_OK)
        return HKS_ERROR_INTERNAL_UNKOWN;

    return HKS_STATUS_OK;
}
           

檢查緩沖區資料初始化的參數

基于hks_chk_init_buf_data_para函數實作上述功能,

參數詳解:

  • data_type :資料類型
  • buf :緩沖區
  • buf_len :緩沖區的長度

傳回值:成功值或者失敗代碼

//用來檢查緩沖區資料初始化的參數
static int32_t hks_chk_init_buf_data_para(uint8_t data_type, const uint8_t *buf, uint32_t buf_len)
{
    if (buf == NULL) {
        log_error("invalid buf");
        return HKS_ERROR_NULL_POINTER;
    } //檢查緩沖區是否為空

    if ((data_type > HKS_INIT_DATA_TYPE_MAX) || (buf_len == 0)) {
        log_error("invalid para,data_type=%u,buf_len=%u", data_type,
            buf_len);
    //檢查資料類型和混緩沖區長度
        return HKS_ERROR_INVALID_ARGUMENT;
    }

    return HKS_STATUS_OK;
}
           

初始化緩沖區資料

hks_init_buf_data函數用來初始化buf_data中資料。

參數詳解:

  • data_type :資料類型
  • buf :緩沖區
  • buf_len :緩沖區的長度
int32_t hks_init_buf_data(uint8_t data_type, uint8_t *buf, uint32_t buf_len)
{
    int32_t rc = hks_chk_init_buf_data_para(data_type, buf, buf_len);

    if (rc != HKS_STATUS_OK)
        return rc;

    if (data_type == HKS_INIT_DATA_TYPE_ALL_ZERO) {
        (void)memset_s(buf, buf_len, 0, buf_len);
        //初始化為全0
    } else if (data_type == HKS_INIT_DATA_TYPE_ALL_ONE) {
        (void)memset_s(buf, buf_len, 0xFF, buf_len);
        //初始化為全1
    } else {
        /* random data */
        rc = hks_gen_random(buf, buf_len);//初始化為随機值
    }

    return rc;
}
           

申請并且初始化記憶體

hks_malloc_init_ptr函數基于malloc來申請斌初始化申請的記憶體空間

參數解釋

  • size:索要申請的記憶體空間大小
  • ptr:輸出的指針
//申請并初始化記憶體空間
int32_t hks_malloc_init_ptr(uint32_t size, uint8_t **ptr)
{
    if (ptr == NULL)
        return HKS_ERROR_NULL_POINTER;
    if (size == 0)
        return HKS_ERROR_INVALID_ARGUMENT;
    //先檢查傳入的參數是否合理
    *ptr = (uint8_t *)HKS_MALLOC(size);
    //申請空間
    if (*ptr == NULL)
        return HKS_ERROR_INSUFFICIENT_MEMORY;
    //檢查是否申請成功
    if (memset_s(*ptr, size, 0, size) != EOK) {
        //初始化記憶體空間,否則就釋放
        hks_free_ptr(*ptr);
        return HKS_ERROR_BAD_STATE;
    }
    return HKS_STATUS_OK;
    //傳回狀态值
}
           

摧毀hks_blob

這個函數主要用來釋放blob->data所指向的記憶體空間。

void hks_blob_destroy(struct hks_blob *blob)
{
    if (blob == NULL)
        return;
    if (blob->size == 0)
        return;
    //檢查傳入的參數合理性

    if (blob->data != NULL) {
        (void)memset_s(blob->data, blob->size, 0, blob->size);
        hks_free_ptr(blob->data);
    //如果blob->data指向的内容不為空,先初始化其中内容為0,然後就釋放所指向的空間,
    }

    blob->size = 0;
    blob->type = HKS_BLOB_TYPE_RAW;
    //重置相關屬性值
}
           

三、總結

以上就是hks_common.c的第一部分内容,分析了一些相關函數的定義和參數的解釋。後面會分析剩餘的内容,感謝閱讀點贊。

繼續閱讀