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