From 5b23360a53fe4e0e5a2b53d57ff6a018b69822be Mon Sep 17 00:00:00 2001 From: kang1024 Date: Thu, 22 May 2025 15:12:45 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=97=E6=B3=95=E5=BA=93arkts=E9=9D=99?= =?UTF-8?q?=E6=80=81=E5=8C=96=E5=AF=86=E9=92=A5=E5=8F=82=E6=95=B0=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: kang1024 --- frameworks/js/ani/dts/cryptoFramework.d.ts | 12 -- ...rity.cryptoFramework.cryptoFramework.taihe | 24 ++-- frameworks/js/ani/inc/ani_cipher.h | 4 +- frameworks/js/ani/inc/ani_common.h | 21 +++ frameworks/js/ani/inc/ani_pri_key.h | 2 +- frameworks/js/ani/inc/ani_pub_key.h | 2 +- frameworks/js/ani/inc/ani_sign.h | 4 +- frameworks/js/ani/inc/ani_verify.h | 4 +- .../js/ani/src/ani_asy_key_generator.cpp | 2 +- .../ani/src/ani_asy_key_generator_by_spec.cpp | 2 +- frameworks/js/ani/src/ani_cipher.cpp | 77 ++++++++++- frameworks/js/ani/src/ani_common.cpp | 79 +++++++++-- frameworks/js/ani/src/ani_dh_key_util.cpp | 2 +- frameworks/js/ani/src/ani_ecc_key_util.cpp | 2 +- frameworks/js/ani/src/ani_kdf.cpp | 2 +- frameworks/js/ani/src/ani_key_agreement.cpp | 2 +- frameworks/js/ani/src/ani_mac.cpp | 6 +- frameworks/js/ani/src/ani_md.cpp | 2 +- frameworks/js/ani/src/ani_pri_key.cpp | 58 +++++++- frameworks/js/ani/src/ani_pub_key.cpp | 62 ++++++++- frameworks/js/ani/src/ani_rand.cpp | 2 +- frameworks/js/ani/src/ani_sign.cpp | 83 ++++++++++- .../js/ani/src/ani_sym_key_generator.cpp | 2 +- frameworks/js/ani/src/ani_verify.cpp | 105 ++++++++++++-- ...y.cryptoFramework.cryptoFramework.impl.cpp | 20 +-- .../js/ani/test/test_asy_key_generator.ets | 129 +++++++++++++++++- .../test/test_asy_key_generator_by_spec.ets | 36 ++--- frameworks/js/ani/test/test_cipher.ets | 20 ++- frameworks/js/ani/test/test_kdf.ets | 6 +- frameworks/js/ani/test/test_key_agreement.ets | 6 +- frameworks/js/ani/test/test_sign.ets | 19 ++- frameworks/js/ani/test/test_verify.ets | 46 ++++++- 32 files changed, 725 insertions(+), 118 deletions(-) diff --git a/frameworks/js/ani/dts/cryptoFramework.d.ts b/frameworks/js/ani/dts/cryptoFramework.d.ts index 4bed2a4..0750e32 100644 --- a/frameworks/js/ani/dts/cryptoFramework.d.ts +++ b/frameworks/js/ani/dts/cryptoFramework.d.ts @@ -102,9 +102,7 @@ declare namespace cryptoFramework { generateKeyPair(callback: AsyncCallback): void; generateKeyPair(): Promise; generateKeyPairSync(): KeyPair; - convertKey(pubKey: DataBlob, priKey: DataBlob, callback: AsyncCallback): void; convertKey(pubKey: DataBlob | null, priKey: DataBlob | null, callback: AsyncCallback): void; - convertKey(pubKey: DataBlob, priKey: DataBlob): Promise; convertKey(pubKey: DataBlob | null, priKey: DataBlob | null): Promise; convertKeySync(pubKey: DataBlob | null, priKey: DataBlob | null): KeyPair; convertPemKey(pubKey: string | null, priKey: string | null): Promise; @@ -185,17 +183,13 @@ declare namespace cryptoFramework { } interface Cipher { - init(opMode: CryptoMode, key: Key, params: ParamsSpec, callback: AsyncCallback): void; init(opMode: CryptoMode, key: Key, params: ParamsSpec | null, callback: AsyncCallback): void; - init(opMode: CryptoMode, key: Key, params: ParamsSpec): Promise; init(opMode: CryptoMode, key: Key, params: ParamsSpec | null): Promise; initSync(opMode: CryptoMode, key: Key, params: ParamsSpec | null): void; update(data: DataBlob, callback: AsyncCallback): void; update(data: DataBlob): Promise; updateSync(data: DataBlob): DataBlob; - doFinal(data: DataBlob, callback: AsyncCallback): void; doFinal(data: DataBlob | null, callback: AsyncCallback): void; - doFinal(data: DataBlob): Promise; doFinal(data: DataBlob | null): Promise; doFinalSync(data: DataBlob | null): DataBlob; setCipherSpec(itemType: CipherSpecItem, itemValue: Uint8Array): void; @@ -211,12 +205,9 @@ declare namespace cryptoFramework { update(data: DataBlob, callback: AsyncCallback): void; update(data: DataBlob): Promise; updateSync(data: DataBlob): void; - sign(data: DataBlob, callback: AsyncCallback): void; sign(data: DataBlob | null, callback: AsyncCallback): void; - sign(data: DataBlob): Promise; sign(data: DataBlob | null): Promise; signSync(data: DataBlob | null): DataBlob; - setSignSpec(itemType: SignSpecItem, itemValue: int): void; setSignSpec(itemType: SignSpecItem, itemValue: int | Uint8Array): void; getSignSpec(itemType: SignSpecItem): string | int; readonly algName: string; @@ -229,14 +220,11 @@ declare namespace cryptoFramework { update(data: DataBlob, callback: AsyncCallback): void; update(data: DataBlob): Promise; updateSync(data: DataBlob): void; - verify(data: DataBlob, signatureData: DataBlob, callback: AsyncCallback): void; verify(data: DataBlob | null, signatureData: DataBlob, callback: AsyncCallback): void; - verify(data: DataBlob, signatureData: DataBlob): Promise; verify(data: DataBlob | null, signatureData: DataBlob): Promise; verifySync(data: DataBlob | null, signatureData: DataBlob): boolean; recover(signatureData: DataBlob): Promise; recoverSync(signatureData: DataBlob): DataBlob | null; - setVerifySpec(itemType: SignSpecItem, itemValue: int): void; setVerifySpec(itemType: SignSpecItem, itemValue: int | Uint8Array): void; getVerifySpec(itemType: SignSpecItem): string | int; readonly algName: string; diff --git a/frameworks/js/ani/idl/ohos.security.cryptoFramework.cryptoFramework.taihe b/frameworks/js/ani/idl/ohos.security.cryptoFramework.cryptoFramework.taihe index d5d29fa..4b6b02c 100644 --- a/frameworks/js/ani/idl/ohos.security.cryptoFramework.cryptoFramework.taihe +++ b/frameworks/js/ani/idl/ohos.security.cryptoFramework.cryptoFramework.taihe @@ -103,7 +103,7 @@ interface Mac { @get("algName") GetAlgName(): String; } @overload("createMac") -function CreateMac(algName: String): Mac; +function CreateMacByStr(algName: String): Mac; @overload("createMac") function CreateMacBySpec(macSpec: OptExtMacSpec): Mac; @@ -121,7 +121,7 @@ enum AsyKeySpecType: i32 { KEY_PAIR_SPEC = 3 } -enum AsyKeySpecEnum: i32 { +enum AsyKeySpecItem: i32 { DSA_P_BN = 101, DSA_Q_BN = 102, DSA_G_BN = 103, @@ -154,7 +154,7 @@ enum AsyKeySpecEnum: i32 { X25519_PK_BN = 602 } -enum CipherSpecEnum: i32 { +enum CipherSpecItem: i32 { OAEP_MD_NAME_STR = 100, OAEP_MGF_NAME_STR = 101, OAEP_MGF1_MD_STR = 102, @@ -162,7 +162,7 @@ enum CipherSpecEnum: i32 { SM2_MD_NAME_STR = 104 } -enum SignSpecEnum: i32 { +enum SignSpecItem: i32 { PSS_MD_NAME_STR = 100, PSS_MGF_NAME_STR = 101, PSS_MGF1_MD_STR = 102, @@ -185,7 +185,7 @@ union OptKeySpec { interface PriKey: Key { GetPriKeyObj(): i64; ClearMem(): void; - GetAsyKeySpec(itemType: AsyKeySpecEnum): OptKeySpec; + GetAsyKeySpec(itemType: AsyKeySpecItem): OptKeySpec; GetEncodedDer(format: String): DataBlob; @overload("getEncodedPem") GetEncodedPem(format: String): String; @@ -198,7 +198,7 @@ interface PubKey: Key { static { loadLibrary("crypto_framework_ani.z"); } """) GetPubKeyObj(): i64; - GetAsyKeySpec(itemType: AsyKeySpecEnum): OptKeySpec; + GetAsyKeySpec(itemType: AsyKeySpecItem): OptKeySpec; GetEncodedDer(format: String): DataBlob; GetEncodedPem(format: String): String; } @@ -339,8 +339,8 @@ interface Cipher { @gen_async("doFinal") @gen_promise("doFinal") DoFinalSync(input: OptDataBlob): DataBlob; - SetCipherSpec(itemType: CipherSpecEnum, itemValue: @typedarray Array): void; - GetCipherSpec(itemType: CipherSpecEnum): OptStrUint8Arr; + SetCipherSpec(itemType: CipherSpecItem, itemValue: @typedarray Array): void; + GetCipherSpec(itemType: CipherSpecItem): OptStrUint8Arr; @get("algName") GetAlgName(): String; } function CreateCipher(transformation: String): Cipher; @@ -358,8 +358,8 @@ interface Verify { @gen_async("recover") @gen_promise("recover") RecoverSync(signature: DataBlob): OptDataBlob; - SetVerifySpec(itemType: SignSpecEnum, itemValue: OptIntUint8Arr): void; - GetVerifySpec(itemType: SignSpecEnum): OptStrInt; + SetVerifySpec(itemType: SignSpecItem, itemValue: OptIntUint8Arr): void; + GetVerifySpec(itemType: SignSpecItem): OptStrInt; @get("algName") GetAlgName(): String; } function CreateVerify(algName: String): Verify; @@ -374,8 +374,8 @@ interface Sign { @gen_async("sign") @gen_promise("sign") SignSync(data: OptDataBlob): DataBlob; - SetSignSpec(itemType: SignSpecEnum, itemValue: OptIntUint8Arr): void; - GetSignSpec(itemType: SignSpecEnum): OptStrInt; + SetSignSpec(itemType: SignSpecItem, itemValue: OptIntUint8Arr): void; + GetSignSpec(itemType: SignSpecItem): OptStrInt; @get("algName") GetAlgName(): String; } function CreateSign(algName: String): Sign; diff --git a/frameworks/js/ani/inc/ani_cipher.h b/frameworks/js/ani/inc/ani_cipher.h index 8cfade5..2a57537 100644 --- a/frameworks/js/ani/inc/ani_cipher.h +++ b/frameworks/js/ani/inc/ani_cipher.h @@ -29,8 +29,8 @@ public: void InitSync(CryptoMode opMode, weak::Key key, OptParamsSpec const& params); DataBlob UpdateSync(DataBlob const& input); DataBlob DoFinalSync(OptDataBlob const& input); - void SetCipherSpec(CipherSpecEnum itemType, array_view itemValue); - OptStrUint8Arr GetCipherSpec(CipherSpecEnum itemType); + void SetCipherSpec(ThCipherSpecItem itemType, array_view itemValue); + OptStrUint8Arr GetCipherSpec(ThCipherSpecItem itemType); string GetAlgName(); private: diff --git a/frameworks/js/ani/inc/ani_common.h b/frameworks/js/ani/inc/ani_common.h index 27b5054..8598be9 100644 --- a/frameworks/js/ani/inc/ani_common.h +++ b/frameworks/js/ani/inc/ani_common.h @@ -28,10 +28,27 @@ #include "object_base.h" #include "big_integer.h" +#include "key.h" +#include "cipher.h" +#include "signature.h" + namespace ANI::CryptoFramework { using namespace taihe; using namespace ohos::security::cryptoFramework::cryptoFramework; +// Resolve the issue of enumeration conflicts with the same name between inner and taihe +using HcfAsyKeySpecItem = ::AsyKeySpecItem; +using HcfCipherSpecItem = ::CipherSpecItem; +using HcfSignSpecItem = ::SignSpecItem; +using ThAsyKeySpecItem = ohos::security::cryptoFramework::cryptoFramework::AsyKeySpecItem; +using ThCipherSpecItem = ohos::security::cryptoFramework::cryptoFramework::CipherSpecItem; +using ThSignSpecItem = ohos::security::cryptoFramework::cryptoFramework::SignSpecItem; + +constexpr int SPEC_ITEM_TYPE_BIG_INT = 1; +constexpr int SPEC_ITEM_TYPE_NUM = 2; +constexpr int SPEC_ITEM_TYPE_STR = 3; +constexpr int SPEC_ITEM_TYPE_UINT8ARR = 4; + #define ANI_LOGE_THROW(code, msg) \ do { \ LOGE(msg); \ @@ -47,6 +64,10 @@ template void DataBlobToArrayU8(const T &blob, array &arr); void StringToDataBlob(const string &str, HcfBlob &blob); + +int GetAsyKeySpecType(HcfAsyKeySpecItem item); + +int GetSignSpecType(HcfSignSpecItem item); } // namespace ANI::CryptoFramework #endif // ANI_COMMON_H diff --git a/frameworks/js/ani/inc/ani_pri_key.h b/frameworks/js/ani/inc/ani_pri_key.h index 802f407..b29768d 100644 --- a/frameworks/js/ani/inc/ani_pri_key.h +++ b/frameworks/js/ani/inc/ani_pri_key.h @@ -28,7 +28,7 @@ public: int64_t GetPriKeyObj(); void ClearMem(); - OptKeySpec GetAsyKeySpec(AsyKeySpecEnum itemType); + OptKeySpec GetAsyKeySpec(ThAsyKeySpecItem itemType); DataBlob GetEncodedDer(string_view format); string GetEncodedPem(string_view format); string GetEncodedPemEx(string_view format, KeyEncodingConfig const& config); diff --git a/frameworks/js/ani/inc/ani_pub_key.h b/frameworks/js/ani/inc/ani_pub_key.h index 43ed016..5efe3bf 100644 --- a/frameworks/js/ani/inc/ani_pub_key.h +++ b/frameworks/js/ani/inc/ani_pub_key.h @@ -27,7 +27,7 @@ public: ~PubKeyImpl(); int64_t GetPubKeyObj(); - OptKeySpec GetAsyKeySpec(AsyKeySpecEnum itemType); + OptKeySpec GetAsyKeySpec(ThAsyKeySpecItem itemType); DataBlob GetEncodedDer(string_view format); string GetEncodedPem(string_view format); int64_t GetKeyObj(); diff --git a/frameworks/js/ani/inc/ani_sign.h b/frameworks/js/ani/inc/ani_sign.h index d6683e9..4a80100 100644 --- a/frameworks/js/ani/inc/ani_sign.h +++ b/frameworks/js/ani/inc/ani_sign.h @@ -29,8 +29,8 @@ public: void InitSync(weak::PriKey priKey); void UpdateSync(DataBlob const& data); DataBlob SignSync(OptDataBlob const& data); - void SetSignSpec(SignSpecEnum itemType, OptIntUint8Arr const& itemValue); - OptStrInt GetSignSpec(SignSpecEnum itemType); + void SetSignSpec(ThSignSpecItem itemType, OptIntUint8Arr const& itemValue); + OptStrInt GetSignSpec(ThSignSpecItem itemType); string GetAlgName(); private: diff --git a/frameworks/js/ani/inc/ani_verify.h b/frameworks/js/ani/inc/ani_verify.h index aeedbcc..acaa123 100644 --- a/frameworks/js/ani/inc/ani_verify.h +++ b/frameworks/js/ani/inc/ani_verify.h @@ -30,8 +30,8 @@ public: void UpdateSync(DataBlob const& input); bool VerifySync(OptDataBlob const& data, DataBlob const& signature); OptDataBlob RecoverSync(DataBlob const& signature); - void SetVerifySpec(SignSpecEnum itemType, OptIntUint8Arr const& itemValue); - OptStrInt GetVerifySpec(SignSpecEnum itemType); + void SetVerifySpec(ThSignSpecItem itemType, OptIntUint8Arr const& itemValue); + OptStrInt GetVerifySpec(ThSignSpecItem itemType); string GetAlgName(); private: diff --git a/frameworks/js/ani/src/ani_asy_key_generator.cpp b/frameworks/js/ani/src/ani_asy_key_generator.cpp index d9d99ff..be9470d 100644 --- a/frameworks/js/ani/src/ani_asy_key_generator.cpp +++ b/frameworks/js/ani/src/ani_asy_key_generator.cpp @@ -124,7 +124,7 @@ AsyKeyGenerator CreateAsyKeyGenerator(string_view algName) HcfAsyKeyGenerator *generator = nullptr; HcfResult res = HcfAsyKeyGeneratorCreate(algName.c_str(), &generator); if (res != HCF_SUCCESS) { - ANI_LOGE_THROW(res, "create C generator obj fail!"); + ANI_LOGE_THROW(res, "create generator obj fail!"); return make_holder(); } return make_holder(generator); diff --git a/frameworks/js/ani/src/ani_asy_key_generator_by_spec.cpp b/frameworks/js/ani/src/ani_asy_key_generator_by_spec.cpp index 3504d76..3f8f144 100644 --- a/frameworks/js/ani/src/ani_asy_key_generator_by_spec.cpp +++ b/frameworks/js/ani/src/ani_asy_key_generator_by_spec.cpp @@ -492,7 +492,7 @@ AsyKeyGeneratorBySpec CreateAsyKeyGeneratorBySpec(OptAsyKeySpec const& asyKeySpe HcfAsyKeyGeneratorBySpec *generator = nullptr; HcfResult res = HcfAsyKeyGeneratorBySpecCreate(spec, &generator); if (res != HCF_SUCCESS) { - ANI_LOGE_THROW(res, "create C generator spec obj fail!"); + ANI_LOGE_THROW(res, "create generator spec obj fail!"); return make_holder(); } return make_holder(generator); diff --git a/frameworks/js/ani/src/ani_cipher.cpp b/frameworks/js/ani/src/ani_cipher.cpp index 026baed..e4495de 100644 --- a/frameworks/js/ani/src/ani_cipher.cpp +++ b/frameworks/js/ani/src/ani_cipher.cpp @@ -25,6 +25,14 @@ const std::string IV_PARAMS_SPEC = "IvParamsSpec"; const std::string GCM_PARAMS_SPEC = "GcmParamsSpec"; const std::string CCM_PARAMS_SPEC = "CcmParamsSpec"; +static const std::unordered_map CIPHER_SPEC_RELATION_MAP = { + { OAEP_MD_NAME_STR, SPEC_ITEM_TYPE_STR }, + { OAEP_MGF_NAME_STR, SPEC_ITEM_TYPE_STR }, + { OAEP_MGF1_MD_STR, SPEC_ITEM_TYPE_STR }, + { OAEP_MGF1_PSRC_UINT8ARR, SPEC_ITEM_TYPE_UINT8ARR }, + { SM2_MD_NAME_STR, SPEC_ITEM_TYPE_STR }, +}; + const char *GetIvParamsSpecType() { return IV_PARAMS_SPEC.c_str(); @@ -61,6 +69,41 @@ void SetCcmParamsSpecAttribute(const CcmParamsSpec ¶ms, HcfCcmParamsSpec &cc ArrayU8ToDataBlob(params.aad.data, ccmParamsSpec.aad); ArrayU8ToDataBlob(params.authTag.data, ccmParamsSpec.tag); } + +int32_t GetCipherSpecType(HcfCipherSpecItem item) +{ + if (CIPHER_SPEC_RELATION_MAP.count(item) > 0) { + return CIPHER_SPEC_RELATION_MAP.at(item); + } + return -1; +} + +OptStrUint8Arr GetCipherSpecString(HcfCipher *cipher, HcfCipherSpecItem item) +{ + char *str = nullptr; + HcfResult res = cipher->getCipherSpecString(cipher, item, &str); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "get cipher spec string fail."); + return OptStrUint8Arr::make_STRING(""); + } + string data = string(str); + HcfFree(str); + return OptStrUint8Arr::make_STRING(data); +} + +OptStrUint8Arr GetCipherSpecUint8Array(HcfCipher *cipher, HcfCipherSpecItem item) +{ + HcfBlob outBlob = {}; + HcfResult res = cipher->getCipherSpecUint8Array(cipher, item, &outBlob); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "get cipher spec uint8 array fail."); + return OptStrUint8Arr::make_UINT8ARRAY(array{}); + } + array data = {}; + DataBlobToArrayU8(outBlob, data); + HcfBlobDataClearAndFree(&outBlob); + return OptStrUint8Arr::make_UINT8ARRAY(data); +} } // namespace namespace ANI::CryptoFramework { @@ -154,14 +197,38 @@ DataBlob CipherImpl::DoFinalSync(OptDataBlob const& input) return { data }; } -void CipherImpl::SetCipherSpec(CipherSpecEnum itemType, array_view itemValue) +void CipherImpl::SetCipherSpec(ThCipherSpecItem itemType, array_view itemValue) { - TH_THROW(std::runtime_error, "SetCipherSpec not implemented"); + if (this->cipher_ == nullptr) { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "cipher obj is nullptr!"); + return; + } + HcfBlob inBlob = {}; + ArrayU8ToDataBlob(itemValue, inBlob); + HcfCipherSpecItem item = static_cast(itemType.get_value()); + HcfResult res = this->cipher_->setCipherSpecUint8Array(this->cipher_, item, inBlob); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "set cipher spec uint8 array failed."); + return; + } } -OptStrUint8Arr CipherImpl::GetCipherSpec(CipherSpecEnum itemType) +OptStrUint8Arr CipherImpl::GetCipherSpec(ThCipherSpecItem itemType) { - TH_THROW(std::runtime_error, "GetCipherSpec not implemented"); + if (this->cipher_ == nullptr) { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "cipher obj is nullptr!"); + return OptStrUint8Arr::make_STRING(""); + } + HcfCipherSpecItem item = static_cast(itemType.get_value()); + int32_t type = GetCipherSpecType(item); + if (type == SPEC_ITEM_TYPE_STR) { + return GetCipherSpecString(this->cipher_, item); + } else if (type == SPEC_ITEM_TYPE_UINT8ARR) { + return GetCipherSpecUint8Array(this->cipher_, item); + } else { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "cipher spec item not support!"); + return OptStrUint8Arr::make_STRING(""); + } } string CipherImpl::GetAlgName() @@ -179,7 +246,7 @@ Cipher CreateCipher(string_view transformation) HcfCipher *cipher = nullptr; HcfResult res = HcfCipherCreate(transformation.c_str(), &cipher); if (res != HCF_SUCCESS) { - ANI_LOGE_THROW(res, "create C cipher obj fail!"); + ANI_LOGE_THROW(res, "create cipher obj fail!"); return make_holder(); } return make_holder(cipher); diff --git a/frameworks/js/ani/src/ani_common.cpp b/frameworks/js/ani/src/ani_common.cpp index 277a561..428b8b5 100644 --- a/frameworks/js/ani/src/ani_common.cpp +++ b/frameworks/js/ani/src/ani_common.cpp @@ -17,6 +17,8 @@ #include namespace { +using namespace ANI::CryptoFramework; + enum ResultCode { SUCCESS = 0, INVALID_PARAMS = 401, @@ -25,20 +27,63 @@ enum ResultCode { ERR_RUNTIME_ERROR = 17620002, ERR_CRYPTO_OPERATION = 17630001, }; + +static const std::unordered_map RESULT_CODE = { + { HCF_SUCCESS, SUCCESS }, + { HCF_INVALID_PARAMS, INVALID_PARAMS }, + { HCF_NOT_SUPPORT, NOT_SUPPORT }, + { HCF_ERR_MALLOC, ERR_OUT_OF_MEMORY }, + { HCF_ERR_CRYPTO_OPERATION, ERR_CRYPTO_OPERATION }, +}; + +static const std::unordered_map ASY_KEY_SPEC_RELATION_MAP = { + { DSA_P_BN, SPEC_ITEM_TYPE_BIG_INT }, + { DSA_Q_BN, SPEC_ITEM_TYPE_BIG_INT }, + { DSA_G_BN, SPEC_ITEM_TYPE_BIG_INT }, + { DSA_SK_BN, SPEC_ITEM_TYPE_BIG_INT }, + { DSA_PK_BN, SPEC_ITEM_TYPE_BIG_INT }, + { ECC_FP_P_BN, SPEC_ITEM_TYPE_BIG_INT }, + { ECC_A_BN, SPEC_ITEM_TYPE_BIG_INT }, + { ECC_B_BN, SPEC_ITEM_TYPE_BIG_INT }, + { ECC_G_X_BN, SPEC_ITEM_TYPE_BIG_INT }, + { ECC_G_Y_BN, SPEC_ITEM_TYPE_BIG_INT }, + { ECC_N_BN, SPEC_ITEM_TYPE_BIG_INT }, + { ECC_H_INT, SPEC_ITEM_TYPE_NUM }, // warning: ECC_H_NUM in JS + { ECC_SK_BN, SPEC_ITEM_TYPE_BIG_INT }, + { ECC_PK_X_BN, SPEC_ITEM_TYPE_BIG_INT }, + { ECC_PK_Y_BN, SPEC_ITEM_TYPE_BIG_INT }, + { ECC_FIELD_TYPE_STR, SPEC_ITEM_TYPE_STR }, + { ECC_FIELD_SIZE_INT, SPEC_ITEM_TYPE_NUM }, // warning: ECC_FIELD_SIZE_NUM in JS + { ECC_CURVE_NAME_STR, SPEC_ITEM_TYPE_STR }, + { RSA_N_BN, SPEC_ITEM_TYPE_BIG_INT }, + { RSA_SK_BN, SPEC_ITEM_TYPE_BIG_INT }, + { RSA_PK_BN, SPEC_ITEM_TYPE_BIG_INT }, + { DH_P_BN, SPEC_ITEM_TYPE_BIG_INT }, + { DH_G_BN, SPEC_ITEM_TYPE_BIG_INT }, + { DH_L_NUM, SPEC_ITEM_TYPE_NUM }, + { DH_PK_BN, SPEC_ITEM_TYPE_BIG_INT }, + { DH_SK_BN, SPEC_ITEM_TYPE_BIG_INT }, + { ED25519_SK_BN, SPEC_ITEM_TYPE_BIG_INT }, + { ED25519_PK_BN, SPEC_ITEM_TYPE_BIG_INT }, + { X25519_SK_BN, SPEC_ITEM_TYPE_BIG_INT }, + { X25519_PK_BN, SPEC_ITEM_TYPE_BIG_INT }, +}; + +static const std::unordered_map SIGN_SPEC_RELATION_MAP = { + { PSS_MD_NAME_STR, SPEC_ITEM_TYPE_STR }, + { PSS_MGF_NAME_STR, SPEC_ITEM_TYPE_STR }, + { PSS_MGF1_MD_STR, SPEC_ITEM_TYPE_STR }, + { PSS_SALT_LEN_INT, SPEC_ITEM_TYPE_NUM }, // warning: PSS_SALT_LEN_NUM in JS + { PSS_TRAILER_FIELD_INT, SPEC_ITEM_TYPE_NUM }, // warning: PSS_TRAILER_FIELD_NUM in JS + { SM2_USER_ID_UINT8ARR, SPEC_ITEM_TYPE_UINT8ARR }, +}; } // namespace namespace ANI::CryptoFramework { int ConvertResultCode(HcfResult res) { - static std::unordered_map resCodeMap = { - { HCF_SUCCESS, SUCCESS }, - { HCF_INVALID_PARAMS, INVALID_PARAMS }, - { HCF_NOT_SUPPORT, NOT_SUPPORT }, - { HCF_ERR_MALLOC, ERR_OUT_OF_MEMORY }, - { HCF_ERR_CRYPTO_OPERATION, ERR_CRYPTO_OPERATION } - }; - if (resCodeMap.count(res) > 0) { - return resCodeMap[res]; + if (RESULT_CODE.count(res) > 0) { + return RESULT_CODE.at(res); } return ERR_RUNTIME_ERROR; } @@ -73,4 +118,20 @@ void StringToDataBlob(const string &str, HcfBlob &blob) blob.data = str.empty() ? nullptr : reinterpret_cast(const_cast(str.c_str())); blob.len = str.size(); } + +int GetAsyKeySpecType(HcfAsyKeySpecItem item) +{ + if (ASY_KEY_SPEC_RELATION_MAP.count(item) > 0) { + return ASY_KEY_SPEC_RELATION_MAP.at(item); + } + return -1; +} + +int GetSignSpecType(HcfSignSpecItem item) +{ + if (SIGN_SPEC_RELATION_MAP.count(item) > 0) { + return SIGN_SPEC_RELATION_MAP.at(item); + } + return -1; +} } // namespace ANI::CryptoFramework diff --git a/frameworks/js/ani/src/ani_dh_key_util.cpp b/frameworks/js/ani/src/ani_dh_key_util.cpp index 784260b..4ba57df 100644 --- a/frameworks/js/ani/src/ani_dh_key_util.cpp +++ b/frameworks/js/ani/src/ani_dh_key_util.cpp @@ -29,7 +29,7 @@ DHCommonParamsSpec GenDHCommonParamsSpec(int32_t pLen, optional_view sk HcfDhCommParamsSpec *dhCommParamsSpec = nullptr; HcfResult res = HcfDhKeyUtilCreate(pLen, skLenValue, &dhCommParamsSpec); if (res != HCF_SUCCESS) { - ANI_LOGE_THROW(res, "create C dhKey obj fail!"); + ANI_LOGE_THROW(res, "create dhKey obj fail!"); return dh; } dh.base.algName = string(dhCommParamsSpec->base.algName); diff --git a/frameworks/js/ani/src/ani_ecc_key_util.cpp b/frameworks/js/ani/src/ani_ecc_key_util.cpp index 4859322..3ab8756 100644 --- a/frameworks/js/ani/src/ani_ecc_key_util.cpp +++ b/frameworks/js/ani/src/ani_ecc_key_util.cpp @@ -29,7 +29,7 @@ ECCCommonParamsSpec GenECCCommonParamsSpec(string_view curveName) HcfEccCommParamsSpec *eccCommParamsSpec = nullptr; HcfResult res = HcfEccKeyUtilCreate(curveName.c_str(), &eccCommParamsSpec); if (res != HCF_SUCCESS) { - ANI_LOGE_THROW(res, "create C eccKey obj fail!"); + ANI_LOGE_THROW(res, "create eccKey obj fail!"); return ecc; } HcfECFieldFp *tmp = reinterpret_cast(eccCommParamsSpec->field); diff --git a/frameworks/js/ani/src/ani_kdf.cpp b/frameworks/js/ani/src/ani_kdf.cpp index 5c6c5ff..c0611c9 100644 --- a/frameworks/js/ani/src/ani_kdf.cpp +++ b/frameworks/js/ani/src/ani_kdf.cpp @@ -139,7 +139,7 @@ Kdf CreateKdf(string_view algName) HcfKdf *kdf = nullptr; HcfResult res = HcfKdfCreate(algName.c_str(), &kdf); if (res != HCF_SUCCESS) { - ANI_LOGE_THROW(res, "create C kdf obj failed."); + ANI_LOGE_THROW(res, "create kdf obj failed."); return make_holder(); } return make_holder(kdf); diff --git a/frameworks/js/ani/src/ani_key_agreement.cpp b/frameworks/js/ani/src/ani_key_agreement.cpp index 0a33fe5..caaf54c 100644 --- a/frameworks/js/ani/src/ani_key_agreement.cpp +++ b/frameworks/js/ani/src/ani_key_agreement.cpp @@ -61,7 +61,7 @@ KeyAgreement CreateKeyAgreement(string_view algName) HcfKeyAgreement *keyAgreement = nullptr; HcfResult res = HcfKeyAgreementCreate(algName.c_str(), &keyAgreement); if (res != HCF_SUCCESS) { - ANI_LOGE_THROW(res, "create c keyAgreement obj fail."); + ANI_LOGE_THROW(res, "create keyAgreement obj fail."); return make_holder(); } return make_holder(keyAgreement); diff --git a/frameworks/js/ani/src/ani_mac.cpp b/frameworks/js/ani/src/ani_mac.cpp index 1326a93..0c9ea47 100644 --- a/frameworks/js/ani/src/ani_mac.cpp +++ b/frameworks/js/ani/src/ani_mac.cpp @@ -28,7 +28,7 @@ Mac CreateMacInner(HcfMacParamsSpec *spec) HcfMac *mac = nullptr; HcfResult res = HcfMacCreate(spec, &mac); if (res != HCF_SUCCESS) { - ANI_LOGE_THROW(res, "create C mac obj failed."); + ANI_LOGE_THROW(res, "create mac obj failed."); return make_holder(); } return make_holder(mac); @@ -113,7 +113,7 @@ string MacImpl::GetAlgName() return (algName == nullptr) ? "" : string(algName); } -Mac CreateMac(string_view algName) +Mac CreateMacByStr(string_view algName) { HcfHmacParamsSpec spec = {}; spec.base.algName = HMAC_ALG_NAME.c_str(); @@ -145,6 +145,6 @@ Mac CreateMacBySpec(OptExtMacSpec const& macSpec) // Since these macros are auto-generate, lint will cause false positive. // NOLINTBEGIN -TH_EXPORT_CPP_API_CreateMac(ANI::CryptoFramework::CreateMac); +TH_EXPORT_CPP_API_CreateMacByStr(ANI::CryptoFramework::CreateMacByStr); TH_EXPORT_CPP_API_CreateMacBySpec(ANI::CryptoFramework::CreateMacBySpec); // NOLINTEND diff --git a/frameworks/js/ani/src/ani_md.cpp b/frameworks/js/ani/src/ani_md.cpp index 60020f8..d2efc23 100644 --- a/frameworks/js/ani/src/ani_md.cpp +++ b/frameworks/js/ani/src/ani_md.cpp @@ -84,7 +84,7 @@ Md CreateMd(string_view algName) HcfMd *md = nullptr; HcfResult res = HcfMdCreate(algName.c_str(), &md); if (res != HCF_SUCCESS) { - ANI_LOGE_THROW(res, "create C md obj failed."); + ANI_LOGE_THROW(res, "create md obj failed."); return make_holder(); } return make_holder(md); diff --git a/frameworks/js/ani/src/ani_pri_key.cpp b/frameworks/js/ani/src/ani_pri_key.cpp index 1ce99dd..defb6af 100644 --- a/frameworks/js/ani/src/ani_pri_key.cpp +++ b/frameworks/js/ani/src/ani_pri_key.cpp @@ -14,10 +14,49 @@ */ #include "ani_pri_key.h" +#include "key.h" namespace { using namespace ANI::CryptoFramework; +OptKeySpec GetAsyKeySpecNumber(HcfPriKey *priKey, HcfAsyKeySpecItem item) +{ + int num = 0; + HcfResult res = priKey->getAsyKeySpecInt(priKey, item, &num); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "get asy key spec int fail."); + return OptKeySpec::make_INT32(-1); + } + return OptKeySpec::make_INT32(num); +} + +OptKeySpec GetAsyKeySpecString(HcfPriKey *priKey, HcfAsyKeySpecItem item) +{ + char *str = nullptr; + HcfResult res = priKey->getAsyKeySpecString(priKey, item, &str); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "get asy key spec string fail."); + return OptKeySpec::make_STRING(""); + } + string data = string(str); + HcfFree(str); + return OptKeySpec::make_STRING(data); +} + +OptKeySpec GetAsyKeySpecBigInt(HcfPriKey *priKey, HcfAsyKeySpecItem item) +{ + HcfBigInteger bigint = {}; + HcfResult res = priKey->getAsyKeySpecBigInteger(priKey, item, &bigint); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "get asy key spec biginteger failed."); + return OptKeySpec::make_BIGINT(array{}); + } + array data = {}; + DataBlobToArrayU8(bigint, data); + HcfBlobDataClearAndFree(reinterpret_cast(&bigint)); + return OptKeySpec::make_BIGINT(data); +} + string GetEncodedPemInner(const HcfPriKey *self, HcfParamsSpec *params, string_view format) { if (self == nullptr) { @@ -61,9 +100,24 @@ void PriKeyImpl::ClearMem() this->priKey_->clearMem(this->priKey_); } -OptKeySpec PriKeyImpl::GetAsyKeySpec(AsyKeySpecEnum itemType) +OptKeySpec PriKeyImpl::GetAsyKeySpec(ThAsyKeySpecItem itemType) { - TH_THROW(std::runtime_error, "GetAsyKeySpec not implemented"); + if (this->priKey_ == nullptr) { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "priKey obj is nullptr!"); + return OptKeySpec::make_INT32(-1); + } + HcfAsyKeySpecItem item = static_cast(itemType.get_value()); + int type = GetAsyKeySpecType(item); + if (type == SPEC_ITEM_TYPE_NUM) { + return GetAsyKeySpecNumber(this->priKey_, item); + } else if (type == SPEC_ITEM_TYPE_STR) { + return GetAsyKeySpecString(this->priKey_, item); + } else if (type == SPEC_ITEM_TYPE_BIG_INT) { + return GetAsyKeySpecBigInt(this->priKey_, item); + } else { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "asy key spec item not support!"); + return OptKeySpec::make_INT32(-1); + } } DataBlob PriKeyImpl::GetEncodedDer(string_view format) diff --git a/frameworks/js/ani/src/ani_pub_key.cpp b/frameworks/js/ani/src/ani_pub_key.cpp index c000e5f..fa68b34 100644 --- a/frameworks/js/ani/src/ani_pub_key.cpp +++ b/frameworks/js/ani/src/ani_pub_key.cpp @@ -14,6 +14,49 @@ */ #include "ani_pub_key.h" +#include "key.h" + +namespace { +using namespace ANI::CryptoFramework; + +OptKeySpec GetAsyKeySpecNumber(HcfPubKey *pubKey, HcfAsyKeySpecItem item) +{ + int num = 0; + HcfResult res = pubKey->getAsyKeySpecInt(pubKey, item, &num); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "get asy key spec int fail."); + return OptKeySpec::make_INT32(-1); + } + return OptKeySpec::make_INT32(num); +} + +OptKeySpec GetAsyKeySpecString(HcfPubKey *pubKey, HcfAsyKeySpecItem item) +{ + char *str = nullptr; + HcfResult res = pubKey->getAsyKeySpecString(pubKey, item, &str); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "get asy key spec string fail."); + return OptKeySpec::make_STRING(""); + } + string data = string(str); + HcfFree(str); + return OptKeySpec::make_STRING(data); +} + +OptKeySpec GetAsyKeySpecBigInt(HcfPubKey *pubKey, HcfAsyKeySpecItem item) +{ + HcfBigInteger bigint = {}; + HcfResult res = pubKey->getAsyKeySpecBigInteger(pubKey, item, &bigint); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "get asy key spec bigint failed."); + return OptKeySpec::make_BIGINT(array{}); + } + array data = {}; + DataBlobToArrayU8(bigint, data); + HcfFree(bigint.data); + return OptKeySpec::make_BIGINT(data); +} +} // namespace namespace ANI::CryptoFramework { PubKeyImpl::PubKeyImpl() {} @@ -31,9 +74,24 @@ int64_t PubKeyImpl::GetPubKeyObj() return reinterpret_cast(this->pubKey_); } -OptKeySpec PubKeyImpl::GetAsyKeySpec(AsyKeySpecEnum itemType) +OptKeySpec PubKeyImpl::GetAsyKeySpec(ThAsyKeySpecItem itemType) { - TH_THROW(std::runtime_error, "GetAsyKeySpec not implemented"); + if (this->pubKey_ == nullptr) { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "pubKey obj is nullptr!"); + return OptKeySpec::make_INT32(-1); + } + HcfAsyKeySpecItem item = static_cast(itemType.get_value()); + int type = GetAsyKeySpecType(item); + if (type == SPEC_ITEM_TYPE_NUM) { + return GetAsyKeySpecNumber(this->pubKey_, item); + } else if (type == SPEC_ITEM_TYPE_STR) { + return GetAsyKeySpecString(this->pubKey_, item); + } else if (type == SPEC_ITEM_TYPE_BIG_INT) { + return GetAsyKeySpecBigInt(this->pubKey_, item); + } else { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "asy key spec item not support!"); + return OptKeySpec::make_INT32(-1); + } } DataBlob PubKeyImpl::GetEncodedDer(string_view format) diff --git a/frameworks/js/ani/src/ani_rand.cpp b/frameworks/js/ani/src/ani_rand.cpp index 788de50..37c4f38 100644 --- a/frameworks/js/ani/src/ani_rand.cpp +++ b/frameworks/js/ani/src/ani_rand.cpp @@ -74,7 +74,7 @@ Random CreateRandom() HcfRand *rand = nullptr; HcfResult res = HcfRandCreate(&rand); if (res != HCF_SUCCESS) { - ANI_LOGE_THROW(res, "create C rand obj failed."); + ANI_LOGE_THROW(res, "create rand obj failed."); return make_holder(); } return make_holder(rand); diff --git a/frameworks/js/ani/src/ani_sign.cpp b/frameworks/js/ani/src/ani_sign.cpp index 659ee14..7cb1930 100644 --- a/frameworks/js/ani/src/ani_sign.cpp +++ b/frameworks/js/ani/src/ani_sign.cpp @@ -15,6 +15,54 @@ #include "ani_sign.h" +namespace { +using namespace ANI::CryptoFramework; + +void SetSignSaltLenInt(HcfSign *sign, HcfSignSpecItem item, int32_t saltLen) +{ + HcfResult res = sign->setSignSpecInt(sign, item, saltLen); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "set sign spec int fail."); + return; + } +} + +void SetSignUserIdUintArray(HcfSign *sign, HcfSignSpecItem item, const array &data) +{ + HcfBlob inBlob = {}; + ArrayU8ToDataBlob(data, inBlob); + HcfResult res = sign->setSignSpecUint8Array(sign, item, inBlob); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "set sign spec uint8 array fail."); + return; + } +} + +OptStrInt GetSignSpecString(HcfSign *sign, HcfSignSpecItem item) +{ + char *str = nullptr; + HcfResult res = sign->getSignSpecString(sign, item, &str); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "get sign spec string fail."); + return OptStrInt::make_STRING(""); + } + string data = string(str); + HcfFree(str); + return OptStrInt::make_STRING(data); +} + +OptStrInt GetSignSpecNumber(HcfSign *sign, HcfSignSpecItem item) +{ + int num = 0; + HcfResult res = sign->getSignSpecInt(sign, item, &num); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "get sign spec number fail."); + return OptStrInt::make_INT32(-1); + } + return OptStrInt::make_INT32(num); +} +} // namespace + namespace ANI::CryptoFramework { SignImpl::SignImpl() {} @@ -79,14 +127,39 @@ DataBlob SignImpl::SignSync(OptDataBlob const& data) return { out }; } -void SignImpl::SetSignSpec(SignSpecEnum itemType, OptIntUint8Arr const& itemValue) +void SignImpl::SetSignSpec(ThSignSpecItem itemType, OptIntUint8Arr const& itemValue) { - TH_THROW(std::runtime_error, "SetSignSpec not implemented"); + if (this->sign_ == nullptr) { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "sign obj is nullptr!"); + return; + } + HcfSignSpecItem item = static_cast(itemType.get_value()); + if (itemValue.get_tag() == OptIntUint8Arr::tag_t::INT32 && item == PSS_SALT_LEN_INT) { + return SetSignSaltLenInt(this->sign_, item, itemValue.get_INT32_ref()); + } else if (itemValue.get_tag() == OptIntUint8Arr::tag_t::UINT8ARRAY && item == SM2_USER_ID_UINT8ARR) { + return SetSignUserIdUintArray(this->sign_, item, itemValue.get_UINT8ARRAY_ref()); + } else { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "sign spec item not support!"); + return; + } } -OptStrInt SignImpl::GetSignSpec(SignSpecEnum itemType) +OptStrInt SignImpl::GetSignSpec(ThSignSpecItem itemType) { - TH_THROW(std::runtime_error, "GetSignSpec not implemented"); + if (this->sign_ == nullptr) { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "sign obj is nullptr!"); + return OptStrInt::make_INT32(-1); + } + HcfSignSpecItem item = static_cast(itemType.get_value()); + int32_t type = GetSignSpecType(item); + if (type == SPEC_ITEM_TYPE_STR) { + return GetSignSpecString(this->sign_, item); + } else if (type == SPEC_ITEM_TYPE_NUM) { + return GetSignSpecNumber(this->sign_, item); + } else { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "sign spec item not support!"); + return OptStrInt::make_INT32(-1); + } } string SignImpl::GetAlgName() @@ -96,7 +169,7 @@ string SignImpl::GetAlgName() return ""; } const char *algName = this->sign_->getAlgoName(this->sign_); - return string(algName); + return (algName == nullptr) ? "" : string(algName); } Sign CreateSign(string_view algName) diff --git a/frameworks/js/ani/src/ani_sym_key_generator.cpp b/frameworks/js/ani/src/ani_sym_key_generator.cpp index 18d4a02..0273301 100644 --- a/frameworks/js/ani/src/ani_sym_key_generator.cpp +++ b/frameworks/js/ani/src/ani_sym_key_generator.cpp @@ -74,7 +74,7 @@ SymKeyGenerator CreateSymKeyGenerator(string_view algName) HcfSymKeyGenerator *generator = nullptr; HcfResult res = HcfSymKeyGeneratorCreate(algName.c_str(), &generator); if (res != HCF_SUCCESS) { - ANI_LOGE_THROW(res, "create C generator obj fail."); + ANI_LOGE_THROW(res, "create generator obj fail."); return make_holder(); } return make_holder(generator); diff --git a/frameworks/js/ani/src/ani_verify.cpp b/frameworks/js/ani/src/ani_verify.cpp index 0504abb..fb2a772 100644 --- a/frameworks/js/ani/src/ani_verify.cpp +++ b/frameworks/js/ani/src/ani_verify.cpp @@ -16,6 +16,54 @@ #include "ani_verify.h" #include "ani_pub_key.h" +namespace { +using namespace ANI::CryptoFramework; + +void SetVerifySaltLenInt(HcfVerify *verify, HcfSignSpecItem item, int32_t saltLen) +{ + HcfResult res = verify->setVerifySpecInt(verify, item, saltLen); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "set verify spec int fail."); + return; + } +} + +void SetVerifyUserIdUintArray(HcfVerify *verify, HcfSignSpecItem item, const array &data) +{ + HcfBlob inBlob = {}; + ArrayU8ToDataBlob(data, inBlob); + HcfResult res = verify->setVerifySpecUint8Array(verify, item, inBlob); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "set verify spec uint8 array fail."); + return; + } +} + +OptStrInt GetVerifySpecString(HcfVerify *verify, HcfSignSpecItem item) +{ + char *str = nullptr; + HcfResult res = verify->getVerifySpecString(verify, item, &str); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "get verify spec string fail."); + return OptStrInt::make_STRING(""); + } + string data = string(str); + HcfFree(str); + return OptStrInt::make_STRING(data); +} + +OptStrInt GetVerifySpecNumber(HcfVerify *verify, HcfSignSpecItem item) +{ + int num = 0; + HcfResult res = verify->getVerifySpecInt(verify, item, &num); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "get verify spec number fail."); + return OptStrInt::make_INT32(-1); + } + return OptStrInt::make_INT32(num); +} +} // namespace + namespace ANI::CryptoFramework { VerifyImpl::VerifyImpl() {} @@ -68,9 +116,9 @@ bool VerifyImpl::VerifySync(OptDataBlob const& data, DataBlob const& signature) ArrayU8ToDataBlob(data.get_DATABLOB_ref().data, dataBlob); inBlob = &dataBlob; } - HcfBlob signatureData = {}; - ArrayU8ToDataBlob(signature.data, signatureData); - bool res = this->verify_->verify(this->verify_, inBlob, &signatureData); + HcfBlob signData = {}; + ArrayU8ToDataBlob(signature.data, signData); + bool res = this->verify_->verify(this->verify_, inBlob, &signData); if (!res) { LOGE("verify doFinal failed."); return false; @@ -80,17 +128,58 @@ bool VerifyImpl::VerifySync(OptDataBlob const& data, DataBlob const& signature) OptDataBlob VerifyImpl::RecoverSync(DataBlob const& signature) { - TH_THROW(std::runtime_error, "RecoverSync not implemented"); + if (this->verify_ == nullptr) { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "verify obj is nullptr!"); + return OptDataBlob::make_EMPTY(); + } + HcfBlob inBlob = {}; + HcfBlob outBlob = {}; + ArrayU8ToDataBlob(signature.data, inBlob); + HcfResult res = this->verify_->recover(this->verify_, &inBlob, &outBlob); + if (res != HCF_SUCCESS) { + ANI_LOGE_THROW(res, "verify recover failed!"); + return OptDataBlob::make_EMPTY(); + } + array data = {}; + DataBlobToArrayU8(outBlob, data); + HcfBlobDataClearAndFree(&outBlob); + return OptDataBlob::make_DATABLOB(DataBlob({ data })); } -void VerifyImpl::SetVerifySpec(SignSpecEnum itemType, OptIntUint8Arr const& itemValue) +void VerifyImpl::SetVerifySpec(ThSignSpecItem itemType, OptIntUint8Arr const& itemValue) { - TH_THROW(std::runtime_error, "SetVerifySpec not implemented"); + if (this->verify_ == nullptr) { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "verify obj is nullptr!"); + return; + } + + HcfSignSpecItem item = static_cast(itemType.get_value()); + if (itemValue.get_tag() == OptIntUint8Arr::tag_t::INT32 && item == PSS_SALT_LEN_INT) { + return SetVerifySaltLenInt(this->verify_, item, itemValue.get_INT32_ref()); + } else if (itemValue.get_tag() == OptIntUint8Arr::tag_t::UINT8ARRAY && item == SM2_USER_ID_UINT8ARR) { + return SetVerifyUserIdUintArray(this->verify_, item, itemValue.get_UINT8ARRAY_ref()); + } else { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "verify spec item not support!"); + return; + } } -OptStrInt VerifyImpl::GetVerifySpec(SignSpecEnum itemType) +OptStrInt VerifyImpl::GetVerifySpec(ThSignSpecItem itemType) { - TH_THROW(std::runtime_error, "GetVerifySpec not implemented"); + if (this->verify_ == nullptr) { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "verify obj is nullptr!"); + return OptStrInt::make_INT32(-1); + } + HcfSignSpecItem item = static_cast(itemType.get_value()); + int32_t type = GetSignSpecType(item); + if (type == SPEC_ITEM_TYPE_STR) { + return GetVerifySpecString(this->verify_, item); + } else if (type == SPEC_ITEM_TYPE_NUM) { + return GetVerifySpecNumber(this->verify_, item); + } else { + ANI_LOGE_THROW(HCF_INVALID_PARAMS, "verify spec item not support!"); + return OptStrInt::make_INT32(-1); + } } string VerifyImpl::GetAlgName() diff --git a/frameworks/js/ani/src/impl/ohos.security.cryptoFramework.cryptoFramework.impl.cpp b/frameworks/js/ani/src/impl/ohos.security.cryptoFramework.cryptoFramework.impl.cpp index c13a985..c1205ea 100644 --- a/frameworks/js/ani/src/impl/ohos.security.cryptoFramework.cryptoFramework.impl.cpp +++ b/frameworks/js/ani/src/impl/ohos.security.cryptoFramework.cryptoFramework.impl.cpp @@ -130,7 +130,7 @@ public: TH_THROW(std::runtime_error, "ClearMem not implemented"); } - OptKeySpec GetAsyKeySpec(AsyKeySpecEnum itemType) { + OptKeySpec GetAsyKeySpec(AsyKeySpecItem itemType) { TH_THROW(std::runtime_error, "GetAsyKeySpec not implemented"); } @@ -173,7 +173,7 @@ public: TH_THROW(std::runtime_error, "GetPubKeyObj not implemented"); } - OptKeySpec GetAsyKeySpec(AsyKeySpecEnum itemType) { + OptKeySpec GetAsyKeySpec(AsyKeySpecItem itemType) { TH_THROW(std::runtime_error, "GetAsyKeySpec not implemented"); } @@ -343,11 +343,11 @@ public: TH_THROW(std::runtime_error, "DoFinalSync not implemented"); } - void SetCipherSpec(CipherSpecEnum itemType, array_view itemValue) { + void SetCipherSpec(CipherSpecItem itemType, array_view itemValue) { TH_THROW(std::runtime_error, "SetCipherSpec not implemented"); } - OptStrUint8Arr GetCipherSpec(CipherSpecEnum itemType) { + OptStrUint8Arr GetCipherSpec(CipherSpecItem itemType) { TH_THROW(std::runtime_error, "GetCipherSpec not implemented"); } @@ -378,11 +378,11 @@ public: TH_THROW(std::runtime_error, "RecoverSync not implemented"); } - void SetVerifySpec(SignSpecEnum itemType, OptIntUint8Arr const& itemValue) { + void SetVerifySpec(SignSpecItem itemType, OptIntUint8Arr const& itemValue) { TH_THROW(std::runtime_error, "SetVerifySpec not implemented"); } - OptStrInt GetVerifySpec(SignSpecEnum itemType) { + OptStrInt GetVerifySpec(SignSpecItem itemType) { TH_THROW(std::runtime_error, "GetVerifySpec not implemented"); } @@ -409,11 +409,11 @@ public: TH_THROW(std::runtime_error, "SignSync not implemented"); } - void SetSignSpec(SignSpecEnum itemType, OptIntUint8Arr const& itemValue) { + void SetSignSpec(SignSpecItem itemType, OptIntUint8Arr const& itemValue) { TH_THROW(std::runtime_error, "SetSignSpec not implemented"); } - OptStrInt GetSignSpec(SignSpecEnum itemType) { + OptStrInt GetSignSpec(SignSpecItem itemType) { TH_THROW(std::runtime_error, "GetSignSpec not implemented"); } @@ -499,7 +499,7 @@ Random CreateRandom() { return make_holder(); } -Mac CreateMac(string_view algName) { +Mac CreateMacByStr(string_view algName) { // The parameters in the make_holder function should be of the same type // as the parameters in the constructor of the actual implementation class. return make_holder(); @@ -588,7 +588,7 @@ SM2CipherTextSpec GetCipherTextSpec(DataBlob const& cipherText, optional_view>>>>>>>>>>>>>>>>>>> AsyKeyGeneratorSync"); testAsyKeyGeneratorSync(); @@ -121,4 +236,6 @@ export function testAsyKeyGenerator() { testAsyKeyConvertKeySync(); console.log(">>>>>>>>>>>>>>>>>>>> AsyKeyConvertPemKeySync"); testConvertPemKeySync(); + console.log(">>>>>>>>>>>>>>>>>>>> AsyKeySpec"); + testAsyKeySpec(); } diff --git a/frameworks/js/ani/test/test_asy_key_generator_by_spec.ets b/frameworks/js/ani/test/test_asy_key_generator_by_spec.ets index 959391a..998e154 100644 --- a/frameworks/js/ani/test/test_asy_key_generator_by_spec.ets +++ b/frameworks/js/ani/test/test_asy_key_generator_by_spec.ets @@ -34,7 +34,7 @@ function testRsaKeyPairSpec() { let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(rsaKeyPairSpec); let keyPair = generatorBySpec.generateKeyPairSync(); if (keyPair !== null) { - console.info('get rsa key pair result success!'); + console.log('get rsa key pair result success!'); } else { console.error('get rsa key pair result fail!'); } @@ -61,7 +61,7 @@ function testRsaPubKeySpec() { let rsaGeneratorSpec = cryptoFramework.createAsyKeyGeneratorBySpec(rsaPubKeySpec); let pubKey = rsaGeneratorSpec.generatePubKeySync(); if (pubKey !== null) { - console.info('get rsa pub key result success!'); + console.log('get rsa pub key result success!'); } else { console.error('get rsa pub key result fail!'); } @@ -94,7 +94,7 @@ function testEccCommonSpec() { let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(eccCommonSpec); let keyPair = generatorBySpec.generateKeyPairSync(); // Generate an ECC key pair. if (keyPair !== null) { - console.info('get key pair result success!'); + console.log('get key pair result success!'); } else { console.error('get key pair result fail!'); } @@ -147,7 +147,7 @@ function testEccPriKeySpec() { let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(eccPriKeySpec); let priKey = generatorBySpec.generatePriKeySync(); if (priKey !== null) { - console.info('get pri key result success!'); + console.log('get pri key result success!'); } else { console.error('get pri key result fail!'); } @@ -189,7 +189,7 @@ function testSm2KeyPairSpec() { let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(sm2KeyPairSpec); let keyPair = generatorBySpec.generateKeyPairSync(); if (keyPair !== null) { - console.info('get key pair result success!'); + console.log('get key pair result success!'); } else { console.error('get key pair result fail!'); } @@ -222,7 +222,7 @@ function testDsaKeyPairSpec() { let asyKeyPairSpec = cryptoFramework.createAsyKeyGeneratorBySpec(dsaKeyPairSpec); let keyPair = asyKeyPairSpec.generateKeyPairSync(); if (keyPair !== null) { - console.info('get key pair result success!'); + console.log('get key pair result success!'); } else { console.error('get key pair result fail!'); } @@ -243,7 +243,7 @@ function testDsaPubKeySpec() { let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(dsaPubKeySpec); let pubKey = generatorBySpec.generatePubKeySync(); if (pubKey !== null) { - console.info('get pub key result success!'); + console.log('get pub key result success!'); } else { console.error('get pub key result fail!'); } @@ -264,13 +264,13 @@ function testX25519Keypair() { let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(X25519CommonParamsSpec); let keyPair = generatorBySpec.generateKeyPairSync(); if (keyPair !== null) { - console.info('get key pair result success!'); + console.log('get key pair result success!'); let pkBlob = keyPair.pubKey.getEncoded(); let skBlob = keyPair.priKey.getEncoded(); let pkStr = utils.uint8ArrayToHexStr(pkBlob.data); let skStr = utils.uint8ArrayToHexStr(skBlob.data); - console.info('pub key: ' + pkStr); - console.info('pri key: ' + skStr); + console.log('pub key: ' + pkStr); + console.log('pri key: ' + skStr); } else { console.error('get key pair result fail!'); } @@ -290,7 +290,7 @@ function testX25519PubKeySpec() { let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(X25519CommonParamsSpec); let pubKey = generatorBySpec.generatePubKeySync(); if (pubKey !== null) { - console.info('get pub key result success!'); + console.log('get pub key result success!'); } else { console.error('get pub key result fail!'); } @@ -310,7 +310,7 @@ function testX25519PriKeySpec() { let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(X25519CommonParamsSpec); let priKey = generatorBySpec.generatePriKeySync(); if (priKey !== null) { - console.info('get pri key result success!'); + console.log('get pri key result success!'); } else { console.error('get pri key result fail!'); } @@ -331,7 +331,7 @@ function testEd25519Keypair() { let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(ed25519CommonParamsSpec); let keyPair = generatorBySpec.generateKeyPairSync(); if (keyPair !== null) { - console.info('get key pair result success!'); + console.log('get key pair result success!'); } else { console.error('get key pair result fail!'); } @@ -351,7 +351,7 @@ function testEd25519PubKeySpec() { let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(ed25519CommonParamsSpec); let pubKey = generatorBySpec.generatePubKeySync(); if (pubKey !== null) { - console.info('get pub key result success!'); + console.log('get pub key result success!'); } else { console.error('get pub key result fail!'); } @@ -371,7 +371,7 @@ function testEd25519PriKeySpec() { let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(ed25519CommonParamsSpec); let priKey = generatorBySpec.generatePriKeySync(); if (priKey !== null) { - console.info('get pri key result success!'); + console.log('get pri key result success!'); } else { console.error('get pri key result fail!'); } @@ -399,7 +399,7 @@ function testDhKeyPairSpec() { let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(dhKeyPairSpec); let keyPair = generatorBySpec.generateKeyPairSync(); if (keyPair !== null) { - console.info('get key pair result success!'); + console.log('get key pair result success!'); } else { console.error('get key pair result fail!'); } @@ -426,7 +426,7 @@ function testDhPubKeySpec() { let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(dhPubKeySpec); let pubKey = generatorBySpec.generatePubKeySync(); if (pubKey !== null) { - console.info('get pub key result success!'); + console.log('get pub key result success!'); } else { console.error('get pub key result fail!'); } @@ -453,7 +453,7 @@ function testDhPriKeySpec() { let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(dhPriKeySpec); let priKey = generatorBySpec.generatePriKeySync(); if (priKey !== null) { - console.info('get pri key result success!'); + console.log('get pri key result success!'); } else { console.error('get pri key result fail!'); } diff --git a/frameworks/js/ani/test/test_cipher.ets b/frameworks/js/ani/test/test_cipher.ets index df8880f..7a8f09c 100644 --- a/frameworks/js/ani/test/test_cipher.ets +++ b/frameworks/js/ani/test/test_cipher.ets @@ -79,7 +79,7 @@ function aesCipher(algorithm: string, let encryptText = encrypt(algorithm, symKey, plainText, params); let decryptText = decrypt(algorithm, symKey, encryptText, params); if (plainText.data.toString() === decryptText.data.toString()) { - console.info(`${algorithm} success`); + console.log(`${algorithm} success`); } else { console.error(`${algorithm} failed`); } @@ -120,6 +120,22 @@ function testAesEcbSync() { aesCipher('AES128|ECB|PKCS7', null); } +function testCipherSpec() { + try { + let spec = new Uint8Array([0x01, 0x02, 0x03, 0x04]); + let cipher = cryptoFramework.createCipher("RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA1"); + cipher.setCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR, spec); + let mgf1Psrc = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR); + let mgfName = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF_NAME_STR); + let mdName = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MD_NAME_STR); + console.log("CipherSpec Uint8Array: " + mgf1Psrc.toString()); + console.log("CipherSpec mgfName: " + mgfName); + console.log("CipherSpec mdName: " + mdName); + } catch (err: BusinessError) { + console.error(`[error] CipherSpec: ${err.code} ${err.message}`); + } +} + export function testCipher() { console.log(">>>>>>>>>>>>>>>>>>>> AesGcmSync"); testAesGcmSync(); @@ -129,4 +145,6 @@ export function testCipher() { testAesCbcSync(); console.log(">>>>>>>>>>>>>>>>>>>> AesEcbSync"); testAesEcbSync(); + console.log(">>>>>>>>>>>>>>>>>>>> CipherSpec"); + testCipherSpec(); } diff --git a/frameworks/js/ani/test/test_kdf.ets b/frameworks/js/ani/test/test_kdf.ets index 0efa899..d7a980d 100644 --- a/frameworks/js/ani/test/test_kdf.ets +++ b/frameworks/js/ani/test/test_kdf.ets @@ -30,7 +30,7 @@ function testPBKDF2Sync() { let secret = kdf.generateSecretSync(spec); let str = utils.uint8ArrayToHexStr(secret.data); console.log("PBKDF2 algName: " + kdf.algName); - console.info("PBKDF2: " + str); + console.log("PBKDF2: " + str); } catch (err: BusinessError) { console.error(`[error] PBKDF2: ${err.code} ${err.message}`); @@ -50,7 +50,7 @@ function testHKDFSync() { let secret = kdf.generateSecretSync(spec); let str = utils.uint8ArrayToHexStr(secret.data); console.log("HKDF algName: " + kdf.algName); - console.info("HKDF: " + str); + console.log("HKDF: " + str); } catch (err: BusinessError) { console.error(`[error] HKDF: ${err.code} ${err.message}`); } @@ -72,7 +72,7 @@ function testScryptSync() { let secret = kdf.generateSecretSync(spec); let str = utils.uint8ArrayToHexStr(secret.data); console.log("Scrypt algName: " + kdf.algName); - console.info("Scrypt: " + str); + console.log("Scrypt: " + str); } catch (err: BusinessError) { console.error(`[error] Scrypt: ${err.code} ${err.message}`); } diff --git a/frameworks/js/ani/test/test_key_agreement.ets b/frameworks/js/ani/test/test_key_agreement.ets index 20fa962..3cbfa21 100644 --- a/frameworks/js/ani/test/test_key_agreement.ets +++ b/frameworks/js/ani/test/test_key_agreement.ets @@ -42,10 +42,10 @@ function testKeyAgreementSync() let secret1 = keyAgreement.generateSecretSync(keyPairA.priKey, keyPairB.pubKey); let secret2 = keyAgreement.generateSecretSync(keyPairB.priKey, keyPairA.pubKey); if (secret1.data.toString() === secret2.data.toString()) { - console.info('KeyAgreement ecdh result is equal'); - console.info('KeyAgreement ecdh secret.data: ' + utils.uint8ArrayToHexStr(secret1.data)); + console.log('KeyAgreement ecdh result success'); + console.log('KeyAgreement ecdh secret.data: ' + utils.uint8ArrayToHexStr(secret1.data)); } else { - console.error('KeyAgreement ecdh result is not equal'); + console.error('KeyAgreement ecdh result failed'); } } catch (err: BusinessError) { console.error(`[error] KeyAgreement: ${err.code} ${err.message}`); diff --git a/frameworks/js/ani/test/test_sign.ets b/frameworks/js/ani/test/test_sign.ets index aa1405e..851a909 100644 --- a/frameworks/js/ani/test/test_sign.ets +++ b/frameworks/js/ani/test/test_sign.ets @@ -54,7 +54,7 @@ function testSignSync() { let signData = sign(algName, keyPair.priKey, input1, input2); let res = verify(algName, keyPair.pubKey, signData, input1, input2); if (res === true) { - console.info('Sign success'); + console.log('Sign success'); } else { console.error('Sign failed'); } @@ -63,7 +63,24 @@ function testSignSync() { } } +function testSignSpec() { + try { + let signer = cryptoFramework.createSign("RSA|PSS|SHA256|MGF1_SHA256"); + signer.setSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, 32); + let saltLen = signer.getSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM); + let mdName = signer.getSignSpec(cryptoFramework.SignSpecItem.PSS_MD_NAME_STR); + let mgfName = signer.getSignSpec(cryptoFramework.SignSpecItem.PSS_MGF_NAME_STR); + console.log("SignSpec saltLen: " + saltLen); + console.log("SignSpec mdName: " + mdName); + console.log("SignSpec mgfName: " + mgfName); + } catch (err: BusinessError) { + console.error(`[error] SignSpec: ${err.code} ${err.message}`); + } +} + export function testSign() { console.log(">>>>>>>>>>>>>>>>>>>> SignSync"); testSignSync(); + console.log(">>>>>>>>>>>>>>>>>>>> SignSpec"); + testSignSpec(); } diff --git a/frameworks/js/ani/test/test_verify.ets b/frameworks/js/ani/test/test_verify.ets index e2a26b6..1111e5e 100644 --- a/frameworks/js/ani/test/test_verify.ets +++ b/frameworks/js/ani/test/test_verify.ets @@ -64,7 +64,7 @@ function testVerifySync() { let res = verify.verifySync(null, signDataBytes); console.log("Verify algName: " + verify.algName); if (res === true) { - console.info('Verify success'); + console.log('Verify success'); } else { console.error('Verify failed'); } @@ -73,7 +73,51 @@ function testVerifySync() { } } +function testRecoverSync() { + try { + let generator = cryptoFramework.createAsyKeyGenerator("RSA1024"); + let keyPair = generator.generateKeyPairSync(); + let signAlg = "RSA1024|PKCS1|NoHash|OnlySign"; + let signer = cryptoFramework.createSign(signAlg); + signer.initSync(keyPair.priKey); + let input: cryptoFramework.DataBlob = { + data: utils.hexStrToUint8Array("0123456789ABCDEF") + }; + let signData = signer.signSync(input); + let verifyAlg = "RSA1024|PKCS1|NoHash|Recover"; + let verifier = cryptoFramework.createVerify(verifyAlg); + verifier.initSync(keyPair.pubKey); + let rawSignData = verifier.recoverSync(signData); + if (rawSignData !== null) { + console.log("Recover rawSignData: " + utils.uint8ArrayToHexStr(rawSignData.data)); + } else { + console.error("Recover failed"); + } + } catch (err: BusinessError) { + console.error(`[error] Recover: ${err.code} ${err.message}`); + } +} + +function testVerifySpec() { + try { + let verifyer = cryptoFramework.createVerify("RSA2048|PSS|SHA256|MGF1_SHA256"); + verifyer.setVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, 32); + let saltLen = verifyer.getVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM); + let mdName = verifyer.getVerifySpec(cryptoFramework.SignSpecItem.PSS_MD_NAME_STR); + let mgfName = verifyer.getVerifySpec(cryptoFramework.SignSpecItem.PSS_MGF_NAME_STR); + console.log("VerifySpec saltLen: " + saltLen); + console.log("VerifySpec mdName: " + mdName); + console.log("VerifySpec mgfName: " + mgfName); + } catch (err: BusinessError) { + console.error(`[error] VerifySpec: ${err.code} ${err.message}`); + } +} + export function testVerify() { console.log(">>>>>>>>>>>>>>>>>>>> VerifySync"); testVerifySync(); + console.log(">>>>>>>>>>>>>>>>>>>> RecoverSync"); + testRecoverSync(); + console.log(">>>>>>>>>>>>>>>>>>>> VerifySpec"); + testVerifySpec(); } -- Gitee