前言

hks_rkc.c文件主要定义了根密钥组件和对主密钥的管理。密钥管理的目的是确保密钥的安全性,即密钥的真实性和有效性,进而来保证密码系统的安全性。

密钥分层管理

Huks密钥管理模块应该也是使用了多级密钥分层管理机制,这里简单介绍密钥的层级结构以及各层密钥。

密钥的层次结构:

系统使用主密钥来保护密钥加密密钥,再使用密钥加密密钥来保护会话密钥和初始密钥,最后用会话密钥来保护数据传输。在整个密钥的层次化结构中,各层密钥的使用都是由相应层次的密钥协议来控制。

密钥管理包括AH接收密钥 AH发送密钥 ESP接受密钥 ESP发送密钥哪个_密钥加密密钥

主密钥

主密钥对密钥加密密钥进行加密的密钥称为主密钥,它在密钥层次结构中处于最高层。一般用人工方式建立,用于对密钥加密密钥的保护,实现密钥加密密钥的在线分发。

密钥加密密钥

在密钥分配协议中对传送的会话密钥和初始密钥进行加密保护的密钥称为密钥加密密钥,也称为密钥传送密钥。它在密钥层次结构中位于中间,用于保护其下层的会话密钥和初始密钥的安全传输,实现会话密钥的在线分发,同时它本身又受到上层密钥即主密钥的保护。

初始化密钥

初始密钥也叫基本密钥,它由用户选定或由系统分配给用户,大多采用密钥生成算法产生。

会话密钥

会话密钥也称为数据密钥,是通信双方交换数据时使用的密钥。会话密钥一般在一次会话开始时根据需要通过协议自动生成,并在会话结束后立即销毁。

代码分析

数据结构

hks_rkc.h中主要数据结构有根密钥组件的配置、初始化参数、主密钥属性结构:

1 //根密钥组件配置结构
 2 struct hks_rkc_cfg {
 3   /* system state */
 4   uint8_t state;
 5   //根密钥组件版本
 6   uint16_t version;
 7   //根密钥组件存储形式
 8   uint8_t storage_type;
 9   //根密钥创建时间
10   struct hks_time rk_created_time;
11   //根密钥过期时间
12   struct hks_time rk_expired_time;
13   //密钥库文件属性
14   struct hks_rkc_ksf_attr ksf_attr;
15   /* the iterator number of times which derive Root Master Key */
16   //派生根主密钥的迭代器次数  
17   uint32_t rmk_iter;
18   //派生根主密钥的哈希算法  
19   uint32_t rmk_hash_alg;
20   /* external entropy */
21   uint8_t *entropy;
22   /* the length external entropy */
23   uint32_t entropy_len;
24   //主密钥掩码
25   uint8_t mk_mask[HKS_RKC_MK_LEN];
26   //主密钥加密算法
27   uint32_t mk_encrypt_alg;
28   //密钥加密密钥的哈希算法
29   uint32_t kek_hash_alg;
30   //用于密钥加密的密钥的迭代器编号
31   uint32_t kek_iter;
32   /* reserve data, 32 byte */
33   uint8_t reserve[HKS_RKC_CFG_RSV_LEN];
34 };
35 //根组件初始化结构
36 struct hks_rkc_init_para {
37   //根密钥组件版本
38   uint16_t version;
39   .//根密钥组件存储方式
40   uint8_t storage_type;
41   //密钥库属性文件
42   struct hks_rkc_ksf_attr ksf_attr;
43   // 派生根主密钥的迭代器次数
44   uint32_t rmk_iter;
45   //派生根主密钥的哈希算法  
46   uint32_t rmk_hash_alg;
47   /* external entropy, optionally, it could be empty */
48   uint8_t *entropy;
49   /* the length external entropy */
50   uint32_t entropy_len;
51   //主密钥加密算法
52   uint32_t mk_encrypt_alg;
53   //密钥加密密钥的哈希算法
54   uint32_t kek_hash_alg;
55   //用于密钥加密的密钥的迭代器编号
56   uint32_t kek_iter;
57 };
58 //主密钥
59 struct hks_rkc_mk {
60   /* 主密钥是否可用*/
61   uint8_t is_valid;
62   /* 主密钥创建时间 */
63   struct hks_time mk_created_time;
64   /* 主密钥过期时间 */
65   struct hks_time mk_expired_time;
66   /* 带mask的主密钥 */
67   uint8_t mk_with_mask[HKS_RKC_MK_LEN];
68 };

默认的根组件配置、默认初始化参数、主密钥属性:

1 /*
 2     根密钥组件存储形式为文件系统
 3     派生根主密钥的迭代器次数  = 1
 4     派生根主密钥的哈希算法 为使用SHA256构造的HMAC
 5     主密钥加密算法 AES256 GCM
 6     密钥加密密钥的哈希算法 为使用SHA256构造的HMAC
 7     迭代器编号 = 1
 8 */
 9 struct hks_rkc_cfg g_hks_rkc_cfg = { HKS_RKC_STATE_INIT, HKS_RKC_VER, HKS_RKC_STORAGE_FILE_SYS, { 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 },
10     { 0, { NULL, NULL } }, HKS_RKC_RMK_ITER, HKS_RKC_RMK_HMAC_SHA256,
11     NULL, 0, {0}, HKS_RKC_MK_CRYPT_ALG_AES256_GCM, HKS_RKC_RMK_HMAC_SHA256,
12     HKS_RKC_KEK_ITER, {0}
13 };
14 /*
15     默认初始化参数
16     版本 = 1
17     根密钥组件存储方式 文件存储
18     密钥库属性文件 数量为2 文件{ "info1.data", "info2.data" }
19     派生根主密钥的迭代器次数 1
20     派生根主密钥的哈希算法 使用SHA256构造的HMAC
21     主密钥加密算法 AES256 GCM
22     密钥加密密钥的哈希算法 为使用SHA256构造的HMAC
23     迭代器编号 = 1
24 */
25 const struct hks_rkc_init_para g_hks_rkc_def_init_para = {HKS_RKC_VER, 
26 HKS_RKC_STORAGE_FILE_SYS,
27  { HKS_RKC_KSF_NUM, { "info1.data", "info2.data" } },
28     HKS_RKC_RMK_ITER, HKS_RKC_RMK_HMAC_SHA256, NULL, 0,
29     HKS_RKC_MK_CRYPT_ALG_AES256_GCM, HKS_RKC_RMK_HMAC_SHA256,
30     HKS_RKC_KEK_ITER
31 };
32 /* 主密钥属性 包含主密钥可用性、创建时间,过期时间,掩码*/
33 struct hks_rkc_mk g_hks_rkc_mk = {
34     HKS_BOOL_FALSE, { 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 }, {0}
35 };