前言

在OpenHarmony中,设备互信认证模块作为安全子系统的子模块,负责设备间可信关系的建立、维护、使用、撤销等全生命周期的管理,实现可信设备间的互信认证和安全会话密钥协商,是搭载OpenHarmony的设备进行可信互联的基础平台能力。

简介

设备互信认证模块当前提供如下功能:

  • 设备互信关系管理功能:统一管理设备互信关系的建立、维护、撤销过程;支持各个业务创建的设备互信关系的隔离和可控共享。

  • 设备互信关系认证功能:提供认证设备间互信关系、进行安全会话密钥协商的能力,支持分布式软总线实现互信设备间的组网。

设备互信认证子系统架构

为实现上述功能,设备互信认证模块当前包含设备群组管理、设备群组认证和帐号无关点对点认证三个子模块,其部署逻辑如下图:

 

  • 设备群组管理服务:统一管理不同业务建立的本设备与其他设备间的互信关系,并对外提供设备互信关系的创建入口 ,完成信任建立后创建帐号无关设备群组,并将信任对象设备添加进群组;OpenHarmony上各业务可独立创建相互隔离的设备间可信关系。

  • 设备群组认证服务:支持已建立可信关系的设备间完成互信关系的认证及会话密钥的协商。

  • 帐号无关点对点设备互信认证:提供设备间基于共享秘密建立一对一互信关系的功能,并支持基于这种互信关系的认证密钥协商。 当前仅少量业务使用,作为过渡方案;新接入业务不允许使用

目录

/base/security/deviceauth ├── frameworks                   // 设备互信认证IPC代码 ├── interfaces                   // 对外接口目录 ├── test                         // 设备互信认证的接口测试用例 ├── common_lib                   // C语言公共基础库 ├── deps_adapter                 // 依赖组件适配器代码 │   ├── key_management_adapter   // 秘钥及算法适配层 │   └── os_adapter               // 系统能力适配层 └── services                     // 设备互信认证服务层代码    ├── frameworks               // 设备互信认证框架层代码    ├── data_manager             // 设备互信群组信息管理模块    ├── group_auth               // 设备群组认证服务    ├── group_manager           // 设备群组管理服务    ├── authenticators           // 认证执行模块(包括帐号无关点对点认证器)    └── protocol                 // 认证协议库

说明

设备互信认证组件中,设备群组管理服务负责将不同业务建立的设备间可信关系抽象成一个个可信群组,对外提供统一的接口,包含群组创建、删除、查询等功能;设备群组认证服务基于已经建立过可信关系的设备群组,提供设备可信认证与端到端会话密钥协商功能。

表 1 设备群组管理服务提供的API接口(DeviceGroupManager)功能介绍

接口名 描述
const DeviceGroupManager *GetGmInstance() 获取设备群组管理的实例。
int32_t RegCallback(const char *appId, const DeviceAuthCallback *callback) 注册业务的监听回调。
int32_t CreateGroup(int32_t osAccountId, int64_t requestId, const char *appId, const char *createParams) 创建一个可信设备群组。
int32_t DeleteGroup(int32_t osAccountId, int64_t requestId, const char *appId, const char *disbandParams) 删除一个可信设备群组。
int32_t AddMemberToGroup(int32_t osAccountId, int64_t requestId, const char *appId, const char *addParams) 添加成员到指定群组ID的可信设备群组。
int32_t DeleteMemberFromGroup(int32_t osAccountId, int64_t requestId, const char *appId, const char *deleteParams); 从指定可信设备群组里删除可信成员。
int32_t ProcessData(int64_t requestId, const uint8_t *data, uint32_t dataLen) 处理绑定或者解绑的数据。
int32_t GetGroupInfo(int32_t osAccountId, const char *appId, const char *queryParams, char **returnGroupVec, uint32_t *groupNum) 查询可信设备群组信息。

表 2 设备群组认证模块提供的API接口(GroupAuthManager)功能介绍

接口名 描述
const GroupAuthManager *GetGaInstance() 获取设备群组认证的实例。
int32_t AuthDevice(int32_t osAccountId, int64_t authReqId, const char *authParams, const DeviceAuthCallback *gaCallback) 认证可信设备。
int32_t ProcessData(int64_t authReqId, const uint8_t *data, uint32_t dataLen, const DeviceAuthCallback *gaCallback) 处理认证的数据。

设备群组认证服务

初始化

