security_huks模块下hks_rkc.c代码评注第五部分
本篇概述
本篇是接着:
- security_huks模块下hks_rkc.c代码评注第一部分
- security_huks模块下hks_rkc.c代码评注第二部分
- security_huks模块下hks_rkc.c代码评注第三部分
- security_huks模块下hks_rkc.c代码评注第四部分
在讲解完关密钥获取以及写所有密钥库文件的相关函数后,本篇将继续讲述hks_rkc.c代码中有关密钥的生成、为密钥加掩码、密钥内存的恢复相关操作。
代码框架
hks_rkc.c
├── 密钥加密、生成与掩码
│ └── hks_rkc_mk_crypt
│ └── hks_rkc_mask_mk
│ └── hks_rkc_make_mk
│ └── hks_rkc_create_ksf
├── 密钥内存恢复
│ └── hks_rkc_recover_mk_mem
│ └── hks_rkc_recover_rk_mem
│ └── hks_rkc_load_ksf
密钥加密、生成与掩码
1. hks_rkc_mk_crypt
-
函数功能:为主密钥做加密操作
root key component - do crypt operation for master key -
参数说明:为密钥库文件载入的数据、主密钥对应明文(输入输出)、主密钥对应密文(输入输出)、操作(包含根密钥组件的加密与解密)
parameter:
ksf_data - [in] - the data which loaded from keystore file.
plaintext - [in,out] - the plaintext of master key
ciphertext - [in,out] - the ciphertext of master key
operation - [in] - operation, HKS_RKC_ENCRYPT or HKS_RKC_DECRYPT. -
返回值:成功或错误代码
return value:
success or error code
详细代码及评注如下:
static int32_t hks_rkc_mk_crypt(struct hks_rkc_ksf_data *ksf_data,
struct hks_blob *plaintext, struct hks_blob *ciphertext,
uint8_t operation)
{
//为根主密钥开辟存储空间
uint8_t *rmk = (uint8_t *)HKS_MALLOC(HKS_RKC_RMK_LEN);
//检查是否成功开辟空间
if (rmk == NULL) {
log_error("malloc rmk fail");
return HKS_ERROR_MALLOC_FAIL;
}
int32_t rc;
do {
//获取派生根主密钥,将根主密钥存放在rmk中
rc = hks_rkc_derive_rmk(ksf_data, rmk, HKS_RKC_RMK_LEN);
if (rc != HKS_STATUS_OK)
break;
//创建变量key,内部存放根主密钥数据
struct hks_blob key = {
HKS_BLOB_TYPE_KEY, rmk, HKS_RKC_RMK_EK_LEN };
//创建密钥参数、aead数据等变量
size_t output_len = 0;
struct hks_key_param key_param;
struct hks_aead_data aead_data;
//将key_param、aead_data的内存数据初始化为0
(void)memset_s(&key_param, sizeof(key_param), 0, sizeof(key_param));
(void)memset_s(&aead_data, sizeof(aead_data), 0, sizeof(aead_data));
//将一系列默认参数,与明文密文信息写入
key_param.key_len = HKS_MAX_KEY_LEN_256;
key_param.key_type = HKS_KEY_TYPE_AES;
key_param.key_mode = HKS_ALG_GCM;
aead_data.nonce = ksf_data->mk_iv;
aead_data.nonce_length = HKS_RKC_MK_IV_LEN;
aead_data.additional_data = g_hks_rkc_mk_add_data;
aead_data.additional_data_length = HKS_RKC_MK_ADD_DATA_LEN;
aead_data.ciphertext = ciphertext->data;
aead_data.ciphertext_length = ciphertext->size;
aead_data.plaintext = plaintext->data;
aead_data.plaintext_length = plaintext->size;
//依据传入参数operation来决定是进行主密钥对应密文的加密还是解密
if (operation == HKS_RKC_ENCRYPT) {
//调用aead算法加密
rc = hks_mbedtls_aead_encrypt(&key, &key_param,
&aead_data, &output_len);
} else if (operation == HKS_RKC_DECRYPT) {
//调用aead算法解密
rc = hks_mbedtls_aead_decrypt(&key, &key_param,
&aead_data, &output_len);
} else {
//错误操作判定
log_error("invalid operation=%u", operation);
rc = HKS_ERROR_INVALID_ARGUMENT;
break;
}
if (rc != HKS_STATUS_OK) {

本文详细介绍了security_huks模块下hks_rkc.c的代码,涉及密钥加密、生成、掩码以及内存恢复等核心操作。首先,`hks_rkc_mk_crypt`用于主密钥的加密和解密;`hks_rkc_mask_mk`执行主密钥的掩码操作;`hks_rkc_make_mk`生成主密钥;`hks_rkc_create_ksf`创建密钥库文件。接着,`hks_rkc_recover_mk_mem`和`hks_rkc_recover_rk_mem`分别用于主密钥和根密钥的内存恢复;`hks_rkc_load_ksf`负责加载密钥库文件。这些功能确保了密钥的安全管理和高效使用。
最低0.47元/天 解锁文章
880

被折叠的 条评论
为什么被折叠?



