一、概述
在上一篇博客中提到,服务端针对客户端发起的end请求,作出了end响应,因此,本文将介绍客户端接收到end响应之后的处理过程。
二、源码分析
这一模块的源码位于:/base/security/deviceauth。
1. 首先执行parse_pake_server_confirm函数解析响应消息。
/*
函数功能:解析服务端confirm消息负载
函数参数:
payload:消息负载
data_type:数据类型
函数返回值:
返回pake_end_response_data结构的confirm数据
*/
void *parse_pake_server_confirm(const char *payload, enum json_object_data_type data_type)
{
struct pake_end_response_data *pake_server_confirm =
(struct pake_end_response_data *)MALLOC(sizeof(struct pake_end_response_data));//申请pake_end_response_data结构体空间
if (pake_server_confirm == NULL) {
return NULL;
}
(void)memset_s(pake_server_confirm, sizeof(*pake_server_confirm), 0, sizeof(*pake_server_confirm));//清空该空间
json_handle obj = parse_payload(payload, data_type);//如果消息负载为json格式的字符串,则将json格式的数据解析成cjson结构体对象
if (obj == NULL) {
LOGE("Parse Pake Server Confirm parse payload failed");
goto error;
}
/* kcfData */
int32_t result = byte_convert(obj, FIELD_KCF_DATA, pake_server_confirm->kcf_data.hmac,
(uint32_t *)&pake_server_confirm->kcf_data.length, HC_HMAC_LEN);//获取kcfData,字节转换函数,将十六进制字符串转换为byte数组
if (result != HC_OK) {
LOGE("Parse Auth ACK Request Data failed, field is null in addId");
goto error;
}
free_payload(obj, data_type);
return (void *)pake_server_confirm;//返回最终解析结果
error:
free_payload(obj, data_type);
F