• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 管理群组关键资产(C/C++)
2
3<!--Kit: Asset Store Kit-->
4<!--Subsystem: Security-->
5<!--Owner: @JeremyXu-->
6<!--Designer: @skye_you-->
7<!--Tester: @nacyli-->
8<!--Adviser: @zengyawen-->
9
10以下为管理群组关键资产使用示例,请先查看开发指导:
11
12- [新增关键资产(C/C++)](asset-native-add.md)
13- [删除关键资产(C/C++)](asset-native-remove.md)
14- [更新关键资产(C/C++)](asset-native-update.md)
15- [查询关键资产(C/C++)](asset-native-query.md)
16
17## 前置条件
18
19在应用配置文件app.json5中,配置群组ID:demo_group_id。
20
21```json
22{
23  "app": {
24    // 其他配置项此处省略。
25    "assetAccessGroups": [
26      "demo_group_id"
27    ]
28  }
29}
30```
31
32## 新增群组关键资产
33
34在群组中新增密码为demo_pwd、别名为demo_alias、附属信息为demo_label的关键资产。用户首次解锁设备后,该关键资产可被访问。
35
36```c
37#include <string.h>
38
39#include "asset/asset_api.h"
40
41static napi_value AddAsset(napi_env env, napi_callback_info info)
42{
43    static const char *SECRET = "demo_pwd";
44    static const char *ALIAS = "demo_alias";
45    static const char *LABEL = "demo_label";
46    static const char *GROUP_ID = "demo_group_id";
47
48    Asset_Blob secret = {(uint32_t)(strlen(SECRET)), (uint8_t *)SECRET};
49    Asset_Blob alias = {(uint32_t)(strlen(ALIAS)), (uint8_t *)ALIAS};
50    Asset_Blob label = {(uint32_t)(strlen(LABEL)), (uint8_t *)LABEL};
51    Asset_Blob group_id = { (uint32_t)(strlen(GROUP_ID)), (uint8_t *)GROUP_ID};
52    Asset_Attr attr[] = {
53        {.tag = ASSET_TAG_ACCESSIBILITY, .value.u32 = ASSET_ACCESSIBILITY_DEVICE_FIRST_UNLOCKED},
54        {.tag = ASSET_TAG_SECRET, .value.blob = secret},
55        {.tag = ASSET_TAG_ALIAS, .value.blob = alias},
56        {.tag = ASSET_TAG_DATA_LABEL_NORMAL_1, .value.blob = label},
57        {.tag = ASSET_TAG_GROUP_ID, .value.blob = group_id},
58    };
59
60    int32_t addResult = OH_Asset_Add(attr, sizeof(attr) / sizeof(attr[0]));
61    napi_value ret;
62    napi_create_int32(env, addResult, &ret);
63    return ret;
64}
65```
66
67## 删除群组关键资产
68
69在群组中删除别名是demo_alias的关键资产。
70
71```c
72#include <string.h>
73
74#include "asset/asset_api.h"
75
76static napi_value RemoveAsset(napi_env env, napi_callback_info info)
77{
78    static const char *ALIAS = "demo_alias";
79    static const char *GROUP_ID = "demo_group_id";
80
81    Asset_Blob alias = {(uint32_t)(strlen(ALIAS)), (uint8_t *)ALIAS};
82    Asset_Blob group_id = {(uint32_t)(strlen(GROUP_ID)), (uint8_t *)GROUP_ID};
83    Asset_Attr attr[] = {
84        {.tag = ASSET_TAG_ALIAS, .value.blob = alias}, // 此处指定别名删除单条群组关键资产,也可不指定别名删除多条群组关键资产。
85        {.tag = ASSET_TAG_GROUP_ID, .value.blob = group_id},
86    };
87
88    int32_t removeResult = OH_Asset_Remove(attr, sizeof(attr) / sizeof(attr[0]));
89    napi_value ret;
90    napi_create_int32(env, removeResult, &ret);
91    return ret;
92}
93```
94
95## 更新群组关键资产
96
97在群组中更新别名为demo_alias的关键资产,将关键资产的明文更新为demo_pwd_new,附属信息更新为demo_label_new。
98
99```c
100#include <string.h>
101
102#include "asset/asset_api.h"
103
104static napi_value UpdateAsset(napi_env env, napi_callback_info info)
105{
106    static const char *ALIAS = "demo_alias";
107    static const char *SECRET = "demo_pwd_new";
108    static const char *LABEL = "demo_label_new";
109    static const char *GROUP_ID = "demo_group_id";
110
111    Asset_Blob alias = {(uint32_t)(strlen(ALIAS)), (uint8_t *)ALIAS};
112    Asset_Blob new_secret = {(uint32_t)(strlen(SECRET)), (uint8_t *)SECRET};
113    Asset_Blob new_label = {(uint32_t)(strlen(LABEL)), (uint8_t *)LABEL};
114    Asset_Blob group_id = {(uint32_t)(strlen(GROUP_ID)), (uint8_t *)GROUP_ID};
115    Asset_Attr query[] = {
116        {.tag = ASSET_TAG_ALIAS, .value.blob = alias},
117        {.tag = ASSET_TAG_GROUP_ID, .value.blob = group_id},
118    };
119    Asset_Attr attributesToUpdate[] = {
120        {.tag = ASSET_TAG_SECRET, .value.blob = new_secret},
121        {.tag = ASSET_TAG_DATA_LABEL_NORMAL_1, .value.blob = new_label},
122    };
123
124    int32_t updateResult = OH_Asset_Update(query, sizeof(query) / sizeof(query[0]), attributesToUpdate,
125                                           sizeof(attributesToUpdate) / sizeof(attributesToUpdate[0]));
126    napi_value ret;
127    napi_create_int32(env, updateResult, &ret);
128    return ret;
129}
130```
131
132## 查询单条群组关键资产明文
133
134在群组中查询别名为demo_alias的关键资产明文。
135
136```c
137#include <string.h>
138
139#include "asset/asset_api.h"
140
141static napi_value QueryAsset(napi_env env, napi_callback_info info)
142{
143    static const char *ALIAS = "demo_alias";
144    static const char *GROUP_ID = "demo_group_id";
145    Asset_Blob alias = { (uint32_t)(strlen(ALIAS)), (uint8_t *)ALIAS };
146    Asset_Blob group_id = { (uint32_t)(strlen(GROUP_ID)), (uint8_t *)GROUP_ID };
147    Asset_Attr attr[] = {
148        {.tag = ASSET_TAG_ALIAS, .value.blob = alias}, // 指定了群组关键资产别名,最多查询到一条满足条件的群组关键资产。
149        {.tag = ASSET_TAG_RETURN_TYPE, .value.u32 = ASSET_RETURN_ALL}, // 此处表示需要返回群组关键资产的所有信息,即属性+明文。
150        {.tag = ASSET_TAG_GROUP_ID, .value.blob = group_id},
151    };
152
153    Asset_ResultSet resultSet = {0};
154    int32_t queryResult = OH_Asset_Query(attr, sizeof(attr) / sizeof(attr[0]), &resultSet);
155    if (queryResult == ASSET_SUCCESS) {
156        // 解析resultSet。
157        for (uint32_t i = 0; i < resultSet.count; i++) {
158            // 解析secret属性:其中data数据对应是secret->blob.data,长度对应是secret->blob.size159            Asset_Attr *secret = OH_Asset_ParseAttr(resultSet.results + i, ASSET_TAG_SECRET);
160        }
161    }
162    OH_Asset_FreeResultSet(&resultSet);
163
164    napi_value ret;
165    napi_create_int32(env, queryResult, &ret);
166    return ret;
167}
168```
169
170## 查询单条群组关键资产属性
171
172查询别名是demo_alias的关键资产属性。
173
174```c
175#include <string.h>
176
177#include "asset/asset_api.h"
178
179static napi_value QueryAttributes(napi_env env, napi_callback_info info)
180{
181    static const char *ALIAS = "demo_alias";
182    static const char *GROUP_ID = "demo_group_id";
183    Asset_Blob alias = {(uint32_t)(strlen(ALIAS)), (uint8_t *)ALIAS};
184    Asset_Blob group_id = {(uint32_t)(strlen(GROUP_ID)), (uint8_t *)GROUP_ID};
185    Asset_Attr attr[] = {
186        {.tag = ASSET_TAG_ALIAS, .value.blob = alias}, // 指定了群组关键资产别名,最多查询到一条满足条件的群组关键资产。
187        {.tag = ASSET_TAG_RETURN_TYPE, .value.u32 = ASSET_RETURN_ATTRIBUTES}, // 此处表示仅返回群组关键资产属性,不包含群组关键资产明文。
188        {.tag = ASSET_TAG_GROUP_ID, .value.blob = group_id},
189    };
190
191    Asset_ResultSet resultSet = {0};
192    int32_t queryResult = OH_Asset_Query(attr, sizeof(attr) / sizeof(attr[0]), &resultSet);
193    if (queryResult == ASSET_SUCCESS) {
194        // 解析结果。
195        for (uint32_t i = 0; i < resultSet.count; i++) {
196            // 解析数据标签:其中数据是label->blob.data,长度对应是label->blob.size197            Asset_Attr *label = OH_Asset_ParseAttr(resultSet.results + i, ASSET_TAG_DATA_LABEL_NORMAL_1);
198        }
199    }
200    OH_Asset_FreeResultSet(&resultSet);
201
202    napi_value ret;
203    napi_create_int32(env, queryResult, &ret);
204    return ret;
205}
206```
207