1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ASSET_NAPI_CHECK_H
17 #define ASSET_NAPI_CHECK_H
18 
19 #include <vector>
20 
21 #include "napi/native_api.h"
22 #include "napi/native_node_api.h"
23 
24 #include "asset_system_type.h"
25 
26 namespace OHOS {
27 namespace Security {
28 namespace Asset {
29 
30 #define NAPI_THROW_INVALID_ARGUMENT(env, format, arg...)                                            \
31 do {                                                                                                \
32     char msg[MAX_MESSAGE_LEN] = { 0 };                                                              \
33     if ((sprintf_s(msg, MAX_MESSAGE_LEN, format, ##arg)) == -1) {                                   \
34         LOGE("[FATAL][NAPI]Failed to create message string, truncation occurred when sprintf_s.");  \
35         break;                                                                                      \
36     }                                                                                               \
37     LOGE("[FATAL][NAPI]%{public}s", (msg));                                                         \
38     napi_throw((env), CreateJsError((env), SEC_ASSET_INVALID_ARGUMENT, (msg)));                     \
39 } while (0)
40 
41 const std::vector<uint32_t> CRITICAL_LABEL_TAGS = {
42     SEC_ASSET_TAG_DATA_LABEL_CRITICAL_1,
43     SEC_ASSET_TAG_DATA_LABEL_CRITICAL_2,
44     SEC_ASSET_TAG_DATA_LABEL_CRITICAL_3,
45     SEC_ASSET_TAG_DATA_LABEL_CRITICAL_4
46 };
47 
48 const std::vector<uint32_t> NORMAL_LABEL_TAGS = {
49     SEC_ASSET_TAG_DATA_LABEL_NORMAL_1,
50     SEC_ASSET_TAG_DATA_LABEL_NORMAL_2,
51     SEC_ASSET_TAG_DATA_LABEL_NORMAL_3,
52     SEC_ASSET_TAG_DATA_LABEL_NORMAL_4
53 };
54 
55 const std::vector<uint32_t> NORMAL_LOCAL_LABEL_TAGS = {
56     SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_1,
57     SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_2,
58     SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_3,
59     SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_4
60 };
61 
62 const std::vector<uint32_t> ACCESS_CONTROL_TAGS = {
63     SEC_ASSET_TAG_ALIAS,
64     SEC_ASSET_TAG_ACCESSIBILITY,
65     SEC_ASSET_TAG_AUTH_TYPE,
66     SEC_ASSET_TAG_IS_PERSISTENT,
67     SEC_ASSET_TAG_SYNC_TYPE,
68     SEC_ASSET_TAG_REQUIRE_PASSWORD_SET,
69     SEC_ASSET_TAG_REQUIRE_ATTR_ENCRYPTED,
70     SEC_ASSET_TAG_USER_ID
71 };
72 
73 const std::vector<uint32_t> ASSET_RETURN_ORDER_BY_TAGS = {
74     SEC_ASSET_TAG_DATA_LABEL_CRITICAL_1,
75     SEC_ASSET_TAG_DATA_LABEL_CRITICAL_2,
76     SEC_ASSET_TAG_DATA_LABEL_CRITICAL_3,
77     SEC_ASSET_TAG_DATA_LABEL_CRITICAL_4,
78     SEC_ASSET_TAG_DATA_LABEL_NORMAL_1,
79     SEC_ASSET_TAG_DATA_LABEL_NORMAL_2,
80     SEC_ASSET_TAG_DATA_LABEL_NORMAL_3,
81     SEC_ASSET_TAG_DATA_LABEL_NORMAL_4,
82     SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_1,
83     SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_2,
84     SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_3,
85     SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_4
86 };
87 
88 const std::vector<uint32_t> ASSET_SYNC_TAGS = {
89     SEC_ASSET_TAG_OPERATION_TYPE
90 };
91 
92 const std::vector<uint32_t> ASSET_ACCESSIBILITY_VEC = {
93     SEC_ASSET_ACCESSIBILITY_DEVICE_POWERED_ON,
94     SEC_ASSET_ACCESSIBILITY_DEVICE_FIRST_UNLOCKED,
95     SEC_ASSET_ACCESSIBILITY_DEVICE_UNLOCKED
96 };
97 
98 const std::vector<uint32_t> ASSET_AUTH_TYPE_VEC = {
99     SEC_ASSET_AUTH_TYPE_NONE,
100     SEC_ASSET_AUTH_TYPE_ANY
101 };
102 
103 const std::vector<uint32_t> ASSET_CONFLICT_RESOLUTION_VEC = {
104     SEC_ASSET_CONFLICT_OVERWRITE,
105     SEC_ASSET_CONFLICT_THROW_ERROR
106 };
107 
108 const std::vector<uint32_t> ASSET_RETURN_TYPE_VEC = {
109     SEC_ASSET_RETURN_ALL,
110     SEC_ASSET_RETURN_ATTRIBUTES
111 };
112 
113 const std::unordered_map<uint32_t, const char *> TAG_MAP = {
114     { SEC_ASSET_TAG_SECRET, "SECRET" },
115     { SEC_ASSET_TAG_ALIAS, "ALIAS" },
116     { SEC_ASSET_TAG_ACCESSIBILITY, "ACCESSIBILITY" },
117     { SEC_ASSET_TAG_REQUIRE_PASSWORD_SET, "REQUIRE_PASSWORD_SET" },
118     { SEC_ASSET_TAG_AUTH_TYPE, "AUTH_TYPE" },
119     { SEC_ASSET_TAG_AUTH_VALIDITY_PERIOD, "AUTH_VALIDITY_PERIOD" },
120     { SEC_ASSET_TAG_AUTH_CHALLENGE, "AUTH_CHALLENGE" },
121     { SEC_ASSET_TAG_AUTH_TOKEN, "AUTH_TOKEN" },
122     { SEC_ASSET_TAG_SYNC_TYPE, "SYNC_TYPE" },
123     { SEC_ASSET_TAG_IS_PERSISTENT, "IS_PERSISTENT" },
124     { SEC_ASSET_TAG_CONFLICT_RESOLUTION, "CONFLICT_RESOLUTION" },
125     { SEC_ASSET_TAG_DATA_LABEL_CRITICAL_1, "DATA_LABEL_CRITICAL_1" },
126     { SEC_ASSET_TAG_DATA_LABEL_CRITICAL_2, "DATA_LABEL_CRITICAL_2" },
127     { SEC_ASSET_TAG_DATA_LABEL_CRITICAL_3, "DATA_LABEL_CRITICAL_3" },
128     { SEC_ASSET_TAG_DATA_LABEL_CRITICAL_4, "DATA_LABEL_CRITICAL_4" },
129     { SEC_ASSET_TAG_DATA_LABEL_NORMAL_1, "DATA_LABEL_NORMAL_1" },
130     { SEC_ASSET_TAG_DATA_LABEL_NORMAL_2, "DATA_LABEL_NORMAL_2" },
131     { SEC_ASSET_TAG_DATA_LABEL_NORMAL_3, "DATA_LABEL_NORMAL_3" },
132     { SEC_ASSET_TAG_DATA_LABEL_NORMAL_4, "DATA_LABEL_NORMAL_4" },
133     { SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_1, "DATA_LABEL_NORMAL_LOCAL_1" },
134     { SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_2, "DATA_LABEL_NORMAL_LOCAL_2" },
135     { SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_3, "DATA_LABEL_NORMAL_LOCAL_3" },
136     { SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_4, "DATA_LABEL_NORMAL_LOCAL_4" },
137     { SEC_ASSET_TAG_RETURN_TYPE, "RETURN_TYPE" },
138     { SEC_ASSET_TAG_RETURN_LIMIT, "RETURN_LIMIT" },
139     { SEC_ASSET_TAG_RETURN_OFFSET, "RETURN_OFFSET" },
140     { SEC_ASSET_TAG_RETURN_ORDERED_BY, "RETURN_ORDERED_BY" },
141     { SEC_ASSET_TAG_UPDATE_TIME, "UPDATE_TIME" },
142     { SEC_ASSET_TAG_OPERATION_TYPE, "OPERATION_TYPE" },
143     { SEC_ASSET_TAG_REQUIRE_ATTR_ENCRYPTED, "REQUIRE_ATTR_ENCRYPTED" },
144     { SEC_ASSET_TAG_USER_ID, "USER_ID" },
145 };
146 
147 bool CheckAssetRequiredTag(const napi_env env, const std::vector<AssetAttr> &attrs,
148     const std::vector<uint32_t> &requiredTags);
149 
150 bool CheckAssetTagValidity(const napi_env env, const std::vector<AssetAttr> &attrs,
151     const std::vector<uint32_t> &validTags);
152 
153 bool CheckAssetValueValidity(const napi_env env, const std::vector<AssetAttr> &attrs);
154 
155 } // Asset
156 } // Security
157 } // OHOS
158 
159 #endif // ASSET_NAPI_CHECK_H