一、概述
上一篇博客 OpenHarmony解读之设备认证:数据接收管理-获取HiChain实例(2)介绍的主要内容是构建本端的长期保存的密钥对,即重点是对函数build_self_lt_key_pair的总体分析,在上文中讲到该函数通过回调函数的方式调用位于分布式软总线模块的AuthGetProtocolParams函数进行协议参数的获取,主要是获取密钥长度、对端认证id和本端认证id。本文将继续分析build_self_lt_key_pair函数的其余内容。
二、源码分析
这一模块的源码位于:/base/security/deviceauth。
- 继上文,如果在函数AuthGetProtocolParams中成功获取到本端认证id,则将继续处理,否则就返回。在成功获取到本端认证id的情况下,接着调用generate_service_id函数进行处理,该函数的具体分析如下:
/*
函数功能:利用会话标识符的HC包名称和HC服务类型通过sha256哈希算法计算出哈希值,作为服务id
函数参数:
identity:会话标识,包括会话id、HC包名称、HC服务类型以及上下文信息
函数返回值:
成功:返回赋值后的服务id结构体
失败:返回空的服务id结构体
详细:
//服务id结构:
struct service_id {
uint32_t length;//长度
uint8_t service_id[HC_SERVICE_ID_BUFF_LEN];//服务id数组
};
//sha256哈希值结构:
struct sha256_value {
uint32_t length;//长度
uint8_t sha256_value[HC_SHA256_LEN];//value
};
*/
struct service_id generate_service_id(const struct session_identity *identity)
{
struct service_id service_id;//定义一个service_id局部变量
(void)memset_s(&service_id, sizeof(service_id), 0, sizeof(service_id));//清空service_id地址空间
if (identity == NULL) {
//参数有效性检查
LOGE("Input is null");
return service_id;
}
uint32_t pack_name_len = identity->package_name.length;//获取HC包名称长度
if ((pack_name_len == 0) || (pack_name_len > HC_PACKAGE_NAME_BUFF_LEN)) {
//若长度为0或者HC_PACKAGE_NAME_BUFF_LEN,则直接返回空service_id
LOGE("Pack name length is: %u", pack_name_len)<