OpenHarmony深度解读之设备认证:HiChain机制部分源码解析1
一、概述
HiChain机制是OpenHarmony实现设备互联安全的一种协议机制,本文将对软总线模块涉及到的相关HiChain的接口进行一个简单的分析。处理逻辑是承接上文 OpenHarmony深度解读之分布式软总线:authmanager模块(3)/设备身份认证过程。
二、源码分析
- 在之前的文章的源码分析中,首先判断了数据包的module字段如果是MODULE_AUTH_SDK,就调用AuthProcessReceivedData函数继续处理,该函数如下:
/*函数功能:处理身份认证过程中接收到的数据函数参数: sessionId:会话id data:数据负载部分首地址 dataLen:数据长度函数返回值:无详细:*/static void AuthProcessReceivedData(uint32_t sessionId, const char *data, int dataLen){ if (g_hcHandle == NULL) {//如果hichain实例对象为空,则进行初始化 if (AuthInitHiChain(sessionId) != 0) {//初始化HiChain AuthDelAuthSessionBySessionId(sessionId);//根据sessionId删除该认证会话 return; } } struct uint8_buff request = {(uint8_t *)data, dataLen, dataLen};//封装request数据 if (receive_data(g_hcHandle, &request) != HC_OK) {//在其他模块继续处理该数据包 return; }}
- 在AuthProcessReceivedData函数中,首先进行HiChain的初始化,在函数AuthInitHiChain中实现,代码分析如下:
/*函数功能:在身份认证过程中,初始化HiChain函数参数: sessionId:会话id函数返回值: 成功:返回0 失败:返回-1*/static int AuthInitHiChain(uint32_t sessionId){ SOFTBUS_PRINT("[AUTH] AuthInitHiChain begin\n"); struct session_identity serverIdentity = { sessionId, {AUTH_DEFAULT_ID_LEN, AUTH_DEFAULT_ID},//hc包名称 {AUTH_DEFAULT_ID_LEN, AUTH_DEFAULT_ID},//hc服务类型 0 }; struct hc_call_back hiChainCallback = {//初始化hc_call_back回调函数结构体 AuthOnTransmit, AuthGetProtocolParams, AuthSetSessionKey, AuthSetServiceResult, AuthConfirmReceiveRequest }; g_hcHandle = get_instance(&serverIdentity, HC_ACCESSORY, &hiChainCallback);//获取hichain实例 if (g_hcHandle == NULL) { return -1; } SOFTBUS_PRINT("[AUTH] AuthInitHiChain ok\n"); return 0;}
- 位于/base/security/deviceauth模块的get_instance函数分析:
/*函数功能:获取hichain实例函数参数: identity:会话基本信息 type:hichain设备类型 call_back:hichain回调函数函数返回值: 成功:返回hichain结构体地址 失败:返回NULL*/DLL_API_PUBLIC hc_handle get_instance(const struct session_identity *identity, enum hc_type type, const struct hc_call_back *call_back){ LOGI("Begin get instance"); if (check_identity(identity) != HC_OK) {//检查hc的基本信息是否符合规范 LOGE("Identity error"); return NULL; } if (check_call_back(call_back) != HC_OK) {//检查callback结构体的函数指针是否为空 LOGE("Call back error"); return NULL; }#if !(defined(_CUT_STS_) || defined(_CUT_STS_SERVER_) || defined(_CUT_EXCHANGE_) || defined(_CUT_EXCHANGE_SERVER_)) int32_t ret = key_info_init();//初始化密钥信息 if (ret != HC_OK) { LOGE("Call key info init failed, status=%d", ret); return NULL; }#endif struct hichain *hichain = (struct hichain *)MALLOC(sizeof(struct hichain));//定义一个hichain实例并为其申请空间 if (hichain == NULL) {//申请内存失败 LOGE("Alloc memory failed"); return NULL; } (void)memset_s(hichain, sizeof(*hichain), 0, sizeof(*hichain));//清空该实例空间 //初始化该hichain实例对象的相关属性 hichain->identity = *identity;//hichain基本信息 hichain->type = type;//hichain设备类型 hichain->state = INIT_STATE;//hichain状态 hichain->last_state = INIT_STATE;//hichain最终状态 hichain->cb = *call_back;//hichain回调函数#if !(defined(_CUT_STS_) || defined(_CUT_STS_SERVER_) || defined(_CUT_EXCHANGE_) || defined(_CUT_EXCHANGE_SERVER_)) build_self_lt_key_pair(hichain);#endif LOGI("Get instance success"); return hichain;}
- 初始化HiChain之后,再继续调用/base/security/deviceauth模块的receive_data函数进行数据处理。
对于receive_data函数的具体内容,涉及到大量的HiChain模块的内容,由于篇幅有限,将在接下来的文章中继续分析,敬请期待。