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.size。 159 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.size。 197 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