一、概述
上文讲到,客户端设备向服务端设备发起认证start请求,本文将介绍服务端接收到请求消息后的处理过程以及如何响应客户端。
二、源码分析
这一模块的源码位于:/base/security/deviceauth。
1. 首先根据消息码字段查表得到对应解析函数parse_auth_start_request,解析认证start请求消息。
/*
函数功能:解析认证start请求消息
函数参数:
payload:消息负载
data_type:数据类型
函数返回值:
成功:返回解析出来的数据结构
失败:NULL
*/
void *parse_auth_start_request(const char *payload, enum json_object_data_type data_type)
{
struct sts_start_request_data *auth_start_request =
(struct sts_start_request_data *)MALLOC(sizeof(struct sts_start_request_data));//申请sts_start_request_data结构体空间保存解析的数据
if (auth_start_request == NULL) {
return NULL;
}
(void)memset_s(auth_start_request, sizeof(*auth_start_request), 0, sizeof(*auth_start_request));//清空该空间
json_pobject obj = parse_payload(payload, data_type);//如果消息负载为json格式的字符串,则将json格式的数据解析成cjson结构体对象
if (obj == NULL) {
LOGE("Parse Auth Start Request parse payload failed");
goto error;
}
/* op */
int32_t op = get_json_int(obj, FIELD_OPERATION_CODE);//获取操作码
if (op == -1) {
LOGE("Parse Auth Start Request failed, field is null in operationCode");
goto error;
}
auth_start_request->operation_code = op;
/* challenge */
int32_t result = byte_convert(obj, FIELD_CHALLENGE, auth_start_request->challenge.challenge,
&auth_start_request->challenge.length, CHALLENGE_BUFF_LENGTH);//获取challenge值
if (result != HC_OK) {
LOGE("Parse Add AuthInfo Data failed, field is null in challenge");
goto error;
}
/* epk */
result = byte_convert(obj, FIELD_EPK, (uint8_t *)auth_start_request->epk.stpk,
&auth_start_request->epk.length, HC_ST_PUBLIC_KEY_LEN);//获取epk
if (result != HC_OK) {
LOGE("Parse Add AuthInfo Data failed, field is null in epk");
goto error;
}
/* pkgName */
(void)string_convert(obj, FIELD_PKG_NAME, (uint8_t *)auth_start_request->package_name.name,
&auth_start_request->package_name.length, HC_PACKAGE_NAME_BUFF_LEN);//获取pkgName
/* peerAuthId */
(void)byte_convert(obj, FIELD_PEER_AUTH_ID, (uint8_t *)auth_start_request->self_auth_id.auth_id,
&auth_start_request->self_auth_id.length, HC_AUTH_ID_BUFF_LEN);//获取peerAuthId
/* peerUserType */
int peer_user_type = get_json_int(obj, FIELD_PEER_USER_TYPE);//获取peerUserType
auth_start_request->peer_user_type = peer_user_type;
/* version */
json_pobject obj_ver = get_json_obj(obj, FIELD_VERSION);//获取version
bool ret = parse_version(obj_ver, &auth_start_request->peer_version, &auth_start_request->peer_support_version);//解析版本号
if (!ret) {
LOGE("Parse Auth Start Request, field is null in version");
goto error;
}
free_payload(obj, data_type);//释放负载空间
return (void *)auth_start_request;//返回解析出来的数据结构
error:
free_payload(obj, data_type);
FREE(auth_start_request);
return NULL;
}
2. 根据解析出的信息,调用build_sts_server_object函数创建sts服务端对象。
//创建sts服务端对象
static void *build_sts_server_object(struct hichain *hichain, const void *params)
{
(void)params;
struct hc_pin pin = {
0, {
0} };//定义并初始化PIN码
struct operation_parameter para;//定义操作参数
(void)memset_s(¶, sizeof(para), 0, sizeof(para));//清空操作参数空间
hichain->cb.get_protocol_params(&hichain->identity, hichain->operation_code, &pin, ¶);//获取协议参数,主要获取认证会话密钥长度、对端认证id和本端认证id
if (check_param_is_valid(¶) == false) {
//检查操作参数是否有效
LOGE("Protocol param invalid");
return NULL;
}
return build_sts_server(hichain, para.key_length, ¶.peer_auth_id, ¶.self_auth_id);//创建sts服务端对象
}
/*
函数功能:创建sts服务端对象
函数参数:
hichain_handle:hichain实例
key_length:密钥长度
client:客户端认证id
server:服务端认证id
函数返回值:
sts服务端对象
*/
struct sts_server *build_sts_server(const hc_handle hichain_handle, uint32_t key_length,
const struct hc_auth_id *client, const struct hc_auth_id *server)
{
struct sts_server *sts_server = (struct sts_server *)MALLOC(sizeof(struct sts_server));//为该sts服务端对象申请空间
if (sts_server == NULL) {
LOGE("Build sts server object failed");
return NULL;
}
(void)memset_s(sts_server, sizeof(*sts_server), 0, sizeof(*sts_server));//清空该空间
const struct server_virtual_func_group funcs = {
parse_start_request_data, build_start_response_data,
parse_end_request_data, build_end_response_data };//定义并初始化客户端虚函数组
init_server(&sts_server->ser