1 /*
2 * Copyright (c) 2023-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 #include "hks_lite_api.h"
17 #include "hks_lite_api_common.h"
18 #include "hks_type.h"
19
20 #include "jsi.h"
21
22 namespace OHOS {
23 namespace ACELite {
24
AddInt32PropertyInLite(JSIValue object,const char * name,int32_t value)25 void AddInt32PropertyInLite(JSIValue object, const char *name, int32_t value)
26 {
27 JSIValue numberProperty = JSI::CreateNumber(value);
28 JSI::SetNamedProperty(object, name, numberProperty);
29 }
30
CreateHuksErrCode(void)31 static JSIValue CreateHuksErrCode(void)
32 {
33 JSIValue errorCode = JSI::CreateObject();
34
35 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_PERMISSION_FAIL", HUKS_ERR_CODE_PERMISSION_FAIL);
36 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_NOT_SYSTEM_APP", HUKS_ERR_CODE_NOT_SYSTEM_APP);
37 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_ILLEGAL_ARGUMENT", HUKS_ERR_CODE_ILLEGAL_ARGUMENT);
38 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_NOT_SUPPORTED_API", HUKS_ERR_CODE_NOT_SUPPORTED_API);
39 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_FEATURE_NOT_SUPPORTED", HUKS_ERR_CODE_FEATURE_NOT_SUPPORTED);
40 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_MISSING_CRYPTO_ALG_ARGUMENT",
41 HUKS_ERR_CODE_MISSING_CRYPTO_ALG_ARGUMENT);
42 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_INVALID_CRYPTO_ALG_ARGUMENT",
43 HUKS_ERR_CODE_INVALID_CRYPTO_ALG_ARGUMENT);
44 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_FILE_OPERATION_FAIL", HUKS_ERR_CODE_FILE_OPERATION_FAIL);
45 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_COMMUNICATION_FAIL", HUKS_ERR_CODE_COMMUNICATION_FAIL);
46 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_CRYPTO_FAIL", HUKS_ERR_CODE_CRYPTO_FAIL);
47 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_KEY_AUTH_PERMANENTLY_INVALIDATED",
48 HUKS_ERR_CODE_KEY_AUTH_PERMANENTLY_INVALIDATED);
49 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_KEY_AUTH_VERIFY_FAILED", HUKS_ERR_CODE_KEY_AUTH_VERIFY_FAILED);
50 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_KEY_AUTH_TIME_OUT", HUKS_ERR_CODE_KEY_AUTH_TIME_OUT);
51 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_SESSION_LIMIT", HUKS_ERR_CODE_SESSION_LIMIT);
52 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_ITEM_NOT_EXIST", HUKS_ERR_CODE_ITEM_NOT_EXIST);
53 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_EXTERNAL_ERROR", HUKS_ERR_CODE_EXTERNAL_ERROR);
54 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_CREDENTIAL_NOT_EXIST", HUKS_ERR_CODE_CREDENTIAL_NOT_EXIST);
55 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_INSUFFICIENT_MEMORY", HUKS_ERR_CODE_INSUFFICIENT_MEMORY);
56 AddInt32PropertyInLite(errorCode, "HUKS_ERR_CODE_CALL_SERVICE_FAILED", HUKS_ERR_CODE_CALL_SERVICE_FAILED);
57
58 return errorCode;
59 }
60
CreateHuksKeyPurpose(void)61 static JSIValue CreateHuksKeyPurpose(void)
62 {
63 JSIValue keyPurpose = JSI::CreateObject();
64
65 AddInt32PropertyInLite(keyPurpose, "HUKS_KEY_PURPOSE_ENCRYPT", HKS_KEY_PURPOSE_ENCRYPT);
66 AddInt32PropertyInLite(keyPurpose, "HUKS_KEY_PURPOSE_DECRYPT", HKS_KEY_PURPOSE_DECRYPT);
67 AddInt32PropertyInLite(keyPurpose, "HUKS_KEY_PURPOSE_SIGN", HKS_KEY_PURPOSE_SIGN);
68 AddInt32PropertyInLite(keyPurpose, "HUKS_KEY_PURPOSE_VERIFY", HKS_KEY_PURPOSE_VERIFY);
69 AddInt32PropertyInLite(keyPurpose, "HUKS_KEY_PURPOSE_MAC", HKS_KEY_PURPOSE_MAC);
70
71 return keyPurpose;
72 }
73
CreateHuksKeyPadding(void)74 static JSIValue CreateHuksKeyPadding(void)
75 {
76 JSIValue keyPadding = JSI::CreateObject();
77
78 AddInt32PropertyInLite(keyPadding, "HUKS_PADDING_NONE", HKS_PADDING_NONE);
79 AddInt32PropertyInLite(keyPadding, "HUKS_PADDING_PKCS7", HKS_PADDING_PKCS7);
80 AddInt32PropertyInLite(keyPadding, "HUKS_PADDING_PKCS1_V1_5", HKS_PADDING_PKCS1_V1_5);
81 AddInt32PropertyInLite(keyPadding, "HUKS_PADDING_OAEP", HKS_PADDING_OAEP);
82 AddInt32PropertyInLite(keyPadding, "HUKS_PADDING_PSS", HKS_PADDING_PSS);
83 AddInt32PropertyInLite(keyPadding, "HUKS_PADDING_ISO_IEC_9796_2", HKS_PADDING_ISO_IEC_9796_2);
84 AddInt32PropertyInLite(keyPadding, "HUKS_PADDING_ISO_IEC_9797_1", HKS_PADDING_ISO_IEC_9797_1);
85
86 return keyPadding;
87 }
88
CreateHuksCipherMode(void)89 static JSIValue CreateHuksCipherMode(void)
90 {
91 JSIValue keyCipherMode = JSI::CreateObject();
92
93 AddInt32PropertyInLite(keyCipherMode, "HUKS_MODE_ECB", HKS_MODE_ECB);
94 AddInt32PropertyInLite(keyCipherMode, "HUKS_MODE_CBC", HKS_MODE_CBC);
95 AddInt32PropertyInLite(keyCipherMode, "HUKS_MODE_CTR", HKS_MODE_CTR);
96 AddInt32PropertyInLite(keyCipherMode, "HUKS_MODE_GCM", HKS_MODE_GCM);
97
98 return keyCipherMode;
99 }
100
CreateHuksKeySize(void)101 static JSIValue CreateHuksKeySize(void)
102 {
103 JSIValue keySize = JSI::CreateObject();
104
105 AddInt32PropertyInLite(keySize, "HUKS_AES_KEY_SIZE_128", HKS_AES_KEY_SIZE_128);
106 AddInt32PropertyInLite(keySize, "HUKS_AES_KEY_SIZE_192", HKS_AES_KEY_SIZE_192);
107 AddInt32PropertyInLite(keySize, "HUKS_AES_KEY_SIZE_256", HKS_AES_KEY_SIZE_256);
108 AddInt32PropertyInLite(keySize, "HUKS_AES_KEY_SIZE_512", HKS_AES_KEY_SIZE_512);
109
110 AddInt32PropertyInLite(keySize, "HUKS_DES_KEY_SIZE_64", HKS_DES_KEY_SIZE_64);
111 AddInt32PropertyInLite(keySize, "HUKS_3DES_KEY_SIZE_128", HKS_3DES_KEY_SIZE_128);
112 AddInt32PropertyInLite(keySize, "HUKS_3DES_KEY_SIZE_192", HKS_3DES_KEY_SIZE_192);
113
114 AddInt32PropertyInLite(keySize, "HUKS_RSA_KEY_SIZE_1024", HKS_RSA_KEY_SIZE_1024);
115 AddInt32PropertyInLite(keySize, "HUKS_RSA_KEY_SIZE_2048", HKS_RSA_KEY_SIZE_2048);
116
117 return keySize;
118 }
119
CreateHuksKeyAlg(void)120 static JSIValue CreateHuksKeyAlg(void)
121 {
122 JSIValue keyAlg = JSI::CreateObject();
123
124 AddInt32PropertyInLite(keyAlg, "HUKS_ALG_AES", HKS_ALG_AES);
125 AddInt32PropertyInLite(keyAlg, "HUKS_ALG_DES", HKS_ALG_DES);
126 AddInt32PropertyInLite(keyAlg, "HUKS_ALG_3DES", HKS_ALG_3DES);
127
128 AddInt32PropertyInLite(keyAlg, "HUKS_ALG_HMAC", HKS_ALG_HMAC);
129 AddInt32PropertyInLite(keyAlg, "HUKS_ALG_CMAC", HKS_ALG_CMAC);
130
131 AddInt32PropertyInLite(keyAlg, "HUKS_ALG_RSA", HKS_ALG_RSA);
132
133 return keyAlg;
134 }
135
CreateHuksKeyFlag(void)136 static JSIValue CreateHuksKeyFlag(void)
137 {
138 JSIValue keyFlag = JSI::CreateObject();
139
140 AddInt32PropertyInLite(keyFlag, "HUKS_KEY_FLAG_IMPORT_KEY", HKS_KEY_FLAG_IMPORT_KEY);
141 AddInt32PropertyInLite(keyFlag, "HUKS_KEY_FLAG_GENERATE_KEY", HKS_KEY_FLAG_GENERATE_KEY);
142 AddInt32PropertyInLite(keyFlag, "HUKS_KEY_FLAG_AGREE_KEY", HKS_KEY_FLAG_AGREE_KEY);
143 AddInt32PropertyInLite(keyFlag, "HUKS_KEY_FLAG_DERIVE_KEY", HKS_KEY_FLAG_DERIVE_KEY);
144
145 return keyFlag;
146 }
147
CreateHuksKeyStorageType(void)148 static JSIValue CreateHuksKeyStorageType(void)
149 {
150 JSIValue keyStorageType = JSI::CreateObject();
151
152 AddInt32PropertyInLite(keyStorageType, "HUKS_STORAGE_TEMP", HKS_STORAGE_TEMP);
153 AddInt32PropertyInLite(keyStorageType, "HUKS_STORAGE_PERSISTENT", HKS_STORAGE_PERSISTENT);
154
155 return keyStorageType;
156 }
157
CreateHuksTagType(void)158 static JSIValue CreateHuksTagType(void)
159 {
160 JSIValue tagType = JSI::CreateObject();
161
162 AddInt32PropertyInLite(tagType, "HUKS_TAG_TYPE_INVALID", HKS_TAG_TYPE_INVALID);
163 AddInt32PropertyInLite(tagType, "HUKS_TAG_TYPE_INT", HKS_TAG_TYPE_INT);
164 AddInt32PropertyInLite(tagType, "HUKS_TAG_TYPE_UINT", HKS_TAG_TYPE_UINT);
165 AddInt32PropertyInLite(tagType, "HUKS_TAG_TYPE_ULONG", HKS_TAG_TYPE_ULONG);
166 AddInt32PropertyInLite(tagType, "HUKS_TAG_TYPE_BOOL", HKS_TAG_TYPE_BOOL);
167 AddInt32PropertyInLite(tagType, "HUKS_TAG_TYPE_BYTES", HKS_TAG_TYPE_BYTES);
168
169 return tagType;
170 }
171
AddHuksTagPart1(JSIValue tag)172 static void AddHuksTagPart1(JSIValue tag)
173 {
174 AddInt32PropertyInLite(tag, "HUKS_TAG_INVALID", HKS_TAG_INVALID);
175
176 AddInt32PropertyInLite(tag, "HUKS_TAG_ALGORITHM", HKS_TAG_ALGORITHM);
177 AddInt32PropertyInLite(tag, "HUKS_TAG_PURPOSE", HKS_TAG_PURPOSE);
178 AddInt32PropertyInLite(tag, "HUKS_TAG_KEY_SIZE", HKS_TAG_KEY_SIZE);
179 AddInt32PropertyInLite(tag, "HUKS_TAG_PADDING", HKS_TAG_PADDING);
180 AddInt32PropertyInLite(tag, "HUKS_TAG_BLOCK_MODE", HKS_TAG_BLOCK_MODE);
181 AddInt32PropertyInLite(tag, "HUKS_TAG_KEY_TYPE", HKS_TAG_KEY_TYPE);
182 AddInt32PropertyInLite(tag, "HUKS_TAG_ASSOCIATED_DATA", HKS_TAG_ASSOCIATED_DATA);
183 AddInt32PropertyInLite(tag, "HUKS_TAG_NONCE", HKS_TAG_NONCE);
184 AddInt32PropertyInLite(tag, "HUKS_TAG_IV", HKS_TAG_IV);
185
186 AddInt32PropertyInLite(tag, "HUKS_TAG_INFO", HKS_TAG_INFO);
187 AddInt32PropertyInLite(tag, "HUKS_TAG_PWD", HKS_TAG_PWD);
188
189 AddInt32PropertyInLite(tag, "HUKS_TAG_KEY_GENERATE_TYPE", HKS_TAG_KEY_GENERATE_TYPE);
190 AddInt32PropertyInLite(tag, "HUKS_TAG_KEY_ALIAS", HKS_TAG_KEY_ALIAS);
191
192 AddInt32PropertyInLite(tag, "HUKS_TAG_ORIGINATION_EXPIRE_DATETIME", HKS_TAG_ORIGINATION_EXPIRE_DATETIME);
193
194 AddInt32PropertyInLite(tag, "HUKS_TAG_USAGE_EXPIRE_DATETIME", HKS_TAG_USAGE_EXPIRE_DATETIME);
195
196 AddInt32PropertyInLite(tag, "HUKS_TAG_CREATION_DATETIME", HKS_TAG_CREATION_DATETIME);
197 }
198
AddHuksTagPart2(JSIValue tag)199 static void AddHuksTagPart2(JSIValue tag)
200 {
201 AddInt32PropertyInLite(tag, "HUKS_TAG_IS_KEY_ALIAS", HKS_TAG_IS_KEY_ALIAS);
202 AddInt32PropertyInLite(tag, "HUKS_TAG_KEY_STORAGE_FLAG", HKS_TAG_KEY_STORAGE_FLAG);
203 AddInt32PropertyInLite(tag, "HUKS_TAG_KEY_FLAG", HKS_TAG_KEY_FLAG);
204
205 AddInt32PropertyInLite(tag, "HUKS_TAG_SECURE_KEY_ALIAS", HKS_TAG_SECURE_KEY_ALIAS);
206
207 AddInt32PropertyInLite(tag, "HUKS_TAG_KEY_DOMAIN", HKS_TAG_KEY_DOMAIN);
208
209 AddInt32PropertyInLite(tag, "HUKS_TAG_PROCESS_NAME", HKS_TAG_PROCESS_NAME);
210
211 AddInt32PropertyInLite(tag, "HUKS_TAG_KEY", HKS_TAG_KEY);
212 AddInt32PropertyInLite(tag, "HUKS_TAG_AE_TAG", HKS_TAG_AE_TAG);
213 AddInt32PropertyInLite(tag, "HUKS_TAG_IS_KEY_HANDLE", HKS_TAG_IS_KEY_HANDLE);
214
215 AddInt32PropertyInLite(tag, "HUKS_TAG_OS_VERSION", HKS_TAG_OS_VERSION);
216 AddInt32PropertyInLite(tag, "HUKS_TAG_OS_PATCHLEVEL", HKS_TAG_OS_PATCHLEVEL);
217
218 AddInt32PropertyInLite(tag, "HUKS_TAG_SYMMETRIC_KEY_DATA", HKS_TAG_SYMMETRIC_KEY_DATA);
219 }
220
AddHuksTagPart3(JSIValue tag)221 static void AddHuksTagPart3(JSIValue tag)
222 {
223 AddInt32PropertyInLite(tag, "HUKS_TAG_DIGEST", HKS_TAG_DIGEST);
224 AddInt32PropertyInLite(tag, "HUKS_TAG_RSA_PSS_SALT_LEN_TYPE", HKS_TAG_RSA_PSS_SALT_LEN_TYPE);
225 AddInt32PropertyInLite(tag, "HUKS_TAG_IMPORT_KEY_TYPE", HKS_TAG_IMPORT_KEY_TYPE);
226 }
227
CreateHuksTag(void)228 static JSIValue CreateHuksTag(void)
229 {
230 JSIValue tag = JSI::CreateObject();
231
232 AddHuksTagPart1(tag);
233 AddHuksTagPart2(tag);
234 AddHuksTagPart3(tag);
235
236 return tag;
237 }
238
CreateHuksKeyDigest()239 static JSIValue CreateHuksKeyDigest()
240 {
241 JSIValue keyDigest = JSI::CreateObject();
242
243 AddInt32PropertyInLite(keyDigest, "HUKS_DIGEST_SHA1", HKS_DIGEST_SHA1);
244 AddInt32PropertyInLite(keyDigest, "HUKS_DIGEST_SHA256", HKS_DIGEST_SHA256);
245
246 return keyDigest;
247 }
248
CreateHuksImportKeyType()249 static JSIValue CreateHuksImportKeyType()
250 {
251 JSIValue importKeyType = JSI::CreateObject();
252
253 AddInt32PropertyInLite(importKeyType, "HUKS_KEY_TYPE_PUBLIC_KEY", HKS_KEY_TYPE_PUBLIC_KEY);
254 AddInt32PropertyInLite(importKeyType, "HUKS_KEY_TYPE_PRIVATE_KEY", HKS_KEY_TYPE_PRIVATE_KEY);
255 AddInt32PropertyInLite(importKeyType, "HUKS_KEY_TYPE_KEY_PAIR", HKS_KEY_TYPE_KEY_PAIR);
256
257 return importKeyType;
258 }
259
CreateHuksRsaPssSaltLenType()260 static JSIValue CreateHuksRsaPssSaltLenType()
261 {
262 JSIValue rsaPssSaltLenType = JSI::CreateObject();
263
264 AddInt32PropertyInLite(rsaPssSaltLenType, "HUKS_RSA_PSS_SALT_LEN_DIGEST", HKS_RSA_PSS_SALTLEN_DIGEST);
265 AddInt32PropertyInLite(rsaPssSaltLenType, "HUKS_RSA_PSS_SALT_LEN_MAX", HKS_RSA_PSS_SALTLEN_MAX);
266
267 return rsaPssSaltLenType;
268 }
269
InitHuksModuleEnum(JSIValue exports)270 static void InitHuksModuleEnum(JSIValue exports)
271 {
272 JSI::SetNamedProperty(exports, "HuksExceptionErrCode", CreateHuksErrCode());
273 JSI::SetNamedProperty(exports, "HuksKeyPurpose", CreateHuksKeyPurpose());
274 JSI::SetNamedProperty(exports, "HuksKeyPadding", CreateHuksKeyPadding());
275 JSI::SetNamedProperty(exports, "HuksCipherMode", CreateHuksCipherMode());
276 JSI::SetNamedProperty(exports, "HuksKeySize", CreateHuksKeySize());
277 JSI::SetNamedProperty(exports, "HuksKeyAlg", CreateHuksKeyAlg());
278 JSI::SetNamedProperty(exports, "HuksKeyFlag", CreateHuksKeyFlag());
279 JSI::SetNamedProperty(exports, "HuksKeyStorageType", CreateHuksKeyStorageType());
280 JSI::SetNamedProperty(exports, "HuksTagType", CreateHuksTagType());
281 JSI::SetNamedProperty(exports, "HuksTag", CreateHuksTag());
282 JSI::SetNamedProperty(exports, "HuksKeyDigest", CreateHuksKeyDigest());
283 JSI::SetNamedProperty(exports, "HuksImportKeyType", CreateHuksImportKeyType());
284 JSI::SetNamedProperty(exports, "HuksRsaPssSaltLenType", CreateHuksRsaPssSaltLenType());
285 }
286
InitHuksModule(JSIValue exports)287 void InitHuksModule(JSIValue exports)
288 {
289 JSI::SetModuleAPI(exports, "generateKeyItem", HksLiteModule::generateKeyItem);
290 JSI::SetModuleAPI(exports, "deleteKeyItem", HksLiteModule::deleteKeyItem);
291 JSI::SetModuleAPI(exports, "isKeyItemExist", HksLiteModule::isKeyItemExist);
292 JSI::SetModuleAPI(exports, "hasKeyItem", HksLiteModule::hasKeyItem);
293 JSI::SetModuleAPI(exports, "importKeyItem", HksLiteModule::importKeyItem);
294 JSI::SetModuleAPI(exports, "exportKeyItem", HksLiteModule::exportKeyItem);
295 JSI::SetModuleAPI(exports, "getKeyProperties", HksLiteModule::getKeyProperties);
296 JSI::SetModuleAPI(exports, "importWrappedKeyItem", HksLiteModule::importWrappedKeyItem);
297
298 JSI::SetModuleAPI(exports, "initSession", HksLiteModule::initSession);
299 JSI::SetModuleAPI(exports, "updateSession", HksLiteModule::updateSession);
300 JSI::SetModuleAPI(exports, "finishSession", HksLiteModule::finishSession);
301 JSI::SetModuleAPI(exports, "abortSession", HksLiteModule::abortSession);
302
303 InitHuksModuleEnum(exports);
304 }
305 } // namespace ACELite
306 } // namespace OHOS
307