//base/security/deviceauth/interfaces/innerkits/device_auth.h typedef struct {     bool (*onTransmit)(int64_t requestId, const uint8_t *data, uint32_t dataLen);     void (*onSessionKeyReturned)(int64_t requestId, const uint8_t *sessionKey, uint32_t sessionKeyLen);     void (*onFinish)(int64_t requestId, int operationCode, const char *returnData);     void (*onError)(int64_t requestId, int operationCode, int errorCode, const char *errorReturn);     char *(*onRequest)(int64_t requestId, int operationCode, const char *reqParams); } DeviceAuthCallback;  typedef struct {     int32_t (*processData)(int64_t authReqId, const uint8_t *data, uint32_t dataLen,         const DeviceAuthCallback *gaCallback);     int32_t (*authDevice)(int32_t osAccountId, int64_t authReqId, const char *authParams,         const DeviceAuthCallback *gaCallback); } GroupAuthManager;
static GroupAuthManager *g_groupAuthManager =  NULL; InitDeviceAuthService();  //支持已建立可信关系的设备间完成互信关系的认证及会话密钥的协商 DEVICE_AUTH_API_PUBLIC const GroupAuthManager *GetGaInstance(void);//获取设备群组认证的实例

传输数据、认证服务与回调

//foundation/communication/dsoftbus/core/authentication/src/auth_hichain.c static DeviceAuthCallback g_hichainCallback = {    .onTransmit = OnTransmit,    .onSessionKeyReturned = OnSessionKeyReturned,    .onFinish = OnFinish,    .onError = OnError,    .onRequest = OnRequest };  //处理绑定过程中的报文数据,这是一个异步接口,如果处理成功,则会回调OnTransmit发送数据 int32_t ret = g_hichain->processData(authSeq, data, len, &g_hichainCallback);     if (ret != 0) {         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "hichain processData fail(err = %d).", ret);         return SOFTBUS_ERR;    } //....... //认证对端是否是可信设备,一般情况下,本接口仅由发起认证的client端调用  int32_t ret = g_hichain->authDevice(ANY_OS_ACCOUNT, authSeq, authParams, &g_hichainCallback);     if (ret != 0) {         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "hichain authDevice fail(err = %d).", ret);         cJSON_free(authParams);         return SOFTBUS_ERR;    }

回调

//将设备互信认证服务生成的报文传输到对端设备上 bool (*onTransmit)(int64_t requestId, const uint8_t *data, uint32_t dataLen); //当设备互信认证服务在绑定过程中可以通过该回调函数返回会话密钥sessionKey给业务 void (*onSessionKeyReturned)(int64_t requestId, const uint8_t *sessionKey, uint32_t sessionKeyLen); //当设备互信认证服务完成群组创建、删除、设备绑定、解绑、认证时,通知业务成功的结果 void (*onFinish)(int64_t requestId, int operationCode, const char *returnData); //当设备互信认证服务在群组创建、删除、设备绑定、解绑、认证过程中出现错误时,通知业务出现错误的结果 void (*onError)(int64_t requestId, int operationCode, int errorCode, const char *errorReturn); //当Server端的设备互信认证服务接收到了Client端发来的绑定或者解绑请求时,询问业务是否响应对端设备的这次交互请求, //如果响应则获取例如pinCode一类的流程必备信息 char *(*onRequest)(int64_t requestId, int operationCode, const char *reqParams);

设备群组管理服务

初始化

//base/security/deviceauth/interfaces/innerkits/device_auth.h typedef struct {     int32_t (*regCallback)(const char *appId, const DeviceAuthCallback *callback);     int32_t (*unRegCallback)(const char *appId);     int32_t (*regDataChangeListener)(const char *appId, const DataChangeListener *listener);     int32_t (*unRegDataChangeListener)(const char *appId);     int32_t (*createGroup)(int32_t osAccountId, int64_t requestId, const char *appId, const char *createParams);     int32_t (*deleteGroup)(int32_t osAccountId, int64_t requestId, const char *appId, const char *disbandParams);     int32_t (*addMemberToGroup)(int32_t osAccountId, int64_t requestId, const char *appId, const char *addParams);     int32_t (*deleteMemberFromGroup)(int32_t osAccountId, int64_t requestId, const char *appId,         const char *deleteParams);     int32_t (*processData)(int64_t requestId, const uint8_t *data, uint32_t dataLen);     int32_t (*processCredential)(int operationCode, const char *reqJsonStr, char **returnJsonStr);     int32_t (*getRegisterInfo)(char **returnRegisterInfo);     int32_t (*checkAccessToGroup)(int32_t osAccountId, const char *appId, const char *groupId);     int32_t (*getPkInfoList)(int32_t osAccountId, const char *appId, const char *queryParams, char **returnInfoList,         uint32_t *returnInfoNum);     int32_t (*getGroupInfoById)(int32_t osAccountId, const char *appId, const char *groupId, char **returnGroupInfo);     int32_t (*getGroupInfo)(int32_t osAccountId, const char *appId, const char *queryParams,         char **returnGroupVec, uint32_t *groupNum);     int32_t (*getJoinedGroups)(int32_t osAccountId, const char *appId, int groupType,         char **returnGroupVec, uint32_t *groupNum);     int32_t (*getRelatedGroups)(int32_t osAccountId, const char *appId, const char *peerDeviceId,         char **returnGroupVec, uint32_t *groupNum);     int32_t (*getDeviceInfoById)(int32_t osAccountId, const char *appId, const char *deviceId, const char *groupId,         char **returnDeviceInfo);     int32_t (*getTrustedDevices)(int32_t osAccountId, const char *appId, const char *groupId,         char **returnDevInfoVec, uint32_t *deviceNum);     bool (*isDeviceInGroup)(int32_t osAccountId, const char *appId, const char *groupId, const char *deviceId);     void (*destroyInfo)(char **returnInfo); } DeviceGroupManager;
static DeviceGroupManager *g_groupManagerInstance = NULL;  InitDeviceAuthService();  //统一管理不同业务建立的本设备与其他设备间的互信关系,并对外提供设备互信关系的创建入口 ,完成信任建立后创建帐号无关设备群组,并将信任对象设备添加进群组 DEVICE_AUTH_API_PUBLIC const DeviceGroupManager *GetGmInstance(void)//获取设备群组管理的实例

