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