OpenHarmony解读之设备认证:sts协议-服务端响应sts start请求

本文详细介绍了OpenHarmony设备认证中,服务端接收sts start请求后,从解析请求到构建响应的整个过程,涉及源码分析,包括parse_auth_start_request、build_sts_server_object、proc_sts_request_message、send_sts_start_response等多个关键函数的调用,最终生成json格式的认证start响应消息。
摘要由CSDN通过智能技术生成

一、概述

上文讲到,客户端设备向服务端设备发起认证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(&para, sizeof(para), 0, sizeof(para));//清空操作参数空间
    hichain->cb.get_protocol_params(&hichain->identity, hichain->operation_code, &pin, &para);//获取协议参数,主要获取认证会话密钥长度、对端认证id和本端认证id
    if (check_param_is_valid(&para) == false) {
   //检查操作参数是否有效
        LOGE("Protocol param invalid");
        return NULL;
    }
    return build_sts_server(hichain, para.key_length, &para.peer_auth_id, &para.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
本课程针对鸿蒙认证HCIA-HarmonyOS Device Developer,完整细致讲解了官方培训教材,并且根据朱老师自己学习考证的过程,做了一些额外的补充讲解和扩展。 本课程适合有意向去考取鸿蒙认证设备开发的人。 1.华为认证体系(1)鸿蒙认证隶属于华为认证体系,官网:https://e.huawei.com/cn/talent/#/cert(2)华为认证全景图,见官网(3)华为认证三级证书等级:HCIA(工程师)、HCIP(高级工程师)、HCIE(行业专家) 2.鸿蒙认证体系(1)目前只有HCIA级别,2021.7.16左右首发(2)分HCIA-HarmonyOS Device Developer(考试代码H14-221)和HCIA-HarmonyOS Application Developer(考试代码H14-211)两个方向,本课程面向Device Developer方向。(3)按照华为一贯风格,HCIP-HarmonyOS会在半年到一年后推出(4)HCIE暂不可预计,但一定会出,因为HarmonyOS是华为重点战略,投入巨大,不可能随意放弃 3.鸿蒙认证含金量高不高,是否值得考?(1)华为认证已有20年历史,起家于网络ICT领域,效仿思科认证,到现在全球高度认可,超强背书(2)HarmonyOS认证是华为认证官方推出,权威性高,且是目前及很长一段时间唯一鸿蒙认证证书(3)朱老师亲身学习并考试验证,考试还是有一定难度,这保证了证书不会烂大街(4)HarmonyOS认证本身大纲设计优质,课件优秀,是学习鸿蒙系统的好资料 4.什么人适合考鸿蒙认证(1)出于工作需要或者个人兴趣,已经在学习鸿蒙的人。考个证傍身,反正要学不考白不考。(2)在学习嵌入式linux、单片机等技术,希望找这方面工作的人。鸿蒙认证可能是适合考证的唯一选择。(3)在软通动力、中软国际、润和软件等华为深度合作外包公司工作的人。(4)相关专业大学生。含金量的证书越多越有利于找工作、考研保研等竞争。 5.整个课程大概介绍(1)我的目标是沿着鸿蒙认证体系做下去,依次覆盖IA、IP、IE(2)本课程面向HCIA级别,Device方向,暂时只考虑做Device方向(3)本课程设计原则1:面向认证考试拿证(4)本课程设计原则2:系统学习并深入理解鸿蒙,顺便拿证。并为后续更高级别证书打下基础(5)本课程素材来源:一是鸿蒙认证官方资料、二是鸿蒙官网、三是朱老师根据自己学习经验和考试经验做的必要扩展外部资源。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值