注册业务的监听回调

static DeviceAuthCallback g_hichainCallback = {    .onTransmit = OnTransmit,    .onSessionKeyReturned = OnSessionKeyReturned,    .onFinish = OnFinish,    .onError = OnError,    .onRequest = OnRequest };

注册消息监听回调

//base/security/deviceauth/interfaces/innerkits/device_auth.h typedef struct { void (*onGroupCreated)(const char *groupInfo); void (*onGroupDeleted)(const char *groupInfo); void (*onDeviceBound)(const char *peerUdid, const char *groupInfo); void (*onDeviceUnBound)(const char *peerUdid, const char *groupInfo); void (*onDeviceNotTrusted)(const char *peerUdid); void (*onLastGroupDeleted)(const char *peerUdid, int groupType); void (*onTrustedDeviceNumChanged)(int curTrustedDeviceNum); } DataChangeListener;
 DataChangeListener hichainListener; (void)memset_s(&hichainListener, sizeof(DataChangeListener), 0, sizeof(DataChangeListener)); hichainListener.onGroupCreated = OnGroupCreated; hichainListener.onGroupDeleted = OnGroupDeleted; hichainListener.onDeviceNotTrusted = OnDeviceNotTrusted; const DeviceGroupManager *gmInstance = GetGmInstance(); if (gmInstance == NULL) { SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "hichain GetGmInstance fail."); return SOFTBUS_ERR; } if (gmInstance->regDataChangeListener(AUTH_APPID, &hichainListener) != 0) { SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "hichain regDataChangeListener fail."); return SOFTBUS_ERR; } return SOFTBUS_OK;

HiChain设备互信认证面向解决的问题

正确的设备有四个维度:

  • 设备的生产源正确:解决设备来源的问题,证明设备出自合法的厂商。

  • 设备的安全等级正确:判定该设备的系统安全能力能提供什么级别的安全防护。

  • 设备的可信关系正确:所连接的设备是用户已建立可信关系的设备,并保证设备间传输的数据不泄露,防止与攻击者的非法设备建立连接,泄露用户数据。

  • 设备的安全状态可信:设备运行期的状态正确,没有受到入侵攻击或篡改。

HiChain设备互信认证对应的是以上第三个维度,证明设备间的可信关系正确,并提供基于可信关系的会话秘钥协商,以支撑设备间通信时的安全。

Hichain设备互信认证的能力演进

Hichain作为技术项目,已经演进到3.0版本。历史演进关系如下:

Hichain1.0能力在2019H1构建,为设备互联提供认证基础能力:设备间基于帐号的身份认证、以及帐号无关点对点绑定关系认证的能力,直接对业务提供能力与接口。

Hichain2.0能力在2019H2~2020构建。软总线此时作为鸿蒙分布式系统通信子系统基础能力,Hichain设备互信认证则需要为软总线提供统一认证连接、低时延认证能力。相比1.0版本的变化是,将具有不同类别可信关系的设备抽象为可信设备群组,对各种设备可信关系的认证提供归一化认证接口,可被软总线统一调用,并在内部处理上提升了认证性能,使分布式软总线在非首次认证时大幅度缩减时延。Hichain2.0的能力主要部署在富鸿蒙双框架设备上。

当前Hichain3.0归一化收编能力开发中。相较于Hichain2.0构建的能力,Hichain3.0将支撑软总线的群组管理、认证功能扩展到轻鸿蒙设备上。Hichain3.0设备认证服务收编了运动健康以及智慧生活的设备连接方案,部署了Hichain能力的IOT与运动健康新设备与富鸿蒙设备的连接都将采用国际标准化的认证协议。

HiChain设备互信认证对外提供的功能概述

  • 信任关系建立

