OpenHarmony深度解读之分布式软总线:authmanager模块(5)/设备身份认证过程

一、概述

本文将继续介绍设备之间的身份认证过程的相关细节,关于加密数据包的不同类型的处理。本文主要分析数据包类型为MODULE_TRUST_ENGINE的处理过程。源代码主要位于wifi_auth_manager.c文件的函数OnModuleMessageReceived()中。

二、源码分析

  1. 如果数据包类型为MODULE_TRUST_ENGINE且数据包头部flags字段为FLAG_REPLY,则调用函数OnMsgOpenChannelReq()进行处理。
scss 复制代码
/*
函数功能:处理对端设备发来的请求消息并做相应回复
函数参数:
    conn:设备连接信息
    seq:数据包序列号
    msg:cJSON格式的数据负载
函数返回值:无
详细:
*/
void OnMsgOpenChannelReq(AuthConn *conn, long long seq, const cJSON *msg)
{
    int ret = MsgGetDeviceIdUnPack(msg, conn);//解析消息获取设备id(deviceId)和认证id(authId)保存在conn中
    if (ret != 0) {
        CloseConn(conn);
        return;
    }
#ifdef SOFTBUS_DEBUG
    if (strcpy_s(g_peerAuthId, MAX_AUTH_ID_LEN, conn->authId) != EOK) {
        SOFTBUS_PRINT("[AUTH] OnMsgOpenChannelReq save peer auth id fail\n");
    }
#endif
    DeviceInfo *localDevInfo = BusGetLocalDeviceInfo();//获取本地设备信息
    if (localDevInfo == NULL) {
        CloseConn(conn);//关闭连接
        return;
    }
    cJSON *reply = MsgGetDeviceIdPack(localDevInfo);//将deviceId打包成cJSON格式的Get消息作为回复消息
    if (reply == NULL) {
        CloseConn(conn);//关闭连接
        SOFTBUS_PRINT("[AUTH] OnMsgOpenChannelReq pack reply fail\n");
        return;
    }
    ret = AuthConnPostMessage(conn->fd, MODULE_TRUST_ENGINE, FLAG_REPLY, seq, reply);//构造/封装身份认证Post消息并发送给对端,MODULE_TRUST_ENGINE表示可信设备(暂定)
    if (ret != 0) {
        SOFTBUS_PRINT("[AUTH] OnMsgOpenChannelReq post msg fail\n");
        CloseConn(conn);//关闭连接
    }
    cJSON_Delete(reply);
    SOFTBUS_PRINT("[AUTH] OnMsgOpenChannelReq ok\n");
}
  1. 下面再详细分析函数OnMsgOpenChannelReq()的处理过程,首先在MsgGetDeviceIdUnPack函数中解析消息获取设备id(deviceId)和认证id(authId)保存在conn中。
c 复制代码
/*
函数功能:解析消息获取设备id(deviceId)和认证id(authId)
函数参数:
    msg:接收到的cJSON消息
    conn:认证设备连接信息
    cmd:命令
函数返回值:
    成功:返回0
    失败:返回-1
详细:
*/
static int MsgGetDeviceIdunpack(const cJSON *msg, AuthConn *conn, const char *cmd)
{
    char *msgCmd = GetJsonString(msg, CMD_TAG);//获取消息中键为CMD_TAG的值
    char *msgData = GetJsonString(msg, DATA_TAG);//获取消息中键为DATA_TAG的值
    char *msgAuthId = GetJsonString(msg, DEVICEID_TAG);//获取消息中键为DEVICEID_TAG的值
    if (msgCmd == NULL || msgData == NULL || msgAuthId == NULL) {//若数据包不合法,则返回-1
        return -1;
    }
    if (strcmp(msgCmd, cmd) != 0) {//如果消息中命令与传入的命令不符,则返回-1
        return -1;
    }
    if (strcpy_s(conn->deviceId, sizeof(conn->deviceId), msgData) != EOK) {//将消息中的msgData拷贝给认证设备连接的设备id
        return -1;
    }
    if (strcpy_s(conn->authId, sizeof(conn->authId), msgAuthId) != EOK) {//将消息中的msgAuthId拷贝给认证设备连接的认证id
        return -1;
    }
    return 0;
}
/*函数功能:解析消息获取设备id(deviceId)和认证id(authId)*/
int MsgGetDeviceIdUnPack(const cJSON *msg, AuthConn *conn)
{
    if (msg == NULL || conn == NULL) {
        return -1;
    }
    int ret = MsgGetDeviceIdunpack(msg, conn, CMD_GET_AUTH_INFO);
    if (ret != 0) {
        return -1;
    }
    return 0;
}

