一、概述
本文将继续介绍服务端响应pake协议的start请求的过程,承接上文:OpenHarmony解读之设备认证:pake协议-服务端响应pake start请求(1)。
二、源码分析
这一模块的源码位于:/base/security/deviceauth。
1. 在上文中创建完pake服务端对象之后,开始进入消息处理阶段,根据协议模块字段在全局分布式消息表中查询对应的消息处理函数,此处应该是proc_pake_request_message函数。
/*
函数功能:处理pake请求消息
函数参数:
handle:hichain实例
nav:消息头分析导航
receive:接收的消息
send:待发送消息地址
函数返回值:
成功:0
失败:error
*/
static int32_t proc_pake_request_message(struct hichain *handle, struct header_analysis *nav,
struct message *receive, struct message *send)
#if !(defined(_CUT_PAKE_) || defined(_CUT_PAKE_SERVER_))
{
DBG_OUT("Object %u proc pake %d request message", pake_server_sn(handle->pake_server), nav->msg_type);
int32_t ret;
if (nav->msg_type == PAKE_START_MSG) {
//如果是start请求
ret = send_pake_start_response(handle->pake_server, receive, send);//针对start请求构造发送响应消息
} else if (nav->msg_type == PAKE_END_MSG) {
//如果是end请求
ret = send_pake_end_response(handle->pake_server, receive, send);//针对end请求发送响应消息
if (ret == HC_OK) {
handle->cb.set_session_key(&handle->identity, &handle->pake_server->service_key);//设置会话密钥为service_key
(void)memset_s(handle->pake_server->service_key.session_key, HC_SESSION_KEY_LEN, 0, HC_SESSION_KEY_LEN);//清空会话密钥空间
}
} else {
return HC_UNKNOW_MESSAGE;
}
return ret;
}
2. send_pake_start_response函数,构造针对start请求发送响应消息。
/*
函数功能:构造针对start请求发送响应消息
函数参数:
pake_server:pake服务端对象
receive:接收消息地址
send:待发送消息缓冲区
函数返回值:
成功:0
失败:error
*/
int32_t send_pake_start_response(struct pake_server *pake_server, struct message *receive, struct message *send)
{
check_ptr_return_val(pake_server, HC_INPUT_ERROR);//检查参数有效性
check_ptr_return_val(receive, HC_INPUT_ERROR);
check_ptr_return_val(send, HC_INPUT_ERROR);
DBG_OUT("Receive pake start request message object %u success", pake_server_sn(pake_server));
struct pake_start_request_data *receive_data = receive->payload;//获取start请求数据
struct pake_start_response_data *send_data =
(struct pake_start_response_data *)MALLOC(sizeof(struct pake_start_response_data));//申请发送缓冲区空间
if (send_data == NULL) {
LOGE("Malloc struct pake_start_response_data failed");
send->msg_code = INFORM_MESSAGE;
return HC_MALLOC_FAILED;
}
(void)memset_s(send_data, sizeof(*send_data), 0, sizeof(*send_data));//清空该空间
int32_t ret = send_start_response(pake_server, receive_data, send_data);//构造start请求响应消息
if (ret != HC_OK) {
LOGE("Object %u called send_start_response failed, error code is %d", pake_server_sn(pake_server), ret);
FREE(send_data