From db1fd07e4b9137a1a28558a0c42fbcdaf8a88a61 Mon Sep 17 00:00:00 2001 From: lcc Date: Fri, 26 Jan 2024 17:11:57 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E3=80=90=E7=AE=97=E6=B3=95=E5=BA=93?= =?UTF-8?q?=E9=80=82=E9=85=8D=E5=B1=82=E3=80=91=E7=AE=97=E6=B3=95=E5=BA=93?= =?UTF-8?q?=E9=80=82=E9=85=8D=E5=B1=82=E6=8F=90=E4=BE=9BJS=E5=AF=B9?= =?UTF-8?q?=E7=A7=B0=E5=AF=86=E9=92=A5=E7=94=9F=E6=88=90=E8=83=BD=E5=8A=9B?= =?UTF-8?q?=E7=9A=84=E5=90=8C=E6=AD=A5=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../napi/crypto/inc/napi_sym_key_generator.h | 2 + .../crypto/src/napi_sym_key_generator.cpp | 115 ++++++++++++++++++ 2 files changed, 117 insertions(+) diff --git a/frameworks/js/napi/crypto/inc/napi_sym_key_generator.h b/frameworks/js/napi/crypto/inc/napi_sym_key_generator.h index 92f6591..e1cda31 100644 --- a/frameworks/js/napi/crypto/inc/napi_sym_key_generator.h +++ b/frameworks/js/napi/crypto/inc/napi_sym_key_generator.h @@ -36,6 +36,8 @@ public: static napi_value JsGenerateSymKey(napi_env env, napi_callback_info info); static napi_value JsGetAlgorithm(napi_env env, napi_callback_info info); static napi_value JsConvertKey(napi_env env, napi_callback_info info); + static napi_value JsGenerateSymKeySync(napi_env env, napi_callback_info info); + static napi_value JsConvertKeySync(napi_env env, napi_callback_info info); static thread_local napi_ref classRef_; private: diff --git a/frameworks/js/napi/crypto/src/napi_sym_key_generator.cpp b/frameworks/js/napi/crypto/src/napi_sym_key_generator.cpp index 918ac65..98ae41e 100644 --- a/frameworks/js/napi/crypto/src/napi_sym_key_generator.cpp +++ b/frameworks/js/napi/crypto/src/napi_sym_key_generator.cpp @@ -310,6 +310,28 @@ HcfSymKeyGenerator *NapiSymKeyGenerator::GetSymKeyGenerator() const return this->generator_; } +static bool napiGetInstance(napi_env env, HcfSymKey *key, napi_value instance) +{ + NapiSymKey *napiSymKey = new (std::nothrow) NapiSymKey(key); + if (napiSymKey == nullptr) { + LOGE("new napi sym key failed."); + return false; + } + + napi_status wrapStatus = napi_wrap(env, instance, napiSymKey, + [](napi_env env, void *data, void *hint) { + NapiSymKey *napiSymKey = static_cast(data); + delete napiSymKey; + return; + }, nullptr, nullptr); + if (wrapStatus != napi_ok) { + LOGE("failed to wrap napiSymKey obj!"); + delete napiSymKey; + return false; + } + return true; +} + napi_value NapiSymKeyGenerator::JsGenerateSymKey(napi_env env, napi_callback_info info) { SymKeyGeneratorFwkCtx context = static_cast(HcfMalloc(sizeof(SymKeyGeneratorFwkCtxT), 0)); @@ -335,6 +357,43 @@ napi_value NapiSymKeyGenerator::JsGenerateSymKey(napi_env env, napi_callback_inf return result; } +napi_value NapiSymKeyGenerator::JsGenerateSymKeySync(napi_env env, napi_callback_info info) +{ + napi_value thisVar = nullptr; + napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr); + NapiSymKeyGenerator *napiGenerator = nullptr; + napi_status unwrapStatus = napi_unwrap(env, thisVar, reinterpret_cast(&napiGenerator)); + if (unwrapStatus != napi_ok || napiGenerator == nullptr) { + LOGE("failed to unwrap NapiSymKeyGenerator obj!"); + napi_throw(env, GenerateBusinessError(env, HCF_ERR_MALLOC, "failed to unwrap NapiSymKeyGenerator obj.")); + return nullptr; + } + + HcfSymKeyGenerator *generator = napiGenerator->GetSymKeyGenerator(); + if (generator == nullptr) { + LOGE("failed to get generator obj!"); + napi_throw(env, GenerateBusinessError(env, HCF_ERR_MALLOC, "failed to get generator obj!")); + return nullptr; + } + + HcfSymKey *key = nullptr; + HcfResult ret = generator->generateSymKey(generator, &key); + if (ret != HCF_SUCCESS) { + LOGE("generate sym key failed."); + napi_throw(env, GenerateBusinessError(env, HCF_ERR_MALLOC, "generate sym key failed")); + return nullptr; + } + + napi_value instance = NapiSymKey::CreateSymKey(env); + if (!napiGetInstance(env, key, instance)) { + LOGE("get instance failed!"); + napi_throw(env, GenerateBusinessError(env, HCF_NOT_SUPPORT, "get instance failed!")); + return nullptr; + } + + return instance; +} + napi_value NapiSymKeyGenerator::JsConvertKey(napi_env env, napi_callback_info info) { SymKeyGeneratorFwkCtx context = static_cast(HcfMalloc(sizeof(SymKeyGeneratorFwkCtxT), 0)); @@ -360,6 +419,60 @@ napi_value NapiSymKeyGenerator::JsConvertKey(napi_env env, napi_callback_info in return result; } +napi_value NapiSymKeyGenerator::JsConvertKeySync(napi_env env, napi_callback_info info) +{ + napi_value thisVar = nullptr; + size_t expectedArgc = ARGS_SIZE_TWO; + size_t argc = ARGS_SIZE_TWO; + napi_value argv[ARGS_SIZE_TWO] = { nullptr }; + napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr); + if (argc != expectedArgc && argc != expectedArgc - 1) { + LOGE("wrong argument num. require 1 or 2 arguments. [Argc]: %zu!", argc); + return nullptr; + } + + NapiSymKeyGenerator *napiGenerator = nullptr; + napi_status unwrapStatus = napi_unwrap(env, thisVar, reinterpret_cast(&napiGenerator)); + if (unwrapStatus != napi_ok || napiGenerator == nullptr) { + LOGE("failed to unwrap NapiSymKeyGenerator obj!"); + napi_throw(env, GenerateBusinessError(env, HCF_ERR_MALLOC, "new napi sym key failed.")); + return nullptr; + } + + size_t index = 0; + HcfBlob *keyMaterial = GetBlobFromNapiDataBlob(env, argv[index++]); + if (keyMaterial == nullptr) { + LOGE("get keyMaterial failed!"); + napi_throw(env, GenerateBusinessError(env, HCF_INVALID_PARAMS, "get keyMaterial failed!.")); + return nullptr; + } + + HcfSymKeyGenerator *generator = napiGenerator->GetSymKeyGenerator(); + if (generator == nullptr) { + LOGE("failed to get generator obj!"); + napi_throw(env, GenerateBusinessError(env, HCF_NOT_SUPPORT, "failed to get generator obj!")); + HcfBlobDataFree(keyMaterial); + HcfFree(keyMaterial); + return nullptr; + } + + HcfSymKey *key = nullptr; + HcfResult ret = generator->convertSymKey(generator, keyMaterial, &key); + if (ret != HCF_SUCCESS) { + LOGE("convertSymKey key failed!"); + napi_throw(env, GenerateBusinessError(env, HCF_NOT_SUPPORT, "convertSymKey key failed!")); + return nullptr; + } + napi_value instance = NapiSymKey::CreateSymKey(env); + if (!napiGetInstance(env, key, instance)) { + LOGE("get instance failed!"); + napi_throw(env, GenerateBusinessError(env, HCF_NOT_SUPPORT, "get instance failed!")); + return nullptr; + } + + return instance; +} + napi_value NapiSymKeyGenerator::SymKeyGeneratorConstructor(napi_env env, napi_callback_info info) { napi_value thisVar = nullptr; @@ -451,7 +564,9 @@ void NapiSymKeyGenerator::DefineSymKeyGeneratorJSClass(napi_env env, napi_value napi_property_descriptor classDesc[] = { DECLARE_NAPI_FUNCTION("generateSymKey", NapiSymKeyGenerator::JsGenerateSymKey), + DECLARE_NAPI_FUNCTION("generateSymKeySync", NapiSymKeyGenerator::JsGenerateSymKeySync), DECLARE_NAPI_FUNCTION("convertKey", NapiSymKeyGenerator::JsConvertKey), + DECLARE_NAPI_FUNCTION("convertKeySync", NapiSymKeyGenerator::JsConvertKeySync), { .utf8name = "algName", .getter = NapiSymKeyGenerator::JsGetAlgorithm }, }; napi_value constructor = nullptr; -- Gitee From e4d4d1a1f4d0090f480e304dadb059d2d230dcb3 Mon Sep 17 00:00:00 2001 From: lichaochen Date: Thu, 1 Feb 2024 11:41:50 +0000 Subject: [PATCH 2/2] update frameworks/js/napi/crypto/src/napi_sym_key_generator.cpp. Signed-off-by: lichaochen --- frameworks/js/napi/crypto/src/napi_sym_key_generator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/js/napi/crypto/src/napi_sym_key_generator.cpp b/frameworks/js/napi/crypto/src/napi_sym_key_generator.cpp index 98ae41e..8193953 100644 --- a/frameworks/js/napi/crypto/src/napi_sym_key_generator.cpp +++ b/frameworks/js/napi/crypto/src/napi_sym_key_generator.cpp @@ -463,7 +463,7 @@ napi_value NapiSymKeyGenerator::JsConvertKeySync(napi_env env, napi_callback_inf napi_throw(env, GenerateBusinessError(env, HCF_NOT_SUPPORT, "convertSymKey key failed!")); return nullptr; } - napi_value instance = NapiSymKey::CreateSymKey(env); + napi_value instance = NapiSymKey::CreateSymKey(env); if (!napiGetInstance(env, key, instance)) { LOGE("get instance failed!"); napi_throw(env, GenerateBusinessError(env, HCF_NOT_SUPPORT, "get instance failed!")); -- Gitee