DD一下: 欢迎大家关注公众号<程序猿百晓生>,可以了解到一下知识点。

erlang 复制代码
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......
  1. 然后在函数MsgGetDeviceIdPack()中,将deviceId打包成cJSON格式的Get消息作为回复消息。
arduino 复制代码
/*函数功能:将deviceId打包成json格式的Get消息*/
cJSON *MsgGetDeviceIdPack(const DeviceInfo *devInfo)
{
    if (devInfo == NULL) {
        return NULL;
    }
    return MsgGetDeviceIdpack(devInfo, CMD_RET_AUTH_INFO);
}
/*
函数功能:将deviceId打包成json格式的Get消息
函数参数:
    devInfo:本地设备信息
    cmd:Get命令内容
函数返回值:
    成功:返回封装好的cJSON格式的消息
    失败:返回NULL
详细:
*/
static cJSON *MsgGetDeviceIdpack(const DeviceInfo *devInfo, const char *cmd)
{
    cJSON *msg = cJSON_CreateObject();//创建一个cJSON对象
    if (msg == NULL) {
        return NULL;
    }
    if (cJSON_AddStringToObject(msg, CMD_TAG, cmd) == NULL) {//添加一个string类型的成员到cJSON对象msg中,键为CMD_TAG,值为传入cmd的值
        cJSON_Delete(msg);
        return NULL;
    }
    if (cJSON_AddStringToObject(msg, DATA_TAG, devInfo->deviceId) == NULL) {//添加一个string类型的成员到cJSON对象msg中,键为DATA_TAG,值为deviceId
        cJSON_Delete(msg);
        return NULL;
    }
    return msg;
}
  1. 最后在AuthConnPostMessage()函数中,构造/封装身份认证Post消息并发送给对端,MODULE_TRUST_ENGINE表示可信设备。
arduino 复制代码
/*
函数功能:构造/封装身份认证Post消息并发送给对端
函数参数:
    fd:通信fd
    module:数据包类型
    flags:消息类型标记
    seqNum:数据包序列号
    msg:cJSON格式的数据负载
函数返回值:
    成功:返回0
    失败:返回-1
详细:
*/
int AuthConnPostMessage(int fd, int module, int flags, long long seqNum, const cJSON *msg)
{
    if (msg == NULL) {
        return -1;
    }
    char *msgStr = cJSON_PrintUnformatted(msg);//将cJSON对象输出为无格式的字符串
    if (msgStr == NULL) {
        return -1;
    }
    int ret = AuthConnPostBytes(fd, module, flags, seqNum, msgStr);//按字节构造身份认证连接的POST消息并通过TCP协议发送
    free(msgStr);
    msgStr = NULL;
    return ret;
}
相关推荐
lbb 小魔仙12 分钟前
【Harmonyos】开源鸿蒙跨平台训练营DAY9:获取分类数据并渲染
flutter·华为·harmonyos
mocoding20 分钟前
Flutter 3D 翻转动画flip_card三方库在鸿蒙版天气预报卡片中的实战教程
flutter·3d·harmonyos
2501_920931701 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
qq_177767373 小时前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos
烬头88213 小时前
React Native鸿蒙跨平台应用实现了onCategoryPress等核心函数,用于处理用户交互和状态更新,通过计算已支出和剩余预算
前端·javascript·react native·react.js·ecmascript·交互·harmonyos
小雨青年4 小时前
鸿蒙 HarmonyOS 6 | 系统能力 (06) 构建现代化通知体系 从基础消息到实况
华为·harmonyos
木斯佳5 小时前
HarmonyOS 6实战(源码解析篇):音乐播放器的音频焦点管理(上)——AudioSession与打断机制
华为·音视频·harmonyos
2601_949593655 小时前
基础入门 React Native 鸿蒙跨平台开发:卡片组件
react native·react.js·harmonyos
jkyy20146 小时前
健康座舱:健康有益赋能新能源汽车开启移动健康新场景
人工智能·物联网·汽车·健康医疗
qq_177767376 小时前
React Native鸿蒙跨平台剧集管理应用实现,包含主应用组件、剧集列表、分类筛选、搜索排序等功能模块
javascript·react native·react.js·交互·harmonyos