同账号信任关系:HiChain设备认证服务支持基于同账号建立起设备的信任关系,这个场景当前主要涉及主动登陆华为账号的手机、平板、大屏、智能手表以及不能主动登陆账号但会登记到账号下的IOT设备等。

跨账号授权信任关系:HiChain设备认证服务同时支持不同账号下的设备建立起信任关系,需要业务触发并完成信任关系在HiChain的登记。

账号无关点对点信任关系:HiChain设备互信认证服务对外提供建立点对点可信关系的接口,在不依赖华为账号的场景下,设备间可建立点对点的可信关系。

  • 指定设备执行设备认证

Hichain设备互信认证服务管理着各种互信关系下的可信设备,同时作为设备互信关系认证的统一入口,支持软总线在设备发现、组网阶段和业务打开安全会话阶段的设备互信关系认证需求。

  • 账号身份关联的认证凭证:

    • 资源充足的设备会生成公私钥对并向服务器对公钥进行认证,将公钥与账号身份绑定在一起。

    • 资源紧张的设备会由云服务器生成设备唯一的对称密钥,并下发给设备。

  • 设备互信群组

同账号设备互信群组、跨账号设备互信群组、和账号无关点对点设备互信群组

typedef enum { ALL_GROUP = 0, IDENTICAL_ACCOUNT_GROUP = 1,//同帐号群组 PEER_TO_PEER_GROUP = 256, //帐号无关点对点群组 COMPATIBLE_GROUP = 512, //兼容群组,本质上是帐号无关点对点群组,当前仅少量业务使用,作为过渡方案;新接入业务不允许使用 ACROSS_ACCOUNT_AUTHORIZE_GROUP = 1282 // } GroupType;

当前Hichain仅开放仅帐号无关点对点群组的创建接口

同帐号设备互信群组生命周期

  • 任一主动登陆华为帐号的设备,都可以在帐号登陆的同时,本地创建同帐号可信设备群组;由于该群组在设备登录帐号时由Hichain自动生成,在登出帐号后自动删除,上层业务不需要关注同帐号可信关系的生命周期管理, 富鸿蒙设备上,同帐号设备互信群组的设备添加时机分为两种:

    • 其他登陆同帐号的设备会根据与认证结果动态地添加和删除;

    • 绑定到同帐号下的设备会根据Hichain从云端同步到的信息添加和删除。

  • 被绑定到帐号下的设备:完成设备绑定到帐号的过程之后,从云端同步归属帐号信息后创建。

跨帐号设备互信群组生命周期

跨帐号群组的创建时机,区分主动登陆帐号的设备侧和被帐号绑定的设备侧。

  • 主动登陆的设备侧:Hichain响应业务请求从云端本帐号可控制的设备凭据信息时,如果识别到存在其他帐号授权给本帐号的设备时,发起群组创建,并完成群组设备添加;

  • 被授权设备侧:Hichain响应业务请求从云端同步本设备的认证凭据信息时,如果识别到被授权给了其他帐号控制,则发起群组创建。 跨帐号设备互信群组也随端侧感知到授权关系在云端撤销而解除

流程

绑定调用流程

 

业务调用群组认证流程

 

DEMO(双L0设备间通过HiChain进行互信认证)

简介

在OpenHarmony中,由于L0设备的资源限制,L0设备间建立互信的关系,暂只支持HiChain账号无关点对点方式来建立设备互信认证。

两台L0设备建立认证后,获取认证所需的sessionKey,设备间的通信数据通过sessionKey进行加解密处理后,通过网络(wifi、wlan、bluetooth等)进行传输。

设备互信认证过程分为以下两步:

  • 设备绑定

  • 群组认证

设备绑定

Client发起绑定请求,Server端处理报文。

Client

1.初始化Hichain的服务,获取群组管理实例。

2.调用实例中的RegCallback方法,将业务实现的DeviceAuthCallback注册到群组管理中。

3.调用实例中的CreateGroup方法,创建点对点群组,等待OnFinish回调通知创建成功。

4.调用实例中的AddMemberToGroup方法,邀请对端设备加入本端创建的群组中。Hichain会组装绑定数据,当组装完毕时,会回调业务注册的OnTransmit方法。

5.绑定过程中Hichain会不断的调用业务注册的OnTransmit方法,将数据发送给对端设备,同时业务在接收到对端设备发来的数据时,也需要调用实例中的ProcessData方法,将数据传递给Hichain进行处理。注:整个绑定过程中两端业务使用的requestId必须保持一致,当下一次进行绑定请求时,requestId需要进行更新。

6.业务等待OnFinish回调通知绑定成功。

Server

1.初始化Hichain的服务,获取群组管理实例。

2.调用实例中的RegCallback方法,将业务实现的DeviceAuthCallback注册到群组管理中。

3.当接收到对端设备发来数据后,调用实例中的ProcessData方法,将数据传递给Hichain进行处理。注:整个绑定过程中两端业务使用的requestId必须保持一致,当下一次进行绑定请求时,requestId需要进行更新。

4.Hichain第一次处理绑定数据的时候,会调用业务注册的OnRequest方法,询问业务是否接受此次绑定请求,业务需要检查Hichain传入的此次绑定请求的相关信息是否与预期相符,然后下发PIN码以及一些其他参数。然后Hichain会继续处理绑定数据,当处理完毕时,会回调业务注册的OnTransmit方法。

5.绑定过程中Hichain会不断的调用业务注册的OnTransmit方法,将数据发送给对端设备,同时业务在接收到对端设备发来的数据时,也需要调用实例中的ProcessData方法,将数据传递给Hichain进行处理。注:整个绑定过程中两端业务使用的requestId必须保持一致,当下一次进行绑定请求时,requestId需要进行更新。

6.业务等待OnFinish回调通知绑定成功。

群组认证

Client发起认证,Server端透传并处理报文。

Client

1.获取群组认证实例。

2.调用实例中的authDevice方法,将业务实现的DeviceAuthCallback注册到群组认证中。

3.认证过程中Hichain会不断的调用业务注册的OnTransmit方法,将数据发送给对端设备,同时业务在接收到对端设备发来的数据时,也需要调用实例中的ProcessData方法,将数据传递给Hichain进行处理。

4.业务认证成功时,同时会通过onSessionKeyReturned、onFinish两个接口返回sessionkey,两个接口返回的sessionkey一致。

Server

1.获取群组认证实例。

2.当接收到对端设备发来数据后,调用实例中的ProcessData方法,将数据传递给Hichain进行处理。

3.Hichain第一次处理认证数据的时候,会调用业务注册的OnRequest方法,询问业务是否接受此次认证请求,业务需要检查Hichain传入的此次认证请求的相关信息是否与预期相符,然后下发认证数据,会回调业务注册的OnTransmit方法。

4.认证过程中Hichain会不断的调用业务注册的OnTransmit方法,将数据发送给对端设备,同时业务在接收到对端设备发来的数据时,也需要调用实例中的ProcessData方法,将数据传递给Hichain进行处理。

5.业务认证成功时,同时会通过onSessionKeyReturned、onFinish两个接口返回sessionkey,两个接口返回的sessionkey一致。

前期准备

联网

//连接wifi的过程有两种方式,此过程详述略,有时间单独开篇说明下L0的连接wifi的方法。 //1.通过AT指令的方式连接wifi //2.通过L0的STA方式连wifi WifiConnect(DEFAILT_WIFI_SSID, DEFAILT_WIFI_PASSWORD);

初始化

int res = InitDeviceAuthService(); if(res != HC_SUCCESS) return; //获取群组管理实例 g_hichainGmInstance = GetGmInstance(); //获取群组认证实例 g_hichainGaInstance = GetGaInstance();

注册回调

//回调函数声明 typedef struct { bool (*onTransmit)(int64_t requestId, const uint8_t *data, uint32_t dataLen); void (*onSessionKeyReturned)(int64_t requestId, const uint8_t *sessionKey, uint32_t sessionKeyLen); void (*onFinish)(int64_t requestId, int operationCode, const char *returnData); void (*onError)(int64_t requestId, int operationCode, int errorCode, const char *errorReturn); char *(*onRequest)(int64_t requestId, int operationCode, const char *reqParams); } DeviceAuthCallback; ...... //回调函数定义 DeviceAuthCallback g_hichainCallback = {0}; ...... //注册群组管理的回调函数 (void)memset_s(&g_hichainCallback, sizeof(DeviceAuthCallback), 0, sizeof(DeviceAuthCallback)); g_hichainCallback.onTransmit = AuthOnTransmit; g_hichainCallback.onSessionKeyReturned = AuthOnSessionKeyReturned; g_hichainCallback.onFinish = AuthOnFinish; g_hichainCallback.onError = AuthOnError; g_hichainCallback.onRequest = AuthOnRequest; if (g_hichainGmInstance->regCallback(AUTH_APPID, &g_hichainCallback) != 0) { return ; }

设备绑定

创建群组

//创建群组声明 //requestId不重复的64位整数 //appId业务ID //createParams创建群组需要传入的参数信息(Json的字符串) //包含必填字段:groupType、deviceId、groupName、userType、groupVisibility、expireTime //groupType 256:点对点群组 //GetDevUdid(localDeviceId, 65位字符); //groupName群组名 //userType设备类型:0:配件(默认)1:主控设备 2:中枢设备 此时填0即可 //groupVisibility与expireTime填-1即可 int32_t (*createGroup)(int64_t requestId, const char *appId, const char *createParams); //创建群组,此时requestId为不重复64位整数 g_hichainGmInstance->createGroup(CREATE_GROUP_REQUEST_ID,AUTH_APPID,PackJsonToString(createParam)); //createGroup成功时,回调至onFinish,如果不成功时,回调onError void AuthOnFinish(int64_t requestId, int operationCode, const char *returnData) { //createGroup成功,此时requestId为CREATE_GROUP_REQUEST_ID //returnData为json字符串,包含groupId、addId、deleteId } void (*onError)(int64_t requestId, int operationCode, int errorCode, const char *errorReturn) { //createGroup失败,此时requestId为CREATE_GROUP_REQUEST_ID }

添加成员入群组

//添加成员入群组 //requestId不重复的64位整数 //appId业务ID //addParams添加成员入群组需要传入的参数信息(Json的字符串) int32_t (*addMemberToGroup)(int64_t requestId, const char *appId, const char *addParams); CJson* jsonObj = CreateJson(); AddStringToJson(jsonObj,"groupId",g_groupId); AddIntToJson(jsonObj,"groupType",256);//点对点群组 AddStringToJson(jsonObj,"pinCode","123456");//PinCode AddBoolToJson(jsonObj,"isAdmin",true);//创建端添加成员时为true,否则为false //添加成员入群组,此时requestId为不重复64位整数 int res = g_hichainGmInstance->addMemberToGroup(ADD_MEMBER_TO_GROUP_REQUEST_ID,AUTH_APPID,PackJsonToString(jsonObj));

数据交互与验证

第一次数据交互

//client bool AuthOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { if(requestId == ADD_MEMBER_TO_GROUP_REQUEST_ID) //添加成员进群组成功 { //获取传送至对端的绑定数据data与数据长度dataLen bzero(sendbuf, sizeof(sendbuf)); memcpy_s(sendbuf,1024,data,dataLen); sendbufLen = dataLen; } } //通过网络Socket将数据传送至对端 sendto(sock_fd, sendbuf, sendbufLen, 0, (struct sockaddr *)&send_addr, addr_length); //server //通过网络Socket接收到对端的数据 recv(new_fd, recvbuf, sizeof(recvbuf), 0); //第一次处理绑定数据的时候,调用实例中的ProcessData方法,将数据传递给Hichain进行处理,调用业务注册的OnRequest方法, //询问业务是否接受此次绑定请求,业务需要检查Hichain传入的此次绑定请求的相关信息是否与预期相符,然后下发PIN码以及一些其他参数 res = g_hichainGmInstance->processData(g_request,(const uint8_t *)recvbuf,recvbufLen); ... char* AuthOnRequest(int64_t requestId, int operationCode, const char *reqParams) { if(requestId == ADD_MEMBER_TO_GROUP_REQUEST_ID) { CJson* jsonObj = CreateJsonFromString(reqParams); const char* groupId = GetStringFromJson(jsonObj,"groupId"); int32_t groupType = 0; GetIntFromJson(jsonObj,"groupType",&groupType); const char* peerDeviceId = GetStringFromJson(jsonObj,"peerDeviceId"); FreeJson(jsonObj); printf("groupId: %s,groupType: %d,peerDeviceId: %s\r\n", groupId, groupType, peerDeviceId); char localDeviceId[DEVICE_UUID_LENGTH] = {0}; GetDevUdid(localDeviceId, DEVICE_UUID_LENGTH); jsonObj = CreateJson(); AddIntToJson(jsonObj,"confirmation",REQUEST_ACCEPTED);//接受对端请求 AddStringToJson(jsonObj,"pinCode","123456");//验证对端的PinCode AddStringToJson(jsonObj,"deviceId",localDeviceId); AddIntToJson(jsonObj,"userType",0); AddIntToJson(jsonObj,"expireTime",-1); char* result = PackJsonToString(jsonObj); //FreeJson(jsonObj); printf("result: %s\r\n", result); printf("AuthOnRequest succ\r\n"); return result; } } ... bool AuthOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { if(requestId == ADD_MEMBER_TO_GROUP_REQUEST_ID) { bzero(sendbuf, sizeof(sendbuf)); memcpy_s(sendbuf,1024,data,dataLen); sendbufLen = dataLen; g_authonTransmit = true; return true; } } //通过网络Socket将数据传送至对端 sendto(sock_fd, sendbuf, sendbufLen, 0, (struct sockaddr *)&send_addr, addr_length);

第二次数据交互

//client //通过网络Socket接收到对端的数据 recvfrom(sock_fd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&send_addr, &addr_length); //处理绑定数据 g_hichainGmInstance->processData(g_request,(const uint8_t *)recvbuf,recvbufLen); ... bool AuthOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { if(requestId == ADD_MEMBER_TO_GROUP_REQUEST_ID) { //send data to server by socket bzero(sendbuf, sizeof(sendbuf)); memcpy_s(sendbuf,1024,data,dataLen); sendbufLen = dataLen; return true; } } ... //通过网络Socket将数据传送至对端 sendto(sock_fd, sendbuf, sendbufLen, 0, (struct sockaddr *)&send_addr, addr_length); //server //通过网络Socket接收到对端的数据 recv(new_fd, recvbuf, sizeof(recvbuf), 0); res = g_hichainGmInstance->processData(g_request,(const uint8_t *)recvbuf,recvbufLen); ... bool AuthOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { if(requestId == ADD_MEMBER_TO_GROUP_REQUEST_ID)//认证成功 { bzero(sendbuf, sizeof(sendbuf)); memcpy_s(sendbuf,1024,data,dataLen); sendbufLen = dataLen; g_authonTransmit = true; return true; } } //通过网络Socket将数据传送至对端 sendto(sock_fd, sendbuf, sendbufLen, 0, (struct sockaddr *)&send_addr, addr_length);

第三次数据交互

//client //通过网络Socket接收到对端的数据 recvfrom(sock_fd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&send_addr, &addr_length); //处理绑定数据 g_hichainGmInstance->processData(g_request,(const uint8_t *)recvbuf,recvbufLen); ... bool AuthOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { if(requestId == ADD_MEMBER_TO_GROUP_REQUEST_ID) { //send data to server by socket bzero(sendbuf, sizeof(sendbuf)); memcpy_s(sendbuf,1024,data,dataLen); sendbufLen = dataLen; return true; } } ... //通过网络Socket将数据传送至对端 sendto(sock_fd, sendbuf, sendbufLen, 0, (struct sockaddr *)&send_addr, addr_length); ... void AuthOnFinish(int64_t requestId, int operationCode, const char *returnData) { if(requestId == ADD_MEMBER_TO_GROUP_REQUEST_ID){//绑定完成,获得对端deviceId与groupId CJson* jsonObj = CreateJsonFromString(returnData); peerConnDeviceId = GetStringFromJson(jsonObj,"addId"); groupId = GetStringFromJson(jsonObj,"groupId"); printf("AuthOnFinish.....\r\n"); } } //server //通过网络Socket接收到对端的数据 recv(new_fd, recvbuf, sizeof(recvbuf), 0); res = g_hichainGmInstance->processData(g_request,(const uint8_t *)recvbuf,recvbufLen); ... void AuthOnFinish(int64_t requestId, int operationCode, const char *returnData) { if(requestId == ADD_MEMBER_TO_GROUP_REQUEST_ID){ g_request = AUTH_DEVICE_REQUEST_ID; printf("AuthOnFinish.....\r\n"); } }

群组认证

授权设备

//client //通过网络Socket接收到对端的数据 recvfrom(sock_fd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&send_addr, &addr_length); //处理绑定数据 g_hichainGmInstance->processData(g_request,(const uint8_t *)recvbuf,recvbufLen); ... bool AuthOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { if(requestId == ADD_MEMBER_TO_GROUP_REQUEST_ID) { //send data to server by socket bzero(sendbuf, sizeof(sendbuf));1//client CJson * createParam = CreateJson(); AddStringToJson(createParam,"peerConnDeviceId",peerConnDeviceId); AddStringToJson(createParam,"servicePkgName",AUTH_APPID); AddBoolToJson(createParam,"isClient",true); AddStringToJson(createParam,"groupId",groupId); const char *authParams = PackJsonToString(createParam); //定义AUTH_DEVICE_REQUEST_ID int res = g_hichainGaInstance->authDevice(AUTH_DEVICE_REQUEST_ID,authParams,&g_hichainCallback); ... bool AuthOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { if(requestId == AUTH_DEVICE_REQUEST_ID) { bzero(sendbuf, sizeof(sendbuf)); memcpy_s(sendbuf,1024,data,dataLen); sendbufLen = dataLen; } } //通过网络Socket将数据传送至对端 sendto(sock_fd, sendbuf, sendbufLen, 0, (struct sockaddr *)&send_addr, addr_length); //server //通过网络Socket接收到对端的数据 recv(new_fd, recvbuf, sizeof(recvbuf), 0); //群组认证实例来处理认证数据 g_hichainGaInstance->processData(g_request,(const uint8_t *)recvbuf,recvbufLen,&g_hichainCallback); ... char* AuthOnRequest(int64_t requestId, int operationCode, const char *reqParams) { //暂不做处理 } ... bool AuthOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { if(requestId == AUTH_DEVICE_REQUEST_ID) { bzero(sendbuf, sizeof(sendbuf)); memcpy_s(sendbuf,1024,data,dataLen); sendbufLen = dataLen; g_authonTransmit = true; return true; } } //通过网络Socket将数据传送至对端 sendto(sock_fd, sendbuf, sendbufLen, 0, (struct sockaddr *)&send_addr, addr_length); memcpy_s(sendbuf,1024,data,dataLen); sendbufLen = dataLen; return true; } } ... //通过网络Socket将数据传送至对端 sendto(sock_fd, sendbuf, sendbufLen, 0, (struct sockaddr *)&send_addr, addr_length); ... void AuthOnFinish(int64_t requestId, int operationCode, const char *returnData) { if(requestId == ADD_MEMBER_TO_GROUP_REQUEST_ID){//绑定完成,获得对端deviceId与groupId CJson* jsonObj = CreateJsonFromString(returnData); peerConnDeviceId = GetStringFromJson(jsonObj,"addId"); groupId = GetStringFromJson(jsonObj,"groupId"); printf("AuthOnFinish.....\r\n"); } } //server //通过网络Socket接收到对端的数据 recv(new_fd, recvbuf, sizeof(recvbuf), 0); res = g_hichainGmInstance->processData(g_request,(const uint8_t *)recvbuf,recvbufLen); ... void AuthOnFinish(int64_t requestId, int operationCode, const char *returnData) { if(requestId == ADD_MEMBER_TO_GROUP_REQUEST_ID){ g_request = AUTH_DEVICE_REQUEST_ID; printf("AuthOnFinish.....\r\n"); } }

第一次交互

//client //通过网络Socket接收到对端的数据 recvfrom(sock_fd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&send_addr, &addr_length); //处理绑定数据 res = g_hichainGaInstance->processData(g_request,(const uint8_t *)recvbuf,recvbufLen,&g_hichainCallback); ... bool AuthOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { if(requestId == AUTH_DEVICE_REQUEST_ID) { //send data to server by socket bzero(sendbuf, sizeof(sendbuf)); memcpy_s(sendbuf,1024,data,dataLen); sendbufLen = dataLen; return true; } } ... //通过网络Socket将数据传送至对端 sendto(sock_fd, sendbuf, sendbufLen, 0, (struct sockaddr *)&send_addr, addr_length); //server //通过网络Socket接收到对端的数据 recv(new_fd, recvbuf, sizeof(recvbuf), 0); g_hichainGaInstance->processData(g_request,(const uint8_t *)recvbuf,recvbufLen,&g_hichainCallback); ... bool AuthOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { if(requestId == AUTH_DEVICE_REQUEST_ID){ bzero(sendbuf, sizeof(sendbuf)); memcpy_s(sendbuf,1024,data,dataLen); sendbufLen = dataLen; return true; } } //通过网络Socket将数据传送至对端 sendto(sock_fd, sendbuf, sendbufLen, 0, (struct sockaddr *)&send_addr, addr_length);

第二次交互

//client //通过网络Socket接收到对端的数据 recvfrom(sock_fd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&send_addr, &addr_length); //处理绑定数据 g_hichainGaInstance->processData(g_request,(const uint8_t *)recvbuf,recvbufLen,&g_hichainCallback); ... bool AuthOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen) { if(requestId == AUTH_DEVICE_REQUEST_ID) { //send data to server by socket bzero(sendbuf, sizeof(sendbuf)); memcpy_s(sendbuf,1024,data,dataLen); sendbufLen = dataLen; return true; } } ... void AuthOnSessionKeyReturned(int64_t requestId, const uint8_t *sessionKey, uint32_t sessionKeyLen) { if(requestId == PROCESS_DATA_REQUEST_ID)//认证成功 { g_authsessionKey = sessionKey; } } void AuthOnFinish(int64_t requestId, int operationCode, const char *returnData) { if(requestId == AUTH_DEVICE_REQUEST_ID){//认证完成, } } //通过网络Socket将数据传送至对端 sendto(sock_fd, sendbuf, sendbufLen, 0, (struct sockaddr *)&send_addr, addr_length); //server //通过网络Socket接收到对端的数据 recv(new_fd, recvbuf, sizeof(recvbuf), 0); g_hichainGaInstance->processData(g_request,(const uint8_t *)recvbuf,recvbufLen,&g_hichainCallback); ... void AuthOnSessionKeyReturned(int64_t requestId, const uint8_t *sessionKey, uint32_t sessionKeyLen) { if(requestId == AUTH_DEVICE_REQUEST_ID)//认证成功 { g_authsessionKey = sessionKey; } } void AuthOnFinish(int64_t requestId, int operationCode, const char *returnData) { if(requestId == AUTH_DEVICE_REQUEST_ID){ printf("AuthOnFinish.....\r\n"); } }

参考文献

设备互信认证

总结

设备互信认证是负责设备间可信关系的建立、维护、使用、撤销等全生命周期的管理,实现可信设备间的互信认证和安全会话密钥协商的目的。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