• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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