• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 "napi_x509_certificate.h"
17 
18 #include "napi/native_node_api.h"
19 #include "napi/native_api.h"
20 #include "cf_log.h"
21 #include "cf_memory.h"
22 #include "utils.h"
23 #include "cf_object_base.h"
24 #include "cf_result.h"
25 #include "napi_cert_defines.h"
26 #include "napi_pub_key.h"
27 #include "napi_cert_utils.h"
28 
29 #include "cf_type.h"
30 #include "napi_object.h"
31 #include "napi_x509_cert_match_parameters.h"
32 
33 namespace OHOS {
34 namespace CertFramework {
35 thread_local napi_ref NapiX509Certificate::classRef_ = nullptr;
36 
37 struct CfCtx {
38     AsyncType asyncType = ASYNC_TYPE_CALLBACK;
39     napi_value promise = nullptr;
40     napi_ref callback = nullptr;
41     napi_deferred deferred = nullptr;
42     napi_async_work asyncWork = nullptr;
43 
44     CfEncodingBlob *encodingBlob = nullptr;
45     NapiX509Certificate *certClass = nullptr;
46     HcfPubKey *pubKey = nullptr;
47 
48     int32_t errCode = 0;
49     const char *errMsg = nullptr;
50     HcfX509Certificate *cert = nullptr;
51     CfObject *object = nullptr;
52     CfEncodingBlob *encoded = nullptr;
53 };
54 
NapiX509Certificate(HcfX509Certificate * x509Cert,CfObject * object)55 NapiX509Certificate::NapiX509Certificate(HcfX509Certificate *x509Cert, CfObject *object)
56 {
57     this->x509Cert_ = x509Cert;
58     this->certObject_ = object;
59 }
60 
~NapiX509Certificate()61 NapiX509Certificate::~NapiX509Certificate()
62 {
63     CfObjDestroy(this->x509Cert_);
64     if (this->certObject_ != nullptr) {
65         this->certObject_->destroy(&(this->certObject_));
66     }
67 }
68 
FreeCryptoFwkCtx(napi_env env,CfCtx * context)69 static void FreeCryptoFwkCtx(napi_env env, CfCtx *context)
70 {
71     if (context == nullptr) {
72         return;
73     }
74 
75     if (context->asyncWork != nullptr) {
76         napi_delete_async_work(env, context->asyncWork);
77     }
78 
79     if (context->callback != nullptr) {
80         napi_delete_reference(env, context->callback);
81     }
82 
83     CfEncodingBlobDataFree(context->encodingBlob);
84     CfFree(context->encodingBlob);
85     context->encodingBlob = nullptr;
86 
87     CfEncodingBlobDataFree(context->encoded);
88     CfFree(context->encoded);
89     context->encoded = nullptr;
90 
91     CfFree(context);
92 }
93 
ReturnCallbackResult(napi_env env,CfCtx * context,napi_value result)94 static void ReturnCallbackResult(napi_env env, CfCtx *context, napi_value result)
95 {
96     napi_value businessError = nullptr;
97     if (context->errCode != CF_SUCCESS) {
98         businessError = CertGenerateBusinessError(env, context->errCode, context->errMsg);
99     }
100     napi_value params[ARGS_SIZE_TWO] = { businessError, result };
101 
102     napi_value func = nullptr;
103     napi_get_reference_value(env, context->callback, &func);
104 
105     napi_value recv = nullptr;
106     napi_value callFuncRet = nullptr;
107     napi_get_undefined(env, &recv);
108     napi_call_function(env, recv, func, ARGS_SIZE_TWO, params, &callFuncRet);
109 }
110 
ReturnPromiseResult(napi_env env,CfCtx * context,napi_value result)111 static void ReturnPromiseResult(napi_env env, CfCtx *context, napi_value result)
112 {
113     if (context->errCode == CF_SUCCESS) {
114         napi_resolve_deferred(env, context->deferred, result);
115     } else {
116         napi_reject_deferred(env, context->deferred,
117             CertGenerateBusinessError(env, context->errCode, context->errMsg));
118     }
119 }
120 
ReturnResult(napi_env env,CfCtx * context,napi_value result)121 static void ReturnResult(napi_env env, CfCtx *context, napi_value result)
122 {
123     if (context->asyncType == ASYNC_TYPE_CALLBACK) {
124         ReturnCallbackResult(env, context, result);
125     } else {
126         ReturnPromiseResult(env, context, result);
127     }
128 }
129 
CreateCallbackAndPromise(napi_env env,CfCtx * context,size_t argc,size_t maxCount,napi_value callbackValue)130 static bool CreateCallbackAndPromise(napi_env env, CfCtx *context, size_t argc,
131     size_t maxCount, napi_value callbackValue)
132 {
133     context->asyncType = GetAsyncType(env, argc, maxCount, callbackValue);
134     if (context->asyncType == ASYNC_TYPE_CALLBACK) {
135         if (!CertGetCallbackFromJSParams(env, callbackValue, &context->callback)) {
136             LOGE("x509 certificate: get callback failed!");
137             return false;
138         }
139     } else {
140         napi_create_promise(env, &context->deferred, &context->promise);
141     }
142     return true;
143 }
144 
VerifyExecute(napi_env env,void * data)145 static void VerifyExecute(napi_env env, void *data)
146 {
147     LOGI("start to verify.");
148     CfCtx *context = static_cast<CfCtx *>(data);
149     HcfX509Certificate *cert = context->certClass->GetX509Cert();
150     context->errCode = cert->base.verify(&(cert->base), context->pubKey);
151     if (context->errCode != CF_SUCCESS) {
152         LOGE("verify cert failed!");
153         context->errMsg = "verify cert failed";
154     }
155 }
156 
VerifyComplete(napi_env env,napi_status status,void * data)157 static void VerifyComplete(napi_env env, napi_status status, void *data)
158 {
159     CfCtx *context = static_cast<CfCtx *>(data);
160     ReturnResult(env, context, CertNapiGetNull(env));
161     FreeCryptoFwkCtx(env, context);
162 }
163 
GetEncodedExecute(napi_env env,void * data)164 static void GetEncodedExecute(napi_env env, void *data)
165 {
166     CfCtx *context = static_cast<CfCtx *>(data);
167     HcfX509Certificate *cert = context->certClass->GetX509Cert();
168     CfEncodingBlob *encodingBlob = static_cast<CfEncodingBlob *>(HcfMalloc(sizeof(CfEncodingBlob), 0));
169     if (encodingBlob == nullptr) {
170         LOGE("malloc encoding blob failed!");
171         context->errCode = CF_ERR_MALLOC;
172         context->errMsg = "malloc encoding blob failed";
173         return;
174     }
175     context->errCode = cert->base.getEncoded(&(cert->base), encodingBlob);
176     if (context->errCode != CF_SUCCESS) {
177         LOGE("get cert encoded failed!");
178         context->errMsg = "get cert encoded failed";
179     }
180     context->encoded = encodingBlob;
181 }
182 
GetEncodedComplete(napi_env env,napi_status status,void * data)183 static void GetEncodedComplete(napi_env env, napi_status status, void *data)
184 {
185     CfCtx *context = static_cast<CfCtx *>(data);
186     if (context->errCode != CF_SUCCESS) {
187         ReturnResult(env, context, nullptr);
188         FreeCryptoFwkCtx(env, context);
189         return;
190     }
191     napi_value returnEncodingBlob = ConvertEncodingBlobToNapiValue(env, context->encoded);
192     ReturnResult(env, context, returnEncodingBlob);
193     FreeCryptoFwkCtx(env, context);
194 }
195 
Verify(napi_env env,napi_callback_info info)196 napi_value NapiX509Certificate::Verify(napi_env env, napi_callback_info info)
197 {
198     size_t argc = ARGS_SIZE_TWO;
199     napi_value argv[ARGS_SIZE_TWO] = { nullptr };
200     napi_value thisVar = nullptr;
201     napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
202     if (!CertCheckArgsCount(env, argc, ARGS_SIZE_TWO, false)) {
203         return nullptr;
204     }
205 
206     CfCtx *context = static_cast<CfCtx *>(HcfMalloc(sizeof(CfCtx), 0));
207     if (context == nullptr) {
208         LOGE("malloc context failed!");
209         return nullptr;
210     }
211     context->certClass = this;
212 
213     NapiPubKey *pubKey = nullptr;
214     napi_unwrap(env, argv[PARAM0], (void**)&pubKey);
215     if (pubKey == nullptr) {
216         napi_throw(env, CertGenerateBusinessError(env, CF_INVALID_PARAMS, "public key is null"));
217         LOGE("pubKey is null!");
218         FreeCryptoFwkCtx(env, context);
219         return nullptr;
220     }
221     context->pubKey = pubKey->GetPubKey();
222 
223     if (!CreateCallbackAndPromise(env, context, argc, ARGS_SIZE_TWO, argv[PARAM1])) {
224         FreeCryptoFwkCtx(env, context);
225         return nullptr;
226     }
227 
228     napi_create_async_work(
229         env, nullptr, CertGetResourceName(env, "Verify"),
230         VerifyExecute,
231         VerifyComplete,
232         static_cast<void *>(context),
233         &context->asyncWork);
234 
235     napi_queue_async_work(env, context->asyncWork);
236     if (context->asyncType == ASYNC_TYPE_PROMISE) {
237         return context->promise;
238     } else {
239         return CertNapiGetNull(env);
240     }
241 }
242 
GetEncoded(napi_env env,napi_callback_info info)243 napi_value NapiX509Certificate::GetEncoded(napi_env env, napi_callback_info info)
244 {
245     size_t argc = ARGS_SIZE_ONE;
246     napi_value argv[ARGS_SIZE_ONE] = { nullptr };
247     napi_value thisVar = nullptr;
248     napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
249     if (!CertCheckArgsCount(env, argc, ARGS_SIZE_ONE, false)) {
250         return nullptr;
251     }
252 
253     CfCtx *context = static_cast<CfCtx *>(HcfMalloc(sizeof(CfCtx), 0));
254     if (context == nullptr) {
255         LOGE("malloc context failed!");
256         return nullptr;
257     }
258     context->certClass = this;
259 
260     if (!CreateCallbackAndPromise(env, context, argc, ARGS_SIZE_ONE, argv[PARAM0])) {
261         FreeCryptoFwkCtx(env, context);
262         return nullptr;
263     }
264 
265     napi_create_async_work(
266         env, nullptr, CertGetResourceName(env, "GetEncoded"),
267         GetEncodedExecute,
268         GetEncodedComplete,
269         static_cast<void *>(context),
270         &context->asyncWork);
271 
272     napi_queue_async_work(env, context->asyncWork);
273     if (context->asyncType == ASYNC_TYPE_PROMISE) {
274         return context->promise;
275     } else {
276         return CertNapiGetNull(env);
277     }
278 }
279 
GetPublicKey(napi_env env,napi_callback_info info)280 napi_value NapiX509Certificate::GetPublicKey(napi_env env, napi_callback_info info)
281 {
282     HcfX509Certificate *cert = GetX509Cert();
283     HcfPubKey *returnPubKey = nullptr;
284     CfResult ret = cert->base.getPublicKey(&(cert->base), &returnPubKey);
285     if (ret != CF_SUCCESS) {
286         napi_throw(env, CertGenerateBusinessError(env, ret, "get cert public key failed!"));
287         LOGE("get cert public key failed!");
288         return nullptr;
289     }
290 
291     NapiPubKey *pubKeyClass = new (std::nothrow) NapiPubKey(returnPubKey);
292     if (pubKeyClass == nullptr) {
293         napi_throw(env, CertGenerateBusinessError(env, CF_ERR_MALLOC, "Failed to create a pubkey class"));
294         LOGE("create for x509 cert's public key obj failed");
295         CfObjDestroy(returnPubKey);
296         return nullptr;
297     }
298     napi_value instance = pubKeyClass->ConvertToJsPubKey(env);
299     napi_wrap(
300         env, instance, pubKeyClass,
301         [](napi_env env, void *data, void *hint) {
302             NapiPubKey *pubKeyClass = static_cast<NapiPubKey *>(data);
303             CfObjDestroy(pubKeyClass->GetPubKey());
304             delete pubKeyClass;
305             return;
306         },
307         nullptr, nullptr);
308     return instance;
309 }
310 
CheckValidityWithDate(napi_env env,napi_callback_info info)311 napi_value NapiX509Certificate::CheckValidityWithDate(napi_env env, napi_callback_info info)
312 {
313     size_t argc = ARGS_SIZE_ONE;
314     napi_value argv[ARGS_SIZE_ONE] = { nullptr };
315     napi_value thisVar = nullptr;
316     napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
317     if (!CertCheckArgsCount(env, argc, ARGS_SIZE_ONE, true)) {
318         return nullptr;
319     }
320     std::string date;
321     if (!CertGetStringFromJSParams(env, argv[PARAM0], date)) {
322         LOGE("get date param failed!");
323         return nullptr;
324     }
325     HcfX509Certificate *cert = GetX509Cert();
326     CfResult ret = cert->checkValidityWithDate(cert, date.c_str());
327     if (ret != CF_SUCCESS) {
328         napi_throw(env, CertGenerateBusinessError(env, ret, "check cert validity failed!"));
329         LOGE("check cert validity failed!");
330     }
331     return nullptr;
332 }
333 
GetVersion(napi_env env,napi_callback_info info)334 napi_value NapiX509Certificate::GetVersion(napi_env env, napi_callback_info info)
335 {
336     HcfX509Certificate *cert = GetX509Cert();
337     int version = cert->getVersion(cert);
338     napi_value result = nullptr;
339     napi_create_int32(env, version, &result);
340     return result;
341 }
342 
GetSerialNumber(napi_env env,napi_callback_info info)343 napi_value NapiX509Certificate::GetSerialNumber(napi_env env, napi_callback_info info)
344 {
345     HcfX509Certificate *cert = GetX509Cert();
346     CfBlob blob = { 0, nullptr };
347     CfResult ret = cert->getSerialNumber(cert, &blob);
348     if (ret != CF_SUCCESS) {
349         napi_throw(env, CertGenerateBusinessError(env, ret, "cert get serial num failed"));
350         LOGE("cert get serial num failed!");
351         return nullptr;
352     }
353 
354     napi_value result = ConvertBlobToInt64(env, blob);
355     CfBlobDataFree(&blob);
356     return result;
357 }
358 
GetCertSerialNumber(napi_env env,napi_callback_info info)359 napi_value NapiX509Certificate::GetCertSerialNumber(napi_env env, napi_callback_info info)
360 {
361     HcfX509Certificate *cert = GetX509Cert();
362     CfBlob blob = { 0, nullptr };
363     CfResult ret = cert->getSerialNumber(cert, &blob);
364     if (ret != CF_SUCCESS) {
365         napi_throw(env, CertGenerateBusinessError(env, ret, "cert get serial num failed"));
366         LOGE("cert get serial num failed!");
367         return nullptr;
368     }
369 
370     napi_value result = ConvertBlobToBigIntWords(env, blob);
371     CfBlobDataFree(&blob);
372     return result;
373 }
374 
GetIssuerName(napi_env env,napi_callback_info info)375 napi_value NapiX509Certificate::GetIssuerName(napi_env env, napi_callback_info info)
376 {
377     CfBlob *blob = reinterpret_cast<CfBlob *>(HcfMalloc(sizeof(CfBlob), 0));
378     if (blob == nullptr) {
379         LOGE("malloc blob failed!");
380         return nullptr;
381     }
382     HcfX509Certificate *cert = GetX509Cert();
383     CfResult ret = cert->getIssuerName(cert, blob);
384     if (ret != CF_SUCCESS) {
385         napi_throw(env, CertGenerateBusinessError(env, ret, "get issuer name failed"));
386         LOGE("getIssuerName failed!");
387         CfFree(blob);
388         blob = nullptr;
389         return nullptr;
390     }
391     napi_value returnValue = CertConvertBlobToNapiValue(env, blob);
392     CfBlobDataFree(blob);
393     CfFree(blob);
394     blob = nullptr;
395     return returnValue;
396 }
397 
GetSubjectName(napi_env env,napi_callback_info info)398 napi_value NapiX509Certificate::GetSubjectName(napi_env env, napi_callback_info info)
399 {
400     CfBlob *blob = reinterpret_cast<CfBlob *>(HcfMalloc(sizeof(CfBlob), 0));
401     if (blob == nullptr) {
402         LOGE("malloc blob failed!");
403         return nullptr;
404     }
405     HcfX509Certificate *cert = GetX509Cert();
406     CfResult ret = cert->getSubjectName(cert, blob);
407     if (ret != CF_SUCCESS) {
408         napi_throw(env, CertGenerateBusinessError(env, ret, "get subject name failed"));
409         LOGE("getSubjectName failed!");
410         CfFree(blob);
411         blob = nullptr;
412         return nullptr;
413     }
414     napi_value returnValue = CertConvertBlobToNapiValue(env, blob);
415     CfBlobDataFree(blob);
416     CfFree(blob);
417     blob = nullptr;
418     return returnValue;
419 }
420 
GetNotBeforeTime(napi_env env,napi_callback_info info)421 napi_value NapiX509Certificate::GetNotBeforeTime(napi_env env, napi_callback_info info)
422 {
423     CfBlob *blob = reinterpret_cast<CfBlob *>(HcfMalloc(sizeof(CfBlob), 0));
424     if (blob == nullptr) {
425         LOGE("malloc blob failed!");
426         return nullptr;
427     }
428     HcfX509Certificate *cert = GetX509Cert();
429     CfResult res = cert->getNotBeforeTime(cert, blob);
430     if (res != CF_SUCCESS) {
431         napi_throw(env, CertGenerateBusinessError(env, res, "get not before time failed"));
432         LOGE("getNotBeforeTime failed!");
433         CfFree(blob);
434         blob = nullptr;
435         return nullptr;
436     }
437     napi_value result = nullptr;
438     napi_create_string_utf8(env, reinterpret_cast<char *>(blob->data), blob->size, &result);
439     CfBlobDataFree(blob);
440     CfFree(blob);
441     blob = nullptr;
442     return result;
443 }
444 
GetNotAfterTime(napi_env env,napi_callback_info info)445 napi_value NapiX509Certificate::GetNotAfterTime(napi_env env, napi_callback_info info)
446 {
447     CfBlob *blob = reinterpret_cast<CfBlob *>(HcfMalloc(sizeof(CfBlob), 0));
448     if (blob == nullptr) {
449         LOGE("malloc blob failed!");
450         return nullptr;
451     }
452     HcfX509Certificate *cert = GetX509Cert();
453     CfResult res = cert->getNotAfterTime(cert, blob);
454     if (res != CF_SUCCESS) {
455         napi_throw(env, CertGenerateBusinessError(env, res, "get not after time failed"));
456         LOGE("getNotAfterTime failed!");
457         CfFree(blob);
458         blob = nullptr;
459         return nullptr;
460     }
461     napi_value result = nullptr;
462     napi_create_string_utf8(env, reinterpret_cast<char *>(blob->data), blob->size, &result);
463     CfBlobDataFree(blob);
464     CfFree(blob);
465     blob = nullptr;
466     return result;
467 }
468 
GetSignature(napi_env env,napi_callback_info info)469 napi_value NapiX509Certificate::GetSignature(napi_env env, napi_callback_info info)
470 {
471     CfBlob *blob = reinterpret_cast<CfBlob *>(HcfMalloc(sizeof(CfBlob), 0));
472     if (blob == nullptr) {
473         LOGE("malloc blob failed!");
474         return nullptr;
475     }
476     HcfX509Certificate *cert = GetX509Cert();
477     CfResult ret = cert->getSignature(cert, blob);
478     if (ret != CF_SUCCESS) {
479         napi_throw(env, CertGenerateBusinessError(env, ret, "get signature failed"));
480         LOGE("getSignature failed!");
481         CfFree(blob);
482         blob = nullptr;
483         return nullptr;
484     }
485     napi_value returnValue = CertConvertBlobToNapiValue(env, blob);
486     CfBlobDataFree(blob);
487     CfFree(blob);
488     blob = nullptr;
489     return returnValue;
490 }
491 
GetSigAlgName(napi_env env,napi_callback_info info)492 napi_value NapiX509Certificate::GetSigAlgName(napi_env env, napi_callback_info info)
493 {
494     CfBlob *blob = reinterpret_cast<CfBlob *>(HcfMalloc(sizeof(CfBlob), 0));
495     if (blob == nullptr) {
496         LOGE("malloc blob failed!");
497         return nullptr;
498     }
499     HcfX509Certificate *cert = GetX509Cert();
500     CfResult res = cert->getSignatureAlgName(cert, blob);
501     if (res != CF_SUCCESS) {
502         napi_throw(env, CertGenerateBusinessError(env, res, "get signature alg name failed"));
503         LOGE("getSignatureAlgName failed!");
504         CfFree(blob);
505         blob = nullptr;
506         return nullptr;
507     }
508     napi_value result = nullptr;
509     napi_create_string_utf8(env, reinterpret_cast<char *>(blob->data), blob->size, &result);
510     CfBlobDataFree(blob);
511     CfFree(blob);
512     blob = nullptr;
513     return result;
514 }
515 
GetSigAlgOID(napi_env env,napi_callback_info info)516 napi_value NapiX509Certificate::GetSigAlgOID(napi_env env, napi_callback_info info)
517 {
518     CfBlob *blob = reinterpret_cast<CfBlob *>(HcfMalloc(sizeof(CfBlob), 0));
519     if (blob == nullptr) {
520         LOGE("malloc blob failed!");
521         return nullptr;
522     }
523     HcfX509Certificate *cert = GetX509Cert();
524     CfResult res = cert->getSignatureAlgOid(cert, blob);
525     if (res != CF_SUCCESS) {
526         napi_throw(env, CertGenerateBusinessError(env, res, "get signature alg oid failed"));
527         LOGE("getSignatureAlgOid failed!");
528         CfFree(blob);
529         blob = nullptr;
530         return nullptr;
531     }
532     napi_value result = nullptr;
533     napi_create_string_utf8(env, reinterpret_cast<char *>(blob->data), blob->size, &result);
534     CfBlobDataFree(blob);
535     CfFree(blob);
536     blob = nullptr;
537     return result;
538 }
539 
GetSigAlgParams(napi_env env,napi_callback_info info)540 napi_value NapiX509Certificate::GetSigAlgParams(napi_env env, napi_callback_info info)
541 {
542     CfBlob *blob = reinterpret_cast<CfBlob *>(HcfMalloc(sizeof(CfBlob), 0));
543     if (blob == nullptr) {
544         LOGE("malloc blob failed!");
545         return nullptr;
546     }
547     HcfX509Certificate *cert = GetX509Cert();
548     CfResult ret = cert->getSignatureAlgParams(cert, blob);
549     if (ret != CF_SUCCESS) {
550         napi_throw(env, CertGenerateBusinessError(env, ret, "get signature alg params failed"));
551         LOGE("getSignatureAlgParams failed!");
552         CfFree(blob);
553         blob = nullptr;
554         return nullptr;
555     }
556     napi_value returnValue = CertConvertBlobToNapiValue(env, blob);
557     CfBlobDataFree(blob);
558     CfFree(blob);
559     blob = nullptr;
560     return returnValue;
561 }
562 
GetKeyUsage(napi_env env,napi_callback_info info)563 napi_value NapiX509Certificate::GetKeyUsage(napi_env env, napi_callback_info info)
564 {
565     CfBlob *blob = reinterpret_cast<CfBlob *>(HcfMalloc(sizeof(CfBlob), 0));
566     if (blob == nullptr) {
567         LOGE("malloc blob failed!");
568         return nullptr;
569     }
570     HcfX509Certificate *cert = GetX509Cert();
571     CfResult ret = cert->getKeyUsage(cert, blob);
572     if (ret != CF_SUCCESS) {
573         napi_throw(env, CertGenerateBusinessError(env, ret, "get key usage failed"));
574         LOGE("getKeyUsage failed!");
575         CfFree(blob);
576         blob = nullptr;
577         return nullptr;
578     }
579     napi_value returnValue = CertConvertBlobToNapiValue(env, blob);
580     CfBlobDataFree(blob);
581     CfFree(blob);
582     blob = nullptr;
583     return returnValue;
584 }
585 
GetExtendedKeyUsage(napi_env env,napi_callback_info info)586 napi_value NapiX509Certificate::GetExtendedKeyUsage(napi_env env, napi_callback_info info)
587 {
588     CfArray *array = reinterpret_cast<CfArray *>(HcfMalloc(sizeof(CfArray), 0));
589     if (array == nullptr) {
590         LOGE("malloc array failed!");
591         return nullptr;
592     }
593     HcfX509Certificate *cert = GetX509Cert();
594     CfResult ret = cert->getExtKeyUsage(cert, array);
595     if (ret != CF_SUCCESS) {
596         napi_throw(env, CertGenerateBusinessError(env, ret, "get ext key usage failed"));
597         LOGE("call getExtKeyUsage failed!");
598         CfFree(array);
599         array = nullptr;
600         return nullptr;
601     }
602     napi_value returnValue = ConvertArrayToNapiValue(env, array);
603     CfArrayDataClearAndFree(array);
604     CfFree(array);
605     array = nullptr;
606     return returnValue;
607 }
608 
609 
GetBasicConstraints(napi_env env,napi_callback_info info)610 napi_value NapiX509Certificate::GetBasicConstraints(napi_env env, napi_callback_info info)
611 {
612     HcfX509Certificate *cert = GetX509Cert();
613     int32_t constrains = cert->getBasicConstraints(cert);
614     napi_value result = nullptr;
615     napi_create_int32(env, constrains, &result);
616     return result;
617 }
618 
GetSubjectAlternativeNames(napi_env env,napi_callback_info info)619 napi_value NapiX509Certificate::GetSubjectAlternativeNames(napi_env env, napi_callback_info info)
620 {
621     CfArray *array = reinterpret_cast<CfArray *>(HcfMalloc(sizeof(CfArray), 0));
622     if (array == nullptr) {
623         LOGE("malloc array failed!");
624         return nullptr;
625     }
626     HcfX509Certificate *cert = GetX509Cert();
627     CfResult ret = cert->getSubjectAltNames(cert, array);
628     if (ret != CF_SUCCESS) {
629         napi_throw(env, CertGenerateBusinessError(env, ret, "get subject alt names failed"));
630         LOGE("call getSubjectAltNames failed!");
631         CfFree(array);
632         array = nullptr;
633         return nullptr;
634     }
635     napi_value returnValue = ConvertArrayToNapiValue(env, array);
636     CfArrayDataClearAndFree(array);
637     CfFree(array);
638     array = nullptr;
639     return returnValue;
640 }
641 
GetIssuerAlternativeNames(napi_env env,napi_callback_info info)642 napi_value NapiX509Certificate::GetIssuerAlternativeNames(napi_env env, napi_callback_info info)
643 {
644     CfArray *array = reinterpret_cast<CfArray *>(HcfMalloc(sizeof(CfArray), 0));
645     if (array == nullptr) {
646         LOGE("malloc array failed!");
647         return nullptr;
648     }
649     HcfX509Certificate *cert = GetX509Cert();
650     CfResult ret = cert->getIssuerAltNames(cert, array);
651     if (ret != CF_SUCCESS) {
652         napi_throw(env, CertGenerateBusinessError(env, ret, "get issuer alt names failed"));
653         LOGE("call getIssuerAltNames failed!");
654         CfFree(array);
655         array = nullptr;
656         return nullptr;
657     }
658     napi_value returnValue = ConvertArrayToNapiValue(env, array);
659     CfArrayDataClearAndFree(array);
660     CfFree(array);
661     array = nullptr;
662     return returnValue;
663 }
664 
Match(napi_env env,napi_callback_info info)665 napi_value NapiX509Certificate::Match(napi_env env, napi_callback_info info)
666 {
667     LOGI("enter NapiX509Certificate::match");
668     size_t argc = ARGS_SIZE_ONE;
669     napi_value argv[ARGS_SIZE_ONE] = { nullptr };
670     napi_value thisVar = nullptr;
671     napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
672     if (!CertCheckArgsCount(env, argc, ARGS_SIZE_ONE, false)) {
673         napi_throw(env, CertGenerateBusinessError(env, CF_INVALID_PARAMS, "CertCheckArgsCount failed"));
674         LOGE("CertCheckArgsCount failed!");
675         return nullptr;
676     }
677 
678     HcfX509CertMatchParams *param = static_cast<HcfX509CertMatchParams *>(HcfMalloc(sizeof(HcfX509CertMatchParams), 0));
679     if (param == nullptr) {
680         napi_throw(env, CertGenerateBusinessError(env, CF_ERR_MALLOC, "malloc param failed"));
681         LOGE("malloc matchParams failed!");
682         return nullptr;
683     }
684     if (!BuildX509CertMatchParams(env, argv[PARAM0], param)) {
685         napi_throw(env, CertGenerateBusinessError(env, CF_INVALID_PARAMS, "BuildX509CertMatchParams failed"));
686         LOGE("BuildX509CertMatchParams failed!");
687         FreeX509CertMatchParams(param);
688         return nullptr;
689     }
690     bool boolFlag = false;
691     CfResult result = MatchProc(param, boolFlag);
692     if (result != CF_SUCCESS) {
693         napi_throw(env, CertGenerateBusinessError(env, result, "match failed"));
694         LOGE("call match failed!");
695         FreeX509CertMatchParams(param);
696         return nullptr;
697     }
698     FreeX509CertMatchParams(param);
699     napi_value ret = nullptr;
700     napi_get_boolean(env, boolFlag, &ret);
701     return ret;
702 }
703 
MatchProc(HcfX509CertMatchParams * param,bool & boolFlag)704 CfResult NapiX509Certificate::MatchProc(HcfX509CertMatchParams *param, bool &boolFlag)
705 {
706     HcfX509Certificate *cert = GetX509Cert();
707     return cert->match(cert, param, &boolFlag);
708 }
709 
NapiVerify(napi_env env,napi_callback_info info)710 static napi_value NapiVerify(napi_env env, napi_callback_info info)
711 {
712     napi_value thisVar = nullptr;
713     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
714     NapiX509Certificate *x509Cert = nullptr;
715     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
716     if (x509Cert == nullptr) {
717         LOGE("x509Cert is nullptr!");
718         return nullptr;
719     }
720     return x509Cert->Verify(env, info);
721 }
722 
NapiGetEncoded(napi_env env,napi_callback_info info)723 static napi_value NapiGetEncoded(napi_env env, napi_callback_info info)
724 {
725     napi_value thisVar = nullptr;
726     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
727     NapiX509Certificate *x509Cert = nullptr;
728     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
729     if (x509Cert == nullptr) {
730         LOGE("x509Cert is nullptr!");
731         return nullptr;
732     }
733     return x509Cert->GetEncoded(env, info);
734 }
735 
NapiGetPublicKey(napi_env env,napi_callback_info info)736 static napi_value NapiGetPublicKey(napi_env env, napi_callback_info info)
737 {
738     napi_value thisVar = nullptr;
739     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
740     NapiX509Certificate *x509Cert = nullptr;
741     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
742     if (x509Cert == nullptr) {
743         LOGE("x509Cert is nullptr!");
744         return nullptr;
745     }
746     return x509Cert->GetPublicKey(env, info);
747 }
748 
NapiCheckValidityWithDate(napi_env env,napi_callback_info info)749 static napi_value NapiCheckValidityWithDate(napi_env env, napi_callback_info info)
750 {
751     napi_value thisVar = nullptr;
752     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
753     NapiX509Certificate *x509Cert = nullptr;
754     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
755     if (x509Cert == nullptr) {
756         LOGE("x509Cert is nullptr!");
757         return nullptr;
758     }
759     return x509Cert->CheckValidityWithDate(env, info);
760 }
761 
NapiGetVersion(napi_env env,napi_callback_info info)762 static napi_value NapiGetVersion(napi_env env, napi_callback_info info)
763 {
764     napi_value thisVar = nullptr;
765     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
766     NapiX509Certificate *x509Cert = nullptr;
767     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
768     if (x509Cert == nullptr) {
769         LOGE("x509Cert is nullptr!");
770         return nullptr;
771     }
772     return x509Cert->GetVersion(env, info);
773 }
774 
NapiGetSerialNumber(napi_env env,napi_callback_info info)775 static napi_value NapiGetSerialNumber(napi_env env, napi_callback_info info)
776 {
777     napi_value thisVar = nullptr;
778     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
779     NapiX509Certificate *x509Cert = nullptr;
780     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
781     if (x509Cert == nullptr) {
782         LOGE("x509Cert is nullptr!");
783         return nullptr;
784     }
785     return x509Cert->GetSerialNumber(env, info);
786 }
787 
NapiGetCertSerialNumber(napi_env env,napi_callback_info info)788 static napi_value NapiGetCertSerialNumber(napi_env env, napi_callback_info info)
789 {
790     napi_value thisVar = nullptr;
791     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
792     NapiX509Certificate *x509Cert = nullptr;
793     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
794     if (x509Cert == nullptr) {
795         LOGE("x509Cert is nullptr!");
796         return nullptr;
797     }
798     return x509Cert->GetCertSerialNumber(env, info);
799 }
800 
NapiGetIssuerName(napi_env env,napi_callback_info info)801 static napi_value NapiGetIssuerName(napi_env env, napi_callback_info info)
802 {
803     napi_value thisVar = nullptr;
804     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
805     NapiX509Certificate *x509Cert = nullptr;
806     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
807     if (x509Cert == nullptr) {
808         LOGE("x509Cert is nullptr!");
809         return nullptr;
810     }
811     return x509Cert->GetIssuerName(env, info);
812 }
813 
NapiGetSubjectName(napi_env env,napi_callback_info info)814 static napi_value NapiGetSubjectName(napi_env env, napi_callback_info info)
815 {
816     napi_value thisVar = nullptr;
817     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
818     NapiX509Certificate *x509Cert = nullptr;
819     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
820     if (x509Cert == nullptr) {
821         LOGE("x509Cert is nullptr!");
822         return nullptr;
823     }
824     return x509Cert->GetSubjectName(env, info);
825 }
826 
NapiGetNotBeforeTime(napi_env env,napi_callback_info info)827 static napi_value NapiGetNotBeforeTime(napi_env env, napi_callback_info info)
828 {
829     napi_value thisVar = nullptr;
830     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
831     NapiX509Certificate *x509Cert = nullptr;
832     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
833     if (x509Cert == nullptr) {
834         LOGE("x509Cert is nullptr!");
835         return nullptr;
836     }
837     return x509Cert->GetNotBeforeTime(env, info);
838 }
839 
NapiGetNotAfterTime(napi_env env,napi_callback_info info)840 static napi_value NapiGetNotAfterTime(napi_env env, napi_callback_info info)
841 {
842     napi_value thisVar = nullptr;
843     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
844     NapiX509Certificate *x509Cert = nullptr;
845     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
846     if (x509Cert == nullptr) {
847         LOGE("x509Cert is nullptr!");
848         return nullptr;
849     }
850     return x509Cert->GetNotAfterTime(env, info);
851 }
852 
NapiGetSignature(napi_env env,napi_callback_info info)853 static napi_value NapiGetSignature(napi_env env, napi_callback_info info)
854 {
855     napi_value thisVar = nullptr;
856     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
857     NapiX509Certificate *x509Cert = nullptr;
858     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
859     if (x509Cert == nullptr) {
860         LOGE("x509Cert is nullptr!");
861         return nullptr;
862     }
863     return x509Cert->GetSignature(env, info);
864 }
865 
NapiGetSigAlgName(napi_env env,napi_callback_info info)866 static napi_value NapiGetSigAlgName(napi_env env, napi_callback_info info)
867 {
868     napi_value thisVar = nullptr;
869     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
870     NapiX509Certificate *x509Cert = nullptr;
871     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
872     if (x509Cert == nullptr) {
873         LOGE("x509Cert is nullptr!");
874         return nullptr;
875     }
876     return x509Cert->GetSigAlgName(env, info);
877 }
878 
NapiGetSigAlgOID(napi_env env,napi_callback_info info)879 static napi_value NapiGetSigAlgOID(napi_env env, napi_callback_info info)
880 {
881     napi_value thisVar = nullptr;
882     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
883     NapiX509Certificate *x509Cert = nullptr;
884     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
885     if (x509Cert == nullptr) {
886         LOGE("x509Cert is nullptr!");
887         return nullptr;
888     }
889     return x509Cert->GetSigAlgOID(env, info);
890 }
891 
NapiGetSigAlgParams(napi_env env,napi_callback_info info)892 static napi_value NapiGetSigAlgParams(napi_env env, napi_callback_info info)
893 {
894     napi_value thisVar = nullptr;
895     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
896     NapiX509Certificate *x509Cert = nullptr;
897     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
898     if (x509Cert == nullptr) {
899         LOGE("x509Cert is nullptr!");
900         return nullptr;
901     }
902     return x509Cert->GetSigAlgParams(env, info);
903 }
904 
NapiGetKeyUsage(napi_env env,napi_callback_info info)905 static napi_value NapiGetKeyUsage(napi_env env, napi_callback_info info)
906 {
907     napi_value thisVar = nullptr;
908     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
909     NapiX509Certificate *x509Cert = nullptr;
910     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
911     if (x509Cert == nullptr) {
912         LOGE("x509Cert is nullptr!");
913         return nullptr;
914     }
915     return x509Cert->GetKeyUsage(env, info);
916 }
917 
NapiGetExtendedKeyUsage(napi_env env,napi_callback_info info)918 static napi_value NapiGetExtendedKeyUsage(napi_env env, napi_callback_info info)
919 {
920     napi_value thisVar = nullptr;
921     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
922     NapiX509Certificate *x509Cert = nullptr;
923     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
924     if (x509Cert == nullptr) {
925         LOGE("x509Cert is nullptr!");
926         return nullptr;
927     }
928     return x509Cert->GetExtendedKeyUsage(env, info);
929 }
930 
NapiGetBasicConstraints(napi_env env,napi_callback_info info)931 static napi_value NapiGetBasicConstraints(napi_env env, napi_callback_info info)
932 {
933     napi_value thisVar = nullptr;
934     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
935     NapiX509Certificate *x509Cert = nullptr;
936     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
937     if (x509Cert == nullptr) {
938         LOGE("x509Cert is nullptr!");
939         return nullptr;
940     }
941     return x509Cert->GetBasicConstraints(env, info);
942 }
943 
NapiGetSubjectAlternativeNames(napi_env env,napi_callback_info info)944 static napi_value NapiGetSubjectAlternativeNames(napi_env env, napi_callback_info info)
945 {
946     napi_value thisVar = nullptr;
947     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
948     NapiX509Certificate *x509Cert = nullptr;
949     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
950     if (x509Cert == nullptr) {
951         LOGE("x509Cert is nullptr!");
952         return nullptr;
953     }
954     return x509Cert->GetSubjectAlternativeNames(env, info);
955 }
956 
NapiGetIssuerAlternativeNames(napi_env env,napi_callback_info info)957 static napi_value NapiGetIssuerAlternativeNames(napi_env env, napi_callback_info info)
958 {
959     napi_value thisVar = nullptr;
960     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
961     NapiX509Certificate *x509Cert = nullptr;
962     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
963     if (x509Cert == nullptr) {
964         LOGE("x509Cert is nullptr!");
965         return nullptr;
966     }
967     return x509Cert->GetIssuerAlternativeNames(env, info);
968 }
969 
NapiGetItem(napi_env env,napi_callback_info info)970 static napi_value NapiGetItem(napi_env env, napi_callback_info info)
971 {
972     napi_value thisVar = nullptr;
973     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
974     NapiX509Certificate *x509Cert = nullptr;
975     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
976     if (x509Cert == nullptr) {
977         LOGE("x509Cert is nullptr!");
978         return nullptr;
979     }
980     CfObject *obj = x509Cert->GetCertObject();
981     if (obj == nullptr) {
982         LOGE("object is nullptr!");
983         return nullptr;
984     }
985 
986     return CommonOperation(env, info, obj, OPERATION_TYPE_GET, CF_GET_TYPE_CERT_ITEM);
987 }
988 
NapiMatch(napi_env env,napi_callback_info info)989 static napi_value NapiMatch(napi_env env, napi_callback_info info)
990 {
991     napi_value thisVar = nullptr;
992     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
993     NapiX509Certificate *x509Cert = nullptr;
994     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&x509Cert));
995     if (x509Cert == nullptr) {
996         LOGE("x509Cert is nullptr!");
997         return nullptr;
998     }
999     return x509Cert->Match(env, info);
1000 }
1001 
CreateX509CertExecute(napi_env env,void * data)1002 void NapiX509Certificate::CreateX509CertExecute(napi_env env, void *data)
1003 {
1004     CfCtx *context = static_cast<CfCtx *>(data);
1005     context->errCode = HcfX509CertificateCreate(context->encodingBlob, &context->cert);
1006     if (context->errCode != CF_SUCCESS) {
1007         context->errMsg = "create X509Cert failed";
1008         return;
1009     }
1010 
1011     context->errCode = CfCreate(CF_OBJ_TYPE_CERT, context->encodingBlob, &context->object);
1012     if (context->errCode != CF_SUCCESS) {
1013         context->errMsg = "create certObj failed";
1014     }
1015 }
1016 
CreateX509CertComplete(napi_env env,napi_status status,void * data)1017 void NapiX509Certificate::CreateX509CertComplete(napi_env env, napi_status status, void *data)
1018 {
1019     CfCtx *context = static_cast<CfCtx *>(data);
1020     if (context->errCode != CF_SUCCESS) {
1021         LOGE("call create X509Cert failed!");
1022         ReturnResult(env, context, nullptr);
1023         FreeCryptoFwkCtx(env, context);
1024         return;
1025     }
1026     napi_value instance = CreateX509Cert(env);
1027     NapiX509Certificate *x509CertClass = new (std::nothrow) NapiX509Certificate(context->cert, context->object);
1028     if (x509CertClass == nullptr) {
1029         context->errCode = CF_ERR_MALLOC;
1030         context->errMsg = "Failed to create x509Cert class";
1031         LOGE("Failed to create x509Cert class");
1032         CfObjDestroy(context->cert);
1033         if (context->object != nullptr) {
1034             context->object->destroy(&(context->object));
1035         }
1036         ReturnResult(env, context, nullptr);
1037         FreeCryptoFwkCtx(env, context);
1038         return;
1039     }
1040     napi_wrap(
1041         env, instance, x509CertClass,
1042         [](napi_env env, void *data, void *hint) {
1043             NapiX509Certificate *certClass = static_cast<NapiX509Certificate *>(data);
1044             delete certClass;
1045             return;
1046         },
1047         nullptr, nullptr);
1048     ReturnResult(env, context, instance);
1049     FreeCryptoFwkCtx(env, context);
1050 }
1051 
NapiCreateX509Cert(napi_env env,napi_callback_info info)1052 napi_value NapiX509Certificate::NapiCreateX509Cert(napi_env env, napi_callback_info info)
1053 {
1054     size_t argc = ARGS_SIZE_TWO;
1055     napi_value argv[ARGS_SIZE_TWO] = { nullptr };
1056     napi_value thisVar = nullptr;
1057     napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
1058     if (!CertCheckArgsCount(env, argc, ARGS_SIZE_TWO, false)) {
1059         return nullptr;
1060     }
1061 
1062     CfCtx *context = static_cast<CfCtx *>(HcfMalloc(sizeof(CfCtx), 0));
1063     if (context == nullptr) {
1064         LOGE("malloc context failed!");
1065         return nullptr;
1066     }
1067     if (!GetEncodingBlobFromValue(env, argv[PARAM0], &context->encodingBlob)) {
1068         LOGE("get encoding blob from data failed!");
1069         FreeCryptoFwkCtx(env, context);
1070         return nullptr;
1071     }
1072 
1073     if (!CreateCallbackAndPromise(env, context, argc, ARGS_SIZE_TWO, argv[PARAM1])) {
1074         FreeCryptoFwkCtx(env, context);
1075         return nullptr;
1076     }
1077 
1078     napi_create_async_work(
1079         env, nullptr, CertGetResourceName(env, "CreateX509Cert"),
1080         CreateX509CertExecute,
1081         CreateX509CertComplete,
1082         static_cast<void *>(context),
1083         &context->asyncWork);
1084 
1085     napi_queue_async_work(env, context->asyncWork);
1086     if (context->asyncType == ASYNC_TYPE_PROMISE) {
1087         return context->promise;
1088     } else {
1089         return CertNapiGetNull(env);
1090     }
1091 }
1092 
X509CertConstructor(napi_env env,napi_callback_info info)1093 static napi_value X509CertConstructor(napi_env env, napi_callback_info info)
1094 {
1095     napi_value thisVar = nullptr;
1096     napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
1097     return thisVar;
1098 }
1099 
DefineX509CertJSClass(napi_env env,napi_value exports)1100 void NapiX509Certificate::DefineX509CertJSClass(napi_env env, napi_value exports)
1101 {
1102     napi_property_descriptor desc[] = {
1103         DECLARE_NAPI_FUNCTION("createX509Cert", NapiCreateX509Cert),
1104     };
1105     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
1106 
1107     napi_property_descriptor x509CertDesc[] = {
1108         DECLARE_NAPI_FUNCTION("verify", NapiVerify),
1109         DECLARE_NAPI_FUNCTION("getEncoded", NapiGetEncoded),
1110         DECLARE_NAPI_FUNCTION("getPublicKey", NapiGetPublicKey),
1111         DECLARE_NAPI_FUNCTION("checkValidityWithDate", NapiCheckValidityWithDate),
1112         DECLARE_NAPI_FUNCTION("getVersion", NapiGetVersion),
1113         DECLARE_NAPI_FUNCTION("getSerialNumber", NapiGetSerialNumber),
1114         DECLARE_NAPI_FUNCTION("getCertSerialNumber", NapiGetCertSerialNumber),
1115         DECLARE_NAPI_FUNCTION("getIssuerName", NapiGetIssuerName),
1116         DECLARE_NAPI_FUNCTION("getSubjectName", NapiGetSubjectName),
1117         DECLARE_NAPI_FUNCTION("getNotBeforeTime", NapiGetNotBeforeTime),
1118         DECLARE_NAPI_FUNCTION("getNotAfterTime", NapiGetNotAfterTime),
1119         DECLARE_NAPI_FUNCTION("getSignature", NapiGetSignature),
1120         DECLARE_NAPI_FUNCTION("getSignatureAlgName", NapiGetSigAlgName),
1121         DECLARE_NAPI_FUNCTION("getSignatureAlgOid", NapiGetSigAlgOID),
1122         DECLARE_NAPI_FUNCTION("getSignatureAlgParams", NapiGetSigAlgParams),
1123         DECLARE_NAPI_FUNCTION("getKeyUsage", NapiGetKeyUsage),
1124         DECLARE_NAPI_FUNCTION("getExtKeyUsage", NapiGetExtendedKeyUsage),
1125         DECLARE_NAPI_FUNCTION("getBasicConstraints", NapiGetBasicConstraints),
1126         DECLARE_NAPI_FUNCTION("getSubjectAltNames", NapiGetSubjectAlternativeNames),
1127         DECLARE_NAPI_FUNCTION("getIssuerAltNames", NapiGetIssuerAlternativeNames),
1128         DECLARE_NAPI_FUNCTION("getItem", NapiGetItem),
1129         DECLARE_NAPI_FUNCTION("match", NapiMatch),
1130     };
1131     napi_value constructor = nullptr;
1132     napi_define_class(env, "X509Cert", NAPI_AUTO_LENGTH, X509CertConstructor, nullptr,
1133         sizeof(x509CertDesc) / sizeof(x509CertDesc[0]), x509CertDesc, &constructor);
1134     napi_create_reference(env, constructor, 1, &classRef_);
1135 }
1136 
CreateX509Cert(napi_env env)1137 napi_value NapiX509Certificate::CreateX509Cert(napi_env env)
1138 {
1139     napi_value constructor = nullptr;
1140     napi_value instance = nullptr;
1141     napi_get_reference_value(env, classRef_, &constructor);
1142     napi_new_instance(env, constructor, 0, nullptr, &instance);
1143     return instance;
1144 }
1145 } // namespace CertFramework
1146 } // namespace OHOS
1147