文章目錄
- 安全密鑰庫子產品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的第一部分内容,分析了一些相關函數的定義和參數的解釋。後面會分析剩餘的内容,感謝閱讀點贊。