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 #include "jsi_api.h"
17 #include "jsi_api_common.h"
18 #include "jsi_api_errcode.h"
19 #include "jsi_utils.h"
20 #include "jsi_list.h"
21 #include "securec.h"
22 #include "log.h"
23
24 namespace OHOS {
25 namespace ACELite {
26
CreateMd(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)27 JSIValue CryptoFrameworkLiteModule::CreateMd(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)
28 {
29 (void)thisVal;
30 if ((args == nullptr) || (argsNum != ARRAY_INDEX_ONE)) {
31 LOGE("CreateMd args is err!");
32 return ThrowErrorCodeResult(HCF_INVALID_PARAMS);
33 }
34 char *alg = JSI::ValueToString(args[0]);
35 if (alg == nullptr) {
36 LOGE("Update alg is null!");
37 return ThrowErrorCodeResult(HCF_INVALID_PARAMS);
38 }
39
40 HcfMd *mdObj = nullptr;
41 HcfResult res = HcfMdCreate(reinterpret_cast<const char *>(alg), &mdObj);
42 if (res != HCF_SUCCESS) {
43 LOGE("CreateMd is mdObj err res %d!", res);
44 JSI::ReleaseString(alg);
45 return ThrowErrorCodeResult(res);
46 }
47 res = ListAddObjNode(JSI_ALG_MD, (uint32_t)mdObj);
48 if (res != HCF_SUCCESS) {
49 LOGE("md add node is %d err!", res);
50 HcfObjDestroy(static_cast<void *>(mdObj));
51 JSI::ReleaseString(alg);
52 return ThrowErrorCodeResult(res);
53 }
54
55 JSIValue serviceObj = JSI::CreateObject();
56 JSIValue update = JSI::CreateFunction(Update);
57 JSIValue updateSync = JSI::CreateFunction(UpdateSync);
58 JSIValue digest = JSI::CreateFunction(Digest);
59 JSIValue digestSync = JSI::CreateFunction(DigestSync);
60 JSIValue getMdLength = JSI::CreateFunction(GetMdLength);
61 JSI::SetNamedProperty(serviceObj, "update", update);
62 JSI::SetNamedProperty(serviceObj, "updateSync", updateSync);
63 JSI::SetNamedProperty(serviceObj, "digest", digest);
64 JSI::SetNamedProperty(serviceObj, "digestSync", digestSync);
65 JSI::SetNamedProperty(serviceObj, "getMdLength", getMdLength);
66 JSI::SetNumberProperty(serviceObj, "mdObj", (double)(uint32_t)mdObj);
67 JSI::ReleaseValueList(update, updateSync, digest, digestSync, getMdLength, ARGS_END);
68
69 JSI::ReleaseString(alg);
70 return serviceObj;
71 }
72
Update(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)73 JSIValue CryptoFrameworkLiteModule::Update(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)
74 {
75 if ((args == nullptr) || (argsNum != ARRAY_MAX_SIZE)) {
76 LOGE("Update args is null!");
77 return JSI::CreateUndefined();
78 }
79 HcfMd *mdObj = reinterpret_cast<HcfMd *>((uint32_t)JSI::GetNumberProperty(thisVal, "mdObj"));
80 if (mdObj == nullptr) {
81 LOGE("Update mdObj is null!!");
82 CallbackErrorCodeOrDataResult(thisVal, args[ARRAY_INDEX_ONE], HCF_INVALID_PARAMS, JSI::CreateNull());
83 return JSI::CreateUndefined();
84 }
85
86 JSIValue inVlaue = JSI::GetNamedProperty(args[ARRAY_INDEX_ZERO], "data");
87 HcfBlob inBlob = { .data = nullptr, .len = 0 };
88 HcfResult errCode = ParseUint8ArrayToBlob(inVlaue, &inBlob);
89 if (errCode != HCF_SUCCESS) {
90 LOGE("Update inBlob is null!");
91 CallbackErrorCodeOrDataResult(thisVal, args[ARRAY_INDEX_ONE], HCF_INVALID_PARAMS, JSI::CreateNull());
92 return JSI::CreateUndefined();
93 }
94
95 errCode = mdObj->update(mdObj, &inBlob);
96 HcfBlobDataClearAndFree(&inBlob);
97 if (errCode != HCF_SUCCESS) {
98 LOGE("Update errCode not is success!");
99 CallbackErrorCodeOrDataResult(thisVal, args[ARRAY_INDEX_ONE], errCode, JSI::CreateNull());
100 return JSI::CreateUndefined();
101 }
102 CallbackErrorCodeOrDataResult(thisVal, args[ARRAY_INDEX_ONE], HCF_SUCCESS, JSI::CreateNull());
103
104 return JSI::CreateUndefined();
105 }
106
UpdateSync(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)107 JSIValue CryptoFrameworkLiteModule::UpdateSync(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)
108 {
109 if ((args == nullptr) || (argsNum != ARRAY_INDEX_ONE)) {
110 LOGE("UpdateSync args is null!");
111 return ThrowErrorCodeResult(HCF_INVALID_PARAMS);
112 }
113 HcfMd *mdObj = reinterpret_cast<HcfMd *>((uint32_t)JSI::GetNumberProperty(thisVal, "mdObj"));
114 if (mdObj == nullptr) {
115 LOGE("UpdateSync mdObj is null!!");
116 return ThrowErrorCodeResult(HCF_INVALID_PARAMS);
117 }
118 JSIValue inVlaue = JSI::GetNamedProperty(args[ARRAY_INDEX_ZERO], "data");
119 HcfBlob inBlob = { .data = nullptr, .len = 0 };
120 HcfResult errCode = ParseUint8ArrayToBlob(inVlaue, &inBlob);
121 if (errCode != HCF_SUCCESS) {
122 LOGE("UpdateSync inBlob is null!");
123 return ThrowErrorCodeResult(errCode);
124 }
125
126 errCode = mdObj->update(mdObj, &inBlob);
127 HcfBlobDataClearAndFree(&inBlob);
128 if (errCode != HCF_SUCCESS) {
129 LOGE("UpdateSync update ret is error!");
130 }
131
132 return ThrowErrorCodeResult(errCode);
133 }
134
Digest(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)135 JSIValue CryptoFrameworkLiteModule::Digest(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)
136 {
137 if ((args == nullptr) || (argsNum != ARRAY_INDEX_ONE)) {
138 LOGE("Digest args is err or mdObj nullptr!");
139 return JSI::CreateUndefined();
140 }
141 HcfMd *mdObj = reinterpret_cast<HcfMd *>((uint32_t)JSI::GetNumberProperty(thisVal, "mdObj"));
142 if (mdObj == nullptr) {
143 LOGE("Digest mdObj is null!!");
144 CallbackErrorCodeOrDataResult(thisVal, args[ARRAY_INDEX_ONE], HCF_INVALID_PARAMS, JSI::CreateUndefined());
145 return JSI::CreateUndefined();
146 }
147 HcfBlob outBlob = { .data = nullptr, .len = 0 };
148 HcfResult errCode = mdObj->doFinal(mdObj, &outBlob);
149 if (errCode != HCF_SUCCESS) {
150 LOGE("Digest errCode not is success!");
151 HcfBlobDataClearAndFree(&outBlob);
152 CallbackErrorCodeOrDataResult(thisVal, args[ARRAY_INDEX_ONE], errCode, JSI::CreateUndefined());
153 return JSI::CreateUndefined();
154 }
155 JSIValue outVlaue = ConstructJSIReturnResult(&outBlob);
156 CallbackErrorCodeOrDataResult(thisVal, args[0], errCode, outVlaue);
157 HcfBlobDataClearAndFree(&outBlob);
158
159 return JSI::CreateUndefined();
160 }
161
DigestSync(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)162 JSIValue CryptoFrameworkLiteModule::DigestSync(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)
163 {
164 (void)args;
165 (void)argsNum;
166 HcfMd *mdObj = reinterpret_cast<HcfMd *>((uint32_t)JSI::GetNumberProperty(thisVal, "mdObj"));
167 if (mdObj == nullptr) {
168 LOGE("DigestSync mdObj is null!!");
169 return ThrowErrorCodeResult(HCF_INVALID_PARAMS);
170 }
171
172 HcfBlob outBlob = { .data = nullptr, .len = 0 };
173 HcfResult errCode = mdObj->doFinal(mdObj, &outBlob);
174 if (errCode != HCF_SUCCESS) {
175 LOGE("DigestSync errCode not is success!");
176 HcfBlobDataClearAndFree(&outBlob);
177 return ThrowErrorCodeResult(errCode);
178 }
179
180 JSIValue mdSyncData = ConstructJSIReturnResult(&outBlob);
181 HcfBlobDataClearAndFree(&outBlob);
182
183 return mdSyncData;
184 }
185
GetMdLength(const JSIValue thisVal,const JSIValue * args,uint8_t argsNum)186 JSIValue CryptoFrameworkLiteModule::GetMdLength(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)
187 {
188 (void)args;
189 (void)argsNum;
190 HcfMd *mdObj = reinterpret_cast<HcfMd *>((uint32_t)JSI::GetNumberProperty(thisVal, "mdObj"));
191 if (mdObj == nullptr) {
192 LOGE("GetMdLength mdObj is null!");
193 return ThrowErrorCodeResult(HCF_INVALID_PARAMS);
194 }
195
196 return JSI::CreateNumber(mdObj->getMdLength(mdObj));
197 }
198
MdDestroy(void)199 void CryptoFrameworkLiteModule::MdDestroy(void)
200 {
201 ListDestroy(JSI_ALG_MD);
202 }
203
204 } // namespace ACELite
205 } // namespace OHOS
206