From 0e955496561efe5690271e949b1831828bafeafb Mon Sep 17 00:00:00 2001 From: wangweiyuan Date: Sat, 2 Aug 2025 11:59:04 +0800 Subject: [PATCH] add UniversalKeystoreKit Signed-off-by: wangweiyuan --- UniversalKeystoreKit/KeyDeletion/.gitignore | 12 + .../KeyDeletion/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes UniversalKeystoreKit/KeyDeletion/README.md | 92 +++ .../KeyDeletion/build-profile.json5 | 57 ++ .../KeyDeletion/code-linter.json5 | 35 + .../KeyDeletion/entry/.gitignore | 6 + .../KeyDeletion/entry/build-profile.json5 | 58 ++ .../KeyDeletion/entry/hvigorfile.ts | 21 + .../KeyDeletion/entry/oh-package.json5 | 26 + .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 116 +++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../entry/src/main/ets/pages/Index.ets | 69 ++ .../entry/src/main/ets/pages/KeyDeletion.ets | 171 +++++ .../KeyDeletion/entry/src/main/module.json5 | 66 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 40 ++ .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 6 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../ohosTest/ets/test/KeyDeletion.test.ets | 77 ++ .../entry/src/ohosTest/ets/test/List.test.ets | 20 + .../entry/src/ohosTest/module.json5 | 27 + .../KeyDeletion/entry/src/test/List.test.ets | 20 + .../entry/src/test/LocalUnit.test.ets | 48 ++ .../KeyDeletion/hvigor/hvigor-config.json5 | 37 + .../KeyDeletion/hvigorfile.ts | 21 + .../KeyDeletion/oh-package.json5 | 25 + UniversalKeystoreKit/KeyDeletion/ohosTest.md | 9 + .../screenshots/KeyDeletionCpp_1.png | Bin 0 -> 24692 bytes .../screenshots/KeyDeletionCpp_2.png | Bin 0 -> 25363 bytes .../KeyDeletion/screenshots/KeyDeletion_1.png | Bin 0 -> 23164 bytes .../KeyDeletion/screenshots/KeyDeletion_2.png | Bin 0 -> 24677 bytes .../GenerateKey/.gitignore | 12 + .../GenerateKey/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../GenerateKey/README.md | 91 +++ .../GenerateKey/build-profile.json5 | 57 ++ .../GenerateKey/code-linter.json5 | 35 + .../GenerateKey/entry/.gitignore | 6 + .../GenerateKey/entry/build-profile.json5 | 58 ++ .../GenerateKey/entry/hvigorfile.ts | 21 + .../GenerateKey/entry/oh-package.json5 | 26 + .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 90 +++ .../src/main/cpp/types/libentry/Index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../entry/src/main/ets/pages/Index.ets | 127 ++++ .../GenerateKey/entry/src/main/module.json5 | 66 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 24 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 5 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../ohosTest/ets/test/GenerateKey.test.ets | 72 ++ .../entry/src/ohosTest/ets/test/List.test.ets | 20 + .../entry/src/ohosTest/module.json5 | 27 + .../GenerateKey/entry/src/test/List.test.ets | 20 + .../entry/src/test/LocalUnit.test.ets | 48 ++ .../GenerateKey/hvigor/hvigor-config.json5 | 37 + .../GenerateKey/hvigorfile.ts | 21 + .../GenerateKey/oh-package.json5 | 25 + .../GenerateKey/ohosTest.md | 9 + .../GenerateKey/screenshots/ArkTS_1.png | Bin 0 -> 24342 bytes .../GenerateKey/screenshots/ArkTS_2.png | Bin 0 -> 25517 bytes .../GenerateKey/screenshots/Cpp_1.png | Bin 0 -> 24342 bytes .../GenerateKey/screenshots/Cpp_2.png | Bin 0 -> 24947 bytes .../ImportEncryptedKey/.gitignore | 12 + .../ImportEncryptedKey/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../ImportEncryptedKey/README.md | 92 +++ .../ImportEncryptedKey/build-profile.json5 | 57 ++ .../ImportEncryptedKey/code-linter.json5 | 35 + .../ImportEncryptedKey/entry/.gitignore | 6 + .../entry/build-profile.json5 | 58 ++ .../ImportEncryptedKey/entry/hvigorfile.ts | 21 + .../ImportEncryptedKey/entry/oh-package.json5 | 26 + .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 611 ++++++++++++++++ .../src/main/cpp/types/libentry/index.d.ts | 17 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../src/main/ets/pages/ImportEncryptedKey.ets | 661 ++++++++++++++++++ .../entry/src/main/ets/pages/Index.ets | 63 ++ .../entry/src/main/module.json5 | 66 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 24 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 5 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../ets/test/ImportEncryptedKey.test.ets | 74 ++ .../entry/src/ohosTest/ets/test/List.test.ets | 20 + .../entry/src/ohosTest/module.json5 | 27 + .../hvigor/hvigor-config.json5 | 37 + .../ImportEncryptedKey/hvigorfile.ts | 21 + .../ImportEncryptedKey/oh-package.json5 | 25 + .../ImportEncryptedKey/ohosTest.md | 9 + .../screenshots/ImportEncryptedKeyCpp_1.png | Bin 0 -> 25141 bytes .../screenshots/ImportEncryptedKeyCpp_2.png | Bin 0 -> 24957 bytes .../screenshots/ImportEncryptedKey_1.png | Bin 0 -> 25141 bytes .../screenshots/ImportEncryptedKey_2.png | Bin 0 -> 25615 bytes .../ImportKeyPlainText/.gitignore | 12 + .../ImportKeyPlainText/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../ImportKeyPlainText/README.md | 92 +++ .../ImportKeyPlainText/build-profile.json5 | 57 ++ .../ImportKeyPlainText/code-linter.json5 | 35 + .../ImportKeyPlainText/entry/.gitignore | 6 + .../entry/build-profile.json5 | 58 ++ .../ImportKeyPlainText/entry/hvigorfile.ts | 21 + .../ImportKeyPlainText/entry/oh-package.json5 | 26 + .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 101 +++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../entry/src/main/ets/pages/AES256.ets | 141 ++++ .../entry/src/main/ets/pages/Index.ets | 89 +++ .../entry/src/main/ets/pages/RSA2048.ets | 190 +++++ .../entry/src/main/ets/pages/X25519.ets | 151 ++++ .../entry/src/main/module.json5 | 66 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 44 ++ .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 8 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../ets/test/ImportKeyPlainText.test.ets | 98 +++ .../entry/src/ohosTest/ets/test/List.test.ets | 20 + .../entry/src/ohosTest/module.json5 | 27 + .../entry/src/test/List.test.ets | 20 + .../entry/src/test/LocalUnit.test.ets | 48 ++ .../hvigor/hvigor-config.json5 | 37 + .../ImportKeyPlainText/hvigorfile.ts | 21 + .../ImportKeyPlainText/oh-package.json5 | 25 + .../ImportKeyPlainText/ohosTest.md | 11 + .../screenshots/AES256_1.png | Bin 0 -> 22071 bytes .../screenshots/AES256_2.png | Bin 0 -> 23567 bytes .../ImportKeyPlainText/screenshots/Cpp_1.png | Bin 0 -> 29551 bytes .../ImportKeyPlainText/screenshots/Cpp_2.png | Bin 0 -> 29514 bytes .../screenshots/RSA2048_1.png | Bin 0 -> 22461 bytes .../screenshots/RSA2048_2.png | Bin 0 -> 23927 bytes .../screenshots/X25519_1.png | Bin 0 -> 21929 bytes .../screenshots/X25519_2.png | Bin 0 -> 23528 bytes .../AnonymousKeyProof/.gitignore | 12 + .../AnonymousKeyProof/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../AnonymousKeyProof/README.md | 92 +++ .../AnonymousKeyProof/build-profile.json5 | 57 ++ .../AnonymousKeyProof/code-linter.json5 | 35 + .../AnonymousKeyProof/entry/.gitignore | 6 + .../entry/build-profile.json5 | 58 ++ .../AnonymousKeyProof/entry/hvigorfile.ts | 21 + .../AnonymousKeyProof/entry/oh-package.json5 | 26 + .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 157 +++++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../src/main/ets/pages/AnonymousKeyProof.ets | 216 ++++++ .../entry/src/main/ets/pages/Index.ets | 69 ++ .../entry/src/main/module.json5 | 66 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 28 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 6 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../ets/test/AnonymousKeyProof.test.ets | 77 ++ .../entry/src/ohosTest/ets/test/List.test.ets | 20 + .../entry/src/ohosTest/module.json5 | 27 + .../entry/src/test/List.test.ets | 20 + .../entry/src/test/LocalUnit.test.ets | 48 ++ .../hvigor/hvigor-config.json5 | 37 + .../AnonymousKeyProof/hvigorfile.ts | 21 + .../AnonymousKeyProof/oh-package.json5 | 25 + .../AnonymousKeyProof/ohosTest.md | 9 + .../screenshots/AnonymousKeyProof_1.png | Bin 0 -> 25340 bytes .../screenshots/AnonymousKeyProof_2.png | Bin 0 -> 26818 bytes .../AnonymousKeyProof/screenshots/Cpp_1.png | Bin 0 -> 27026 bytes .../AnonymousKeyProof/screenshots/Cpp_2.png | Bin 0 -> 26890 bytes .../NonanonymousKeyProof/.gitignore | 12 + .../NonanonymousKeyProof/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../NonanonymousKeyProof/README.md | 92 +++ .../NonanonymousKeyProof/build-profile.json5 | 57 ++ .../NonanonymousKeyProof/code-linter.json5 | 35 + .../NonanonymousKeyProof/entry/.gitignore | 6 + .../entry/build-profile.json5 | 58 ++ .../NonanonymousKeyProof/entry/hvigorfile.ts | 21 + .../entry/oh-package.json5 | 26 + .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 156 +++++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../entry/src/main/ets/pages/Index.ets | 69 ++ .../main/ets/pages/NonAnonymousKeyProof.ets | 216 ++++++ .../entry/src/main/module.json5 | 78 +++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 32 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 6 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../entry/src/ohosTest/ets/test/List.test.ets | 20 + .../ets/test/NonAnonymousKeyProof.test.ets | 77 ++ .../entry/src/ohosTest/module.json5 | 27 + .../entry/src/test/List.test.ets | 20 + .../entry/src/test/LocalUnit.test.ets | 48 ++ .../hvigor/hvigor-config.json5 | 37 + .../NonanonymousKeyProof/hvigorfile.ts | 21 + .../NonanonymousKeyProof/oh-package.json5 | 25 + .../NonanonymousKeyProof/ohosTest.md | 9 + .../screenshots/Cpp_1.png | Bin 0 -> 28053 bytes .../screenshots/Cpp_2.png | Bin 0 -> 27590 bytes .../screenshots/NonAnonymousKeyProof_1.png | Bin 0 -> 26466 bytes .../screenshots/NonAnonymousKeyProof_2.png | Bin 0 -> 27962 bytes .../KeyUsage/AccessControl/.gitignore | 12 + .../KeyUsage/AccessControl/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../KeyUsage/AccessControl/README.md | 92 +++ .../AccessControl/build-profile.json5 | 57 ++ .../KeyUsage/AccessControl/code-linter.json5 | 35 + .../KeyUsage/AccessControl/entry/.gitignore | 6 + .../AccessControl/entry/build-profile.json5 | 43 ++ .../AccessControl/entry/hvigorfile.ts | 21 + .../AccessControl/entry/oh-package.json5 | 25 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../FineGrainedUserIdentityAuthentication.ets | 444 ++++++++++++ .../entry/src/main/ets/pages/Index.ets | 67 ++ .../ets/pages/UserIdentityAuthentication.ets | 417 +++++++++++ .../AccessControl/entry/src/main/module.json5 | 71 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/float.json | 8 + .../main/resources/base/element/string.json | 24 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 7 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../ohosTest/ets/test/AccessControl.test.ets | 80 +++ .../entry/src/ohosTest/ets/test/List.test.ets | 20 + .../entry/src/ohosTest/module.json5 | 27 + .../AccessControl/hvigor/hvigor-config.json5 | 37 + .../KeyUsage/AccessControl/hvigorfile.ts | 21 + .../KeyUsage/AccessControl/oh-package.json5 | 25 + .../KeyUsage/AccessControl/ohosTest.md | 9 + ...ineGrainedUserIdentityAuthentication_1.png | Bin 0 -> 23511 bytes ...ineGrainedUserIdentityAuthentication_2.png | Bin 0 -> 21605 bytes .../UserIdentityAuthentication_1.png | Bin 0 -> 22345 bytes .../UserIdentityAuthentication_2.png | Bin 0 -> 21604 bytes .../KeyUsage/EncryptionDecryption/.gitignore | 12 + .../EncryptionDecryption/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../KeyUsage/EncryptionDecryption/README.md | 160 +++++ .../EncryptionDecryption/build-profile.json5 | 57 ++ .../EncryptionDecryption/code-linter.json5 | 35 + .../EncryptionDecryption/entry/.gitignore | 6 + .../entry/build-profile.json5 | 58 ++ .../EncryptionDecryption/entry/hvigorfile.ts | 21 + .../entry/oh-package.json5 | 26 + .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 229 ++++++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../entry/src/main/ets/pages/AESCBCPKCS7.ets | 264 +++++++ .../src/main/ets/pages/AESGCMNoPadding.ets | 272 +++++++ .../src/main/ets/pages/DESCBCNoPadding.ets | 257 +++++++ .../entry/src/main/ets/pages/Index.ets | 114 +++ .../src/main/ets/pages/RSAECBOAEPSHA256.ets | 261 +++++++ .../src/main/ets/pages/RSAECBPKCS1_V1_5.ets | 262 +++++++ .../entry/src/main/ets/pages/SM2.ets | 250 +++++++ .../entry/src/main/module.json5 | 66 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 72 ++ .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 11 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../ets/test/EncryptionDecryption.test.ets | 167 +++++ .../entry/src/ohosTest/ets/test/List.test.ets | 21 + .../entry/src/ohosTest/module.json5 | 27 + .../entry/src/test/List.test.ets | 20 + .../entry/src/test/LocalUnit.test.ets | 48 ++ .../hvigor/hvigor-config.json5 | 37 + .../EncryptionDecryption/hvigorfile.ts | 21 + .../EncryptionDecryption/oh-package.json5 | 25 + .../KeyUsage/EncryptionDecryption/ohosTest.md | 13 + .../screenshots/AESCBCPKCS7_1.png | Bin 0 -> 25023 bytes .../screenshots/AESCBCPKCS7_2.png | Bin 0 -> 26494 bytes .../screenshots/AESGCMNoPadding_1.png | Bin 0 -> 26209 bytes .../screenshots/AESGCMNoPadding_2.png | Bin 0 -> 27640 bytes .../screenshots/Cpp_1.png | Bin 0 -> 44798 bytes .../screenshots/Cpp_2.png | Bin 0 -> 43849 bytes .../screenshots/RSAECBOAEPSHA256_1.png | Bin 0 -> 27560 bytes .../screenshots/RSAECBOAEPSHA256_2.png | Bin 0 -> 29057 bytes .../screenshots/RSAECBPKCS1_V1_5_1.png | Bin 0 -> 26392 bytes .../screenshots/RSAECBPKCS1_V1_5_2.png | Bin 0 -> 27906 bytes .../screenshots/SM2_1.png | Bin 0 -> 21085 bytes .../screenshots/SM2_2.png | Bin 0 -> 22558 bytes UniversalKeystoreKit/KeyUsage/HMAC/.gitignore | 12 + .../KeyUsage/HMAC/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes UniversalKeystoreKit/KeyUsage/HMAC/README.md | 91 +++ .../KeyUsage/HMAC/build-profile.json5 | 57 ++ .../KeyUsage/HMAC/code-linter.json5 | 35 + .../KeyUsage/HMAC/entry/.gitignore | 6 + .../KeyUsage/HMAC/entry/build-profile.json5 | 58 ++ .../KeyUsage/HMAC/entry/hvigorfile.ts | 21 + .../KeyUsage/HMAC/entry/oh-package.json5 | 26 + .../HMAC/entry/src/main/cpp/CMakeLists.txt | 15 + .../HMAC/entry/src/main/cpp/napi_init.cpp | 134 ++++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../HMAC/entry/src/main/ets/pages/HMAC.ets | 155 ++++ .../HMAC/entry/src/main/ets/pages/Index.ets | 69 ++ .../KeyUsage/HMAC/entry/src/main/module.json5 | 66 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 28 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 6 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../entry/src/ohosTest/ets/test/HMAC.test.ets | 77 ++ .../entry/src/ohosTest/ets/test/List.test.ets | 20 + .../HMAC/entry/src/ohosTest/module.json5 | 27 + .../KeyUsage/HMAC/hvigor/hvigor-config.json5 | 37 + .../KeyUsage/HMAC/hvigorfile.ts | 21 + .../KeyUsage/HMAC/oh-package.json5 | 25 + .../KeyUsage/HMAC/ohosTest.md | 9 + .../KeyUsage/HMAC/screenshots/HMAC_1.png | Bin 0 -> 21808 bytes .../KeyUsage/HMAC/screenshots/HMAC_2.png | Bin 0 -> 23256 bytes .../KeyUsage/HMAC/screenshots/cpp_1.png | Bin 0 -> 23162 bytes .../KeyUsage/HMAC/screenshots/cpp_2.png | Bin 0 -> 24435 bytes .../KeyUsage/KeyDerivation/.gitignore | 12 + .../KeyUsage/KeyDerivation/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../KeyUsage/KeyDerivation/README.md | 109 +++ .../KeyDerivation/build-profile.json5 | 57 ++ .../KeyUsage/KeyDerivation/code-linter.json5 | 35 + .../KeyUsage/KeyDerivation/entry/.gitignore | 6 + .../KeyDerivation/entry/build-profile.json5 | 58 ++ .../KeyDerivation/entry/hvigorfile.ts | 21 + .../KeyDerivation/entry/oh-package.json5 | 26 + .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 148 ++++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../entry/src/main/ets/pages/HKDF.ets | 362 ++++++++++ .../entry/src/main/ets/pages/Index.ets | 80 +++ .../entry/src/main/ets/pages/PBKDF2.ets | 373 ++++++++++ .../KeyDerivation/entry/src/main/module.json5 | 66 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 60 ++ .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 7 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../ohosTest/ets/test/KeyDerivation.test.ets | 95 +++ .../entry/src/ohosTest/ets/test/List.test.ets | 20 + .../entry/src/ohosTest/module.json5 | 27 + .../entry/src/test/List.test.ets | 20 + .../entry/src/test/LocalUnit.test.ets | 48 ++ .../KeyDerivation/hvigor/hvigor-config.json5 | 37 + .../KeyUsage/KeyDerivation/hvigorfile.ts | 21 + .../KeyUsage/KeyDerivation/oh-package.json5 | 25 + .../KeyUsage/KeyDerivation/ohosTest.md | 10 + .../KeyDerivation/screenshots/Cpp_1.png | Bin 0 -> 25990 bytes .../KeyDerivation/screenshots/Cpp_2.png | Bin 0 -> 26502 bytes .../KeyDerivation/screenshots/HKDF_1.png | Bin 0 -> 21300 bytes .../KeyDerivation/screenshots/HKDF_2.png | Bin 0 -> 22763 bytes .../KeyDerivation/screenshots/PBKDF2_1.png | Bin 0 -> 22211 bytes .../KeyDerivation/screenshots/PBKDF2_2.png | Bin 0 -> 23754 bytes .../KeyUsage/KeyExchange/.gitignore | 12 + .../KeyUsage/KeyExchange/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../KeyUsage/KeyExchange/README.md | 109 +++ .../KeyUsage/KeyExchange/build-profile.json5 | 57 ++ .../KeyUsage/KeyExchange/code-linter.json5 | 35 + .../KeyUsage/KeyExchange/entry/.gitignore | 6 + .../KeyExchange/entry/build-profile.json5 | 58 ++ .../KeyUsage/KeyExchange/entry/hvigorfile.ts | 21 + .../KeyExchange/entry/oh-package.json5 | 26 + .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 265 +++++++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../entry/src/main/ets/pages/DH.ets | 203 ++++++ .../entry/src/main/ets/pages/Index.ets | 79 +++ .../entry/src/main/ets/pages/X25519.ets | 427 +++++++++++ .../KeyExchange/entry/src/main/module.json5 | 66 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 28 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 7 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../ohosTest/ets/test/KeyExchange.test.ets | 95 +++ .../entry/src/ohosTest/ets/test/List.test.ets | 21 + .../entry/src/ohosTest/module.json5 | 27 + .../KeyExchange/entry/src/test/List.test.ets | 20 + .../entry/src/test/LocalUnit.test.ets | 48 ++ .../KeyExchange/hvigor/hvigor-config.json5 | 37 + .../KeyUsage/KeyExchange/hvigorfile.ts | 21 + .../KeyUsage/KeyExchange/oh-package.json5 | 25 + .../KeyUsage/KeyExchange/ohosTest.md | 10 + .../KeyExchange/screenshots/Cpp_1.png | Bin 0 -> 25448 bytes .../KeyExchange/screenshots/Cpp_2.png | Bin 0 -> 26003 bytes .../KeyUsage/KeyExchange/screenshots/DH_1.png | Bin 0 -> 19843 bytes .../KeyUsage/KeyExchange/screenshots/DH_2.png | Bin 0 -> 21366 bytes .../KeyExchange/screenshots/X25519_1.png | Bin 0 -> 21445 bytes .../KeyExchange/screenshots/X25519_2.png | Bin 0 -> 22951 bytes .../KeyUsage/SigningVerification/.gitignore | 12 + .../SigningVerification/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../KeyUsage/SigningVerification/README.md | 143 ++++ .../SigningVerification/build-profile.json5 | 57 ++ .../SigningVerification/code-linter.json5 | 35 + .../SigningVerification/entry/.gitignore | 6 + .../entry/build-profile.json5 | 58 ++ .../SigningVerification/entry/hvigorfile.ts | 21 + .../entry/oh-package.json5 | 26 + .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 167 +++++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../entry/src/main/ets/pages/ECC256SHA256.ets | 215 ++++++ .../entry/src/main/ets/pages/Index.ets | 99 +++ .../main/ets/pages/RSASHA256PKCS1_V1_5.ets | 219 ++++++ .../entry/src/main/ets/pages/RSASHA256PSS.ets | 226 ++++++ .../entry/src/main/ets/pages/SM2SM3.ets | 218 ++++++ .../entry/src/main/module.json5 | 66 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 68 ++ .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 9 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../entry/src/ohosTest/ets/test/List.test.ets | 22 + .../ets/test/SigningVerification.test.ets | 131 ++++ .../entry/src/ohosTest/module.json5 | 27 + .../entry/src/test/List.test.ets | 20 + .../entry/src/test/LocalUnit.test.ets | 48 ++ .../hvigor/hvigor-config.json5 | 37 + .../SigningVerification/hvigorfile.ts | 21 + .../SigningVerification/oh-package.json5 | 25 + .../KeyUsage/SigningVerification/ohosTest.md | 12 + .../screenshots/ECC2561.png | Bin 0 -> 24319 bytes .../screenshots/ECC2562.png | Bin 0 -> 25853 bytes .../SigningVerification/screenshots/RSA1.png | Bin 0 -> 24628 bytes .../SigningVerification/screenshots/RSA2.png | Bin 0 -> 26184 bytes .../screenshots/SHA2561.png | Bin 0 -> 26925 bytes .../screenshots/SHA2562.png | Bin 0 -> 28340 bytes .../SigningVerification/screenshots/SM21.png | Bin 0 -> 22024 bytes .../SigningVerification/screenshots/SM22.png | Bin 0 -> 23561 bytes .../SigningVerification/screenshots/cpp1.png | Bin 0 -> 38622 bytes .../SigningVerification/screenshots/cpp2.png | Bin 0 -> 38550 bytes .../OtherOperations/CheckKeyExists/.gitignore | 12 + .../CheckKeyExists/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../OtherOperations/CheckKeyExists/README.md | 92 +++ .../CheckKeyExists/build-profile.json5 | 57 ++ .../CheckKeyExists/code-linter.json5 | 35 + .../CheckKeyExists/entry/.gitignore | 6 + .../CheckKeyExists/entry/build-profile.json5 | 58 ++ .../CheckKeyExists/entry/hvigorfile.ts | 21 + .../CheckKeyExists/entry/oh-package.json5 | 26 + .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 116 +++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../src/main/ets/pages/CheckKeyExists.ets | 140 ++++ .../entry/src/main/ets/pages/Index.ets | 69 ++ .../entry/src/main/module.json5 | 66 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 28 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 6 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../ohosTest/ets/test/CheckKeyExists.test.ets | 77 ++ .../entry/src/ohosTest/ets/test/List.test.ets | 20 + .../entry/src/ohosTest/module.json5 | 27 + .../entry/src/test/List.test.ets | 20 + .../entry/src/test/LocalUnit.test.ets | 48 ++ .../CheckKeyExists/hvigor/hvigor-config.json5 | 37 + .../CheckKeyExists/hvigorfile.ts | 21 + .../CheckKeyExists/oh-package.json5 | 25 + .../CheckKeyExists/ohosTest.md | 9 + .../screenshots/CheckKeyExists_1.png | Bin 0 -> 24158 bytes .../screenshots/CheckKeyExists_2.png | Bin 0 -> 25595 bytes .../CheckKeyExists/screenshots/Cpp_1.png | Bin 0 -> 25651 bytes .../CheckKeyExists/screenshots/Cpp_2.png | Bin 0 -> 25950 bytes .../GetKeyAttributes/.gitignore | 12 + .../GetKeyAttributes/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../GetKeyAttributes/README.md | 92 +++ .../GetKeyAttributes/build-profile.json5 | 57 ++ .../GetKeyAttributes/code-linter.json5 | 35 + .../GetKeyAttributes/entry/.gitignore | 6 + .../entry/build-profile.json5 | 58 ++ .../GetKeyAttributes/entry/hvigorfile.ts | 21 + .../GetKeyAttributes/entry/oh-package.json5 | 26 + .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 132 ++++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../src/main/ets/pages/GetKeyAttributes.ets | 134 ++++ .../entry/src/main/ets/pages/Index.ets | 69 ++ .../entry/src/main/module.json5 | 66 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 28 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 6 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../ets/test/GetKeyAttributes.test.ets | 77 ++ .../entry/src/ohosTest/ets/test/List.test.ets | 20 + .../entry/src/ohosTest/module.json5 | 27 + .../entry/src/test/List.test.ets | 20 + .../entry/src/test/LocalUnit.test.ets | 48 ++ .../hvigor/hvigor-config.json5 | 37 + .../GetKeyAttributes/hvigorfile.ts | 21 + .../GetKeyAttributes/oh-package.json5 | 25 + .../GetKeyAttributes/ohosTest.md | 9 + .../GetKeyAttributes/screenshots/Cpp_1.png | Bin 0 -> 26285 bytes .../GetKeyAttributes/screenshots/Cpp_2.png | Bin 0 -> 26393 bytes .../screenshots/GetKeyAttributes_1.png | Bin 0 -> 24668 bytes .../screenshots/GetKeyAttributes_2.png | Bin 0 -> 26088 bytes .../OtherOperations/KeyExport/.gitignore | 12 + .../KeyExport/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../OtherOperations/KeyExport/README.md | 91 +++ .../KeyExport/build-profile.json5 | 57 ++ .../KeyExport/code-linter.json5 | 35 + .../KeyExport/entry/.gitignore | 6 + .../KeyExport/entry/build-profile.json5 | 58 ++ .../KeyExport/entry/hvigorfile.ts | 21 + .../KeyExport/entry/oh-package.json5 | 26 + .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 124 ++++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../entry/src/main/ets/pages/Index.ets | 69 ++ .../entry/src/main/ets/pages/KeyExport.ets | 136 ++++ .../KeyExport/entry/src/main/module.json5 | 66 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 28 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 6 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../src/ohosTest/ets/test/KeyExport.test.ets | 77 ++ .../entry/src/ohosTest/ets/test/List.test.ets | 20 + .../KeyExport/entry/src/ohosTest/module.json5 | 27 + .../KeyExport/entry/src/test/List.test.ets | 20 + .../entry/src/test/LocalUnit.test.ets | 48 ++ .../KeyExport/hvigor/hvigor-config.json5 | 37 + .../OtherOperations/KeyExport/hvigorfile.ts | 21 + .../KeyExport/oh-package.json5 | 25 + .../OtherOperations/KeyExport/ohosTest.md | 9 + .../KeyExport/screenshots/Cpp_1.png | Bin 0 -> 24318 bytes .../KeyExport/screenshots/Cpp_2.png | Bin 0 -> 25195 bytes .../KeyExport/screenshots/KeyExport_1.png | Bin 0 -> 22667 bytes .../KeyExport/screenshots/KeyExport_2.png | Bin 0 -> 24159 bytes .../QueryKeyAliasSet/.gitignore | 12 + .../QueryKeyAliasSet/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../QueryKeyAliasSet/README.md | 92 +++ .../QueryKeyAliasSet/build-profile.json5 | 57 ++ .../QueryKeyAliasSet/code-linter.json5 | 35 + .../QueryKeyAliasSet/entry/.gitignore | 6 + .../entry/build-profile.json5 | 58 ++ .../QueryKeyAliasSet/entry/hvigorfile.ts | 21 + .../QueryKeyAliasSet/entry/oh-package.json5 | 26 + .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 100 +++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../main/ets/entryability/EntryAbility.ets | 57 ++ .../entrybackupability/EntryBackupAbility.ets | 27 + .../entry/src/main/ets/pages/Index.ets | 69 ++ .../src/main/ets/pages/QueryKeyAliasSet.ets | 79 +++ .../entry/src/main/module.json5 | 66 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 28 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 6 + .../main/resources/dark/element/color.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 50 ++ .../entry/src/ohosTest/ets/test/List.test.ets | 20 + .../ets/test/QueryKeyAliasSet.test.ets | 77 ++ .../entry/src/ohosTest/module.json5 | 27 + .../hvigor/hvigor-config.json5 | 37 + .../QueryKeyAliasSet/hvigorfile.ts | 21 + .../QueryKeyAliasSet/oh-package.json5 | 25 + .../QueryKeyAliasSet/ohosTest.md | 9 + .../QueryKeyAliasSet/screenshots/Cpp_1.png | Bin 0 -> 26801 bytes .../QueryKeyAliasSet/screenshots/Cpp_2.png | Bin 0 -> 27579 bytes .../screenshots/QueryKeyAliasSet_1.png | Bin 0 -> 23316 bytes .../screenshots/QueryKeyAliasSet_2.png | Bin 0 -> 23911 bytes 711 files changed, 26146 insertions(+) create mode 100644 UniversalKeystoreKit/KeyDeletion/.gitignore create mode 100644 UniversalKeystoreKit/KeyDeletion/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/KeyDeletion/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyDeletion/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/KeyDeletion/README.md create mode 100644 UniversalKeystoreKit/KeyDeletion/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyDeletion/code-linter.json5 create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/.gitignore create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/pages/KeyDeletion.ets create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/ets/test/KeyDeletion.test.ets create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyDeletion/entry/src/test/LocalUnit.test.ets create mode 100644 UniversalKeystoreKit/KeyDeletion/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/KeyDeletion/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyDeletion/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyDeletion/ohosTest.md create mode 100644 UniversalKeystoreKit/KeyDeletion/screenshots/KeyDeletionCpp_1.png create mode 100644 UniversalKeystoreKit/KeyDeletion/screenshots/KeyDeletionCpp_2.png create mode 100644 UniversalKeystoreKit/KeyDeletion/screenshots/KeyDeletion_1.png create mode 100644 UniversalKeystoreKit/KeyDeletion/screenshots/KeyDeletion_2.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/.gitignore create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/README.md create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/code-linter.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/.gitignore create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/types/libentry/Index.d.ts create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/ets/test/GenerateKey.test.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/test/LocalUnit.test.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/ohosTest.md create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/screenshots/ArkTS_1.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/screenshots/ArkTS_2.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/screenshots/Cpp_1.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/screenshots/Cpp_2.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/.gitignore create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/README.md create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/code-linter.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/.gitignore create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/pages/ImportEncryptedKey.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/ets/test/ImportEncryptedKey.test.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/ohosTest.md create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/screenshots/ImportEncryptedKeyCpp_1.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/screenshots/ImportEncryptedKeyCpp_2.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/screenshots/ImportEncryptedKey_1.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/screenshots/ImportEncryptedKey_2.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/.gitignore create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/README.md create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/code-linter.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/.gitignore create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/AES256.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/RSA2048.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/X25519.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/ets/test/ImportKeyPlainText.test.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/test/LocalUnit.test.ets create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/ohosTest.md create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/AES256_1.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/AES256_2.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/Cpp_1.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/Cpp_2.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/RSA2048_1.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/RSA2048_2.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/X25519_1.png create mode 100644 UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/X25519_2.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/.gitignore create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/README.md create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/code-linter.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/.gitignore create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/pages/AnonymousKeyProof.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/ets/test/AnonymousKeyProof.test.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/test/LocalUnit.test.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/ohosTest.md create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/screenshots/AnonymousKeyProof_1.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/screenshots/AnonymousKeyProof_2.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/screenshots/Cpp_1.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/screenshots/Cpp_2.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/.gitignore create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/README.md create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/code-linter.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/.gitignore create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/pages/NonAnonymousKeyProof.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/ets/test/NonAnonymousKeyProof.test.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/test/LocalUnit.test.ets create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/ohosTest.md create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/screenshots/Cpp_1.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/screenshots/Cpp_2.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/screenshots/NonAnonymousKeyProof_1.png create mode 100644 UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/screenshots/NonAnonymousKeyProof_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/.gitignore create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/README.md create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/code-linter.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/.gitignore create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/pages/FineGrainedUserIdentityAuthentication.ets create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/pages/UserIdentityAuthentication.ets create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/element/float.json create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/ets/test/AccessControl.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/ohosTest.md create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/screenshots/FineGrainedUserIdentityAuthentication_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/screenshots/FineGrainedUserIdentityAuthentication_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/screenshots/UserIdentityAuthentication_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/AccessControl/screenshots/UserIdentityAuthentication_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/.gitignore create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/README.md create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/code-linter.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/.gitignore create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/AESCBCPKCS7.ets create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/AESGCMNoPadding.ets create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/DESCBCNoPadding.ets create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/RSAECBOAEPSHA256.ets create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/RSAECBPKCS1_V1_5.ets create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/SM2.ets create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/ets/test/EncryptionDecryption.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/test/LocalUnit.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/ohosTest.md create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/AESCBCPKCS7_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/AESCBCPKCS7_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/AESGCMNoPadding_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/AESGCMNoPadding_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/Cpp_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/Cpp_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/RSAECBOAEPSHA256_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/RSAECBOAEPSHA256_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/RSAECBPKCS1_V1_5_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/RSAECBPKCS1_V1_5_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/SM2_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/SM2_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/.gitignore create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/README.md create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/code-linter.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/.gitignore create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/pages/HMAC.ets create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/ets/test/HMAC.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/ohosTest.md create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/screenshots/HMAC_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/screenshots/HMAC_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/screenshots/cpp_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/HMAC/screenshots/cpp_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/.gitignore create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/README.md create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/code-linter.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/.gitignore create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/pages/HKDF.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/pages/PBKDF2.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/ets/test/KeyDerivation.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/test/LocalUnit.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/ohosTest.md create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/screenshots/Cpp_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/screenshots/Cpp_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/screenshots/HKDF_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/screenshots/HKDF_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/screenshots/PBKDF2_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyDerivation/screenshots/PBKDF2_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/.gitignore create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/README.md create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/code-linter.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/.gitignore create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/pages/DH.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/pages/X25519.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/ets/test/KeyExchange.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/test/LocalUnit.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/ohosTest.md create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/Cpp_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/Cpp_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/DH_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/DH_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/X25519_1.png create mode 100644 UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/X25519_2.png create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/.gitignore create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/README.md create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/code-linter.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/.gitignore create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/ECC256SHA256.ets create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/RSASHA256PKCS1_V1_5.ets create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/RSASHA256PSS.ets create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/SM2SM3.ets create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/ets/test/SigningVerification.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/test/List.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/test/LocalUnit.test.ets create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/hvigorfile.ts create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/oh-package.json5 create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/ohosTest.md create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/ECC2561.png create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/ECC2562.png create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/RSA1.png create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/RSA2.png create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/SHA2561.png create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/SHA2562.png create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/SM21.png create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/SM22.png create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/cpp1.png create mode 100644 UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/cpp2.png create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/.gitignore create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/README.md create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/build-profile.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/code-linter.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/.gitignore create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/pages/CheckKeyExists.ets create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/ets/test/CheckKeyExists.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/test/List.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/test/LocalUnit.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/hvigorfile.ts create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/oh-package.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/ohosTest.md create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/screenshots/CheckKeyExists_1.png create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/screenshots/CheckKeyExists_2.png create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/screenshots/Cpp_1.png create mode 100644 UniversalKeystoreKit/OtherOperations/CheckKeyExists/screenshots/Cpp_2.png create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/.gitignore create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/README.md create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/build-profile.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/code-linter.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/.gitignore create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/pages/GetKeyAttributes.ets create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/ets/test/GetKeyAttributes.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/test/List.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/test/LocalUnit.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/hvigorfile.ts create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/oh-package.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/ohosTest.md create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/screenshots/Cpp_1.png create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/screenshots/Cpp_2.png create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/screenshots/GetKeyAttributes_1.png create mode 100644 UniversalKeystoreKit/OtherOperations/GetKeyAttributes/screenshots/GetKeyAttributes_2.png create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/.gitignore create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/README.md create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/build-profile.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/code-linter.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/.gitignore create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/ets/pages/KeyExport.ets create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/ohosTest/ets/test/KeyExport.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/test/List.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/entry/src/test/LocalUnit.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/hvigorfile.ts create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/oh-package.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/ohosTest.md create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/screenshots/Cpp_1.png create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/screenshots/Cpp_2.png create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/screenshots/KeyExport_1.png create mode 100644 UniversalKeystoreKit/OtherOperations/KeyExport/screenshots/KeyExport_2.png create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/.gitignore create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/AppScope/app.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/AppScope/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/AppScope/resources/base/media/app_icon.png create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/README.md create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/build-profile.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/code-linter.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/.gitignore create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/build-profile.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/hvigorfile.ts create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/oh-package.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/cpp/CMakeLists.txt create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/cpp/napi_init.cpp create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/ets/pages/Index.ets create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/ets/pages/QueryKeyAliasSet.ets create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/module.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/resources/base/element/color.json create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/resources/base/element/string.json create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/resources/base/media/background.png create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/resources/base/media/foreground.png create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/resources/base/media/layered_image.json create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/resources/base/media/startIcon.png create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/resources/base/profile/backup_config.json create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/resources/base/profile/main_pages.json create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/main/resources/dark/element/color.json create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/ohosTest/ets/test/QueryKeyAliasSet.test.ets create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/entry/src/ohosTest/module.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/hvigor/hvigor-config.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/hvigorfile.ts create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/oh-package.json5 create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/ohosTest.md create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/screenshots/Cpp_1.png create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/screenshots/Cpp_2.png create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/screenshots/QueryKeyAliasSet_1.png create mode 100644 UniversalKeystoreKit/OtherOperations/QueryKeyAliasSet/screenshots/QueryKeyAliasSet_2.png diff --git a/UniversalKeystoreKit/KeyDeletion/.gitignore b/UniversalKeystoreKit/KeyDeletion/.gitignore new file mode 100644 index 0000000..d2ff201 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/.gitignore @@ -0,0 +1,12 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +/.appanalyzer \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/AppScope/app.json5 b/UniversalKeystoreKit/KeyDeletion/AppScope/app.json5 new file mode 100644 index 0000000..dddc4da --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/AppScope/app.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "bundleName": "com.samples.keydeletion", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/UniversalKeystoreKit/KeyDeletion/AppScope/resources/base/element/string.json b/UniversalKeystoreKit/KeyDeletion/AppScope/resources/base/element/string.json new file mode 100644 index 0000000..6871b23 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "KeyDeletion" + } + ] +} diff --git a/UniversalKeystoreKit/KeyDeletion/AppScope/resources/base/media/app_icon.png b/UniversalKeystoreKit/KeyDeletion/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a39445dc87828b76fed6d2ec470dd455c45319e3 GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyDeletion/README.md b/UniversalKeystoreKit/KeyDeletion/README.md new file mode 100644 index 0000000..9c9b132 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/README.md @@ -0,0 +1,92 @@ +## 密钥删除(ArkTS) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-delete-key-arkts.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### KeyDeletion + +##### 介绍 + +1. 本示例主要介绍为保证数据安全性,当不需要使用密钥时,删除HKDF256密钥。 + +##### 效果预览 + +| 主页 | 删除 | +| ---------------------------------------------------------- | ---------------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call KeyDeletion按钮调用接口deleteKeyItem,删除密钥。 + +## 密钥删除(C/C++) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-delete-key-ndk.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### Call C/C++ + +##### 介绍 + +1. 本示例主要介绍为保证数据安全性,当不需要使用密钥时,删除HKDF256密钥。 + +##### 效果预览 + +| 主页 | 跳转页 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| | | + +使用说明 + +1. 点击Call C/C++按钮调用OH_Huks_DeleteKeyItem接口,删除密钥。 + +## 工程目录 + +``` +entry/src/main/ +|---ets +|---|---entryability +|---|---|---EntryAbility.ets +|---|---pages +|---|---|---Index.ets // 首页 +|---|---|---KeyDeletion.ets +|---cpp +|---resources // 静态资源 +|---ohosTest +|---|---ets +|---|---|---tests +|---|---|---|---KeyDeletion.test.ets // 自动化测试用例 +``` + + +## 相关权限 + +无。 + +## 依赖 + +不涉及。 + +## 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.2 Release及以上。 + +3. DevEco Studio版本:DevEco Studio 5.0.2 Release及以上。 + +4. HarmonyOS SDK版本:HarmonyOS 5.0.2 Release及以上。 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo UniversalKeystoreKit/KeyDeletion > .git/info/sparse-checkout +git remote add origin https://gitee.com/harmonyos_samples/guide-snippets.git +git pull origin master +``` \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/build-profile.json5 b/UniversalKeystoreKit/KeyDeletion/build-profile.json5 new file mode 100644 index 0000000..fb5a1ab --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/code-linter.json5 b/UniversalKeystoreKit/KeyDeletion/code-linter.json5 new file mode 100644 index 0000000..2858646 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/code-linter.json5 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/.gitignore b/UniversalKeystoreKit/KeyDeletion/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/build-profile.json5 b/UniversalKeystoreKit/KeyDeletion/entry/build-profile.json5 new file mode 100644 index 0000000..2d8b081 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": [ + "arm64-v8a", + "x86_64" + ] + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/hvigorfile.ts b/UniversalKeystoreKit/KeyDeletion/entry/hvigorfile.ts new file mode 100644 index 0000000..e4f43d5 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyDeletion/entry/oh-package.json5 b/UniversalKeystoreKit/KeyDeletion/entry/oh-package.json5 new file mode 100644 index 0000000..118bdd4 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/oh-package.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/CMakeLists.txt b/UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..7395e4f --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(KeyDeletion) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) +target_link_libraries(entry PUBLIC libace_napi.z.so libhuks_ndk.z.so) \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/napi_init.cpp b/UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000..086974e --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start key_deletion] +#include "huks/native_huks_api.h" +#include "huks/native_huks_param.h" +#include "napi/native_api.h" +#include +// [StartExclude key_deletion] +/* 以下以生成ECC密钥为例 */ +OH_Huks_Result InitParamSet(struct OH_Huks_ParamSet **paramSet, const struct OH_Huks_Param *params, + uint32_t paramCount) +{ + OH_Huks_Result ret = OH_Huks_InitParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_AddParams(*paramSet, params, paramCount); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + ret = OH_Huks_BuildParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + return ret; +} + +struct OH_Huks_Param g_testGenerateKeyParam[] = {{.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_ECC}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_AGREE}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_ECC_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_NONE}}; + +static OH_Huks_Result GenerateKeyHelper(const char *alias) +{ + struct OH_Huks_Blob aliasBlob = {.size = (uint32_t)strlen(alias), .data = (uint8_t *)alias}; + struct OH_Huks_ParamSet *testGenerateKeyParamSet = nullptr; + struct OH_Huks_Result ohResult; + do { + /* 1.初始化密钥属性集 */ + ohResult = InitParamSet(&testGenerateKeyParamSet, g_testGenerateKeyParam, + sizeof(g_testGenerateKeyParam) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 2.生成密钥 */ + ohResult = OH_Huks_GenerateKeyItem(&aliasBlob, testGenerateKeyParamSet, nullptr); + } while (0); + OH_Huks_FreeParamSet(&testGenerateKeyParamSet); + return ohResult; +} +// [EndExclude key_deletion] +static napi_value DeleteKey(napi_env env, napi_callback_info info) +{ + /* 1.获取密钥别名 */ + const char *alias = "test_key"; + struct OH_Huks_Blob keyAlias = { + (uint32_t)strlen("test_key"), + (uint8_t *)"test_key" + }; + // [StartExclude key_deletion] + /* 生成密钥 */ + OH_Huks_Result genResult = GenerateKeyHelper(alias); + if (genResult.errorCode != OH_HUKS_SUCCESS) { + napi_value ret; + napi_create_int32(env, genResult.errorCode, &ret); + return ret; + } + // [EndExclude key_deletion] + + /* 2.调用OH_Huks_DeleteKeyItem删除密钥 */ + struct OH_Huks_Result ohResult = OH_Huks_DeleteKeyItem(&keyAlias, nullptr); + + napi_value ret; + napi_create_int32(env, ohResult.errorCode, &ret); + return ret; +} +// [End key_deletion] +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + { "deleteKey", nullptr, DeleteKey, nullptr, nullptr, nullptr, napi_default, nullptr } + }; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void*)0), + .reserved = { 0 }, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) +{ + napi_module_register(&demoModule); +} diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/types/libentry/index.d.ts b/UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 0000000..70baf68 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const deleteKey: () => number; \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/types/libentry/oh-package.json5 b/UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000..2826cc7 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libentry.so", + "types": "./index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/entryability/EntryAbility.ets b/UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..edc2839 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..b1e2129 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/pages/Index.ets b/UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..9ad9b71 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; +import testNapi from 'libentry.so'; + +@Entry +@Component +struct Index { + @State message: string = 'KeyDeletion'; + + goToSample(url: string): void { + router.pushUrl({ + url: url, + }, router.RouterMode.Single, (err) => { + if (err) { + console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('pushUrl success'); + }) + } + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.key_deletion')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/KeyDeletion') + }) + Button($r('app.string.call_cpp_delete_key')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: number = testNapi.deleteKey(); + this.message = 'Call C/C++ Result: ' + ret.toString(); + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/pages/KeyDeletion.ets b/UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/pages/KeyDeletion.ets new file mode 100644 index 0000000..30a8e4e --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/main/ets/pages/KeyDeletion.ets @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * 以下以HKDF256密钥的Promise操作使用为例 + */ +// [Start key_deletions] +import { huks } from '@kit.UniversalKeystoreKit'; + +/* 1.确定密钥别名 */ +let keyAlias = 'test_Key'; +// [StartExclude key_deletions] +/* 2.初始化密钥属性集 */ +let generateProperties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_DH + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_AGREE + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_DH_KEY_SIZE_2048 + } +]; + +let generateHuksOptions: huks.HuksOptions = { + properties: generateProperties, + inData: new Uint8Array([]) +} + +/* 3.生成密钥 */ +function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions) { + return new Promise((resolve, reject) => { + try { + huks.generateKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throw (error as Error); + } + }); +} + +async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions): Promise { + console.info(`enter promise generateKeyItem`); + try { + await generateKeyItem(keyAlias, huksOptions) + .then((data) => { + console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`); + }); + return 'Success'; + } catch (error) { + console.error(`promise: generateKeyItem input arg invalid, ${JSON.stringify(error)}`); + return 'Failed'; + } +} + +async function testGenKey(): Promise { + let ret = await publicGenKeyFunc(keyAlias, generateHuksOptions); + return ret; +} + +// [EndExclude key_deletions] +/* 4.构造空对象 */ +let deleteHuksOptions: huks.HuksOptions = { + properties: [] +} + +class ThrowObject { + public isThrow = false; +} + +function deleteKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.deleteKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +/* 3.删除密钥*/ +async function publicDeleteKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions): Promise { + console.info(`enter promise deleteKeyItem`); + let throwObject: ThrowObject = { isThrow: false }; + try { + console.log('start genKey...') + await testGenKey(); + console.log('end genKey...') + await deleteKeyItem(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: deleteKeyItem key success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: deleteKeyItem failed, ${JSON.stringify(error)}`); + } + }); + return 'Success'; + } catch (error) { + console.error(`promise: deleteKeyItem input arg invalid, ${JSON.stringify(error)}`); + return 'Failed'; + } +} + +async function testDerive(): Promise { + let ret = await publicDeleteKeyFunc(keyAlias, deleteHuksOptions); + return ret; +} +// [End key_deletions] +@Entry +@Component +struct Index { + @State message: string = 'KeyDeletion'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.call_key_deletion')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + let ret = await testDerive(); + this.message = 'KeyDeletion Result: ' + ret; + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/module.json5 b/UniversalKeystoreKit/KeyDeletion/entry/src/main/module.json5 new file mode 100644 index 0000000..4144486 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/main/module.json5 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/element/color.json b/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/element/string.json b/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..e43f193 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/element/string.json @@ -0,0 +1,40 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "KeyDeletion" + }, + { + "name": "key_deletion", + "value": "KeyDeletion" + }, + { + "name": "call_cpp_delete_key", + "value": "Call C/C++" + }, + { + "name": "call_cpp_result", + "value": "Call C/C++ Result: " + }, + { + "name": "call_key_deletion", + "value": "Call KeyDeletion" + }, + { + "name": "key_deletion_result", + "value": "KeyDeletion Result: " + }, + { + "name": "key_deletion_failed", + "value": "KeyDeletion Result: Failed" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/media/background.png b/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/media/foreground.png b/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f z3`9H(<`G*WCN>bN493AFOi{!!!L|afI7%o`6&6lXK&2`L1YumJiZTQ+5doQ^Fu|gz zI6Nvw1cME>!8`;4iI*N+z3;u_gZtzG5&vyF~^*1 z?S1yyXYbweAFzGO*PdLxe&gE9j&{c{J=rY}9i1#6cCzdq+ASx~UzXhiC(H6orN{Ar zj;qq$yDTU7NWP@ws1J2_*G}Ykx7%{iE$G@-7-eF^Y3#}`(v#ySiIZdTj}`y+a>=Im9Vq=f1W5yxR*!@kj+Rxz&v=+4_?qb>2v z^P8^zTt$BB=j8B|JpIS7`QY>Jz4z#w<>ZT>lB09T6nS2-t-LNa`Yg!ixr}^gvZsB` z{B;rQ@uVEqwOt7oA8%Sn=e2VBs;^`dNc~|xx$^LKH+*6BuO8<1`K9&UDuw8t_%!FY zoV0NZ!^eH~qhBH?uakr4K4~ZC5VHnAA|L9#J5r^|-)7;Y zUl$mM>pDMqeipwr+7#N+YO&F-3t!twD#tH9_S*S{wQ+C`@f*(uNuw}s=xXMh&DI;Q z;_u$0c(3`5*FEq(O?pz@6#ee_pZMDAFS)(D{hdnlGw+UhHaZ&vMC3y~_HorR=oT!) zD&Jv0*w5!@vBS?MX~$>r(d*!xjZ=9%U3__Gl0?W|%cDAF&TIVSk@)+3cqc!3boGhhYzil=`)k_5%wL2pqQz`Ju@50G)sNfVj zoXGZ|Q(f3+@xx0`O2~K<`L6lJ-SXStp$#*Nk@$Du%RKJ9@n>4_fX zCq4RXG{SB86?4nquk-Hy-E#B;AN86?zpBs|J16`d(I5ZXNB^!~KL7eV0uKN-_1L$Q zfhXMkzP+y=*8|%=cJL*vJ8JS$i*h!V@e z?gp)OZL3q^qPRQ$mTS*l z!1Lo9sgwA)pzOQd7ry0nSAP)8dF^z>J#;@|{wb*sK5UU+HV4!!`0VEJLKou6^E1;q z{-F(t{g8gMTs+F%4CL8B(dE++Be1u} zQa1d_@^?2B{4?(K#G2gBZ2YKxYj^wS1vv8wb2h-K`rtLS+C4j5oS5zZQT6pjk(( zJ4B5)x)C<~DS-Jn#3lX27u>p0yp_M+jn)mGYaUy>+T%Nnb1#0!>tbyAQ%)nklRSgJ z&7=Ic?ks-hoA@5fJ^x~JiY`PYkDmW0C(plGd!Q$Ex;t|N@d~qieC9rdJUa(Jbmg%% zxJoLcUW^RY7oUugb$iXkOVyLI8AJG+ zNchYly!4G7Y^6~5nrXo&e$8p}lUVB0m<1UOEOBY-ht5+)-??6hPx|GZjRV(b``>-$ zM|{PjUt-09)0*964ZWy4qG3A!iZuCL5J4vSq$?ol?wO2=1e&!;9t z{HK#&d2T{`aKZSSV$8nw`5IF+b?d?_&_RB2Nn@S=KEJHRZ&{wfFD-HANt+d!8=g@V${FeVy<@Q=p|RCl}k1iW;RIY+rXYw+ro1J ztScYrS3bq4R+FlcH(!!*-yB2t`NcV#59x0CP?FiqC-VdG1vMIuAg3o=Td=#P|3Z0B%|-@17rLGk-6p<6~!$6~POh1kU3(XXZO`=|>$d z!lw$=5_RyEi#Jr~RP#^%iC^4A^2m;K+VClBHe2;z6Z14*Mk&|$%X0f<_lmdugY8>E zPThfcKaZ0b)2b2Pn1`Dkmvb_pUZ*zC08jjo)ep|hccB`;;R{6kL;Ts-DL%Zk@M}Ec zYe??S-~5VIlRb~$9A!25WQb$>P5#6re$4=RZ7!m^$ICJHQwLq8^3qO zSIW*0ziJfhY2#Np#+5qaD29V6USiSHHu0r%dVQte1>d!Te30L9h<8T(gM1~;2HMmK zAIaG=K2h~u$+A`Ao#yL~^C@rnmi3*Dn>*0%_Q|VFij#Is9D-CUfq|-t52LPSO>Mf;|h8QzG9r>i*kxj)D&%wf12-@hxpQE(boL;`OLW% z&4ra*97R9KXL{m{MVR>LH~jeO-Z?hkb&`yq#K-O6lT$@0DD?-g)^Uzc7T&5n8gw__ z0DpXP`45D@vQE5>CYLA9MXJba02$ioVhjTWVS5bZ6(4zN`ENe`p5>!H^k})NKh(Lb zKhik@lUA-Xx~smjY)TJqEB4J>%kshNC(AGX&hhfC|NQ3id+))>f~iYr%eBS5L6diS z0c(T7VNUk2yzB*+mM{H`dzO#=6GzJf`m=$1G@nblG}%hD(09V$W~@UCQLSS;5BqEV zWae*vfSYo>EH@?Gc;aOFp#GTWmw)f}@_j#ZYkBJ*Le`;RxE%9>G%3oHFxKHSfF_;E zFF&fw_1jO}dg1SWTfI@g(_fZ9_1ee&mj2x4J1a|pX>wLqgaW;Whu>GnNZR9Y^4s;%W zx4i1NzvUU8TZ6Uq$a?oX>%J5^9jAU9em|0;-_C;e(1}uEYG}e zr$t+qTP`-spu!U-M~AgevS79|o^g>`wAc>y@e7Vk`?z91a^qxq>GOBXzxbc8ET8gX z-7Xxv6CigTGJZUUv*`9=vmA1gzg4h49N+Y^ODZ8#@KI9`q-_X zaPu5;fuSS!*@le$mhP;#HK&jK(B1NbUvXvmPhY0_kiYDk{5AHRoIkT@vw@Z8z;F1q z7l7fCCi(MA@@nf@5q}|i{jv8-IsM&M6%o3LI{BfEQREKp4HG$@wUJ1eYx}Q!%BAIh z`K$LWk8838tEq&7|H$p$UeKq__MwZg*U!9Rnw3=(J#1>imzU))z3%$*uKvrZuZ{Wd>ES!5dgNmrfBPTZ zSl;rks&UNFhD?$g9J)KT33%MPXFTyAfBeSP=e+&fch`Iedi2_(FPHhgB&G`tFhZFY^iGZTPO8%A6S;JedWE&6Z7VgKJMLTtbV@Au;oe}a$|fo@8QFpeTE;~ z=(!{4cwATZ_x+vv)3p?oK6COMai}`b-FNw9`G;R}pRW2^Ajgt*_)SjojgA<};ZV-D zH)q&q4iEL*eWU|BFmM=S?>NY;&)5I;`<6?(5sl{jyXGx}^8>dxQX%Vtv5PEo8w6JK zToHH6efQkYp6Q3Mqvhz+s$i(tXF7XpLn?CV%Z6Oqu_p_+nw!5{zT;K*3%heMNzF;f zzun5oTzGVll(CU?9of+U+nP1y(OpU zvv~w9Sr;nLG5?3p<|70ueyyDbUY}Yd!E0=`V+1F2S@%7DUU z!+3G5v_Yp@FhhD(9o{OXys6YM@?dLP0LotS!( zZ~o{ThY!62s*m!Sg&e-XdU0#<$S=0*Pb|w{eYqaXoLkS+K6Rp~Y^EN+{G*Qi6P;tq z8XuKI#YV0>%Nz^2?6yhv9fh2b=evx?JV#`6&=bQOMZM+dz(~P{OOO4g=JV%2_LA3t zIWdLGe~6_L*6U?ZoidN$t=;E~mp$XEY0L*5)a)#9%C_**_ejXj1}SaGL~lF&7ro-L z5_Il{V)fCw*fu?YZqYMj%cgB7z3S~eAahn{_@cQMlFic3)%3UY#Noj!JH4cEvRr#S z^9EDCiHH1&FTSjo9Q4r{^K&2ha-QnFK^=vKuFYqvdxW=7K2uz)M)&XO4}*2S)oU;32*?s`tzhPoNdy zMK~{~T*=4;PVlC()T`0MfB8pTs;kbv+GgKHr(Rq!;3+S|5(B&y+n5*@z^5dLrcGjDVs3` zF=w9B8T=Q$;LA>~9`X4+qVFJ-liI=f8qb5;adlP9$i*t%;M>z~dBL;M7jh(|v1O@a za}jzx7Y{1+b#a=fVe#WfJ$C)~F&^GD!hg8&3xD97hwY{wLOxnA2;wJqo|?br07>n| zdc9}P-SQkmio~mhtX%z&MJycY7!O^|^}~~L*w+vLY!DscBm0>6jPaAr#6u#lPtl}a zn^g8A4RF_SY<9BpclX?P?PZtsH(oFGD^X@u>A2cxb^Xba#{f#>E7Bp? ztFxkR`P@dmpq)Vyx9`@uFnA8e#&tpr-DGb_G^IYIlqLQGW*i-bW1&6e29O6Y4AR#5 zvw3QcRQo|aIrZklmvExE$M4X$oUyA07_9mhM=sXuWE_~5;nT=?xmN7c}VZTZ(}?rL~jVuDCHDd zW0I>4RkJL)P{rpZ{mdS{51lA{3Pf+T`jPlbs|k>vbZN6ZbRkPI+fmPp0DeI6t7Nc~ z$NhZ%nT)>k;6(Zz50&~yf1iG^fs4sKviK#}-Dl{r>Bu~hY2DR;F}T*pmL9|4wUTbw z@xnlPQdFhr&E%R&<~6QfTI+#VgCJrYF+`(acGqTfD_@rASLH)IiT<#`a<+xCqjpL` z>#D>_%Q%UnL=``~nBcrnhfBLfp$0UGM~}`pY-%%xL2Su?1!0>O+=jhV^Q|SHHsi~S zD~0ov1zlYjfNIlt^GFNNb-;qpg1EPAM(ME^ps)?4i@M~QXic5q&!wGA8~zyJ#}kr& z^`4JJ%2R4dCKVL9!V%6$c5)Gv^*q_xt7|K06))bGDUPP7^FtSfX;?h<0|XKb062A zIY|b0!pj0C)Y$7;i^P=d-~9Mh&zQKh^`h&1%>hsw!5hUsnpx4t z<}nU3;cAnu{B7X&Vn5^sgN95?k&<*Nw-dMSz$p_Pc^$xvIFk*X^*T}DEO_*uml7(B z&nEcAJ#m?Xu}#P#5u(vuOElFSM`G;J(?_?d0s0skGYz4+p=0BMwY@=f?C04B`6n16 z7Y+?9wH$J zAxS-==YiY@80*`{n1+s)KEk056AV77g?$%2H0xq(Q))9XS&VWbRL_G=l_J9>UJl0D zL}N3`NDj2QCw^L+J)AKpGPZ04N*&EdoH2o<_uVvg5ExqK?h8cD!pAn(v{$fP*#~QU zh>wrmGmlPAjvv4qPUcCCWLhX|Ka2&~1>W*WY1;yK(tBoXnGCEf#s(&kaR8=O7&`Rb z4)NokexjR!kF~8MOFmU5aQ$lW3aOlWOo#8pn)8ot^lQLVQZO5XoZ}x``u%x;$Cmjs zwt{}jE1RV@QuzczTVvNF(%{QMY#aX3$pievr_W(l1ZA{3C6z9Llh!WOKW`#3*AYhq z-tucRhL5MYjUq^yq;P4yz(j=;Uhu<*6tg}0;12PFp$~4~hxPm_+Zg8Ct>f7*BneZNsSb8?%&Jh@KlZTTrOg zc*d4a&)A=--&QSt^&=aCKtMfi2RM(tjY0_3lN)$zC%(pMOo(G{xaW#VQD)ml*8}*( zn%f398D{+~2NGYgRbLr0gOY-ta%{uQ8}bVGoMs=E!xb*`2zR1d+}H1qgGY~B`-@YJ z>*a;j$od&444i_t&M>U#WibY2>CmtI+6%Qc>JFq&fKMxFac!J|LFhSyp@oAfvh|$Q!ky#K zhS(4BtuuI=bE{5uez>A2b4!3M+hm`g$1$&w|CB6iS~rUj(~}eO8bJK3dJ?_67ebx{ zSHS|R%y8%`=YQMnAR>?_}JgGOix59Mum~lwBBOj7l{Dr%(^B9~CeuB#Ukb0`^qvuU*Y(62BICR)&Tg!A&&-M+!2eTcS zQp|kcb?_I5@TRuW`$zm0SeN?*o>tHfJx!tLIT3p}glz!EcCx$YvH;wLhF24aiOPLh zoyM4vMhXD7pn%KA%I|SJ3pjFVbc&HshPKa%R-zM#w$p3fhA+q*C$x=DN^`o8SMD%{ zlYy6XyKVf(AvWYbX0=U|B7A&%L$qy^lSpgCbq?mNVK#inCYah3&VIO?=1DXw=#`qC zbt3TAho;;JwjNhLV1kW_T;f+5&f5zw$zb{>8{!V`+%h~%KVy-DqlO+=H=VZ=FkY%TPJGOKbO-eUMZb@k`Qw5*kXQI4 zNn-VY-V}k{dvi=NgDj)aFv2b;9&Lhj62jH0Xgt5%4NV`a$nS9VFeZ8jwL3ZT-35mn zvUwAUQ9a=cgBJ%U^%9B`*>UXEt~NPJ9a#K=jILPgIq5_LF4);`bivL2J}%hVmz_pI z&(zfWn4ASNsVrtA?CTky6@SLgnCP>dnQ&s$k2bCduV@v=0M<$2v&?X_w&f?0 zdVL4q!ob4O|06wo;ixOrj>l#y;~Gg=-=WAx*pV-hTSqte=+)3!U&FCJJ(R7IGj_tH zSk_m_@)csRD}7KQl3@|As*N?`C_c!U@vo=O(oUUM9HYTXr$fev>%5uanu%NzjR zCb4pse%58Ff_FbT99ZTs=22SCWBp8Il>D>{j4u>gKeWxhWg0&$HJ{gkdPXCf61P@& ztiI#OvjYd~D)hvhL4pdPanYqKH?T(AS0xsJjcpoa4(T1TJw`VIoTCqRpI?P*;>dsN z5f0BOf=znyxkaZ2tJWn8N$N>lK}c;lWS?W5vOBR=JKko}KC|$3Z%PH$J5|jKJ-NqE z_ZknrZ7W~D$^f(y8P~onU3Oty2J4NY*@llDx%i|JpU9&wHDK(xtG@VU#^kYat*h>i zdSLC^jL7(-#cz$a=M=p%&kPDtW4)wR`B-^()-G4{E(m^LY+5LRq%6%7l<6vOPNhVCyvY=4yUI zIx&MxLE28(nmXlm7viLOLSs$b4|GCD7I{^>sJ)bo<7qB^r=YAS^^JFY6;xwEh zZpDM~;ZEeb0~BvkTQTEG0U3VZL5j9H_mXvxdHwoPMGk8H%GZ$DSUoG};o!Bp*+kXX z`qy7&0LlzDGC5UnIv&!hC5g%LKEG*AaEI$`J|`zF9*~_UC6v2ef%Yt=w?iGS=`x{m`*tc1v}Pz zf~slY{K=p-7He#u7L@_cNMwKhd*f^(-Vaneam*r{gTf>LelwEqaEL>^IXTI3UTi}^ zZkltHCYX)!fRgkGlZFWF0F?CZ*bebcbNh5(fov2_4=P{4lkUMPb=`l~2uhFxu>7&DseW}mFpI(L7m<98w3m<&s^gYwzKLS`@ ziH2UU5yjHI=Sa0E5;z6n)mm>R$Iaaa0HpF2H=cyKrST)6aY5j>Y2EFa4KyaOJpi`Y z0cR0NFVNX;eH&s&2RLs_Wk`!X1Ktl5EXMuVY^M5^Na4ay{PgzMr(hU*GqwVm<`|tx zHqpMHc}$IYj}CnPhO8RSa9ryZ-xY7p0CWe2u`wOua|f#J0CPySsjO015zUoj^|=$R z&P!8a>m2?Q`plg2TfXWox!mch;lqB)b!%4}(i&%-8hjt^C)?8v8krgXwGp&JSbXUmUuKNKj;seLQ@+i{*gD4%I@RALNg?5Nv zHQN3d?-dcg{ZuEQo!};N-E}JHlr|#Z=D+=Y^?ah~?(8cL)5{VsbD?G)a@Zyct*NHxP>~FNNVt39Nz-u{udkt;$vC~g<^Q~(o z@!$ErW946qkAsrqYR=YH5b{$F!kam>41*1>C($G?Qu;QuA8=!KcHIVdWNDr-8-7uK zNuNiULdrZEx{d!~v71dXW?a|C=vhDe#uyuYWb4hW)6k0ypF8ER{BAwTAx;YE-wb!) zU;16Was^(;$OUp5dXvkJY0hDAS|8fn=gyP6&xSuan8cZ0vW)z(=x@DiJPDG%HphC= z- zpYdSh-(EFF=R=BYI@>x#_%jYWdLEjhM|USaBzVpNLG3+y_(R$BD_RmMas$MWs~oG^0ClV~+&9ED$w?cD|Yz+=nu2k$xd2U}uu6PP0V zCo+iBf#`{lqWxs#{-;()(J&9)cV& z*MIxg+j{>(@hd`~jcXbH;1z zth?n%0u(-3tD58KJI#tQPuPp_{T#@NnLsv#(utmIWON>=r)G}FN{F5lNBD@6U;Bn9 z>MqnKn+0+&Jbe!0Sg#XY1|IL>WT_VXUT;oA+Kv6ir{@DlMjpC8`1rDX*N^ifn3Oa- zP>v=r{|3wSjsMrp<+?rvZ1#&IQ%o*?Q%fUy9{OfIvd7w82leqs-`IVe19y5!^8?p+ z%lE(O);9mymq@O`lr{MH-Gap%a!lvK(+9_5!wv_d}s`<0wzR2F;-6sG^f)1 zfAhBE<$Hhn)^a}|--)B-fGBwkg|A}DfUPxB;ADB-k7x(+!4Wu(Z^V|l+qB6&n>1q*9dcD_jHBlT z*vR|+hTp{?KmT(AyX9Nn__#hpI{B~9Yw%ik6(uW2wP}cuI}>`1H0k-6=fBTqX`C$v zyXpzH+GeRX%|8xjW>_S<&=S+Pnr``~H$Jia)W5&2PruNUE@20Cie;tIvIjt59r&b0 zjV=c|+__#ALk??qI+k=+1B_gv^QeSsUl&j? z;p|tZ|KgJ`FMscq_bfcG=0&dhz{tYj7c4!e`8Av9+C(?nNM0J_+A`~hL2+5Y%lGV- zcj`{^cVGXwo}+cX;<;dQvT7u2?0R+qYFq{XM198e*L=}E%d_>lL3~zo=0om&Voy%^ z%h9>f^lD0ytPpr zg~{1jZAiO~^T97J@yeh09w`1xwSh24F`NSEhCjRLSXJn`%mH@4#+$x@;up2ebwIl&_3snm%EJ(YEoj{-clclgY{Q#$UL- z{G^^VuQM1Gu)n(U2vif97a;}2J2D&cm4Ei0<mZtf?9#n|`tkjxXn6KX&EI1=R@*$+Kyw>;|^ zN6TfsKa#H^pu#R*_}$O*#n-X_6q!ggu8IzGT!q@a0d4&GoYsxW{s08 zxcb6`!zl91*VjDiv#}r4pKJ1goci!UFDRc`2%OJ$tT_0@2dCnL<$j-qr9L&M`lL5D z(Jg%h*(2AFmk(S^Onhux>cB?H;>YJE=cKZwR~3}pmJcYob}zo~KupBx=(Nh~M4*nz zFreXsw&7fy?>G)Rb7uLh_>fd0az4fHf;q3Jlg~yVw=Ucr;=5V{Uqw2b-#L3OowL9U z9j+Ix`1q<;8v}WtQ-xXig+I)9(3;nXc|pGNB1^pvR0~0A$kl-?YrweTR}h1GVi

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/profile/backup_config.json b/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/profile/main_pages.json b/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..f915b3d --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,6 @@ +{ + "src": [ + "pages/Index", + "pages/KeyDeletion" + ] +} diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/dark/element/color.json b/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/ets/test/Ability.test.ets b/UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..0f8ce9a --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/ets/test/KeyDeletion.test.ets b/UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/ets/test/KeyDeletion.test.ets new file mode 100644 index 0000000..23df4b7 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/ets/test/KeyDeletion.test.ets @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, beforeAll } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function keyDeletionTest() { + describe('keyDeletionTest', () => { + /** + * 打开应用 + */ + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + await driver.delayMs(1000); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * 点击按钮,密钥删除(ArkTS) + */ + it('testKeyDeletion001', 0, async () => { + console.info('uitest: testKeyDeletion001 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('KeyDeletion').type('Button')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call KeyDeletion')); + await button2.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('KeyDeletion Result: Success')); + console.info('uitest: testKeyDeletion001 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,密钥删除(C/C++) + */ + it('testKeyDeletion002', 0, async () => { + console.info('uitest: testKeyDeletion002 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('Call C/C++')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('Call C/C++ Result: 0')); + console.info('uitest: testKeyDeletion002 end'); + await driver.pressBack(); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/ets/test/List.test.ets b/UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..7cb7a69 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import keyDeletionTest from './KeyDeletion.test'; + +export default function testsuite() { + keyDeletionTest(); +} diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/module.json5 b/UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..c3fd9dd --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/test/List.test.ets b/UniversalKeystoreKit/KeyDeletion/entry/src/test/List.test.ets new file mode 100644 index 0000000..f1186b1 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/entry/src/test/LocalUnit.test.ets b/UniversalKeystoreKit/KeyDeletion/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000..7fc57c7 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/hvigor/hvigor-config.json5 b/UniversalKeystoreKit/KeyDeletion/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..d584c19 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/UniversalKeystoreKit/KeyDeletion/hvigorfile.ts b/UniversalKeystoreKit/KeyDeletion/hvigorfile.ts new file mode 100644 index 0000000..2a5e543 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyDeletion/oh-package.json5 b/UniversalKeystoreKit/KeyDeletion/oh-package.json5 new file mode 100644 index 0000000..e41bae0 --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/UniversalKeystoreKit/KeyDeletion/ohosTest.md b/UniversalKeystoreKit/KeyDeletion/ohosTest.md new file mode 100644 index 0000000..f123e6d --- /dev/null +++ b/UniversalKeystoreKit/KeyDeletion/ohosTest.md @@ -0,0 +1,9 @@ +# 密钥删除测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| ------------------------- | ------------ | ---- | ---------------- | -------- | -------- | +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 点击按钮,密钥删除(ArkTS) | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | +| 点击按钮,密钥删除(C/C++) | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyDeletion/screenshots/KeyDeletionCpp_1.png b/UniversalKeystoreKit/KeyDeletion/screenshots/KeyDeletionCpp_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5cfeb2c5d199ea2d00d25bc9ba5e674e271b14 GIT binary patch literal 24692 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyDeletion/screenshots/KeyDeletionCpp_2.png b/UniversalKeystoreKit/KeyDeletion/screenshots/KeyDeletionCpp_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7d7524d80efa657d41a5d15bf82bbde2f5bfd1e6 GIT binary patch literal 25363 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 F{{&>8@GhG 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyDeletion/screenshots/KeyDeletion_2.png b/UniversalKeystoreKit/KeyDeletion/screenshots/KeyDeletion_2.png new file mode 100644 index 0000000000000000000000000000000000000000..56abc90490ba44a49476e3c8dbecbc6952d7ada7 GIT binary patch literal 24677 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/README.md b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/README.md new file mode 100644 index 0000000..3a2ee05 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/README.md @@ -0,0 +1,91 @@ +## 生成密钥(ArkTS) + +### 介绍 + +1. 本工程实现了对以下 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-key-generation-arkts.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### Call ArkTS + +##### 介绍 + +1. 本示例主要介绍生成密钥,以生成DH密钥为例生成随机密钥,指定待生成的密钥别名keyAlias。 + +##### 效果预览 + +| 主页 | | +| ---------------------------------------------------- | ---------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call ArkTS按钮调用huks.generateKeyItem,传入密钥别名和密钥属性集,生成密钥。 + +## 生成密钥(C/C++) + +### 介绍 + +1. 本工程实现了对以下示例代码片段的工程化,目标是实现指南中示例代码与sample工程文件同源。示例代码来源:https://gitee.com/openharmony/docs/blob/OpenHarmony-5.0.1-Release/zh-cn/application-dev/security/UniversalKeystoreKit/huks-key-generation-ndk.md + +#### Call C/C++ + +##### 介绍 + +1. 本示例主要介绍生成密钥,以生成ECC密钥为例,生成随机密钥。 + +##### 效果预览 + +| 主页 | | +| -------------------------------------------------- | -------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call C/C++按钮调用OH_Huks_GenerateKeyItem,传入密钥别名和密钥属性集,生成密钥。 + +## 工程目录 + +``` +entry/src/main/ +|---ets +|---|---entryability +|---|---|---EntryAbility.ets +|---|---pages +|---|---|---Index.ets // 首页 +|---cpp +|---resources // 静态资源 +|---ohosTest +|---|---ets +|---|---|---tests +|---|---|---|---GenerateKey.test.ets // 自动化测试用例 +``` + + +## 相关权限 + +无。 + +## 依赖 + +不涉及。 + +## 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.2 Release及以上。 + +3. DevEco Studio版本:DevEco Studio 5.0.2 Release及以上。 + +4. HarmonyOS SDK版本:HarmonyOS 5.0.2 Release及以上。。 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey > .git/info/sparse-checkout +git remote add origin https://gitee.com/harmonyos_samples/guide-snippets.git +git pull origin master +``` \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/build-profile.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/build-profile.json5 new file mode 100644 index 0000000..fb5a1ab --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/code-linter.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/code-linter.json5 new file mode 100644 index 0000000..2858646 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/code-linter.json5 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/.gitignore b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/build-profile.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/build-profile.json5 new file mode 100644 index 0000000..2d8b081 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": [ + "arm64-v8a", + "x86_64" + ] + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/hvigorfile.ts b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/hvigorfile.ts new file mode 100644 index 0000000..e4f43d5 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/oh-package.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/oh-package.json5 new file mode 100644 index 0000000..118bdd4 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/oh-package.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/CMakeLists.txt b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..0a6fa49 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(GenerateKey) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) +target_link_libraries(entry PUBLIC libace_napi.z.so libhuks_ndk.z.so) \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/napi_init.cpp b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000..a66fe4f --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start generate_key] +/* 以下以生成ECC密钥为例 */ +#include "huks/native_huks_api.h" +#include "huks/native_huks_param.h" +#include "napi/native_api.h" +#include + +OH_Huks_Result InitParamSet(struct OH_Huks_ParamSet **paramSet, const struct OH_Huks_Param *params, + uint32_t paramCount) +{ + OH_Huks_Result ret = OH_Huks_InitParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_AddParams(*paramSet, params, paramCount); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + ret = OH_Huks_BuildParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + return ret; +} + +struct OH_Huks_Param g_testGenerateKeyParam[] = {{.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_ECC}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_AGREE}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_ECC_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_NONE}}; + +static napi_value GenerateKey(napi_env env, napi_callback_info info) +{ + /* 1.确定密钥别名 */ + const char *alias = "test_generate"; + struct OH_Huks_Blob aliasBlob = {.size = (uint32_t)strlen(alias), .data = (uint8_t *)alias}; + struct OH_Huks_ParamSet *testGenerateKeyParamSet = nullptr; + struct OH_Huks_Result ohResult; + do { + /* 2.初始化密钥属性集 */ + ohResult = InitParamSet(&testGenerateKeyParamSet, g_testGenerateKeyParam, + sizeof(g_testGenerateKeyParam) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 3.生成密钥 */ + ohResult = OH_Huks_GenerateKeyItem(&aliasBlob, testGenerateKeyParamSet, nullptr); + } while (0); + OH_Huks_FreeParamSet(&testGenerateKeyParamSet); + napi_value ret; + napi_create_int32(env, ohResult.errorCode, &ret); + return ret; +} +// [End generate_key] +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + {"generateKey", nullptr, GenerateKey, nullptr, nullptr, nullptr, napi_default, nullptr}}; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void *)0), + .reserved = {0}, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); } diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/types/libentry/Index.d.ts b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/types/libentry/Index.d.ts new file mode 100644 index 0000000..589dd8a --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/types/libentry/Index.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const generateKey: () => number; \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/types/libentry/oh-package.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000..6abf3b7 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libentry.so", + "types": "./Index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/ets/entryability/EntryAbility.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..965554b --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +}; \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..b1e2129 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/ets/pages/Index.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..1da6992 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +// [Start generate_key_ar] + +import { huks } from '@kit.UniversalKeystoreKit'; +import testNapi from 'libentry.so'; + +/* 1.确定密钥别名 */ +let keyAlias = 'dh_key'; +/* 2.初始化密钥属性集 */ +let properties1: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_DH + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_AGREE + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_DH_KEY_SIZE_2048 + } +]; + +let huksOptions: huks.HuksOptions = { + properties: properties1, + inData: new Uint8Array([]) +} + +/* 3.生成密钥 */ +function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions) { + return new Promise((resolve, reject) => { + try { + huks.generateKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throw (error as Error); + } + }); +} + +async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions): Promise { + console.info(`enter promise generateKeyItem`); + try { + await generateKeyItem(keyAlias, huksOptions) + .then((data) => { + console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`); + }); + return 'Success'; + } catch (error) { + console.error(`promise: generateKeyItem input arg invalid, ` + JSON.stringify(error)); + return 'Failed'; + } +} + +async function testGenKey(): Promise { + let ret = await publicGenKeyFunc(keyAlias, huksOptions); + return ret; +} + + +// [End generate_key_ar] + + +@Entry +@Component +struct Index { + @State message: string = 'GenerateKey'; + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.call_cpp')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: number = testNapi.generateKey(); + this.message = 'C/C++ Call Result: ' + ret.toString(); + }) + Button($r('app.string.call_arkts')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + let ret = await testGenKey(); + this.message = 'ArkTS Call Result: ' + ret; + }) + } + .width('100%') + .height('100%') + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/module.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/module.json5 new file mode 100644 index 0000000..4144486 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/module.json5 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/element/color.json b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/element/string.json b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..0d407cd --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/element/string.json @@ -0,0 +1,24 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "GenerateKey" + }, + { + "name": "call_cpp", + "value": "Call C/C++" + }, + { + "name": "call_arkts", + "value": "Call ArkTS" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/media/background.png b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/media/foreground.png b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f 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

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/profile/backup_config.json b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/profile/main_pages.json b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..1898d94 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/Index" + ] +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/dark/element/color.json b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/ets/test/Ability.test.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..0f8ce9a --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/ets/test/GenerateKey.test.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/ets/test/GenerateKey.test.ets new file mode 100644 index 0000000..3eb32fe --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/ets/test/GenerateKey.test.ets @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, beforeAll } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function generateKeyTest() { + describe('generateKeyTest', () => { + /** + * 打开应用 + */ + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + await driver.delayMs(1000); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * 点击按钮,生成密钥(C/C++) + */ + it('testGenerateKey001', 0, async () => { + console.info('uitest: testGenerateKey001 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('Call C/C++')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('C/C++ Call Result: 0')); + console.info('uitest: testGenerateKey001 end'); + }) + + /** + * 点击按钮,生成密钥(ArkTS) + */ + it('testGenerateKey002', 0, async () => { + console.info('uitest: testGenerateKey002 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('Call ArkTS')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('ArkTS Call Result: Success')); + console.info('uitest: testGenerateKey002 end'); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/ets/test/List.test.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..821bf71 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import generateKeyTest from './GenerateKey.test'; + +export default function testsuite() { + generateKeyTest(); +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/module.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..c3fd9dd --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/test/List.test.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/test/List.test.ets new file mode 100644 index 0000000..f1186b1 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/test/LocalUnit.test.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000..7fc57c7 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/hvigor/hvigor-config.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..d584c19 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/hvigorfile.ts b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/hvigorfile.ts new file mode 100644 index 0000000..2a5e543 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/oh-package.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/oh-package.json5 new file mode 100644 index 0000000..e41bae0 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/ohosTest.md b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/ohosTest.md new file mode 100644 index 0000000..f123e6d --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/ohosTest.md @@ -0,0 +1,9 @@ +# 密钥删除测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| ------------------------- | ------------ | ---- | ---------------- | -------- | -------- | +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 点击按钮,密钥删除(ArkTS) | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | +| 点击按钮,密钥删除(C/C++) | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/screenshots/ArkTS_1.png b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/screenshots/ArkTS_1.png new file mode 100644 index 0000000000000000000000000000000000000000..504a5c10f6a9402a1b25348c5021d3a830c4dcc9 GIT binary patch literal 24342 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 U+_DP(=O;P&e~@H_2tWQm03UZjtpET3 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/screenshots/ArkTS_2.png b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/screenshots/ArkTS_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d37a9524bc0b474eb583a0dd085e1d7080370bae GIT binary patch literal 25517 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 C&A=c4 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/screenshots/Cpp_1.png b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/screenshots/Cpp_1.png new file mode 100644 index 0000000000000000000000000000000000000000..504a5c10f6a9402a1b25348c5021d3a830c4dcc9 GIT binary patch literal 24342 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 U+_DP(=O;P&e~@H_2tWQm03UZjtpET3 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/screenshots/Cpp_2.png b/UniversalKeystoreKit/KeyGenerationImport/KeyGeneration/DevelopmentGuidelines/GenerateKey/screenshots/Cpp_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3fbc46b8d142e5de7e56f044eeb845e2d70ce08c GIT binary patch literal 24947 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/README.md b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/README.md new file mode 100644 index 0000000..7f09878 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/README.md @@ -0,0 +1,92 @@ +## 加密导入密钥(ArkTS) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://gitee.com/openharmony/docs/blob/OpenHarmony-5.0.1-Release/zh-cn/application-dev/security/UniversalKeystoreKit/huks-import-wrapped-key-arkts.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### ImportEncryptedKey + +##### 介绍 + +1. 本示例主要介绍为保证数据安全性加密导入ECDH密钥对。 + +##### 效果预览 + +| 主页 | 删除 | +| ---------------------------------------------------------- | ---------------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call ArkTS按钮调用接口ImportWrappedKey,加密导入密钥对为。 + +## 加密导入密钥(C/C++) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://gitee.com/openharmony/docs/blob/OpenHarmony-5.0.1-Release/zh-cn/application-dev/security/UniversalKeystoreKit/huks-import-wrapped-key-ndk.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### Call C/C++ + +##### 介绍 + +1. 本示例主要介绍为保证数据安全性加密导入ECDH密钥对。 + +##### 效果预览 + +| 主页 | 跳转页 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| | | + +使用说明 + +1. 点击Call C/C++按钮调用接口importWrappedKey,加密导入密钥对为。 + +## 工程目录 + +``` +entry/src/main/ +|---ets +|---|---entryability +|---|---|---EntryAbility.ets +|---|---pages +|---|---|---Index.ets // 首页 +|---|---|---ImportEncryptedKey.ets +|---cpp +|---resources // 静态资源 +|---ohosTest +|---|---ets +|---|---|---tests +|---|---|---|---ImportEncryptedKey.test.ets // 自动化测试用例 +``` + + +## 相关权限 + +无。 + +## 依赖 + +不涉及。 + +## 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.3 Release及以上。 + +3. DevEco Studio版本:DevEco Studio 5.0.3 Release及以上。 + +4. HarmonyOS SDK版本:HarmonyOS 5.0.3 Release及以上。 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey > .git/info/sparse-checkout +git remote add origin https://gitee.com/harmonyos_samples/guide-snippets.git +git pull origin master +``` \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/build-profile.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/build-profile.json5 new file mode 100644 index 0000000..daa1501 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.3(15)", + "targetSdkVersion": "5.0.3(15)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/code-linter.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/code-linter.json5 new file mode 100644 index 0000000..2858646 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/code-linter.json5 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/.gitignore b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/build-profile.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/build-profile.json5 new file mode 100644 index 0000000..7c77d21 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": [ + "arm64-v8a", + "x86_64" + ] + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default", + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/hvigorfile.ts b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/hvigorfile.ts new file mode 100644 index 0000000..e4f43d5 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/oh-package.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/oh-package.json5 new file mode 100644 index 0000000..118bdd4 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/oh-package.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/CMakeLists.txt b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..8bfc963 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(ImportEncryptedKey) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) +target_link_libraries(entry PUBLIC libace_napi.z.so libhuks_ndk.z.so) \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/napi_init.cpp b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000..d9a1f60 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,611 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// [Start encrypt_import_key] + +#include "huks/native_huks_api.h" +#include "huks/native_huks_param.h" +#include "napi/native_api.h" +#include + +#define MAX_MALLOC_SIZE 0x800000 + +OH_Huks_Result InitParamSet(struct OH_Huks_ParamSet **paramSet, const struct OH_Huks_Param *params, + uint32_t paramCount) +{ + OH_Huks_Result ret = OH_Huks_InitParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_AddParams(*paramSet, params, paramCount); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + ret = OH_Huks_BuildParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + return ret; +} +struct HksImportWrappedKeyTestParams { + // server key, for real. + struct OH_Huks_Blob *wrappingKeyAlias; + struct OH_Huks_ParamSet *genWrappingKeyParamSet; + uint32_t publicKeySize; + struct OH_Huks_Blob *callerKeyAlias; + struct OH_Huks_ParamSet *genCallerKeyParamSet; + struct OH_Huks_Blob *callerKekAlias; + struct OH_Huks_Blob *callerKek; + struct OH_Huks_ParamSet *importCallerKekParamSet; + struct OH_Huks_Blob *callerAgreeKeyAlias; + struct OH_Huks_ParamSet *agreeParamSet; + struct OH_Huks_ParamSet *importWrappedKeyParamSet; + struct OH_Huks_Blob *importedKeyAlias; + struct OH_Huks_Blob *importedPlainKey; + uint32_t keyMaterialLen; +}; +static const uint32_t IV_SIZE = 16; +static uint8_t IV[IV_SIZE] = "bababababababab"; // 此处仅为测试数据,实际使用时该值每次应该不同。 +static const uint32_t WRAPPED_KEY_IV_SIZE = 16; +static uint8_t WRAPPED_KEY_IV[IV_SIZE] = "bababababababab"; // 此处仅为测试数据,实际使用时该值每次应该不同。 +static const uint32_t AAD_SIZE = 16; +static uint8_t AAD[AAD_SIZE] = "abababababababa"; // 此处仅为测试数据,实际使用时该值每次应该不同。 +static const uint32_t NONCE_SIZE = 12; +static uint8_t NONCE[NONCE_SIZE] = "hahahahahah"; // 此处仅为测试数据,实际使用时该值每次应该不同。 +static const uint32_t AEAD_TAG_SIZE = 16; +static const uint32_t X25519_256_SIZE = 256; +static struct OH_Huks_Blob g_wrappingKeyAliasAes256 = {.size = (uint32_t)strlen("test_wrappingKey_x25519_aes256"), + .data = (uint8_t *)"test_wrappingKey_x25519_aes256"}; +static struct OH_Huks_Blob g_callerKeyAliasAes256 = {.size = (uint32_t)strlen("test_caller_key_x25519_aes256"), + .data = (uint8_t *)"test_caller_key_x25519_aes256"}; +static struct OH_Huks_Blob g_callerKekAliasAes256 = {.size = (uint32_t)strlen("test_caller_kek_x25519_aes256"), + .data = (uint8_t *)"test_caller_kek_x25519_aes256"}; +static struct OH_Huks_Blob g_callerAes256Kek = {.size = (uint32_t)strlen("This is kek to encrypt plain key"), + .data = (uint8_t *)"This is kek to encrypt plain key"}; +static struct OH_Huks_Blob g_callerAgreeKeyAliasAes256 = {.size = + (uint32_t)strlen("test_caller_agree_key_x25519_aes256"), + .data = (uint8_t *)"test_caller_agree_key_x25519_aes256"}; +static struct OH_Huks_Blob g_importedKeyAliasAes256 = {.size = (uint32_t)strlen("test_import_key_x25519_aes256"), + .data = (uint8_t *)"test_import_key_x25519_aes256"}; +static struct OH_Huks_Blob g_importedAes256PlainKey = {.size = (uint32_t)strlen("This is plain key to be imported"), + .data = (uint8_t *)"This is plain key to be imported"}; +static struct OH_Huks_Param g_importWrappedAes256Params[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_AES}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_ENCRYPT | OH_HUKS_KEY_PURPOSE_DECRYPT}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_AES_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_PADDING, .uint32Param = OH_HUKS_PADDING_NONE}, + {.tag = OH_HUKS_TAG_BLOCK_MODE, .uint32Param = OH_HUKS_MODE_GCM}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_NONE}, + {.tag = OH_HUKS_TAG_UNWRAP_ALGORITHM_SUITE, .uint32Param = OH_HUKS_UNWRAP_SUITE_X25519_AES_256_GCM_NOPADDING}, + {.tag = OH_HUKS_TAG_ASSOCIATED_DATA, + .blob = {.size = AAD_SIZE, .data = (uint8_t *)AAD}}, // 此处仅为测试数据,实际使用时该值应与调用者信息相关。 + {.tag = OH_HUKS_TAG_NONCE, + .blob = {.size = NONCE_SIZE, .data = (uint8_t *)NONCE}}}; // 此处仅为测试数据,实际使用时该值每次应该不同。 +static const uint32_t g_x25519PubKeySize = 32; +static struct OH_Huks_Param g_genWrappingKeyParams[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_X25519}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_UNWRAP}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_CURVE25519_KEY_SIZE_256}}; +static struct OH_Huks_Param g_genCallerX25519Params[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_X25519}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_AGREE}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_CURVE25519_KEY_SIZE_256}}; +static struct OH_Huks_Param g_importParamsCallerKek[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_AES}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_ENCRYPT}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_AES_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_PADDING, .uint32Param = OH_HUKS_PADDING_NONE}, + {.tag = OH_HUKS_TAG_BLOCK_MODE, .uint32Param = OH_HUKS_MODE_GCM}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_NONE}, + {.tag = OH_HUKS_TAG_IV, + .blob = {.size = WRAPPED_KEY_IV_SIZE, + .data = (uint8_t *)WRAPPED_KEY_IV}}}; // 此处仅为测试数据,实际使用时该值每次应该不同。 +static struct OH_Huks_Param g_callerAgreeParams[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_X25519}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_AGREE}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_CURVE25519_KEY_SIZE_256}}; +static struct OH_Huks_Param g_aesKekEncryptParams[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_AES}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_ENCRYPT}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_AES_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_PADDING, .uint32Param = OH_HUKS_PADDING_NONE}, + {.tag = OH_HUKS_TAG_BLOCK_MODE, .uint32Param = OH_HUKS_MODE_GCM}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_NONE}, + {.tag = OH_HUKS_TAG_ASSOCIATED_DATA, + .blob = {.size = AAD_SIZE, .data = (uint8_t *)AAD}}, // 此处仅为测试数据,实际使用时该值应与调用者信息相关。 + {.tag = OH_HUKS_TAG_NONCE, + .blob = {.size = NONCE_SIZE, .data = (uint8_t *)NONCE}}}; // 此处仅为测试数据,实际使用时该值每次应该不同。 +static struct OH_Huks_Param g_importAgreeKeyParams[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_AES}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_ENCRYPT}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_AES_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_PADDING, .uint32Param = OH_HUKS_PADDING_NONE}, + {.tag = OH_HUKS_TAG_BLOCK_MODE, .uint32Param = OH_HUKS_MODE_GCM}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_NONE}, + {.tag = OH_HUKS_TAG_IV, + .blob = {.size = IV_SIZE, .data = (uint8_t *)IV}}}; // 此处仅为测试数据,实际使用时该值每次应该不同。 +OH_Huks_Result HuksAgreeKey(const struct OH_Huks_ParamSet *paramSet, const struct OH_Huks_Blob *keyAlias, + const struct OH_Huks_Blob *peerPublicKey, struct OH_Huks_Blob *agreedKey) +{ + uint8_t temp[10] = {0}; + struct OH_Huks_Blob inData = {sizeof(temp), temp}; + uint8_t handleU[sizeof(uint64_t)] = {0}; + struct OH_Huks_Blob handle = {sizeof(uint64_t), handleU}; + OH_Huks_Result ret = OH_Huks_InitSession(keyAlias, paramSet, &handle, nullptr); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + uint8_t outDataU[1024] = {0}; + struct OH_Huks_Blob outDataUpdate = {1024, outDataU}; + ret = OH_Huks_UpdateSession(&handle, paramSet, peerPublicKey, &outDataUpdate); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_FinishSession(&handle, paramSet, &inData, agreedKey); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + return ret; +} +OH_Huks_Result MallocAndCheckBlobData(struct OH_Huks_Blob *blob, const uint32_t blobSize) +{ + struct OH_Huks_Result ret; + ret.errorCode = OH_HUKS_SUCCESS; + if (blobSize == 0 || blobSize > MAX_MALLOC_SIZE) { + ret.errorCode = OH_HUKS_ERR_CODE_INTERNAL_ERROR; + } + blob->data = (uint8_t *)malloc(blobSize); + if (blob->data == NULL) { + ret.errorCode = OH_HUKS_ERR_CODE_INTERNAL_ERROR; + } + return ret; +} +static const uint32_t TIMES = 4; +static const uint32_t MAX_UPDATE_SIZE = 64; +static const uint32_t MAX_OUTDATA_SIZE = MAX_UPDATE_SIZE * TIMES; +#define HUKS_FREE_BLOB(blob) \ + do { \ + if ((blob).data != nullptr) { \ + free((blob).data); \ + (blob).data = nullptr; \ + } \ + (blob).size = 0; \ + } while (0) +#define OH_HUKS_KEY_BYTES(keySize) (((keySize) + 7) / 8) +static OH_Huks_Result HksEncryptLoopUpdate(const struct OH_Huks_Blob *handle, const struct OH_Huks_ParamSet *paramSet, + const struct OH_Huks_Blob *inData, struct OH_Huks_Blob *outData) +{ + struct OH_Huks_Result ret; + ret.errorCode = OH_HUKS_SUCCESS; + struct OH_Huks_Blob inDataSeg = *inData; + uint8_t *lastPtr = inData->data + inData->size - 1; + struct OH_Huks_Blob outDataSeg = {MAX_OUTDATA_SIZE, NULL}; + uint8_t *cur = outData->data; + outData->size = 0; + inDataSeg.size = MAX_UPDATE_SIZE; + bool isFinished = false; + while (inDataSeg.data <= lastPtr) { + if (inDataSeg.data + MAX_UPDATE_SIZE <= lastPtr) { + outDataSeg.size = MAX_OUTDATA_SIZE; + } else { + isFinished = true; + inDataSeg.size = lastPtr - inDataSeg.data + 1; + break; + } + if (MallocAndCheckBlobData(&outDataSeg, outDataSeg.size).errorCode != (int32_t)OH_HUKS_SUCCESS) { + ret.errorCode = OH_HUKS_ERR_CODE_INTERNAL_ERROR; + return ret; + } + ret = OH_Huks_UpdateSession(handle, paramSet, &inDataSeg, &outDataSeg); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + free(outDataSeg.data); + return ret; + } + std::copy(outDataSeg.data, outDataSeg.data + outDataSeg.size, cur); + cur += outDataSeg.size; + outData->size += outDataSeg.size; + free(outDataSeg.data); + if ((isFinished == false) && (inDataSeg.data + MAX_UPDATE_SIZE > lastPtr)) { + ret.errorCode = OH_HUKS_ERR_CODE_INTERNAL_ERROR; + return ret; + } + inDataSeg.data += MAX_UPDATE_SIZE; + } + struct OH_Huks_Blob outDataFinish = {inDataSeg.size * TIMES, NULL}; + if (MallocAndCheckBlobData(&outDataFinish, outDataFinish.size).errorCode != (int32_t)OH_HUKS_SUCCESS) { + ret.errorCode = OH_HUKS_ERR_CODE_INTERNAL_ERROR; + return ret; + } + ret = OH_Huks_FinishSession(handle, paramSet, &inDataSeg, &outDataFinish); + if (ret.errorCode != OH_HUKS_SUCCESS) { + free(outDataFinish.data); + return ret; + } + std::copy(outDataFinish.data, outDataFinish.data + outDataFinish.size, cur); + outData->size += outDataFinish.size; + free(outDataFinish.data); + return ret; +} +OH_Huks_Result HuksEncrypt(const struct OH_Huks_Blob *key, const struct OH_Huks_ParamSet *paramSet, + const struct OH_Huks_Blob *plainText, struct OH_Huks_Blob *cipherText) +{ + uint8_t handle[sizeof(uint64_t)] = {0}; + struct OH_Huks_Blob handleBlob = {sizeof(uint64_t), handle}; + OH_Huks_Result ret = OH_Huks_InitSession(key, paramSet, &handleBlob, nullptr); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = HksEncryptLoopUpdate(&handleBlob, paramSet, plainText, cipherText); + return ret; +} +static OH_Huks_Result BuildWrappedKeyData(struct OH_Huks_Blob **blobArray, uint32_t size, + struct OH_Huks_Blob *outData) +{ + uint32_t totalLength = size * sizeof(uint32_t); + struct OH_Huks_Result ret; + ret.errorCode = OH_HUKS_SUCCESS; + /* 计算大小 */ + for (uint32_t i = 0; i < size; ++i) { + totalLength += blobArray[i]->size; + } + struct OH_Huks_Blob outBlob = {0, nullptr}; + outBlob.size = totalLength; + ret = MallocAndCheckBlobData(&outBlob, outBlob.size); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + uint32_t offset = 0; + /* 拷贝数据 */ + for (uint32_t i = 0; i < size; ++i) { + if (totalLength - offset >= sizeof(blobArray[i]->size)) { + std::copy(reinterpret_cast(&blobArray[i]->size), + reinterpret_cast(&blobArray[i]->size) + sizeof(blobArray[i]->size), + outBlob.data + offset); + } else { + ret.errorCode = OH_HUKS_ERR_CODE_INTERNAL_ERROR; + return ret; + } + offset += sizeof(blobArray[i]->size); + if (totalLength - offset >= blobArray[i]->size) { + std::copy(blobArray[i]->data, blobArray[i]->data + blobArray[i]->size, outBlob.data + offset); + } else { + ret.errorCode = OH_HUKS_ERR_CODE_INTERNAL_ERROR; + return ret; + } + offset += blobArray[i]->size; + } + outData->size = outBlob.size; + outData->data = outBlob.data; + return ret; +} +static OH_Huks_Result CheckParamsValid(const struct HksImportWrappedKeyTestParams *params) +{ + struct OH_Huks_Result ret; + ret.errorCode = OH_HUKS_SUCCESS; + if (params == nullptr) { + ret.errorCode = OH_HUKS_ERR_CODE_ILLEGAL_ARGUMENT; + return ret; + } + if (params->wrappingKeyAlias == nullptr || params->genWrappingKeyParamSet == nullptr || + params->callerKeyAlias == nullptr || params->genCallerKeyParamSet == nullptr || + params->callerKekAlias == nullptr || params->callerKek == nullptr || + params->importCallerKekParamSet == nullptr || params->callerAgreeKeyAlias == nullptr || + params->agreeParamSet == nullptr || params->importWrappedKeyParamSet == nullptr || + params->importedKeyAlias == nullptr || params->importedPlainKey == nullptr) { + ret.errorCode = OH_HUKS_ERR_CODE_ILLEGAL_ARGUMENT; + return ret; + } + return ret; +} +static OH_Huks_Result GenerateAndExportHuksPublicKey(const struct HksImportWrappedKeyTestParams *params, + struct OH_Huks_Blob *huksPublicKey) +{ + OH_Huks_Result ret = OH_Huks_GenerateKeyItem(params->wrappingKeyAlias, params->genWrappingKeyParamSet, nullptr); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + huksPublicKey->size = params->publicKeySize; + ret = MallocAndCheckBlobData(huksPublicKey, huksPublicKey->size); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_ExportPublicKeyItem(params->wrappingKeyAlias, nullptr, huksPublicKey); + return ret; +} +static OH_Huks_Result GenerateAndExportCallerPublicKey(const struct HksImportWrappedKeyTestParams *params, + struct OH_Huks_Blob *callerSelfPublicKey) +{ + OH_Huks_Result ret = OH_Huks_GenerateKeyItem(params->callerKeyAlias, params->genCallerKeyParamSet, nullptr); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + callerSelfPublicKey->size = params->publicKeySize; + ret = MallocAndCheckBlobData(callerSelfPublicKey, callerSelfPublicKey->size); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_ExportPublicKeyItem(params->callerKeyAlias, params->genWrappingKeyParamSet, callerSelfPublicKey); + return ret; +} +static OH_Huks_Result ImportKekAndAgreeSharedSecret(const struct HksImportWrappedKeyTestParams *params, + const struct OH_Huks_Blob *huksPublicKey, + struct OH_Huks_Blob *outSharedKey) +{ + OH_Huks_Result ret = + OH_Huks_ImportKeyItem(params->callerKekAlias, params->importCallerKekParamSet, params->callerKek); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + ret = MallocAndCheckBlobData(outSharedKey, outSharedKey->size); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + ret = HuksAgreeKey(params->agreeParamSet, params->callerKeyAlias, huksPublicKey, outSharedKey); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + struct OH_Huks_ParamSet *importAgreeKeyParams = nullptr; + ret = InitParamSet(&importAgreeKeyParams, g_importAgreeKeyParams, + sizeof(g_importAgreeKeyParams) / sizeof(OH_Huks_Param)); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_ImportKeyItem(params->callerAgreeKeyAlias, importAgreeKeyParams, outSharedKey); + OH_Huks_FreeParamSet(&importAgreeKeyParams); + return ret; +} +static OH_Huks_Result EncryptImportedPlainKeyAndKek(const struct HksImportWrappedKeyTestParams *params, + struct OH_Huks_Blob *plainCipherText, + struct OH_Huks_Blob *kekCipherText) +{ + struct OH_Huks_ParamSet *encryptParamSet = nullptr; + OH_Huks_Result ret = + InitParamSet(&encryptParamSet, g_aesKekEncryptParams, sizeof(g_aesKekEncryptParams) / sizeof(OH_Huks_Param)); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + ret = HuksEncrypt(params->callerKekAlias, encryptParamSet, params->importedPlainKey, plainCipherText); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + ret = HuksEncrypt(params->callerAgreeKeyAlias, encryptParamSet, params->callerKek, kekCipherText); + OH_Huks_FreeParamSet(&encryptParamSet); + return ret; +} +static OH_Huks_Result ImportWrappedKey(const struct HksImportWrappedKeyTestParams *params, + struct OH_Huks_Blob *plainCipher, struct OH_Huks_Blob *kekCipherText, + struct OH_Huks_Blob *peerPublicKey, struct OH_Huks_Blob *wrappedKeyData) +{ + struct OH_Huks_Blob commonAad = {.size = AAD_SIZE, .data = reinterpret_cast(AAD)}; + struct OH_Huks_Blob commonNonce = {.size = NONCE_SIZE, .data = reinterpret_cast(NONCE)}; + struct OH_Huks_Blob keyMaterialLen = {.size = sizeof(uint32_t), .data = (uint8_t *)¶ms->keyMaterialLen}; + /* 从密文中拷贝AEAD的tag并缩小其大小 */ + const uint32_t tagSize = AEAD_TAG_SIZE; + uint8_t kekTagBuf[tagSize] = {0}; + struct OH_Huks_Blob kekTag = {.size = tagSize, .data = kekTagBuf}; + std::copy(plainCipher->data + (plainCipher->size - tagSize), + plainCipher->data + (plainCipher->size - tagSize) + tagSize, kekTag.data); + plainCipher->size -= tagSize; + /* 从密钥加密密钥的密文中拷贝AEAD的tag并缩小其大小 */ + uint8_t agreeKeyTagBuf[tagSize] = {0}; + struct OH_Huks_Blob agreeKeyTag = {.size = tagSize, .data = agreeKeyTagBuf}; + std::copy(kekCipherText->data + (kekCipherText->size - tagSize), + kekCipherText->data + (kekCipherText->size - tagSize) + tagSize, agreeKeyTagBuf); + kekCipherText->size -= tagSize; + struct OH_Huks_Blob *blobArray[] = {peerPublicKey, &commonAad, &commonNonce, &agreeKeyTag, kekCipherText, + &commonAad, &commonNonce, &kekTag, &keyMaterialLen, plainCipher}; + OH_Huks_Result ret = BuildWrappedKeyData(blobArray, OH_HUKS_IMPORT_WRAPPED_KEY_TOTAL_BLOBS, wrappedKeyData); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + struct OH_Huks_Param *purpose = nullptr; + ret = OH_Huks_GetParam(params->importWrappedKeyParamSet, OH_HUKS_TAG_PURPOSE, &purpose); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_ImportWrappedKeyItem(params->importedKeyAlias, params->wrappingKeyAlias, + params->importWrappedKeyParamSet, wrappedKeyData); + return ret; +} +OH_Huks_Result HksImportWrappedKeyTestCommonCase(const struct HksImportWrappedKeyTestParams *params) +{ + OH_Huks_Result ret = CheckParamsValid(params); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return ret; + } + struct OH_Huks_Blob huksPublicKey = {0, nullptr}; + struct OH_Huks_Blob callerSelfPublicKey = {0, nullptr}; + struct OH_Huks_Blob outSharedKey = {.size = OH_HUKS_KEY_BYTES(OH_HUKS_AES_KEY_SIZE_256), .data = nullptr}; + struct OH_Huks_Blob wrappedKeyData = {0, nullptr}; + uint8_t plainKeyCipherBuffer[OH_HUKS_MAX_KEY_SIZE] = {0}; + struct OH_Huks_Blob plainCipherText = {OH_HUKS_MAX_KEY_SIZE, plainKeyCipherBuffer}; + uint8_t kekCipherTextBuffer[OH_HUKS_MAX_KEY_SIZE] = {0}; + struct OH_Huks_Blob kekCipherText = {OH_HUKS_MAX_KEY_SIZE, kekCipherTextBuffer}; + /* 模拟加密导入密钥场景,设备A为远端设备(导入设备),设备B为本端设备(被导入设备) */ + do { + /** + * 1.设备A将待导入密钥转换成HUKS密钥材料格式To_Import_Key(仅针对非对称密钥,若待导入密钥是对称密钥则可省略此步骤), + * 本示例使用g_importedAes256PlainKey(对称密钥)作为模拟 + */ + /* 2.设备B生成一个加密导入用途的、用于协商的非对称密钥对Wrapping_Key(公钥Wrapping_Pk,私钥Wrapping_Sk), + * 其密钥用途设置为unwrap,导出Wrapping_Key公钥Wrapping_Pk存放在变量huksPublicKey中 + */ + ret = GenerateAndExportHuksPublicKey(params, &huksPublicKey); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + break; + } + /* 3.设备A使用和设备B同样的算法,生成一个加密导入用途的、用于协商的非对称密钥对Caller_Key(公钥Caller_Pk,私钥Caller_Sk), + * 导出Caller_Key公钥Caller_Pk存放在变量callerSelfPublicKey中 + */ + ret = GenerateAndExportCallerPublicKey(params, &callerSelfPublicKey); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + break; + } + /** + * 4. 设备A生成一个对称密钥Caller_Kek,该密钥后续将用于加密To_Import_Key + * 5. 设备A基于Caller_Key的私钥Caller_Sk和设备B Wrapping_Key的公钥Wrapping_Pk,协商出Shared_Key + */ + ret = ImportKekAndAgreeSharedSecret(params, &huksPublicKey, &outSharedKey); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + break; + } + /** + * 6. 设备A使用Caller_Kek加密To_Import_Key,生成To_Import_Key_Enc + * 7. 设备A使用Shared_Key加密Caller_Kek,生成Caller_Kek_Enc + */ + ret = EncryptImportedPlainKeyAndKek(params, &plainCipherText, &kekCipherText); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + break; + } + /* 8. 设备A封装Caller_Pk、To_Import_Key_Enc、Caller_Kek_Enc等加密导入的材料并发送给设备B。 + * 本示例作为变量存放在callerSelfPublicKey,plainCipherText,kekCipherText + * 9. 设备B导入封装的加密密钥材料 + */ + ret = ImportWrappedKey(params, &plainCipherText, &kekCipherText, &callerSelfPublicKey, &wrappedKeyData); + } while (0); + /* 10. 设备A、B删除用于加密导入的密钥 */ + HUKS_FREE_BLOB(huksPublicKey); + HUKS_FREE_BLOB(callerSelfPublicKey); + HUKS_FREE_BLOB(outSharedKey); + HUKS_FREE_BLOB(wrappedKeyData); + return ret; +} +void HksClearKeysForWrappedKeyTest(const struct HksImportWrappedKeyTestParams *params) +{ + OH_Huks_Result ret = CheckParamsValid(params); + if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) { + return; + } + (void)OH_Huks_DeleteKeyItem(params->wrappingKeyAlias, nullptr); + (void)OH_Huks_DeleteKeyItem(params->callerKeyAlias, nullptr); + (void)OH_Huks_DeleteKeyItem(params->callerKekAlias, nullptr); + (void)OH_Huks_DeleteKeyItem(params->callerAgreeKeyAlias, nullptr); + (void)OH_Huks_DeleteKeyItem(params->importedKeyAlias, nullptr); +} +static OH_Huks_Result InitCommonTestParamsAndDoImport(struct HksImportWrappedKeyTestParams *importWrappedKeyTestParams, + const struct OH_Huks_Param *importedKeyParamSetArray, + uint32_t arraySize) +{ + struct OH_Huks_ParamSet *genX25519KeyParamSet = nullptr; + struct OH_Huks_ParamSet *genCallerKeyParamSet = nullptr; + struct OH_Huks_ParamSet *callerImportParamsKek = nullptr; + struct OH_Huks_ParamSet *agreeParamSet = nullptr; + struct OH_Huks_ParamSet *importPlainKeyParams = nullptr; + OH_Huks_Result ret; + do { + ret = InitParamSet(&genX25519KeyParamSet, g_genWrappingKeyParams, + sizeof(g_genWrappingKeyParams) / sizeof(OH_Huks_Param)); + if (ret.errorCode != OH_HUKS_SUCCESS) { + break; + } + importWrappedKeyTestParams->genWrappingKeyParamSet = genX25519KeyParamSet; + importWrappedKeyTestParams->publicKeySize = g_x25519PubKeySize; + ret = InitParamSet(&genCallerKeyParamSet, g_genCallerX25519Params, + sizeof(g_genCallerX25519Params) / sizeof(OH_Huks_Param)); + if (ret.errorCode != OH_HUKS_SUCCESS) { + break; + } + importWrappedKeyTestParams->genCallerKeyParamSet = genCallerKeyParamSet; + ret = InitParamSet(&callerImportParamsKek, g_importParamsCallerKek, + sizeof(g_importParamsCallerKek) / sizeof(OH_Huks_Param)); + if (ret.errorCode != OH_HUKS_SUCCESS) { + break; + } + importWrappedKeyTestParams->importCallerKekParamSet = callerImportParamsKek; + ret = InitParamSet(&agreeParamSet, g_callerAgreeParams, sizeof(g_callerAgreeParams) / sizeof(OH_Huks_Param)); + if (ret.errorCode != OH_HUKS_SUCCESS) { + break; + } + importWrappedKeyTestParams->agreeParamSet = agreeParamSet; + ret = InitParamSet(&importPlainKeyParams, importedKeyParamSetArray, arraySize); + if (ret.errorCode != OH_HUKS_SUCCESS) { + break; + } + importWrappedKeyTestParams->importWrappedKeyParamSet = importPlainKeyParams; + ret = HksImportWrappedKeyTestCommonCase(importWrappedKeyTestParams); + } while (0); + OH_Huks_FreeParamSet(&genX25519KeyParamSet); + OH_Huks_FreeParamSet(&genCallerKeyParamSet); + OH_Huks_FreeParamSet(&callerImportParamsKek); + OH_Huks_FreeParamSet(&agreeParamSet); + OH_Huks_FreeParamSet(&importPlainKeyParams); + return ret; +} +static napi_value NAPI_Global_importWrappedKey(napi_env env, napi_callback_info info) +{ + struct HksImportWrappedKeyTestParams importWrappedKeyTestParams001 = {0}; + importWrappedKeyTestParams001.wrappingKeyAlias = &g_wrappingKeyAliasAes256; + importWrappedKeyTestParams001.keyMaterialLen = g_importedAes256PlainKey.size; + importWrappedKeyTestParams001.callerKeyAlias = &g_callerKeyAliasAes256; + importWrappedKeyTestParams001.callerKekAlias = &g_callerKekAliasAes256; + importWrappedKeyTestParams001.callerKek = &g_callerAes256Kek; + importWrappedKeyTestParams001.callerAgreeKeyAlias = &g_callerAgreeKeyAliasAes256; + importWrappedKeyTestParams001.importedKeyAlias = &g_importedKeyAliasAes256; + importWrappedKeyTestParams001.importedPlainKey = &g_importedAes256PlainKey; + OH_Huks_Result ohResult = + InitCommonTestParamsAndDoImport(&importWrappedKeyTestParams001, g_importWrappedAes256Params, + sizeof(g_importWrappedAes256Params) / sizeof(struct OH_Huks_Param)); + HksClearKeysForWrappedKeyTest(&importWrappedKeyTestParams001); + napi_value ret; + napi_create_int32(env, ohResult.errorCode, &ret); + return ret; +} + + +// [End encrypt_import_key] + + +// [Start encryption_import_key_commissioning_and_verification] +static napi_value IsKeyExist(napi_env env, napi_callback_info info) +{ + /* 1.指定密钥别名 */ + struct OH_Huks_Blob keyAlias = { + (uint32_t)strlen("test_key"), + (uint8_t *)"test_key" + }; + + /* 2.调用OH_Huks_IsKeyItemExist判断密钥是否存在 */ + struct OH_Huks_Result ohResult = OH_Huks_IsKeyItemExist(&keyAlias, NULL); + napi_value ret; + napi_create_int32(env, ohResult.errorCode, &ret); + return ret; +} + +// [End encryption_import_key_commissioning_and_verification] + +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + {"isKeyExist", nullptr, IsKeyExist, nullptr, nullptr, nullptr, napi_default, nullptr }, + {"importWrappedKey", nullptr, NAPI_Global_importWrappedKey, nullptr, nullptr, nullptr, napi_default, nullptr }}; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void *)0), + .reserved = {0}, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); } diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/types/libentry/index.d.ts b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 0000000..e8fa214 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const importWrappedKey: () => number; +export const isKeyExist: () => number; \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/types/libentry/oh-package.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000..2826cc7 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libentry.so", + "types": "./index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/entryability/EntryAbility.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..edc2839 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..b1e2129 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/pages/ImportEncryptedKey.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/pages/ImportEncryptedKey.ets new file mode 100644 index 0000000..acac78f --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/pages/ImportEncryptedKey.ets @@ -0,0 +1,661 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start encrypt_the_import_key] + +import { huks } from '@kit.UniversalKeystoreKit'; + +let IV = '0000000000000000'; +let AAD = 'abababababababab'; +let NONCE = 'hahahahahaha'; +let TAG_SIZE = 16; +let FILED_LENGTH = 4; +let importedAes192PlainKey = 'The aes192 key to import'; +let callerAes256Kek = 'The is kek to encrypt aes192 key'; +let callerKeyAlias = 'test_caller_key_ecdh_aes192'; +let callerKekAliasAes256 = 'test_caller_kek_ecdh_aes256'; +let callerAgreeKeyAliasAes256 = 'test_caller_agree_key_ecdh_aes256'; +let importedKeyAliasAes192 = 'test_import_key_ecdh_aes192'; +let huksPubKey: Uint8Array; +let callerSelfPublicKey: Uint8Array; +let outSharedKey: Uint8Array; +let outPlainKeyEncData: Uint8Array; +let outKekEncData: Uint8Array; +let outKekEncTag: Uint8Array; +let outAgreeKeyEncTag: Uint8Array; +let mask = [0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000]; + +function subUint8ArrayOf(arrayBuf: Uint8Array, start: number, end: number) { + let arr: number[] = []; + for (let i = start; i < end && i < arrayBuf.length; ++i) { + arr.push(arrayBuf[i]); + } + return new Uint8Array(arr); +} + +function stringToUint8Array(str: string) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function assignLength(length: number, arrayBuf: Uint8Array, startIndex: number) { + let index = startIndex; + for (let i = 0; i < 4; i++) { + arrayBuf[index++] = (length & mask[i]) >> (i * 8); + } + return 4; +} + +function assignData(data: Uint8Array, arrayBuf: Uint8Array, startIndex: number) { + let index = startIndex; + for (let i = 0; i < data.length; i++) { + arrayBuf[index++] = data[i]; + } + return data.length; +} + +let genWrappingKeyParams: huks.HuksOptions = { + properties: [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_ECC + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_UNWRAP + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_CURVE25519_KEY_SIZE_256 + }, + { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE + } + ] +} + +let genCallerEcdhParams: huks.HuksOptions = { + properties: [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_ECC + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_AGREE + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_CURVE25519_KEY_SIZE_256 + } + ] +} + +let importParamsCallerKek: huks.HuksOptions = { + properties: [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 + }, + { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE + }, + { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_GCM + }, + { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_NONE + }, + { + tag: huks.HuksTag.HUKS_TAG_IV, + value: stringToUint8Array(IV) + } + ], + inData: stringToUint8Array(callerAes256Kek) +} + +let importParamsAgreeKey: huks.HuksOptions = { + properties: [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 + }, + { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE + }, + { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_GCM + }, + { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_NONE + }, + { + tag: huks.HuksTag.HUKS_TAG_IV, + value: stringToUint8Array(IV) + } + ], +} + +let callerAgreeParams: huks.HuksOptions = { + properties: [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_ECDH + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_AGREE + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_CURVE25519_KEY_SIZE_256 + } + ] +} + +let encryptKeyCommonParams: huks.HuksOptions = { + properties: [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 + }, + { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE + }, + { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_GCM + }, + { + tag: huks.HuksTag.HUKS_TAG_NONCE, + value: stringToUint8Array(NONCE) + }, + { + tag: huks.HuksTag.HUKS_TAG_ASSOCIATED_DATA, + value: stringToUint8Array(AAD) + } + ], +} + +let importWrappedAes192Params: huks.HuksOptions = { + properties: [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | + huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_192 + }, + { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE + }, + { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_CBC + }, + { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_NONE + }, + { + tag: huks.HuksTag.HUKS_TAG_UNWRAP_ALGORITHM_SUITE, + value: huks.HuksUnwrapSuite.HUKS_UNWRAP_SUITE_ECDH_AES_256_GCM_NOPADDING + }, + { + tag: huks.HuksTag.HUKS_TAG_IV, + value: stringToUint8Array(IV) + } + ] +} + +async function publicGenerateItemFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise generateKeyItem`); + try { + await huks.generateKeyItem(keyAlias, huksOptions) + .then(data => { + console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`); + }) + .catch((err: Error) => { + console.error(`promise: generateKeyItem failed, ${JSON.stringify(err)}`); + throw (err as Error); + }) + } catch (err) { + console.error(`promise: generateKeyItem invalid, ${JSON.stringify(err)}`); + throw (err as Error); + } +} + +async function publicImportKeyItemFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise importKeyItem`); + try { + await huks.importKeyItem(keyAlias, huksOptions) + .then(data => { + console.info(`promise: importKeyItem success, data = ${JSON.stringify(data)}`); + }).catch((err: Error) => { + console.error(`promise: importKeyItem failed, ${JSON.stringify(err)}`); + throw (err as Error); + }) + } catch (err) { + console.error(`promise: importKeyItem input arg invalid, ${JSON.stringify(err)}`); + throw (err as Error); + } +} + +async function publicDeleteKeyItemFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise deleteKeyItem`); + try { + await huks.deleteKeyItem(keyAlias, huksOptions) + .then(data => { + console.info(`promise: deleteKeyItem key success, data = ${JSON.stringify(data)}`); + }) + .catch((err: Error) => { + console.error(`promise: deleteKeyItem failed, ${JSON.stringify(err)}`); + throw (err as Error); + }) + } catch (err) { + console.error(`promise: deleteKeyItem input arg invalid, ${JSON.stringify(err)}`); + throw (err as Error); + } +} + +function importWrappedKeyItem(keyAlias: string, wrappingKeyAlias: string, huksOptions: huks.HuksOptions) { + return new Promise((resolve, reject) => { + try { + huks.importWrappedKeyItem(keyAlias, wrappingKeyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throw (error as Error); + } + }); +} + +async function publicImportWrappedKeyFunc(keyAlias: string, wrappingKeyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise importWrappedKeyItem`); + for (let i = 0; i < huksOptions.inData!.length; i++) { + console.error(`${i}: ${huksOptions.inData![i]}`); + } + try { + await importWrappedKeyItem(keyAlias, wrappingKeyAlias, huksOptions) + .then((data) => { + console.info(`promise: importWrappedKeyItem success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + console.error(`promise: importWrappedKeyItem failed, ${JSON.stringify(error)}`); + throw (error as Error); + }); + } catch (error) { + console.error(`promise: importWrappedKeyItem input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +async function publicImportWrappedKeyPromise(keyAlias: string, wrappingKeyAlias: string, + huksOptions: huks.HuksOptions) { + console.info(`enter promise importWrappedKeyItem`); + try { + await huks.importWrappedKeyItem(keyAlias, wrappingKeyAlias, huksOptions) + .then((data) => { + console.info(`promise: importWrappedKeyItem success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + console.error(`promise: importWrappedKeyItem failed, ${JSON.stringify(error)}`); + throw (error as Error); + }); + } catch (error) { + console.error(`promise: importWrappedKeyItem input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +async function publicInitFunc(srcKeyAlias: string, huksOptions: huks.HuksOptions) { + let handle: number = 0; + console.info(`enter promise doInit`); + try { + await huks.initSession(srcKeyAlias, huksOptions) + .then((data) => { + console.info(`promise: doInit success, data = ${JSON.stringify(data)}`); + handle = data.handle; + }) + .catch((error: Error) => { + console.error(`promise: doInit key failed, ${JSON.stringify(error)}`); + throw (error as Error); + }); + } catch (error) { + console.error(`promise: doInit input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } + return handle; +} + +async function publicUpdateSessionFunction(handle: number, huksOptions: huks.HuksOptions) { + const maxUpdateSize = 64; + const inData = huksOptions.inData!; + const lastInDataPosition = inData.length - 1; + let inDataSegSize = maxUpdateSize; + let inDataSegPosition = 0; + let isFinished = false; + let outData: number[] = []; + + while (inDataSegPosition <= lastInDataPosition) { + if (inDataSegPosition + maxUpdateSize > lastInDataPosition) { + isFinished = true; + inDataSegSize = lastInDataPosition - inDataSegPosition + 1; + console.info(`enter promise doUpdate`); + break; + } + huksOptions.inData = new Uint8Array( + Array.from(inData).slice(inDataSegPosition, inDataSegPosition + inDataSegSize) + ); + console.info(`enter promise doUpdate`); + try { + await huks.updateSession(handle, huksOptions) + .then((data) => { + console.info(`promise: doUpdate success, data = ${JSON.stringify(data)}`); + outData = outData.concat(Array.from(data.outData!)); + }) + .catch((error: Error) => { + console.error(`promise: doUpdate failed, ${JSON.stringify(error)}`); + throw (error as Error); + }); + } catch (error) { + console.error(`promise: doUpdate input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } + if ((!isFinished) && (inDataSegPosition + maxUpdateSize > lastInDataPosition)) { + console.error(`update size invalid isFinished = ${isFinished}`); + console.error(`inDataSegPosition = ${inDataSegPosition}`); + console.error(`lastInDataPosition = ${lastInDataPosition}`); + return; + } + inDataSegPosition += maxUpdateSize; + } + return outData; +} + +async function publicFinishSession(handle: number, huksOptions: huks.HuksOptions, inData: number[]) { + let outData: number[] = []; + console.info(`enter promise doFinish`); + try { + await huks.finishSession(handle, huksOptions) + .then((data) => { + console.info(`promise: doFinish success, data = ${JSON.stringify(data)}`); + outData = inData.concat(Array.from(data.outData!)); + }) + .catch((error: Error) => { + console.error(`promise: doFinish key failed, ${JSON.stringify(error)}`); + throw (error as Error); + }); + } catch (error) { + console.error(`promise: doFinish input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } + return new Uint8Array(outData); +} + +async function cipherFunction(keyAlias: string, huksOptions: huks.HuksOptions) { + let handle = await publicInitFunc(keyAlias, huksOptions); + let tmpData = await publicUpdateSessionFunction(handle, huksOptions); + let outData = await publicFinishSession(handle, huksOptions, tmpData!); + return outData; +} + +async function agreeFunction(keyAlias: string, huksOptions: huks.HuksOptions, huksPublicKey: Uint8Array) { + let handle = await publicInitFunc(keyAlias, huksOptions); + let outSharedKey: Uint8Array = new Uint8Array; + huksOptions.inData = huksPublicKey; + console.info(`enter promise doUpdate`); + try { + await huks.updateSession(handle, huksOptions) + .then((data) => { + console.error(`promise: doUpdate success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + console.error(`promise: doUpdate failed, ${JSON.stringify(error)}`); + throw (error as Error); + }); + } catch (error) { + console.error(`promise: doUpdate input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } + console.info(`enter promise doInit`); + try { + await huks.finishSession(handle, huksOptions) + .then((data) => { + console.info(`promise: doInit success, data = ${JSON.stringify(data)}`); + outSharedKey = data.outData as Uint8Array; + }) + .catch((error: Error) => { + console.error(`promise: doInit key failed, ${JSON.stringify(error)}`); + throw (error as Error); + }); + } catch (error) { + console.error(`promise: doInit input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } + return outSharedKey; +} + +async function importKekAndAgreeSharedSecret(callerKekAlias: string, importKekParams: huks.HuksOptions, + callerKeyAlias: string, huksPublicKey: Uint8Array, agreeParams: huks.HuksOptions) { + await publicImportKeyItemFunc(callerKekAlias, importKekParams); + outSharedKey = await agreeFunction(callerKeyAlias, agreeParams, huksPublicKey); + importParamsAgreeKey.inData = outSharedKey; + await publicImportKeyItemFunc(callerAgreeKeyAliasAes256, importParamsAgreeKey); +} + +async function generateAndExportPublicKey(keyAlias: string, huksOptions: huks.HuksOptions, caller: Boolean) { + await publicGenerateItemFunc(keyAlias, huksOptions); + try { + await huks.exportKeyItem(keyAlias, huksOptions) + .then((data) => { + console.info(`promise: exportKeyItem success, data = ${JSON.stringify(data)}`); + if (caller) { + callerSelfPublicKey = data.outData as Uint8Array; + } else { + huksPubKey = data.outData as Uint8Array; + } + }) + .catch((error: Error) => { + console.error(`promise: exportKeyItem failed, ${JSON.stringify(error)}`); + throw (error as Error); + }); + } catch (error) { + console.error(`promise: generate pubKey failed, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +async function encryptImportedPlainKeyAndKek(keyAlias: string) { + encryptKeyCommonParams.inData = stringToUint8Array(keyAlias) + let plainKeyEncData = await cipherFunction(callerKekAliasAes256, encryptKeyCommonParams); + outKekEncTag = subUint8ArrayOf(plainKeyEncData, plainKeyEncData.length - TAG_SIZE, plainKeyEncData.length) + outPlainKeyEncData = subUint8ArrayOf(plainKeyEncData, 0, plainKeyEncData.length - TAG_SIZE) + encryptKeyCommonParams.inData = stringToUint8Array(callerAes256Kek) + let kekEncData = await cipherFunction(callerAgreeKeyAliasAes256, encryptKeyCommonParams) + outAgreeKeyEncTag = subUint8ArrayOf(kekEncData, kekEncData.length - TAG_SIZE, kekEncData.length) + outKekEncData = subUint8ArrayOf(kekEncData, 0, kekEncData.length - TAG_SIZE) +} + +async function buildWrappedDataAndImportWrappedKey(plainKey: string) { + let plainKeySizeBuff = new Uint8Array(4); + assignLength(plainKey.length, plainKeySizeBuff, 0); + let wrappedData = new Uint8Array( + FILED_LENGTH + huksPubKey.length + + FILED_LENGTH + AAD.length + + FILED_LENGTH + NONCE.length + + FILED_LENGTH + TAG_SIZE + + FILED_LENGTH + outKekEncData.length + + FILED_LENGTH + AAD.length + + FILED_LENGTH + NONCE.length + + FILED_LENGTH + TAG_SIZE + + FILED_LENGTH + plainKeySizeBuff.length + + FILED_LENGTH + outPlainKeyEncData.length + ); + let index = 0; + let aadUint8Array = stringToUint8Array(AAD); + let nonceArray = stringToUint8Array(NONCE); + index += assignLength(callerSelfPublicKey.length, wrappedData, index); // 4 + index += assignData(callerSelfPublicKey, wrappedData, index); // 91 + index += assignLength(aadUint8Array.length, wrappedData, index); // 4 + index += assignData(aadUint8Array, wrappedData, index); // 16 + index += assignLength(nonceArray.length, wrappedData, index); // 4 + index += assignData(nonceArray, wrappedData, index); // 12 + index += assignLength(outAgreeKeyEncTag.length, wrappedData, index); // 4 + index += assignData(outAgreeKeyEncTag, wrappedData, index); // 16 + index += assignLength(outKekEncData.length, wrappedData, index); // 4 + index += assignData(outKekEncData, wrappedData, index); // 32 + index += assignLength(aadUint8Array.length, wrappedData, index); // 4 + index += assignData(aadUint8Array, wrappedData, index); // 16 + index += assignLength(nonceArray.length, wrappedData, index); // 4 + index += assignData(nonceArray, wrappedData, index); // 12 + index += assignLength(outKekEncTag.length, wrappedData, index); // 4 + index += assignData(outKekEncTag, wrappedData, index); // 16 + index += assignLength(plainKeySizeBuff.length, wrappedData, index); // 4 + index += assignData(plainKeySizeBuff, wrappedData, index); // 4 + index += assignLength(outPlainKeyEncData.length, wrappedData, index); // 4 + index += assignData(outPlainKeyEncData, wrappedData, index); // 24 + return wrappedData; +} + +/* 模拟加密导入密钥场景,设备A为远端设备(导入设备),设备B为本端设备(被导入设备) */ +async function ImportWrappedKey() { + /** + * 1.设备A将待导入密钥转换成HUKS密钥材料格式To_Import_Key(仅针对非对称密钥,若待导入密钥是对称密钥则可省略此步骤), + * 本示例使用importedAes256PlainKey(对称密钥)作为模拟 + */ + + /* 2.设备B生成一个加密导入用途的、用于协商的非对称密钥对Wrapping_Key(公钥Wrapping_Pk,私钥Wrapping_Sk), + * 其密钥用途设置为unwrap,导出Wrapping_Key公钥Wrapping_Pk存放在变量huksPubKey中 + */ + const srcKeyAliasWrap = 'HUKS_Basic_Capability_Import_0200'; + await generateAndExportPublicKey(srcKeyAliasWrap, genWrappingKeyParams, false); + + /* 3.设备A使用和设备B同样的算法,生成一个加密导入用途的、用于协商的非对称密钥对Caller_Key(公钥Caller_Pk,私钥Caller_Sk), + * 导出Caller_Key公钥Caller_Pk存放在变量callerSelfPublicKey中 + */ + await generateAndExportPublicKey(callerKeyAlias, genCallerEcdhParams, true); + + /** + * 4.设备A生成一个对称密钥Caller_Kek,该密钥后续将用于加密To_Import_Key + * 5.设备A基于Caller_Key的私钥Caller_Sk和Wrapping_Key的公钥Wrapping_Pk,协商出Shared_Key + */ + await importKekAndAgreeSharedSecret(callerKekAliasAes256, importParamsCallerKek, callerKeyAlias, huksPubKey, + callerAgreeParams); + + /** + * 6.设备A使用Caller_Kek加密To_Import_Key,生成To_Import_Key_Enc + * 7.设备A使用Shared_Key加密Caller_Kek,生成Caller_Kek_Enc + */ + await encryptImportedPlainKeyAndKek(importedAes192PlainKey); + + /* 8.设备A封装Caller_Pk、To_Import_Key_Enc、Caller_Kek_Enc等加密导入的材料并发送给设备B。 + 本示例作为变量存放在callerSelfPublicKey,PlainKeyEncData,KekEncData */ + let wrappedData = await buildWrappedDataAndImportWrappedKey(importedAes192PlainKey); + importWrappedAes192Params.inData = wrappedData; + + /* 9.设备B导入封装的加密密钥材料 */ + await publicImportWrappedKeyFunc(importedKeyAliasAes192, srcKeyAliasWrap, importWrappedAes192Params); + + /* 10.设备A、B删除用于加密导入的密钥 */ + await publicDeleteKeyItemFunc(srcKeyAliasWrap, genWrappingKeyParams); + await publicDeleteKeyItemFunc(callerKeyAlias, genCallerEcdhParams); + await publicDeleteKeyItemFunc(importedKeyAliasAes192, importWrappedAes192Params); + await publicDeleteKeyItemFunc(callerKekAliasAes256, callerAgreeParams); +} + + +// [End encrypt_the_import_key] + +// [Start encrypt_the_import_key_to_verify_that_the_key_exists] +/* + * 确定密钥别名和封装密钥属性参数集 + */ +let keyAlias = 'test_import_key_ecdh_aes192'; +let isKeyExist: Boolean; +let keyProperties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES, +}]; +let huksOptions: huks.HuksOptions = { + properties: keyProperties, // 非空填充 + inData: new Uint8Array([]) // 非空填充 +} + +function Check() { + try { + huks.isKeyItemExist(keyAlias, huksOptions, (error, data) => { + if (error) { + console.error(`callback: isKeyItemExist failed, ${JSON.stringify(error)}`); + } else { + if (data !== null && data.valueOf() !== null) { + isKeyExist = data.valueOf(); + console.info(`callback: isKeyItemExist success, isKeyExist = ${isKeyExist}`); + } + } + }); + } catch (error) { + console.error(`callback: isKeyItemExist input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +// [End encrypt_the_import_key_to_verify_that_the_key_exists] +export { ImportWrappedKey, Check }; diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/pages/Index.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..5f77599 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Check, ImportWrappedKey } from './ImportEncryptedKey'; +import testNapi from 'libentry.so'; + +@Entry +@Component +struct Index { + @State message: string = 'ImportEncryptedKey'; + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.call_arkts')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await ImportWrappedKey(); + Check(); + this.message = 'Call ArkTS Result: Success'; + } catch (error) { + this.message = 'Call ArkTS Result: Failed'; + } + }) + Button($r('app.string.call_cpp')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: number = testNapi.importWrappedKey(); + this.message = 'Call C/C++ Result: ' + ret.toString(); + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/module.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/module.json5 new file mode 100644 index 0000000..4144486 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/module.json5 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/element/color.json b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/element/string.json b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..106420a --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/element/string.json @@ -0,0 +1,24 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "ImportEncryptedKey" + }, + { + "name": "call_arkts", + "value": "Call ArkTS" + }, + { + "name": "call_cpp", + "value": "Call C/C++" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/media/background.png b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/media/foreground.png b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f 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

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/profile/backup_config.json b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/profile/main_pages.json b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..1898d94 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/Index" + ] +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/dark/element/color.json b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/ets/test/Ability.test.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..0f8ce9a --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/ets/test/ImportEncryptedKey.test.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/ets/test/ImportEncryptedKey.test.ets new file mode 100644 index 0000000..3d6850f --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/ets/test/ImportEncryptedKey.test.ets @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, beforeAll } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function hMACTest() { + describe('importEncryptedKeyTest', () => { + + /** + * 打开应用 + */ + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + await driver.delayMs(1000); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * 点击按钮,ImportEncryptedKey(ArkTS) + */ + it('testImportEncryptedKey001', 0, async () => { + console.info('uitest: testImportEncryptedKey001 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('Call ArkTS')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('Call ArkTS Result: Success')); + console.info('uitest: testImportEncryptedKey001 end'); + }) + + /** + * 点击按钮,ImportEncryptedKey(C/C++) + */ + it('testImportEncryptedKey002', 0, async () => { + console.info('uitest: testImportEncryptedKey002 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('Call C/C++')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('Call C/C++ Result: 0')); + console.info('uitest: testImportEncryptedKey002 end'); + await driver.pressBack(); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/ets/test/List.test.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..894688f --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import importEncryptedKeyTest from './ImportEncryptedKey.test'; + +export default function testsuite() { + importEncryptedKeyTest(); +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/module.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..c3fd9dd --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/hvigor/hvigor-config.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..d584c19 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/hvigorfile.ts b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/hvigorfile.ts new file mode 100644 index 0000000..2a5e543 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/oh-package.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/oh-package.json5 new file mode 100644 index 0000000..e41bae0 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/ohosTest.md b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/ohosTest.md new file mode 100644 index 0000000..6fafce2 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/ohosTest.md @@ -0,0 +1,9 @@ +# 密钥删除测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| ------------------------- | ------------ | ---- | ---------------- | -------- | -------- | +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 点击按钮,加密导入密钥(ArkTS) | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | +| 点击按钮,加密导入密钥(C/C++) | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/screenshots/ImportEncryptedKeyCpp_1.png b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/screenshots/ImportEncryptedKeyCpp_1.png new file mode 100644 index 0000000000000000000000000000000000000000..bf654c1fc053f18e6e1fa5f271fb802d9f42491c GIT binary patch literal 25141 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 b2^Se~_Z(^Zw_85{=PrHy@4FWaJNCZ-*R?NZ literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/screenshots/ImportEncryptedKeyCpp_2.png b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/screenshots/ImportEncryptedKeyCpp_2.png new file mode 100644 index 0000000000000000000000000000000000000000..fe05bccea064ef4594bbbb2a759ee09b344c92fd GIT binary patch literal 24957 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/screenshots/ImportEncryptedKey_1.png b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/screenshots/ImportEncryptedKey_1.png new file mode 100644 index 0000000000000000000000000000000000000000..bf654c1fc053f18e6e1fa5f271fb802d9f42491c GIT binary patch literal 25141 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 b2^Se~_Z(^Zw_85{=PrHy@4FWaJNCZ-*R?NZ literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/screenshots/ImportEncryptedKey_2.png b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey/screenshots/ImportEncryptedKey_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e60de243a18e4c8bd2876f853b116f858dc0b8b8 GIT binary patch literal 25615 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/.gitignore b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/.gitignore new file mode 100644 index 0000000..d2ff201 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/.gitignore @@ -0,0 +1,12 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +/.appanalyzer \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/AppScope/app.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/AppScope/app.json5 new file mode 100644 index 0000000..1ce720e --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/AppScope/app.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "bundleName": "com.samples.importkeyplaintext", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/AppScope/resources/base/element/string.json b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/AppScope/resources/base/element/string.json new file mode 100644 index 0000000..2b7782e --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "ImportKeyPlainText" + } + ] +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/AppScope/resources/base/media/app_icon.png b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a39445dc87828b76fed6d2ec470dd455c45319e3 GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/README.md b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/README.md new file mode 100644 index 0000000..eacd41a --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/README.md @@ -0,0 +1,92 @@ +## 加密导入密钥(ArkTS) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://gitee.com/openharmony/docs/blob/OpenHarmony-5.0.1-Release/zh-cn/application-dev/security/UniversalKeystoreKit/huks-import-wrapped-key-arkts.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### ImportEncryptedKey + +##### 介绍 + +1. 本示例主要介绍为保证数据安全性加密导入ECDH密钥对。 + +##### 效果预览 + +| 主页 | 删除 | +| ---------------------------------------------------------- | ---------------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call ArkTS按钮调用接口ImportWrappedKey,加密导入密钥对为。 + +## 加密导入密钥(C/C++) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://gitee.com/openharmony/docs/blob/OpenHarmony-5.0.1-Release/zh-cn/application-dev/security/UniversalKeystoreKit/huks-import-wrapped-key-ndk.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### Call C/C++ + +##### 介绍 + +1. 本示例主要介绍为保证数据安全性加密导入ECDH密钥对。 + +##### 效果预览 + +| 主页 | 跳转页 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| | | + +使用说明 + +1. 点击Call C/C++按钮调用接口importWrappedKey,加密导入密钥对为。 + +## 工程目录 + +``` +entry/src/main/ +|---ets +|---|---entryability +|---|---|---EntryAbility.ets +|---|---pages +|---|---|---Index.ets // 首页 +|---|---|---ImportEncryptedKey.ets +|---cpp +|---resources // 静态资源 +|---ohosTest +|---|---ets +|---|---|---tests +|---|---|---|---ImportEncryptedKey.test.ets // 自动化测试用例 +``` + + +## 相关权限 + +无。 + +## 依赖 + +不涉及。 + +## 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.2 Release及以上。 + +3. DevEco Studio版本:DevEco Studio 5.0.2 Release及以上。 + +4. HarmonyOS SDK版本:HarmonyOS 5.0.2 Release及以上。 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportEncryptedKey > .git/info/sparse-checkout +git remote add origin https://gitee.com/harmonyos_samples/guide-snippets.git +git pull origin master +``` \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/build-profile.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/build-profile.json5 new file mode 100644 index 0000000..fb5a1ab --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/code-linter.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/code-linter.json5 new file mode 100644 index 0000000..2858646 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/code-linter.json5 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/.gitignore b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/build-profile.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/build-profile.json5 new file mode 100644 index 0000000..2d8b081 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": [ + "arm64-v8a", + "x86_64" + ] + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/hvigorfile.ts b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/hvigorfile.ts new file mode 100644 index 0000000..e4f43d5 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/oh-package.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/oh-package.json5 new file mode 100644 index 0000000..118bdd4 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/oh-package.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/CMakeLists.txt b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..2b331e5 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(ImportKeyPlainText) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) +target_link_libraries(entry PUBLIC libace_napi.z.so libhuks_ndk.z.so) \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/napi_init.cpp b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000..a0a1f1a --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// [Start import_keys_in_plaintext] +/* 以下以明文导入AES密钥为例 */ +#include "huks/native_huks_api.h" +#include "huks/native_huks_param.h" +#include "napi/native_api.h" +#include + +#define OH_HUKS_AES_KEY_SIZE_32 32 + +OH_Huks_Result InitParamSet(struct OH_Huks_ParamSet **paramSet, const struct OH_Huks_Param *params, + uint32_t paramCount) +{ + OH_Huks_Result ret = OH_Huks_InitParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_AddParams(*paramSet, params, paramCount); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + ret = OH_Huks_BuildParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + return ret; +} +struct OH_Huks_Param g_testImportKeyParam[] = {{.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_AES}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_ENCRYPT}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_AES_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_NONE}}; + +static napi_value ImportKey(napi_env env, napi_callback_info info) +{ + const char *alias = "test_import"; + struct OH_Huks_Blob aliasBlob = {.size = (uint32_t)strlen(alias), .data = (uint8_t *)alias}; + /* DER格式的公钥,用于后续导入密钥 */ + uint8_t pubKey[OH_HUKS_AES_KEY_SIZE_32] = {0xfb, 0x8b, 0x9f, 0x12, 0xa0, 0x83, 0x19, 0xbe, 0x6a, 0x6f, 0x63, + 0x2a, 0x7c, 0x86, 0xba, 0xca, 0x64, 0x0b, 0x88, 0x96, 0xe2, 0xfa, + 0x77, 0xbc, 0x71, 0xe3, 0x0f, 0x0f, 0x9e, 0x3c, 0xe5, 0xf9}; + struct OH_Huks_Blob publicKey = {OH_HUKS_AES_KEY_SIZE_32, pubKey}; + struct OH_Huks_ParamSet *testImportKeyParamSet = nullptr; + struct OH_Huks_Result ohResult; + do { + ohResult = InitParamSet(&testImportKeyParamSet, g_testImportKeyParam, + sizeof(g_testImportKeyParam) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 4. Import Key */ + char newKey[] = "test_import"; + struct OH_Huks_Blob newKeyAlias = {.size = (uint32_t)strlen(newKey), .data = (uint8_t *)newKey}; + ohResult = OH_Huks_ImportKeyItem(&newKeyAlias, testImportKeyParamSet, &publicKey); + } while (0); + OH_Huks_FreeParamSet(&testImportKeyParamSet); + napi_value ret; + napi_create_int32(env, ohResult.errorCode, &ret); + return ret; +} + +// [End import_keys_in_plaintext] +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + {"importKey", nullptr, ImportKey, nullptr, nullptr, nullptr, napi_default, nullptr}}; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void *)0), + .reserved = {0}, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); } diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/types/libentry/index.d.ts b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 0000000..d04ac97 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const importKey: () => number; \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/types/libentry/oh-package.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000..2826cc7 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libentry.so", + "types": "./index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/entryability/EntryAbility.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..edc2839 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..b1e2129 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/AES256.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/AES256.ets new file mode 100644 index 0000000..17f2c35 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/AES256.ets @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// [Start import_keys_in_plaintext_AES256] + +/* 以下以导入AES256密钥的Callback操作使用为例 */ +import { huks } from '@kit.UniversalKeystoreKit' + +/* 密钥材料 */ +let plainTextSize32 = new Uint8Array([ + 0xfb, 0x8b, 0x9f, 0x12, 0xa0, 0x83, 0x19, 0xbe, 0x6a, 0x6f, 0x63, 0x2a, 0x7c, 0x86, 0xba, 0xca, + 0x64, 0x0b, 0x88, 0x96, 0xe2, 0xfa, 0x77, 0xbc, 0x71, 0xe3, 0x0f, 0x0f, 0x9e, 0x3c, 0xe5, 0xf9 +]); +/* 1.确定密钥别名 */ +let keyAlias = 'AES256Alias_sample'; + +/* 2.封装密钥属性集和密钥材料 */ +let properties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }, +]; + +let options: huks.HuksOptions = { + properties: properties, + inData: plainTextSize32 +}; + +/* 3.明文导入密钥 */ +function importAES256() { + try { + huks.importKeyItem(keyAlias, options, (error, data) => { + if (error) { + console.error(`callback: importKeyItem failed` + JSON.stringify(error)); + } else { + console.info(`callback: importKeyItem success`); + } + }); + } catch (error) { + console.error(`callback: importKeyItem input arg invalid` + JSON.stringify(error)); + throw (error as Error); + } +} + +// [End import_keys_in_plaintext_AES256] + +let isKeyExist = false; + +let keyProperties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }, +]; + +let huksOptions: huks.HuksOptions = { + properties: keyProperties, // 非空填充 + inData: new Uint8Array([]) // 非空填充 +} + +function check() { + try { + huks.isKeyItemExist(keyAlias, huksOptions, (error, data) => { + if (error) { + console.error(`callback: isKeyItemExist failed, ` + JSON.stringify(error)); + } else { + if (data !== null && data.valueOf() !== null) { + isKeyExist = data.valueOf(); + console.info(`callback: isKeyItemExist success, isKeyExist = ${isKeyExist}`); + } + } + }); + } catch (error) { + console.error(`callback: isKeyItemExist input arg invalid, ` + JSON.stringify(error)); + throw (error as Error); + } +} + +@Entry +@Component +struct Index { + @State message: string = 'AES256'; + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.call_aes_256')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + try { + importAES256(); + check(); + this.message = 'AES256 Result: Success'; + }catch{ + this.message = 'AES256 Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/Index.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..5e93a55 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; +import testNapi from 'libentry.so'; + +@Entry +@Component +struct Index { + @State message: string = 'ImportKeyPlainText'; + + goToSample(url: string): void { + router.pushUrl({ + url: url, + }, router.RouterMode.Single, (err) => { + if (err) { + console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('pushUrl success'); + }) + } + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.aes_256')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/AES256'); + }) + Button($r('app.string.rsa_2048')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/RSA2048'); + }) + Button($r('app.string.x25519')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/X25519'); + }) + Button($r('app.string.call_cpp_import_key')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: number = testNapi.importKey(); + this.message = 'Call C/C++ Result: ' + ret.toString(); + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/RSA2048.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/RSA2048.ets new file mode 100644 index 0000000..86b978b --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/RSA2048.ets @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// [Start import_keys_in_plaintext_RSA2048] +/* 以下以导入RSA2048密钥的Callback操作使用为例 */ +import { huks } from '@kit.UniversalKeystoreKit' + +let rsa2048KeyPairMaterial = new Uint8Array([ + 0x01, 0x00, 0x00, 0x00, // 密钥算法(小端表示)huks.HuksKeyAlg.HUKS_ALG_RSA = 1 + 0x00, 0x08, 0x00, 0x00, // 密钥大小(比特):2048 + 0x00, 0x01, 0x00, 0x00, // 模数n长度(字节):256 + 0x03, 0x00, 0x00, 0x00, // 公钥指数e长度(字节):3 + 0x00, 0x01, 0x00, 0x00, // 私钥指数d长度(字节):256 + // 模数n + 0xc5, 0x35, 0x62, 0x48, 0xc4, 0x92, 0x87, 0x73, 0x0d, 0x42, 0x96, 0xfc, 0x7b, 0x11, 0x05, 0x06, + 0x0f, 0x8d, 0x66, 0xc1, 0x0e, 0xad, 0x37, 0x44, 0x92, 0x95, 0x2f, 0x6a, 0x55, 0xba, 0xec, 0x1d, + 0x54, 0x62, 0x0a, 0x4b, 0xd3, 0xc7, 0x05, 0xe4, 0x07, 0x40, 0xd9, 0xb7, 0xc2, 0x12, 0xcb, 0x9a, + 0x90, 0xad, 0xe3, 0x24, 0xe8, 0x5e, 0xa6, 0xf8, 0xd0, 0x6e, 0xbc, 0xd1, 0x69, 0x7f, 0x6b, 0xe4, + 0x2b, 0x4e, 0x1a, 0x65, 0xbb, 0x73, 0x88, 0x6b, 0x7c, 0xaf, 0x7e, 0xd0, 0x47, 0x26, 0xeb, 0xa5, + 0xbe, 0xd6, 0xe8, 0xee, 0x9c, 0xa5, 0x66, 0xa5, 0xc9, 0xd3, 0x25, 0x13, 0xc4, 0x0e, 0x6c, 0xab, + 0x50, 0xb6, 0x50, 0xc9, 0xce, 0x8f, 0x0a, 0x0b, 0xc6, 0x28, 0x69, 0xe9, 0x83, 0x69, 0xde, 0x42, + 0x56, 0x79, 0x7f, 0xde, 0x86, 0x24, 0xca, 0xfc, 0xaa, 0xc0, 0xf3, 0xf3, 0x7f, 0x92, 0x8e, 0x8a, + 0x12, 0x52, 0xfe, 0x50, 0xb1, 0x5e, 0x8c, 0x01, 0xce, 0xfc, 0x7e, 0xf2, 0x4f, 0x5f, 0x03, 0xfe, + 0xa7, 0xcd, 0xa1, 0xfc, 0x94, 0x52, 0x00, 0x8b, 0x9b, 0x7f, 0x09, 0xab, 0xa8, 0xa4, 0xf5, 0xb4, + 0xa5, 0xaa, 0xfc, 0x72, 0xeb, 0x17, 0x40, 0xa9, 0xee, 0xbe, 0x8f, 0xc2, 0xd1, 0x80, 0xc2, 0x0d, + 0x44, 0xa9, 0x59, 0x44, 0x59, 0x81, 0x3b, 0x5d, 0x4a, 0xde, 0xfb, 0xae, 0x24, 0xfc, 0xa3, 0xd9, + 0xbc, 0x57, 0x55, 0xc2, 0x26, 0xbc, 0x19, 0xa7, 0x9a, 0xc5, 0x59, 0xa3, 0xee, 0x5a, 0xef, 0x41, + 0x80, 0x7d, 0xf8, 0x5e, 0xc1, 0x1d, 0x32, 0x38, 0x41, 0x5b, 0xb6, 0x92, 0xb8, 0xb7, 0x03, 0x0d, + 0x3e, 0x59, 0x0f, 0x1c, 0xb3, 0xe1, 0x2a, 0x95, 0x1a, 0x3b, 0x50, 0x4f, 0xc4, 0x1d, 0xcf, 0x73, + 0x7c, 0x14, 0xca, 0xe3, 0x0b, 0xa7, 0xc7, 0x1a, 0x41, 0x4a, 0xee, 0xbe, 0x1f, 0x43, 0xdd, 0xf9, + // 公钥指数e + 0x01, 0x00, 0x01, + // 私钥指数d + 0x88, 0x4b, 0x82, 0xe7, 0xe3, 0xe3, 0x99, 0x75, 0x6c, 0x9e, 0xaf, 0x17, 0x44, 0x3e, 0xd9, 0x07, + 0xfd, 0x4b, 0xae, 0xce, 0x92, 0xc4, 0x28, 0x44, 0x5e, 0x42, 0x79, 0x08, 0xb6, 0xc3, 0x7f, 0x58, + 0x2d, 0xef, 0xac, 0x4a, 0x07, 0xcd, 0xaf, 0x46, 0x8f, 0xb4, 0xc4, 0x43, 0xf9, 0xff, 0x5f, 0x74, + 0x2d, 0xb5, 0xe0, 0x1c, 0xab, 0xf4, 0x6e, 0xd5, 0xdb, 0xc8, 0x0c, 0xfb, 0x76, 0x3c, 0x38, 0x66, + 0xf3, 0x7f, 0x01, 0x43, 0x7a, 0x30, 0x39, 0x02, 0x80, 0xa4, 0x11, 0xb3, 0x04, 0xd9, 0xe3, 0x57, + 0x23, 0xf4, 0x07, 0xfc, 0x91, 0x8a, 0xc6, 0xcc, 0xa2, 0x16, 0x29, 0xb3, 0xe5, 0x76, 0x4a, 0xa8, + 0x84, 0x19, 0xdc, 0xef, 0xfc, 0xb0, 0x63, 0x33, 0x0b, 0xfa, 0xf6, 0x68, 0x0b, 0x08, 0xea, 0x31, + 0x52, 0xee, 0x99, 0xef, 0x43, 0x2a, 0xbe, 0x97, 0xad, 0xb3, 0xb9, 0x66, 0x7a, 0xae, 0xe1, 0x8f, + 0x57, 0x86, 0xe5, 0xfe, 0x14, 0x3c, 0x81, 0xd0, 0x64, 0xf8, 0x86, 0x1a, 0x0b, 0x40, 0x58, 0xc9, + 0x33, 0x49, 0xb8, 0x99, 0xc6, 0x2e, 0x94, 0x70, 0xee, 0x09, 0x88, 0xe1, 0x5c, 0x4e, 0x6c, 0x22, + 0x72, 0xa7, 0x2a, 0x21, 0xdd, 0xd7, 0x1d, 0xfc, 0x63, 0x15, 0x0b, 0xde, 0x06, 0x9c, 0xf3, 0x28, + 0xf3, 0xac, 0x4a, 0xa8, 0xb5, 0x50, 0xca, 0x9b, 0xcc, 0x0a, 0x04, 0xfe, 0x3f, 0x98, 0x68, 0x81, + 0xac, 0x24, 0x53, 0xea, 0x1f, 0x1c, 0x6e, 0x5e, 0xca, 0xe8, 0x31, 0x0d, 0x08, 0x12, 0xf3, 0x26, + 0xf8, 0x5e, 0xeb, 0x10, 0x27, 0xae, 0xaa, 0xc3, 0xad, 0x6c, 0xc1, 0x89, 0xdb, 0x7d, 0x5a, 0x12, + 0x55, 0xad, 0x11, 0x19, 0xa1, 0xa9, 0x8f, 0x0b, 0x6d, 0x78, 0x8d, 0x1c, 0xdf, 0xe5, 0x63, 0x82, + 0x0b, 0x7d, 0x23, 0x04, 0xb4, 0x75, 0x8c, 0xed, 0x77, 0xfc, 0x1a, 0x85, 0x29, 0x11, 0xe0, 0x61, +]); + +/* 1.确定密钥别名 */ +let keyAlias = 'RSA_sample'; +/* 2.封装密钥属性集和密钥材料 */ +let properties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 + }, + { + // 此 tag表示密钥导入后的用途,导入后将不可更改 + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }, + { + // 此 tag表示需导入的密钥类型 + tag: huks.HuksTag.HUKS_TAG_IMPORT_KEY_TYPE, + // 此 value表示导入密钥对,若改为HUKS_KEY_TYPE_PUBLIC_KEY时表示仅导入公钥 + value: huks.HuksImportKeyType.HUKS_KEY_TYPE_KEY_PAIR + }, +]; + +let options: huks.HuksOptions = { + properties: properties, + inData: rsa2048KeyPairMaterial +}; + +/* 3.明文导入密钥 */ +function importRSA2048() { + try { + huks.importKeyItem(keyAlias, options, (error, data) => { + if (error) { + console.error(`callback: importKeyItem failed` + error); + } else { + console.info(`callback: importKeyItem success`); + } + }); + } catch (error) { + console.error(`callback: importKeyItem input arg invalid` + error); + throw (error as Error); + } +} + + + +// [End import_keys_in_plaintext_RSA2048] +let isKeyExist = false; + +let keyProperties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }, + { + tag: huks.HuksTag.HUKS_TAG_IMPORT_KEY_TYPE, + value: huks.HuksImportKeyType.HUKS_KEY_TYPE_KEY_PAIR + }, +]; + +let huksOptions: huks.HuksOptions = { + properties: keyProperties, // 非空填充 + inData: new Uint8Array([]) // 非空填充 +} + +function check() { + try { + huks.isKeyItemExist(keyAlias, huksOptions, (error, data) => { + if (error) { + console.error(`callback: isKeyItemExist failed, ` + JSON.stringify(error)); + } else { + if (data !== null && data.valueOf() !== null) { + isKeyExist = data.valueOf(); + console.info(`callback: isKeyItemExist success, isKeyExist = ${isKeyExist}`); + } + } + }); + } catch (error) { + console.error(`callback: isKeyItemExist input arg invalid, ` + JSON.stringify(error)); + throw (error as Error); + } +} + +@Entry +@Component +struct Index { + @State message: string = 'RSA2048'; + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.call_rsa_2048')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + try { + importRSA2048(); + check(); + this.message = 'RSA2048 Result: Success'; + }catch{ + this.message = 'RSA2048 Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/X25519.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/X25519.ets new file mode 100644 index 0000000..10a0bdc --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/ets/pages/X25519.ets @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start import_keys_in_plaintext_X25519] +/* 以下以导入X25519密钥的Callback操作使用为例 */ +import { huks } from '@kit.UniversalKeystoreKit' + +// X25519的公钥数据。X25519 密钥对中的私钥和公钥都是 32 字节(256 位),关于算法原理请自行参考相关密钥学资料。 +let x25519KeyPubMaterial = new Uint8Array([ + 0x30, 0x2A, 0x30, 0x05, 0x06, 0x03, 0x2B, 0x65, 0x6E, 0x03, 0x21, 0x00, 0xD2, 0x36, 0x9E, 0xCF, + 0xF0, 0x61, 0x5B, 0x73, 0xCE, 0x4F, 0xF0, 0x40, 0x2B, 0x89, 0x18, 0x3E, 0x06, 0x33, 0x60, 0xC6 +]); + +/* 1.确定密钥别名 */ +let keyAlias = 'X25519_Pub_import_sample'; +/* 2.封装密钥属性集和密钥材料 */ +let properties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_X25519 + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_CURVE25519_KEY_SIZE_256 + }, + { + // 此 tag表示密钥导入后的用途,导入后将不可更改 + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY + }, + { + // 此 tag表示需导入的密钥类型 + tag: huks.HuksTag.HUKS_TAG_IMPORT_KEY_TYPE, + // 此 value表示导入密钥的公钥,若改为HUKS_KEY_TYPE_KEY_PAIR时表示导入密钥对 + value: huks.HuksImportKeyType.HUKS_KEY_TYPE_PUBLIC_KEY + }, +]; + +let options: huks.HuksOptions = { + properties: properties, + inData: x25519KeyPubMaterial +}; + +/* 3.明文导入密钥 */ +function importX25519() { + try { + huks.importKeyItem(keyAlias, options, (error, data) => { + if (error) { + console.error(`callback: importKeyItem failed` + error); + } else { + console.info(`callback: importKeyItem success`); + } + }); + } catch (error) { + console.error(`callback: importKeyItem input arg invalid` + error); + throw (error as Error); + } +} + + +// [End import_keys_in_plaintext_X25519] + +let isKeyExist = false; + +let keyProperties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_X25519 + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_CURVE25519_KEY_SIZE_256 + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY + }, + { + tag: huks.HuksTag.HUKS_TAG_IMPORT_KEY_TYPE, + value: huks.HuksImportKeyType.HUKS_KEY_TYPE_PUBLIC_KEY + }, +] + +let huksOptions: huks.HuksOptions = { + properties: keyProperties, // 非空填充 + inData: new Uint8Array([]) // 非空填充 +} + +function check() { + try { + huks.isKeyItemExist(keyAlias, huksOptions, (error, data) => { + if (error) { + console.error(`callback: isKeyItemExist failed, ` + JSON.stringify(error)); + } else { + if (data !== null && data.valueOf() !== null) { + isKeyExist = data.valueOf(); + console.info(`callback: isKeyItemExist success, isKeyExist = ${isKeyExist}`); + } + } + }); + } catch (error) { + console.error(`callback: isKeyItemExist input arg invalid, ` + JSON.stringify(error)); + throw (error as Error); + } +} + +@Entry +@Component +struct Index { + @State message: string = 'X25519'; + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.call_x25519')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + try { + importX25519(); + check(); + this.message = 'X25519 Result: Success'; + }catch{ + this.message = 'X25519 Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/module.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/module.json5 new file mode 100644 index 0000000..4144486 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/module.json5 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/element/color.json b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/element/string.json b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..7b058e5 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/element/string.json @@ -0,0 +1,44 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "ImportKeyPlainText" + }, + { + "name": "aes_256", + "value": "AES256" + }, + { + "name": "rsa_2048", + "value": "RSA2048" + }, + { + "name": "x25519", + "value": "X25519" + }, + { + "name": "call_aes_256", + "value": "Call AES256" + }, + { + "name": "call_rsa_2048", + "value": "Call RSA2048" + }, + { + "name": "call_x25519", + "value": "Call X25519" + }, + { + "name": "call_cpp_import_key", + "value": "Call C/C++" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/media/background.png b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/media/foreground.png b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f 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

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/profile/backup_config.json b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/profile/main_pages.json b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..870c2f4 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,8 @@ +{ + "src": [ + "pages/Index", + "pages/AES256", + "pages/RSA2048", + "pages/X25519" + ] +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/dark/element/color.json b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/ets/test/Ability.test.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..0f8ce9a --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/ets/test/ImportKeyPlainText.test.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/ets/test/ImportKeyPlainText.test.ets new file mode 100644 index 0000000..cf0e6f6 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/ets/test/ImportKeyPlainText.test.ets @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, beforeAll } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function importKeyPlainTextTest() { + describe('importKeyPlainTextTest', () => { + + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + await driver.delayMs(1000); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + it('testImportKeyPlainText001', 0, async () => { + console.info('uitest: testImportKeyPlainText001 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('AES256')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call AES256')); + await button2.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('AES256 Result: Success')); + console.info('uitest: testImportKeyPlainText001 end'); + await driver.pressBack(); + }) + + it('testImportKeyPlainText002', 0, async () => { + console.info('uitest: testImportKeyPlainText002 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('RSA2048')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call RSA2048')); + await button2.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('RSA2048 Result: Success')); + console.info('uitest: testImportKeyPlainText002 end'); + await driver.pressBack(); + }) + + it('testImportKeyPlainText003', 0, async () => { + console.info('uitest: testImportKeyPlainText003 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('X25519')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call X25519')); + await button2.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('X25519 Result: Success')); + console.info('uitest: testImportKeyPlainText003 end'); + await driver.pressBack(); + }) + + it('testImportKeyPlainText004', 0, async () => { + console.info('uitest: testImportKeyPlainText004 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('Call C/C++')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('Call C/C++ Result: 0')); + console.info('uitest: testImportKeyPlainText004 end'); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/ets/test/List.test.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..8e28a7e --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import importKeyPlainTextTest from './ImportKeyPlainText.test'; + +export default function testsuite() { + importKeyPlainTextTest(); +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/module.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..c3fd9dd --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/test/List.test.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/test/List.test.ets new file mode 100644 index 0000000..f1186b1 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/test/LocalUnit.test.ets b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000..7fc57c7 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/hvigor/hvigor-config.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..d584c19 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/hvigorfile.ts b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/hvigorfile.ts new file mode 100644 index 0000000..2a5e543 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/oh-package.json5 b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/oh-package.json5 new file mode 100644 index 0000000..e41bae0 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/ohosTest.md b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/ohosTest.md new file mode 100644 index 0000000..ca78303 --- /dev/null +++ b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/ohosTest.md @@ -0,0 +1,11 @@ +# 明文导入密钥测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| ------------------------- | ------------ | ---- | ---------------- | -------- | -------- | +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 点击按钮,明文导入AES256密钥(ArkTS) | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | +| 点击按钮,明文导入ARSA2048密钥对(ArkTS) | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | +| 点击按钮,明文导入X25519密钥公钥(ArkTS) | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | +| 点击按钮,明文导入密钥(C/C++) | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/AES256_1.png b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/AES256_1.png new file mode 100644 index 0000000000000000000000000000000000000000..282e89ee89255c5d8f2133f102cec0fa9aaf0af9 GIT binary patch literal 22071 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 ZU~KSj&-4B#&k_8a^U41&9ETM*@gI9Go?rj~ literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/Cpp_1.png b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/Cpp_1.png new file mode 100644 index 0000000000000000000000000000000000000000..37c4ff2f782869fca305eaa18bdadf98e4afea59 GIT binary patch literal 29551 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 E1#s2qX8-^I literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/X25519_1.png b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/X25519_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b9dcee267bdda62a17806eab8739e7c96d7a771f GIT binary patch literal 21929 zcmeI42UJsAx9>MiI!Kj{N>zFj5HJcSAb1b~=}meQFm$3AD8dc2nn4R zmzO$!QC3VyNLu}ptfG>ts;a1zrjCZPw!Dg}@}Ewq7#SH^m|6H(S^1PN2whPA-)`hj z00#pdK;2J6brGQEprYZRB6k3yr{9x~>R%i1_eMocLrZsto`I2x`E)@2S%8{~hK8D! zhK`Pw_H=aQ>2ZLTgO2lp(v34*rq1*iA>7JOlX4lvbU(E7m9VTY6?F~Gt9rkI^$l(s8kygaGzHGlrn(fPIOTX)ak(D2CU*!ToyZhm2L zX?bN8w}#)@-P|vvU6k}2gx>(%g-@CcUcW9f0FG!NY*vv0y_smxRtgyq*sKc=(U7I~ z8M`w%1uwD8|1~@|GcqXoO26!cZ&5d9Q^+X(S zl%p6A=KXGU5K~{3a&yY=FdHy8JTSYVw+2D4To+#A={rDobkD_~xs`$$3nXn~RQjBT z6R&H6(xA0-#`+7E+ieI~XwMK@WaYA=O7hh^XL>K3Kg&p?bIJF`!3zbpiaAK}AK)3R zV2{d*$4?gjE{z||W(rsTmB!_J$_L*;z zpR>eJeq(~z1?w@{asE%jy$~c^5>M9^S68O>onh~Yc{nARUaRQB-8a@`fL&u@Jp2;@IL8RzCctI<5`**7i?m(ZRAETl8&Ys>Y z^SNm!aFy%A^*oN9@~+iS6+CPzpRr#7JLG1z(H91dlB7mL&Pxu~X%yE#`oqz8|JCAk z2+Cvdx;P|*7Gq!z4w}KhrO809#~2wn<4OkN2Tn@o6N$Wjux$^}!4%C^0U0U%QMX}_ zmb&H|U#)fBw)>Jd&VOMklVQu5B?zCtx`;X=gnFw+z5m=2a7(K6YcTRBdJG zzROU)h^vi}z5Suhn#mMv0wi{9IK-ob zUBUybo5t=nqrCDH+KVo^UDsNS50{_N>4SX2**IRn`{x&-Yq|_Q8e-=)BwLye@1&l0 zJ`*?v-Q&w)`y4BsL;a6dHe+k+WOFMZk|hwUOv1bI+e68~{#vJN`1>x?;bYA(*TRpc zlehDf2bF*epeu@37sT*6Y`i4i%ywSes^^Q%&#=a+_TowONpBG8{aJ8L9QIm@lX=_l z%a_pvgE;?snJMr)J50GWn^xL-gU~)Hs<|azrDHV7&g-%05l?D53lqXGZRIVf^Cd28 z7hPrBi#!Mj%K6cp7`-3m@cSiB!N!!lH0`7(%B?!9G&!U9)o|K6-o-fe2c5x37n_=$ zpOrN%hjazP5dQTmB0@t;AJVL98$`~f$Zah~KdxcV3dJWS&MoZrLi=7zmdR(tm$wJd zEzk3xclrJ#9F%Cgyr)2Cds1eLup6xKNM0~a^%4PFT{9O-EPgCa6N`u17e^N=cg-$2 z;QG=Lpe^>6lgL`fAxGbNCp!C??~;hZ@E{{3()(-$vC+z6w&8o+{;JcBQG)H^rGR%j@61nv?~LzlSb8NNb12zkt^7*&|-~Y#*4mi9o^j67qpwG+c2B-OIYJTqzy##3&Br%J+a}Eq;>PURy;3Cz6hDPtOvZ% ze;Ta|8GUkb2((z^>qKBrBm>@KI)z@GzEG1G$(jI#yEUU8@IKRaHpS2rHjuW}L%%t6 zZFtYG4pE;eLT1SGZ#(z~!H6mN(7ShThd8DKaVHo$x&14xHfG_kcs9mZ~ssN$yT z>1LnS{(It?l#}ROTW@$6f)G5hd>`AA40T(mssJp;U#(ZHc3ZmRFAP*BwVjtdgchT_4T92st1F)Bv&7=WUD2R8gh2m6@a z!$P9e;xK8CvvSKwv!GXuNWN}OdOveS|?EcqpU+> zL&9D(W(xb4NUN2%Y{@`!=3F9iA%qO%SUJ9~=LyPUu>^0vB%rx)P&6hq@}-1{lt zeF&P5C;&XJo$D2I*uk3D+QePoi2NBxwWeGk^w5gKx5UPv1YFVSvg1wI5!TYJX)rw+ z)0~k;|2`XsSaFzcDMFX6?vCFGzyD*wwTBBbaeO^c@#ey{eS^E(AJuIg5x&KJ_a%lL z-0D*9Xz1qio!_So$ziMmot6I}H&u=dvT?Ghd9_h=K7~cOfTR7)hewQL;C!zbsr@+_ z&=(l%59Y7?UWPqd-$JgPE7YF&%|*?^^reL(WDNhFH$w!KuP+x|)+)DgvFDTjMpjSE zZCzeVe(F5Pa>HBYGULAK+bdS!plPQ#)XMq|GVsY8b2kH%k4Cwfdtc!vN{qI*Q1ne{av8k}d6cHspA#jhLqFW*>4LG~z(GT8p zy_ejBWy51J7^PjK6CQ3$i-sqvWf~vL?0Rh(c5Z*G%GNh|#8g`nu6}#Cs3v26o(%NX z#(-H~1-C!hM>}*iZCz)a>y=+IN%&$@kKzF$7Whv?xsXEIQ=4m)A7+#*;s5M~H% zf*UZ8Bl$2$ZRjSvDgW+ZMaXL~vW3OfhS#*dI_%Q76EErwZqw^@6#M%*xT|jVowZ=F zogQ)df?JHD*&>f|Q|q>Kc(vl#x~Gx%6Io(5xCuLv2X4X^C^YoBG2R_nR_=ow z?Qa+lMyE#J$YS{M#62l8G;Wb_4A!FSi;CU-b&w8`C}^%vd#NUqO?~l}Q?!MIft58{ z0=nDPCQ~r1ZSLwhi+g0u=6`>5(*C@8U8BaQmE09>o7m+go-W+9+*s909qVk%s$a2N z?-z&Pbj3J!IkIMHvMkWt2NlO!Aw@P=T#%1?#_Mm@U$|qV7lF5LyY#@%Rt&-Sylkhd z-a8ob=FYWb%c~iGmmSKF(iD|Hw|guj)+x%hXTpk>DEF1m596YPYdNPpmlD<5qt|w= zjFhfr&aUS%upTMjlapLAAC}nJ@EZz3Dn|k|P2x|k)psFYoeO;fE?H~i9xhk4F?#x_ zFX4{T99*d3;C*L7cKu|+4VtZy1a1EPcd zR1CLAin5DoQ@eU-K`fFi%J#&~KA6DQ?c$dnv3+E~6fX{$^cDC7@-vUJUJ#?^*{EY{ zT;F=)gNh2CIU8=M<{+XaIjmY1>|K}s`)YX*dIBpY29J*mAyB7FXMQD)v^}3&>fgiO zO*0$5cqNoqv4oG-ukR|I>A~a1UOf9tH7(fl58+P6F;mkqbFT>107A*;o0O0z=%wo_ zFG+nUq--ke?zXv)ZRY?+>S_T)H5j8YCPg!&O^Vo5kiy^2ox1^X^<+z_h-N1kF4?4{ z*u9hg_^9V90qtLRU+@og5plfdi%nSxyj)R|WMYuAooYtJ8?`cZ<`$R*5%xs+0A+-i z+e+9I++f0tq<)!V7zJVB=#oAL5ID(Ql(br(Jc#1uUBWYABbWUGOv)x7?iaXN53z|svHNQa!P)F)!`cB4=Z!;Wx_LigaF(4T$ETrOta;rVew3oJ zj`Z&WSN$Zv;hNRrpTZQec3q6HEx$V|M2jBjQa)2KH}ID;8(UP&UN&nGEIg@+pCd6H zeM}oHK}T^GVqY z60DsJB;np!rIUfrlVqSolw?c>2;8uL({WvZy~R5%|NrBDsjBn!xqI?;-(w8Q0~wVL z=bJagI-s{3o2ow=3bFiw?pYvFM^r+`g^cN-Z@gg+@i24t;E?ii1OY56}cuHV=Ld3q1 z&;{zJMKfs^;dm=KFx}s4v<|BkK)-tK%_q+JmEPSfuC(^~ zI@Lc$Md=QZ5=W)tM%SM9>dlKDp8cpm2K-Qa7i``qhipV@k^#0`8CM~9L&ws{K){Em zdB`j^YyAqr)=c3VZWkucgT}oI2lMt{snb%gjcP@LtqdaTTJ`iFzWsUibWLeJW9@;= zSY1eC-S$-5)1b$1)*E;S)pFbqbM@jRABwOKiT)f}C^KP~Fk_FDBLfYOnh!ai7c${K z-|`C}J|aeB=@%Dz6?Y(;)n0y!6~8ExIe}R6Bwf^EaTPVUCD?{NSM$5GYWZNgqMhY~ z6Th?Zx?7M)lkeZDXpNX`&MD}*rJWjRsI&aiW z?`|ma+NOb1<)ySSIM>5V$=`3aB`j8og=Jo5FXb;f@a%8}k5s8KzxHTJ4i{Ex5mhLxetShoHf$%k?v(d>EZl(eMJ2h01e_1Z z>Xn=|sP|fh%O>h?Ph!G{E;OfXKAIY%362DoBK0v1^L(;uP7JoEbI7kUf^RjSh0h6^ z5_jn5i15buW?4#X7Us1nsm*>xi0~}utGq=cgDpc2N2$kZvs1jwUe3eyRFH?N*8(xv z298RqL+n^mmuP%oo6vxr)0o`eK1|L@b}MehG4 zuSvB2k=T`79w&h4!au2ZTtwwx!PmuD66n3yVR9V8!zZubfXh`I|0rUGaZh^2rk;WSQ}jHf2J=Q zqBOj_{xr$a?_rq4{(k3VQ0}O-o!ccZiG%x#mEeh zxEvKf4&Q%uXsh;)U6+lW^a6BwH+Jh9w|-ZLRWghT!viu~C!MKMGn`$4t(ygoj$Y=~ z35}JmdVcN4Utzv5+jhy@I3(Y0jib_b;M*e@`_#!Qdq zje)5{I6fsIm&FN7%}7Yv2yf*MAfaUEfu+?&+Q;P9Mn~w+N<^F7BwtyL|cCf~w1Qf~6-a zu)_aX*(=!>4%;A}Nh>_b{C>nn2Bri0PP%lIx|V%KVn>{Dr9pOfGb_H2_5EA*n*s_e zc3R1RihmunpfjzbtbhhL$nhkh`nNS9)%+BSq-i_=5F zYkXs;{Z>{aZQE0qt z0S0rD+BfW;_G8lh@z2}zs1@sXrr@iPq9&JTArk5lbkLR0QvO2KQvz(U7EgP+8~N zuRWctOs2_`k4QVt0Wi-_^x(_C!lKdL;kxfSj@>`EoNb&Rca>brA*lJsLf*bMdtJ+& zS5QvSjH&j1KGzBtd>$m@wr@6NANy4DM)#2E{o>hw;sEW=f z$?TYaVYJ(;cRF+F*d)EAs>rJ{aX*oi{TQ^(0;)#gR_0D0|A!f|M2}d|D2NzxaJp*A z{!@V%aR6(-=8@Nyp7&pd(;P9A;EzSO|K=tC5Jg>-S!9FbHS~06>SPKPHavy2EZEeMyI}FKU=!`4WNK-5 z8kpX626O+pOGh!vIiN5=VSvH_g#ii!6b2{^P#B;vKw*Hw0EGbx0~7`*3{V)LFhF5| z!T^N<3Ih}dC=5^-pfEsTfWiQU0SW^Y1}F?r7@#mfVSvH_g#ii!6b2{^P#B;vKw*Hw z0EL17I}F&^uEgx2+4Tfx`W{UrjLYSjiw`yYGNqS=-I(E?;UWY6WZ<6tX)>`o!D&OA zU10+hCXC01UiFOIpKqF>IXxJOTmbo!ffvOA!~g>F+C-xNv{P}~PH+xO)wwkhMHoA> zL44&#UF`C>o-+qKL^@)CF};iVi)d2NSgMZ9P+7u3J{h>kgFcCzI86h%YcbycPyc9d z^Z5K|et+;Q1>19t?`k>&{G(a5D?{_xOU2+{r0RXFl;$6R<}Pl($|UK0EtCuz`f;R+ zRXJD@Imlti-Oe7Z;6%@7-(Fh|JB-iH?not^79OjiK8sG=($w4&md^Z~X8W5l=w-c3 zS;WvXZ&(ATy`3?so9&h)?Bfg9{=LeYSl~y$+8_HHA~K7wX5XYHJPZS=Dwkefot}Ft za`JFAJCMZtY3$fxkqmS-5c2%GOjLgMAO3L+JzD;=7TZ6m`|t_hI@KBdbib_35H1+A zA)KGY#?N;3`S>tR`<;a5UonYecasxiU^^yiTf|-1l7ku$^t^p^p|Z9LQCX^RFybe` zAB+}u!g)tVLcCAX10Ha0&J|r=wmGeimaNPT*>G?VQiOGzqR2qCTmvZq{^Y99|LHn} z-DBFCMd49=gCv^e&tW%$xcHWzqCO^QniEA1D}1DBerP*5FEAWm!-&5Th7S5>y0RW$ zm*}`5WpL4}i}f=i8?u>S0ge1$Bwg4vFDLRg6&iYqCo*r^T!4d6Ebqg_sv6IWKF((K zHoY!X@L0BSP>h!(J>*|eWRkX#8anvrMeUd7e+!y=ptJ@ZP>9{EkLg9d+{2bG!_qby zQqci^>_-OSmTyI;?gULH)Q=2Y=f{X7vPBmfxN|4U_SwzVEbB&L_-BVS$2L2QuNq*XOcb!t||*2cO4-2h|q#22XQp=Y8|?o@nMT zXwVz8cSzw1zms^Z^coQs_^-L|2Dy~d76aTYn^8Ka# I(2yto1>XR&PXGV_ literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/X25519_2.png b/UniversalKeystoreKit/KeyGenerationImport/KeyImport/DevelopmentGuidelines/ImportKeyPlainText/screenshots/X25519_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1bd879c518b65a62b35e6c3e7d3348ce07ed2c GIT binary patch literal 23528 zcmeI42T)Yewx$n)RUkSrjeC6Zgl=-^Fx-1*-pqY9b!XnIH+AdHV|T5t+SR*O^4y===i^5P%XuPD)BfdYPPzjEsVUoRXS>hMJ0sn)T{6ItC6lE=~?McJ>>$1$l4W z;^$^(zx(hWzmTw)m>3tYl$@l9te~iv$X}cgQBY7&Q&F?f(6ETyWWOo$Z*GL|06qC- z;L<2D(JkN-JrOZI5uppJv|K5l$5tCddB_pSxq&go^e+9TiL`-~%g!uAh z5|Z=Lf#<&iB=ncB-V}aBdQJBw*)2B)k@xXAFw(u7=w*ZOioSDz?YEAzyGYP zuB~ricK7xV4v&scPXD5d2q6BOtn=@`3Hw*N=+AXsA|W9rA^VFiqD$WAModp~`KB=G z)knHyFWs))5_wO~@HjrFx`TpS^f{XG)!Sc`Ot;0BcrbsF_E%;9cfvmWyOjNlu>YwG z4p0*lolhPyJ)i&_o!-rTNBN)D%CqP#)*Ilm@s24y!}BN{*O1};?~t6Wh0M%4q6%eS z@F&4~P2!Fk2iHpIN{+Ymoo_r%d@`y{+WfTIZdq>qBlJFLnyu)J!laTodJv2k@ye_q z6_au4t=T)W!n?$~AuY$ggzPXBkGzw$t&-O!lS%hybS0-Dr3bDB zwqwdU47BW7(H2w}Se`})*ZENgpEgSNk=ZG~Jv9BZNdV|Q1sG@KyIt)QdUAZJz3j4% z>C4+Gj*-q9U8l(rB@9>jcd1mVAa9;OQrd7ESyklt!#I3A($&8dL#mMkpL&bmhKmkc zjmIfUDWv$-E@`SP8=~8?g1rV{Bb=-Eg+vpibx4P9-nc?REO!s|@%ZBd+KMH&qOZye zi0cEQtFJeyU3w+6X}2T)Z0hwsJ|zwoeCPZyPV6zy0;Fv=`gL<8aJR6po7;|jSpO=c zTk;`mIh3wTBJ*aXgHv9*GCldoE$0(VLR*uiC?b<0o5t~Ov0!BaoPsON2KX`}o32B$ z|NP!;4pha#9>|Tn`yXVBSS#d^zjkd~+EZ9Slo>CDz}6@MFxI%-1)8-vkoC-_-HrSJ zig$j=1IufS<-Tb=#XrsZony$YA@dIAa&L59nam*h{u$MHQUaMw;Z6O|#sq*)av7Bh zY};4r8I6nkk1$q-6f7teZPuQdjoiLv7@TIWlfTSaSgO1%lZ<|5w8ik&5%zP^3)4L? zB!SFH!DWgna?~?gb_-fpy?^l9r1ArugtA3WS{qq``y`%s!t=(Ru{z13`hc&Npo56t zif-+%#}se7rINr^^_1Ng;F)&`K+fwa0zhg_0AhaON|14 z3Uhh|%j2{*d1`KcVzQw^x@W3RD1X^YArQf-+m*0tkgt(8JgU?!fyuwpXMBwqv$V|cWf#Cw5BeJ5W z07UtfkE?Oh)QjeJ`@GnW!h1G~GQVSd1ZU)i-M+8u3yO0w&W-rrNqK2|xuQIVO#mG% z@*DiT@wKS>Rt>6XkCZO4R!n=e3;K zK00OOR_K#D#^+4eNdR8ez;3?R+p59t+8tLxMKgU5P$mrvG}|7mDY|HU)nG~JEhX=( zb~Q0@_TJWH>vCsmK!eD}q1W<{ z-2y1~^Uma>z1VpXVXSPBFWBUl&4evXxBjcZV(YBZZEBM@bYvKm`F!YNnN>YV59Mc2 zK4$JHGDO^0x;kJTzrWKBxLH2X_=4UqG{&-*L8V}#tGK13U~mHn4jKy3SS(9Bv4QP_ zX&nqFhi);p8&PhwGM%_(HZiX26Ac}wbi%DZZ9C^AA5?g1c#0tUN#5Hk_x1Na7mdS| zvmPj1J$|5D6=&EMWjIz@c!eU`|4ww4x#z*ERL8p6JU2SpZ*HzF59BYAQEC=bJ@;62 z_f%+^J8_|@{LGbPVb0MjrR~<#pYh3G*uEE6K8*^kX-SWgnA%~JH9`0e3<21ZUahOR zr0J@TA(_uz<>d=+d@;GG6tPSQ;<;!U)vFs{SJ2JPw zqlI1#Z(rhK`*dcMbvOuVA^=8^*E>ra?gz+sl8svjbXV7#+anHI3?XOo8DdO^<>b== zwQbM1^gb(`{%9Tn2tZ#{e()3*?(5`mksU6tz|#06(+d8=$9q}E`yOj=P`#DnSbNnz zpQh;W9)37Yb|}sJt@g8Y&x34A_-dH*!Fp~o2&XdLRiIdxHAp7k%088Ty!@le9^%K1 zm_;$~2y|EpR6bPiq1zswXM=_{fv-6*H^)Mj5NXCC-F9BK>B+>7i|!*q-2PbmlZr() zS8c<6GWFD2L@if$?@4^DoG_k&D2Mqpp8$C1l`uFfwuLa%{oVEYudm;KOW%kG^AN9o zSac9Y08|P*>*JAu*YH;r=w{cg?9UXkYL8kTZoxa6ZTze&07qqffx;YPKgeoVFF=?8 zn7g#^Q=)!(RDa!XD5d8HzIL&FUPzg3w(tn2CYiC9$2l*i0LAg4e1 z1DbE?PQH&_WE4Kps!*`o%@=QEGKZlwU|Sw1Lm!(#<;e-9WaRqRB%Il?bwm>3$jg&F zE%nL6AU>3Yu3TN$)toT>50W<~AG}xi&6*!PEfl=gX?jWo&K`Q^ygiBbX)nGQpt0j#pu}H>TFsi}!8<=74>j+{KI$WD=Kz_$lReYIu)F!dCx5_U2H{#3!Y^YdDl8r=qyle? za^LrC%wRad?(SZ)Qn^CX(d*w9t}P(M>yk}FKlbpY zsT(tCtB`o=O^=e|7(Zn4My~c;_3;~?+2)+*lGt4`CV`C1>237Fur#ls=Y z>;e{TaQA7rx}@iGN>rWwmt>&wq$KrSDZ>pEUUZ_M?~Gk*0!u1X}vJh;h1R!EJa~sv~W3b^KO;-Xl^S3z%v;j zW+cF5A3dc!7zeK}uCZiqAO#EjSLOI1u$`^?^IO#Eu&zLT*DJMIZ#^YL#z8S7VPr6~ z`V!9Q8BCxq;(!mT`1DmQD6V)cY{rQ2;tlS`dqzMm({O32m?0ysH4l3Qd+5|&7k0g?>%$RRT7pw%0*g27| z5SIzd-ajJ%?@OhT#42TF+{TWu~YDS8_?!9@@t$ zWsTdxH*i#TIXlR+O?U)y&peZJx#{39$Gxc?;R1nDAf&>x4GpdC3MqIpA|1U)$v z)Uwp7!|oPA8tl%V*aH?b3isq2m(eRNybBBc{yb4Fl5EdSWnwB)cR5cR?d}X zpf@1phdP2@aAH7oIo%zRHJoLQbftH&yjMMnHE=FU8V|w6?socUZiwh6HI1}4qK3ul z%Yv^sNPDFa0P-%KIaTXVtJO&#u7CQlMP!Z}6VBQTiE%CR3GWUP9IFomsatSqk9qgg zv}n}~%9aZ!7`@BmT9xGhV3@g>d`=3Cz^vgfo}uoH{Jk+odxQZ0X+3% z$Ttad_Poa&eW;BmrpjMpUZ>EQUlc zdalWVplFFW`S*(%e9xK{)~|GaBRevQc-0=Z8N`_8p0i;}0OFRQ69U+ZYic@&!YPJl zPgcu6UV6ja@Wwp^WsxM&!99faE|y5baCJb+Y`y)gHAeRRpDggL2uZTC_Ph;zUux7` zKh+gSZ*1QH*X&87jrV6fKrJMxr?_~P_E5;Kf?=2q&!Ou&t;gX@7KT)Thlck&1a0T@ zULPNVNq+x6CDu7^?}SH;Z?k*EQ(x-V7#WopkR~AQ~&qU+@^6ht5eo0{| zmi}2)1$<6Hv4iPKJhBO^oxiqT++Bj`Nr49>-qN_9{iCLOAf1++w0_?gs~Jq2CpVmE zotGTt{84M(={-8gfim5BSd#r9PlKq-=N10UA{M^E#ihagDLQ0}%@%pTOWrkAm>$^Q zru&1asvqC6LPGIhr)Zt>#`3Rwjug3F>by%?kj?OJAH2PeWRR;I+uxl%%S*U@eh{64H>AQ9HlZYEA~>_Gd`9t-j`J)T=CLf;`l~y zIbjQxDEDGZ`@<==g3mQ=o6`l|;4xUP!(aP|Z<$4vgJqTFsMoI+$s%j? z65L(BCgaJcM3?B6KO_`=Ej>IYj;Mtl53Ld8Z`EA3a92*$8%=ov^JuAuTJsDH@{c{3 zGoTu^t8_U1G=&Z;@(%|4R8p0NC-Z444ZJtY2SFqm^)xYzLzV5z{jNm`W&*dB`E~8K zA0+(z9_VJ!Hi&ek^l33|hKb!QUx(L4NN+Z)nX&>MG%eK!r+Qf7rI?pH0WSj7Nz_u| zJr5tKL(5oIFWj2tP z9okBcB-XMM0B1#dihC!eG87`12h~P$`9}UvHALpAtM?!&M7I2lUYaU`DFHR$UDnu z)r{xr-wU>h`6HS@HgsLMhiHT>Ykm0GzY~r`ozAy|^5Mrmb0&eA@cwi)u#nW%zH9H- zdu6k_)=2F_U0ucNt6S9Z&jO( z{?z+(6@N*pQU!(Vjud8Uw(aViR44Jp)>?SHkxbp#UxedZ(kH6F+-=cP7ad&#ixPm) z^8|^G0yd2RY@TNw|Cb(L-Wk_*Y*r)z5T)BP=iS58VdI|VwvOPLR&k01VAquZROS6$ z=YNbB!cY7NR#-ewr0fsy{UiWOF2Un;1mF$>uR28$S zZ5Q{X6vWeIGop7U!6IJJ1FF0txTa}1yX@!*8%xzURj1hnc z-cRLqAg_kTU#`za&2L(hWT9@#$Kd_FQ6|o|9?8h1twLjMb!wY?SU-abrm@{+lbYDE z8J>*aG*_QCsr1U8#?l6bK}A&?TbeNJ$)<6iHeHinV1|lvujYmPNVkp-GARZ}Bs0mj zGbYU)LHdIPyMJ|-KLexZ5Srk<;1804*EMUK&|Xk~F`{jORxnS$)H8?}$kaIl60%R# z_kzOBedT1BVsH^-%JvLI_W^5m6*r#1!=<>AgQ3HIvScOz4GX7N$|uyN58KkuGpIa6 z9FnCnpuzKu!1VWDW?F3J+=empL$NcI!k0y{=6;5iC5vZ+uGhK?OyZ>Z^4j2*IeBvZ zhaADD2Sc8cj3~JDtf`O7f?`vkyt%xuA*;p=9}u zwd!Wb=ZC|u6W?&d>pZlXRP%gXoMjz8&pkbocR{^xmVfuQEzj8uL(Rkn{wN@;>}<^# z)1TfU`zEFs=Sz&nX`36|(_#s~UotZ=Xdwa9Zq*XXpwe?(w^*;l4F<8HU83B@gf>jy zH9}Llq@0}*pQZrp7OHPKuBXY0*1iIaNB^HOP;NFu(EYYLlxSkth6B< zbb0ey!mn<>F&ElSIio^aIkF{lgRT5z<|C%J%RfJ;#8ks>Afddf+LT?cvS!XSy8_kx z+*$UIxapd|ZulO2?*mIfTM|xBk=y3JiG5=da_U1YtOEwOlTMx+tt_O07g_pLgrdA! zTwS^t*9ZUwn8ngj;t95bZGbF?jEn$0=1TJI_RgZ@wnp;xD}*{zW|epn0Ai!me6)M} zL5UOy#7M>2qRe2_k@cEER~h(c+Z!u}y29pP6$j)~0`|Y<6&j~k_lWnv+~5L1=iJu% zWVi<%L#gig5os$|H|O;x^nBr{8Wlq74n=h*IOm81wXw@@W2?Qf>sJA#OC5ewp^fOZ zYx-1f5OVM4`#$dC%2uC&UY)Q9TR2LN$16N=2-VG)uXH;v-0?n@@{xxdOY0L5kqIwn z1t_QTeON(|WxM#1XmKN^{&(s`=s|rs)2Q*KhQnfco&1;Y<#r{@lG{YbJhrsYR608y zIAGNxwdS>+8_dyy+5!GX%*wX>G^9|IV_oU(11Y2XTq)y%@M8OlTe z+@M81v2uK-O)U+uoHNFOuk%BQH`Br4Zd{f3|ExwibB|Su;pkN3G&ORfB4lCQRrodD zY}85WAN#W8tI_%SQ!e1bsVS>(!d(;5=6YCWi!H=&59tRH0-GNFVo+_3D4l9w*@@?W zSg*76z0{m))xcFaxE8@pdaVl)9KR5GE`xrFv%A5f#teF=6%QP?1S-#3te_3;U)!qn z5@!~)ljp$Dm@I100y@@_0Jxq#ge!RU*Z!QDVqYa2t1iy1(?=GrBv&qkW2Ms4)AczA z4ht2g9hy!MFv+~MB2T0i5K?DpWe;Qkc636Kax&JYyALqUvl{}*(~0Z zb8D$`mSp6JSr%`DH(13pqvu8<#Kk`dJ)a>L9g3w7Bx~BT#5g-MW|SL_-cZZc`IJ}1 zxVYNb*ON7YJn%o|9M%kV37R((h_KI%JW*PI{7(*8{u(fqI-1&Mf^81HtIDg|t;e}^ z{MjJNlKtH!$}^F=&kg-Kl_~>7#+~L0#=crU8oznd#%e8?ZlDoWA#vItIcGAfsOrGY zhefTO^3COBO?{|WD+!{;pls@1?`ZDgd4G-@!NiPIPkRY~Ry)@*Dc7{s{vMhDd zNGG0RPn>aoh#|NuVd+Gk^7%ofui?U`57VIcz74O*+Q2 zZ|1wMDR2!y{UTSvSyQR?lErxb`B)7V+P#2<_j;Nz{{5)iwKbuyLS<<4PZMV+n(u-s zpT7+l^R}yIDJ~N@k4^K1a{t42&-_R2!nyEsF((%cTrhCKzy$*r3|ug9!N3Ir7Ytl5 zaKXR@0~ZWjFmS=Z1p^lhTrhCKzy$*r3|ug9!N3Ir7Ytl5aKXR@0~ZWjFmS=Z1p^lh zTrhCKzy$*r3|ug9!N3Ir7Ytl5aKXTTB?ihX+`Ihj!gFGFR^^>~otS>zOK?D(6^A4% zWbZ_}Mx39>3$79jUb=qv;4qUcL$t>aW4`nL{6Mli!Y!+w0Q}H{;2xft zaXIxuTpz#&PtL1e8buw@u_%Ni%o5zQ;mYn#H>*B{H-3>_`}lJ?bSbW{2{p)>v_8=r zpi2PaDOd4r=fybpOYd*m|HC4c=Wkf|xBwjzontMOVT2t-rv*3?f2MppXFAg!3dS%s&=h^D{D02435<{q#GG zW88g$R?|?GYspGw)lc$pee*po2#V5b3Z{Ai!VB&OFC)%$C6R3d%O_@xMOzEd!9UEe(o9$x3`*m$?jdl2+kVXpcH!wzb{!%r5byiBr!^)bbuL{45 z7YM*K)A^w}Rc%EM@&DIFu53`5>@Zm+YKLH=y_YiCO%c)ViVO3q>?Jt5fXR9Wq7_cT zD$K_qF6XOiv``1}q3SUFjjPBTiFxs2)?rK9!;MF}lTi8p!?}y{Id|14^RfKe1l7WZ^zpDQq#JJ3f3GdMsDVZ4KfgE9_(omG1V>i(?lMwSCP z`;=~P)2`PGKTe&;_Y?*X5rcM+hHzY7E1!DYcCpm9s_DjBHuV;rYPix^UQMKG5=1Of zn|C4AP$mO0o1hKR`cP;8kE;R;$-3FO1ur@~j*T&=BF$8dmmeit$A-**4S4A!?ZAdP zb#M>Hi2u@6WdDUpCoT*}UfUo0LjWkta%QzlkC$~ORMLt~O@m)|I92$&yyQo!8^5Eo YWO3iI2>konod1^Ee*cNa5)o$p8#bQsH2?qr literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/.gitignore b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/.gitignore new file mode 100644 index 0000000..d2ff201 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/.gitignore @@ -0,0 +1,12 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +/.appanalyzer \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/AppScope/app.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/AppScope/app.json5 new file mode 100644 index 0000000..f2c7fef --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/AppScope/app.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "bundleName": "com.samples.anonymouskeyproof", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/AppScope/resources/base/element/string.json b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/AppScope/resources/base/element/string.json new file mode 100644 index 0000000..d2ae0e0 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "AnonymousKeyProof" + } + ] +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/AppScope/resources/base/media/app_icon.png b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a39445dc87828b76fed6d2ec470dd455c45319e3 GIT binary patch literal 2777 zcmV;~3MTc5P)9*YHQQH znh@I(s7WDIN`nJ+5@|<)iZcg=qN74U#DNnD1Se7u4fs(|1ivr?9ayP|B3iYCD$mfQ zCQ{S1n2)}^yxe#1J=_0pt-a1UPwQ^Z*?X_`Uu*sM+8<}X+baE^a`3seUF}?bEaiMO zrD`Qrd5@qw^epHZ>Df|p-qKBUEB%*?!m0{PHC6j|RplEgR~PkM5a^}N)Sfwi>W;Uz zdhwo_4HXBU%kRl^w@&7iKPx$e-n9%#IU!&oMI~iNsw0n19qSX;dS>I`G_G=WdcN9r z;_Rtv9XC<7kbL+HHxJ782T~pg05t)tf^>2vNJqfYt{YmqQDoBxkv+ra*BxxhcuK2v zm5%@Y)biQz)R8O%e=o%n${;ojY;EUP>`Qj6Cq)7GHm)C%2%^+hI;Z4T#a|oKIvshv z5H%!I+|I4PEXaXj04%ybsVolr%vhKnW7AEhC?eP!o1{y;8m2R#;}{6VZPc!+)ou0C zVWz$|1#2(|L5z%EYRxOzP+uLB>qYGuajX-<#^u;Kw&2uh&93)h>nHaFA%{&2PW=Nn zr?*a;gk3xvRhQIRa1de-!r(ss&?tRmZ=L2FMkhxI3lK6Jn<>5c*ID|@KU#^MCIo6> zpFA{|R(4fsBwHIW z9v!7G|7enadv4}~*8q_h%tD^j$7=PCnn0=dR0GKA(fgb9`2IRg6ksBIo+Gdw#|-3eSe=3tmDe zIqVN)tScM`0W#Z>2wc>~2Uv=3L)~D4gXqZtPQ8rifbYJqwkG>bv}95G7+};9Br?hF zWSa3b)X}z#79W9kukM%6-b_54WDJm~Ub=gsrJ0lz-8&lrQ7zfK1qzuZQkZvcE3|~S zZWmk0ETaNIHnMALn>akuvHLf5c4`y%!f+u>ZGp%@q_;T!`76_snc_?K;Wx%YpF;5K zw^F+BCYUPy`fpRif@5O@Im5cf?evD$>KlAgX;D0*HiO0`Yg3j;R4jT(9h(L_TsY6yxk*@ZBe%+dMqY=cB5oGs{D$QwOFbH)G$iVf<3Olcd7^#fr- zM{!ILWt#coT)s9ySkwDCPHv0oww8g8K%Yr{aR}msELVX(}JQr%F4Q8=KKn*OjSO*uSp;JK%GwhRF_K??vGC$ZqmJX z@+}8sQ)9Z}3*DiWl+L_7OXn_^{SW~2&C*b^;%IP!j$lkre7H&bMR1}7aTT*G8P}|G zHM1)hZDe{r_E3{{Y=d}}_PxJO_w4MaE4)$<<3JwzPdwPzfNemK(-X;{UCzmVr0zu5 zEnT}fzx)oVd!*W77`1Ig`DFcZ6TkPaI$hO1+`cGb$({ukz&{p4Ic-Xnwrg-KEkDqW zW3l$7Q`V$!1T(=QL1jgjIachdr75>-8>1A^h+;rTrD^nnwf?bw(Rang!*16Odj$Pn z@)JN5&5w~}ae6d};oa|&G>sT!)ixE#5;QW(u(=bqYHXcOflE%@t4A?n5fTUm0F~8_ zwpoz9rrU`@G=vsNjDRY(CrF(jIjqg8bd|CP02>eFag7T?u;C^ir+Z7YKmBYw;%%XdT2T}a$X4yR7EI;zaof3a)5Z;`OwVi%D?gbkBj!{;z2tOBSFk&E1DeiZXD**uvNqL}+|pO{ ztO$}2NMRit2ddU?)7Prq&*&H3X>&=E{-+j4iUz zrvL;?0$^@lyl=LHz9G^$SJV6ID__@7z->Bh>Vm=6AK&5bP%@heveHja5F@agGgUsY z@L@W2+^*NVoId0!kS~4XkWb%y;f}XBf>S+NIw9aHK;vN+4mJ|em)_QjIVfb2$;bwv zDKmoq6AThgKydS6Hs+UpKPWq|UA}s=UOEBZNM3oNT5qTAabY)X>L6jxfGDuu7&GD_ z=@@m?sJ-o2GS}&hNRW}-zHkr>o4&138@a8IC-FjSBxzjx?(*3@YmdmWGAd%0QvXzS zJ53JpX%Fp!=>v&`Hd7F@+Atw2vx9%^2M-APg0Jd|ePsRn3*B$#9Z5hCou4fo7W#SN z#}-@-N=##yQDh26pNzr9f*Q88krhI5@DHcf{dU-~PLSs}MvI4s1i|<=qxD~9`7>*~ znlw5lr$_6mTG4XbBNF_79BzvZ!TeIP)exdk3)kSHjYdW1P10ZJ_NCJSlrCuIU#gqw f88(SSw!Z%ZUzhC#9QlKF00000NkvXXu0mjfG$}gK literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/README.md b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/README.md new file mode 100644 index 0000000..49d78e3 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/README.md @@ -0,0 +1,92 @@ +## 匿名密钥证明(ArkTS) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-key-anon-attestation-arkts.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### AnonymousKeyProof + +##### 介绍 + +1. 本示例主要介绍证明密钥,证明特定密钥的有效性和合法性。 + +##### 效果预览 + +| 主页 | 删除 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| | | + +使用说明 + +1. 点击Call AnonAttestKeyItem按钮将密钥别名与参数集作为参数传入huks.anonAttestKeyItem方法中,即可证明密钥。 + +## 匿名密钥证明(C/C++) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-key-anon-attestation-ndk.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### Call C/C++ + +##### 介绍 + +1. 本示例主要介绍证明密钥,证明特定密钥的有效性和合法性。 + +##### 效果预览 + +| 主页 | 跳转页 | +| -------------------------------------------------- | -------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call C/C++按钮将密钥别名与参数集作为参数传入OH_Huks_AnonAttestKeyItem方法中,即可证明密钥。 + +## 工程目录 + +``` +entry/src/main/ +|---ets +|---|---entryability +|---|---|---EntryAbility.ets +|---|---pages +|---|---|---Index.ets // 首页 +|---|---|---AnonymousKeyProof.ets +|---cpp +|---resources // 静态资源 +|---ohosTest +|---|---ets +|---|---|---tests +|---|---|---|---AnonymousKeyProof.test.ets // 自动化测试用例 +``` + + +## 相关权限 + +无。 + +## 依赖 + +不涉及。 + +## 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.2 Release及以上。 + +3. DevEco Studio版本:DevEco Studio 5.0.2 Release及以上。 + +4. HarmonyOS SDK版本:HarmonyOS 5.0.2 Release及以上。 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof > .git/info/sparse-checkout +git remote add origin https://gitee.com/harmonyos_samples/guide-snippets.git +git pull origin master +``` \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/build-profile.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/build-profile.json5 new file mode 100644 index 0000000..fb5a1ab --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/code-linter.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/code-linter.json5 new file mode 100644 index 0000000..2858646 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/code-linter.json5 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/.gitignore b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/build-profile.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/build-profile.json5 new file mode 100644 index 0000000..2d8b081 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": [ + "arm64-v8a", + "x86_64" + ] + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/hvigorfile.ts b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/hvigorfile.ts new file mode 100644 index 0000000..e4f43d5 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/oh-package.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/oh-package.json5 new file mode 100644 index 0000000..118bdd4 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/oh-package.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/CMakeLists.txt b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..2120cc1 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(AnonymousKeyProof) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) +target_link_libraries(entry PUBLIC libace_napi.z.so libhuks_ndk.z.so) \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/napi_init.cpp b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000..859f3a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start anonymized_key_proof] +#include "huks/native_huks_api.h" +#include "huks/native_huks_param.h" +#include "napi/native_api.h" +#include + +OH_Huks_Result InitParamSet(struct OH_Huks_ParamSet **paramSet, const struct OH_Huks_Param *params, + uint32_t paramCount) +{ + OH_Huks_Result ret = OH_Huks_InitParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_AddParams(*paramSet, params, paramCount); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + ret = OH_Huks_BuildParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + return ret; +} + +static uint32_t g_size = 4096; +static uint32_t CERT_COUNT = 4; +void FreeCertChain(struct OH_Huks_CertChain *certChain, const uint32_t pos) +{ + if (certChain == nullptr || certChain->certs == nullptr) { + return; + } + for (uint32_t j = 0; j < pos; j++) { + if (certChain->certs[j].data != nullptr) { + free(certChain->certs[j].data); + certChain->certs[j].data = nullptr; + } + } + if (certChain->certs != nullptr) { + free(certChain->certs); + certChain->certs = nullptr; + } +} + +int32_t ConstructDataToCertChain(struct OH_Huks_CertChain *certChain) +{ + if (certChain == nullptr) { + return OH_HUKS_ERR_CODE_ILLEGAL_ARGUMENT; + } + certChain->certsCount = CERT_COUNT; + + certChain->certs = (struct OH_Huks_Blob *)malloc(sizeof(struct OH_Huks_Blob) * (certChain->certsCount)); + if (certChain->certs == nullptr) { + return OH_HUKS_ERR_CODE_INTERNAL_ERROR; + } + for (uint32_t i = 0; i < certChain->certsCount; i++) { + certChain->certs[i].size = g_size; + certChain->certs[i].data = (uint8_t *)malloc(certChain->certs[i].size); + if (certChain->certs[i].data == nullptr) { + FreeCertChain(certChain, i); + return OH_HUKS_ERR_CODE_ILLEGAL_ARGUMENT; + } + } + return 0; +} + +static struct OH_Huks_Param g_genAnonAttestParams[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_RSA}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_RSA_KEY_SIZE_2048}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_VERIFY}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_SHA256}, + {.tag = OH_HUKS_TAG_PADDING, .uint32Param = OH_HUKS_PADDING_PSS}, + {.tag = OH_HUKS_TAG_BLOCK_MODE, .uint32Param = OH_HUKS_MODE_ECB}, +}; + +#define CHALLENGE_DATA "hi_challenge_data" +static struct OH_Huks_Blob g_challenge = {sizeof(CHALLENGE_DATA), (uint8_t *)CHALLENGE_DATA}; +static napi_value AnonAttestKey(napi_env env, napi_callback_info info) +{ + /* 1.确定密钥别名 */ + struct OH_Huks_Blob genAlias = {(uint32_t)strlen("test_anon_attest"), (uint8_t *)"test_anon_attest"}; + static struct OH_Huks_Param g_anonAttestParams[] = { + {.tag = OH_HUKS_TAG_ATTESTATION_CHALLENGE, .blob = g_challenge}, + {.tag = OH_HUKS_TAG_ATTESTATION_ID_ALIAS, .blob = genAlias}, + }; + struct OH_Huks_ParamSet *genParamSet = nullptr; + struct OH_Huks_ParamSet *anonAttestParamSet = nullptr; + OH_Huks_Result ohResult; + OH_Huks_Blob certs = {0}; + OH_Huks_CertChain certChain = {&certs, 0}; + do { + /* 2.初始化密钥参数集 */ + ohResult = + InitParamSet(&genParamSet, g_genAnonAttestParams, sizeof(g_genAnonAttestParams) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + ohResult = + InitParamSet(&anonAttestParamSet, g_anonAttestParams, sizeof(g_anonAttestParams) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + ohResult = OH_Huks_GenerateKeyItem(&genAlias, genParamSet, nullptr); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + + (void)ConstructDataToCertChain(&certChain); + /* 3.证明密钥 */ + ohResult = OH_Huks_AnonAttestKeyItem(&genAlias, anonAttestParamSet, &certChain); + } while (0); + FreeCertChain(&certChain, CERT_COUNT); + OH_Huks_FreeParamSet(&genParamSet); + OH_Huks_FreeParamSet(&anonAttestParamSet); + (void)OH_Huks_DeleteKeyItem(&genAlias, NULL); + + napi_value ret; + napi_create_int32(env, ohResult.errorCode, &ret); + return ret; +} +// [End anonymized_key_proof] +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + {"anonAttestKey", nullptr, AnonAttestKey, nullptr, nullptr, nullptr, napi_default, nullptr}}; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void *)0), + .reserved = {0}, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); } diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/types/libentry/index.d.ts b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 0000000..b9a785a --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const anonAttestKey: () => number; \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/types/libentry/oh-package.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000..2826cc7 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libentry.so", + "types": "./index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/entryability/EntryAbility.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..edc2839 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..b1e2129 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/pages/AnonymousKeyProof.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/pages/AnonymousKeyProof.ets new file mode 100644 index 0000000..750090e --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/pages/AnonymousKeyProof.ets @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start anonymous_key_proof] +/* + * 以下以anonAttestKey的Promise接口操作验证为例 + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +/* 1.确定密钥别名 */ +let keyAliasString = 'key anon attest'; +let aliasString = keyAliasString; +let aliasUint8 = stringToUint8Array(keyAliasString); +let securityLevel = stringToUint8Array('sec_level'); +let challenge = stringToUint8Array('challenge_data'); +let versionInfo = stringToUint8Array('version_info'); +let anonAttestCertChain: string[]; + +class ThrowObject { + public isThrow: boolean = false; +} + +/* 封装生成时的密钥参数集 */ +let genKeyProperties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY + }, + { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256 + }, + { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_PSS + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_GENERATE_TYPE, + value: huks.HuksKeyGenerateType.HUKS_KEY_GENERATE_TYPE_DEFAULT + }, + { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_ECB + } +] +let genOptions: huks.HuksOptions = { + properties: genKeyProperties +}; + +/* 2.封装证明密钥的参数集 */ +let anonAttestKeyProperties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ATTESTATION_ID_SEC_LEVEL_INFO, + value: securityLevel + }, + { + tag: huks.HuksTag.HUKS_TAG_ATTESTATION_CHALLENGE, + value: challenge + }, + { + tag: huks.HuksTag.HUKS_TAG_ATTESTATION_ID_VERSION_INFO, + value: versionInfo + }, + { + tag: huks.HuksTag.HUKS_TAG_ATTESTATION_ID_ALIAS, + value: aliasUint8 + } +] +let huksOptions: huks.HuksOptions = { + properties: anonAttestKeyProperties +}; + +function stringToUint8Array(str: string) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.generateKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +/* 3.生成密钥 */ +async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise generateKeyItem`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await generateKeyItem(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`); + } + }); + } catch (error) { + console.error(`promise: generateKeyItem input arg invalid, ${JSON.stringify(error)}`); + } +} + +/* 4.证明密钥 */ +function anonAttestKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.anonAttestKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicAnonAttestKey(keyAlias: string, huksOptions: huks.HuksOptions): Promise { + console.info(`enter promise anonAttestKeyItem`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await anonAttestKeyItem(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: anonAttestKeyItem success, data = ${JSON.stringify(data)}`); + if (data !== null && data.certChains !== null) { + anonAttestCertChain = data.certChains as string[]; + } + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: anonAttestKeyItem failed, ${JSON.stringify(error)}`); + } + }); + return 'Success'; + } catch (error) { + console.error(`promise: anonAttestKeyItem input arg invalid, ${JSON.stringify(error)}`); + return 'Failed'; + } +} + +async function anonAttestKeyTest(): Promise { + await publicGenKeyFunc(aliasString, genOptions); + let ret = await publicAnonAttestKey(aliasString, huksOptions); + console.info('anon attest certChain data: ' + anonAttestCertChain) + return ret; +} +// [End anonymous_key_proof] +@Entry +@Component +struct Index { + @State message: string = 'AnonymousKeyProof'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.call_anonymous_key_proof')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + let ret = await anonAttestKeyTest(); + this.message = 'AnonymousKeyProof Result: ' + ret; + }) + } + .height('100%') + .width('100%') + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/pages/Index.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..a3075fa --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; +import testNapi from 'libentry.so'; + +@Entry +@Component +struct Index { + @State message: string = 'AnonymousKeyProof'; + + goToSample(url: string): void { + router.pushUrl({ + url: url, + }, router.RouterMode.Single, (err) => { + if (err) { + console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('pushUrl success'); + }) + } + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.anonymous_key_proof')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/AnonymousKeyProof') + }) + Button($r('app.string.call_cpp_anon_attest_key')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: number = testNapi.anonAttestKey(); + this.message = 'Call C/C++ Result: ' + ret.toString(); + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/module.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/module.json5 new file mode 100644 index 0000000..4144486 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/module.json5 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/element/color.json b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/element/string.json b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..47bca7c --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/element/string.json @@ -0,0 +1,28 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "AnonymousKeyProof" + }, + { + "name": "anonymous_key_proof", + "value": "AnonymousKeyProof" + }, + { + "name": "call_cpp_anon_attest_key", + "value": "Call C/C++" + }, + { + "name": "call_anonymous_key_proof", + "value": "Call AnonymousKeyProof" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/media/background.png b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/media/foreground.png b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f 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

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/profile/backup_config.json b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/profile/main_pages.json b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..094206f --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,6 @@ +{ + "src": [ + "pages/Index", + "pages/NonAnonymousKeyProof" + ] +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/dark/element/color.json b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/ets/test/Ability.test.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..0f8ce9a --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/ets/test/List.test.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..5444d06 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import nonAnonymousKeyProofTest from './NonAnonymousKeyProof.test'; + +export default function testsuite() { + nonAnonymousKeyProofTest(); +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/ets/test/NonAnonymousKeyProof.test.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/ets/test/NonAnonymousKeyProof.test.ets new file mode 100644 index 0000000..56e3d84 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/ets/test/NonAnonymousKeyProof.test.ets @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, beforeAll } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function nonAnonymousKeyProofTest() { + describe('nonAnonymousKeyProofTest', () => { + /** + * 打开应用 + */ + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + await driver.delayMs(1000); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * 点击按钮,非匿名密钥证明(ArkTS) + */ + it('testNonAnonymousKeyProof001', 0, async () => { + console.info('uitest: testNonAnonymousKeyProof001 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('NonAnonymousKeyProof').type('Button')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call NonAnonymousKeyProof')); + await button2.click(); + await driver.delayMs(3000); + await driver.assertComponentExist(ON.text('NonAnonymousKeyProof Result: Success')); + console.info('uitest: testNonAnonymousKeyProof001 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,非匿名密钥证明(C/C++) + */ + it('testNonAnonymousKeyProof002', 0, async () => { + console.info('uitest: testNonAnonymousKeyProof002 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('Call C/C++')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('Call C/C++ Result: 0')); + console.info('uitest: testNonAnonymousKeyProof002 end'); + await driver.pressBack(); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/module.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..c3fd9dd --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/test/List.test.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/test/List.test.ets new file mode 100644 index 0000000..f1186b1 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/test/LocalUnit.test.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000..7fc57c7 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/hvigor/hvigor-config.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..d584c19 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/hvigorfile.ts b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/hvigorfile.ts new file mode 100644 index 0000000..2a5e543 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/oh-package.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/oh-package.json5 new file mode 100644 index 0000000..e41bae0 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/ohosTest.md b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/ohosTest.md new file mode 100644 index 0000000..d83f44f --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/ohosTest.md @@ -0,0 +1,9 @@ +# 非匿名密钥证明测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| ------------------------------- | ------------ | ---- | ---------------- | -------- | -------- | +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 点击按钮,非匿名密钥证明(ArkTS) | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | +| 点击按钮,非匿名密钥证明(C/C++) | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/screenshots/Cpp_1.png b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/screenshots/Cpp_1.png new file mode 100644 index 0000000000000000000000000000000000000000..136eafeb0e95ebf65e7c78e7f705fb7fd97dc885 GIT binary patch literal 28053 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/screenshots/Cpp_2.png b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/screenshots/Cpp_2.png new file mode 100644 index 0000000000000000000000000000000000000000..5e694a72bc6de17f4fdb72de5c00233c34afd80e GIT binary patch literal 27590 zcmeI52UJtRx~Kz)h#&}pQlv%xQ=DvATK<2jaox75fk{tYUO0wdLq7stge=;GVq@<*#qGq~sg-QI@&0FIC;e+r4 zKzE58KsrE1!UZ6uBO#+BA+!NFh;m~kic6H2sfY=xt^!C&$jC@9 zkdc#LxIj$pPy8KlfsUO1*4_ITujxId;BsRSe;1X0iCd+tg;9TShezVs>-UtGuis!| zX5r=I7q~4bDJ3lNr_w^{Ax?STEe|L#NB`UqFg_2uBe~0ne>%q&{c_im}F@H?^i)H^l!`}a=Ec+jZ z{ZG3l0Muk8#L6S10{{U>CjuF7FaLilMX7X_Yt<8qQBLt4{WBY99DT-uKj7);*_4z@ z5*Wz4Fa=NEH-*?_xAqBNsU11tsw^X+-1f5r+cEe6`PHcW8oimbu z@|k&d0w$UCwfS3$904-q8kOLJ8yPH#;gYF#6(TK*|^6(2=ay>Zj}%K4`xGv+pz=y%T}cq zL{^y83H5kt`Xx`-g%sMQf#vk- z_>Kvk68r1vhyGR_%etZ(A`4?X&`KX_=t+(2FA96m>qE1pO#*-pBEmSX-0tcS-I4B1 z?O~sar7LQt#Ll~DwVlL;<}=U>?^3Bz!C&d$f3WU`Sh>fx#MqBTv~|rzT-1u4K)uFq zO-S@x4@cgU1IGJQ%xSAG81FQtLOr^X2=*1hI}*|Ik1zJ!;=D>prgYo+1NMU$4Q$RW z_Zw(-lC@i6#cq@OWv6T!%~sgbra`C52^m!Mt&2>gqzdmWylE=jt}YB9kn^jZ+x}9& zAw8p8+#z#OBW;^>%B?WR7nw;Qx=RQymt#zHQ>~T6WC~^46(@l_(c0t5H>x^105ZY^{!a26XFcENt6R~OsEPFZWX?}1f*v3MOti?`oTr{2C_>U` zcEjE~N4Y%ZMP}A~=DuZu5*}mz!Pe(iox+D9?+mXjROq?1e@ZnR8%?2*bIb6H2?0PW zyReY}*m5W~01r#~A{dJUvu7XVZdRO{BY3!sp@|NUvliHM3P1}AaXXK|XolBL$lg&8 zOnY~q^n7~!S&GCxwkk%ec2S$scVc#?#qVjQL6+%>O%&Pgqj>%i2q)iArEG4M-#07g zgV4o$Zq0T>_jueAE=;HyfZS&%QUnNqbUPFQaM6YUh!{M}pN~Ab?gHJh17fGi+tpXrl{+hJs5HIcyU*E5T_{A8_WO|Sit}R<5Cc(ObL_;ei(?}nRciCX_BXn$ zcvCh)c_y-!3>0Z7_=}zG4cR$mD9^r3JPC2_JFNOry?Hp{7XIw5R9><9{n3L@Fni<5 z;n9{fRsY2Lu3YJ@FoDQ#i%D;kD4KI6Nykw>0e9XteKg$sg|oh_3KG-JmxvGg%1I6u-P_xxsJb{*mB*hByh3r{iJrB1y2-3)R)xn14$`zYm>^c)&@<( zK|vvhYT+-dgr-4X%_oWkXcXc%;5QHO!FBZ!5^bYV<_-ZIr;KsmsV}Fx#IM8v+k@7U z_7Ejzebrc3_q5)+$dH3z%SX5AS!-f5;uWLbiZ?2)lBJElkXlnza?D+mdDZ^rl&iMx z>H9+XGNki0H1%cG3j0muQdvB>0?vLTR%ClIB%qu&$paG=Ik&La=hOd*uTV50qNv4{ ze0iRk^I6YZFJPqE^1c|k*;%1ks`(JiE_y*P&Vd~SRyMd9nHwNL7KZV$$PLLB@BF=F zxz_(Z6}U}Xf979dg|u>>wO53}qN+ObQAyBYU z_0ww3U^qV5jBcS1Sk1>P(fU&^pV#S9;|D{SZ>F5}*-v`$;WrE_8!^|LMRTenmmdH= zsJ;tPaT|Thg#<2^J6j*pMiKyyD5Y!%dS@Tqk9_5>Vut0Tb}9XOEi`vL&S-#&U|*Lx zM1@!PQ5%QT^kE_-@YgN|&gwm#60n`?;~Ao;L;zgE4y#Qx5CGMdjfj)RdKoCKL23yD zNqeVjo>#o~2u>F^QPn)Yzm`^B^+dIGDS7wFNzyw4V3cvxivs`9k{e$`0Bm+tLll5$ zHo@J_-d#MBthJeWvR1uc;h^B;V(eK+x|w5&XX@db@#Pnj_0c}h7fN6NW0azVYl${P zh4s302d^M`7T!ee;P-OFN+&yGAgF$jeP+d^+56??V;8qNojXtukDZZCsXnhn^~PaH zGtJaQ8@rG~h45l2E0`?B2hTv#v+4s3KG=O$jiG5~oH#qx*p}AJZSGbB20IU;T}Frc zscbzV!BXLh5php0itD-?y5i)r*1?CUBV)a)>58JLUfCC)zjNmuO6A|X5-k}g{TW34 z`EsdJOTnm*?dKGe@d*$K#L!hlWl`WKUIm7HZtO5_R9$v~Y}J9ZaeCrsbitjyIPu?f zli9WwwO=giAr9R9dyM}3YdpLuPfS{t=+z8TDp5%0Xb^p50#CTxTI5dJl}pVd{HGbo z>X}aD`%KyYw$1)^8~*p6*NTNU@9I_oi>yzigkVLH*H%+^qObugnx|^xxU0q9T|DciFPP3b&r~fB1Z#h`>v*`!rl3*| z*E>bY%?cnM{SHrEv7D*TK@_g;jotTp(Ys*Nea&qgcklHb^#$bvHN%|-88fR?=iL4m zyhzLEm9dXyRWg}44=zB`C@XlpCtxd~A(K(#4)Z$rmEf>rDCigBP%x)rr>%4dvm6$$eY4O5j0o#kC*7A z?vFYu*NvG;Gu)QpG2(^V{WCf%V37Nab$Ij2#(e_dhhsCgPO+I8iWntk{}u_wKhQ`R$nwD4+1z*E8Z+JZ2Mk?HzV##?css8kLE;C}FCg z$RiC9zT>{p&R3Xawqcy_;>DJ3YOEhNMs2uAwk|R8Rzi{c$%$^TzWGo9>b2P}x~$9d zIFh}UYzO8qqgOprx$3$()!5Ke%apIL>NapDIKn{EjRoUX#TcQeUFa%lS!FUE&Y;lQ zY^0+QY7b$XihB&pnz8;GwE#HT>z5CJOqx0xSKsi2-?>O{rOulu^2LPOZLQtT8Y}at zsWD+w!`qp+6X!>z6&Gqx0Qk{d0r0=C(t??{M)mp3o6g6no7pnaqhDOaIj0vKN=r|; zd^PrXRV0lO9R{tEoBaKV|M#|x|98^y05oJt-(D69as3Ep32N(^OTA*XVO%PwR3hiIpeDSKYpe3@3XD=?OE5F~CEB{XuCms$TxDiq;P>xSg9^sJ34tQkSvsZM2+2l( zxezb9p@JFyJEwoFQ!Y!wC#+@X=wqt+uvCw6wMlTIm&*eR#5X{{kDK|8c#p&D?v~TN zrISB{7Nhz}^VS_morD5)Kbj@)^POt!*ya0XL(DTaSk;?n)Dgl;Liqzy8yxg&bWUdO z6%TF+8ljvsX$o4)7&e6x-hhF&^OHjL5pU{_ugfc@7^0%@jP>3Sr8sS*9W6!9U(fZY zY#Q=oF0fj&G+wRi7!o^*mgu3?6#lv54YG4!Ifx8>^RY@qZan=HnU#-a45S-^#M!L_0AV4 z0c9@h)@KP3+kp_T%H?p)mt4=|o#>L=@Au#BQ@BjLn-Q{#%FVd4!fYso8U z{18l^Ne{#T&;vc0!G@w09kW+S$4$jtmcI2hlS_Ma$n^nS^$cC4K2f1nPj#zP{YTz` zY9noEg=@NZRcX|6oDKjChMqU*%*?gi-MBib)t^UAX5=yR;2B$JLwBi+MizJaGdV&` ze@3X6FW#1=u{mvVpGkhdk~XOQ`C$T296v2$#0*{T16$pWlgTlaV61K&fuXlvxt&(jB;f^x41UTh z;o}RjDZalH^R^+^lRL$=-&hTJ_)lYE`GEJGpKx(aWaZLuE~c(f+TN;*aI=ofbz>vM)91E z)vdZUJ4N!zQ#Q}6Tm3>A8Uw}Q+{62bD(RzEJpZULPASJ(ALMysQhPaH(N~YoU|C&d z$AsQ3$s_woZU4rJVx7!S1nnC5QOkjnFWVlWP9R;!=v-QWT=e^<)~0->8$d2NAiZUHf}izeh-OgUEK#3z}7xr)39z| zFPsQOn0`IxyC`|v(`O?5y_fj;UHu@PjI&;^XHDRP&n$g*g=rb>CM=T3i6QY5sQOxK;%-@v^r-b_Q>0M}EC=`T!AWCr;zB z;%Oz6z0+S+=)^0s-5}$h^CNC9Zr*g^)#4KXY0@qwFv!U{L8+-ZW7-ky!ZkUS)9LV$ z`l5Ra=jWMN4}ms49_Qq|bXEVnrgttnuJdBJm_|>0BTMZCY=lxsP$f*BgW4%$Yk5XU z%T!G77CcVnEo~B<^8g*SW{HT9+<=+4Bvb{3Te*z1*Yjx9h%PIYtCL~!_;=b^P;b$d zZ2C&!!t>!@?mO5T0q$_uaAQtboJJ{XyRD{X{O(|%X0B;KNS!1ei8LYk@BSE)P-s#J z>f$I?FjngPl)kfgD0AW&$%BIHM9qv%Jqb~j6=A3NrIt$o`nI!d2clgd0`s4& z2VLoX74mt&VS7FOqc7-H=TMyPfl~{b2m_4E89KY(OBtmdu6|{@uf1Edo`$}rm1XMJ{Vgy?qxN%#wF%0OEx0xBqQ^4i zY`_y{0O^06n!1EWhQD$iOh<~@V0inpPAZ2?wMaYJ-rX zx#}S+#n8@dHou+>PV;C}b=0dX)CERE1vhRrj99nDOGmGLVvqYG)atuJ`us}@*i~_}7zr(7Rq@(g=ejG0 zu@a1**ROvpWu8#~ji;d4DN%~1WuNkT>?OA^OBc@7cL1%*|JWLlUG2XayMSsExYu7X zw^**dbEM);DRTJG%AbO4pR~>?H`{SwjRlmFc=3^OX_kPlJ_AY2cDqHs&HcalK>qka z{;PyBw8#q%8tBrhuaclWwz)b(0DNQv-ZVmH%SSK0uixc@+|qW}9%p?6PMY#Ft1<@K z4cSHcGV@-7-gDx>nx`I+5ddAy_@DKodJ#^z)Gz`-B4YU)=#T)Qz^moxSrNObRPOjR z=&=j|FsAn}PYm##9RvXXd~>h$M2+qWj^mj9JIFf~CxSR34tN)534o_+|LWvWS>_nX zh<|!k_yG?kR#DX2SMYZN;O7*v@p0g_34lWe=)XF#S%Ai1td}{?vp+AKzb`rZ4=^t; zy3Vfda-C$&MXqOr#4LcvaNy(jeRm?!cv@VfdPZ#@cPGpB(hUZ%)kE}<(7V#q^i`<* z>c)E*%h&84eG#BUd9sO-#egTV%^Taj`-eAp#$PxU)THWw-$xFYk-5A16tULxz&wr! zmyk@s0~<|+3c(Q@)x>;}D1_H!=a6^#nvZ0?kpnAv#GMR zi3`DjC*iJ|b9qH~nVh^n${K=IhlPgImAxd^K0u-v2LpwugDE&8&CK?;gIP{3$F(x2 zl%H3#&hhNpAh>sU0s=->rFKjjBuhtPlK zY!C-)rgV&(=nUQ56dg&R^xV2UrpQf)7{1(AoH%!ciMQBZpHHRjnnRnWUuZ1K^lxZgY+9-I!>ZN)e~O>>a>B1Boj<@qh{ z7Y}2Hl6=DC&{jHz;YP}hVIC@h*jb(A=6AaR4>qBl6RGoTQtgp}l|Aiu<-{(e9az+n zS=?>wm&n!09Fc)abx%N12IVGRvO3vPnNa2e7Go684Z zZcPB$zy8YbURKZ4A5tJUV(a>Sd7q7{-7FRrfzpmbo=R)*yfyoXdX`23aNAU_()}r~ zD6;TrJn@<7TD1DHd(efumnhL21OQ2a*SLWJ#Ku{uP+=RH1Lu9pEyH2A?P;I;vMG)W z1O2eM?;<*}{PV%>P&~rR^Est-VCqW(;9IdAcl5n>x^DtKS0&zUTjgduc*;nhOb6i$ zvxzS$$7Mrv--yi$QgzuM3%O@|CdwD=$|Bobg#{6=&wB^e#VIY4=nfbWAsw0wc8M!r zUG|!BtR+#6eq6~Wm9>T?yKo$p#OLUtWhQ-7mnHSot@>LeO~K!(#i!J{gZZNnAP`UL z53v8-wC7_C+vobHh1!STnttx_Es@#KeEV@ku~UGt?3pVG8I?(RN;l&qA)Bx$AY733 zHd9HS_+awt4y}7Bl&~i9X2japTRE7+C{WW$H?9v|{COI8n)Il&=R&Ytrq>h%tbYl2 zMT0GNxct&W_4h@g8o>??ZWMd$*z~lsM;|9*f33E>o1j=og4XL-(0V55RUw`Ga_yQ<&4+W}9o5>1 zRtH2_0(8*CJ2?wuLcv@U*CcK{4Y-;mMs0=D`5m_XUB z@fh1)5Go_%&VzkAE`S^oEYsEyEV$+Su*g#$4vWBQ=bMAz^1woyG zaIiESr3;yauik$8l(k>qukH=X(l?1-byxPGs=X4Usz#dHt@!Rs9gh|qZmu91*P`!J zd9D0B$#_`Wm-mA&L5hj>@HO-%KDKWyjo86L=mkdQ1M$I*t!({?dJ{4@Gx%IhZs3xm zwYT|>4gnC_TXaovM)M(B)UEWkNa`cQRNFY#n%}j->fcJqEj5#_ZCj3fF0sk=N^QSt zVd)>dzV4|m=GTY^_m8uWFYFdr@o2km`q)@cPdG^{L$}1zTIqFnVzBH=br?yxk07au>RC?4pKpEbi+$a& z-msMrKBS-N#V8-0E_)FDK27-86cAyy-15xc=)r_^bOZs=K7ArOE0K94Btk~aE~Xxi z^%YBnM#Zot4-Zrhnm@vb%|KKP{k2s~y9X;jv3|8~XwjhnzF1*PMQ9#kwc8O6KmrTXD{jKB2S3)Jp9Iv-4K z%}lJh%RPCLm5G3%kWOpJAEZ7de&nL>EB)~)O*BJF;~)Ix~A~ZdJfKVQLDFvMsQDWNChXs8~^P;xJI8bA0}bnwzUz#9&PL zRkfFDC1xx19b2k`aTOKhQz{)AWT-Vuc36qyV=u2&d1^3+ecXNCwj-wLTTDLy9>0Cw zz?xaSK0O{v)viD;pWcb?kmG$r=Dxy7>VJ`TMJLv2r%J*4d%e5T3t004_L_byvz2F6 zbYpdWQzr>|cHiJrS6AV7Z!SrZ$nFeV!FH3YY8Ti?X1(H#8+Ni-tYR{?4ow2OE4l;) zriIElqty@30%Aq8ZC&TD@8o2AvUIxTX)IZ~u=)*TQJ?7ozwH-(mK)d6JL2_qE)H!3 zCx^yealX_uW8CcWqA~z1%TrMoO(t*tXrRQDls*%)W@dF`ume6%r6tFR??;@D>J0#N zBqn9s-^kB~ANWhOOPHJ1wc6T?#js_hUFvSI$%SsTyO`$>HVKIY1s+R#7B2UZzJn{9 zC;7S~7EDJwj15!kV%%Pv9d75GoZQf&(wcyoYicMd;0^~C8jO@el3axM>2kfr%R{xK z*9_eT@ctV~FxRW=sFRdz!I`OspOkDiS0caK=dKFz)t3&u%8HpCX>L#Q3cYRU5}*;F z_TcxYj&e+J(vRO7{9jv#?{w~QHO@Er?KHTEh3&^$Wo${~$Vj2F{uI^{ZMS{BnySxq z(|%1Jid#JeF@WFt5CRw#|389-(8E=+{Y{; zr@L!@t>>1p|3=x7T|02XP$U?zNs`q)v z@&m3|#r%HND=yei?J?LeHiiDTAUC@r79;3ExW`_&U$f^d%zao-P;yD24`u^jyj--v z3{qlWdE#fAJM*m=0;PT6o7a{`_3rjP?5gQK;s{kqFrxWWaeO-l8@xrQ7+Q15s2Y&1 z`Id$T(C1!he7EJXMi$(7dh!=9B z_PckuZLfj(Fv@2f24%sBZhw_cgyhUiovB5>JM!$u2lKTjLK;ukG&QxIU|6S*5k66$ z!hD>ut35upxH_v`7k}E>_xFC=Gk5A?KMTFV*6}u>M4uu3$_joAGVJXwRZw5=pYfLK zWb7FPJyMd7Owh7yX2m}X^7%TFfg_IESxzq2o&_KE9l8S1#wD&thv@0gJ~#K*j4NHQ z@y2~SG0x7-$;_2F{&Y=FHKNfdL~|uCTT$xvbeHSPGwJ<+{#zg_FdS*--Ff zSA?&dzZVHq_$G^tsg(x=D| zwYStKS+137aHr0#r3BYZ2=ac&8a8UW0ogcn(r+8K=qCW^E2Pj;h;pp`m?;qdmnDT}6J=Zhyz3kaoH@mD>oq}3(jVh6@ zUGXxWe0Zv?m>395ZZ5vhG#MFC3xi;SA~vtGd8&NUtA{@hbz5QTAsM(smb%yeTGCL9 zQq#N`wuMCbgI{Nc7P2?ek1JJ6Z~GZQz2})Afn~gKp~be$MG)JKH5AZnQdtg}F^n>- z+S$CjPCb|NJ(r&wTOIy{UR>hy*+ytaj+Y?4hU_M+-pm6D{jS$O`pHFU`b5e1n2onN z6djyipy8kOz|%2L)7Hy$XZ5xE#Bcj%0-zwq7$YfTe7(*tIaeeu)m0{W={S3QcDU>$ zVMU<+MU zSCrX3d%RXPv$+`=Avqa}eB89N)NoQjg8#xNSk#)y&_P*LFUDZeIzNITpL(|Zr1#O& zYO+{CfUGQlW2n?2|MTT=1C5uk`pI$>Xw|R`@*L@E?;m$I3;izAJL^!F;9u|8Y2V=< zo-}M|^ofc!S@TdxOFcZM`&9w(`#$5)#D|yr>Mi{Iw)OJc!Da?lUg5Li`1L+Ygv;g~ zilrDVxNH;{{D#R-Aye)72gTf#gnP=TDa|2I_hDgJ#h&YBvLUjYl~y6+wpja+w2UL4 z(u^>nx9ER#gr|g5#7qc!V6!cyu1*3QcFIlR(~5E4`1FJqi5lMvg{jp<`Vmi z`W^3BKhZCqmfzdMe(1Gr@Y+vvNKctsn%y-|bWDFbtifz>GR(N&$G9QNkvIVUC-F;a2=3allh9fMG2o3Db+?B4a|N)pd2MBm z0Jw0R5O!i01{?*RK(NG+2HH)r6K^cEMcFQ+>3c@xK_oso0JuYTN`+4e;Mmdqo>!9f z(iJA$@v=DWEfi@=N&v{`6B`$M2mx>(ra%CY#^9XQSCG+l8M6pH2`%3T%VeV?Vs_pc zO~C}fhe#D-0Lf@F0q{-(FA4prmJS_oCU(hxWD$ctp_8%DmDW=N;Pbgg8rvU4*%xXFO7)lX}5`C8ysW%1i;GfY4h(?#X;)_f29;~j(ebaRVo+yTOS(1 z@jo=AI8*{2wPkh-9DxMY32gC_v6 zB>%=Hj(@hP&;vCZA1DoftOH#8`mQSAUmwHyl5|Slh7Udq1&wXSq z>OQmWsez}79xN-j8KN@_@Lw;F;vNR`$Ei}W+_tkBAQ>L4VT5QKBUH&=X0ruYzl02iTyuNvwRL%gt45sP`0&RwOg zu;=9T5Gw|G4h*eX>is1q-NWAyha( zY7Cr!v#_IEqr&m@>Y^5jVE~rLmQn`Hmzs`FWBZBEAtuwRGwTPv0vSbXqZ{4@X6AA~ z`@~gs%bo~r^9&ojz_t}{M!4{|OjMUR9{w5<5Ye4ZSUME)S4f2!k2c8VJJ2#UeYix- z7cA^j%draWs8;5(`i1B9mkZF+5*U(wX2tkAZH42r@>{U{MDk|c8?zVj`m6$rL}!Ld z%bG$k@a8%8zDXM)_UM!%Ze z`^6TlfYN=Mjn&^>zM?E-sSo+~u_OC^Au-CbBAg^ejsVyg!ai%MY&2+>7HvtOqKtWk z7iPZ#vUt51&*h|vFd90>toA35O_mu>A|Kz@^~JK>||u9%xv$-K&XJh4LR8#0!=HZ|Iaqu5s)0I)~U>*pHGbLu~FFsqRkMD2VU8hg>a;{SZ&gsnQ1sk z!5p*c-N)E?mt^)qp;kzRjY$xSuFbBM9pyh?4w#hugPYl?e1U7E+wV3w>%Oza-1T*xz}2>p_QOo4tGvm8GK z9r236%*Np-LpZl3r^iknbpg3cA8O%sE@5r74a9&4RENB=?N;jCG`+U8bQ4R&&{W|J z)1^Bf%f*{kFb4>yC5K}5r@T}k?Oj;>n*ZkK@AF?v_{n=uh@BH9EAur1V207yeg-qQH3l7`L1>M(h^_ZP`ty7rzX`)N4W?M=LsDb&qU|c!^6Bb?4J4`f(j|Y=6 zQ#3wK1nun0r^M!h3OW^Y9?e=Dzk5Q30;FIUO7@C1!&ZXnUs;sp9UJ%PB4Bl_TGyDB z?a4js@zu5P`DE);a2pEzrFkpr@E$k~^qcOW1In^mf_#MOH9qReH(NU?SLLn=UaIE# zhUW$1n~^D(!)l-25N4F=UdVthKXMaG&~aKf&&)tc!fvP|x!$vBxKF9SwK}^-#1fAj%U95DTvWi6DcYcp+m)LB*Fs=UkGCB zI%HVlWmppVl6iwK18$#(6E1U51iE>&ayTX~9T_pL4HF?UG$>0Bw&sK}Sb8 zpOFIG(GBZKRIJrDp6N76gu_Nv@|2S}GWa(2_i77&Yd$LtMso_**USKIAn&WnhGPUk zr};2c5aVzDa9C0yhWxDJAvEZu@HB9yDKxKGB&|Luy*5}b<7GZqFvX74#uEvrZ$`gR zlD;1MioGvQb?J{sqj6`t39BV84OsWN9=LGz?&LL8*VlK)H{TgH&lx#b?;Q}`(6em> zz`W4(XWt-a^OC5A9=^8R?9^V&iO?AEFKLecISp}m5oDAOMa*Op0MKj1z>EU?)K5>S z8*mI;+_SA15Ozq5H8Q(_J6i`HVSw1MzrOr0sb4{D=Ig~8{yo`ep1M;`pS7GthHWX^s2L3|p$@&P~3}y~}hl$8?KPL=+EF<7R_#YC3Yoo}6Dm0;? zCxX5)6OEZao32&u^rc^Z2#_G?Z+~MeA(yDZn#pICm?NsZ5XM$n%EdSe`w1mXkScZLQqIfq{j_Bh|VCaFl+}Qr%`v*MkW6uv^n#+nh z6gVC$ItgfJ&2Uz~k9VqFq8;?+!Yl&`gYvbykqlFuLH_igCGdAEDr%xWdn?o?+(T;=_K_8-n`eR6Cbzt!~|ar7nJhdp*w?;dl)#R~Su%yz#h zMSA){#LJcCU?W~j)~P$(vn4*rV(Xt{#GPS3HKbw>@x$6RYs>x#91@xK=r8~-15J!ntH@3{m*SA`4bw2iGdFv%ehqA)ZovcUeVQBFh%Z&tpl`F0=CynNn zm;4lD6tZ_P!b@EE3d?*T`hB7BOhl}tSOi!hvPEh+CE0G#BN$CZud4D{sj#Tnj`moP zxFz8sc{On#E#v@&_J3q$-G3&nsr*WaB;sl-i}eq`F`ZS>XErwnWR9Xb1)&dSrC=a{ zcgUwA#itx0lMkcGO3bv~Up#I8c%kMa&+4K!(_D?gUa`_Jq(t}su(6tujK$zQN-|$~ zF>21ghex9GXf9S~5pr~aY#W&l6BHo(8rdGt^6=SgJB!OmW!LUmdH=+pdYvFA6SqGt zzNn;Y#*48WEn|l7G$le55xZyAyW?nd`ky5=mxpXl3ut_!M(gSX$P^w7&JFD6ZDvF* zx%BZMyN;G)Kd*Qk@x-8!X)u=m#s9XiOd;uK4_HgbemIk?h5js9^}M#;Bs(mnm$QC7E_J-rT*zwj zo0e>}F((-+_~t3f`v1lf*#GK#8dY6UL28!8ot!}4k8)B+H-nfvbm5XDgz^6dvtNqp literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/screenshots/NonAnonymousKeyProof_1.png b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/screenshots/NonAnonymousKeyProof_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2556fd94144b1c790d1a7541dbbb983231ea0769 GIT binary patch literal 26466 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 F{{`XaIp_cY literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/screenshots/NonAnonymousKeyProof_2.png b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/screenshots/NonAnonymousKeyProof_2.png new file mode 100644 index 0000000000000000000000000000000000000000..91f50aaf8599f18eb2601aee13294ab44a1da911 GIT binary patch literal 27962 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 u3ATHwL$+)GZ(3aJKkHg55mAM1CFa8+Aqw3* literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/.gitignore b/UniversalKeystoreKit/KeyUsage/AccessControl/.gitignore new file mode 100644 index 0000000..d2ff201 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/.gitignore @@ -0,0 +1,12 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +/.appanalyzer \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/AppScope/app.json5 b/UniversalKeystoreKit/KeyUsage/AccessControl/AppScope/app.json5 new file mode 100644 index 0000000..92d4575 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/AppScope/app.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "bundleName": "com.samples.accesscontrol", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/AppScope/resources/base/element/string.json b/UniversalKeystoreKit/KeyUsage/AccessControl/AppScope/resources/base/element/string.json new file mode 100644 index 0000000..daebd0d --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "AccessControl" + } + ] +} diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/AppScope/resources/base/media/app_icon.png b/UniversalKeystoreKit/KeyUsage/AccessControl/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a39445dc87828b76fed6d2ec470dd455c45319e3 GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/README.md b/UniversalKeystoreKit/KeyUsage/AccessControl/README.md new file mode 100644 index 0000000..53e6737 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/README.md @@ -0,0 +1,92 @@ +## 用户身份认证访问控制开发指导 + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-user-identity-authentication.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### UserIdentityAuthentication + +##### 介绍 + +1. 本示例主要介绍实现用户身份认证访问控制,确保只有经过PIN认证的用户才能对加密数据进行操作。 + +##### 效果预览 + +| 主页 | 删除 | +| ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call按钮依据预先设定的参数(如 SM4 算法、PIN认证等)生成密钥。 + +## 细粒度用户身份认证访问控制开发指导 + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-refined-user-identity-authentication.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### FineGrainedUserIdentityAuthentication + +##### 介绍 + +1. 本示例主要介绍细粒度用户身份认证访问控制,允许设置密钥在加密、解密、签名、验签、密钥协商、密钥派生的单个或多个场景时是否需要进行身份验证。 + +##### 效果预览 + +| 主页 | 跳转页 | +| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | +| | | + +使用说明 + +1. 点击Call 按钮生成一个基于 SM4 算法、支持PIN认证且在解密时需身份验证的密钥。 + +## 工程目录 + +``` +entry/src/main/ +|---ets +|---|---entryability +|---|---|---EntryAbility.ets +|---|---pages +|---|---|---Index.ets // 首页 +|---|---|---FineGrainedUserIdentityAuthentication.ets +|---|---|---UserIdentityAuthentication.ets +|---cpp +|---resources // 静态资源 +|---ohosTest +|---|---ets +|---|---|---tests +|---|---|---|---AccessControl.test.ets // 自动化测试用例 +``` + +## 相关权限 + +[ohos.permission.ACCESS_BIOMETRIC](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/AccessToken/permissions-for-all.md#ohospermissionaccessbiometric) + +## 依赖 + +不涉及。 + +## 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.2 Release及以上。 + +3. DevEco Studio版本:DevEco Studio 5.0.2 Release及以上。 + +4. HarmonyOS SDK版本:HarmonyOS 5.0.2 Release及以上。 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo UniversalKeystoreKit/KeyUsage/AccessControl > .git/info/sparse-checkout +git remote add origin https://gitee.com/harmonyos_samples/guide-snippets.git +git pull origin master +``` diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/build-profile.json5 b/UniversalKeystoreKit/KeyUsage/AccessControl/build-profile.json5 new file mode 100644 index 0000000..7dff243 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/code-linter.json5 b/UniversalKeystoreKit/KeyUsage/AccessControl/code-linter.json5 new file mode 100644 index 0000000..2858646 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/code-linter.json5 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/.gitignore b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/build-profile.json5 b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/build-profile.json5 new file mode 100644 index 0000000..e7569e3 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/build-profile.json5 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": "stageMode", + "buildOption": { + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/hvigorfile.ts b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/hvigorfile.ts new file mode 100644 index 0000000..e4f43d5 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/oh-package.json5 new file mode 100644 index 0000000..c9cb6c8 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": {} +} + diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/entryability/EntryAbility.ets b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..edc2839 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..b1e2129 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/pages/FineGrainedUserIdentityAuthentication.ets b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/pages/FineGrainedUserIdentityAuthentication.ets new file mode 100644 index 0000000..be90c53 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/pages/FineGrainedUserIdentityAuthentication.ets @@ -0,0 +1,444 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// [Start generate_key_specify_fingerprint_access_control_and_auth_purpose] +import { huks } from '@kit.UniversalKeystoreKit'; +import { userAuth } from '@kit.UserAuthenticationKit'; +import { BusinessError } from '@kit.BasicServicesKit'; + + +let cipherInData = 'Hks_SM4_Cipher_Test_101010101010101010110_string'; // 明文数据。 +let IV = '1234567890123456'; +let handle = 0; +let cipherText: Uint8Array; // 密文数据。 +let finishOutData: Uint8Array; // 解密后的明文数据。 +let authToken: Uint8Array; +let challenge: Uint8Array; +let authType = userAuth.UserAuthType.PIN; +let authTrustLevel = userAuth.AuthTrustLevel.ATL1; + +let keyAlias = 'test_sm4_key_alias'; +class ThrowObject { + public isThrow: boolean = false; +} + +function stringToUint8Array(str: string) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +/* + * 确定封装密钥属性参数集 + */ +let generateProperties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_SM4, + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT, + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_SM4_KEY_SIZE_128, + }, + { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_CBC, + }, + { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE, + }, + { + tag: huks.HuksTag.HUKS_TAG_USER_AUTH_TYPE, + value: huks.HuksUserAuthType.HUKS_USER_AUTH_TYPE_PIN + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_AUTH_ACCESS_TYPE, + value: huks.HuksAuthAccessType.HUKS_AUTH_ACCESS_INVALID_CLEAR_PASSWORD + }, + { + tag: huks.HuksTag.HUKS_TAG_CHALLENGE_TYPE, + value: huks.HuksChallengeType.HUKS_CHALLENGE_TYPE_NORMAL + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_AUTH_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + } +]; + +let generateHuksOptions: huks.HuksOptions = { + properties: generateProperties, + inData: new Uint8Array([]) +} + +/* + * 生成密钥 + */ +async function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.generateKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise generateKeyItem`); + let throwObject: ThrowObject = { isThrow: true }; + try { + await generateKeyItem(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: generateKeyItem failed` + JSON.stringify(error)); + } + }); + } catch (error) { + console.error(`promise: generateKeyItem input arg invalid` + JSON.stringify(error)); + throw (error as Error); + } +} + +async function testGenKeyForFingerprintAccessControl() { + await publicGenKeyFunc(keyAlias, generateHuksOptions); +} +// [End generate_key_specify_fingerprint_access_control_and_auth_purpose] +class HuksProperties { + public tag: huks.HuksTag = huks.HuksTag.HUKS_TAG_ALGORITHM; + public value: huks.HuksKeyAlg | huks.HuksKeySize | huks.HuksKeyPurpose | huks.HuksKeyPadding | huks.HuksCipherMode + | Uint8Array = huks.HuksKeyAlg.HUKS_ALG_ECC; +} + +/* + * 确定封装密钥属性参数集 + */ + +/* 集成生成密钥参数集 & 加密参数集 */ +let propertiesEncrypt: HuksProperties[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_SM4, + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT, + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_SM4_KEY_SIZE_128, + }, + { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE, + }, + { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_CBC, + }, + { + tag: huks.HuksTag.HUKS_TAG_IV, + value: stringToUint8Array(IV), + } +]; +let encryptOptions: huks.HuksOptions = { + properties: propertiesEncrypt, + inData: new Uint8Array([]) +} + +function initSession(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.initSession(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicInitFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise doInit`); + let throwObject: ThrowObject = { isThrow: true }; + try { + await initSession(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: doInit success, data = ${JSON.stringify(data)}`); + handle = data.handle as number; + challenge = data.challenge as Uint8Array; + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doInit failed` + JSON.stringify(error)); + } + }); + } catch (error) { + console.error(`promise: doInit input arg invalid` + JSON.stringify(error)); + throw (error as Error); + } +} + +function finishEncryptSession(handle: number, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.finishSession(handle, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicEncryptFinishFunc(handle: number, huksOptions: huks.HuksOptions) { + console.info(`enter promise doFinish`); + let throwObject: ThrowObject = { isThrow: true }; + try { + await finishEncryptSession(handle, huksOptions, throwObject) + .then((data) => { + cipherText = data.outData as Uint8Array; + console.info(`promise: doFinish success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doFinish failed` + JSON.stringify(error)); + } + }); + } catch (error) { + console.error(`promise: doFinish input arg invalid` + JSON.stringify(error)); + throw (error as Error); + } +} + +async function testSm4Cipher() { + /* 初始化密钥会话获取挑战值 */ + await publicInitFunc(keyAlias, encryptOptions); + /* 加密 */ + encryptOptions.inData = stringToUint8Array(cipherInData); + await publicEncryptFinishFunc(handle, encryptOptions); +} + +/* 集成生成密钥参数集 & 加密参数集 */ +class PropertyDecryptType { + public tag: huks.HuksTag = huks.HuksTag.HUKS_TAG_ALGORITHM + public value: huks.HuksKeyAlg | huks.HuksKeyPurpose | huks.HuksKeySize | huks.HuksKeyPadding | huks.HuksCipherMode + | Uint8Array = huks.HuksKeyAlg.HUKS_ALG_SM4 +} + +let propertiesDecrypt: PropertyDecryptType[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_SM4, + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT, + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_SM4_KEY_SIZE_128, + }, + { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE, + }, + { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_CBC, + }, + { + tag: huks.HuksTag.HUKS_TAG_IV, + value: stringToUint8Array(IV), + } +] +let decryptOptions: huks.HuksOptions = { + properties: propertiesDecrypt, + inData: new Uint8Array([]) +} + +function userIAMAuthFinger(huksChallenge: Uint8Array) { + // 获取认证对象。 + let authTypeList: userAuth.UserAuthType[] = [authType]; + const authParam: userAuth.AuthParam = { + challenge: huksChallenge, + authType: authTypeList, + authTrustLevel: authTrustLevel + }; + const widgetParam: userAuth.WidgetParam = { + title: 'PIN', + }; + let auth: userAuth.UserAuthInstance; + try { + auth = userAuth.getUserAuthInstance(authParam, widgetParam); + console.info('get auth instance success'); + } catch (error) { + console.error('get auth instance failed' + JSON.stringify(error)); + throw (error as Error); + } + // 订阅认证结果。 + try { + auth.on('result', { + onResult(result) { + console.info('[HUKS] -> [IAM] userAuthInstance callback result = ' + JSON.stringify(result)); + authToken = result.token; + testSm4CipherFinish(); + } + }); + console.info('subscribe authentication event success'); + } catch (error) { + console.error('subscribe authentication event failed ' + JSON.stringify(error)); + throw (error as Error); + } + // 开始认证。 + try { + auth.start(); + console.info('authV9 start auth success'); + } catch (error) { + console.error('authV9 start auth failed, error = ' + JSON.stringify(error)); + throw (error as Error); + } +} + +function finishDecryptSession(handle: number, huksOptions: huks.HuksOptions, token: Uint8Array, + throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.finishSession(handle, huksOptions, token, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicDecryptFinishFunc(handle: number, token: Uint8Array, huksOptions: huks.HuksOptions) { + console.info(`enter promise doFinish`); + let throwObject: ThrowObject = { isThrow: true }; + try { + await finishDecryptSession(handle, huksOptions, token, throwObject) + .then((data) => { + finishOutData = data.outData as Uint8Array; + console.info(`promise: doFinish success, data = ${JSON.stringify(data)}`); + }) + .catch((error: BusinessError) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doFinish failed` + JSON.stringify(error)); + } + }); + } catch (error) { + console.error(`promise: doFinish input arg invalid` + JSON.stringify(error)); + throw (error as Error); + } +} + +async function testSm4CipherInit() { + /* 初始化密钥会话获取挑战值 */ + await publicInitFunc(keyAlias, decryptOptions); + /* 调用userIAM进行身份认证 */ + console.log('challenge value: ' + challenge.toString()); + userIAMAuthFinger(challenge); +} + +async function testSm4CipherFinish() { + /* 认证成功后进行解密, 需要传入Auth获取到的authToken值 */ + decryptOptions.inData = cipherText; + await publicDecryptFinishFunc(handle, authToken, decryptOptions); + if (finishOutData === stringToUint8Array(cipherInData)) { + console.error('test finish decrypt error'); + } else { + console.info('test finish decrypt success'); + } +} + +async function main() { + await testGenKeyForFingerprintAccessControl(); + await testSm4Cipher(); + await testSm4CipherInit(); +} + +@Entry +@Component +struct Index { + @State message: string = 'FineGrainedUserIdentityAuthentication'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.fine_grained_user_identity_authentication_call')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await main(); + this.message = 'Call Result: Success'; + } catch (error) { + this.message = 'Call Result: Failed' + error.message; + } + }) + } + .height('100%') + .width('100%') + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/pages/Index.ets b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..e012e25 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; + +@Entry +@Component +struct Index { + @State message: string = 'AccessControl'; + + goToSample(url: string): void { + router.pushUrl({ + url: url, + }, router.RouterMode.Single, (err) => { + if (err) { + console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('pushUrl success'); + }) + } + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button('UserIdentityAuthentication') + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/UserIdentityAuthentication'); + }) + Button('FineGrainedUserIdentityAuthentication') + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/FineGrainedUserIdentityAuthentication'); + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/pages/UserIdentityAuthentication.ets b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/pages/UserIdentityAuthentication.ets new file mode 100644 index 0000000..225d159 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/ets/pages/UserIdentityAuthentication.ets @@ -0,0 +1,417 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +// [Start user_authentication_and_access_control_guide] +import { huks } from '@kit.UniversalKeystoreKit'; +import { userAuth } from '@kit.UserAuthenticationKit'; + +/* +* 确定密钥别名和封装密钥属性参数集 +*/ +let keyAlias = 'test_sm4_key_alias'; +let IV = '1234567890123456'; +let handle: number; +let challenge: Uint8Array; +let fingerAuthToken: Uint8Array; +let authType = userAuth.UserAuthType.PIN; +let authTrustLevel = userAuth.AuthTrustLevel.ATL1; +let cipherInData = 'Hks_SM4_Cipher_Test_101010101010101010110_string'; +let finishOutData: Uint8Array; + +class ThrowObject { + public isThrow: boolean = false; +} + +let generateProperties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_SM4 +}, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT +}, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_SM4_KEY_SIZE_128, +}, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_CBC, +}, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE, +}, + // 指定密钥身份认证的类型:PIN。 + { + tag: huks.HuksTag.HUKS_TAG_USER_AUTH_TYPE, + value: huks.HuksUserAuthType.HUKS_USER_AUTH_TYPE_PIN + }, + // 指定密钥安全授权的类型(失效类型):新录入生物特征(PIN)后无效。 + { + tag: huks.HuksTag.HUKS_TAG_KEY_AUTH_ACCESS_TYPE, + value: huks.HuksAuthAccessType.HUKS_AUTH_ACCESS_INVALID_CLEAR_PASSWORD + }, + // 指定挑战值的类型:默认类型。 + { + tag: huks.HuksTag.HUKS_TAG_CHALLENGE_TYPE, + value: huks.HuksChallengeType.HUKS_CHALLENGE_TYPE_NORMAL + }]; + +let generateHuksOptions: huks.HuksOptions = { + properties: generateProperties, + inData: new Uint8Array([]) +} + +/* + * 生成密钥 + */ + +function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.generateKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise generateKeyItem`); + let throwObject: ThrowObject = { isThrow: true }; + try { + await generateKeyItem(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + console.error(`promise: generateKeyItem failed, ` + JSON.stringify(error)); + throw (error as Error); + } else { + } + }); + } catch (error) { + console.error(`promise: generateKeyItem input arg invalid, ` + JSON.stringify(error)); + throw (error as Error); + } +} + +async function testGenKeyForFingerprintAccessControl() { + await publicGenKeyFunc(keyAlias, generateHuksOptions); +} + +/* 集成生成密钥参数集 & 加密参数集 */ +let initProperties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_SM4, +}, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT, +}, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_SM4_KEY_SIZE_128, +}, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_CBC, +}, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE, +}, { + tag: huks.HuksTag.HUKS_TAG_IV, + value: stringToUint8Array(IV), +}]; + +let initHuksOptions: huks.HuksOptions = { + properties: initProperties, + inData: new Uint8Array([]) +} + +function stringToUint8Array(str: string) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function initSession(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.initSession(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +/* 初始化HUKS中的会话,获取挑战值 */ +async function publicInitFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise doInit`); + let throwObject: ThrowObject = { isThrow: true }; + try { + await initSession(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: doInit success, data = ${JSON.stringify(data)}`); + handle = data.handle; + challenge = data.challenge as Uint8Array; + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doInit failed, ` + JSON.stringify(error)); + } + }); + } catch (error) { + console.error(`promise: doInit input arg invalid, ` + JSON.stringify(error)); + throw (error as Error); + } +} + +/* 调用UserIAM拉起认证,触发HUKS的访问控制流程 */ +function userIAMAuthFinger(huksChallenge: Uint8Array) { + // 获取认证对象。 + let authTypeList: userAuth.UserAuthType[] = [authType]; + const authParam: userAuth.AuthParam = { + challenge: huksChallenge, + authType: authTypeList, + authTrustLevel: authTrustLevel + }; + const widgetParam: userAuth.WidgetParam = { + title: 'PIN', + }; + let auth: userAuth.UserAuthInstance; + try { + auth = userAuth.getUserAuthInstance(authParam, widgetParam); + console.info('get auth instance success'); + } catch (error) { + console.error('get auth instance failed' + JSON.stringify(error)); + throw (error as Error); + } + // 订阅认证结果。 + try { + auth.on('result', { + onResult(result) { + console.info('[HUKS] -> [IAM] userAuthInstance callback result = ' + JSON.stringify(result)); + fingerAuthToken = result.token; + testSm4Cipher(); + } + }); + console.log('subscribe authentication event success'); + } catch (error) { + console.error('subscribe authentication event failed, ' + JSON.stringify(error)); + throw (error as Error); + } + // 开始认证。 + try { + auth.start(); + console.info('authV9 start auth success'); + } catch (error) { + console.error('authV9 start auth failed, error = ' + JSON.stringify(error)); + throw (error as Error); + } +} + +async function testInitAndAuthFinger() { + /* 初始化密钥会话获取挑战值 */ + await publicInitFunc(keyAlias, initHuksOptions); + /* 调用userIAM进行身份认证 */ + console.log('challenge value: ' + challenge.toString()); + userIAMAuthFinger(challenge); +} + +/* 集成生成密钥参数集 & 加密参数集 */ +class PropertyEncryptType { + public tag: huks.HuksTag = huks.HuksTag.HUKS_TAG_ALGORITHM; + public value: huks.HuksKeyAlg | huks.HuksKeyPurpose | huks.HuksKeySize | huks.HuksKeyPadding | huks.HuksCipherMode + | Uint8Array = huks.HuksKeyAlg.HUKS_ALG_SM4; +} + +let propertiesEncrypt: PropertyEncryptType[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_SM4, + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT, + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_SM4_KEY_SIZE_128, + }, + { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE, + }, + { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_CBC, + }, + { + tag: huks.HuksTag.HUKS_TAG_IV, + value: stringToUint8Array(IV), + } +] +let encryptOptions: huks.HuksOptions = { + properties: propertiesEncrypt, + inData: new Uint8Array([]) +} + +function updateSession(handle: number, huksOptions: huks.HuksOptions, token: Uint8Array, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.updateSession(handle, huksOptions, token, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicUpdateFunc(handle: number, token: Uint8Array, huksOptions: huks.HuksOptions) { + console.info(`enter promise doUpdate`); + let throwObject: ThrowObject = { isThrow: true }; + console.log('token value[publicUpdateFunc]:' + token) + try { + await updateSession(handle, huksOptions, token, throwObject) + .then((data) => { + console.info(`promise: doUpdate success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doUpdate failed, ` + JSON.stringify(error)); + } + }); + } catch (error) { + console.error(`promise: doUpdate input arg invalid, ` + JSON.stringify(error)); + throw (error as Error); + } +} + +function finishSession(handle: number, huksOptions: huks.HuksOptions, token: Uint8Array, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.finishSession(handle, huksOptions, token, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicFinishFunc(handle: number, token: Uint8Array, huksOptions: huks.HuksOptions) { + console.info(`enter promise doFinish`); + let throwObject: ThrowObject = { isThrow: false }; + console.log('token value[publicFinishFunc]:' + token) + try { + await finishSession(handle, huksOptions, token, throwObject) + .then((data) => { + finishOutData = data.outData as Uint8Array; + console.info(`promise: doFinish success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doFinish failed, ` + JSON.stringify(error)); + } + }); + } catch (error) { + console.error(`promise: doFinish input arg invalid, ` + JSON.stringify(error)); + throw (error as Error); + } +} + +async function testSm4Cipher() { + encryptOptions.inData = stringToUint8Array(cipherInData); + /* 传入认证令牌 */ + await publicUpdateFunc(handle, fingerAuthToken, encryptOptions); + /* 传入认证令牌 */ + console.log('continue publicFinishFunc'); + await publicFinishFunc(handle, fingerAuthToken, encryptOptions); + console.log('end publicFinishFunc'); + if (finishOutData === stringToUint8Array(cipherInData)) { + console.error('test finish encrypt error'); + } else { + console.info('test finish encrypt success'); + } +} +// [End user_authentication_and_access_control_guide] +async function main() { + await testGenKeyForFingerprintAccessControl(); + await testInitAndAuthFinger(); +} + +@Entry +@Component +struct Index { + @State message: string = 'UserIdentityAuthentication'; + + build() { + Column({ space: 12 }) { + Text(this.message).fontSize(20) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.user_identity_authentication')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await main(); + this.message = 'Call Result: Success'; + } catch (error) { + this.message = 'Call Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/module.json5 b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/module.json5 new file mode 100644 index 0000000..9a475d7 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/module.json5 @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ], + "requestPermissions": [ + { + "name": "ohos.permission.ACCESS_BIOMETRIC" + } + ] + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/element/color.json b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/element/float.json b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/element/float.json new file mode 100644 index 0000000..a0a93dd --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "page_text_font_size", + "value": "50fp" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/element/string.json b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..dd4d931 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/element/string.json @@ -0,0 +1,24 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "AccessControl" + }, + { + "name": "fine_grained_user_identity_authentication_call", + "value": "Call" + }, + { + "name": "user_identity_authentication", + "value": "Call" + } + ] +} diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/media/background.png b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/media/foreground.png b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f 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

c)ijgxDm}8EsRXFt3h@+Ufr7@DN z^55r2UpdZvo*$)c`MJ_3zXBARbH%T}ifygzYy6g*WBtspGU<*Ccb`wpyW!Ui$gZ}y zo>MwK`K>f-62KfvO2{S zXF|ni6T=gB=C>=mF~5ojWS?I%DBt!ouB^&}v*S8G>5&(6>bM<0W9)PIeSXbv;v2lq zgZx&0)nJZqzUPEz=3RZouldy~VSciFe9|fxrs_KoD#u$hYz3BTu8Twxs@yt>*lp{< zm_XbpVEfL5#v}%x;+@AY<0*cV$ZF-248A&7CXCUG-9e@z7Va=V8J*&{q4I$n{~M-~K{qUmg-Y{N~tC__Y!6wZ`uS zAN=8SKnb`wARia}P{>}4q*mFJ2rt$xz9z}40>2@prKgMpJ4y?1MK zsu;8LLY(s8tNKp-L`??i35r}^567PuI=u8S&*EdFoy9Nf;48%{S#m8d=h|q*N!*Hw zE&QzCc2jn4u4(uar*pTPKCQ7DC)&Cs49?>3$7+X~)XJA`!=HT>p7`~r%@S~FvIWT% zL)t28t$h|BY!xpHnSQNXihG*>p${(0U;hi2mrwZcOUrZh0ee^UiT1oYO{3$5Hop*u zLXEN0l1qM=vD`rN)XOLJdon_5oHz3`AzpsrE1f=|*Mk1={U^)6{EcJ3kodUYZmX=p z&l4~2a)h&L*mG4|<3d+3_?Prr)`vgu$Y1U7EWIl2?@iUEd5K>;n9zxxlFNU^0vTLl zH@o9AcfQkuuVr{d?>6N1tv`70$?|*eKGqA1!uC8^rS(s+P1LOQ9lYFac+7nk_^^=}_9|LQHrRm;gm z#jgtmwd-2xd;fSm;rGSZd-@wbDeXS|)%sP&lv@b1qs`Sf43!0V?3qvsHeeF4^Q(*h z^}o7zxuRcU@`@_U0N4FIMxo}rPTLvJc{K#}XhYWmowJJ2$Yjbl`u)zkPnNIv?#GvR zeQ>x@oZ)FOm|m&l>_ivC(ek;URCk@4f5BINBIPcJedSknv#$7sL09O4r%@qb_M zz2et2d?)PSD|vhJv?jf^coe^7;*5D_(i{GoNjc@GFgNZjMJ5=HK91L-#6s_k5ZsDS zGS%RQ&sF+5eNE*3{W~3);ByDsjH9O)4$S@$?yR>?gy?){V`EPI$n>{$7kZJt&E|jq z@9tl&>KhB0wjiX?fvux_ph<@^P`xU#l~@YcVmvoP|52 zFCDST=db-|m-UT`(xE24+%n&4gZ%FnLi&Yo)!)!<`8*?XqEn@~PlG4oI{hPQc|SBA-3UqQo@Ok7n} zIAZ21l@78Rn`X^sw|ukiJP&AnypS?sjm)BYgRrvd_2vm*-zj>cKd@`Ab&91Yp=>6{)F%4)7auKu@lUJhnvWozKNZb^uG+`E@Y3=U zeK~|@uUf1nf;jWRpXQgYuqA_|MTZQJmcB;TNR^GlS{T8}iC6rO{IH|tWqO{uY5h}C zK^05FmfvX7IMk$1hE*ehH{+tKyHIa1DdB;;rJvHi z@XysN8q8vy7k-&z&tLr~zqICPT-#vO+|kk)bI{UP%}!$rHS^6TDD1uXt~a|@W*~+c z8vo^wJW;Rw34f4ZJkG`2_D~Yj%WRNd2O^Mwn=s<$0*s{9@EYCPT5v)bA~e(n|~6M0EUxGtnrcN&$s(s zzN8S(XWAcol9+ za@NCPqQw`HsBTqo#8>DWj&U^~+CTP~&69^IHqX$ty#E|%_>m7|XO7~asM|V+|Xy_l(fh&fm#RNST>VcoN?=6S_DPi%0~BG=sQt4-78)-@|b)lahBHa~PL<9jHj zNE~dl9PG02qUPM@QPu+cEDu-Af8%z}zB%Ihfge*{9Wd$&G+)E(=&9+o!^CjO`cwNdjVRH+WU`h_MXAOitJp5x3ifW{$igPf9iBj$(b=HI#x==`-hy-E&gI#->XR(BW&pMdcoR19-nNcPkY4s2bR7uK27u z;T-wi{Jv$d3tg^Khr|3zu!D-f$3GV1rd-BjB{h8+psmB&uHFO}3e<>-KnIym}P_oSC zslstp61Dm&1NiV|^pEbaNt}ZX!rh1GA<@OoA~K`yhAgd{@foOROsg!`F}gM(u1!jB zP-&PeM7Vk8W1#d^)-p1e`o(13g|c~w?dj`;4_bZu^_E|g3d=E{cLES;rdxmDH283uG=7WUKG<2~ea{IxU4q0( zBCeM((XD0e;O571>R|^u&Ev*jpsQGwzvm-2(K$^ICifY)?_e`E(umG-isbY(H;sFS z_TV{-u;uIR9OWMt?$V=eCxZbQ9k$3lC>2^A@xz~@XvD&(_uWN31AO=Zpf(=jB!lHh zOT3|j8)NsuFr00(J`~5*Aa@-yCcZDeY#2MK^7+byjE?yuYo4B|14zoWZPTeh8BIOF zi#LZ9-0pPpQq1&2arSg`YF@vQoGhb26RLwnlb*1L_^M-Vlx>giHItHpV-y+pt6ZEK z556G7lZ4?GS?qbNp_S;OAM&IlDs9+mIL@;^vinA)D6z3H9OHAVWxzHP_n^luSJ#<< zbsIty2lS^g(Tp%sL>_Jx%DMrbLPR&IRuN*2au@Mv3b3wQaDyVnmOp4Ma3Q*l1@}l- z7!@6xqcC>X;&3#^WC@2>d~Pt-WCFI;DSS*he8-yHfN>hl!&k7gZRoJWX*}IU_<3Dv zFh%O=_d;$wPTu#$88_QzeaYlJH`gOD^~u}%0AtVi0{v!P<5awgzdH2uJ`V|wUL*2lawezA2~fq&{P;mfB?8T6HUC*4h6A&Uoa8O-j$RT~z$aZBVg6 zzF?cyl6N zdHw?sJ7Tp$XXHMr#>SS7hWS(q4Vv|F6FxR`qoAKa__u1W&%AQI4T^VKan^IyU>zfs zE|$R$NQPNwnbWKcmi{dLjG5%b9r@2i8f!K??SvY4H+*lPY@EblJRiC1P#E;CqroIW z@amJ2xy(A56v{9|GuaTpMMj+DK>H#%Xah4-!k=}#^ zneQH-ALI49-brtya+(0Rs?MoH;W4xa=7q~HKFb7Z1nBuy5&@vrkTKXDY=saRII;oP z3R%&P2^nF-NYearIVR*J3O2Ys934KH3%!qF8Ezacu`vg0S*Oab^yt!p+xLq-xy5gM z#Kw5jI=`XA!CkZ&zAqE&VEj1=NFmPhl*4MSO=PEas`~e2-T71-1sApc|fu*Q}= zsYFnC_DZcy+zSDb@&j)&>t^-n;oK7;%>Y=GI zf;q6^#lf=W>#ky4S#ll)lVVQT_DO*_|C(c%5cIB9nT$1w zdZdwu#x~{=-+@S!Al?*`YqRX_$W)w|mL<42l`iKk-%cwYqIN?eH8`i)kL=}d1?JZx ztLCs2KGwvGug#(X==ud4yo;s5T!B+uNNV9YMyc!;d~C+efEeaJa{IVw7aDzJFOkR6 zSlJt<<>?A3vyx@)YW!;#RD~3cJ<+yt$FWi*K*_8K6|i@y5t3Ja zJ+H|ads>I+vjj95MRGK=^x>=qv2joEMXBp_IFN4`AdHaye#ZCSN+T3ki zEEWhGJ-%>&Q^eAnKgqhuJba{|Jl+AxddOr{Cxi+(@50!IbHi4?hjyY5LQ=XVPTEpb zyqVjwx1@vOf~d3GC@cCi=V6PSGqd|Ua>`SZ|JP5mkUUL?=|EPi{@-nlH?JLkAw z*sMbLgtgvL+o_1?*wJfZjcXpC5>GR~M4yu?y`l7N54Pg1hB01ME2+8Z!14qfU-Yz@ zpP&@C_lf&Q^@(4j;1EbkPV$`KhCay2t@XoalE&DO(HG;)bGsV$(1$|8a365@r{WKw zNW$FkEp^Sm<|7b9uV3Ad{N#D~L@0goVuYqx6L^T_<{Zg#=0otZT7J0Sg93< zJ_mX2IquB#Bm6s#^rsweb>du#$y5q2icb}=oNpi;{UA7T{^iK)*yGw5d6=pq_?*D>mRC&iQRDaItw;A9 zUwyN}YMcO55)^&3H9%p>YklyFuHBgRqrZ5o{^}Fg-RyE2Q&BkPr4P7!;2dsBBY5kZ z6MOo=-HSke#!JD&S`O^!e_!8v^T8YV)+p1?{L!gB{K1puy1vT%sWe=-JBLXqC(&~o zh8QdS8g_rYT88wPo<6+$(H>5CKO8#&q^#c>*j4hprAvR9e{%Kyt8YGf`?u>?8Tz14 zS1k!Et{sV(!ehcu#U^0M9yMmukRS`=W<1D5*Xuj%0?f#3B#i1AuV%Dk0a#p(np`Z z@Ny<>{{ZDV5+@v)mOs>&&;9Vv>-)pHaOkS3YygE%;ePHnZ!h`bKx(H9HZuLnZ`piM z2ii=ClLN3rsu>=c{+jNjKd(=0rLpid^!u4*y(mWJPG6kjm0Yv8i=0jt@0q$c?3SO6 zo`T_+i0(Myt98b;JQvD(PJ8@c_^spR4R6xbATVp;gA^fWJoolt6Viy=aHkR(bL6>a z0*u#QIOR-CHs#1eI_@gp{LgMJH~1i?ZcMM{ufkCb2He+@V%l*Br$@ccN`(OGk)9u)8Cl^IS$70>cnNtJOD;^adIv1mfzOH@{j*A zpUGT+)Iu&-&YD8$81J|E-`Afpo?Sod(=~-f1KG?W4N<>A4H|trX(W)6k{Oa&+m(#9NV~FpO<-jgq5FpLo=R80h%`t-tc094&kfl2?<-(g>J|r?=r^r}OA> zmp&f(`pX~wSI3@L@|*kMoPV!t)up3lQ3afNHGkNJ?ukAA%&S+P!*d|=aQo0Nz5YfK zKR4s_UId|>uzYyqbjJt5=GTt(Ez-yS$U9G{Cqm(9+ajN> zgT~ide(a0*RMefm>R_qQXttNTKUJiWa#G(o>gibbxL(-&eO>l^>-4Yw{;}#f=Ndog zTpjgwLr5GKkp=Bm^VjU9%39U~*@|iCk3RCfSN<|`f4G7d?}tSDTy`AIwQL?;#$97+ ztSvnwvYK=4p}Io0?fv>@g@5oyeJpBc$rtZF^xS26hCWZ4#Yok->p2VeHu^YSPUGG2k^A|XtmgmW>+a9E=9)4OCk5TSW^(Rd;pI_JfySLre zQLOv*sbCN46V?6wuS}=FN|eBT_p(bFq*`MXpIA`Vg(EMp(umI{;a4t?=!xmyYV?&H2P7PMKv=d+vjRBWh(As6Lj0Qcn$#3?!%y6`&&<3aj!!;n$@xk0 z*`QFf2~yb7*ZgYBR84)J;s=KZ&x_vE!tWtII60`G5(@|IFyHPr=5zVG<@(X_<1hTc z_kGCwAo)o&!Uw+XL*A!{f;S*LxN;y5=0e-ZrK)pdNED2liw(!iVbw-%n7!XMpG8kA zGUJMmr0RBj5-MyJddQOpL{O*s7%s{`6u+WXrgQwlI?smCIg$&Q{AYgqCt0wKb7$_% zm%{TugWsEv_{Fa|uJO;}cZ_9uLpG0)>jq*Vhu`WPlbLjiH(IU~Fm-o{X+n|rIebs+ zBK*FBMohVN%r4@=_@qH>4)KXqe5CL#cK)Tu;+Dei@z-rsKEYOe;uO{W-~*^lGv{e} zg4af91r84J?WZul<4pXy&Q9bMAD7uEiayKu@j6WtFdw~+#;%<5b$dDfR;X#?4us;} z-~EhV6zs>~=Rof`?o~=VM~9%M_?8J+n!&AcCV)?AP=;fE71{~UeEA>#S{QucDki=r zzHybu$j{hvT>Nr&n2+r=zY;+&dlw*cHh$KbFJ$UN=-6jIG7AR2vDH_c$iN1FmhpRt z?{%2s!?BZglURd~-k|DP8~&9Flv)o?mLI$Jz3h>-Z8i{UeJRS<(K9vL#!-~$F*1Sp z9>4-|wb7EC2gB>kF9$2`EI#_O(HBeOdGZy+=Ze2BPH_+Mi?qgP47=j(>kB=mJ%oMS z9r<0iE@an9F`Z)KGra&4x%#2EIrCiSSMf=2pI?~4w>$UPbpC{gT;8zlrl=Bb2 zc!MuoiVfHWSDf^|NDlF(^ZW;&*`LSHX6X1EeyW$cIeN{P*pA<}=H;OUB#~>P2l%!Y z!u69#KlsSz*U2UJ{M*;+{q-Mwz4pdlJGFtZ-+TGiS1Ql<#B&y|xO2F8BP#-G95X!= zS3AtF&0v5*jT?Lk8~!j1%0_T}otooBko6is#Sgz&6@Aj7$ONp`$^7Ks*zOGN$=Vl+ z!3WfQyRB%BY(65Ff(S*v1=yWtyJ{I0gB$4W-~OP!g>&~BlI$ss{JeWJ0Y~lvE4La}LgwmJ{B^=-^LrxrR*K+!NY34Y z%M z<9FfUS32e(gAJbEtbl5ub8iasSIo+HYW6cI2(;PPCVrX9hj6>)HIID%gYPzH@6^%v zv^{*@-@5)2n!;y#NN$bBu|)+fn^0}89(_q=8AGE|lG!A3qm}-*G$sPd@g2 zSN`*ry_F8$fdaX8yu3>5_^=Mm3a>SxDq|(W496V3gthog+!l-+gI^0x3>K~U0B9_I z@g1v9#%%cbQY(J<)|7{e%NhR$c6@0R)3;{wt|Y5hT-qAn?23((Ie*Is_;P_4Gx3j1 z3^!RMCcZ=O#~*wM_}}BBm6H6+W|(D1K9`SA_)O&v{7zZehxLm7tBQH}eC`H%|3AL+ zwv$WC=ZSiwBbOHn*aasRMW->jDp-wcQfvqt$sDPv&GGOq`KuGkd^o;c>O`@?JJE_` zdU788%6;TNa;;()znFK!uf=i(n|UXb!}$}T5F5S&N6!Fu`(`Au^2Zij=Z|V?HNBZ# z{Jg_J&>P3Qlh3>HhAVHIXs5)?*?J{TB9TPPY-Gp32p`^F3!lv=`TY2MT!#Dn_EX5YDwXjm4@%zo zyA%j0dpPZ8aUi>rp!dHqyG~d+l6Q>+x9T-*oC&4dQmFv;TYcH~Spj>DJ0esIt zzWNO+#A`{>E5i(Xk;Z0`sjgNLsQM^ePYfMu`tZTDpWqGSgiZetwnduxeT7P8ynTsi zel~9SC}kpn5&t6m<~Z?*-@e9Xw_7%@1cxGiwOUv!*ZAgV{^YpI;WyoHSsAi`#H6j9 zt$aSe;%xY&tQ7Q@%CCLw|GfH*c7B0V=63;TLHuy07aBFXpK@e@kz6>#YSGcv3{ghz zzVXF3=^Q@()T&z5KP7&Q>i!XZTNu&$kfkNQnO!8-_aDL+?R~C8sjF4t! z6x@c9tB)3F@nK85F<=By?G&Gi4}X@LiXJ2XmM&tvDMDVeZJcH{s6W+y1bgFn`9~ZXTFjEjziZ(}(o3vn z`%X>ZGshK%2W48h%Jnqix>9=bSGbGC-{Va~Hp{r_k-l2)R5e=9GXJFTue#GuTPtHLO_kpoE;{;<|N8ou=yCIP zN<{A~WY5T@7mLhsKlK)EER*b9LF?v{dT-&+=Hpvd_~PVB{13->Hs|DD_AU++MKR^? zVbs#s_)ceV^X6!`7vaB08NBAP@4xarcZzYI{jMLv_MN@||G4r!x9+?3(b^}k&qm0m zIJo%3!Mf<)XVROminu6NX7e>E)#+h2O$}L)eu$)~=3}XaGUgyZ_V8KMnK#)7zjPHp z_Ts=j%wK(OAJ%4maf|Pa51wLAKZDR6(r+-k<@J}An;-pDHxE9y+0Rj)g#6$aUwirP zX!kYxQ0mVy-QN2yL-92;)+QS*i|kvrv|fAPK+-?Jmin%y1ZS6N0LGw(w2!|y(vgZ*y#F}>^b>-1db)Nj=f;xC|Ft8@YI zMIq1nn~#0+?)d1{!hey9e+8a5izk@{Oplez2GHqrSUlSN&@^wrvVyP!giSlmuO%9r zW`jOGD83?gYTjdlCEZT%G_f_YKb`yp!)N?Qcc8y6-5c~LFW-9YpKRX@b^v?Vs?#fW z*DlT`JnOH$|Jl3C_q|fP=kqnu&(d`7^YSrkS5(VraZMu&zIv_2t3qXyto_-1d=_pk z^vbJk!~$p|XLVszAW2V_Pv+Y=r{jaEb~--#@C&o@YkYyT{(x!uak=@SdyXFer}KN5 zFTlMk$hvZOMZ0@2f4q3@#*LTjFKs?eK|fUioJEMtmjUO-<02&yOE|p|V-%X=6Xv@X(oCxjr1jf2;npdQ$tQM<2QW z=azp~pZ|S`@O0`r&8O4l#eLPLy7n@?{`u15<>(>(HP?sj)ax^gp0C0^Q@=iWK*f2c zD)fL#sXs~F-K&MVM;neWi6M8@tERwteOT%%cv{JMqtu2a&-F?ld~arKwAH@y=LKKw z#h-2EA?L&VSjQ(K-_mq$Dl8u&b4}hKRXUGo8jtD{dqj15STlZy(C<7sI)2CQ_~fnE k9@EG3{4s5ok?kb>|H;3ubeVRY^#A|>07*qoM6N<$f~C=$asU7T literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/profile/backup_config.json b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/profile/main_pages.json b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..49a1be3 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,7 @@ +{ + "src": [ + "pages/Index", + "pages/FineGrainedUserIdentityAuthentication", + "pages/UserIdentityAuthentication" + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/dark/element/color.json b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/ets/test/Ability.test.ets b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..0f8ce9a --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/ets/test/AccessControl.test.ets b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/ets/test/AccessControl.test.ets new file mode 100644 index 0000000..55cf08d --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/ets/test/AccessControl.test.ets @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, beforeAll } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function accessControlTest() { + describe('accessControlTest', () => { + /** + * 打开应用 + */ + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + await driver.delayMs(1000); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * 点击按钮,用户身份认证访问控制 + */ + it('testAccessControl001', 0, async () => { + console.info('uitest: testAccessControl001 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('UserIdentityAuthentication')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(5000); + const button2 = await driver.findComponent(ON.text('Call')); + await button2.click(); + await driver.delayMs(10000); + await driver.assertComponentExist(ON.text('Call Result: Success')); + console.info('uitest: testAccessControl001 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,细粒度用户身份认证访问控制 + */ + it('testAccessControl002', 0, async () => { + console.info('uitest: testAccessControl002 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('FineGrainedUserIdentityAuthentication')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call')); + await button2.click(); + await driver.delayMs(10000); + await driver.assertComponentExist(ON.text('Call Result: Success')); + console.info('uitest: testAccessControl002 end'); + await driver.pressBack(); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/ets/test/List.test.ets b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..d923f98 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import accessControlTest from './AccessControl.test'; + +export default function testsuite() { + accessControlTest(); +} diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/module.json5 b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..c3fd9dd --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/hvigor/hvigor-config.json5 b/UniversalKeystoreKit/KeyUsage/AccessControl/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..d584c19 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/hvigorfile.ts b/UniversalKeystoreKit/KeyUsage/AccessControl/hvigorfile.ts new file mode 100644 index 0000000..2a5e543 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/AccessControl/oh-package.json5 new file mode 100644 index 0000000..e41bae0 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/ohosTest.md b/UniversalKeystoreKit/KeyUsage/AccessControl/ohosTest.md new file mode 100644 index 0000000..c32f4ad --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/AccessControl/ohosTest.md @@ -0,0 +1,9 @@ +# 访问控制测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| ------------------------------------- | ------------ | ---- | ---------------- | -------- | -------- | +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 点击按钮, 用户身份认证访问控制 | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | +| 点击按钮, 细粒度用户身份认证访问控制 | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/screenshots/FineGrainedUserIdentityAuthentication_1.png b/UniversalKeystoreKit/KeyUsage/AccessControl/screenshots/FineGrainedUserIdentityAuthentication_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9d4191509b5ebb1f3a3608d9e5dc9743686029c3 GIT binary patch literal 23511 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 D>g?p# literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/screenshots/FineGrainedUserIdentityAuthentication_2.png b/UniversalKeystoreKit/KeyUsage/AccessControl/screenshots/FineGrainedUserIdentityAuthentication_2.png new file mode 100644 index 0000000000000000000000000000000000000000..ef7b57701e0bcc3d9349fe37ffe6289b3607d2b4 GIT binary patch literal 21605 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�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 J5>sMl{tKLPiIxBW literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/AccessControl/screenshots/UserIdentityAuthentication_2.png b/UniversalKeystoreKit/KeyUsage/AccessControl/screenshots/UserIdentityAuthentication_2.png new file mode 100644 index 0000000000000000000000000000000000000000..822396a2128a8f3e682ecb7e75785840946fe3d7 GIT binary patch literal 21604 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/.gitignore b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/.gitignore new file mode 100644 index 0000000..d2ff201 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/.gitignore @@ -0,0 +1,12 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +/.appanalyzer \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/AppScope/app.json5 b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/AppScope/app.json5 new file mode 100644 index 0000000..ad9bc7f --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/AppScope/app.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "bundleName": "com.samples.encryptiondecryption", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/AppScope/resources/base/element/string.json b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/AppScope/resources/base/element/string.json new file mode 100644 index 0000000..3e3fade --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "EncryptionDecryption" + } + ] +} diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/AppScope/resources/base/media/app_icon.png b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a39445dc87828b76fed6d2ec470dd455c45319e3 GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/README.md b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/README.md new file mode 100644 index 0000000..863528d --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/README.md @@ -0,0 +1,160 @@ +## 加解密(ArkTS) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-encryption-decryption-arkts.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### AES/CBC/PKCS7 + +##### 介绍 + +1. 本示例主要介绍使用AES算法加密,用例中选取的分组模式为CBC、填充模式为PKCS7时,必须要填参数IV。 + +##### 效果预览 + +| 主页 | 删除 | +| ---------------------------------------------------------- | ---------------------------------------------------------- | +| | | + +使用说明 + +1. 点击AES/CBC/PKCS7按钮生成密钥,加密数据并解密数据,删除密钥。 + +#### AES/GCM/NoPadding + +##### 介绍 + +1. 本示例主要介绍使用AES算法加密,用例中选取的分组模式为GCM时,必须要填参数NONCE,AAD可选。 + +##### 效果预览 + +| 主页 | 删除 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| | | + +使用说明 + +1. 点击AES/GCM/NoPadding按钮生成密钥,加密数据并解密数据,删除密钥。 + +#### RSA/ECB/PKCS1_V1_5 + +##### 介绍 + +1. 本示例主要介绍使用RSA算法加密,需要选择其对应分组模式以及填充模式和摘要算法DIGEST。 + +##### 效果预览 + +| 主页 | 删除 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| | | + +使用说明 + +1. 点击RSA/ECB/PKCS1_V1_5按钮生成密钥,加密数据并解密数据,删除密钥。 + +#### RSA/ECB/OAEP/SHA256 + +##### 介绍 + +1. 本示例主要介绍使用RSA算法加密,需要选择其对应分组模式以及填充模式和摘要算法DIGEST。 + +##### 效果预览 + +| 主页 | 删除 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| | | + +使用说明 + +1. 点击RSA/ECB/OAEP/SHA256按钮生成密钥,加密数据并解密数据,删除密钥。 + +#### SM2 + +##### 介绍 + +1. 本示例主要介绍使用SM2算法加密,摘要算法DIGEST需要指定为SM3。 + +##### 效果预览 + +| 主页 | 删除 | +| -------------------------------------------------- | -------------------------------------------------- | +| | | + +使用说明 + +1. 点击SM2按钮生成密钥,加密数据并解密数据,删除密钥。 + +## 加解密(C/C++) + +### 介绍 + +1. 本工程实现了对以下 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-encryption-decryption-ndk.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### Call C/C++ + +##### 介绍 + +1. 本示例主要介绍加解密,以AES 256密钥为例,完成加解密。 + +##### 效果预览 + +| 主页 | | +| -------------------------------------------------- | -------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call C/C++按钮生成密钥,加密数据并解密数据,删除密钥。 + +## 工程目录 + +``` +entry/src/main/ +|---ets +|---|---entryability +|---|---|---EntryAbility.ets +|---|---pages +|---|---|---AESCBCPKCS7.ets +|---|---|---AESGCMNoPadding.ets +|---|---|---Index.ets // 首页 +|---|---|---RSAECBOAEPSHA256.ets +|---|---|---RSAECBPKCS1_V1_5.ets +|---|---|---SM2.ets +|---cpp +|---resources // 静态资源 +|---ohosTest +|---|---ets +|---|---|---tests +|---|---|---|---EncryptionDecryption.test.ets // 自动化测试用例 +``` + + +## 相关权限 + +无。 + +## 依赖 + +不涉及。 + +## 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.2 Release及以上。 + +3. DevEco Studio版本:DevEco Studio 5.0.2 Release及以上。 + +4. HarmonyOS SDK版本:HarmonyOS 5.0.2 Release及以上。 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo UniversalKeystoreKit/KeyUsage/EncryptionDecryption > .git/info/sparse-checkout +git remote add origin https://gitee.com/harmonyos_samples/guide-snippets.git +git pull origin master +``` \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/build-profile.json5 b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/build-profile.json5 new file mode 100644 index 0000000..fb5a1ab --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/code-linter.json5 b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/code-linter.json5 new file mode 100644 index 0000000..2858646 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/code-linter.json5 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/.gitignore b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/build-profile.json5 b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/build-profile.json5 new file mode 100644 index 0000000..2d8b081 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": [ + "arm64-v8a", + "x86_64" + ] + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/hvigorfile.ts b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/hvigorfile.ts new file mode 100644 index 0000000..e4f43d5 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/oh-package.json5 new file mode 100644 index 0000000..118bdd4 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/oh-package.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/CMakeLists.txt b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..870045a --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(EncryptionDecryption) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) +target_link_libraries(entry PUBLIC libace_napi.z.so libhuks_ndk.z.so) \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/napi_init.cpp b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000..c4f84a6 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// [Start encrypt_and_decrypt] +#include "huks/native_huks_api.h" +#include "huks/native_huks_param.h" +#include "napi/native_api.h" +#include + +OH_Huks_Result InitParamSet(struct OH_Huks_ParamSet **paramSet, const struct OH_Huks_Param *params, + uint32_t paramCount) +{ + OH_Huks_Result ret = OH_Huks_InitParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_AddParams(*paramSet, params, paramCount); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + ret = OH_Huks_BuildParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + return ret; +} + +static const uint32_t IV_SIZE = 16; +static uint8_t IV[IV_SIZE] = {0}; // this is a test value, for real use the iv should be different every time +static struct OH_Huks_Param g_genEncDecParams[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_AES}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_ENCRYPT | OH_HUKS_KEY_PURPOSE_DECRYPT}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_AES_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_PADDING, .uint32Param = OH_HUKS_PADDING_NONE}, + {.tag = OH_HUKS_TAG_BLOCK_MODE, .uint32Param = OH_HUKS_MODE_CBC}}; + +static struct OH_Huks_Param g_encryptParams[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_AES}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_ENCRYPT}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_AES_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_PADDING, .uint32Param = OH_HUKS_PADDING_NONE}, + {.tag = OH_HUKS_TAG_BLOCK_MODE, .uint32Param = OH_HUKS_MODE_CBC}, + {.tag = OH_HUKS_TAG_IV, + .blob = { + .size = IV_SIZE, + .data = (uint8_t *)IV // this is a test value, for real use the iv should be different every time + }}}; + +static struct OH_Huks_Param g_decryptParams[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_AES}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_DECRYPT}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_AES_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_PADDING, .uint32Param = OH_HUKS_PADDING_NONE}, + {.tag = OH_HUKS_TAG_BLOCK_MODE, .uint32Param = OH_HUKS_MODE_CBC}, + {.tag = OH_HUKS_TAG_IV, + .blob = { + .size = IV_SIZE, + .data = (uint8_t *)IV // this is a test value, for real use the iv should be different every time + }}}; + +static const uint32_t AES_COMMON_SIZE = 1024; +OH_Huks_Result HksAesCipherTestEncrypt(const struct OH_Huks_Blob *keyAlias, + const struct OH_Huks_ParamSet *encryptParamSet, + const struct OH_Huks_Blob *inData, struct OH_Huks_Blob *cipherText) +{ + uint8_t handleE[sizeof(uint64_t)] = {0}; + struct OH_Huks_Blob handleEncrypt = {sizeof(uint64_t), handleE}; + OH_Huks_Result ret = OH_Huks_InitSession(keyAlias, encryptParamSet, &handleEncrypt, nullptr); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_FinishSession(&handleEncrypt, encryptParamSet, inData, cipherText); + return ret; +} + +OH_Huks_Result HksAesCipherTestDecrypt(const struct OH_Huks_Blob *keyAlias, + const struct OH_Huks_ParamSet *decryptParamSet, + const struct OH_Huks_Blob *cipherText, struct OH_Huks_Blob *plainText, + const struct OH_Huks_Blob *inData) +{ + uint8_t handleD[sizeof(uint64_t)] = {0}; + struct OH_Huks_Blob handleDecrypt = {sizeof(uint64_t), handleD}; + OH_Huks_Result ret = OH_Huks_InitSession(keyAlias, decryptParamSet, &handleDecrypt, nullptr); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_FinishSession(&handleDecrypt, decryptParamSet, cipherText, plainText); + return ret; +} + +static napi_value EncDecKey(napi_env env, napi_callback_info info) +{ + char tmpKeyAlias[] = "test_enc_dec"; + struct OH_Huks_Blob keyAlias = {(uint32_t)strlen(tmpKeyAlias), (uint8_t *)tmpKeyAlias}; + struct OH_Huks_ParamSet *genParamSet = nullptr; + struct OH_Huks_ParamSet *encryptParamSet = nullptr; + struct OH_Huks_ParamSet *decryptParamSet = nullptr; + OH_Huks_Result ohResult; + do { + /* 1. Generate Key */ + /* + * 模拟生成密钥场景 + * 1.1. 确定密钥别名 + */ + /* + * 1.2. 获取生成密钥算法参数配置 + */ + ohResult = InitParamSet(&genParamSet, g_genEncDecParams, sizeof(g_genEncDecParams) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* + * 1.3. 调用generateKeyItem + */ + ohResult = OH_Huks_GenerateKeyItem(&keyAlias, genParamSet, nullptr); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 2. Encrypt */ + /* + * 模拟加密场景 + * 2.1. 获取密钥别名 + */ + /* + * 2.2. 获取待加密的数据 + */ + /* + * 2.3. 获取加密算法参数配置 + */ + ohResult = InitParamSet(&encryptParamSet, g_encryptParams, sizeof(g_encryptParams) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + char tmpInData[] = "AES_ECB_INDATA_1"; + struct OH_Huks_Blob inData = {(uint32_t)strlen(tmpInData), (uint8_t *)tmpInData}; + uint8_t cipher[AES_COMMON_SIZE] = {0}; + struct OH_Huks_Blob cipherText = {AES_COMMON_SIZE, cipher}; + /* + * 2.4. 调用initSession获取handle + */ + /* + * 2.5. 调用finishSession获取加密后的密文 + */ + ohResult = HksAesCipherTestEncrypt(&keyAlias, encryptParamSet, &inData, &cipherText); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 3. Decrypt */ + /* + * 模拟解密场景 + * 3.1. 获取密钥别名 + */ + /* + * 3.2. 获取待解密的密文 + */ + /* + * 3.3. 获取解密算法参数配置 + */ + ohResult = InitParamSet(&decryptParamSet, g_decryptParams, sizeof(g_decryptParams) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + uint8_t plain[AES_COMMON_SIZE] = {0}; + struct OH_Huks_Blob plainText = {AES_COMMON_SIZE, plain}; + /* + * 3.4. 调用initSession获取handle + */ + /* + * 3.5. 调用finishSession获取解密后的数据 + */ + ohResult = HksAesCipherTestDecrypt(&keyAlias, decryptParamSet, &cipherText, &plainText, &inData); + } while (0); + /* 4. Delete Key */ + /* + * 模拟删除密钥场景 + * 4.1. 获取密钥别名 + */ + /* + * 4.2. 调用deleteKeyItem删除密钥 + */ + (void)OH_Huks_DeleteKeyItem(&keyAlias, genParamSet); + + OH_Huks_FreeParamSet(&genParamSet); + OH_Huks_FreeParamSet(&encryptParamSet); + OH_Huks_FreeParamSet(&decryptParamSet); + + napi_value ret; + napi_create_int32(env, ohResult.errorCode, &ret); + return ret; +} + + +// [End encrypt_and_decrypt] + +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + {"encDecKey", nullptr, EncDecKey, nullptr, nullptr, nullptr, napi_default, nullptr}}; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void *)0), + .reserved = {0}, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); } diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/types/libentry/index.d.ts b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 0000000..49fa4d0 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const encDecKey: () => number; \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/types/libentry/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000..2826cc7 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libentry.so", + "types": "./index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/entryability/EntryAbility.ets b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..edc2839 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..b1e2129 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/AESCBCPKCS7.ets b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/AESCBCPKCS7.ets new file mode 100644 index 0000000..9d0ac6f --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/AESCBCPKCS7.ets @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start encrypt_and_decrypt_AESCBCPKCS7] +/* + * 以下以AES/CBC/PKCS7的Promise操作使用为例 + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +let aesKeyAlias = 'test_aesKeyAlias'; +let handle: number; +let plainText = '123456'; +let IV = '001122334455'; +let cipherData: Uint8Array; + +function stringToUint8Array(str: String) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function uint8ArrayToString(fileData: Uint8Array) { + let dataString = ''; + for (let i = 0; i < fileData.length; i++) { + dataString += String.fromCharCode(fileData[i]); + } + return dataString; +} + +function getAesGenerateProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | + huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }]; + return properties; +} + +function getAesEncryptProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_PKCS7 + }, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_CBC + }, { + tag: huks.HuksTag.HUKS_TAG_IV, + value: stringToUint8Array(IV) + }]; + return properties; +} + +function getAesDecryptProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_PKCS7 + }, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_CBC + }, { + tag: huks.HuksTag.HUKS_TAG_IV, + value: stringToUint8Array(IV) + }]; + return properties; +} + +async function generateAesKey() { + /* + * 模拟生成密钥场景 + * 1. 确定密钥别名 + */ + /* + * 2. 获取生成密钥算法参数配置 + */ + let genProperties = getAesGenerateProperties(); + let options: huks.HuksOptions = { + properties: genProperties + } + /* + * 3. 调用generateKeyItem + */ + await huks.generateKeyItem(aesKeyAlias, options) + .then((data) => { + console.info(`promise: generate AES Key success, data = ${JSON.stringify(data)}`); + }).catch((error: Error) => { + console.error(`promise: generate AES Key failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function encryptData() { + /* + * 模拟加密场景 + * 1. 获取密钥别名 + */ + /* + * 2. 获取待加密的数据 + */ + /* + * 3. 获取加密算法参数配置 + */ + let encryptProperties = getAesEncryptProperties(); + let options: huks.HuksOptions = { + properties: encryptProperties, + inData: stringToUint8Array(plainText) + } + /* + * 4. 调用initSession获取handle + */ + await huks.initSession(aesKeyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((error: Error) => { + console.error(`promise: init EncryptData failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) + /* + * 5. 调用finishSession获取加密后的密文 + */ + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: encrypt data success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + cipherData = data.outData as Uint8Array; + }).catch((error: Error) => { + console.error(`promise: encrypt data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function decryptData() { + /* + * 模拟解密场景 + * 1. 获取密钥别名 + */ + /* + * 2. 获取待解密的密文 + */ + /* + * 3. 获取解密算法参数配置 + */ + let decryptOptions = getAesDecryptProperties() + let options: huks.HuksOptions = { + properties: decryptOptions, + inData: cipherData + } + /* + * 4. 调用initSession获取handle + */ + await huks.initSession(aesKeyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((error: Error) => { + console.error(`promise: init DecryptData failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) + /* + * 5. 调用finishSession获取解密后的数据 + */ + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: decrypt data success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + }).catch((error: Error) => { + console.error(`promise: decrypt data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function deleteKey() { + /* + * 模拟删除密钥场景 + * 1. 获取密钥别名 + */ + let emptyOptions: huks.HuksOptions = { + properties: [] + } + /* + * 2. 调用deleteKeyItem删除密钥 + */ + await huks.deleteKeyItem(aesKeyAlias, emptyOptions) + .then((data) => { + console.info(`promise: delete data success`); + }).catch((error: Error) => { + console.error(`promise: delete data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + + +// [End encrypt_and_decrypt_AESCBCPKCS7] + + +@Entry +@Component +struct Index { + @State message: string = 'AES/CBC/PKCS7'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.aes_cbc_pkcs7')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await generateAesKey(); + await encryptData(); + await decryptData(); + await deleteKey(); + this.message = 'AES/CBC/PKCS7 Result: Success'; + } catch { + this.message = 'AES/CBC/PKCS7 Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/AESGCMNoPadding.ets b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/AESGCMNoPadding.ets new file mode 100644 index 0000000..ea053a5 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/AESGCMNoPadding.ets @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start encrypt_and_decrypt_AESGCMNoPadding] +/* + * 以下以AES/GCM/NoPadding的Promise操作使用为例 + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +let aesKeyAlias = 'test_aesKeyAlias'; +let handle: number; +let plainText = '123456'; +let cipherData: Uint8Array; +let AAD = '1234567890123456'; +let NONCE = '001122334455'; + +function stringToUint8Array(str: String) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function uint8ArrayToString(fileData: Uint8Array) { + let dataString = ''; + for (let i = 0; i < fileData.length; i++) { + dataString += String.fromCharCode(fileData[i]); + } + return dataString; +} + +function getAesGenerateProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | + huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }]; + return properties; +} + +function getAesGcmEncryptProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE + }, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_GCM + }, { + tag: huks.HuksTag.HUKS_TAG_NONCE, + value: stringToUint8Array(NONCE) + }, { + tag: huks.HuksTag.HUKS_TAG_ASSOCIATED_DATA, + value: stringToUint8Array(AAD) + }]; + return properties; +} + +function getAesGcmDecryptProperties(cipherData: Uint8Array) { + let properties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE + }, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_GCM + }, { + tag: huks.HuksTag.HUKS_TAG_NONCE, + value: stringToUint8Array(NONCE) + }, { + tag: huks.HuksTag.HUKS_TAG_ASSOCIATED_DATA, + value: stringToUint8Array(AAD) + }, { + tag: huks.HuksTag.HUKS_TAG_AE_TAG, + value: cipherData.slice(cipherData.length - 16) + }]; + return properties; +} + +async function generateAesKey() { + /* + * 模拟生成密钥场景 + * 1. 确定密钥别名 + */ + /* + * 2. 获取生成密钥算法参数配置 + */ + let genProperties = getAesGenerateProperties(); + let options: huks.HuksOptions = { + properties: genProperties + } + /* + * 3. 调用generateKeyItem + */ + await huks.generateKeyItem(aesKeyAlias, options) + .then((data) => { + console.info(`promise: generate AES Key success, data = ${JSON.stringify(data)}`); + }).catch((error: Error) => { + console.error(`promise: generate AES Key failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function encryptData() { + /* + * 模拟加密场景 + * 1. 获取密钥别名 + */ + /* + * 2. 获取待加密的数据 + */ + /* + * 3. 获取加密算法参数配置 + */ + let encryptProperties = getAesGcmEncryptProperties(); + let options: huks.HuksOptions = { + properties: encryptProperties, + inData: stringToUint8Array(plainText) + } + /* + * 4. 调用initSession获取handle + */ + await huks.initSession(aesKeyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((error: Error) => { + console.error(`promise: init EncryptDataGcm failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) + /* + * 5. 调用finishSession获取加密后的密文 + */ + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: encrypt data success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + cipherData = data.outData as Uint8Array; + }).catch((error: Error) => { + console.error(`promise: encrypt data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function decryptData() { + /* + * 模拟解密场景 + * 1. 获取密钥别名 + */ + /* + * 2. 获取待解密的密文 + */ + /* + * 3. 获取解密算法参数配置 + */ + let decryptOptions = getAesGcmDecryptProperties(cipherData) + let options: huks.HuksOptions = { + properties: decryptOptions, + inData: cipherData.slice(0, cipherData.length - 16) + } + /* + * 4. 调用initSession获取handle + */ + await huks.initSession(aesKeyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((error: Error) => { + console.error(`promise: init DecryptDataGcm failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) + /* + * 5. 调用finishSession获取解密后的数据 + */ + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: decrypt data success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + }).catch((error: Error) => { + console.error(`promise: decrypt data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function deleteKey() { + /* + * 模拟删除密钥场景 + * 1. 获取密钥别名 + */ + let emptyOptions: huks.HuksOptions = { + properties: [] + } + /* + * 2. 调用deleteKeyItem删除密钥 + */ + await huks.deleteKeyItem(aesKeyAlias, emptyOptions) + .then((data) => { + console.info(`promise: delete data success`); + }).catch((error: Error) => { + console.error(`promise: delete data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +// [End encrypt_and_decrypt_AESGCMNoPadding] +@Entry +@Component +struct Index { + @State message: string = 'AES/GCM/NoPadding'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.aes_gcm_nopadding')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await generateAesKey(); + await encryptData(); + await decryptData(); + await deleteKey(); + this.message = 'AES/GCM/NoPadding Result: Success'; + } catch { + this.message = 'AES/GCM/NoPadding Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/DESCBCNoPadding.ets b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/DESCBCNoPadding.ets new file mode 100644 index 0000000..fbf1add --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/DESCBCNoPadding.ets @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start encrypt_and_decrypt_DESCBCNoPadding] +/* + * 以下以DES/CBC/NoPadding的Promise操作使用为例 + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +let desKeyAlias = 'test_desKeyAlias'; +let handle: number; +let plainText = '12345678'; +let IV = '12345678'; // 此处为样例代码,实际使用需采用随机值。 +let cipherData: Uint8Array; + +function stringToUint8Array(str: String) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function uint8ArrayToString(fileData: Uint8Array) { + let dataString = ''; + for (let i = 0; i < fileData.length; i++) { + dataString += String.fromCharCode(fileData[i]); + } + return dataString; +} + +function getDesGenerateProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_DES + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_DES_KEY_SIZE_64 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | + huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }]; + return properties; +} + +function getDesEncryptProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_DES + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_DES_KEY_SIZE_64 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE + }, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_CBC + }, { + tag: huks.HuksTag.HUKS_TAG_IV, + value: stringToUint8Array(IV) + }]; + return properties; +} + +function getDesDecryptProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_DES + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_DES_KEY_SIZE_64 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE + }, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_CBC + }, { + tag: huks.HuksTag.HUKS_TAG_IV, + value: stringToUint8Array(IV) + }]; + return properties; +} + +async function generateDesKey() { + /* + * 模拟生成密钥场景 + * 1. 确定密钥别名 + */ + /* + * 2. 获取生成密钥算法参数配置 + */ + let genProperties = getDesGenerateProperties(); + let options: huks.HuksOptions = { + properties: genProperties + } + /* + * 3. 调用generateKeyItem + */ + await huks.generateKeyItem(desKeyAlias, options) + .then((data) => { + console.info(`promise: generate DES Key success, data = ${JSON.stringify(data)}`); + }).catch((error: Error) => { + console.error(`promise: generate DES Key failed, ${JSON.stringify(error)}`); + }) +} + +async function encryptData() { + /* + * 模拟加密场景 + * 1. 获取密钥别名 + */ + /* + * 2. 获取待加密的数据 + */ + /* + * 3. 获取加密算法参数配置 + */ + let encryptProperties = getDesEncryptProperties(); + let options: huks.HuksOptions = { + properties: encryptProperties, + inData: stringToUint8Array(plainText) + } + /* + * 4. 调用initSession获取handle + */ + await huks.initSession(desKeyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((error: Error) => { + console.error(`promise: init EncryptData failed, ${JSON.stringify(error)}`); + }) + /* + * 5. 调用finishSession获取加密后的密文 + */ + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: encrypt data success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + cipherData = data.outData as Uint8Array; + }).catch((error: Error) => { + console.error(`promise: encrypt data failed, ${JSON.stringify(error)}`); + }) +} + +async function decryptData() { + /* + * 模拟解密场景 + * 1. 获取密钥别名 + */ + /* + * 2. 获取待解密的密文 + */ + /* + * 3. 获取解密算法参数配置 + */ + let decryptOptions = getDesDecryptProperties() + let options: huks.HuksOptions = { + properties: decryptOptions, + inData: cipherData + } + /* + * 4. 调用initSession获取handle + */ + await huks.initSession(desKeyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((error: Error) => { + console.error(`promise: init DecryptData failed, ${JSON.stringify(error)}`); + }) + /* + * 5. 调用finishSession获取解密后的数据 + */ + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: decrypt data success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + }).catch((error: Error) => { + console.error(`promise: decrypt data failed, ${JSON.stringify(error)}`); + }) +} + +async function deleteKey() { + /* + * 模拟删除密钥场景 + * 1. 获取密钥别名 + */ + let emptyOptions: huks.HuksOptions = { + properties: [] + } + /* + * 2. 调用deleteKeyItem删除密钥 + */ + await huks.deleteKeyItem(desKeyAlias, emptyOptions) + .then((data) => { + console.info(`promise: delete data success`); + }).catch((error: Error) => { + console.error(`promise: delete data failed, ${JSON.stringify(error)}`); + }) +} + + +// [End encrypt_and_decrypt_DESCBCNoPadding] + +@Entry +@Component +struct Index { + @State message: string = 'DES/CBC/NoPadding'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.des_cbc_nopadding')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await generateDesKey(); + await encryptData(); + await decryptData(); + await deleteKey(); + this.message = 'DES/CBC/NoPadding Result: Success'; + } catch { + this.message = 'DES/CBC/NoPadding Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/Index.ets b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..4a8ef93 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; +import testNapi from 'libentry.so'; + +@Entry +@Component +struct Index { + @State message: string = 'EncryptionDecryptionArkTS'; + + goToSample(url: string): void { + router.pushUrl({ + url: url, + }, router.RouterMode.Single, (err) => { + if (err) { + console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('pushUrl success'); + }) + } + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.enc_aes_cbc_pkcs7')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/AESCBCPKCS7') + }) + Button($r('app.string.enc_aes_gcm_nopadding')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/AESGCMNoPadding') + }) + Button($r('app.string.enc_rsa_ecb_pkcs1_v1_5')) + .width('70%') + .onClick(() => { + this.goToSample('pages/RSAECBPKCS1_V1_5') + }) + Button($r('app.string.enc_rsa_ecb_oaep_sha256')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/RSAECBOAEPSHA256') + }) + Button($r('app.string.enc_sm2')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/SM2') + }) + Button($r('app.string.enc_des_cbc_nopadding')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/DESCBCNoPadding') + }) + Button($r('app.string.call_cpp_enc_dec')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: number = testNapi.encDecKey(); + this.message = 'Call C/C++ Result: ' + ret.toString(); + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/RSAECBOAEPSHA256.ets b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/RSAECBOAEPSHA256.ets new file mode 100644 index 0000000..7945f06 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/RSAECBOAEPSHA256.ets @@ -0,0 +1,261 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start encrypt_and_decrypt_RSAECBOAEPSHA256] +/* + * 以下以RSA/ECB/OAEP/SHA256模式的Promise操作使用为例 + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +let rsaKeyAlias = 'test_rsaKeyAlias'; +let handle: number; +let plainText = '123456'; +let cipherData: Uint8Array; + +function stringToUint8Array(str: String) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function uint8ArrayToString(fileData: Uint8Array) { + let dataString = ''; + for (let i = 0; i < fileData.length; i++) { + dataString += String.fromCharCode(fileData[i]); + } + return dataString; +} + +function getRsaGenerateProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | + huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }]; + return properties; +} + +function getRsaEncryptProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_OAEP + }, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_ECB + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256 + }]; + return properties; +} + +function getRsaDecryptProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_OAEP + }, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_ECB + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256 + }]; + return properties; +} + +async function generateRsaKey() { + /* + * 模拟生成密钥场景 + * 1. 确定密钥别名 + */ + /* + * 2. 获取生成密钥算法参数配置 + */ + let genProperties = getRsaGenerateProperties(); + let options: huks.HuksOptions = { + properties: genProperties + } + /* + * 3. 调用generateKeyItem + */ + await huks.generateKeyItem(rsaKeyAlias, options) + .then((data) => { + console.info(`promise: generate RSA Key success, data = ${JSON.stringify(data)}`); + }).catch((error: Error) => { + console.error(`promise: generate RSA Key failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function encryptData() { + /* + * 模拟加密场景 + * 1. 获取密钥别名 + */ + /* + * 2. 获取待加密的数据 + */ + /* + * 3. 获取加密算法参数配置 + */ + let encryptProperties = getRsaEncryptProperties(); + let options: huks.HuksOptions = { + properties: encryptProperties, + inData: stringToUint8Array(plainText) + } + /* + * 4. 调用initSession获取handle + */ + await huks.initSession(rsaKeyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((error: Error) => { + console.error(`promise: init EncryptDataRsa failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) + /* + * 5. 调用finishSession获取加密后的密文 + */ + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: encrypt data success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + cipherData = data.outData as Uint8Array; + }).catch((error: Error) => { + console.error(`promise: encrypt data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function decryptData() { + /* + * 模拟解密场景 + * 1. 获取密钥别名 + */ + /* + * 2. 获取待解密的密文 + */ + /* + * 3. 获取解密算法参数配置 + */ + let decryptOptions = getRsaDecryptProperties() + let options: huks.HuksOptions = { + properties: decryptOptions, + inData: cipherData + } + /* + * 4. 调用initSession获取handle + */ + await huks.initSession(rsaKeyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((error: Error) => { + console.error(`promise: init DecryptDataRsa failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) + /* + * 5. 调用finishSession获取解密后的数据 + */ + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: decrypt data success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + }).catch((error: Error) => { + console.error(`promise: decrypt data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function deleteKey() { + /* + * 模拟删除密钥场景 + * 1. 获取密钥别名 + */ + let emptyOptions: huks.HuksOptions = { + properties: [] + } + /* + * 2. 调用deleteKeyItem删除密钥 + */ + await huks.deleteKeyItem(rsaKeyAlias, emptyOptions) + .then((data) => { + console.info(`promise: delete data success`); + }).catch((error: Error) => { + console.error(`promise: delete data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + + +// [End encrypt_and_decrypt_RSAECBOAEPSHA256] +@Entry +@Component +struct Index { + @State message: string = 'RSA/ECB/OAEP/SHA256'; + + build() { + Column({ space: 12 }) { + Text(this.message).fontSize(20) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.rsa_ecb_oaep_sha256')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await generateRsaKey(); + await encryptData(); + await decryptData(); + await deleteKey(); + this.message = 'RSA/ECB/OAEP/SHA256 Result: Success'; + } catch { + this.message = 'RSA/ECB/OAEP/SHA256 Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/RSAECBPKCS1_V1_5.ets b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/RSAECBPKCS1_V1_5.ets new file mode 100644 index 0000000..ebb254d --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/RSAECBPKCS1_V1_5.ets @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start encrypt_and_decrypt_RSAECBPKCS1_V1_5] +/* + * 以下以RSA/ECB/PKCS1_V1_5模式的Promise操作使用为例 + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +let rsaKeyAlias = 'test_rsaKeyAlias'; +let handle: number; +let plainText = '123456'; +let cipherData: Uint8Array; + +function stringToUint8Array(str: String) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function uint8ArrayToString(fileData: Uint8Array) { + let dataString = ''; + for (let i = 0; i < fileData.length; i++) { + dataString += String.fromCharCode(fileData[i]); + } + return dataString; +} + +function getRsaGenerateProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | + huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }]; + return properties; +} + +function getRsaEncryptProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_PKCS1_V1_5 + }, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_ECB + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_NONE + }]; + return properties; +} + +function getRsaDecryptProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_PKCS1_V1_5 + }, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_ECB + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_NONE + }]; + return properties; +} + +async function generateRsaKey() { + /* + * 模拟生成密钥场景 + * 1. 确定密钥别名 + */ + /* + * 2. 获取生成密钥算法参数配置 + */ + let genProperties = getRsaGenerateProperties(); + let options: huks.HuksOptions = { + properties: genProperties + } + /* + * 3. 调用generateKeyItem + */ + await huks.generateKeyItem(rsaKeyAlias, options) + .then((data) => { + console.info(`promise: generate RSA Key success, data = ${JSON.stringify(data)}`); + }).catch((error: Error) => { + console.error(`promise: generate RSA Key failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function encryptData() { + /* + * 模拟加密场景 + * 1. 获取密钥别名 + */ + /* + * 2. 获取待加密的数据 + */ + /* + * 3. 获取加密算法参数配置 + */ + let encryptProperties = getRsaEncryptProperties(); + let options: huks.HuksOptions = { + properties: encryptProperties, + inData: stringToUint8Array(plainText) + } + /* + * 4. 调用initSession获取handle + */ + await huks.initSession(rsaKeyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((error: Error) => { + console.error(`promise: init EncryptDataRsa failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) + /* + * 5. 调用finishSession获取加密后的密文 + */ + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: encrypt data success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + cipherData = data.outData as Uint8Array; + }).catch((error: Error) => { + console.error(`promise: encrypt data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function decryptData() { + /* + * 模拟解密场景 + * 1. 获取密钥别名 + */ + /* + * 2. 获取待解密的密文 + */ + /* + * 3. 获取解密算法参数配置 + */ + let decryptOptions = getRsaDecryptProperties() + let options: huks.HuksOptions = { + properties: decryptOptions, + inData: cipherData + } + /* + * 4. 调用initSession获取handle + */ + await huks.initSession(rsaKeyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((error: Error) => { + console.error(`promise: init DecryptDataRsa failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) + /* + * 5. 调用finishSession获取解密后的数据 + */ + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: decrypt data success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + }).catch((error: Error) => { + console.error(`promise: decrypt data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function deleteKey() { + /* + * 模拟删除密钥场景 + * 1. 获取密钥别名 + */ + let emptyOptions: huks.HuksOptions = { + properties: [] + } + /* + * 2. 调用deleteKeyItem删除密钥 + */ + await huks.deleteKeyItem(rsaKeyAlias, emptyOptions) + .then((data) => { + console.info(`promise: delete data success`); + }).catch((error: Error) => { + console.error(`promise: delete data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + + + +// [End encrypt_and_decrypt_RSAECBPKCS1_V1_5] +@Entry +@Component +struct Index { + @State message: string = 'RSA/ECB/PKCS1_V1_5'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.rsa_ecb_pkcs1_v1_5')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await generateRsaKey(); + await encryptData(); + await decryptData(); + let ret = await deleteKey(); + this.message = 'RSA/ECB/PKCS1_V1_5 Result: Success'; + } catch { + this.message = 'RSA/ECB/PKCS1_V1_5 Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/SM2.ets b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/SM2.ets new file mode 100644 index 0000000..22aa278 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/ets/pages/SM2.ets @@ -0,0 +1,250 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start encrypt_and_decrypt_SM2] +/* + * 以下以SM2模式的Promise操作使用为例 + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +let sm2KeyAlias = 'test_sm2KeyAlias'; +let handle: number; +let plainText = '123456'; +let cipherData: Uint8Array; + +function stringToUint8Array(str: String) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function uint8ArrayToString(fileData: Uint8Array) { + let dataString = ''; + for (let i = 0; i < fileData.length; i++) { + dataString += String.fromCharCode(fileData[i]); + } + return dataString; +} + +function getSm2GenerateProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_SM2 + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_SM2_KEY_SIZE_256 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | + huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }]; + return properties; +} + +function getSm2EncryptProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_SM2 + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_SM2_KEY_SIZE_256 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SM3 + }]; + return properties; +} + +function getSm2DecryptProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_SM2 + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_SM2_KEY_SIZE_256 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SM3 + }]; + return properties; +} + +async function generateSm2Key() { + /* + * 模拟生成密钥场景 + * 1. 确定密钥别名 + */ + /* + * 2. 获取生成密钥算法参数配置 + */ + let genProperties = getSm2GenerateProperties(); + let options: huks.HuksOptions = { + properties: genProperties + } + /* + * 3. 调用generateKeyItem + */ + await huks.generateKeyItem(sm2KeyAlias, options) + .then((data) => { + console.info(`promise: generate SM2 Key success, data = ${JSON.stringify(data)}`); + }).catch((error: Error) => { + console.error(`promise: generate SM2 Key failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function encryptDataSm2() { + /* + * 模拟加密场景 + * 1. 获取密钥别名 + */ + /* + * 2. 获取待加密的数据 + */ + /* + * 3. 获取加密算法参数配置 + */ + let encryptProperties = getSm2EncryptProperties(); + let options: huks.HuksOptions = { + properties: encryptProperties, + inData: stringToUint8Array(plainText) + } + /* + * 4. 调用initSession获取handle + */ + await huks.initSession(sm2KeyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((error: Error) => { + console.error(`promise: init EncryptDataSm2 failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) + /* + * 5. 调用finishSession获取加密后的密文 + */ + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: encrypt data success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + cipherData = data.outData as Uint8Array; + }).catch((error: Error) => { + console.error(`promise: encrypt data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function decryptDataSm2() { + /* + * 模拟解密场景 + * 1. 获取密钥别名 + */ + /* + * 2. 获取待解密的密文 + */ + /* + * 3. 获取解密算法参数配置 + */ + let decryptOptions = getSm2DecryptProperties() + let options: huks.HuksOptions = { + properties: decryptOptions, + inData: cipherData + } + /* + * 4. 调用initSession获取handle + */ + await huks.initSession(sm2KeyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((error: Error) => { + console.error(`promise: init DecryptDataSm2 failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) + /* + * 5. 调用finishSession获取解密后的数据 + */ + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: decrypt data success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + }).catch((error: Error) => { + console.error(`promise: decrypt data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function deleteKey() { + /* + * 模拟删除密钥场景 + * 1. 获取密钥别名 + */ + let emptyOptions: huks.HuksOptions = { + properties: [] + } + /* + * 2. 调用deleteKeyItem删除密钥 + */ + await huks.deleteKeyItem(sm2KeyAlias, emptyOptions) + .then((data) => { + console.info(`promise: delete data success`); + }).catch((error: Error) => { + console.error(`promise: delete data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + + +// [End encrypt_and_decrypt_SM2] + +@Entry +@Component +struct Index { + @State message: string = 'SM2'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.sm2')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await generateSm2Key(); + await encryptDataSm2(); + await decryptDataSm2(); + await deleteKey(); + this.message = 'SM2 Result: Success'; + } catch { + this.message = 'SM2 Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/module.json5 b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/module.json5 new file mode 100644 index 0000000..4144486 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/module.json5 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/element/color.json b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/element/string.json b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..f018573 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/element/string.json @@ -0,0 +1,72 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "EncryptionDecryption" + }, + { + "name": "aes_cbc_pkcs7", + "value": "Call AES/CBC/PKCS7" + }, + { + "name": "aes_gcm_nopadding", + "value": "Call AES/GCM/NoPadding" + }, + { + "name": "rsa_ecb_pkcs1_v1_5", + "value": "Call RSA/ECB/PKCS1_V1_5" + }, + { + "name": "rsa_ecb_oaep_sha256", + "value": "Call RSA/ECB/OAEP/SHA256" + }, + { + "name": "sm2", + "value": "Call SM2" + }, + { + "name": "des_cbc_nopadding", + "value": "Call DES/CBC/NoPadding" + }, + { + "name": "call_cpp", + "value": "Call C/C++" + }, + { + "name": "enc_aes_cbc_pkcs7", + "value": "AES/CBC/PKCS7" + }, + { + "name": "enc_aes_gcm_nopadding", + "value": "AES/GCM/NoPadding" + }, + { + "name": "enc_rsa_ecb_pkcs1_v1_5", + "value": "RSA/ECB/PKCS1_V1_5" + }, + { + "name": "enc_rsa_ecb_oaep_sha256", + "value": "RSA/ECB/OAEP/SHA256" + }, + { + "name": "enc_sm2", + "value": "SM2" + }, + { + "name": "enc_des_cbc_nopadding", + "value": "DES/CBC/NoPadding" + }, + { + "name": "call_cpp_enc_dec", + "value": "Call C/C++" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/media/background.png b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/media/foreground.png b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f 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

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/profile/backup_config.json b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/profile/main_pages.json b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..1045fc5 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,11 @@ +{ + "src": [ + "pages/Index", + "pages/AESCBCPKCS7", + "pages/AESGCMNoPadding", + "pages/RSAECBOAEPSHA256", + "pages/RSAECBPKCS1_V1_5", + "pages/DESCBCNoPadding", + "pages/SM2" + ] +} diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/dark/element/color.json b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/ets/test/Ability.test.ets b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..0f8ce9a --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/ets/test/EncryptionDecryption.test.ets b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/ets/test/EncryptionDecryption.test.ets new file mode 100644 index 0000000..e68e966 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/ets/test/EncryptionDecryption.test.ets @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, beforeAll } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function encryptionDecryptionTest() { + describe('encryptionDecryptionTest', () => { + /** + * 打开应用 + */ + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + await driver.delayMs(1000); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * 点击按钮,加解密AES/CBC/PKCS7 + */ + it('testEncryptionDecryption001', 0, async () => { + console.info('uitest: testEncryptionDecryption001 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('AES/CBC/PKCS7')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call AES/CBC/PKCS7')); + await button2.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('AES/CBC/PKCS7 Result: Success')); + console.info('uitest: testEncryptionDecryption001 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,加解密AES/GCM/NoPadding + */ + it('testEncryptionDecryption002', 0, async () => { + console.info('uitest: testEncryptionDecryption002 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('AES/GCM/NoPadding')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call AES/GCM/NoPadding')); + await button2.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('AES/GCM/NoPadding Result: Success')); + console.info('uitest: testEncryptionDecryption002 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,加解密RSA/ECB/PKCS1_V1_5 + */ + it('testEncryptionDecryption003', 0, async () => { + console.info('uitest: testEncryptionDecryption003 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('RSA/ECB/PKCS1_V1_5')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call RSA/ECB/PKCS1_V1_5')); + await button2.click(); + await driver.delayMs(3500); + await driver.assertComponentExist(ON.text('RSA/ECB/PKCS1_V1_5 Result: Success')); + console.info('uitest: testEncryptionDecryption003 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,加解密RSA/ECB/OAEP/SHA256 + */ + it('testEncryptionDecryption004', 0, async () => { + console.info('uitest: testEncryptionDecryption004 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('RSA/ECB/OAEP/SHA256')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call RSA/ECB/OAEP/SHA256')); + await button2.click(); + await driver.delayMs(3500); + await driver.assertComponentExist(ON.text('RSA/ECB/OAEP/SHA256 Result: Success')); + console.info('uitest: testEncryptionDecryption004 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,加解密SM2 + */ + it('testEncryptionDecryption005', 0, async () => { + console.info('uitest: testEncryptionDecryption005 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('SM2')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call SM2')); + await button2.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('SM2 Result: Success')); + console.info('uitest: testEncryptionDecryption005 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,加解密C/C++ + */ + it('testEncryptionDecryption006', 0, async () => { + console.info('uitest: testEncryptionDecryption006 begin'); + const driver = Driver.create(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call C/C++')); + await button2.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('Call C/C++ Result: 0')); + console.info('uitest: testEncryptionDecryption006 end'); + }) + + /** + * 点击按钮,加解密DES/CBC/NoPadding + */ + it('testEncryptionDecryption007', 0, async () => { + console.info('uitest: testEncryptionDecryption007 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('DES/CBC/NoPadding')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call DES/CBC/NoPadding')); + await button2.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('DES/CBC/NoPadding Result: Success')); + console.info('uitest: testEncryptionDecryption007 end'); + await driver.pressBack(); + await driver.pressBack(); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/ets/test/List.test.ets b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..ffb7424 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import abilityTest from './Ability.test'; +import encryptionDecryptionTest from './EncryptionDecryption.test'; + +export default function testsuite() { + encryptionDecryptionTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/module.json5 b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..c3fd9dd --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/test/List.test.ets b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/test/List.test.ets new file mode 100644 index 0000000..f1186b1 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/test/LocalUnit.test.ets b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000..7fc57c7 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/hvigor/hvigor-config.json5 b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..d584c19 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/hvigorfile.ts b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/hvigorfile.ts new file mode 100644 index 0000000..2a5e543 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/oh-package.json5 new file mode 100644 index 0000000..e41bae0 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/ohosTest.md b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/ohosTest.md new file mode 100644 index 0000000..f638f40 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/ohosTest.md @@ -0,0 +1,13 @@ +# 密钥加解密测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| ----------------------------------- | ------------ | ---- | ------------------ | -------- | -------- | +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 点击按钮,加解密AES/CBC/PKCS7 | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,加解密AES/GCM/NoPadding | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,加解密RSA/ECB/PKCS1_V1_5 | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,加解密RSA/ECB/OAEP/SHA256 | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,加解密SM2 | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,加解密C/C++ | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/AESCBCPKCS7_1.png b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/AESCBCPKCS7_1.png new file mode 100644 index 0000000000000000000000000000000000000000..246c5b8f16be0e6d97dfee2d384f24e3143bd5be GIT binary patch literal 25023 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%0AI>JEi=dmn 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 BK%M{q literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/AESCBCPKCS7_2.png b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/AESCBCPKCS7_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3640f34e6f4373080601b02ba3eb2dc35866d4be GIT binary patch literal 26494 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/AESGCMNoPadding_1.png b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/AESGCMNoPadding_1.png new file mode 100644 index 0000000000000000000000000000000000000000..152f860d96646936ca22ebaf4d4f9986278f2336 GIT binary patch literal 26209 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/AESGCMNoPadding_2.png b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/AESGCMNoPadding_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d3f6a60adef2dd3caafd319ffebdec6659727f27 GIT binary patch literal 27640 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/Cpp_1.png b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/Cpp_1.png new file mode 100644 index 0000000000000000000000000000000000000000..19b0ad040ca40700788b4447ff3e981932ca31f6 GIT binary patch literal 44798 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 M{|V=2`}O0000LuyApigX literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/Cpp_2.png b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/Cpp_2.png new file mode 100644 index 0000000000000000000000000000000000000000..638ef2fe573d2e0ccd63dba647f6bfc9431c5784 GIT binary patch literal 43849 zcmeFZ2UOGFvo9J1MY<@UAWb?%dan_XE<|eRs0au#ARR%7f`D`Z0qN3vC-fq{NrwQT z_ZoU9gqPnrcb)tHo%i0o=iGJPJ?p)9zFEWKyRtLinc1`VeD};}@0-b+1;9OZWi@30 z9v%RIhx-6-rU8n8yLavo-no63kdTmw=q@oS6&WcB2`TOU2NYBcbWDs4boBJhYAA$Yp9%rzbkBEqfl!WvV8QCMDC-hH*{@vHjZvf@p z+kjg`_;@UUTaccl z92NZ|CN}P8d_sCgW>$7iZeD(QMJ1xDx~8_SwXMCQv#YzOcVu*I962#Lg<4!%URhmR z-`LzbI6OK&IXyeSxco~mJOKVbtA+df&x-vky(n>d-69~sCm{SwFT7jsIKrnSxcx-% z&V6}p!q<)uScJaZrBaAYD{CQQ71r6Oe&aMuOv5I!$bRsbYX79!zfCdU|0T`-MX~>` z7Yaa%kB93#d`bWaaCXU+{+amywN#i&X|`E~l8Lm7>l~QdzGmt-;Q3vhhMrGJsl+Q% z`dIRf521xg)KLQrAJ`jLY^j#$lz8)u+29Hvq-?K+s;y4S;U9(!*8a z=`Fj7mou~WY(2#9P2C>-A~}YzFE!uWGVrWQOna9{co%o}}>08i{T~8zrYx7h0R3gOE8W0%h;eis{2n5NmNLxKj_FSZaEIFKVw*>9ylLt?^z7HqY;CeaKi4Q zga<6fBA!Wt;yf!BHIm5@2E{R{{yTPkFx?KvF_;9|@F!2Zx1@`&srkPOdx?liTc6SG>&D{aL z`_zuHr?iEQ6zyUuPl9dVXCx_6-W_CtT^vL;)tU=Wrx5)jv*XI;D~>`DF$KH@{1}u; zdP#7s!#$JMsBHTVkRHtSA4Cfni=}=qa79z1`sk++6HX#t^w15!P~&zxbmr}ejO#D* z!(d-%Bl4F?r<1h58TuWoQaBE7cZF6KNcY`6z9Jcmi6WHFexmo?@CHC3 zvAmrC*nL;53mFsj8l*1v%bHir*{QfP8DwKIfG56tnYqlEov*Yk9lQSmf~In^8~uZH zJLu@`7h6h;yG{{)#(Etb8NOAdB*0LK!8%wRdSw3rEuK<(yS+L0Cy~J0Aa(|c}o$OG%)zSHRya6Uy2UM zsf>I(W?f%dR}PilR%m+9A;6}id^@hVIWPG#xz4rF

Q9|N?NsQyO!UfUWP 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/RSAECBOAEPSHA256_2.png b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/RSAECBOAEPSHA256_2.png new file mode 100644 index 0000000000000000000000000000000000000000..845c38cba5fbb00a26576a156714491e14c605de GIT binary patch literal 29057 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 aR7bK|0YHA1Bdy*ie_N{m|9JzVr~eC&lkF`4 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/RSAECBPKCS1_V1_5_2.png b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/RSAECBPKCS1_V1_5_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c943250700a8ca4541272d00ad60d548c8f408dd GIT binary patch literal 27906 zcmeIb2UJthzvp`p5TpvyyMTaHrFTT73rO!EBE5+adJz;5qzDK|Xwo}K4ZRl;>5xF^ zMXEqT4K11c@638{=H6K|bKkr7&YJf)SvzZGot<;eZ|~1Jd;h-Kzh5vjm}TIuy0V%w zfP(`7IM^3}nFF2ygtu=K+{Py)ARxGNhmeSbij;(yn1r749yt{=11k$N0}~S)ryw^Q zJ3j{#6OY70{zs2RMMYV;rQ{@qWd%h|<&eNV@lfZc;iI5Z)LkmG4}7q#vY%6yRbV%G_-W|3=g=t zc^>kLiit}|N=ZL^uB5D@s-~`|Z(wL-Y+`Ej#@5c>!O_Xn3*_zN>*xRBV|Ya5r>N+} zq_4>-so&DTxq0~og+;|Br8Tv6^$n25rsnRR-oE~UpM$?9Ca0#Mu$fu-%IezspN-9} z?H%Od(ecUY8S4DvA9mpYxc}KK?E8NkfyAE`s{?yKy2KPSKSI$bXpjPnP|!85Z{c$g=;-u>adG zI6#7ngY7(A3P1rkyWq)vPxOCmDbJ>`*lvK!COD<`k1Xz9vkn{bc0zLYma?+ya4MAi zsy+$UYvOj*IJ#H1ZRGe!bEQ3K;*(Kn(&i`A_Q>`a9HsD0*K9>(7ABX(Q#em@&%HJ) z03$PRy)%1HP{@NjxlPQw=7GzN%Ux2gGW7sS79rUBxVSrJ!rDHChA(vL)qCgPC!ep4 zjF1eD43SZF2{f5(nS}|@J?K@G29OE!Ub|0N#+Cdar~6eH;Mr27!a*_yVA!wo1xfPX za)P~_UvT3bByutLru$BOZ1iBYD{U6pT8J@0wh2^E8pktkl3H&N8)Xt zjiM;;xPw}C)#$xQi7KI@}K&kphaH95+%$@@qoQTpZW;rncN@8HTkbpD9?C`4AV;!*TX zX=#q}m&m5wUlO+g$?s(Q(SQEx4LrTT4H10rDiJUG^uZFOeLlvnIU3+8{MpB0PdK7a zN$rtxN?+ba-YcGUKibhHFGGofaFpHk9GTeOWGOP2b>};&6Hl>VWg`3zYs4Gi>!@tT zOT1&dFrVOV5h_)?S*8aJ3)ab6wN&iV&j^qlPsza{ATHV z61D!sqr-0E38x1b53Zu8=cL*vZ_s`-y;%Nd#Wo4}-6Ru8jlyE_d*7e{wMM*=SEyfaHV)p3aWW7U=#ODeyfb zC{hO?O0Rw0jhkSvnmZiw;<^eSzIh_E9_uSOD>vfNxoz@xH;V(hc)0l#GO63YXcwVS zpDOfrsEfl9N7F9o>L0n!5>fQc;hHqYD=5yQp*TBbD=@y)fnm_YE>WyDA`3S+> zq;{`KK|T!jQ5EbBV^<2Nd;-FB)beveqg)}Mi6^Btvn}h>T@j0$ifJHL@?DbVZ@Qck z9(+oIejI?Uf4~@lV)=~ogs=ak_JrF?^!BNer&kZYk^Ar6xOEI5zu-I~D^)aPBUokc zCM(2iwlqj~{f1R?Z;gYsXJ8Y2l1Za!Xd%XE61GS@+$;Q~FBL$9u+$H4SrXM>8rI80 z3QUI|^yl%9$wpTO7D};dUA-irUOjHoCRewO@A}m;nJFS4vdHRlacS39*b3`yCu-_Q z(Ns`JY$Ut7Ox!m+d0Sc5<(^8vn_!vzglQ=%P_6(Kw*jYjH-+g#^aNVJsM6@0$7Fyw zB(YDyu53M|P}m70;feEBy({mIHSleq#$oVez{=7ygC)6bRe^AzVqtDa98&8DFKC=& zp5jmt$|Dn&lDhSLVH&h=#5A(Ib2$xpZJiSH65{8@7oKWdS^ zUeY=~AoC4CQy`1u>-{i*OG`lZNr1N-nx#m=k_Y#5+|o;=V0sxU+pOL>q;`8!(blOm zHgZU2z3W5@7Xy^@l_SWnJ~gXcdtiXsSeG5|5V*9#pZK&t*M$U;!6J}%2^l`S2FIj) zm*h|DCS?y4{%+U)o`v{u9uE#!nF1A+zIIEN;D>e{Q?4=U`owBiKRkE4hW$q4WchA? z_Q{oN8>tRHoTom7uX$y>LjT=cDVuQyBgGQ}ig$yVo9aKw8v59o489VtB#=G1;=xTF zI}Rb;UGH;UWe(=6zdTJ^bV=3@`5G5O0?UKXRTN~<{Mz3oai;TQQ@0D49bs(m}RSL>!NS%6fc^F z|I`V;3O6hKSw3D<=K7kDU~CLOprt||tS!ooeSu)=}39!WlpuRXt12&fHSC}%8GDU=?&oo}_HcRg;NQjY;1 zNc6Ct^zUMTCzWlqPQ06vbmgBHi1)I%Cr+~K{$3KPXKDRDSZv(QdVDMjT-*16m0SKa z6xr3%g~Bgq>2RlPRV7a=*mT^awN{IIzy2zrKWHbeWX0F5u1y}MoiU?P*gWXS`~7XW@*~9^!rdqL z9D>;_UYoU;xNOw4*V^8jd!finXRFE)M*13c53LARx&AUAp3BPwlOt6I|+5S0s2jxpUf@;8GkCBI*olS;mu@sYn=82|a&usfHnVR~k3 z=167qW@`t1$SCv!26#Uig7oqW7RCVC6$BUnrw{|I?hI>juM#&)M5&8B!~jttY-?zL zSQ%9QbN>9Sx#iLh?c;f?MXDnbwHi@l=8XBSLx&jWQ0He z1~35YVxOaAEs6(M_T)ZI=2%}BdAE^~1%6dnlpA%QfPgAqPxgRye{C5fsq5=(Hj*!R zdCJS&0Y^g*KSKz(j$%DC!Ad$N3q@`J65*CvqG>DE*M|Yp?e9j@Q*M92+0AN+_gs8` zuLo=~lFhtdUG_sd^OUpk&aduhd1Kg?g2=8(J1=xj4^dHc`ogHz%qjlQpj=x^tqNJN zXC2Ag08osGMAoYc_4JWBmaW}lYH4vBOY;A2!(9t>txq! z$aPi3rPXZvQ0BbLLQ7GlW33}iDnnmGiEzuj83!jDwe>-ZJl6X^b-KP3 z-Vgd}bCfS)7rkna{B!BtoRwDSYkH(39T+BM8||f&C@kqTJ0@14XOLn$B`fDy!0$vP zI>~YV@su&>;f#@lL#6P+z=USW{EV-sVhfD3-Zk}}5_=z!1ZZ)dh9%iv4LRIU;9Sao zN^2;cl17oT(Y*|;JmI94qt}wg0G|f!Xr)W}-q)f&mn=GtJL&jx8z%NEE!Om~tEyjw zk7$Cxx7(~&E!YLLHNUh{zOjy=rvn)>f6DFh)Qawp?|rPfdLAf8+S1bHBxs-UXpUtq z{HdJk=C*l%I+8d%y0#GFFFnmZ$4+6ntv?Wu$BJJp(D0EaoODXD7xNRKueW$gpP=7c!^ zaXY@uJ?g=wz^CJT$ILSNwI&C1dhUY1pbH}Wm699;h2#Vir9ErAWtz$pu-;&X*73a7 zFG~1B>Pbqi$A)}oYPr7!p9NonwJ{-dV>?zT|7JP=-HZ#1LShSfK+E#`g zWtCQTCZDp0cZ)~|9S-HDONp(I+!zdFYkx@0(=t6j!iK-JhknploXN7Y)1 z3hO#N^O0(($$Hxoqf@&k_g2Ilowg?Pu$A0#HOR;{w)GcrX!Dbg?PHSkvTOB#*OZPD zKxM>NO7a&RE~-*&Rk>g7 z@{$!Wy`8}Ta->+ZcZzePpZ&Y37)L@BJHxqGwzbWg;uzp1_p^uVGrgQ&?Cdu2;v}z? z{9WI9I>0{!8bP4p?Oy8>q_vuDzDdIZ5I4`s_Q#rcG8VFOKuFqtIA}`R3k-^kEb`9Y zdy(t?H3n~nOy6U~SN6iN03EujNzmt?`YBMj!Drk_gTCcQlP4pM;(MJ7|C5u0es0(? zv$i(UqAEI2%5`&;i*4#}Z*;cf=i0Dd(%qBI_`rd8i=v4ArXUY{TMTfAEXj{M<4gUo zKCv7QeC2&2e;hPtHEp288l$VTN%o8OiJ}S6%xjXgH3vw)KYsf4j{^*l1 zqG}&ZMUs`hGEx-Yikolj>-3A+N@a5Yggwi43PywcwW0jr8x7kg-WnqBIYYHP?QWzo z!sXGhu!c{OR83mKhugE=Kjga1J(s|dsu&;Q=$(ApnI~+5crk$XAS665ilaG(`TauqAFJpW);5q8691 z7b8C6s>^GVqxB>Xt97y3RzHxNF%hvVf2IxgSA`$9YlQIsT@LKrltmjr&7B!8Q4$ty zQ=&Tgi)Qc_r(3Dc@~a%2;`$_>@E;YqNc+e@i&c#lAtGiim@d}q`|5PJ=Y3gRjM~B8 zL~{_WE=9lK)^WgI33*YV|Q7u7COe{{WEJimhK-b4r14sMvM>0SiD;XID#K|6bJkb|wl^DXGGki~ zNRobHJycQ|9$AahZTR}d@0W0a>9S|G1^qi4B6Tr!nRhtjP!~GTHK`85-S)@z2(mPq z)aCV-Sb_HuDvpb2K+i3={b>>9PLk^HowMrvmCv)%LadW?+S)4R!4<%btkhl^h^_E)$1^i-NGe~{ zN_?R*%MVs^X}OE*Rb^INAJPAdSi@@;kD^?sDz~_k^-HDwN_%Xv0}E087fJbgX{=9i_j|)7Rn}cd zV+XE7yT-bix55%{@GF_Ms)^4e9jgaKmOHxJ3@IPv>I)0fxc4p0fnQIyGssjr zrgXHKEVj>1Q&@x%M~?k|25fDyz0hH9H~*aD5$%agp90iI|D@`atC(cHoHA5gW0#wq zr}6{SRX%_#1l-%sk|IzrX+T=V+tg3E2TC>zWKFn@LU+>toy^#eQP@}QcBhwxT|%pV@nBB zO&GtvdD@j4_Ra^OeeV(HU=f-gj5jt63DXgi?1e~IUbZZ+9n{T#QMt^=JuY8xBCKfV zM+wrgtLADr*FRSxDwS=2PnNvJ%$EoiwRpO_suEG};Cf~}`|KTr@<8WDv$ZcbH}@FB zy(xZB{f9L(=ebdQXPV|fQn{(qDoW-2TXPZQR5_q01y6X zdV{us4(or;1) zg%VF^3+OEDjTh;FW6pw(l@=9nYav@R6iQS20OVn5W2EMvsTwMIy*ZDyrxl8 zN4&9PLuf0aU%-80Pg>${p}skuJuGwbfBu=d?XQmgNK`zf>z0ZBV+F0NOr%NTV9cU~zidB$)e1<>x*b zaY91EfOgjw!#7I`pZ1QLmI>JquF^(i5;OSw`A-Gi2_e+g2L|D_M*y z#K?K^-4ZJ2mksfnl_9HEG!Ed8?NsrKiQVhw7FLYk7B+OCk84v1rZB+8-gRp4A{ElR z9#rV?%w)3OkrFiP^`%Z2Cydd@X7@P1v$n{|2Li?b@%;OOEE)k~QLbxl2@&B@15+^K zvYBCpP675kq5b=DR7%cX{ewPQfI$B{=@=u&l^}v%amb=j3shjmq+XG++xiO?_s}bS z&+M;Xnj}X=43@g!^-EoOpA`~3!vKUMC9IJLb*L-7 z;`-?>J?6i^$`P+(!f~0HC{Qq^Te6180nS1reWHm+U9Sl^*Pu0NfBMl0Mik)*_S~D61x$j!p9>R3UQTOw{Pb)9`AFOXF=Z1Ts^c~gHkS`t@Bj`o}>zk6n=lFJ5wHmMf4 zJ54i}-iuumn0Q4T9_XZO@P)ILF_oA+y3_f+k-~BK)H&?0uBH^dH(y$V*wRrUo9Qm2H2kNnN z5z$GI|LOVVQwyHRmJc5k5)(_J-JWU5B*rZ6%58g+CWW6xJ$qLG|2hBZJCuet{SyS_) zwXMx8J?O#u5|d7RYkKPY-!gHx3ABFR31lDkDKTBxLdylco+^<@NliCF#t~JKvdYC% zZy9WS&fAs0kIafK(^zr1l6QIF=;jvN>&|&jci2CYH-E~#6(pF%fOQ?dbVu`izx5wk zN_R|Mv#N@QtwU~&IzPIlI`f4NH*0a(pp*wU9s`7%EoWZ(oC`y{*$nwtEF=mQWxanR9;cqehA`6pb!R7)V@kh#cGpzXd3cx46udO zDH9Jd08(t_tC99aM+Dk2X!j~EWUp1l7CTb@uY64hUA58yw(`dSZ0NaOZ>#w8tW69+ zOwf%1j;S!fpkD|Itg!M5WrYsQJ{Q7X!aYlRCDt7@<9WeZ)gk%KnQmI||35?=7@{Q* z3q$zvh9B=?g&SOD1@T)DcJRYB%4h6qj9zbEDPAcBP8uDzIqQtO;X!G2pL!;K|6{fz z&Cm@YS6*t$Y7aq>me?nD9M}{k92-y%qEz~!Xm&;Cw=|?m%If4TY$sNT%9{3fZA4$W zwxRW_Wvf}KKSzO&a$PX^$O{)Kc7!e{p5JNy2!p(% z1se{^MSf@LZev{S|2{;PUG#8e=*8ML_9-D=B~ZpM^MT~+1l zeeeW)U!+g0b+?)Ela{XH-g*2;4e$0;tZGTug0TIar&_{>)=DnhaE2vcAA@OHPuk2O|P0}uTYjTE=hpfr8N z39q1ofV>K`lHggX z`>GZ7Lcv%WPmQ2}?Io=&YZ5V&rDWG4*8u0KHHVVQ3cH$?6zB?(<~=Hq+^34{yS}<- zJ*TER*P-_MsSDKi9)XPd`jc@>)KkKIjNH=Y)V7jV{@ozqe2SWqA`28$g|g)NjJ z3^A`Y)3x_Qx3gh~xdq00s7%O}m^G1Jc6UdiXPuFi#0Sw`zx6P8YR5r-7lZLoeAOLt zu_&5Ix&3CiWjed1_+S2N#77^OQ|gSzUUuo)N|hy5znfM{yYit`nv+*C&3rX1c#uRJ zd-5pJZ84T?dxEgV&{`Ox{F=MlNIDjsxW= zuwbYoXJp*M8X+>@#kVcppItn}uQ9yNi)A;jO_0k^RB7E_H+lw%t!(KBt&{% zov(<6?&(%4AT@AKJ4Flr#hknQU9zsCRl$74ZBs{$8Z4l zlT=Ne0#C0#e89ET(*(}ZsY_h4;fvHH1-gTyygiSF4w^-&2TL!m@)XkzQ_q4a&)8JO4KPaDbCJ^Npp`#W_@zY>`aXk)N}Z@cF8t8xuL+G;+A1#MEs7_YI@(e-uedYWH0FB zk9u>zy`qyzPjGIt5IIUjAJ#q0P|=nnd2hJWW-G4*ZSXn7!9|R*O#JPhyGXAw$u0ea z?1@UT?Gd*O3;2ARP6^$^K@+*?V?#(}-Lq9v?Z0>4eNnfud%FCk*ZZm_gy?q)cZ5;2 z67N=@iS}#h=mK3qw>vu>y5^j@h0qvV>gr;Ye~|QmM%p^1b}<)fZ(PlmfbQy$@9A1+ zb8>3rzL*&-4wtAbDC2OQl0b49RGuXmt=8oBw{>Cf9Lz6f2-lglK-&u`Q5j)HV2fB- z=pH|(v3skUjjPnlekrOj5ftnph{$YVn8cHRkg=w`WV}=I=c!mMlcw}ikI%V?Qys4^ zYP#LQ<=&992NObde2DS3ie4Duf#u1HreEN*93}6!+*S)CdA0u#6JW?HoXWEm%kN{( zsp6dI{Z;19kh-F)J5@5$-KC8_dgY*VkW5X+vjU4}`5pQGf2eek8D6 zkZv`{>!s>S`IaRNP+|VSKe8`Y4$Q2eqti_jJ_<`lYg$@a`FtJLARzV{L(PwnNtVnn zAl^`z`}Vwudqw2e@+0U8XYhA@OTH%XZl8bNh?;GaZ+`%92F^K-NrR84@!~Tdw>i7; zo}4oRu~{p%6>Tcb>jIDB!FN5%A9d9W z2-HL~56bF~ugR3*I&#zbMzJ1ZHIJ-##fR{@IoagyRH;;t3!Ipx{Aff3Y@Z7A5xN~d zFMje>Kwps2L zMp%BPi0nl3Ma8Mhs%wuUbx@J$=R(97V9x!TP~XtM@1rF%QlM-!>cCbRVi9}vem%=0 zbfA)#*BvJORSZk@zTt2r9a{Hw6x1#sG&J!TuBvdu9%cPF*oT z($XOt!u=|a!Rp$Z^(V|gAuRkX+WjEir1~)N&;Elr0wGc7#tdp^a`y_4Mfz6AUm-bFn@$OA{p9T2+Rc0xm z8&@ywXj>Zc)ZOiWS=5VLIoJKBLFbRFtVrQP{w2$50Rv5B)neL}Tt$8TQB#6|+t;$& zyN5r}X~lwKiJ-Ljs2~*_v z&Ru})6R^?rOJB>^e@y(SS46LLm|xenH(nMj?Vnz_$yF*j=qY|uUo|a*UHg!eja@Xk zdeA>;AH?WZ|7GYMzxk`_xz-(osN{C!!Zz$tHtOhEBz0yQeN?tr$G(uj z1xc`2n=@8SbGg!kwCH_npP&@dj3#8w5h&?TT}}+BKP*pv4T8rHWj*N^ z8Mv$uT}dAbQs_;g_0jcvtHfjPaxXMqao9^!y{1GjxypOc%)(%4t6iDGBY%asDthli zMritKB*|>NRYb6@Sj}VA6K~XmLydMOv*EE#LKZ3?QEVneiYnb7(L7S3i<5fNMd%aQ zGbtBB6t7!@h{!8hu*{}XjaW7OT3r2QZ{9O5>qJErT7D%_Y0*OxsWZNRZ!n$b<`{3(Em%qfx1X8c1GeE^_ldTl^Kigd0R-J8S!n423jb1*eMzfk~lkPHb zN;DtNE1bG!9+Q&rQmoIAsk{ncf;N`6FUEZ35X@u+8-af8LB-KcVUCqOKBA= z%nDB?PYkm)VYDx&p1U+4WLA_0xl-|ZlO$qJsBZO##g-i z;4HGSgViZzh-c7)7WX*1Jrm)cLXD75#au|{G6(8A5@D)bIZM*yAFdaziS zfqBv3@AE_>r(x%c?8H=Kt=_LM=Nsv zZUKJ&mbBbQoG~VJKnI$(qHwqJv)_ZZ)$?YHnZy0p92^9(odF?2-A#YOONbIPsHekSs`SK|Mo zUem)dz@AZ-(?u{7z3X*tuR0DQRna&y#Q;5LJ$R)xt-+Bb1RNK*d%B7?%bC(P0fJTH zc?@ATwReS6C{VkB-k@&q|=f71K1U{;c*}gQur+@IP{N%{L^6Zdr%YQ$a zJ92YOtV>#vbJ5G^(Vthfohfs>OQc_U8 zxhm^nAy|XfTq$7y4*3cUV3icIWtWer-)qlYb!HrDl5J#961-IF?D{KJ3ZL#Z0`KQ| z;<`sWr*SHG(d+hp_^@Z8Q#2IqDj*fYSev5PPS16+aea4K5UnYs-_Ra;(8U($AGd~N zGP0^d1&IkU8>cI#%URiW|2UTISPRYWZ**aOX0iBr^-@NNpj8BNrCC9vTCO#r1sjm+ zzb$u(W3pzWD{SCU)@F0|7p;wGDx}o^L#tI*v$Veu2-~vptuhPfpj87oTv850WnQ;Y z-CvF$;6_%+v9CH;;rQkTL|K|xtn%;oCLNJ&G=jIiVhw-6y1*ORqH}JQrXobHHZ6Ge zUmhtifDk)W)`Wbs1N)jGJ>d-d2DT5|rrJ-_hV`LYMsu%@(p@ZHAH0?p^b;c^FHpmY z736Tt6Mjxd`^2NsJ|Sy*K_IOcB1db80Y0kqv2gopUL#r?`ItPvTXBj5z?(Pg=%R|Z zriGb;Nu}m9T8fDTysBG4SDX)g@LD{I^;}|1XYnE26fbr^1nzA@GX7?ETDT#T08NZ1f@})3dt^aKJ4Q%#lzLN@=Z0lUD`(-MB@;4nN>gVDA zn)RXo-MR+XLP}GhvQX0S@+79^A9My6Sz%v`=mZ^Q*z@Ss;JklJ@F*9|Rq!b45`T8- zP`ybEFlzJFQ?w#?&@pAApF2zXvA+o!^Sa`b>6X6(LF^Ehh1KrxKQa%R8OX&h&IctQ z(zn}Hlh5j+jMgv!a1m20h|l_7P&#{NGc#_{XtTl)QL$=vBM$-Z1nwBitk1 z>FSy_8@a1eu%RV)sGF1=wJOxz5J{GCy;>RE`4hoKSXzlL{~>W=r<8+HA*fP?6)RsW zbZE%=W30qUZ6QVtfq5t#9a;qlUlg*UgQ}XCMz8n|u(ijq`?(%q1?^(&s2H>oa)FNl z)_Xgy46y5fPUf|*u2L6!cD{w2pSG`iDj=#_vDKe+Tz$iew$XWL>a%}{wzSx3CnZ+2 zHJH><`7dW7FSW)1oAAqo-x#2~9no=p3p-JLZH4BIM;R?*>wmXGztF${eMXu}tQNf( zV019(uY5@)b_VCXukt@NhAPMhD_1EzIQwy9%uUby$6-cCgC;~Q)ZUI)`J7g>c~#!RYTN^B(0@|=Si+Se`Dp`O@OVoS3jbqLvx zy6btL0oR%BED;zs_bvH#=;>U{brqU2vtzphK67a&*WwqPWi>eQUbxk&*thFS9zLIx zd3%B{-J0~{bGhD}&F5V9OhP2VN~4y>$5mRDGOO`dpNtev&g?NjfsT>Q|F|!0Q6Eg> z6(=~`94uFLhp5|{nM4np;Gg94;{r&src2BRqB^nBSD(AN+)-x?U(-glMgC5@jILz_ ztiETD?DjFO(@=;8$&{rnZHRmOP@2s>L;oavCa=)CzB%TV>rQ0hNFj=*nX0VV)c$6& zIIrg6Dsjmv#h->gq=H?XwLVEC3o3b98TM6CSuyi5q4{R6zJ7)st z<2FZZq^;7~XrRc`?=0Z|eqjT?jXsq8qrDZdQD6L>{1Flq8N-3NbVz&x+EuG`jgdeC zsT6pbOi_7E5=6nEf#$gS?c@JRID*|SSk`nS`9VgatWeXN2w(J-aLIgJ`||ss3oo$( zCE#5Gs%A|!#tfCG+1!vOZ`EKj_fP%$K_Lx^pUxa`ZN8d@qjFbR-2Y*>yc8$4b)NIQV^68x3-}{?vi*0r{$sO~{YPd(`>)PL Hj+y;Wc|w^P literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/SM2_1.png b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/SM2_1.png new file mode 100644 index 0000000000000000000000000000000000000000..cdfbfb8501ccb925d34c0ccf19bfc7a6986ea202 GIT binary patch literal 21085 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/SM2_2.png b/UniversalKeystoreKit/KeyUsage/EncryptionDecryption/screenshots/SM2_2.png new file mode 100644 index 0000000000000000000000000000000000000000..365f3085a7e53b22fc2368af8f4633914d2d4ffe GIT binary patch literal 22558 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 Wxmj?1vGM%BY9YwKbUFB#*?$580xIYL literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/.gitignore b/UniversalKeystoreKit/KeyUsage/HMAC/.gitignore new file mode 100644 index 0000000..d2ff201 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/.gitignore @@ -0,0 +1,12 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +/.appanalyzer \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/AppScope/app.json5 b/UniversalKeystoreKit/KeyUsage/HMAC/AppScope/app.json5 new file mode 100644 index 0000000..007435c --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/AppScope/app.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "bundleName": "com.samples.hmac", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/AppScope/resources/base/element/string.json b/UniversalKeystoreKit/KeyUsage/HMAC/AppScope/resources/base/element/string.json new file mode 100644 index 0000000..029ee36 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "HMAC" + } + ] +} diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/AppScope/resources/base/media/app_icon.png b/UniversalKeystoreKit/KeyUsage/HMAC/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a39445dc87828b76fed6d2ec470dd455c45319e3 GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/README.md b/UniversalKeystoreKit/KeyUsage/HMAC/README.md new file mode 100644 index 0000000..120e571 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/README.md @@ -0,0 +1,91 @@ +## HMAC(ArkTS) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-hmac-arkts.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### HMAC + +##### 介绍 + +1. 本示例主要介绍HMAC,HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),是一种基于Hash函数和密钥进行消息认证的方法。 + +##### 效果预览 + +| 主页 | 删除 | +| --------------------------------------------------- | --------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call HMAC按钮确定密钥别名生成密钥并获取密钥别名和待哈希数据,获取 HMAC 算法参数配置。 + +## HMAC(C/C++) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-hmac-ndk.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### Call C/C++ + +##### 介绍 + +1. 本示例主要介绍HMAC,HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),是一种基于Hash函数和密钥进行消息认证的方法。 + +##### 效果预览 + +| 主页 | | +| -------------------------------------------------- | -------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call C/C++按钮确定密钥别名生成密钥并获取密钥别名和待哈希数据,获取 HMAC 算法参数配置。 + +## 工程目录 + +``` +entry/src/main/ +|---ets +|---|---entryability +|---|---|---EntryAbility.ets +|---|---pages +|---|---|---HWAC.ets +|---|---|---Index.ets // 首页 +|---cpp +|---resources // 静态资源 +|---ohosTest +|---|---ets +|---|---|---tests +|---|---|---|---HMAC.test.ets // 自动化测试用例 +``` + +## 相关权限 + +无。 + +## 依赖 + +不涉及。 + +## 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.2 Release及以上。 + +3. DevEco Studio版本:DevEco Studio 5.0.2 Release及以上。 + +4. HarmonyOS SDK版本:HarmonyOS 5.0.2 Release及以上。 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo UniversalKeystoreKit/KeyUsage/HMAC > .git/info/sparse-checkout +git remote add origin https://gitee.com/harmonyos_samples/guide-snippets.git +git pull origin master +``` diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/build-profile.json5 b/UniversalKeystoreKit/KeyUsage/HMAC/build-profile.json5 new file mode 100644 index 0000000..7dff243 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/code-linter.json5 b/UniversalKeystoreKit/KeyUsage/HMAC/code-linter.json5 new file mode 100644 index 0000000..2858646 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/code-linter.json5 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/.gitignore b/UniversalKeystoreKit/KeyUsage/HMAC/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/build-profile.json5 b/UniversalKeystoreKit/KeyUsage/HMAC/entry/build-profile.json5 new file mode 100644 index 0000000..2d8b081 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": [ + "arm64-v8a", + "x86_64" + ] + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/hvigorfile.ts b/UniversalKeystoreKit/KeyUsage/HMAC/entry/hvigorfile.ts new file mode 100644 index 0000000..e4f43d5 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/HMAC/entry/oh-package.json5 new file mode 100644 index 0000000..118bdd4 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/oh-package.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/CMakeLists.txt b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..4b42dae --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(HMAC) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) +target_link_libraries(entry PUBLIC libace_napi.z.so libhuks_ndk.z.so) \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/napi_init.cpp b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000..88bc176 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start hmac] +#include "huks/native_huks_api.h" +#include "huks/native_huks_param.h" +#include "napi/native_api.h" +#include + +OH_Huks_Result InitParamSet(struct OH_Huks_ParamSet **paramSet, const struct OH_Huks_Param *params, + uint32_t paramCount) +{ + OH_Huks_Result ret = OH_Huks_InitParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_AddParams(*paramSet, params, paramCount); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + ret = OH_Huks_BuildParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + return ret; +} + +static struct OH_Huks_Param g_genHmacParams[] = {{.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_HMAC}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_MAC}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_AES_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_SHA384}}; + +static const uint32_t HMAC_COMMON_SIZE = 1024; +OH_Huks_Result HksHmacTest(const struct OH_Huks_Blob *keyAlias, const struct OH_Huks_ParamSet *hmacParamSet, + const struct OH_Huks_Blob *inData, struct OH_Huks_Blob *hashText) +{ + uint8_t handleE[sizeof(uint64_t)] = {0}; + struct OH_Huks_Blob handle = {sizeof(uint64_t), handleE}; + OH_Huks_Result ret = OH_Huks_InitSession(keyAlias, hmacParamSet, &handle, nullptr); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_FinishSession(&handle, hmacParamSet, inData, hashText); + return ret; +} + +static napi_value HmacKey(napi_env env, napi_callback_info info) +{ + /* 1. Generate Key */ + /* + * 模拟生成密钥场景 + * 1.1. 确定密钥别名 + */ + char tmpKeyAlias[] = "test_hmac"; + struct OH_Huks_Blob keyAlias = {(uint32_t)strlen(tmpKeyAlias), (uint8_t *)tmpKeyAlias}; + struct OH_Huks_ParamSet *hmacParamSet = nullptr; + OH_Huks_Result ohResult; + do { + /* + * 1.2. 获取生成密钥算法参数配置 + */ + ohResult = InitParamSet(&hmacParamSet, g_genHmacParams, sizeof(g_genHmacParams) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* + * 1.3. 调用generateKeyItem + */ + ohResult = OH_Huks_GenerateKeyItem(&keyAlias, hmacParamSet, nullptr); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 2. Hmac */ + /* + * 模拟哈希场景 + * 2.1. 获取密钥别名 + */ + /* + * 2.2. 获取待哈希的数据 + */ + char tmpInData[] = "HMAC_MAC_INDATA_1"; + struct OH_Huks_Blob inData = {(uint32_t)strlen(tmpInData), (uint8_t *)tmpInData}; + uint8_t cipher[HMAC_COMMON_SIZE] = {0}; + struct OH_Huks_Blob hashText = {HMAC_COMMON_SIZE, cipher}; + /* + * 2.3. 调用initSession获取handle + */ + /* + * 2.4. 调用finishSession获取哈希后的内容 + */ + ohResult = HksHmacTest(&keyAlias, hmacParamSet, &inData, &hashText); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + } while (0); + OH_Huks_FreeParamSet(&hmacParamSet); + napi_value ret; + napi_create_int32(env, ohResult.errorCode, &ret); + return ret; +} +// [End hmac] +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = {{"hmacKey", nullptr, HmacKey, nullptr, nullptr, nullptr, napi_default, nullptr}}; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void *)0), + .reserved = {0}, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); } diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/types/libentry/index.d.ts b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 0000000..97f8716 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const hmacKey: () => number; \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/types/libentry/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000..2826cc7 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libentry.so", + "types": "./index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/entryability/EntryAbility.ets b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..edc2839 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..b1e2129 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/pages/HMAC.ets b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/pages/HMAC.ets new file mode 100644 index 0000000..edb3b56 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/pages/HMAC.ets @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start hmac_to] +/* + * 以下以HMAC密钥的Promise操作使用为例 + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +let hmacKeyAlias = 'test_HMAC'; +let handle: number; +let plainText = '123456'; +let hashData: Uint8Array; + +function stringToUint8Array(str: String) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function uint8ArrayToString(fileData: Uint8Array) { + let dataString = ''; + for (let i = 0; i < fileData.length; i++) { + dataString += String.fromCharCode(fileData[i]); + } + return dataString; +} + +function getHMACProperties() { + const properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_HMAC + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_MAC + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA384, + }]; + return properties; +} + +async function generateHMACKey() { + /* + * 模拟生成密钥场景 + * 1. 确定密钥别名 + */ + /* + * 2. 获取生成密钥算法参数配置 + */ + let genProperties = getHMACProperties(); + let options: huks.HuksOptions = { + properties: genProperties + } + /* + * 3. 调用generateKeyItem + */ + await huks.generateKeyItem(hmacKeyAlias, options) + .then((data) => { + console.info(`promise: generate HMAC Key success`); + }).catch((error: Error) => { + console.error(`promise: generate HMAC Key failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} + +async function hMACData() { + /* + * 模拟HMAC场景 + * 1. 获取密钥别名 + */ + /* + * 2. 获取待哈希的数据 + */ + /* + * 3. 获取HMAC算法参数配置 + */ + let hmacProperties = getHMACProperties(); + let options: huks.HuksOptions = { + properties: hmacProperties, + inData: stringToUint8Array(plainText) + } + /* + * 4. 调用initSession获取handle + */ + await huks.initSession(hmacKeyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((error: Error) => { + console.error(`promise: init EncryptData failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) + /* + * 5. 调用finishSession获取HMAC的结果 + */ + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: HMAC data success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + hashData = data.outData as Uint8Array; + }).catch((error: Error) => { + console.error(`promise: HMAC data failed, ${JSON.stringify(error)}`); + throw (error as Error); + }) +} +// [End hmac_to] +@Entry +@Component +struct Index { + @State message: string = 'HMAC'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.call_hmac')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await generateHMACKey(); + await hMACData(); + this.message = 'HMAC Result: Success'; + } catch (error) { + this.message = 'HMAC Result: ' + error.message; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/pages/Index.ets b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..4cddde7 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; +import testNapi from 'libentry.so'; + +@Entry +@Component +struct Index { + @State message: string = 'HMAC'; + + goToSample(url: string): void { + router.pushUrl({ + url: url, + }, router.RouterMode.Single, (err) => { + if (err) { + console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('pushUrl success'); + }) + } + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.hmac')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/HMAC') + }) + Button($r('app.string.call_cpp_hmac_key')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: number = testNapi.hmacKey(); + this.message = 'Call C/C++ Result: ' + ret.toString(); + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/module.json5 b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/module.json5 new file mode 100644 index 0000000..4144486 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/module.json5 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/element/color.json b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/element/string.json b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..a5a12a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/element/string.json @@ -0,0 +1,28 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "HMAC" + }, + { + "name": "hmac", + "value": "HMAC" + }, + { + "name": "call_cpp_hmac_key", + "value": "Call C/C++" + }, + { + "name": "call_hmac", + "value": "Call HMAC" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/media/background.png b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/media/foreground.png b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f 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

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/profile/backup_config.json b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/profile/main_pages.json b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..55d301c --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,6 @@ +{ + "src": [ + "pages/Index", + "pages/HMAC" + ] +} diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/dark/element/color.json b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/ets/test/Ability.test.ets b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..0f8ce9a --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/ets/test/HMAC.test.ets b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/ets/test/HMAC.test.ets new file mode 100644 index 0000000..9555cd9 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/ets/test/HMAC.test.ets @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, beforeAll } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function hMACTest() { + describe('hMACTest', () => { + + /** + * 打开应用 + */ + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + await driver.delayMs(1000); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * 点击按钮,HMAC(ArkTS) + */ + it('testHMAC001', 0, async () => { + console.info('uitest: testHMAC001 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('HMAC').type('Button')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call HMAC')); + await button2.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('HMAC Result: Success')); + console.info('uitest: testHMAC001 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,HMAC(C/C++) + */ + it('testHMAC002', 0, async () => { + console.info('uitest: testHMAC002 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('Call C/C++')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(2000); + await driver.assertComponentExist(ON.text('Call C/C++ Result: 0')); + console.info('uitest: testHMAC002 end'); + }) + }) +} diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/ets/test/List.test.ets b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..c054467 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import hMACTest from './HMAC.test'; + +export default function testsuite() { + hMACTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/module.json5 b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..c3fd9dd --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/hvigor/hvigor-config.json5 b/UniversalKeystoreKit/KeyUsage/HMAC/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..d584c19 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/hvigorfile.ts b/UniversalKeystoreKit/KeyUsage/HMAC/hvigorfile.ts new file mode 100644 index 0000000..2a5e543 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/HMAC/oh-package.json5 new file mode 100644 index 0000000..e41bae0 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/ohosTest.md b/UniversalKeystoreKit/KeyUsage/HMAC/ohosTest.md new file mode 100644 index 0000000..4568f24 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/HMAC/ohosTest.md @@ -0,0 +1,9 @@ +# 密钥HMAC测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| --------------------- | ------------ | ---- | ------------------ | -------- | -------- | +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 点击按钮,HMAC(ArkTS) | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,HMAC(C/C++) | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/screenshots/HMAC_1.png b/UniversalKeystoreKit/KeyUsage/HMAC/screenshots/HMAC_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b99219740bd854a79df551a579ef4158131439a1 GIT binary patch literal 21808 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≫&>-86%RSyxnhTR;MGHZ3 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 M{5#euV8@UBFT#)gR{#J2 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/HMAC/screenshots/cpp_2.png b/UniversalKeystoreKit/KeyUsage/HMAC/screenshots/cpp_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d969cfd0c3f0cc56a028e56d31243cb30bb0a47c GIT binary patch literal 24435 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 XB0>f;pCZlv=j{ye-?3a5f*<=|vQ@o6 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/.gitignore b/UniversalKeystoreKit/KeyUsage/KeyDerivation/.gitignore new file mode 100644 index 0000000..d2ff201 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/.gitignore @@ -0,0 +1,12 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +/.appanalyzer \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/AppScope/app.json5 b/UniversalKeystoreKit/KeyUsage/KeyDerivation/AppScope/app.json5 new file mode 100644 index 0000000..6defc46 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/AppScope/app.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "bundleName": "com.samples.keyderivation", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/AppScope/resources/base/element/string.json b/UniversalKeystoreKit/KeyUsage/KeyDerivation/AppScope/resources/base/element/string.json new file mode 100644 index 0000000..96cf25c --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "KeyDerivation" + } + ] +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/AppScope/resources/base/media/app_icon.png b/UniversalKeystoreKit/KeyUsage/KeyDerivation/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a39445dc87828b76fed6d2ec470dd455c45319e3 GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/README.md b/UniversalKeystoreKit/KeyUsage/KeyDerivation/README.md new file mode 100644 index 0000000..66dfd3a --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/README.md @@ -0,0 +1,109 @@ +## 密钥派生(ArkTS) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-key-derivation-arkts.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### HKDF + +##### 介绍 + +1. 本示例主要介绍密钥派生,以HKDF为例,完成密钥派生。 + +##### 效果预览 + +| 主页 | 执行结果 | +| --------------------------------------------------- | --------------------------------------------------- | +| | | + +使用说明 + +1. 点击HKDF按钮生成密钥并派生密钥,删除密钥。 + +#### PBKDF2 + +##### 介绍 + +1. 本示例主要介绍密钥派生,以PBKDF为例,完成密钥派生。 + +##### 效果预览 + +| 主页 | 执行结果 | +| ----------------------------------------------------- | ----------------------------------------------------- | +| | | + +使用说明 + +1. 点击PBKDF2按钮生成密钥并派生密钥,删除密钥。 + +## 密钥派生(C/C++) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-key-derivation-ndk.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### Call C/C++ + +##### 介绍 + +1. 本示例主要介绍密钥派生,以HKDF256密钥为例,完成密钥派生。 + +##### 效果预览 + +| 主页 | 执行结果 | +| -------------------------------------------------- | -------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call C/C++按钮生成密钥并派生密钥,删除密钥。 + +## 工程目录 + +``` +entry/src/main/ +|---ets +|---|---entryability +|---|---|---EntryAbility.ets +|---|---pages +|---|---|---HKDF.ets +|---|---|---PBKDF2.ets +|---|---|---Index.ets // 首页 +|---cpp +|---resources // 静态资源 +|---ohosTest +|---|---ets +|---|---|---tests +|---|---|---|---KeyDerivation.test.ets // 自动化测试用例 +``` + + +## 相关权限 + +无。 + +## 依赖 + +不涉及。 + +## 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.2 Release及以上。 + +3. DevEco Studio版本:DevEco Studio 5.0.2 Release及以上。 + +4. HarmonyOS SDK版本:HarmonyOS 5.0.2 Release及以上。 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo UniversalKeystoreKit/KeyUsage/KeyDerivation > .git/info/sparse-checkout +git remote add origin https://gitee.com/harmonyos_samples/guide-snippets.git +git pull origin master +``` \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/build-profile.json5 b/UniversalKeystoreKit/KeyUsage/KeyDerivation/build-profile.json5 new file mode 100644 index 0000000..fb5a1ab --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/code-linter.json5 b/UniversalKeystoreKit/KeyUsage/KeyDerivation/code-linter.json5 new file mode 100644 index 0000000..2858646 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/code-linter.json5 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/.gitignore b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/build-profile.json5 b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/build-profile.json5 new file mode 100644 index 0000000..2d8b081 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": [ + "arm64-v8a", + "x86_64" + ] + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/hvigorfile.ts b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/hvigorfile.ts new file mode 100644 index 0000000..e4f43d5 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/oh-package.json5 new file mode 100644 index 0000000..118bdd4 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/oh-package.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/CMakeLists.txt b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..183f230 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(KeyDerivation) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) +target_link_libraries(entry PUBLIC libace_napi.z.so libhuks_ndk.z.so) \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/napi_init.cpp b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000..40a395d --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start key_derivation] +#include "huks/native_huks_api.h" +#include "huks/native_huks_param.h" +#include "napi/native_api.h" +#include + +OH_Huks_Result InitParamSet(struct OH_Huks_ParamSet **paramSet, const struct OH_Huks_Param *params, + uint32_t paramCount) +{ + OH_Huks_Result ret = OH_Huks_InitParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_AddParams(*paramSet, params, paramCount); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + ret = OH_Huks_BuildParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + return ret; +} +static const uint32_t DERIVE_KEY_SIZE_32 = 32; +static const uint32_t DERIVE_KEY_SIZE_256 = 256; +static struct OH_Huks_Blob g_deriveKeyAlias = {(uint32_t)strlen("test_derive"), (uint8_t *)"test_derive"}; +static struct OH_Huks_Param g_genDeriveParams[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_AES}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_DERIVE}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_SHA256}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_AES_KEY_SIZE_256}}; +static struct OH_Huks_Param g_hkdfParams[] = {{.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_HKDF}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_DERIVE}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_SHA256}, + {.tag = OH_HUKS_TAG_DERIVE_KEY_SIZE, .uint32Param = DERIVE_KEY_SIZE_32}}; +static struct OH_Huks_Param g_hkdfFinishParams[] = { + {.tag = OH_HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG, .uint32Param = OH_HUKS_STORAGE_ONLY_USED_IN_HUKS}, + {.tag = OH_HUKS_TAG_KEY_ALIAS, .blob = g_deriveKeyAlias}, + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_AES}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = DERIVE_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_DERIVE}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_SHA256}}; +static const uint32_t COMMON_SIZE = 2048; +static const char *G_DERIVE_IN_DATA = "Hks_HKDF_Derive_Test_00000000000000000000000000000000000000000000000000000000000" + "00000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000_string"; +static napi_value DeriveKey(napi_env env, napi_callback_info info) +{ + struct OH_Huks_Blob genAlias = {(uint32_t)strlen("test_signVerify"), (uint8_t *)"test_signVerify"}; + struct OH_Huks_Blob inData = {(uint32_t)strlen(G_DERIVE_IN_DATA), (uint8_t *)G_DERIVE_IN_DATA}; + struct OH_Huks_ParamSet *genParamSet = nullptr; + struct OH_Huks_ParamSet *hkdfParamSet = nullptr; + struct OH_Huks_ParamSet *hkdfFinishParamSet = nullptr; + OH_Huks_Result ohResult; + do { + ohResult = InitParamSet(&genParamSet, g_genDeriveParams, sizeof(g_genDeriveParams) / + sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + + ohResult = InitParamSet(&hkdfParamSet, g_hkdfParams, sizeof(g_hkdfParams) / + sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + + // finish paramset + ohResult = + InitParamSet(&hkdfFinishParamSet, g_hkdfFinishParams, sizeof(g_hkdfFinishParams) / + sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + + /* 1. Generate Key */ + ohResult = OH_Huks_GenerateKeyItem(&genAlias, genParamSet, nullptr); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 2. Derive */ + // Init + uint8_t handleD[sizeof(uint64_t)] = {0}; + struct OH_Huks_Blob handleDerive = {sizeof(uint64_t), handleD}; + ohResult = OH_Huks_InitSession(&genAlias, hkdfParamSet, &handleDerive, nullptr); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + // Update + uint8_t tmpOut[COMMON_SIZE] = {0}; + struct OH_Huks_Blob outData = {COMMON_SIZE, tmpOut}; + ohResult = OH_Huks_UpdateSession(&handleDerive, hkdfParamSet, &inData, &outData); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + // Finish + uint8_t outDataD[COMMON_SIZE] = {0}; + struct OH_Huks_Blob outDataDerive = {COMMON_SIZE, outDataD}; + ohResult = OH_Huks_FinishSession(&handleDerive, hkdfFinishParamSet, &inData, &outDataDerive); + } while (0); + (void)OH_Huks_DeleteKeyItem(&genAlias, nullptr); + (void)OH_Huks_DeleteKeyItem(&g_deriveKeyAlias, nullptr); + OH_Huks_FreeParamSet(&genParamSet); + OH_Huks_FreeParamSet(&hkdfParamSet); + OH_Huks_FreeParamSet(&hkdfFinishParamSet); + + napi_value ret; + napi_create_int32(env, ohResult.errorCode, &ret); + return ret; +} +// [End key_derivation] +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + {"deriveKey", nullptr, DeriveKey, nullptr, nullptr, nullptr, napi_default, nullptr}}; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void *)0), + .reserved = {0}, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); } diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/types/libentry/index.d.ts b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 0000000..a15baf5 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const deriveKey: () => number; \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/types/libentry/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000..2826cc7 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libentry.so", + "types": "./index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/entryability/EntryAbility.ets b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..edc2839 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..b1e2129 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/pages/HKDF.ets b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/pages/HKDF.ets new file mode 100644 index 0000000..0481900 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/pages/HKDF.ets @@ -0,0 +1,362 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +// [Start the_key_is_derived_from_hkdf] +/* + * 以下以HKDF密钥的Promise操作使用为例 + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +/* + * 确定密钥别名和封装密钥属性参数集 + */ +let srcKeyAlias = 'hkdf_Key'; +let deriveHkdfInData = 'deriveHkdfTestIndata'; +let handle: number; +let finishOutData: Uint8Array; +let huksKeyDeriveKeySize = 32; +/* 集成生成密钥参数集 */ +let properties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES, + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE, +}, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256, +}, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128, +}, { + tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG, + value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS, +}]; + +let huksOptions: huks.HuksOptions = { + properties: properties, + inData: new Uint8Array([]) +} +/* 集成init时密钥参数集 */ +let initProperties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_HKDF, +}, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE, +}, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256, +}, { + tag: huks.HuksTag.HUKS_TAG_DERIVE_KEY_SIZE, + value: huksKeyDeriveKeySize, +}]; + +let initOptions: huks.HuksOptions = { + properties: initProperties, + inData: new Uint8Array([]) +} +/* 集成finish时密钥参数集 */ +let finishProperties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG, + value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS, +}, { + tag: huks.HuksTag.HUKS_TAG_IS_KEY_ALIAS, + value: true, +}, { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES, +}, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256, +}, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: + huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | + huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT, +}, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_NONE, +}, { + tag: huks.HuksTag.HUKS_TAG_KEY_ALIAS, + value: stringToUint8Array(srcKeyAlias), +}, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE, +}, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_ECB, +}]; +let finishOptions: huks.HuksOptions = { + properties: finishProperties, + inData: new Uint8Array([]) +} + +function stringToUint8Array(str: String) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +class ThrowObject { + public isThrow = false; +} + +function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.generateKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise generateKeyItem`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await generateKeyItem(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: generateKeyItem input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +function initSession(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.initSession(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicInitFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise doInit`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await initSession(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: doInit success, data = ${JSON.stringify(data)}`); + handle = data.handle; + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doInit failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: doInit input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +function updateSession(handle: number, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.updateSession(handle, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicUpdateFunc(handle: number, huksOptions: huks.HuksOptions) { + console.info(`enter promise doUpdate`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await updateSession(handle, huksOptions, throwObject) + .then((data) => { + console.info(`promise: doUpdate success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doUpdate failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: doUpdate input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +function finishSession(handle: number, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.finishSession(handle, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicFinishFunc(handle: number, huksOptions: huks.HuksOptions) { + console.info(`enter promise doFinish`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await finishSession(handle, huksOptions, throwObject) + .then((data) => { + finishOutData = data.outData as Uint8Array; + console.info(`promise: doFinish success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doFinish failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: doFinish input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +function deleteKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.deleteKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicDeleteKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise deleteKeyItem`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await deleteKeyItem(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: deleteKeyItem key success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: deleteKeyItem failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: deleteKeyItem input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +async function testDerive() { + /* 生成密钥 */ + await publicGenKeyFunc(srcKeyAlias, huksOptions); + /* 进行派生操作 */ + await publicInitFunc(srcKeyAlias, initOptions); + initOptions.inData = stringToUint8Array(deriveHkdfInData); + await publicUpdateFunc(handle, initOptions); + await publicFinishFunc(handle, finishOptions); + await publicDeleteKeyFunc(srcKeyAlias, huksOptions); +} +// [End the_key_is_derived_from_hkdf] +@Entry +@Component +struct Index { + @State message: string = 'HKDF'; + + build() { + Column({ space: 12 }) { + Text(this.message).fontSize(20) + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.call_hkdf')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + let ret = await testDerive(); + this.message = 'HKDF Result: Success'; + } catch { + this.message = 'HKDF Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/pages/Index.ets b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..d7a06e9 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; +import testNapi from 'libentry.so'; + +@Entry +@Component +struct Index { + @State message: string = 'KeyDerivation'; + + goToSample(url: string): void { + router.pushUrl({ + url: url, + }, router.RouterMode.Single, (err) => { + if (err) { + console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('pushUrl success'); + }) + } + + build() { + Column({ space: 5 }) { + Text(this.message) + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.hkdf')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/HKDF') + }) + Button($r('app.string.pbkdf2')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/PBKDF2') + }) + Button($r('app.string.call_cpp_derive_key')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: number = testNapi.deriveKey(); + this.message = 'Call C/C++ Result: ' + ret.toString(); + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/pages/PBKDF2.ets b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/pages/PBKDF2.ets new file mode 100644 index 0000000..8dfd360 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/ets/pages/PBKDF2.ets @@ -0,0 +1,373 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start the_key_is_derived_from_pbkdf2] +/* + * 以下以PBKDF2密钥的Promise操作使用为例 + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +/* + * 确定密钥别名和封装密钥属性参数集 + */ +let srcKeyAlias = 'pbkdf2_Key'; +let salt = 'mySalt'; +let iterationCount = 10000; +let derivedKeySize = 32; +let handle: number; +let finishOutData: Uint8Array; + +/* 集成生成密钥参数集 */ +let properties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES, + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE, +}, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256, +}, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256, +}, { + tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG, + value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS, +} +]; + +let huksOptions: huks.HuksOptions = { + properties: properties, + inData: new Uint8Array([]) +} + +/* 集成init时密钥参数集 */ +let initProperties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_PBKDF2, + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE, +}, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256, +}, { + tag: huks.HuksTag.HUKS_TAG_DERIVE_KEY_SIZE, + value: derivedKeySize, +}, { + tag: huks.HuksTag.HUKS_TAG_ITERATION, + value: iterationCount, +}, { + tag: huks.HuksTag.HUKS_TAG_SALT, + value: stringToUint8Array(salt), +} +]; + +let initOptions: huks.HuksOptions = { + properties: initProperties, + inData: new Uint8Array([]) +} + +/* 集成finish时密钥参数集 */ +let finishProperties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG, + value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS, + }, { + tag: huks.HuksTag.HUKS_TAG_IS_KEY_ALIAS, + value: true, +}, { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES, +}, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256, +}, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT, +}, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_NONE, +}, { + tag: huks.HuksTag.HUKS_TAG_KEY_ALIAS, + value: stringToUint8Array(srcKeyAlias), +}, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE, +}, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_ECB, +} +]; + +let finishOptions: huks.HuksOptions = { + properties: finishProperties, + inData: new Uint8Array([]) +} + +function stringToUint8Array(str: String) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +class ThrowObject { + public isThrow = false; +} + +function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.generateKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise generateKeyItem`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await generateKeyItem(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: generateKeyItem input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +function initSession(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.initSession(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicInitFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise doInit`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await initSession(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: doInit success, data = ${JSON.stringify(data)}`); + handle = data.handle; + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doInit failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: doInit input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +function updateSession(handle: number, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.updateSession(handle, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicUpdateFunc(handle: number, huksOptions: huks.HuksOptions) { + console.info(`enter promise doUpdate`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await updateSession(handle, huksOptions, throwObject) + .then((data) => { + console.info(`promise: doUpdate success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doUpdate failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: doUpdate input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +function finishSession(handle: number, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.finishSession(handle, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicFinishFunc(handle: number, huksOptions: huks.HuksOptions) { + console.info(`enter promise doFinish`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await finishSession(handle, huksOptions, throwObject) + .then((data) => { + finishOutData = data.outData as Uint8Array; + console.info(`promise: doFinish success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doFinish failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: doFinish input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +function deleteKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.deleteKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicDeleteKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise deleteKeyItem`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await deleteKeyItem(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: deleteKeyItem key success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: deleteKeyItem failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: deleteKeyItem input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +async function testDerive() { + /* 生成密钥 */ + await publicGenKeyFunc(srcKeyAlias, huksOptions); + /* 进行派生操作 */ + await publicInitFunc(srcKeyAlias, initOptions); + await publicUpdateFunc(handle, initOptions); + await publicFinishFunc(handle, finishOptions); + await publicDeleteKeyFunc(srcKeyAlias, huksOptions); +} +// [End the_key_is_derived_from_pbkdf2] +@Entry +@Component +struct Index { + @State message: string = 'PBKDF2'; + + build() { + Column({ space: 12 }) { + Text(this.message) + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.call_pbkdf2')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + let ret = await testDerive(); + this.message = 'PBKDF2 Result: Success'; + } catch { + this.message = 'PBKDF2 Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/module.json5 b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/module.json5 new file mode 100644 index 0000000..4144486 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/module.json5 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/element/color.json b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/element/string.json b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..03a4ae7 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/element/string.json @@ -0,0 +1,60 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "KeyDerivation" + }, + { + "name": "key_derivation", + "value": "KeyDerivation" + }, + { + "name": "hkdf", + "value": "HKDF" + }, + { + "name": "pbkdf2", + "value": "PBKDF2" + }, + { + "name": "call_cpp_derive_key", + "value": "Call C/C++" + }, + { + "name": "call_cpp_result", + "value": "Call C/C++ Result: " + }, + { + "name": "call_hkdf", + "value": "Call HKDF" + }, + { + "name": "call_pbkdf2", + "value": "Call PBKDF2" + }, + { + "name": "hkdf_result_success", + "value": "HKDF Result: Success" + }, + { + "name": "hkdf_result_failed", + "value": "HKDF Result: Failed" + }, + { + "name": "pbkdf2_result_success", + "value": "PBKDF2 Result: Success" + }, + { + "name": "pbkdf2_result_failed", + "value": "PBKDF2 Result: Failed" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/media/background.png b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/media/foreground.png b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f 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

c)ijgxDm}8EsRXFt3h@+Ufr7@DN z^55r2UpdZvo*$)c`MJ_3zXBARbH%T}ifygzYy6g*WBtspGU<*Ccb`wpyW!Ui$gZ}y zo>MwK`K>f-62KfvO2{S zXF|ni6T=gB=C>=mF~5ojWS?I%DBt!ouB^&}v*S8G>5&(6>bM<0W9)PIeSXbv;v2lq zgZx&0)nJZqzUPEz=3RZouldy~VSciFe9|fxrs_KoD#u$hYz3BTu8Twxs@yt>*lp{< zm_XbpVEfL5#v}%x;+@AY<0*cV$ZF-248A&7CXCUG-9e@z7Va=V8J*&{q4I$n{~M-~K{qUmg-Y{N~tC__Y!6wZ`uS zAN=8SKnb`wARia}P{>}4q*mFJ2rt$xz9z}40>2@prKgMpJ4y?1MK zsu;8LLY(s8tNKp-L`??i35r}^567PuI=u8S&*EdFoy9Nf;48%{S#m8d=h|q*N!*Hw zE&QzCc2jn4u4(uar*pTPKCQ7DC)&Cs49?>3$7+X~)XJA`!=HT>p7`~r%@S~FvIWT% zL)t28t$h|BY!xpHnSQNXihG*>p${(0U;hi2mrwZcOUrZh0ee^UiT1oYO{3$5Hop*u zLXEN0l1qM=vD`rN)XOLJdon_5oHz3`AzpsrE1f=|*Mk1={U^)6{EcJ3kodUYZmX=p z&l4~2a)h&L*mG4|<3d+3_?Prr)`vgu$Y1U7EWIl2?@iUEd5K>;n9zxxlFNU^0vTLl zH@o9AcfQkuuVr{d?>6N1tv`70$?|*eKGqA1!uC8^rS(s+P1LOQ9lYFac+7nk_^^=}_9|LQHrRm;gm z#jgtmwd-2xd;fSm;rGSZd-@wbDeXS|)%sP&lv@b1qs`Sf43!0V?3qvsHeeF4^Q(*h z^}o7zxuRcU@`@_U0N4FIMxo}rPTLvJc{K#}XhYWmowJJ2$Yjbl`u)zkPnNIv?#GvR zeQ>x@oZ)FOm|m&l>_ivC(ek;URCk@4f5BINBIPcJedSknv#$7sL09O4r%@qb_M zz2et2d?)PSD|vhJv?jf^coe^7;*5D_(i{GoNjc@GFgNZjMJ5=HK91L-#6s_k5ZsDS zGS%RQ&sF+5eNE*3{W~3);ByDsjH9O)4$S@$?yR>?gy?){V`EPI$n>{$7kZJt&E|jq z@9tl&>KhB0wjiX?fvux_ph<@^P`xU#l~@YcVmvoP|52 zFCDST=db-|m-UT`(xE24+%n&4gZ%FnLi&Yo)!)!<`8*?XqEn@~PlG4oI{hPQc|SBA-3UqQo@Ok7n} zIAZ21l@78Rn`X^sw|ukiJP&AnypS?sjm)BYgRrvd_2vm*-zj>cKd@`Ab&91Yp=>6{)F%4)7auKu@lUJhnvWozKNZb^uG+`E@Y3=U zeK~|@uUf1nf;jWRpXQgYuqA_|MTZQJmcB;TNR^GlS{T8}iC6rO{IH|tWqO{uY5h}C zK^05FmfvX7IMk$1hE*ehH{+tKyHIa1DdB;;rJvHi z@XysN8q8vy7k-&z&tLr~zqICPT-#vO+|kk)bI{UP%}!$rHS^6TDD1uXt~a|@W*~+c z8vo^wJW;Rw34f4ZJkG`2_D~Yj%WRNd2O^Mwn=s<$0*s{9@EYCPT5v)bA~e(n|~6M0EUxGtnrcN&$s(s zzN8S(XWAcol9+ za@NCPqQw`HsBTqo#8>DWj&U^~+CTP~&69^IHqX$ty#E|%_>m7|XO7~asM|V+|Xy_l(fh&fm#RNST>VcoN?=6S_DPi%0~BG=sQt4-78)-@|b)lahBHa~PL<9jHj zNE~dl9PG02qUPM@QPu+cEDu-Af8%z}zB%Ihfge*{9Wd$&G+)E(=&9+o!^CjO`cwNdjVRH+WU`h_MXAOitJp5x3ifW{$igPf9iBj$(b=HI#x==`-hy-E&gI#->XR(BW&pMdcoR19-nNcPkY4s2bR7uK27u z;T-wi{Jv$d3tg^Khr|3zu!D-f$3GV1rd-BjB{h8+psmB&uHFO}3e<>-KnIym}P_oSC zslstp61Dm&1NiV|^pEbaNt}ZX!rh1GA<@OoA~K`yhAgd{@foOROsg!`F}gM(u1!jB zP-&PeM7Vk8W1#d^)-p1e`o(13g|c~w?dj`;4_bZu^_E|g3d=E{cLES;rdxmDH283uG=7WUKG<2~ea{IxU4q0( zBCeM((XD0e;O571>R|^u&Ev*jpsQGwzvm-2(K$^ICifY)?_e`E(umG-isbY(H;sFS z_TV{-u;uIR9OWMt?$V=eCxZbQ9k$3lC>2^A@xz~@XvD&(_uWN31AO=Zpf(=jB!lHh zOT3|j8)NsuFr00(J`~5*Aa@-yCcZDeY#2MK^7+byjE?yuYo4B|14zoWZPTeh8BIOF zi#LZ9-0pPpQq1&2arSg`YF@vQoGhb26RLwnlb*1L_^M-Vlx>giHItHpV-y+pt6ZEK z556G7lZ4?GS?qbNp_S;OAM&IlDs9+mIL@;^vinA)D6z3H9OHAVWxzHP_n^luSJ#<< zbsIty2lS^g(Tp%sL>_Jx%DMrbLPR&IRuN*2au@Mv3b3wQaDyVnmOp4Ma3Q*l1@}l- z7!@6xqcC>X;&3#^WC@2>d~Pt-WCFI;DSS*he8-yHfN>hl!&k7gZRoJWX*}IU_<3Dv zFh%O=_d;$wPTu#$88_QzeaYlJH`gOD^~u}%0AtVi0{v!P<5awgzdH2uJ`V|wUL*2lawezA2~fq&{P;mfB?8T6HUC*4h6A&Uoa8O-j$RT~z$aZBVg6 zzF?cyl6N zdHw?sJ7Tp$XXHMr#>SS7hWS(q4Vv|F6FxR`qoAKa__u1W&%AQI4T^VKan^IyU>zfs zE|$R$NQPNwnbWKcmi{dLjG5%b9r@2i8f!K??SvY4H+*lPY@EblJRiC1P#E;CqroIW z@amJ2xy(A56v{9|GuaTpMMj+DK>H#%Xah4-!k=}#^ zneQH-ALI49-brtya+(0Rs?MoH;W4xa=7q~HKFb7Z1nBuy5&@vrkTKXDY=saRII;oP z3R%&P2^nF-NYearIVR*J3O2Ys934KH3%!qF8Ezacu`vg0S*Oab^yt!p+xLq-xy5gM z#Kw5jI=`XA!CkZ&zAqE&VEj1=NFmPhl*4MSO=PEas`~e2-T71-1sApc|fu*Q}= zsYFnC_DZcy+zSDb@&j)&>t^-n;oK7;%>Y=GI zf;q6^#lf=W>#ky4S#ll)lVVQT_DO*_|C(c%5cIB9nT$1w zdZdwu#x~{=-+@S!Al?*`YqRX_$W)w|mL<42l`iKk-%cwYqIN?eH8`i)kL=}d1?JZx ztLCs2KGwvGug#(X==ud4yo;s5T!B+uNNV9YMyc!;d~C+efEeaJa{IVw7aDzJFOkR6 zSlJt<<>?A3vyx@)YW!;#RD~3cJ<+yt$FWi*K*_8K6|i@y5t3Ja zJ+H|ads>I+vjj95MRGK=^x>=qv2joEMXBp_IFN4`AdHaye#ZCSN+T3ki zEEWhGJ-%>&Q^eAnKgqhuJba{|Jl+AxddOr{Cxi+(@50!IbHi4?hjyY5LQ=XVPTEpb zyqVjwx1@vOf~d3GC@cCi=V6PSGqd|Ua>`SZ|JP5mkUUL?=|EPi{@-nlH?JLkAw z*sMbLgtgvL+o_1?*wJfZjcXpC5>GR~M4yu?y`l7N54Pg1hB01ME2+8Z!14qfU-Yz@ zpP&@C_lf&Q^@(4j;1EbkPV$`KhCay2t@XoalE&DO(HG;)bGsV$(1$|8a365@r{WKw zNW$FkEp^Sm<|7b9uV3Ad{N#D~L@0goVuYqx6L^T_<{Zg#=0otZT7J0Sg93< zJ_mX2IquB#Bm6s#^rsweb>du#$y5q2icb}=oNpi;{UA7T{^iK)*yGw5d6=pq_?*D>mRC&iQRDaItw;A9 zUwyN}YMcO55)^&3H9%p>YklyFuHBgRqrZ5o{^}Fg-RyE2Q&BkPr4P7!;2dsBBY5kZ z6MOo=-HSke#!JD&S`O^!e_!8v^T8YV)+p1?{L!gB{K1puy1vT%sWe=-JBLXqC(&~o zh8QdS8g_rYT88wPo<6+$(H>5CKO8#&q^#c>*j4hprAvR9e{%Kyt8YGf`?u>?8Tz14 zS1k!Et{sV(!ehcu#U^0M9yMmukRS`=W<1D5*Xuj%0?f#3B#i1AuV%Dk0a#p(np`Z z@Ny<>{{ZDV5+@v)mOs>&&;9Vv>-)pHaOkS3YygE%;ePHnZ!h`bKx(H9HZuLnZ`piM z2ii=ClLN3rsu>=c{+jNjKd(=0rLpid^!u4*y(mWJPG6kjm0Yv8i=0jt@0q$c?3SO6 zo`T_+i0(Myt98b;JQvD(PJ8@c_^spR4R6xbATVp;gA^fWJoolt6Viy=aHkR(bL6>a z0*u#QIOR-CHs#1eI_@gp{LgMJH~1i?ZcMM{ufkCb2He+@V%l*Br$@ccN`(OGk)9u)8Cl^IS$70>cnNtJOD;^adIv1mfzOH@{j*A zpUGT+)Iu&-&YD8$81J|E-`Afpo?Sod(=~-f1KG?W4N<>A4H|trX(W)6k{Oa&+m(#9NV~FpO<-jgq5FpLo=R80h%`t-tc094&kfl2?<-(g>J|r?=r^r}OA> zmp&f(`pX~wSI3@L@|*kMoPV!t)up3lQ3afNHGkNJ?ukAA%&S+P!*d|=aQo0Nz5YfK zKR4s_UId|>uzYyqbjJt5=GTt(Ez-yS$U9G{Cqm(9+ajN> zgT~ide(a0*RMefm>R_qQXttNTKUJiWa#G(o>gibbxL(-&eO>l^>-4Yw{;}#f=Ndog zTpjgwLr5GKkp=Bm^VjU9%39U~*@|iCk3RCfSN<|`f4G7d?}tSDTy`AIwQL?;#$97+ ztSvnwvYK=4p}Io0?fv>@g@5oyeJpBc$rtZF^xS26hCWZ4#Yok->p2VeHu^YSPUGG2k^A|XtmgmW>+a9E=9)4OCk5TSW^(Rd;pI_JfySLre zQLOv*sbCN46V?6wuS}=FN|eBT_p(bFq*`MXpIA`Vg(EMp(umI{;a4t?=!xmyYV?&H2P7PMKv=d+vjRBWh(As6Lj0Qcn$#3?!%y6`&&<3aj!!;n$@xk0 z*`QFf2~yb7*ZgYBR84)J;s=KZ&x_vE!tWtII60`G5(@|IFyHPr=5zVG<@(X_<1hTc z_kGCwAo)o&!Uw+XL*A!{f;S*LxN;y5=0e-ZrK)pdNED2liw(!iVbw-%n7!XMpG8kA zGUJMmr0RBj5-MyJddQOpL{O*s7%s{`6u+WXrgQwlI?smCIg$&Q{AYgqCt0wKb7$_% zm%{TugWsEv_{Fa|uJO;}cZ_9uLpG0)>jq*Vhu`WPlbLjiH(IU~Fm-o{X+n|rIebs+ zBK*FBMohVN%r4@=_@qH>4)KXqe5CL#cK)Tu;+Dei@z-rsKEYOe;uO{W-~*^lGv{e} zg4af91r84J?WZul<4pXy&Q9bMAD7uEiayKu@j6WtFdw~+#;%<5b$dDfR;X#?4us;} z-~EhV6zs>~=Rof`?o~=VM~9%M_?8J+n!&AcCV)?AP=;fE71{~UeEA>#S{QucDki=r zzHybu$j{hvT>Nr&n2+r=zY;+&dlw*cHh$KbFJ$UN=-6jIG7AR2vDH_c$iN1FmhpRt z?{%2s!?BZglURd~-k|DP8~&9Flv)o?mLI$Jz3h>-Z8i{UeJRS<(K9vL#!-~$F*1Sp z9>4-|wb7EC2gB>kF9$2`EI#_O(HBeOdGZy+=Ze2BPH_+Mi?qgP47=j(>kB=mJ%oMS z9r<0iE@an9F`Z)KGra&4x%#2EIrCiSSMf=2pI?~4w>$UPbpC{gT;8zlrl=Bb2 zc!MuoiVfHWSDf^|NDlF(^ZW;&*`LSHX6X1EeyW$cIeN{P*pA<}=H;OUB#~>P2l%!Y z!u69#KlsSz*U2UJ{M*;+{q-Mwz4pdlJGFtZ-+TGiS1Ql<#B&y|xO2F8BP#-G95X!= zS3AtF&0v5*jT?Lk8~!j1%0_T}otooBko6is#Sgz&6@Aj7$ONp`$^7Ks*zOGN$=Vl+ z!3WfQyRB%BY(65Ff(S*v1=yWtyJ{I0gB$4W-~OP!g>&~BlI$ss{JeWJ0Y~lvE4La}LgwmJ{B^=-^LrxrR*K+!NY34Y z%M z<9FfUS32e(gAJbEtbl5ub8iasSIo+HYW6cI2(;PPCVrX9hj6>)HIID%gYPzH@6^%v zv^{*@-@5)2n!;y#NN$bBu|)+fn^0}89(_q=8AGE|lG!A3qm}-*G$sPd@g2 zSN`*ry_F8$fdaX8yu3>5_^=Mm3a>SxDq|(W496V3gthog+!l-+gI^0x3>K~U0B9_I z@g1v9#%%cbQY(J<)|7{e%NhR$c6@0R)3;{wt|Y5hT-qAn?23((Ie*Is_;P_4Gx3j1 z3^!RMCcZ=O#~*wM_}}BBm6H6+W|(D1K9`SA_)O&v{7zZehxLm7tBQH}eC`H%|3AL+ zwv$WC=ZSiwBbOHn*aasRMW->jDp-wcQfvqt$sDPv&GGOq`KuGkd^o;c>O`@?JJE_` zdU788%6;TNa;;()znFK!uf=i(n|UXb!}$}T5F5S&N6!Fu`(`Au^2Zij=Z|V?HNBZ# z{Jg_J&>P3Qlh3>HhAVHIXs5)?*?J{TB9TPPY-Gp32p`^F3!lv=`TY2MT!#Dn_EX5YDwXjm4@%zo zyA%j0dpPZ8aUi>rp!dHqyG~d+l6Q>+x9T-*oC&4dQmFv;TYcH~Spj>DJ0esIt zzWNO+#A`{>E5i(Xk;Z0`sjgNLsQM^ePYfMu`tZTDpWqGSgiZetwnduxeT7P8ynTsi zel~9SC}kpn5&t6m<~Z?*-@e9Xw_7%@1cxGiwOUv!*ZAgV{^YpI;WyoHSsAi`#H6j9 zt$aSe;%xY&tQ7Q@%CCLw|GfH*c7B0V=63;TLHuy07aBFXpK@e@kz6>#YSGcv3{ghz zzVXF3=^Q@()T&z5KP7&Q>i!XZTNu&$kfkNQnO!8-_aDL+?R~C8sjF4t! z6x@c9tB)3F@nK85F<=By?G&Gi4}X@LiXJ2XmM&tvDMDVeZJcH{s6W+y1bgFn`9~ZXTFjEjziZ(}(o3vn z`%X>ZGshK%2W48h%Jnqix>9=bSGbGC-{Va~Hp{r_k-l2)R5e=9GXJFTue#GuTPtHLO_kpoE;{;<|N8ou=yCIP zN<{A~WY5T@7mLhsKlK)EER*b9LF?v{dT-&+=Hpvd_~PVB{13->Hs|DD_AU++MKR^? zVbs#s_)ceV^X6!`7vaB08NBAP@4xarcZzYI{jMLv_MN@||G4r!x9+?3(b^}k&qm0m zIJo%3!Mf<)XVROminu6NX7e>E)#+h2O$}L)eu$)~=3}XaGUgyZ_V8KMnK#)7zjPHp z_Ts=j%wK(OAJ%4maf|Pa51wLAKZDR6(r+-k<@J}An;-pDHxE9y+0Rj)g#6$aUwirP zX!kYxQ0mVy-QN2yL-92;)+QS*i|kvrv|fAPK+-?Jmin%y1ZS6N0LGw(w2!|y(vgZ*y#F}>^b>-1db)Nj=f;xC|Ft8@YI zMIq1nn~#0+?)d1{!hey9e+8a5izk@{Oplez2GHqrSUlSN&@^wrvVyP!giSlmuO%9r zW`jOGD83?gYTjdlCEZT%G_f_YKb`yp!)N?Qcc8y6-5c~LFW-9YpKRX@b^v?Vs?#fW z*DlT`JnOH$|Jl3C_q|fP=kqnu&(d`7^YSrkS5(VraZMu&zIv_2t3qXyto_-1d=_pk z^vbJk!~$p|XLVszAW2V_Pv+Y=r{jaEb~--#@C&o@YkYyT{(x!uak=@SdyXFer}KN5 zFTlMk$hvZOMZ0@2f4q3@#*LTjFKs?eK|fUioJEMtmjUO-<02&yOE|p|V-%X=6Xv@X(oCxjr1jf2;npdQ$tQM<2QW z=azp~pZ|S`@O0`r&8O4l#eLPLy7n@?{`u15<>(>(HP?sj)ax^gp0C0^Q@=iWK*f2c zD)fL#sXs~F-K&MVM;neWi6M8@tERwteOT%%cv{JMqtu2a&-F?ld~arKwAH@y=LKKw z#h-2EA?L&VSjQ(K-_mq$Dl8u&b4}hKRXUGo8jtD{dqj15STlZy(C<7sI)2CQ_~fnE k9@EG3{4s5ok?kb>|H;3ubeVRY^#A|>07*qoM6N<$f~C=$asU7T literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/profile/backup_config.json b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/profile/main_pages.json b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..f642399 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,7 @@ +{ + "src": [ + "pages/Index", + "pages/HKDF", + "pages/PBKDF2" + ] +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/dark/element/color.json b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/ets/test/Ability.test.ets b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..0f8ce9a --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/ets/test/KeyDerivation.test.ets b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/ets/test/KeyDerivation.test.ets new file mode 100644 index 0000000..b7b4b3d --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/ets/test/KeyDerivation.test.ets @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, beforeAll } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function keyDerivationTest() { + describe('keyDerivationTest', () => { + /** + * 打开应用 + */ + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + await driver.delayMs(1000); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * 点击按钮,密钥派生HKDF + */ + it('testKeyDerivation001', 0, async () => { + console.info('uitest: testKeyDerivation001 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('HKDF')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call HKDF')); + await button2.click(); + await driver.delayMs(2000); + await driver.assertComponentExist(ON.text('HKDF Result: Success')); + console.info('uitest: testKeyDerivation001 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,密钥派生PBKDF2 + */ + it('testKeyDerivation002', 0, async () => { + console.info('uitest: testKeyDerivation002 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('PBKDF2')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call PBKDF2')); + await button2.click(); + await driver.delayMs(2000); + await driver.assertComponentExist(ON.text('PBKDF2 Result: Success')); + console.info('uitest: testKeyDerivation002 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,密钥派生HKDF256(C/C++) + */ + it('testKeyDerivation003', 0, async () => { + console.info('uitest: testKeyDerivation003 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('Call C/C++')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('Call C/C++ Result: 0')); + console.info('uitest: testKeyDerivation003 end'); + await driver.pressBack(); + }) + }) +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/ets/test/List.test.ets b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..fc4ce84 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import keyDerivationTest from './KeyDerivation.test'; + +export default function testsuite() { + keyDerivationTest(); +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/module.json5 b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..c3fd9dd --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/test/List.test.ets b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/test/List.test.ets new file mode 100644 index 0000000..f1186b1 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/test/LocalUnit.test.ets b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000..7fc57c7 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/hvigor/hvigor-config.json5 b/UniversalKeystoreKit/KeyUsage/KeyDerivation/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..d584c19 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/hvigorfile.ts b/UniversalKeystoreKit/KeyUsage/KeyDerivation/hvigorfile.ts new file mode 100644 index 0000000..2a5e543 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/KeyDerivation/oh-package.json5 new file mode 100644 index 0000000..e41bae0 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/ohosTest.md b/UniversalKeystoreKit/KeyUsage/KeyDerivation/ohosTest.md new file mode 100644 index 0000000..ba4443d --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyDerivation/ohosTest.md @@ -0,0 +1,10 @@ +# 密钥派生测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| ------------------------- | ------------ | ---- | ------------------ | -------- | -------- | +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 点击按钮,密钥派生HKDF | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,密钥派生PBKDF2 | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,密钥派生(C/C++) | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/screenshots/Cpp_1.png b/UniversalKeystoreKit/KeyUsage/KeyDerivation/screenshots/Cpp_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9ccc75e166ce2184f5011af72756742cc717fedb GIT binary patch literal 25990 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 I0PN&{1AO3+(*OVf literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/screenshots/HKDF_1.png b/UniversalKeystoreKit/KeyUsage/KeyDerivation/screenshots/HKDF_1.png new file mode 100644 index 0000000000000000000000000000000000000000..bc576a1f42c5d57394fb85302a7547bd23b6325f GIT binary patch literal 21300 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/screenshots/PBKDF2_1.png b/UniversalKeystoreKit/KeyUsage/KeyDerivation/screenshots/PBKDF2_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5ca73e0caf7fbd6f9bc78f01c2fc525ce455fead GIT binary patch literal 22211 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 QQd{+TyUgm8s7Pb~4P&-N-v9sr literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyDerivation/screenshots/PBKDF2_2.png b/UniversalKeystoreKit/KeyUsage/KeyDerivation/screenshots/PBKDF2_2.png new file mode 100644 index 0000000000000000000000000000000000000000..700c836fcdbdfb0162ff3eb7c8180e6d0156a050 GIT binary patch literal 23754 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 DL!3-} literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/.gitignore b/UniversalKeystoreKit/KeyUsage/KeyExchange/.gitignore new file mode 100644 index 0000000..d2ff201 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/.gitignore @@ -0,0 +1,12 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +/.appanalyzer \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/AppScope/app.json5 b/UniversalKeystoreKit/KeyUsage/KeyExchange/AppScope/app.json5 new file mode 100644 index 0000000..287ffda --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/AppScope/app.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "bundleName": "com.samples.keyexchange", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/AppScope/resources/base/element/string.json b/UniversalKeystoreKit/KeyUsage/KeyExchange/AppScope/resources/base/element/string.json new file mode 100644 index 0000000..dc8e956 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "KeyExchange" + } + ] +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/AppScope/resources/base/media/app_icon.png b/UniversalKeystoreKit/KeyUsage/KeyExchange/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a39445dc87828b76fed6d2ec470dd455c45319e3 GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/README.md b/UniversalKeystoreKit/KeyUsage/KeyExchange/README.md new file mode 100644 index 0000000..c3aa9f8 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/README.md @@ -0,0 +1,109 @@ +## 密钥协商(ArkTS) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-key-derivation-arkts.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### X25519 + +##### 介绍 + +1. 本示例主要介绍密钥协商,以协商密钥类型为X25519,并密钥仅在HUKS内使用为例,完成密钥协商。 + +##### 效果预览 + +| 主页 | 执行结果 | +| ----------------------------------------------------- | ----------------------------------------------------- | +| | | + +使用说明 + +1. 点击X25519按钮完成密钥协商。 + +#### DH + +##### 介绍 + +1. 本示例主要介绍密钥协商,以协商密钥类型为DH密钥,并密钥仅在HUKS内使用为例,完成密钥协商。 + +##### 效果预览 + +| 主页 | 执行结果 | +| ------------------------------------------------- | ------------------------------------------------- | +| | | + +使用说明 + +1. 点击DH按钮完成密钥协商。 + +## 密钥协商(C/C++) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-key-derivation-ndk.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### Call C/C++ + +##### 介绍 + +1. 本示例主要介绍密钥协商,以ECDH密钥为例,完成密钥协商。 + +##### 效果预览 + +| 主页 | 执行结果 | +| -------------------------------------------------- | -------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call C/C++按钮完成密钥协商。 + +## 工程目录 + +``` +entry/src/main/ +|---ets +|---|---entryability +|---|---|---EntryAbility.ets +|---|---pages +|---|---|---X25519.ets +|---|---|---DH.ets +|---|---|---Index.ets // 首页 +|---cpp +|---resources // 静态资源 +|---ohosTest +|---|---ets +|---|---|---tests +|---|---|---|---KeyExchange.test.ets // 自动化测试用例 +``` + + +## 相关权限 + +无。 + +## 依赖 + +不涉及。 + +## 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.2 Release及以上。 + +3. DevEco Studio版本:DevEco Studio 5.0.2 Release及以上。 + +4. HarmonyOS SDK版本:HarmonyOS 5.0.2 Release及以上。 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo UniversalKeystoreKit/KeyUsage/KeyExchange > .git/info/sparse-checkout +git remote add origin https://gitee.com/harmonyos_samples/guide-snippets.git +git pull origin master +``` \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/build-profile.json5 b/UniversalKeystoreKit/KeyUsage/KeyExchange/build-profile.json5 new file mode 100644 index 0000000..fb5a1ab --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/code-linter.json5 b/UniversalKeystoreKit/KeyUsage/KeyExchange/code-linter.json5 new file mode 100644 index 0000000..2858646 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/code-linter.json5 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/.gitignore b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/build-profile.json5 b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/build-profile.json5 new file mode 100644 index 0000000..2d8b081 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": [ + "arm64-v8a", + "x86_64" + ] + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/hvigorfile.ts b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/hvigorfile.ts new file mode 100644 index 0000000..e4f43d5 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/oh-package.json5 new file mode 100644 index 0000000..118bdd4 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/oh-package.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/CMakeLists.txt b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..9e0677b --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(KeyExchange) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) +target_link_libraries(entry PUBLIC libace_napi.z.so libhuks_ndk.z.so) \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/napi_init.cpp b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000..f61e730 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start key_agreement] +#include "huks/native_huks_api.h" +#include "huks/native_huks_param.h" +#include "napi/native_api.h" +#include + +/* 初始化参数 */ +OH_Huks_Result InitParamSet(struct OH_Huks_ParamSet **paramSet, const struct OH_Huks_Param *params, + uint32_t paramCount) +{ + OH_Huks_Result ret = OH_Huks_InitParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_AddParams(*paramSet, params, paramCount); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + ret = OH_Huks_BuildParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + return ret; +} +static const uint32_t IV_SIZE = 16; +static uint8_t IV[IV_SIZE] = {0}; // this is a test value, for real use the iv should be different every time +static struct OH_Huks_Blob g_keyAliasFinal1001 = {(uint32_t)strlen("HksECDHAgreeKeyAliasTest001_1_final"), + (uint8_t *)"HksECDHAgreeKeyAliasTest001_1_final"}; +/* 集成密钥参数集 */ +static struct OH_Huks_Param g_genAgreeParams[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_ECC}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_AGREE}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_ECC_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_NONE}}; +static struct OH_Huks_Param g_agreeParamsInit01[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_ECDH}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_AGREE}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_ECC_KEY_SIZE_256}}; +static struct OH_Huks_Param g_agreeParamsFinish01[] = { + {.tag = OH_HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG, .uint32Param = OH_HUKS_STORAGE_ONLY_USED_IN_HUKS}, + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_AES}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_AES_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_AGREE}, + {.tag = OH_HUKS_TAG_KEY_ALIAS, .blob = g_keyAliasFinal1001}, + {.tag = OH_HUKS_TAG_PADDING, .uint32Param = OH_HUKS_PADDING_NONE}, + {.tag = OH_HUKS_TAG_BLOCK_MODE, .uint32Param = OH_HUKS_MODE_CBC}}; +static struct OH_Huks_Blob g_keyAliasFinal2001 = {(uint32_t)strlen("HksECDHAgreeKeyAliasTest001_2_final"), + (uint8_t *)"HksECDHAgreeKeyAliasTest001_2_final"}; +static struct OH_Huks_Param g_agreeParamsInit02[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_ECDH}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_AGREE}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_ECC_KEY_SIZE_256}}; +static struct OH_Huks_Param g_agreeParamsFinish02[] = { + {.tag = OH_HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG, .uint32Param = OH_HUKS_STORAGE_ONLY_USED_IN_HUKS}, + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_AES}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_AES_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_AGREE}, + {.tag = OH_HUKS_TAG_KEY_ALIAS, .blob = g_keyAliasFinal2001}, + {.tag = OH_HUKS_TAG_PADDING, .uint32Param = OH_HUKS_PADDING_NONE}, + {.tag = OH_HUKS_TAG_BLOCK_MODE, .uint32Param = OH_HUKS_MODE_CBC}}; +static const uint32_t ECDH_COMMON_SIZE = 1024; +static struct OH_Huks_Blob g_keyAlias01001 = {(uint32_t)strlen("HksECDHAgreeKeyAliasTest001_1"), + (uint8_t *)"HksECDHAgreeKeyAliasTest001_1"}; +static struct OH_Huks_Blob g_keyAlias02001 = {(uint32_t)strlen("HksECDHAgreeKeyAliasTest001_2"), + (uint8_t *)"HksECDHAgreeKeyAliasTest001_2"}; + +OH_Huks_Result MallocAndCheckBlobData(struct OH_Huks_Blob *blob, const uint32_t blobSize) +{ + struct OH_Huks_Result ret; + ret.errorCode = OH_HUKS_SUCCESS; + if (blobSize == 0 || blobSize > ECDH_COMMON_SIZE) { + ret.errorCode = OH_HUKS_ERR_CODE_INTERNAL_ERROR; + return ret; + } + blob->data = (uint8_t *)malloc(blobSize); + if (blob->data == NULL) { + ret.errorCode = OH_HUKS_ERR_CODE_INTERNAL_ERROR; + } + return ret; +} +/* 导出密钥 */ +OH_Huks_Result HksEcdhAgreeExport(const struct OH_Huks_Blob *keyAlias1, const struct OH_Huks_Blob *keyAlias2, + struct OH_Huks_Blob *publicKey1, struct OH_Huks_Blob *publicKey2, + const struct OH_Huks_ParamSet *genParamSet) +{ + OH_Huks_Result ret = OH_Huks_ExportPublicKeyItem(keyAlias1, genParamSet, publicKey1); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_ExportPublicKeyItem(keyAlias2, genParamSet, publicKey2); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + return ret; +} +static const char *IN_DATA = "Hks_ECDH_Agree_Test_000000000000000000000000000000000000000000000000000000000000" + "00000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000_string"; +/* 协商密钥操作 */ +OH_Huks_Result HksEcdhAgreeFinish(const struct OH_Huks_Blob *keyAlias, const struct OH_Huks_Blob *publicKey, + const struct OH_Huks_ParamSet *initParamSet, + const struct OH_Huks_ParamSet *finishParamSet, struct OH_Huks_Blob *outData) +{ + struct OH_Huks_Blob inData = {(uint32_t)strlen(IN_DATA), (uint8_t *)IN_DATA}; + uint8_t handleU[sizeof(uint64_t)] = {0}; + struct OH_Huks_Blob handle = {sizeof(uint64_t), handleU}; + OH_Huks_Result ret = OH_Huks_InitSession(keyAlias, initParamSet, &handle, nullptr); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + uint8_t outDataU[ECDH_COMMON_SIZE] = {0}; + struct OH_Huks_Blob outDataUpdate = {ECDH_COMMON_SIZE, outDataU}; + ret = OH_Huks_UpdateSession(&handle, initParamSet, publicKey, &outDataUpdate); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_FinishSession(&handle, finishParamSet, &inData, outData); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + return ret; +} + +/* 协商密钥整体流程 */ +static napi_value AgreeKey(napi_env env, napi_callback_info info) +{ + struct OH_Huks_ParamSet *genParamSet = nullptr; + struct OH_Huks_ParamSet *initParamSet01 = nullptr; + struct OH_Huks_ParamSet *finishParamSet01 = nullptr; + struct OH_Huks_ParamSet *initParamSet02 = nullptr; + struct OH_Huks_ParamSet *finishParamSet02 = nullptr; + struct OH_Huks_Blob publicKey01 = {.size = OH_HUKS_ECC_KEY_SIZE_256, .data = nullptr}; + struct OH_Huks_Blob publicKey02 = {.size = OH_HUKS_ECC_KEY_SIZE_256, .data = nullptr}; + struct OH_Huks_Blob outData01 = {.size = ECDH_COMMON_SIZE, .data = nullptr}; + struct OH_Huks_Blob outData02 = {.size = ECDH_COMMON_SIZE, .data = nullptr}; + OH_Huks_Result ohResult; + do { + /* 1.确定密钥别名集成密钥参数集 */ + ohResult = InitParamSet(&genParamSet, g_genAgreeParams, sizeof(g_genAgreeParams) / + sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + ohResult = + InitParamSet(&initParamSet01, g_agreeParamsInit01, sizeof(g_agreeParamsInit01) / + sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + ohResult = InitParamSet(&finishParamSet01, g_agreeParamsFinish01, + sizeof(g_agreeParamsFinish01) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + ohResult = + InitParamSet(&initParamSet02, g_agreeParamsInit02, sizeof(g_agreeParamsInit02) / + sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + ohResult = InitParamSet(&finishParamSet02, g_agreeParamsFinish02, + sizeof(g_agreeParamsFinish02) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 2.设备A生成密钥 */ + ohResult = OH_Huks_GenerateKeyItem(&g_keyAlias01001, genParamSet, nullptr); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 3.设备B生成密钥 */ + ohResult = OH_Huks_GenerateKeyItem(&g_keyAlias02001, genParamSet, nullptr); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + ohResult = MallocAndCheckBlobData(&publicKey01, publicKey01.size); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + ohResult = MallocAndCheckBlobData(&publicKey02, publicKey02.size); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 4.设备A、B导出公钥 */ + ohResult = HksEcdhAgreeExport(&g_keyAlias01001, &g_keyAlias02001, &publicKey01, + &publicKey02, genParamSet); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + ohResult = MallocAndCheckBlobData(&outData01, outData01.size); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + ohResult = MallocAndCheckBlobData(&outData02, outData02.size); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 5.设备A协商密钥 */ + ohResult = HksEcdhAgreeFinish(&g_keyAlias01001, &publicKey02, initParamSet01, + finishParamSet01, &outData01); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 5.设备B协商密钥 */ + ohResult = HksEcdhAgreeFinish(&g_keyAlias02001, &publicKey01, initParamSet02, + finishParamSet02, &outData02); + } while (0); + free(publicKey01.data); + free(publicKey02.data); + free(outData01.data); + free(outData02.data); + /* 6.设备A、B删除密钥 */ + OH_Huks_DeleteKeyItem(&g_keyAlias01001, genParamSet); + OH_Huks_DeleteKeyItem(&g_keyAlias02001, genParamSet); + OH_Huks_DeleteKeyItem(&g_keyAliasFinal1001, NULL); + OH_Huks_DeleteKeyItem(&g_keyAliasFinal2001, NULL); + OH_Huks_FreeParamSet(&genParamSet); + OH_Huks_FreeParamSet(&initParamSet01); + OH_Huks_FreeParamSet(&finishParamSet01); + OH_Huks_FreeParamSet(&initParamSet02); + OH_Huks_FreeParamSet(&finishParamSet02); + + napi_value ret; + napi_create_int32(env, ohResult.errorCode, &ret); + return ret; +} + +// [End key_agreement] +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + {"agreeKey", nullptr, AgreeKey, nullptr, nullptr, nullptr, napi_default, nullptr}}; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void *)0), + .reserved = {0}, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); } diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/types/libentry/index.d.ts b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 0000000..14e3b41 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const agreeKey: () => number; \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/types/libentry/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000..2826cc7 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libentry.so", + "types": "./index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/entryability/EntryAbility.ets b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..edc2839 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..b1e2129 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/pages/DH.ets b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/pages/DH.ets new file mode 100644 index 0000000..89e9373 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/pages/DH.ets @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start key_agreement_dh] +/* +*以下以 DH密钥的Promise操作使用为例 +*/ +import { huks } from '@kit.UniversalKeystoreKit'; + +function stringToUint8Array(str: string) { + let arr: number[] = [] + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function uint8ArrayToBigInt(arr: Uint8Array): bigint { + let i = 0 + const byteMax: bigint = BigInt('0x100') + let result: bigint = BigInt('0') + while (i < arr.length) { + result = result * byteMax + result = result + BigInt(arr[i]) + i += 1 + } + return result; +} + +const dhAgree: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_DH, +}, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_AGREE, +}] +const dh2048Agree: huks.HuksParam[] = [ + ...dhAgree, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_DH_KEY_SIZE_2048, +}] +const dhGenOptions: huks.HuksOptions = { + properties: dh2048Agree, + inData: new Uint8Array([]) +} +const emptyOptions: huks.HuksOptions = { + properties: [], + inData: new Uint8Array([]) +} + +async function huksDhAgreeExportKey(keyAlias: string, + peerPubKey: huks.HuksReturnResult): Promise { + const initHandle = await huks.initSession(keyAlias, dhGenOptions) + const dhAgreeUpdateBobPubKey: huks.HuksOptions = { + properties: [ + ...dh2048Agree, { + tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG, + value: huks.HuksKeyStorageType.HUKS_STORAGE_KEY_EXPORT_ALLOWED, + }], + inData: peerPubKey.outData + } + await huks.updateSession(initHandle.handle, dhAgreeUpdateBobPubKey) + return await huks.finishSession(initHandle.handle, emptyOptions) +} + +async function huksDhAgreeExportTest( + aliasA: string, aliasB: string, + pubKeyA: huks.HuksReturnResult, pubKeyB: huks.HuksReturnResult) { + + const agreedKeyFromAlice = await huksDhAgreeExportKey(aliasA, pubKeyB); + console.info(`ok! agreedKeyFromAlice export is 0x${uint8ArrayToBigInt(agreedKeyFromAlice.outData).toString(16)}`); + + const agreedKeyFromBob = await huksDhAgreeExportKey(aliasB, pubKeyA); + console.info(`ok! agreedKeyFromBob export is 0x${uint8ArrayToBigInt(agreedKeyFromBob.outData).toString(16)}`); +} + +async function huksDhAgreeInHuks(keyAlias: string, peerPubKey: huks.HuksReturnResult, + aliasAgreedKey: string): Promise { + const onlyUsedInHuks: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_KEY_STORAGE_FLAG, + value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS, + }, { + tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG, + value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS, + }] + const dhAgreeInit: huks.HuksOptions = { + properties: [ + ...dhAgree, + { tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256, }, + ...onlyUsedInHuks], + inData: new Uint8Array([]) + } + const dhAgreeFinishParams: huks.HuksParam[] = [ + ...onlyUsedInHuks, + { tag: huks.HuksTag.HUKS_TAG_IS_KEY_ALIAS, value: true }, + { tag: huks.HuksTag.HUKS_TAG_ALGORITHM, value: huks.HuksKeyAlg.HUKS_ALG_AES }, + { tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT + }] + + const handle = await huks.initSession(keyAlias, dhAgreeInit) + const dhAgreeUpdatePubKey: huks.HuksOptions = { + properties: [...dhAgree, ...onlyUsedInHuks], + inData: peerPubKey.outData + } + await huks.updateSession(handle.handle, dhAgreeUpdatePubKey) + const dhAgreeAliceFinnish: huks.HuksOptions = { + properties: [...dhAgreeFinishParams, { + tag: huks.HuksTag.HUKS_TAG_KEY_ALIAS, value: stringToUint8Array(aliasAgreedKey) + }], inData: new Uint8Array([]) + } + return await huks.finishSession(handle.handle, dhAgreeAliceFinnish); +} + +async function huksDhAgreeInHuksTest( + aliasA: string, aliasB: string, + pubKeyA: huks.HuksReturnResult, pubKeyB: huks.HuksReturnResult, + aliasAgreedKeyFromA: string, aliasAgreedKeyFromB: string) { + + const finishAliceResult = await huksDhAgreeInHuks(aliasA, pubKeyB, aliasAgreedKeyFromA); + console.info(`ok! finishAliceResult in huks is 0x${uint8ArrayToBigInt(finishAliceResult.outData).toString(16)}`); + const aliceAgreedExist = await huks.isKeyItemExist(aliasAgreedKeyFromA, emptyOptions); + console.info(`ok! aliceAgreedExist in huks is ${aliceAgreedExist}`); + + const finishBobResult = await huksDhAgreeInHuks(aliasB, pubKeyA, aliasAgreedKeyFromB); + console.info(`ok! finishBobResult in huks is 0x${uint8ArrayToBigInt(finishBobResult.outData).toString(16)}`); + const bobAgreedExist = await huks.isKeyItemExist(aliasAgreedKeyFromB, emptyOptions); + console.info(`ok! bobAgreedExist in huks is ${bobAgreedExist}`); + + await huks.deleteKeyItem(aliasAgreedKeyFromA, emptyOptions); + await huks.deleteKeyItem(aliasAgreedKeyFromB, emptyOptions); +} + +export default async function huksDhAgreeTest() { + const aliasAlice = 'alice'; + const aliasBob = 'bob'; + + /* 调用generateKeyItem生成别名为alice与bob的两个密钥 */ + await huks.generateKeyItem(aliasAlice, dhGenOptions); + await huks.generateKeyItem(aliasBob, dhGenOptions); + + /* 导出非对称密钥alice与bob的的公钥 */ + const pubKeyAlice = await huks.exportKeyItem(aliasAlice, emptyOptions); + const pubKeyBob = await huks.exportKeyItem(aliasBob, emptyOptions); + + /* 开始协商,协商生成的密钥返回给业务管理 */ + await huksDhAgreeExportTest(aliasAlice, aliasBob, pubKeyAlice, pubKeyBob); + + /* 开始协商,协商生成的密钥由HUKS管理 */ + await huksDhAgreeInHuksTest(aliasAlice, aliasBob, pubKeyAlice, pubKeyBob, 'agreedKeyFromAlice', 'agreedKeyFromBob'); + + await huks.deleteKeyItem(aliasAlice, emptyOptions); + await huks.deleteKeyItem(aliasBob, emptyOptions); +} + + +// [End key_agreement_dh] +@Entry +@Component +struct Index { + @State message: string = 'DH'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.dh')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await huksDhAgreeTest(); + this.message = 'DH Result: Success'; + } catch { + this.message = 'DH Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/pages/Index.ets b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..6a9d3d1 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; +import testNapi from 'libentry.so'; + +@Entry +@Component +struct Index { + @State message: string = 'KeyExchange'; + + goToSample(url: string): void { + router.pushUrl({ + url: url, + }, router.RouterMode.Single, (err) => { + if (err) { + console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('pushUrl success'); + }) + } + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.x25519')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/X25519') + }) + Button($r('app.string.dh')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/DH') + }) + Button($r('app.string.call_cpp_agree_key')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: number = testNapi.agreeKey(); + this.message = 'Call C/C++ Result: ' + ret.toString(); + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/pages/X25519.ets b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/pages/X25519.ets new file mode 100644 index 0000000..85af04b --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/ets/pages/X25519.ets @@ -0,0 +1,427 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start key_agreement_X25519] + +/* +*以下以X25519密钥的Promise操作使用为例 +*/ +import { huks } from '@kit.UniversalKeystoreKit'; + +/* +* 确定密钥别名和封装密钥属性参数集 +*/ +let srcKeyAliasFirst = 'AgreeX25519KeyFirstAlias'; +let srcKeyAliasSecond = 'AgreeX25519KeySecondAlias'; +let agreeX25519InData = 'AgreeX25519TestIndata'; +let finishOutData: Uint8Array; +let handle: number; +let exportKey: Uint8Array; +let exportKeyFirst: Uint8Array; +let exportKeySecond: Uint8Array; +/* 集成生成密钥参数集 */ +let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_X25519, +}, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_AGREE, +}, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_CURVE25519_KEY_SIZE_256, +}, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_NONE, +}, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE, +}, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_CBC, +}, { + tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG, + value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS, +}]; +let huksOptions: huks.HuksOptions = { + properties: properties, + inData: new Uint8Array([]) +} +/* 集成第一个协商参数集 */ +const finishProperties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG, + value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS, +}, { + tag: huks.HuksTag.HUKS_TAG_IS_KEY_ALIAS, + value: true +}, { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_AES, +}, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256, +}, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: + huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | + huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT, +}, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_NONE, +}, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_NONE, +}, { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_ECB, +}]; +let finishOptionsFirst: huks.HuksOptions = { + properties: [ + ...finishProperties, { + tag: huks.HuksTag.HUKS_TAG_KEY_ALIAS, + value: stringToUint8Array(srcKeyAliasFirst + 'final'), + }], + inData: stringToUint8Array(agreeX25519InData) +} +/* 集成第二个协商参数集 */ +let finishOptionsSecond: huks.HuksOptions = { + properties: [ + ...finishProperties, { + tag: huks.HuksTag.HUKS_TAG_KEY_ALIAS, + value: stringToUint8Array(srcKeyAliasSecond + 'final'), + }], + inData: stringToUint8Array(agreeX25519InData) +} + +function stringToUint8Array(str: string) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +class ThrowObject { + public isThrow: boolean = false +} + +/* 生成密钥 */ +function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.generateKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +/* 调用generateKeyItem生成密钥 */ +async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise generateKeyItem`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await generateKeyItem(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: generateKeyItem input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +/*初始化密钥会话接口,并获取一个句柄(必选)和挑战值(可选)*/ +function initSession(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.initSession(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +/*调用initSession获取handle*/ +async function publicInitFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise doInit`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await initSession(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: doInit success, data = ${JSON.stringify(data)}`); + handle = data.handle; + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doInit failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: doInit input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +/* 分段添加密钥操作的数据并进行相应的密钥操作,输出处理数据 */ +function updateSession(handle: number, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.updateSession(handle, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +/* 调用updateSession进行协商操作 */ +async function publicUpdateFunc(handle: number, huksOptions: huks.HuksOptions) { + console.info(`enter promise doUpdate`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await updateSession(handle, huksOptions, throwObject) + .then((data) => { + console.info(`promise: doUpdate success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doUpdate failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: doUpdate input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +/* 结束密钥会话并进行相应的密钥操作,输出处理数据 */ +function finishSession(handle: number, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.finishSession(handle, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +/* 调用finishSession结束操作 */ +async function publicFinishFunc(handle: number, huksOptions: huks.HuksOptions) { + console.info(`enter promise doFinish`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await finishSession(handle, huksOptions, throwObject) + .then((data) => { + finishOutData = data.outData as Uint8Array; + console.info(`promise: doFinish success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: doFinish failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: doFinish input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +/* 导出密钥 */ +function exportKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.exportKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +/* 调用exportKeyItem导出公钥操作 */ +async function publicExportKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise export`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await exportKeyItem(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: exportKeyItem success, data = ${JSON.stringify(data)}`); + exportKey = data.outData as Uint8Array; + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: exportKeyItem failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: exportKeyItem input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +/* 删除密钥操作 */ +function deleteKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.deleteKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +/* 调用deleteKeyItem删除密钥操作 */ +async function publicDeleteKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise deleteKeyItem`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await deleteKeyItem(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: deleteKeyItem key success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: deleteKeyItem failed, ${JSON.stringify(error)}`); + throw (error as Error); + } + }); + } catch (error) { + console.error(`promise: deleteKeyItem input arg invalid, ${JSON.stringify(error)}`); + throw (error as Error); + } +} + +async function testAgree() { + /* 1.确定密钥别名并集成并集成要参数集 A设备:srcKeyAliasFirst B设备:srcKeyAliasSecond*/ + /* 2.设备A生成密钥 */ + await publicGenKeyFunc(srcKeyAliasFirst, huksOptions); + /* 3.设备B生成密钥 */ + await publicGenKeyFunc(srcKeyAliasSecond, huksOptions); + /* 4.设备A、B导出非对称密钥的公钥 */ + await publicExportKeyFunc(srcKeyAliasFirst, huksOptions); + exportKeyFirst = exportKey; + await publicExportKeyFunc(srcKeyAliasSecond, huksOptions); + exportKeySecond = exportKey; + /* 5.对第一个密钥进行协商(三段式)*/ + await publicInitFunc(srcKeyAliasFirst, huksOptions); + huksOptions.inData = exportKeySecond; + await publicUpdateFunc(handle, huksOptions); + await publicFinishFunc(handle, finishOptionsFirst); + /* 5.对第二个密钥进行协商(三段式) */ + await publicInitFunc(srcKeyAliasSecond, huksOptions); + huksOptions.inData = exportKeyFirst; + await publicUpdateFunc(handle, huksOptions); + await publicFinishFunc(handle, finishOptionsSecond); + /* 6.设备A、B删除密钥 */ + await publicDeleteKeyFunc(srcKeyAliasFirst, huksOptions); + await publicDeleteKeyFunc(srcKeyAliasSecond, huksOptions); +} + + +// [End key_agreement_X25519] +@Entry +@Component +struct Index { + @State message: string = 'X25519'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.x25519')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await testAgree(); + this.message = 'X25519 Result: Success'; + } catch { + this.message = 'X25519 Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/module.json5 b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/module.json5 new file mode 100644 index 0000000..4144486 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/module.json5 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/element/color.json b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/element/string.json b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..9797923 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/element/string.json @@ -0,0 +1,28 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "KeyExchange" + }, + { + "name": "x25519", + "value": "X25519" + }, + { + "name": "dh", + "value": "DH" + }, + { + "name": "call_cpp_agree_key", + "value": "Call C/C++" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/media/background.png b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/media/foreground.png b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f 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

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/profile/backup_config.json b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/profile/main_pages.json b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..46d06be --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,7 @@ +{ + "src": [ + "pages/Index", + "pages/X25519", + "pages/DH" + ] +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/dark/element/color.json b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/ets/test/Ability.test.ets b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..0f8ce9a --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/ets/test/KeyExchange.test.ets b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/ets/test/KeyExchange.test.ets new file mode 100644 index 0000000..7219b91 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/ets/test/KeyExchange.test.ets @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, beforeAll } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function keyExchangeTest() { + describe('keyExchangeTest', () => { + /** + * 打开应用 + */ + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + await driver.delayMs(1000); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * 点击按钮,X25519非对称密钥协商 + */ + it('testKeyExchange001', 0, async () => { + console.info('uitest: testKeyExchange001 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('X25519')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('X25519').type('Button')); + await button2.click(); + await driver.delayMs(3500); + await driver.assertComponentExist(ON.text('X25519 Result: Success')); + console.info('uitest: testKeyExchange001 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,DH密钥协商 + */ + it('testKeyExchange002', 0, async () => { + console.info('uitest: testKeyExchange002 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('DH')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('DH').type('Button')); + await button2.click(); + await driver.delayMs(3500); + await driver.assertComponentExist(ON.text('DH Result: Success')); + console.info('uitest: testKeyExchange002 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,密钥协商(C/C++) + */ + it('testKeyExchange003', 0, async () => { + console.info('uitest: testKeyExchange003 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('Call C/C++')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('Call C/C++ Result: 0')); + console.info('uitest: testKeyExchange003 end'); + await driver.pressBack(); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/ets/test/List.test.ets b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..efdb2ea --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import abilityTest from './Ability.test'; +import keyExchangeTest from './KeyExchange.test'; + +export default function testsuite() { + keyExchangeTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/module.json5 b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..c3fd9dd --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/test/List.test.ets b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/test/List.test.ets new file mode 100644 index 0000000..f1186b1 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/test/LocalUnit.test.ets b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000..7fc57c7 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/hvigor/hvigor-config.json5 b/UniversalKeystoreKit/KeyUsage/KeyExchange/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..d584c19 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/hvigorfile.ts b/UniversalKeystoreKit/KeyUsage/KeyExchange/hvigorfile.ts new file mode 100644 index 0000000..2a5e543 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/KeyExchange/oh-package.json5 new file mode 100644 index 0000000..e41bae0 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/ohosTest.md b/UniversalKeystoreKit/KeyUsage/KeyExchange/ohosTest.md new file mode 100644 index 0000000..d4941cc --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/KeyExchange/ohosTest.md @@ -0,0 +1,10 @@ +# 密钥协商测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| ------------------------------ | ------------ | ---- | ------------------ | -------- | -------- | +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 点击按钮,X25519非对称密钥协商 | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,DH密钥协商 | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,密钥协商(C/C++) | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/Cpp_1.png b/UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/Cpp_1.png new file mode 100644 index 0000000000000000000000000000000000000000..18f8f0cc77d5cc0e0f5fa848226bcac77e39ff5f GIT binary patch literal 25448 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 beYU}`z(9!>@SWSr=9v-8?9)jA%+&t?d)k8! literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/Cpp_2.png b/UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/Cpp_2.png new file mode 100644 index 0000000000000000000000000000000000000000..bff5e66377234c8880df85f9d64a55ba32d5feb7 GIT binary patch literal 26003 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 R#Zxv<4_{`RP6S}4{s&IPxds3L literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/DH_1.png b/UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/DH_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e174cf5a8059ce1938dc15fc19ba971ae64185d3 GIT binary patch literal 19843 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 Va?Urvo#X?_A%)PU91v;h-vA2>f5-p; literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/DH_2.png b/UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/DH_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f59179b24fe4b9a2e4d13d3f0f6dcf92432c84d5 GIT binary patch literal 21366 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/X25519_2.png b/UniversalKeystoreKit/KeyUsage/KeyExchange/screenshots/X25519_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e48b3038e1eb853df8ba8c8cfec17387f8e8222f GIT binary patch literal 22951 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 G`@aD69lO{7 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/.gitignore b/UniversalKeystoreKit/KeyUsage/SigningVerification/.gitignore new file mode 100644 index 0000000..d2ff201 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/.gitignore @@ -0,0 +1,12 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +/.appanalyzer \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/AppScope/app.json5 b/UniversalKeystoreKit/KeyUsage/SigningVerification/AppScope/app.json5 new file mode 100644 index 0000000..681c2bb --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/AppScope/app.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "bundleName": "com.samples.signingverification", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/AppScope/resources/base/element/string.json b/UniversalKeystoreKit/KeyUsage/SigningVerification/AppScope/resources/base/element/string.json new file mode 100644 index 0000000..5244c89 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "SigningVerification" + } + ] +} diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/AppScope/resources/base/media/app_icon.png b/UniversalKeystoreKit/KeyUsage/SigningVerification/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a39445dc87828b76fed6d2ec470dd455c45319e3 GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/README.md b/UniversalKeystoreKit/KeyUsage/SigningVerification/README.md new file mode 100644 index 0000000..ef75953 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/README.md @@ -0,0 +1,143 @@ +## 签名/验签(ArkTS) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-signing-signature-verification-arkts.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### ECC256/SHA256 + +##### 介绍 + +1. 本示例主要介绍密钥签名验签,以密钥签名验签类型ECC256/SHA256为例。 + +##### 效果预览 + +| 主页 | 执行结果 | +| ---------------------------------------------------- | ---------------------------------------------------- | +| | | + +使用说明 + +1. 点击ECC256/SHA256按钮进行密钥签名验签。 + +#### SM2/SM3 + +##### 介绍 + +1. 本示例主要介绍密钥签名验签,以密钥签名验签类型SM2/SM3为例。 + +##### 效果预览 + +| 主页 | 执行结果 | +| ------------------------------------------------- | ------------------------------------------------- | +| | | + +使用说明 + +1. 点击SM2/SM3按钮进行密钥签名验签。 + +#### RSA/SHA256/PSS + +##### 介绍 + +1. 本示例主要介绍密钥签名验签,以密钥签名验签类型RSA/SHA256/PSS为例。 + +##### 效果预览 + +| 主页 | 执行结果 | +| ------------------------------------------------- | ------------------------------------------------- | +| | | + +使用说明 + +1. 点击RSA/SHA256/PSS按钮进行密钥签名验签。 + +#### RSA/SHA256/PKCS1_V1_5 + +##### 介绍 + +1. 本示例主要介绍密钥签名验签,以密钥签名验签类型RSA/SHA256/PKCS1_V1_5为例。 + +##### 效果预览 + +| 主页 | 执行结果 | +| ---------------------------------------------------- | ---------------------------------------------------- | +| | | + +使用说明 + +1. 点击RSA/SHA256/PKCS1_V1_5按钮进行密钥签名验签。 + +## 签名/验签(C/C++) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-signing-signature-verification-ndk.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### Call C/C++ + +##### 介绍 + +1. 本示例主要介绍密钥签名验签,以密钥算法为RSA2048、摘要算法为SHA384、填充模式为PSS的密钥为例。 + +##### 效果预览 + +| 主页 | 执行结果 | +| ------------------------------------------------- | ------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call C/C++按钮完成密钥签名验签。 + +## 工程目录 + +``` +entry/src/main/ +|---ets +|---|---entryability +|---|---|---EntryAbility.ets +|---|---pages +|---|---|---ECC256SHA256.ets +|---|---|---RSASHA256PKCS1_V1_5.ets +|---|---|---RSASHA256PSS.ets +|---|---|---SM2SM3.ets +|---|---|---Index.ets // 首页 +|---cpp +|---resources // 静态资源 +|---ohosTest +|---|---ets +|---|---|---tests +|---|---|---|---SigningVerification.test.ets // 自动化测试用例 +``` + + +## 相关权限 + +无。 + +## 依赖 + +不涉及。 + +## 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.2 Release及以上。 + +3. DevEco Studio版本:DevEco Studio 5.0.2 Release及以上。 + +4. HarmonyOS SDK版本:HarmonyOS 5.0.2 Release及以上。 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo UniversalKeystoreKit/KeyUsage/SigningVerification > .git/info/sparse-checkout +git remote add origin https://gitee.com/harmonyos_samples/guide-snippets.git +git pull origin master +``` \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/build-profile.json5 b/UniversalKeystoreKit/KeyUsage/SigningVerification/build-profile.json5 new file mode 100644 index 0000000..fb5a1ab --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/code-linter.json5 b/UniversalKeystoreKit/KeyUsage/SigningVerification/code-linter.json5 new file mode 100644 index 0000000..2858646 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/code-linter.json5 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/.gitignore b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/build-profile.json5 b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/build-profile.json5 new file mode 100644 index 0000000..2d8b081 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": [ + "arm64-v8a", + "x86_64" + ] + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/hvigorfile.ts b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/hvigorfile.ts new file mode 100644 index 0000000..e4f43d5 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/oh-package.json5 new file mode 100644 index 0000000..118bdd4 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/oh-package.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/CMakeLists.txt b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..376c545 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(SigningVerification) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) +target_link_libraries(entry PUBLIC libace_napi.z.so libhuks_ndk.z.so) \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/napi_init.cpp b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000..590b3d4 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start signature_verification_supported_algorithms] +#include "huks/native_huks_api.h" +#include "huks/native_huks_param.h" +#include "napi/native_api.h" +#include + +OH_Huks_Result InitParamSet(struct OH_Huks_ParamSet **paramSet, const struct OH_Huks_Param *params, + uint32_t paramCount) +{ + OH_Huks_Result ret = OH_Huks_InitParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_AddParams(*paramSet, params, paramCount); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + ret = OH_Huks_BuildParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + return ret; +} + +static struct OH_Huks_Param g_genSignVerifyParamsTest[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_RSA}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_SIGN | OH_HUKS_KEY_PURPOSE_VERIFY}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_RSA_KEY_SIZE_2048}, + {.tag = OH_HUKS_TAG_PADDING, .uint32Param = OH_HUKS_PADDING_PSS}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_SHA384}, +}; + +static struct OH_Huks_Param g_signParamsTest[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_RSA}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_SIGN}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_RSA_KEY_SIZE_2048}, + {.tag = OH_HUKS_TAG_PADDING, .uint32Param = OH_HUKS_PADDING_PSS}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_SHA384}}; + +static struct OH_Huks_Param g_verifyParamsTest[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_RSA}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_VERIFY}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_RSA_KEY_SIZE_2048}, + {.tag = OH_HUKS_TAG_PADDING, .uint32Param = OH_HUKS_PADDING_PSS}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_SHA384}}; + +static const uint32_t RSA_COMMON_SIZE = 1024; +static const char *DATA_TO_SIGN = "Hks_RSA_Sign_Verify_Test_0000000000000000000000000000000000000000000000000000000" + "00000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000_string"; + +static napi_value SignVerifyKey(napi_env env, napi_callback_info info) +{ + struct OH_Huks_Blob g_keyAlias = {(uint32_t)strlen("test_signVerify"), (uint8_t *)"test_signVerify"}; + struct OH_Huks_Blob inData = {(uint32_t)strlen(DATA_TO_SIGN), (uint8_t *)DATA_TO_SIGN}; + struct OH_Huks_ParamSet *genParamSet = nullptr; + struct OH_Huks_ParamSet *signParamSet = nullptr; + struct OH_Huks_ParamSet *verifyParamSet = nullptr; + OH_Huks_Result ohResult; + do { + ohResult = InitParamSet(&genParamSet, g_genSignVerifyParamsTest, + sizeof(g_genSignVerifyParamsTest) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + ohResult = InitParamSet(&signParamSet, g_signParamsTest, sizeof(g_signParamsTest) / + sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + ohResult = + InitParamSet(&verifyParamSet, g_verifyParamsTest, sizeof(g_verifyParamsTest) / + sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 1. Generate Key */ + ohResult = OH_Huks_GenerateKeyItem(&g_keyAlias, genParamSet, nullptr); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 2. Sign */ + // Init + uint8_t handleS[sizeof(uint64_t)] = {0}; + struct OH_Huks_Blob handleSign = {(uint32_t)sizeof(uint64_t), handleS}; + ohResult = OH_Huks_InitSession(&g_keyAlias, signParamSet, &handleSign, nullptr); + // Update + uint8_t outDataS[RSA_COMMON_SIZE] = {0}; + struct OH_Huks_Blob outDataSign = {RSA_COMMON_SIZE, outDataS}; + ohResult = OH_Huks_UpdateSession(&handleSign, signParamSet, &inData, &outDataSign); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + // Finish + struct OH_Huks_Blob finishInData = {0, NULL}; + ohResult = OH_Huks_FinishSession(&handleSign, signParamSet, &finishInData, &outDataSign); + + /* 3. Verify */ + // Init + uint8_t handleV[sizeof(uint64_t)] = {0}; + struct OH_Huks_Blob handleVerify = {(uint32_t)sizeof(uint64_t), handleV}; + ohResult = OH_Huks_InitSession(&g_keyAlias, verifyParamSet, &handleVerify, nullptr); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + // Update loop + uint8_t temp[] = "out"; + struct OH_Huks_Blob verifyOut = {(uint32_t)sizeof(temp), temp}; + ohResult = OH_Huks_UpdateSession(&handleVerify, verifyParamSet, &inData, &verifyOut); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + // Finish + ohResult = OH_Huks_FinishSession(&handleVerify, verifyParamSet, &outDataSign, &verifyOut); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + } while (0); + (void)OH_Huks_DeleteKeyItem(&g_keyAlias, genParamSet); + OH_Huks_FreeParamSet(&genParamSet); + OH_Huks_FreeParamSet(&signParamSet); + OH_Huks_FreeParamSet(&verifyParamSet); + + napi_value ret; + napi_create_int32(env, ohResult.errorCode, &ret); + return ret; +} + + +// [End signature_verification_supported_algorithms] +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + {"signVerifyKey", nullptr, SignVerifyKey, nullptr, nullptr, nullptr, napi_default, nullptr}}; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void *)0), + .reserved = {0}, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); } diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/types/libentry/index.d.ts b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 0000000..d5ab382 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const signVerifyKey: () => number; \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/types/libentry/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000..2826cc7 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libentry.so", + "types": "./index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/entryability/EntryAbility.ets b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..edc2839 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..b1e2129 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/ECC256SHA256.ets b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/ECC256SHA256.ets new file mode 100644 index 0000000..3830abf --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/ECC256SHA256.ets @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start key_algorithm_ECC256SHA256] +/* + * 密钥算法为ECC256、摘要算法为SHA256 + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +let keyAlias = 'test_eccKeyAlias'; +let handle: number; +let plaintext = '123456'; +let signature: Uint8Array; + +function stringToUint8Array(str: String) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function uint8ArrayToString(fileData: Uint8Array) { + let dataString = ''; + for (let i = 0; i < fileData.length; i++) { + dataString += String.fromCharCode(fileData[i]); + } + return dataString; +} + +function getEccGenerateProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_ECC + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN | + huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256 + }]; + return properties; +} + +function getEccSignProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_ECC + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256 + }]; + return properties; +} + +function getEccVerifyProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_ECC + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256 + }]; + return properties; +} + +async function generateEccKey(keyAlias: string) { + let genProperties = getEccGenerateProperties(); + let options: huks.HuksOptions = { + properties: genProperties + } + await huks.generateKeyItem(keyAlias, options) + .then((data) => { + console.info(`promise: generate ECC Key success, data = ${JSON.stringify(data)}`); + }).catch((err: Error) => { + console.error(`promise: generate ECC Key failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) +} + +async function sign(keyAlias: string, plaintext: string) { + let signProperties = getEccSignProperties(); + let options: huks.HuksOptions = { + properties: signProperties, + inData: stringToUint8Array(plaintext) + } + await huks.initSession(keyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((err: Error) => { + console.error(`promise: init sign failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: sign success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + signature = data.outData as Uint8Array; + }).catch((err: Error) => { + console.error(`promise: sign failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) +} + +async function verify(keyAlias: string, plaintext: string, signature: Uint8Array) { + let verifyProperties = getEccVerifyProperties() + let options: huks.HuksOptions = { + properties: verifyProperties, + inData: stringToUint8Array(plaintext) + } + await huks.initSession(keyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((err: Error) => { + console.error(`promise: init verify failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) + await huks.updateSession(handle, options) + .then((data) => { + console.info(`promise: update verify success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + }).catch((err: Error) => { + console.error(`promise: update verify failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) + options.inData = signature; + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: verify success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + }).catch((err: Error) => { + console.error(`promise: verify failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) +} + +async function deleteEccKey(keyAlias: string) { + let emptyOptions: huks.HuksOptions = { + properties: [] + } + await huks.deleteKeyItem(keyAlias, emptyOptions) + .then((data) => { + console.info(`promise: delete data success`); + }).catch((err: Error) => { + console.error(`promise: delete data failed`); + throw (err as Error); + }) +} + +async function testSignVerify() { + await generateEccKey(keyAlias); + await sign(keyAlias, plaintext); + await verify(keyAlias, plaintext, signature); + await deleteEccKey(keyAlias); +} + + +// [End key_algorithm_ECC256SHA256] +@Entry +@Component +struct Index { + @State message: string = 'ECC256/SHA256'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.ecc256_sha256')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await testSignVerify(); + this.message = 'ECC256/SHA256 Result: Success'; + } catch (error) { + this.message = 'ECC256/SHA256 Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/Index.ets b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..69313ce --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; +import testNapi from 'libentry.so'; + +@Entry +@Component +struct Index { + @State message: string = 'SigningVerification'; + + goToSample(url: string): void { + router.pushUrl({ + url: url, + }, router.RouterMode.Single, (err) => { + if (err) { + console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('pushUrl success'); + }) + } + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.ecc256_sha256')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/ECC256SHA256'); + }) + Button($r('app.string.sm2_sm3')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/SM2SM3'); + }) + Button($r('app.string.rsa_sha256_pss')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/RSASHA256PSS'); + }) + Button($r('app.string.rsa_sha256_pkcs1_v1_5')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/RSASHA256PKCS1_V1_5'); + }) + Button($r('app.string.call_cpp_sign_verify')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: number = testNapi.signVerifyKey(); + this.message = 'Call C/C++ Result: ' + ret.toString(); + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/RSASHA256PKCS1_V1_5.ets b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/RSASHA256PKCS1_V1_5.ets new file mode 100644 index 0000000..ef2f7a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/RSASHA256PKCS1_V1_5.ets @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// [Start key_algorithm_RSASHA256PKCS1_V1_5] +/* + * 密钥算法为RSA,摘要算法为SHA256,填充模式为PKCS1_V1_5 + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +let keyAlias = 'test_rsaKeyAlias'; +let handle: number; +let plaintext = '123456'; +let signature: Uint8Array; + +function stringToUint8Array(str: String) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function uint8ArrayToString(fileData: Uint8Array) { + let dataString = ''; + for (let i = 0; i < fileData.length; i++) { + dataString += String.fromCharCode(fileData[i]); + } + return dataString; +} + +function getRsaGenerateProperties() { + let properties: huks.HuksParam[] = [ + { tag: huks.HuksTag.HUKS_TAG_ALGORITHM, value: huks.HuksKeyAlg.HUKS_ALG_RSA }, + { tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY + }, + { tag: huks.HuksTag.HUKS_TAG_PADDING, value: huks.HuksKeyPadding.HUKS_PADDING_PKCS1_V1_5 }, + { tag: huks.HuksTag.HUKS_TAG_DIGEST, value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256 } + ]; + return properties; +} + +function getRsaSignProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_PKCS1_V1_5 + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256 + }]; + return properties; +} + +function getRsaVerifyProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_PKCS1_V1_5 + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256 + }]; + return properties; +} + +async function generateRsaKey(keyAlias: string) { + let genProperties = getRsaGenerateProperties(); + let options: huks.HuksOptions = { + properties: genProperties + } + await huks.generateKeyItem(keyAlias, options) + .then((data) => { + console.info(`promise: generate RSA Key success, data = ${JSON.stringify(data)}`); + }).catch((err: Error) => { + console.error(`promise: generate RSA Key failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) +} + +async function sign(keyAlias: string, plaintext: string) { + let signProperties = getRsaSignProperties(); + let options: huks.HuksOptions = { + properties: signProperties, + inData: stringToUint8Array(plaintext) + } + await huks.initSession(keyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((err: Error) => { + console.error(`promise: init sign failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: sign success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + signature = data.outData as Uint8Array; + }).catch((err: Error) => { + console.error(`promise: sign failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) +} + +async function verify(keyAlias: string, plaintext: string, signature: Uint8Array) { + let verifyProperties = getRsaVerifyProperties() + let options: huks.HuksOptions = { + properties: verifyProperties, + inData: stringToUint8Array(plaintext) + } + await huks.initSession(keyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((err: Error) => { + console.error(`promise: init verify failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) + await huks.updateSession(handle, options) + .then((data) => { + console.info(`promise: update verify success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + }).catch((err: Error) => { + console.error(`promise: update verify failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) + options.inData = signature; + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: verify success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + }).catch((err: Error) => { + console.error(`promise: verify failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) +} + +async function deleteRsaKey(keyAlias: string) { + let emptyOptions: huks.HuksOptions = { + properties: [] + } + await huks.deleteKeyItem(keyAlias, emptyOptions) + .then((data) => { + console.info(`promise: delete data success`); + }).catch((err: Error) => { + console.error(`promise: delete data failed`); + throw (err as Error); + }) +} + +export async function testSignVerify() { + await generateRsaKey(keyAlias); + await sign(keyAlias, plaintext); + await verify(keyAlias, plaintext, signature); + await deleteRsaKey(keyAlias); +} + + + +// [End key_algorithm_RSASHA256PKCS1_V1_5] +@Entry +@Component +struct Index { + @State message: string = 'RSA/SHA256/PKCS1_V1_5'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.rsa_sha256_pkcs1_v1_5')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await testSignVerify(); + this.message = 'RSA/SHA256/PKCS1_V1_5 Result: Success'; + } catch (error) { + this.message = 'RSA/SHA256/PKCS1_V1_5 Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/RSASHA256PSS.ets b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/RSASHA256PSS.ets new file mode 100644 index 0000000..eb1ae9e --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/RSASHA256PSS.ets @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// +// [Start key_algorithm_RSASHA256PSS] +/* + * 密钥算法为RSA,摘要算法为SHA256,填充模式为PSS + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +let keyAlias = 'test_rsaKeyAlias'; +let handle: number; +let plaintext = '123456'; +let signature: Uint8Array; + +function stringToUint8Array(str: string) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function uint8ArrayToString(fileData: Uint8Array) { + let dataString = ''; + for (let i = 0; i < fileData.length; i++) { + dataString += String.fromCharCode(fileData[i]); + } + return dataString; +} + +function getRsaGenerateProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN | + huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_PSS + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256 + }]; + return properties; +} + +function getRsaSignProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_PSS + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN + }]; + return properties; +} + +function getRsaVerifyProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_PSS + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY + }]; + return properties; +} + +async function generateRsaKey(keyAlias: string) { + let genProperties = getRsaGenerateProperties(); + let options: huks.HuksOptions = { + properties: genProperties + }; + await huks.generateKeyItem(keyAlias, options) + .then((data) => { + console.info(`promise: generate RSA Key success, data = ${JSON.stringify(data)}`); + }).catch((err: Error) => { + console.error(`promise: generate RSA Key failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }); +} + +async function sign(keyAlias: string, plaintext: string) { + let signProperties = getRsaSignProperties(); + let options: huks.HuksOptions = { + properties: signProperties, + inData: stringToUint8Array(plaintext) + } + await huks.initSession(keyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((err: Error) => { + console.error(`promise: init sign failed, error: ` + JSON.stringify(err)); + return; + }); + + if (handle !== undefined) { + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: sign success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + signature = data.outData as Uint8Array; + }).catch((err: Error) => { + console.error(`promise: sign failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }); + } +} + +async function verify(keyAlias: string, plaintext: string, signature: Uint8Array) { + let verifyProperties = getRsaVerifyProperties(); + let options: huks.HuksOptions = { + properties: verifyProperties, + inData: stringToUint8Array(plaintext) + } + await huks.initSession(keyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((err: Error) => { + console.error(`promise: init verify failed, error: ` + JSON.stringify(err)); + return; + }); + + if (handle !== undefined) { + await huks.updateSession(handle, options) + .then((data) => { + console.info(`promise: update verify success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + }).catch((err: Error) => { + console.error(`promise: update verify failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }); + + options.inData = signature; + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: verify success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + }).catch((err: Error) => { + console.error(`promise: verify failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }); + } +} + +async function deleteRsaKey(keyAlias: string) { + let emptyOptions: huks.HuksOptions = { + properties: [] + } + await huks.deleteKeyItem(keyAlias, emptyOptions) + .then((data) => { + console.info(`promise: delete data success`); + }).catch((err: Error) => { + console.error(`promise: delete data failed`); + throw (err as Error); + }); +} + +export async function testSignVerify() { + await generateRsaKey(keyAlias); + await sign(keyAlias, plaintext); + await verify(keyAlias, plaintext, signature); + await deleteRsaKey(keyAlias); +} + + +// [End key_algorithm_RSASHA256PSS] +@Entry +@Component +struct Index { + @State message: string = 'RSA/SHA256/PSS'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.rsa_sha256_pss')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + await testSignVerify(); + this.message = 'RSA/SHA256/PSS Result: Success'; + }catch { + this.message = 'RSA/SHA256/PSS Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/SM2SM3.ets b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/SM2SM3.ets new file mode 100644 index 0000000..aae9a24 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/ets/pages/SM2SM3.ets @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start key_algorithm_SM2SM3] +/* + * 密钥算法为SM2、摘要算法为SM3 + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +let keyAlias = 'test_sm2KeyAlias'; +let handle: number; +let plaintext = '123456'; +let signature: Uint8Array; + + +function stringToUint8Array(str: String) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + + +function uint8ArrayToString(fileData: Uint8Array) { + let dataString = ''; + for (let i = 0; i < fileData.length; i++) { + dataString += String.fromCharCode(fileData[i]); + } + return dataString; +} + + +function getSm2GenerateProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_SM2 + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN | + huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SM3 + }]; + return properties; +} + +function getSm2SignProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_SM2 + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SM3 + }]; + return properties; +} + +function getSm2VerifyProperties() { + let properties: huks.HuksParam[] = [{ + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_SM2 + }, { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 + }, { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY + }, { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SM3 + }]; + return properties; +} + +async function generateSm2Key(keyAlias: string) { + let genProperties = getSm2GenerateProperties(); + let options: huks.HuksOptions = { + properties: genProperties + } + await huks.generateKeyItem(keyAlias, options) + .then((data) => { + console.info(`promise: generate Sm2 Key success, data = ${JSON.stringify(data)}`); + }).catch((err: Error) => { + console.error(`promise: generate Sm2 Key failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) +} + +async function sign(keyAlias: string, plaintext: string) { + let signProperties = getSm2SignProperties(); + let options: huks.HuksOptions = { + properties: signProperties, + inData: stringToUint8Array(plaintext) + } + await huks.initSession(keyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((err: Error) => { + console.error(`promise: init sign failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: sign success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + signature = data.outData as Uint8Array; + }).catch((err: Error) => { + console.error(`promise: sign failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) +} + +async function verify(keyAlias: string, plaintext: string, signature: Uint8Array) { + let verifyProperties = getSm2VerifyProperties() + let options: huks.HuksOptions = { + properties: verifyProperties, + inData: stringToUint8Array(plaintext) + } + await huks.initSession(keyAlias, options) + .then((data) => { + handle = data.handle; + }).catch((err: Error) => { + console.error(`promise: init verify failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) + await huks.updateSession(handle, options) + .then((data) => { + console.info(`promise: update verify success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + }).catch((err: Error) => { + console.error(`promise: update verify failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) + options.inData = signature; + await huks.finishSession(handle, options) + .then((data) => { + console.info(`promise: verify success, data is ` + uint8ArrayToString(data.outData as Uint8Array)); + }).catch((err: Error) => { + console.error(`promise: verify failed, error: ` + JSON.stringify(err)); + throw (err as Error); + }) +} + +async function deleteSm2Key(keyAlias: string) { + let emptyOptions: huks.HuksOptions = { + properties: [] + } + await huks.deleteKeyItem(keyAlias, emptyOptions) + .then((data) => { + console.info(`promise: delete data success`); + }).catch((err: Error) => { + console.error(`promise: delete data failed`); + throw (err as Error); + }) +} + +export async function testSignVerify() { + await generateSm2Key(keyAlias); + await sign(keyAlias, plaintext); + await verify(keyAlias, plaintext, signature); + await deleteSm2Key(keyAlias); +} + + +// [End key_algorithm_SM2SM3] +@Entry +@Component +struct Index { + @State message: string = 'SM2/SM3'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.sm2_sm3')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + try { + let ret = await testSignVerify(); + this.message = 'SM2/SM3 Result: Success'; + } catch { + this.message = 'SM2/SM3 Result: Failed'; + } + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/module.json5 b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/module.json5 new file mode 100644 index 0000000..4144486 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/module.json5 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/element/color.json b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/element/string.json b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..d5c3989 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/element/string.json @@ -0,0 +1,68 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "SigningVerification" + }, + { + "name": "ecc256_sha256", + "value": "ECC256/SHA256" + }, + { + "name": "sm2_sm3", + "value": "SM2/SM3" + }, + { + "name": "rsa_sha256_pss", + "value": "RSA/SHA256/PSS" + }, + { + "name": "rsa_sha256_pkcs1_v1_5", + "value": "RSA/SHA256/PKCS1_V1_5" + }, + { + "name": "call_cpp_sign_verify", + "value": "Call C/C++" + }, + { + "name": "ecc256_sha256_result_success", + "value": "ECC256/SHA256 Result: Success" + }, + { + "name": "ecc256_sha256_result_failed", + "value": "ECC256/SHA256 Result: Failed" + }, + { + "name": "rsa_sha256_pkcs1_v1_5_result_success", + "value": "RSA/SHA256/PKCS1_V1_5 Result: Success" + }, + { + "name": "rsa_sha256_pkcs1_v1_5_result_failed", + "value": "RSA/SHA256/PKCS1_V1_5 Result: Failed" + }, + { + "name": "rsa_sha256_pss_result_success", + "value": "RSA/SHA256/PSS Result: Success" + }, + { + "name": "rsa_sha256_pss_result_failed", + "value": "RSA/SHA256/PSS Result: Failed" + }, + { + "name": "sm2_sm3_result_success", + "value": "SM2/SM3 Result: Success" + }, + { + "name": "sm2_sm3_result_failed", + "value": "SM2/SM3 Result: Failed" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/media/background.png b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/media/foreground.png b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f 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

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/profile/backup_config.json b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/profile/main_pages.json b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..65bc862 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,9 @@ +{ + "src": [ + "pages/Index", + "pages/ECC256SHA256", + "pages/RSASHA256PKCS1_V1_5", + "pages/RSASHA256PSS", + "pages/SM2SM3" + ] +} diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/dark/element/color.json b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/ets/test/Ability.test.ets b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..0f8ce9a --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/ets/test/List.test.ets b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..0c1f35d --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import abilityTest from './Ability.test'; +import signingVerificationTest from './SigningVerification.test'; + +export default function testsuite() { + abilityTest(); + signingVerificationTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/ets/test/SigningVerification.test.ets b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/ets/test/SigningVerification.test.ets new file mode 100644 index 0000000..d609d54 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/ets/test/SigningVerification.test.ets @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, beforeAll } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function signingVerificationTest() { + describe('signingVerificationTest', () => { + /** + * 打开应用 + */ + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + await driver.delayMs(1000); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * 点击按钮,签名/验签ECC256/SHA256 + */ + it('testSigningVerification001', 0, async () => { + console.info('uitest: testSigningVerification001 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('ECC256/SHA256')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('ECC256/SHA256').type('Button')); + await button2.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('ECC256/SHA256 Result: Success')); + console.info('uitest: testSigningVerification001 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,签名/验签SM2/SM3 + */ + it('testSigningVerification002', 0, async () => { + console.info('uitest: testSigningVerification002 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('SM2/SM3')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('SM2/SM3').type('Button')); + await button2.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('SM2/SM3 Result: Success')); + console.info('uitest: testSigningVerification002 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,签名/验签RSA/SHA256/PSS + */ + it('testSigningVerification003', 0, async () => { + console.info('uitest: testSigningVerification003 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('RSA/SHA256/PSS')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('RSA/SHA256/PSS').type('Button')); + await button2.click(); + await driver.delayMs(4000); + await driver.assertComponentExist(ON.text('RSA/SHA256/PSS Result: Success')); + console.info('uitest: testSigningVerification003 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,签名/验签RSA/SHA256/PKCS1_V1_5 + */ + it('testSigningVerification004', 0, async () => { + console.info('uitest: testSigningVerification004 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('RSA/SHA256/PKCS1_V1_5')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('RSA/SHA256/PKCS1_V1_5').type('Button')); + await button2.click(); + await driver.delayMs(4000); + await driver.assertComponentExist(ON.text('RSA/SHA256/PKCS1_V1_5 Result: Success')); + console.info('uitest: testSigningVerification004 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,签名/验签C/C++ + */ + it('testSigningVerification005', 0, async () => { + console.info('uitest: testSigningVerification005 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('Call C/C++')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('Call C/C++ Result: 0')); + console.info('uitest: testSigningVerification005 end'); + await driver.pressBack(); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/module.json5 b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..c3fd9dd --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/test/List.test.ets b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/test/List.test.ets new file mode 100644 index 0000000..f1186b1 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/test/LocalUnit.test.ets b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000..7fc57c7 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/hvigor/hvigor-config.json5 b/UniversalKeystoreKit/KeyUsage/SigningVerification/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..d584c19 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/hvigorfile.ts b/UniversalKeystoreKit/KeyUsage/SigningVerification/hvigorfile.ts new file mode 100644 index 0000000..2a5e543 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/oh-package.json5 b/UniversalKeystoreKit/KeyUsage/SigningVerification/oh-package.json5 new file mode 100644 index 0000000..e41bae0 --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/ohosTest.md b/UniversalKeystoreKit/KeyUsage/SigningVerification/ohosTest.md new file mode 100644 index 0000000..8bd7bde --- /dev/null +++ b/UniversalKeystoreKit/KeyUsage/SigningVerification/ohosTest.md @@ -0,0 +1,12 @@ +# 签名/验签测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| ---------------------------------------- | ------------ | ---- | ------------------ | -------- | -------- | +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 点击按钮,签名/验签ECC256/SHA256 | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,签名/验签SM2/SM3 | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,签名/验签RSA/SHA256/PSS | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,签名/验签RSA/SHA256/PKCS1_V1_5 | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,签名/验签C/C++ | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/ECC2561.png b/UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/ECC2561.png new file mode 100644 index 0000000000000000000000000000000000000000..252dbabaa0cb3c28cc324f48b0d882db1e031452 GIT binary patch literal 24319 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/ECC2562.png b/UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/ECC2562.png new file mode 100644 index 0000000000000000000000000000000000000000..400b4266c04b9dc66de5d8db110c2026ce4b0642 GIT binary patch literal 25853 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 tG^cl@D}s8HsDbu=^Cnd~|6CA0tl literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/RSA1.png b/UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/RSA1.png new file mode 100644 index 0000000000000000000000000000000000000000..787f3e9a5e28f212e6cc5d7e6a984a6b1c19eadb GIT binary patch literal 24628 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/RSA2.png b/UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/RSA2.png new file mode 100644 index 0000000000000000000000000000000000000000..ca98a807da703b0a1b707a953c12859b994c762a GIT binary patch literal 26184 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 NU;O`&kNjr(e*nWhivj=u literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/SM21.png b/UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/SM21.png new file mode 100644 index 0000000000000000000000000000000000000000..3f0c0d889707a562d93adc10e9c01c888363d54a GIT binary patch literal 22024 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 GXa50sqC$!Q literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/cpp1.png b/UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/cpp1.png new file mode 100644 index 0000000000000000000000000000000000000000..0740f3ea8c9ba409ac2e42fce0b811ffd4c95022 GIT binary patch literal 38622 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/cpp2.png b/UniversalKeystoreKit/KeyUsage/SigningVerification/screenshots/cpp2.png new file mode 100644 index 0000000000000000000000000000000000000000..be6dff82a487ad3f8c29cb546897442dba166921 GIT binary patch literal 38550 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�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 q9*YHQQH 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/README.md b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/README.md new file mode 100644 index 0000000..3cfe8f5 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/README.md @@ -0,0 +1,92 @@ +## 查询密钥是否存在(ArkTS) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-check-key-arkts.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### CheckKeyExists + +##### 介绍 + +1. 本示例主要介绍HUKS提供了接口供应用查询指定密钥是否存在。 + +##### 效果预览 + +| 主页 | 查询密钥 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| | | + +使用说明 + +1. 点击CheckKeyExists按钮调用接口hasKeyItem,查询密钥是否存在。 + +## 查询密钥是否存在(C/C++) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-check-key-ndk.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### Call C/C++ + +##### 介绍 + +1. 本示例主要介绍HUKS提供了接口供应用查询指定密钥是否存在。 + +##### 效果预览 + +| 主页 | 查询密钥 | +| -------------------------------------------------- | -------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call C/C++按钮调用接口OH_Huks_IsKeyItemExist,查询密钥是否存在。 + +## 工程目录 + +``` +entry/src/main/ +|---ets +|---|---entryability +|---|---|---EntryAbility.ets +|---|---pages +|---|---|---CheckKeyExists.ets +|---|---|---Index.ets // 首页 +|---cpp +|---resources // 静态资源 +|---ohosTest +|---|---ets +|---|---|---tests +|---|---|---|---HMAC.test.ets // 自动化测试用例 +``` + + +## 相关权限 + +无。 + +## 依赖 + +不涉及。 + +## 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.2 Release及以上。 + +3. DevEco Studio版本:DevEco Studio 5.0.2 Release及以上。 + +4. HarmonyOS SDK版本:HarmonyOS 5.0.2 Release及以上。 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo UniversalKeystoreKit/OtherOperations/CheckKeyExists > .git/info/sparse-checkout +git remote add origin https://gitee.com/harmonyos_samples/guide-snippets.git +git pull origin master +``` \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/build-profile.json5 b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/build-profile.json5 new file mode 100644 index 0000000..fb5a1ab --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/code-linter.json5 b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/code-linter.json5 new file mode 100644 index 0000000..2858646 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/code-linter.json5 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/.gitignore b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/build-profile.json5 b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/build-profile.json5 new file mode 100644 index 0000000..2d8b081 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": [ + "arm64-v8a", + "x86_64" + ] + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/hvigorfile.ts b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/hvigorfile.ts new file mode 100644 index 0000000..e4f43d5 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/oh-package.json5 b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/oh-package.json5 new file mode 100644 index 0000000..118bdd4 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/oh-package.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/CMakeLists.txt b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..1fa27ba --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(CheckKeyExists) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) +target_link_libraries(entry PUBLIC libace_napi.z.so libhuks_ndk.z.so) \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/napi_init.cpp b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000..6abbe28 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start query_whether_the_key_exists] +#include "huks/native_huks_api.h" +#include "huks/native_huks_param.h" +#include "napi/native_api.h" +#include +// [StartExclude query_whether_the_key_exists] +/* 以下以生成ECC密钥为例 */ +OH_Huks_Result InitParamSet(struct OH_Huks_ParamSet **paramSet, const struct OH_Huks_Param *params, + uint32_t paramCount) +{ + OH_Huks_Result ret = OH_Huks_InitParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_AddParams(*paramSet, params, paramCount); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + ret = OH_Huks_BuildParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + return ret; +} + +struct OH_Huks_Param g_testGenerateKeyParam[] = {{.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_ECC}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_AGREE}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_ECC_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_NONE}}; + +static OH_Huks_Result GenerateKeyHelper(const char *alias) +{ + struct OH_Huks_Blob aliasBlob = {.size = (uint32_t)strlen(alias), .data = (uint8_t *)alias}; + struct OH_Huks_ParamSet *testGenerateKeyParamSet = nullptr; + struct OH_Huks_Result ohResult; + do { + /* 1.初始化密钥属性集 */ + ohResult = InitParamSet(&testGenerateKeyParamSet, g_testGenerateKeyParam, + sizeof(g_testGenerateKeyParam) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 2.生成密钥 */ + ohResult = OH_Huks_GenerateKeyItem(&aliasBlob, testGenerateKeyParamSet, nullptr); + } while (0); + OH_Huks_FreeParamSet(&testGenerateKeyParamSet); + return ohResult; +} +// [EndExclude query_whether_the_key_exists] +static napi_value IsKeyExist(napi_env env, napi_callback_info info) +{ + /* 1.获取密钥别名 */ + const char *alias = "test_key"; + struct OH_Huks_Blob keyAlias = { + (uint32_t)strlen(alias), + (uint8_t *)alias + }; + + /* 生成密钥 */ + OH_Huks_Result genResult = GenerateKeyHelper(alias); + if (genResult.errorCode != OH_HUKS_SUCCESS) { + napi_value ret; + napi_create_int32(env, genResult.errorCode, &ret); + return ret; + } + + /* 2.调用OH_Huks_IsKeyItemExist判断密钥是否存在 */ + struct OH_Huks_Result ohResult = OH_Huks_IsKeyItemExist(&keyAlias, nullptr); + // OH_HUKS_SUCCESS表示存在, OH_HUKS_ERR_CODE_ITEM_NOT_EXIST表示不存在 + + napi_value ret; + napi_create_int32(env, ohResult.errorCode, &ret); + return ret; +} +// [End query_whether_the_key_exists] +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + { "isKeyExist", nullptr, IsKeyExist, nullptr, nullptr, nullptr, napi_default, nullptr } + }; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void*)0), + .reserved = { 0 }, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) +{ + napi_module_register(&demoModule); +} diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/types/libentry/index.d.ts b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 0000000..d13f949 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const isKeyExist: () => number; \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/types/libentry/oh-package.json5 b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000..2826cc7 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libentry.so", + "types": "./index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/entryability/EntryAbility.ets b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..edc2839 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..b1e2129 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/pages/CheckKeyExists.ets b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/pages/CheckKeyExists.ets new file mode 100644 index 0000000..9080f92 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/pages/CheckKeyExists.ets @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +// [Start querying_the_existence_of_a_key] +import { huks } from '@kit.UniversalKeystoreKit'; + +/* 1.确定密钥别名 */ +let keyAlias = 'test_key'; +let isKeyExist: Boolean; +/* 2.构造空对象 */ +let huksOptions: huks.HuksOptions = { + properties: [] +} +// [StartExclude querying_the_existence_of_a_key] +/* 3.初始化密钥属性集 */ +let generateProperties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_DH + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_AGREE + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_DH_KEY_SIZE_2048 + } +]; + +let generateHuksOptions: huks.HuksOptions = { + properties: generateProperties, + inData: new Uint8Array([]) +} + +/* 3.生成密钥 */ +function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions) { + return new Promise((resolve, reject) => { + try { + huks.generateKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throw (error as Error); + } + }); +} + +async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions): Promise { + console.info(`enter promise generateKeyItem`); + try { + await generateKeyItem(keyAlias, huksOptions) + .then((data) => { + console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`); + }); + return 'Success'; + } catch (error) { + console.error(`promise: generateKeyItem input arg invalid, ` + JSON.stringify(error)); + return 'Failed'; + } +} + +async function testGenKey(): Promise { + let ret = await publicGenKeyFunc(keyAlias, generateHuksOptions); + return ret; +} + +function check(): string { +// [EndExclude querying_the_existence_of_a_key] + try { + /* 1.生成密钥 */ + testGenKey(); + /* 2.判断密钥是否存在 */ + huks.hasKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + console.error(`callback: hasKeyItem failed, ` + JSON.stringify(error)); + } else { + if (data !== null && data.valueOf() !== null) { + isKeyExist = data.valueOf(); + console.info(`callback: hasKeyItem success, isKeyExist = ${isKeyExist}`); + } + } + }); + return 'Success'; + } catch (error) { + console.error(`callback: hasKeyItem input arg invalid, ` + JSON.stringify(error)); + return 'Failed'; + } +// [End querying_the_existence_of_a_key] +} + +@Entry +@Component +struct Index { + @State message: string = 'CheckKeyExists'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.call_check_key_exists')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: string = check(); + this.message = 'CheckKeyExists Result: ' + ret; + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/pages/Index.ets b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..8a28863 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; +import testNapi from 'libentry.so'; + +@Entry +@Component +struct Index { + @State message: string = 'CheckKeyExists'; + + goToSample(url: string): void { + router.pushUrl({ + url: url, + }, router.RouterMode.Single, (err) => { + if (err) { + console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('pushUrl success'); + }) + } + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.check_key_exists')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/CheckKeyExists') + }) + Button($r('app.string.call_cpp_is_key_exist')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: number = testNapi.isKeyExist(); + this.message = 'Call C/C++ Result: ' + ret.toString(); + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/module.json5 b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/module.json5 new file mode 100644 index 0000000..4144486 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/module.json5 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/element/color.json b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/element/string.json b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..dbe2a4f --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/element/string.json @@ -0,0 +1,28 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "CheckKeyExists" + }, + { + "name": "check_key_exists", + "value": "CheckKeyExists" + }, + { + "name": "call_cpp_is_key_exist", + "value": "Call C/C++" + }, + { + "name": "call_check_key_exists", + "value": "Call CheckKeyExists" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/media/background.png b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/media/foreground.png b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f 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

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/profile/backup_config.json b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/profile/main_pages.json b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..fbba609 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,6 @@ +{ + "src": [ + "pages/Index", + "pages/CheckKeyExists" + ] +} diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/dark/element/color.json b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/ets/test/Ability.test.ets b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..0f8ce9a --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/ets/test/CheckKeyExists.test.ets b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/ets/test/CheckKeyExists.test.ets new file mode 100644 index 0000000..a41b084 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/ets/test/CheckKeyExists.test.ets @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, beforeAll } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function checkKeyExistsTest() { + describe('checkKeyExistsTest', () => { + /** + * 打开应用 + */ + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + await driver.delayMs(1000); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * 点击按钮,查询密钥是否存在(ArkTS) + */ + it('testCheckKeyExists001', 0, async () => { + console.info('uitest: testCheckKeyExists001 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('CheckKeyExists').type('Button')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call CheckKeyExists')); + await button2.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('CheckKeyExists Result: Success')); + console.info('uitest: testCheckKeyExists001 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,查询密钥是否存在(C/C++) + */ + it('testCheckKeyExists002', 0, async () => { + console.info('uitest: testCheckKeyExists002 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('Call C/C++')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('Call C/C++ Result: 0')); + console.info('uitest: testCheckKeyExists002 end'); + await driver.pressBack(); + }) + }) +} diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/ets/test/List.test.ets b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..7efd059 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import checkKeyExistsTest from './CheckKeyExists.test'; + +export default function testsuite() { + checkKeyExistsTest(); +} diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/module.json5 b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..c3fd9dd --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/test/List.test.ets b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/test/List.test.ets new file mode 100644 index 0000000..f1186b1 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/test/LocalUnit.test.ets b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000..7fc57c7 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/hvigor/hvigor-config.json5 b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..d584c19 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/hvigorfile.ts b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/hvigorfile.ts new file mode 100644 index 0000000..2a5e543 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/oh-package.json5 b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/oh-package.json5 new file mode 100644 index 0000000..e41bae0 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/ohosTest.md b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/ohosTest.md new file mode 100644 index 0000000..e672dd2 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/ohosTest.md @@ -0,0 +1,9 @@ +## 查询密钥是否存在测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| --------------------------------- | ------------ | ---- | ------------------ | -------- | -------- | +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 点击按钮,查询密钥是否存在(ArkTS) | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,查询密钥是否存在(C/C++) | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/screenshots/CheckKeyExists_1.png b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/screenshots/CheckKeyExists_1.png new file mode 100644 index 0000000000000000000000000000000000000000..34e8c2d7ac640bcf34e1ec983f2984517a0f4b77 GIT binary patch literal 24158 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 NEAhpts|*-F`fuVN1IPdX literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/OtherOperations/CheckKeyExists/screenshots/CheckKeyExists_2.png b/UniversalKeystoreKit/OtherOperations/CheckKeyExists/screenshots/CheckKeyExists_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f7cc0f331f6a0724fa0760d0ab53f8d04fed8c4b GIT binary patch literal 25595 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

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/profile/backup_config.json b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/profile/main_pages.json b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..da0faf7 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,6 @@ +{ + "src": [ + "pages/Index", + "pages/GetKeyAttributes" + ] +} diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/dark/element/color.json b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/ets/test/Ability.test.ets b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..0f8ce9a --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/ets/test/GetKeyAttributes.test.ets b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/ets/test/GetKeyAttributes.test.ets new file mode 100644 index 0000000..0b3b396 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/ets/test/GetKeyAttributes.test.ets @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, beforeAll } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function getKeyAttributesTest() { + describe('getKeyAttributesTest', () => { + /** + * 打开应用 + */ + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + await driver.delayMs(1000); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * 点击按钮,获取密钥属性(ArkTS) + */ + it('testGetKeyAttributes001', 0, async () => { + console.info('uitest: testGetKeyAttributes001 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('GetKeyAttributes').type('Button')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call GetKeyAttributes')); + await button2.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('GetKeyAttributes Result: Success')); + console.info('uitest: testGetKeyAttributes001 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,获取密钥属性(C/C++) + */ + it('testGetKeyAttributes002', 0, async () => { + console.info('uitest: testGetKeyAttributes002 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('Call C/C++')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('Call C/C++ Result: 0')); + console.info('uitest: testGetKeyAttributes002 end'); + await driver.pressBack(); + }) + }) +} diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/ets/test/List.test.ets b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..f2afe99 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import getKeyAttributesTest from './GetKeyAttributes.test'; + +export default function testsuite() { + getKeyAttributesTest(); +} diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/module.json5 b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..c3fd9dd --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/test/List.test.ets b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/test/List.test.ets new file mode 100644 index 0000000..f1186b1 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/test/LocalUnit.test.ets b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000..7fc57c7 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/hvigor/hvigor-config.json5 b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..d584c19 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/hvigorfile.ts b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/hvigorfile.ts new file mode 100644 index 0000000..2a5e543 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/oh-package.json5 b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/oh-package.json5 new file mode 100644 index 0000000..e41bae0 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/ohosTest.md b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/ohosTest.md new file mode 100644 index 0000000..9ff789a --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/ohosTest.md @@ -0,0 +1,9 @@ +# 获取密钥属性测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| ----------------------------- | ------------ | ---- | ------------------ | -------- | -------- | +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 获取密钥属性(ArkTS) | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | +| 点击按钮,获取密钥属性(C/C++) | 成功拉起应用 | | 成功执行,输出日志 | 是 | Pass | \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/screenshots/Cpp_1.png b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/screenshots/Cpp_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5f33ade88f931531a26f89b188588912d642cd19 GIT binary patch literal 26285 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

w!OYC5HPMV>Y@axg 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/.gitignore b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/.gitignore new file mode 100644 index 0000000..d2ff201 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/.gitignore @@ -0,0 +1,12 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +/.appanalyzer \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/AppScope/app.json5 b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/AppScope/app.json5 new file mode 100644 index 0000000..6827bed --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/AppScope/app.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "bundleName": "com.samples.getkeyattributes", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/AppScope/resources/base/element/string.json b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/AppScope/resources/base/element/string.json new file mode 100644 index 0000000..c5f9a78 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "GetKeyAttributes" + } + ] +} diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/AppScope/resources/base/media/app_icon.png b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a39445dc87828b76fed6d2ec470dd455c45319e3 GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/README.md b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/README.md new file mode 100644 index 0000000..9c42944 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/README.md @@ -0,0 +1,92 @@ +## 获取密钥属性(ArkTS) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-obtain-key-properties-arkts.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### GetKeyAttributes + +##### 介绍 + +1. 本示例主要介绍获取密钥属性,HUKS提供了接口供业务获取指定密钥的相关属性。在获取指定密钥属性前,需要确保已在HUKS中生成或导入持久化存储的密钥。 + +##### 效果预览 + +| 主页 | 获取密钥属性 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| | | + +使用说明 + +1. 点击Call GetKeyAttributes按钮调用接口getKeyItemProperties,获取的属性集。 + +## 获取密钥属性(C/C++) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-obtain-key-properties-ndk.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### Call C/C++ + +##### 介绍 + +1. 本示例主要介绍获取密钥属性,HUKS提供了接口供业务获取指定密钥的相关属性。在获取指定密钥属性前,需要确保已在HUKS中生成或导入持久化存储的密钥。 + +##### 效果预览 + +| 主页 | 获取密钥属性 | +| -------------------------------------------------- | -------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call C/C++按钮调用接口OH_Huks_GetKeyItemParamSet,从参数集中读取需要的参数。 + +## 工程目录 + +``` +entry/src/main/ +|---ets +|---|---entryability +|---|---|---EntryAbility.ets +|---|---pages +|---|---|---GetKeyAttributes.ets +|---|---|---Index.ets // 首页 +|---cpp +|---resources // 静态资源 +|---ohosTest +|---|---ets +|---|---|---tests +|---|---|---|---HMAC.test.ets // 自动化测试用例 +``` + + +## 相关权限 + +无。 + +## 依赖 + +不涉及。 + +## 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.2 Release及以上。 + +3. DevEco Studio版本:DevEco Studio 5.0.2 Release及以上。 + +4. HarmonyOS SDK版本:HarmonyOS 5.0.2 Release及以上。 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo UniversalKeystoreKit/OtherOperations/GetKeyAttributes > .git/info/sparse-checkout +git remote add origin https://gitee.com/harmonyos_samples/guide-snippets.git +git pull origin master +``` \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/build-profile.json5 b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/build-profile.json5 new file mode 100644 index 0000000..fb5a1ab --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/code-linter.json5 b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/code-linter.json5 new file mode 100644 index 0000000..2858646 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/code-linter.json5 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/.gitignore b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/build-profile.json5 b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/build-profile.json5 new file mode 100644 index 0000000..2d8b081 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": [ + "arm64-v8a", + "x86_64" + ] + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/hvigorfile.ts b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/hvigorfile.ts new file mode 100644 index 0000000..e4f43d5 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/oh-package.json5 b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/oh-package.json5 new file mode 100644 index 0000000..118bdd4 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/oh-package.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/CMakeLists.txt b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..a411957 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(GetKeyAttributes) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) +target_link_libraries(entry PUBLIC libace_napi.z.so libhuks_ndk.z.so) \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/napi_init.cpp b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000..c69148a --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start obtain_the_key_attributes] +#include "huks/native_huks_api.h" +#include "huks/native_huks_param.h" +#include "napi/native_api.h" +#include +// [StartExclude obtain_the_key_attributes] +OH_Huks_Result InitParamSet(struct OH_Huks_ParamSet **paramSet, const struct OH_Huks_Param *params, + uint32_t paramCount) +{ + OH_Huks_Result ret = OH_Huks_InitParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_AddParams(*paramSet, params, paramCount); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + ret = OH_Huks_BuildParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + return ret; +} + +struct OH_Huks_Param g_testGenerateKeyParam[] = {{.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_ECC}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_AGREE}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_ECC_KEY_SIZE_256}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_NONE}}; + +static OH_Huks_Result GenerateKeyHelper(const char *alias) +{ + struct OH_Huks_Blob aliasBlob = {.size = (uint32_t)strlen(alias), .data = (uint8_t *)alias}; + struct OH_Huks_ParamSet *testGenerateKeyParamSet = nullptr; + struct OH_Huks_Result ohResult; + do { + /* 1.初始化密钥属性集 */ + ohResult = InitParamSet(&testGenerateKeyParamSet, g_testGenerateKeyParam, + sizeof(g_testGenerateKeyParam) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 1.生成密钥 */ + ohResult = OH_Huks_GenerateKeyItem(&aliasBlob, testGenerateKeyParamSet, nullptr); + } while (0); + OH_Huks_FreeParamSet(&testGenerateKeyParamSet); + return ohResult; +} +// [EndExclude obtain_the_key_attributes] +static napi_value GetKeyParamSet(napi_env env, napi_callback_info info) +{ + /* 1. 参数构造:确定密钥别名 */ + const char *alias = "test_key"; + struct OH_Huks_Blob aliasBlob = { .size = (uint32_t)strlen(alias), .data = (uint8_t *)alias }; + // [StartExclude obtain_the_key_attributes] + /* 生成密钥 */ + OH_Huks_Result genResult = GenerateKeyHelper(alias); + if (genResult.errorCode != OH_HUKS_SUCCESS) { + napi_value ret; + napi_create_int32(env, genResult.errorCode, &ret); + return ret; + } + // [EndExclude obtain_the_key_attributes] + const size_t paramSetSize = 512; + /* 构造参数:为参数集申请内存 + * 请业务按实际情况评估大小进行申请 + */ + struct OH_Huks_ParamSet *outParamSet = static_cast(malloc(paramSetSize)); + if (outParamSet == nullptr) { + return nullptr; + } + outParamSet->paramSetSize = paramSetSize; + struct OH_Huks_Result ohResult; + do { + /* 2. 获取密钥属性集 */ + ohResult = OH_Huks_GetKeyItemParamSet(&aliasBlob, nullptr, outParamSet); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + /* 3. 从参数集中读取参数,以OH_HUKS_TAG_PURPOSE为例 */ + OH_Huks_Param *purposeParam = nullptr; // 无需申请内存,获取后指针指向该参数在参数集中所处内存地址 + ohResult = OH_Huks_GetParam(outParamSet, OH_HUKS_TAG_PURPOSE, &purposeParam); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + } while (0); + OH_Huks_FreeParamSet(&outParamSet); + napi_value ret; + napi_create_int32(env, ohResult.errorCode, &ret); + return ret; +} +// [End obtain_the_key_attributes] +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + { "getKeyParamSet", nullptr, GetKeyParamSet, nullptr, nullptr, nullptr, napi_default, nullptr } + }; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void*)0), + .reserved = { 0 }, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) +{ + napi_module_register(&demoModule); +} diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/types/libentry/index.d.ts b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 0000000..daea8fc --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const getKeyParamSet: () => number; \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/types/libentry/oh-package.json5 b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000..2826cc7 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libentry.so", + "types": "./index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/entryability/EntryAbility.ets b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..edc2839 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..b1e2129 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/pages/GetKeyAttributes.ets b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/pages/GetKeyAttributes.ets new file mode 100644 index 0000000..c772140 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/pages/GetKeyAttributes.ets @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// [Start obtaining_key_attribute] +import { huks } from '@kit.UniversalKeystoreKit'; + +/* 1. 设置密钥别名 */ +let keyAlias = 'keyAlias'; +/* option对象传空 */ +let emptyOptions: huks.HuksOptions = { + properties: [] +}; +// [StartExclude obtaining_key_attribute] +let properties1: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_DH + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_AGREE + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_DH_KEY_SIZE_2048 + } +]; + +let huksOptions: huks.HuksOptions = { + properties: properties1, + inData: new Uint8Array([]) +} + +/* 3.生成密钥 */ +function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions) { + return new Promise((resolve, reject) => { + try { + huks.generateKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throw (error as Error); + } + }); +} + +async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions): Promise { + console.info(`enter promise generateKeyItem`); + try { + await generateKeyItem(keyAlias, huksOptions) + .then((data) => { + console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`); + }); + return 'Success'; + } catch (error) { + console.error(`promise: generateKeyItem input arg invalid, ${JSON.stringify(error)}`); + return 'Failed'; + } +} + +async function testGenKey(): Promise { + let ret = await publicGenKeyFunc(keyAlias, huksOptions); + return ret; +} + +function check(): string { +// [EndExclude obtaining_key_attribute] + try { + /* 1. 生成密钥 */ + testGenKey(); + /* 2. 获取密钥属性 */ + huks.getKeyItemProperties(keyAlias, emptyOptions, (error, data) => { + if (error) { + console.error(`callback: getKeyItemProperties failed, ${JSON.stringify(error)}`); + } else { + console.info(`callback: getKeyItemProperties success, data = ${JSON.stringify(data)}`); + } + }); + return 'Success'; + } catch (error) { + console.error(`callback: getKeyItemProperties input arg invalid, ${JSON.stringify(error)}`); + return 'Failed'; + } +// [End obtaining_key_attribute] +} + +@Entry +@Component +struct Index { + @State message: string = 'GetKeyAttributes'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.call_get_key_attributes')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: string = check(); + this.message = 'GetKeyAttributes Result: ' + ret; + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/pages/Index.ets b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..9fac279 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; +import testNapi from 'libentry.so'; + +@Entry +@Component +struct Index { + @State message: string = 'GetKeyAttributes'; + + goToSample(url: string): void { + router.pushUrl({ + url: url, + }, router.RouterMode.Single, (err) => { + if (err) { + console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('pushUrl success'); + }) + } + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.get_key_attributes')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/GetKeyAttributes') + }) + Button($r('app.string.call_cpp_get_key_param_set')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: number = testNapi.getKeyParamSet(); + this.message = 'Call C/C++ Result: ' + ret.toString(); + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/module.json5 b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/module.json5 new file mode 100644 index 0000000..4144486 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/module.json5 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/element/color.json b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/element/string.json b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..f9637af --- /dev/null +++ b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/element/string.json @@ -0,0 +1,28 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "GetKeyAttributes" + }, + { + "name": "get_key_attributes", + "value": "GetKeyAttributes" + }, + { + "name": "call_cpp_get_key_param_set", + "value": "Call C/C++" + }, + { + "name": "call_get_key_attributes", + "value": "Call GetKeyAttributes" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/media/background.png b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/media/foreground.png b/UniversalKeystoreKit/OtherOperations/GetKeyAttributes/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f z3`9H(<`G*WCN>bN493AFOi{!!!L|afI7%o`6&6lXK&2`L1YumJiZTQ+5doQ^Fu|gz zI6Nvw1cME>!8`;4iI*N+z3;u_gZtzG5&vyF~^*1 z?S1yyXYbweAFzGO*PdLxe&gE9j&{c{J=rY}9i1#6cCzdq+ASx~UzXhiC(H6orN{Ar zj;qq$yDTU7NWP@ws1J2_*G}Ykx7%{iE$G@-7-eF^Y3#}`(v#ySiIZdTj}`y+a>=Im9Vq=f1W5yxR*!@kj+Rxz&v=+4_?qb>2v z^P8^zTt$BB=j8B|JpIS7`QY>Jz4z#w<>ZT>lB09T6nS2-t-LNa`Yg!ixr}^gvZsB` z{B;rQ@uVEqwOt7oA8%Sn=e2VBs;^`dNc~|xx$^LKH+*6BuO8<1`K9&UDuw8t_%!FY zoV0NZ!^eH~qhBH?uakr4K4~ZC5VHnAA|L9#J5r^|-)7;Y zUl$mM>pDMqeipwr+7#N+YO&F-3t!twD#tH9_S*S{wQ+C`@f*(uNuw}s=xXMh&DI;Q z;_u$0c(3`5*FEq(O?pz@6#ee_pZMDAFS)(D{hdnlGw+UhHaZ&vMC3y~_HorR=oT!) zD&Jv0*w5!@vBS?MX~$>r(d*!xjZ=9%U3__Gl0?W|%cDAF&TIVSk@)+3cqc!3boGhhYzil=`)k_5%wL2pqQz`Ju@50G)sNfVj zoXGZ|Q(f3+@xx0`O2~K<`L6lJ-SXStp$#*Nk@$Du%RKJ9@n>4_fX zCq4RXG{SB86?4nquk-Hy-E#B;AN86?zpBs|J16`d(I5ZXNB^!~KL7eV0uKN-_1L$Q zfhXMkzP+y=*8|%=cJL*vJ8JS$i*h!V@e z?gp)OZL3q^qPRQ$mTS*l z!1Lo9sgwA)pzOQd7ry0nSAP)8dF^z>J#;@|{wb*sK5UU+HV4!!`0VEJLKou6^E1;q z{-F(t{g8gMTs+F%4CL8B(dE++Be1u} zQa1d_@^?2B{4?(K#G2gBZ2YKxYj^wS1vv8wb2h-K`rtLS+C4j5oS5zZQT6pjk(( zJ4B5)x)C<~DS-Jn#3lX27u>p0yp_M+jn)mGYaUy>+T%Nnb1#0!>tbyAQ%)nklRSgJ z&7=Ic?ks-hoA@5fJ^x~JiY`PYkDmW0C(plGd!Q$Ex;t|N@d~qieC9rdJUa(Jbmg%% zxJoLcUW^RY7oUugb$iXkOVyLI8AJG+ zNchYly!4G7Y^6~5nrXo&e$8p}lUVB0m<1UOEOBY-ht5+)-??6hPx|GZjRV(b``>-$ zM|{PjUt-09)0*964ZWy4qG3A!iZuCL5J4vSq$?ol?wO2=1e&!;9t z{HK#&d2T{`aKZSSV$8nw`5IF+b?d?_&_RB2Nn@S=KEJHRZ&{wfFD-HANt+d!8=g@V${FeVy<@Q=p|RCl}k1iW;RIY+rXYw+ro1J ztScYrS3bq4R+FlcH(!!*-yB2t`NcV#59x0CP?FiqC-VdG1vMIuAg3o=Td=#P|3Z0B%|-@17rLGk-6p<6~!$6~POh1kU3(XXZO`=|>$d z!lw$=5_RyEi#Jr~RP#^%iC^4A^2m;K+VClBHe2;z6Z14*Mk&|$%X0f<_lmdugY8>E zPThfcKaZ0b)2b2Pn1`Dkmvb_pUZ*zC08jjo)ep|hccB`;;R{6kL;Ts-DL%Zk@M}Ec zYe??S-~5VIlRb~$9A!25WQb$>P5#6re$4=RZ7!m^$ICJHQwLq8^3qO zSIW*0ziJfhY2#Np#+5qaD29V6USiSHHu0r%dVQte1>d!Te30L9h<8T(gM1~;2HMmK zAIaG=K2h~u$+A`Ao#yL~^C@rnmi3*Dn>*0%_Q|VFij#Is9D-CUfq|-t52LPSO>Mf;|h8QzG9r>i*kxj)D&%wf12-@hxpQE(boL;`OLW% z&4ra*97R9KXL{m{MVR>LH~jeO-Z?hkb&`yq#K-O6lT$@0DD?-g)^Uzc7T&5n8gw__ z0DpXP`45D@vQE5>CYLA9MXJba02$ioVhjTWVS5bZ6(4zN`ENe`p5>!H^k})NKh(Lb zKhik@lUA-Xx~smjY)TJqEB4J>%kshNC(AGX&hhfC|NQ3id+))>f~iYr%eBS5L6diS z0c(T7VNUk2yzB*+mM{H`dzO#=6GzJf`m=$1G@nblG}%hD(09V$W~@UCQLSS;5BqEV zWae*vfSYo>EH@?Gc;aOFp#GTWmw)f}@_j#ZYkBJ*Le`;RxE%9>G%3oHFxKHSfF_;E zFF&fw_1jO}dg1SWTfI@g(_fZ9_1ee&mj2x4J1a|pX>wLqgaW;Whu>GnNZR9Y^4s;%W zx4i1NzvUU8TZ6Uq$a?oX>%J5^9jAU9em|0;-_C;e(1}uEYG}e zr$t+qTP`-spu!U-M~AgevS79|o^g>`wAc>y@e7Vk`?z91a^qxq>GOBXzxbc8ET8gX z-7Xxv6CigTGJZUUv*`9=vmA1gzg4h49N+Y^ODZ8#@KI9`q-_X zaPu5;fuSS!*@le$mhP;#HK&jK(B1NbUvXvmPhY0_kiYDk{5AHRoIkT@vw@Z8z;F1q z7l7fCCi(MA@@nf@5q}|i{jv8-IsM&M6%o3LI{BfEQREKp4HG$@wUJ1eYx}Q!%BAIh z`K$LWk8838tEq&7|H$p$UeKq__MwZg*U!9Rnw3=(J#1>imzU))z3%$*uKvrZuZ{Wd>ES!5dgNmrfBPTZ zSl;rks&UNFhD?$g9J)KT33%MPXFTyAfBeSP=e+&fch`Iedi2_(FPHhgB&G`tFhZFY^iGZTPO8%A6S;JedWE&6Z7VgKJMLTtbV@Au;oe}a$|fo@8QFpeTE;~ z=(!{4cwATZ_x+vv)3p?oK6COMai}`b-FNw9`G;R}pRW2^Ajgt*_)SjojgA<};ZV-D zH)q&q4iEL*eWU|BFmM=S?>NY;&)5I;`<6?(5sl{jyXGx}^8>dxQX%Vtv5PEo8w6JK zToHH6efQkYp6Q3Mqvhz+s$i(tXF7XpLn?CV%Z6Oqu_p_+nw!5{zT;K*3%heMNzF;f zzun5oTzGVll(CU?9of+U+nP1y(OpU zvv~w9Sr;nLG5?3p<|70ueyyDbUY}Yd!E0=`V+1F2S@%7DUU z!+3G5v_Yp@FhhD(9o{OXys6YM@?dLP0LotS!( zZ~o{ThY!62s*m!Sg&e-XdU0#<$S=0*Pb|w{eYqaXoLkS+K6Rp~Y^EN+{G*Qi6P;tq z8XuKI#YV0>%Nz^2?6yhv9fh2b=evx?JV#`6&=bQOMZM+dz(~P{OOO4g=JV%2_LA3t zIWdLGe~6_L*6U?ZoidN$t=;E~mp$XEY0L*5)a)#9%C_**_ejXj1}SaGL~lF&7ro-L z5_Il{V)fCw*fu?YZqYMj%cgB7z3S~eAahn{_@cQMlFic3)%3UY#Noj!JH4cEvRr#S z^9EDCiHH1&FTSjo9Q4r{^K&2ha-QnFK^=vKuFYqvdxW=7K2uz)M)&XO4}*2S)oU;32*?s`tzhPoNdy zMK~{~T*=4;PVlC()T`0MfB8pTs;kbv+GgKHr(Rq!;3+S|5(B&y+n5*@z^5dLrcGjDVs3` zF=w9B8T=Q$;LA>~9`X4+qVFJ-liI=f8qb5;adlP9$i*t%;M>z~dBL;M7jh(|v1O@a za}jzx7Y{1+b#a=fVe#WfJ$C)~F&^GD!hg8&3xD97hwY{wLOxnA2;wJqo|?br07>n| zdc9}P-SQkmio~mhtX%z&MJycY7!O^|^}~~L*w+vLY!DscBm0>6jPaAr#6u#lPtl}a zn^g8A4RF_SY<9BpclX?P?PZtsH(oFGD^X@u>A2cxb^Xba#{f#>E7Bp? ztFxkR`P@dmpq)Vyx9`@uFnA8e#&tpr-DGb_G^IYIlqLQGW*i-bW1&6e29O6Y4AR#5 zvw3QcRQo|aIrZklmvExE$M4X$oUyA07_9mhM=sXuWE_~5;nT=?xmN7c}VZTZ(}?rL~jVuDCHDd zW0I>4RkJL)P{rpZ{mdS{51lA{3Pf+T`jPlbs|k>vbZN6ZbRkPI+fmPp0DeI6t7Nc~ z$NhZ%nT)>k;6(Zz50&~yf1iG^fs4sKviK#}-Dl{r>Bu~hY2DR;F}T*pmL9|4wUTbw z@xnlPQdFhr&E%R&<~6QfTI+#VgCJrYF+`(acGqTfD_@rASLH)IiT<#`a<+xCqjpL` z>#D>_%Q%UnL=``~nBcrnhfBLfp$0UGM~}`pY-%%xL2Su?1!0>O+=jhV^Q|SHHsi~S zD~0ov1zlYjfNIlt^GFNNb-;qpg1EPAM(ME^ps)?4i@M~QXic5q&!wGA8~zyJ#}kr& z^`4JJ%2R4dCKVL9!V%6$c5)Gv^*q_xt7|K06))bGDUPP7^FtSfX;?h<0|XKb062A zIY|b0!pj0C)Y$7;i^P=d-~9Mh&zQKh^`h&1%>hsw!5hUsnpx4t z<}nU3;cAnu{B7X&Vn5^sgN95?k&<*Nw-dMSz$p_Pc^$xvIFk*X^*T}DEO_*uml7(B z&nEcAJ#m?Xu}#P#5u(vuOElFSM`G;J(?_?d0s0skGYz4+p=0BMwY@=f?C04B`6n16 z7Y+?9wH$J zAxS-==YiY@80*`{n1+s)KEk056AV77g?$%2H0xq(Q))9XS&VWbRL_G=l_J9>UJl0D zL}N3`NDj2QCw^L+J)AKpGPZ04N*&EdoH2o<_uVvg5ExqK?h8cD!pAn(v{$fP*#~QU zh>wrmGmlPAjvv4qPUcCCWLhX|Ka2&~1>W*WY1;yK(tBoXnGCEf#s(&kaR8=O7&`Rb z4)NokexjR!kF~8MOFmU5aQ$lW3aOlWOo#8pn)8ot^lQLVQZO5XoZ}x``u%x;$Cmjs zwt{}jE1RV@QuzczTVvNF(%{QMY#aX3$pievr_W(l1ZA{3C6z9Llh!WOKW`#3*AYhq z-tucRhL5MYjUq^yq;P4yz(j=;Uhu<*6tg}0;12PFp$~4~hxPm_+Zg8Ct>f7*BneZNsSb8?%&Jh@KlZTTrOg zc*d4a&)A=--&QSt^&=aCKtMfi2RM(tjY0_3lN)$zC%(pMOo(G{xaW#VQD)ml*8}*( zn%f398D{+~2NGYgRbLr0gOY-ta%{uQ8}bVGoMs=E!xb*`2zR1d+}H1qgGY~B`-@YJ z>*a;j$od&444i_t&M>U#WibY2>CmtI+6%Qc>JFq&fKMxFac!J|LFhSyp@oAfvh|$Q!ky#K zhS(4BtuuI=bE{5uez>A2b4!3M+hm`g$1$&w|CB6iS~rUj(~}eO8bJK3dJ?_67ebx{ zSHS|R%y8%`=YQMnAR>?_}JgGOix59Mum~lwBBOj7l{Dr%(^B9~CeuB#Ukb0`^qvuU*Y(62BICR)&Tg!A&&-M+!2eTcS zQp|kcb?_I5@TRuW`$zm0SeN?*o>tHfJx!tLIT3p}glz!EcCx$YvH;wLhF24aiOPLh zoyM4vMhXD7pn%KA%I|SJ3pjFVbc&HshPKa%R-zM#w$p3fhA+q*C$x=DN^`o8SMD%{ zlYy6XyKVf(AvWYbX0=U|B7A&%L$qy^lSpgCbq?mNVK#inCYah3&VIO?=1DXw=#`qC zbt3TAho;;JwjNhLV1kW_T;f+5&f5zw$zb{>8{!V`+%h~%KVy-DqlO+=H=VZ=FkY%TPJGOKbO-eUMZb@k`Qw5*kXQI4 zNn-VY-V}k{dvi=NgDj)aFv2b;9&Lhj62jH0Xgt5%4NV`a$nS9VFeZ8jwL3ZT-35mn zvUwAUQ9a=cgBJ%U^%9B`*>UXEt~NPJ9a#K=jILPgIq5_LF4);`bivL2J}%hVmz_pI z&(zfWn4ASNsVrtA?CTky6@SLgnCP>dnQ&s$k2bCduV@v=0M<$2v&?X_w&f?0 zdVL4q!ob4O|06wo;ixOrj>l#y;~Gg=-=WAx*pV-hTSqte=+)3!U&FCJJ(R7IGj_tH zSk_m_@)csRD}7KQl3@|As*N?`C_c!U@vo=O(oUUM9HYTXr$fev>%5uanu%NzjR zCb4pse%58Ff_FbT99ZTs=22SCWBp8Il>D>{j4u>gKeWxhWg0&$HJ{gkdPXCf61P@& ztiI#OvjYd~D)hvhL4pdPanYqKH?T(AS0xsJjcpoa4(T1TJw`VIoTCqRpI?P*;>dsN z5f0BOf=znyxkaZ2tJWn8N$N>lK}c;lWS?W5vOBR=JKko}KC|$3Z%PH$J5|jKJ-NqE z_ZknrZ7W~D$^f(y8P~onU3Oty2J4NY*@llDx%i|JpU9&wHDK(xtG@VU#^kYat*h>i zdSLC^jL7(-#cz$a=M=p%&kPDtW4)wR`B-^()-G4{E(m^LY+5LRq%6%7l<6vOPNhVCyvY=4yUI zIx&MxLE28(nmXlm7viLOLSs$b4|GCD7I{^>sJ)bo<7qB^r=YAS^^JFY6;xwEh zZpDM~;ZEeb0~BvkTQTEG0U3VZL5j9H_mXvxdHwoPMGk8H%GZ$DSUoG};o!Bp*+kXX z`qy7&0LlzDGC5UnIv&!hC5g%LKEG*AaEI$`J|`zF9*~_UC6v2ef%Yt=w?iGS=`x{m`*tc1v}Pz zf~slY{K=p-7He#u7L@_cNMwKhd*f^(-Vaneam*r{gTf>LelwEqaEL>^IXTI3UTi}^ zZkltHCYX)!fRgkGlZFWF0F?CZ*bebcbNh5(fov2_4=P{4lkUMPb=`l~2uhFxu>7&DseW}mFpI(L7m<98w3m<&s^gYwzKLS`@ ziH2UU5yjHI=Sa0E5;z6n)mm>R$Iaaa0HpF2H=cyKrST)6aY5j>Y2EFa4KyaOJpi`Y z0cR0NFVNX;eH&s&2RLs_Wk`!X1Ktl5EXMuVY^M5^Na4ay{PgzMr(hU*GqwVm<`|tx zHqpMHc}$IYj}CnPhO8RSa9ryZ-xY7p0CWe2u`wOua|f#J0CPySsjO015zUoj^|=$R z&P!8a>m2?Q`plg2TfXWox!mch;lqB)b!%4}(i&%-8hjt^C)?8v8krgXwGp&JSbXUmUuKNKj;seLQ@+i{*gD4%I@RALNg?5Nv zHQN3d?-dcg{ZuEQo!};N-E}JHlr|#Z=D+=Y^?ah~?(8cL)5{VsbD?G)a@Zyct*NHxP>~FNNVt39Nz-u{udkt;$vC~g<^Q~(o z@!$ErW946qkAsrqYR=YH5b{$F!kam>41*1>C($G?Qu;QuA8=!KcHIVdWNDr-8-7uK zNuNiULdrZEx{d!~v71dXW?a|C=vhDe#uyuYWb4hW)6k0ypF8ER{BAwTAx;YE-wb!) zU;16Was^(;$OUp5dXvkJY0hDAS|8fn=gyP6&xSuan8cZ0vW)z(=x@DiJPDG%HphC= z- zpYdSh-(EFF=R=BYI@>x#_%jYWdLEjhM|USaBzVpNLG3+y_(R$BD_RmMas$MWs~oG^0ClV~+&9ED$w?cD|Yz+=nu2k$xd2U}uu6PP0V zCo+iBf#`{lqWxs#{-;()(J&9)cV& z*MIxg+j{>(@hd`~jcXbH;1z zth?n%0u(-3tD58KJI#tQPuPp_{T#@NnLsv#(utmIWON>=r)G}FN{F5lNBD@6U;Bn9 z>MqnKn+0+&Jbe!0Sg#XY1|IL>WT_VXUT;oA+Kv6ir{@DlMjpC8`1rDX*N^ifn3Oa- zP>v=r{|3wSjsMrp<+?rvZ1#&IQ%o*?Q%fUy9{OfIvd7w82leqs-`IVe19y5!^8?p+ z%lE(O);9mymq@O`lr{MH-Gap%a!lvK(+9_5!wv_d}s`<0wzR2F;-6sG^f)1 zfAhBE<$Hhn)^a}|--)B-fGBwkg|A}DfUPxB;ADB-k7x(+!4Wu(Z^V|l+qB6&n>1q*9dcD_jHBlT z*vR|+hTp{?KmT(AyX9Nn__#hpI{B~9Yw%ik6(uW2wP}cuI}>`1H0k-6=fBTqX`C$v zyXpzH+GeRX%|8xjW>_S<&=S+Pnr``~H$Jia)W5&2PruNUE@20Cie;tIvIjt59r&b0 zjV=c|+__#ALk??qI+k=+1B_gv^QeSsUl&j? z;p|tZ|KgJ`FMscq_bfcG=0&dhz{tYj7c4!e`8Av9+C(?nNM0J_+A`~hL2+5Y%lGV- zcj`{^cVGXwo}+cX;<;dQvT7u2?0R+qYFq{XM198e*L=}E%d_>lL3~zo=0om&Voy%^ z%h9>f^lD0ytPpr zg~{1jZAiO~^T97J@yeh09w`1xwSh24F`NSEhCjRLSXJn`%mH@4#+$x@;up2ebwIl&_3snm%EJ(YEoj{-clclgY{Q#$UL- z{G^^VuQM1Gu)n(U2vif97a;}2J2D&cm4Ei0<mZtf?9#n|`tkjxXn6KX&EI1=R@*$+Kyw>;|^ zN6TfsKa#H^pu#R*_}$O*#n-X_6q!ggu8IzGT!q@a0d4&GoYsxW{s08 zxcb6`!zl91*VjDiv#}r4pKJ1goci!UFDRc`2%OJ$tT_0@2dCnL<$j-qr9L&M`lL5D z(Jg%h*(2AFmk(S^Onhux>cB?H;>YJE=cKZwR~3}pmJcYob}zo~KupBx=(Nh~M4*nz zFreXsw&7fy?>G)Rb7uLh_>fd0az4fHf;q3Jlg~yVw=Ucr;=5V{Uqw2b-#L3OowL9U z9j+Ix`1q<;8v}WtQ-xXig+I)9(3;nXc|pGNB1^pvR0~0A$kl-?YrweTR}h1GVi

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/profile/backup_config.json b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000..78f40ae --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/profile/main_pages.json b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..73d563f --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,6 @@ +{ + "src": [ + "pages/Index", + "pages/AnonymousKeyProof" + ] +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/dark/element/color.json b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/dark/element/color.json new file mode 100644 index 0000000..79b11c2 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/main/resources/dark/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#000000" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/ets/test/Ability.test.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..0f8ce9a --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/ets/test/AnonymousKeyProof.test.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/ets/test/AnonymousKeyProof.test.ets new file mode 100644 index 0000000..80afe5c --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/ets/test/AnonymousKeyProof.test.ets @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect, beforeAll } from '@ohos/hypium'; +// 导入测试依赖kit +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; + +const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +let want: Want; + +export default function anonymousKeyProofTest() { + describe('anonymousKeyProofTest', () => { + /** + * 打开应用 + */ + beforeAll(async () => { + want = { + bundleName: bundleName, + abilityName: 'EntryAbility' + }; + await delegator.startAbility(want); + const driver = Driver.create(); + await driver.delayMs(1000); + const ability: UIAbility = await delegator.getCurrentTopAbility(); + console.info('get top ability'); + await driver.delayMs(1000); + expect(ability.context.abilityInfo.name).assertEqual('EntryAbility'); + }) + + /** + * 点击按钮,匿名密钥证明(ArkTS) + */ + it('testAnonymousKeyProof001', 0, async () => { + console.info('uitest: testAnonymousKeyProof001 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('AnonymousKeyProof').type('Button')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(1000); + const button2 = await driver.findComponent(ON.text('Call AnonymousKeyProof')); + await button2.click(); + await driver.delayMs(5000); + await driver.assertComponentExist(ON.text('AnonymousKeyProof Result: Success')); + console.info('uitest: testAnonymousKeyProof001 end'); + await driver.pressBack(); + }) + + /** + * 点击按钮,匿名密钥证明(C/C++) + */ + it('testAnonymousKeyProof002', 0, async () => { + console.info('uitest: testAnonymousKeyProof002 begin'); + const driver = Driver.create(); + const button1 = await driver.findComponent(ON.text('Call C/C++')); + await driver.delayMs(1000); + await button1.click(); + await driver.delayMs(3000); + await driver.assertComponentExist(ON.text('Call C/C++ Result: 0')); + console.info('uitest: testAnonymousKeyProof002 end'); + await driver.pressBack(); + }) + }) +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/ets/test/List.test.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..9718ab1 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import anonymousKeyProofTest from './AnonymousKeyProof.test'; + +export default function testsuite() { + anonymousKeyProofTest(); +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/module.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..c3fd9dd --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/ohosTest/module.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/test/List.test.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/test/List.test.ets new file mode 100644 index 0000000..f1186b1 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/test/LocalUnit.test.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000..7fc57c7 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/hvigor/hvigor-config.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..d584c19 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/hvigor/hvigor-config.json5 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/hvigorfile.ts b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/hvigorfile.ts new file mode 100644 index 0000000..2a5e543 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/oh-package.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/oh-package.json5 new file mode 100644 index 0000000..e41bae0 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "modelVersion": "5.0.1", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/ohosTest.md b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/ohosTest.md new file mode 100644 index 0000000..cd3b5f3 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/ohosTest.md @@ -0,0 +1,9 @@ +# 匿名密钥证明测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +| ----------------------------- | ------------ | ---- | ---------------- | -------- | -------- | +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 点击按钮,匿名密钥证明(ArkTS) | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | +| 点击按钮,匿名密钥证明(C/C++) | 成功拉起应用 | | 成功新增输出日志 | 是 | Pass | \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/screenshots/AnonymousKeyProof_1.png b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/AnonymousKeyProof/screenshots/AnonymousKeyProof_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e782125081697ff08d270b31736b742e3f76b3e6 GIT binary patch literal 25340 zcmeI42UL^ao9BZFND-t;F9Om*dT$~iB3*hDK>+~*eTZ|onyohKSv8UQ>z z000m70$>*aYJgjWghYe{w}^;{h>35JkkQ;GBPAtcprWRrVPRxrWnpAyX6F*-VZSHH z$;`|v%_sOkR6;_6jYn2dMod9iTte)xi{KFx6O)mW(civJFUG;lA@=V+u-^cbw+H|? z#_;j(0d7#@;Zx#adjV{?d=lXO?Ew7u1Mdd@O#(uqTf`)!xC9M%05|aP@o(J3Cm^_a z6PG#!cOGz)l7NasRF#n0z>esi2aVXPy zk6%JkN?Jx%PVJGphUR0fCq~bVO-#+qE$kg$zH)SOe(mM$(}sOaRB zPpN6?pEJPu1%*Y$C8cHMwRQCkjZMuht=&Dnef19Sf6vXYuB~ruZf)=E z?!k{wPR|hM$P3h8y6^z_{~!zZ{tv?bi7rZ3tOBdb^Kb+xH-X!1?%2xnle?e6-69~b*`g;%uIG{CF*r);pQ+Oh`%;`*mOu%dUkLO=UL2^sVSV% znek&(eG=Ul_AkXrk31MO)d%27i{ASxtmEndO^8DX7NEBBQTZqp3t&8~_xF(zyzzQg ze{so;Ymmgn%9lQu^wgAlt?SO7Nnm4Uo>LhS;yq^Ve$JsrL8p8+#pc*nUSoRyye`C% zE)Nl6)4!!BtR=Mm8wRQmBm<$EWquGjs(T_VHV?1>N*^KGIi)^#r{w;;05V_493*9B z7cp|pRl66J7F9+=C3sA#N!s+rP*rWuV{}`EWs~+7aO6!ohxr7+;YO7=ersA+K8XDEX|uvcNPX zzWwTe%xyp>m;5k#^T24}AqpQP9Of#WAn}lUrKxi<_El>%fVcQZAE)E3U(cv$J<<>i zl^qnlQrR5Q&MpO6>Xf%e@3~&UlRH~%#22!Ob8o-qEfua#o+oDe-~jkEs*t6B^VE=U zF|R|z*$I#z&HEo@f6%sTBSCs~otaN2gJUdth=rhISb&)}K`(I8;Y`6Nm;5;T9Wcq& zj(f78Ii8clY*z3$!#9=@kH+l#aDsu@`U?5sTc?+#Q>n>B^2Hp_63wsx3YqnNFyPRs z+Q@WDGH8^xI=pB_t>mEY(sGpRo(U+^NxyKNwYXe;T|N!=)D%kN`Fir_j4!-zXhdo) zFa0W8T!p29)}~L`{_9(jSLW64D5TV_^D;Y$io9kpJkvhx_b2LQN*aPc+W^m^HdH*i zUQMWQd4O-uYZ|G0t;}chVgY%tX0ZT5dn_Ps{Hkm%0Y&Eug1u5kF5$~D3h-#mI8422 zt8c9Z%I`nybh)p}-a}R)K%V;t!Ezg@kEc$9Gfy^H+MXCP;c2}Nch%|spbdBSeiYYy z;ii!SIT24a(D4~7yEO4t;{5ZE?jwkX#Kr@}yhrSdFv-$tOVydPm?}q;`l*@kxs&5+ z!%hi5BOKj->b{YK&(gXb^-_)IS*+~%dfE&IuF2q+sXyJ`4i%$$e&v6bdwWkHy>_Od zLYZ=Y2X$Z~gxFbvmeeg0ZZN!j-itWWSF83KLkW^cjhP2$7YyDW_|MEdN4X=QUsteQ2$3pYlE7YKn+<2?bxTyrJu*J z53S>h3}Pa{)Mp|WU$Q#f#v-&9zve@kmK2Fcd{OgumVqq}@TLh?zkI89I+%@nif-Pe zc9knqAvOa2D`EpasylaDj{1Tq6ckjhRj~Idv)L2OU!Jy8@mTD#Zr+BRN=`32XWy@n zUQmN!0lzEje>{J7>C&Z;fe{pWx}6;oIOE#X6ZD1fv!SiIET zBNZ0HIy;Eg>b{P$R@(=Gk~!LuNitgNF7ayl6!fJJL64Rw#- zyH9twLI^so9IMp>jR9Vv+%QD?ntZ0y%MPHm;nLH_V^wx@15YuJsn~TikT68Ax07_r zg>xE`KV4r@7IDL#b+CYEmL(+M*PB3-^GGx&Ym=XQ>HP9Y$?LRr7eD=2bZ4y0kB##~ zpwhy3>2r%OMMseh7e12pATj!z_aw;VsN?JL=rXVX?i33w;A=4GQnv*vpps%a5v(ei z5)fFFRwse*jKAd(-n8R!vDUWWP9BokZ`#RzX>wG*P|2#99@o6^>)_-(M1HbecJ&CU z*`Kd8y?s>+Jp@fd=h~2gSy%qKq<0d@9FYB5Q>`BH`>ci4P0^T{kMm)uru94!q=p>2xv zK~~Qm&Fcl!8Y^N9Wzpg`2|%~Tv^SOlZIz;xb{j5r0MXOXX!F!NJv!?0^z$K}$rrwj+;f?Xz!`mixlY-vI{l6x7Ny`fYUf<==xO+_NmU*vE zW2mYjlATRWh4%1ph9=eEV^&Q%Abv@JfAiID`s zUS{p;;Ggpd3y4VQIhQk?R~p?uxH=rU^!@6V!TNb$g)s?KrgyIHX)%lbv_b}&WrAGY zXg#$qt;qWGqE^IPq|rY|dnR?BH)q3 za|(l0_VxMZ80&{aiVua{1n#EjH6`xO)26m2EVul+&3{{u9iA;oh1hClca!$K za%5uF&x{{k!%upr$#7mSSMq+fb>j5WTFJ{!7`)G2SpK$~mi{|YDQ6WxClC47C&~@_ zvJO0i8u_H>DtfcjE|oq0mSoHyy$eETHUt?P>cLEBc-){n*(RqbRV*de_~V&II4jW$W2P&pWkWf6!7VNVaFBTDbWh`^mKmWFMnn zVgbq)6c~J5IrfcjB8M@d^=xRuOe`R#LQ*CtQg~;XoA+l4h8rE8aItR#F+&Nbc)j!p z0+m_~c!2zkev01zF|L27JU2NgTkFV@24J90gExds$7rk&V*#^2S5U%Dl3#R%m^9j^ zUR|ca(+AEI?2uU${b?sp8aq2{+CPhe2j^BfzT(-1=h*N`THl+sXwU|JgOUu@elq#? zqJ*8zAbScgW0i?$B3LYWIR(*{Je%$suif?2A3@Ld-ZsH@(qT-a2@wVkP~!pbnZ~Z? zZOg7N*H;MGz|ImPp`49f;sFL-pKlt{3_`Q?2{qoj`c>^=0kD)kQ3=Y(pMgFVAv^1e z4(^D|Q`(fO1)vheyFX5Th%FY4{VUc9GwmmJj{_*P)>$t8fRxgPyBiy&ldOvK%72V! zMS#ziD5j{xO^YXlge7BK4PW{-H)=dqbx)P{VGm5|58=JRc6(Kqw z(Z;NfQmU`Xobg02tzOhtDT+vXtlp}uLMZ@vN>7l$Cc)VzS-hieSU{>?uGPMul&4f%$%6SJQMXV#=K0HS+a=5!p)_VVANc=H7mYH*fV7Rk zn1L$`AkfR*I^M3m3ZVfS?OTL&Rt5QN@9qjsaMcub-3cq)pz8sxm_zj79k?^A0t+lu z6jBK2Bfya{WdXB1)#II(-BAg1BvTJvn!Y9IxwGemXl1BFnn#@yp_mo}7iyZvPVwn( zur3PH4a~XodwA1IDw8WO1!F!`u4cdUZB_vVig9Zv&*oDSX#H>{sJ`Kwq>+F7t+cCM zLPq4Cp4TMpYYLKmxmQW+);A`4r84}JwTozz0897oj6csRB?36&hg(YoTCbs{bhvsj zSrTtuUMwol1jzet%k1}iMN83bkr%B&jSR+v`J4;ueOn=siPG7oZ<^FqCLR!#F|13H zmr9O)JhCqzTqEtU)lSc>sZ+A#&(6HiZ4H#G7B$M4Yt9W6&?D5(su>ZRAMp>@oEV!pQJCrd7+vcDl$8JL}K z47My-*$W)~AT0Rj~?A*RfN)OknL~h&8P%T)tOh|+XZ_KgR0kjo{&*wgehlxEPvYL*=H=nLN)A8zI z?ATrqt`vGdQg!&PO7N+2B)K%-x6!~zGyj+0%y|7U5mmkXrA`_Xv=`iBeu*B zMyOEcCD`c4Gg%*3%U&CfX!#)M6Uip+$A!y6dH9EEJ7(FsGV3dV8!J5{508vtbSXh0 z@}pjYE)Gekn&qAgk~KTHUL?`?4jyC6!I8ec)o27-eM_;O75E`hSRPOSuVN$bSqI(T zDd-+^(%0J%A8@UZoQQlUPQ{XPL?u3nYgSF#WsCgldf3Rl+vJ%9oF$pGHh?j*h5D}| ze{7TdNi|_F+r|Q_o|4*7n5O7oYGkY%RqyIhp5(T?Om=G%VCEIw=wc0UGGpbDwZbKl79c(t}i*3JNa#dP!Pj|~r%vaI;r7IS2 zgfz7-@pm+Utwak~p6=__BTY@nCLeMcOBp7;dqyP|w<8zIJU$LZoBml+z9dm5Q?FW3 z`6+m0-x@EN$Mu%oO_gC!8Fd<#s{pLDLW--xJ+dl&O}iYY^CLqKorYb+>=)jNE_GCt z!*$C7q}o=Yq*|>`MIBj-i^G%*mQMYa*$Yts#wi`)byHZ(ZtJN@nTLW&+Fo=(DsdVje>H=H=BJLtrfsbH_`cn zV?N(OlRLJA!R5G_{+q$RiG()j4)R>j{Z3Pqh(wI@2I#AWdHE`(S*f%5`5-$SBg521 zeyY86_gf>_row$=Q9x(wk+tQAq{vMz=6CWl!bwCi!M9(bXye0LmvfloUEB4!H^8BXU;e~}9+}4THMo-a)_=;KPw9Nvk7U6U6eG&peYDI5Ppytbt)RKn zMJhEZn}JeMN<(kNUXUjA_^lhwA#VU71V9Vl8V`o4vlj5)*5eO`e8gmLLmnn7TYRt_ zjl3%-;3TxV@7?a-`3qIkVMIRhz=8O@E`GVA&0vR+Ew(tlFO(UU9?3D~2DR_#YKWNc zH+3+i3;rP{-pm{p_?%o|$~#WURb0=~`HU&^0-t(&aXnzv4Zv*5S>-RcwbGq^cf9^{ z+>c2~0q3F@Lpk@{gwZ)hS!CJ3j>6w#I8W`vzo%dFpOKdK_M)Mlqr!t&zfQ5XguaFY_))y%-mh$1pX%sC_+_jB^>C ziMDd5*kE6SMX&%>J#>0H77zs?%kOyKg9HNkLfJL~+~pw?0&pxqd=U#+eU7xnyvw-| z!KJ3wL<_Q!VgX}DxX8sO7O)2F;Vr>HR=dEqxYnBkH7fO4N-7oYG(cg8?8U z7&e595SqePMnpP5iP!hJF1P;&IMAYqZx@$$)iHShTF_LzNEGPiEkuHDPZ*+=e*onn zGk>c=yYj%cpdS&9O_X{JJ8&7hi)e7Cd(D))#PD0i)Srn@l%tp!P$-P#-ZBLo9oQaa zSMKuR6wVwT@d*_qy#so3T+4f1aiWn)I2~M$sz~sw$^V^MP{?kXodf_(h zovdR;ZS>+zhkuNgMnSpzNRy=iwmu!zl3Afj)vKj;`A96lIRS}hec{INLR2)OaS0tS z*mGw`-^=nKo-tsvwK+Lp!%4TQq=zh>dVq{~LYtG|kwLQ7j=+((_7CKU zC4;&z8!TMSwU$M%moX%DKP>dufQQv7nWv~3<4jaQ?jGSUxT&u+XWme2_McfrL2Jg^ z&4>m}sr;B*s0SPC;p4=qDfPv1fPO3h_*6C zaD+>M_a*%|E;#Dhe8Pv#35lSf;mc1Sw$?u%AX4tH97&g4oc9Y*YL(VwgxW`}NumZN zVTX3(>a;b92I}4@zX<#GvE1oupBPKtSH9}h_*2v?Fv%|#V}&W1D{4=?ON{4lZQ=6m z*qv@+9Q~ToYQfe_-t{isXfxlbQtDgXFJ{IG5-eloMyb-nlCN+%Hpf$^b$>d!Iqf4K zM1PA)cNI^Os0C&C>61~)9J#2cv(V6|+*I~=s?6^Mf_mk26AHITSxmIseiVt0FhrEc zI&!g<_RCh1fQ>m#6vh`uEKm50q;;(zpmxL&9x|x`$~@qC32}XsOg%k|v_!Fa99diY zf9x4itqity$>{at$n!X3U@N7Cp21~1Y3<-bnvUg4ZGydWr_^ctD*4d@KNbIj2F?C{ zYYZVrer&@~2cb`U{ZRoxn{^vaxRIWd_Vr*aZD1+_SAzh=v>+uq~?kaI3lb#pILC#T>(cih1q6fGUf)CjxCdAE*Z- z(tH8I<%+G|Q0vafg{mha`p*TUfNWfI;BRb6Hs7)ExOvBkwlU@YdZ5N=wbnV@ET-yA5y$B;J4~g zs6}>LvZ2@ESQFL+SwAv!#AwOj#w2nugBBJhd3jDcp$>3nRK%>wC}Yljm6#l>Z9!e7 ztQpE_!LC)CIFVmifX*f8%O+IW%S}AX{;c|mLHQ<7$(XmHu>GjB#8}Jd$+_ufav(&& zHP3yZ!&~H%Q2h!h-p#0o7>%kD%J6$wwKcq36Tk`o6Dn!n*IJZT?446HvUQc+E%Wl? z3DhGiUS)JuZ%i`Nnxdz*aBPuwM%cH9q`c8yx2VaUt=gYRkjD`_>$!5>pHJypEYK08@7O#xCqUb2FW^*D3hvANS+xGa}T_H%A~y@ zOLya*$7TOUwdjB>qT2CE2fc2xg#>uBGp!c%p(~)ZLZdRzpd(WkF>?-tUlB{x<@py+ z8ceQ^-}?$CeU-iJv>~`6a-I-ca8@p79G_8uG!9lRGmqJ=zAtLAP-jOdp5|`z@f6L6 z6n|DX;Uh5T{^~eco9~`leWO|Gw?AxZCf;9+o=gQxC@5DhD&~GLl5CjBdsDd05w_ie zzI;(%rduTYM09JT-M!6s2C?4(dBHaoG4)cw%N+3pWpO1xzX6WRPOtVi3Gvdcu_Vou zr4?q6tBoxTqYw1K_yieZzQYh1`PNb~w3|yyv2MehcfvPs*0B6eL7Dg#mF>!zet0?N z4NUI{%D9;>t;3+s{`|duz=5)@4L`ErS>2S2H!t-53G2*vj?b=~z%VgcW(>{4FIq#Q z!Hel3lMVG<)`(`^LiQqVH=yvsN{LQWO+%^qj)?^#yo{8~THGj7qVdqPCME1K%8dvn zsY^k^k5&ue#|1baeo&LAo*ZO*Fo;eoMaDd<>l#BVyShqUxC+hPw=Q(CZ;DMCRhwva zRkKiqp>7+eGZsO+5TJ~uB(p>1NVbg1m8Ozgb8SQL+2ZQa!>&IT2=OckP-9}UI(q+z z*ID058tfM(sU0V4F+cwd=s%Xq;rXTongs|gE@6YkzhLz!LCix8Y0|MDQ!T9V?v^J_2M$eyJ3*ify}$fOO;WqlS5%G zvii5j@Vw@D%066 z5?%NwQF9YDUG>;0o7`Vw(A%j&pogksYEl+JjpmmR3H<_OIkOapp@c+V;cBHN79cZF z56gV~%Ok$?tODe>xOb2?;{n1y)ogMkus%`oWuR z76W_@`e9)y?eZf1U-W*L4=@F zus#nCpmy_A;z!v*E8Or^PH6)KC`F0Xk}zv<_K69X`DCTwlFyBQ7`K>%X(=HvFbQ|= zXsd9p=v*$_f0I(Yt0N$E39JUY@63F34k&bnti>rCObOeaWG`{lHl-9i7V~4XOG*HB zx3^g)7`MR{#$G#Qo`2TxnoN0{fC!*RRA3}$ge0xqX7+WP#kfprieZ&SR#ZV@LD3Cm z`}3h~`4%fyi=?1CzZ3C}f5*Hh;!J!%5gN2T8~J^_O7)?q&XT38{lezTkpQhpsv|EC zQ2q$+cY(N!f4ANPcbe?81FmwGtCV+!Y{Z?&D*Af$E00zgCG;>FH$|U`P-szoZEHMn zdFgfX=r<1o8VfiALrQIspx!2da-Hf$XQNukyij}bo5%D+NdxYf2G5hdJ9GY#w$6rD z5)YoR(lxuZ;LrX(K^o?1w69I37&f*l$7sJ^YJwI;SDC~zzUJ#ky>8skH@!rGvzaHL ze;Q_d6iwzFqPsa6`*_quW$~&aw~f*J-(#EqpiXp>|^5|B ztg+F4kPJLQk5kO)e=1Wnj5%&|RsJ#6PS?o*(>YAIpXVL`3gNGbUplW;x#Ot^VH=(( znb8ej9kv!$A7^iCZL5u2dijD%6V<=d-pg_YlciQ3jDVg7`!lm%=-Pz;wGSR$Wr}WyvxQH|2h2S+ zJC<6jK5sfp^FsSpT8`GhQ%+d<-4$5m{(RJoo22}OyMC*CWec;Bz|f-!rk(KK^4Ceoxjd2h!1i3|4!jsnnHOie|c`)Vd!+|6EwHxIzA}hDkYj|miW3T zh=x5+S5!0I!p(;{qhj^T3M|!GKJcnmWcbZU2(b+Z>_iWEbk|ZzoaL)?))gVqo_bJ7 zaMK+fIe7F=LjEB8G=tU|&KEa*7o_@k2ig99py=-p$o(s6&9Vi?Onc>M8pCh+Ty2mA z$v{sPl^GZEt5dZM!CBIeo|P~rzDfIeQSQ&((40)X?z9;f-TL7BP2bY}g<$JHnIKAz z)+PbM`~tkurNlsK1(86e{$ujwtMA;G-x| zxeNHzi`o8DBAtanN;v{wD*>UbXr~ZH3G`PR-(HCoz8TH$PC6cA~ zs&m7Uj3G2UuHjxc*1xkdwY->ce((;oo#8aFQTU7v25HB|v{bs#pK%ee=xT8EuG!Bg zCdS<7bwuxT&)(R2%H|+Vm;Z`N*9b!a* z1t`rf#yetY&);JKJ2*ipR9FD~8K}Dx)^&9Q3pjpZi{Wp5&5JtZ!Gvlb*!Q%LCI{adw1wW4qDqwzoO8*O+_`*&EDY2?6!TCKVpmvZB?zLC020Qh!aUo^g5oc0g1;*;3FYLUY+rih~B4 zrwV@s2IRcTd<9}&U!lRHQKD|0&NoLJl`UD}R!oc5)iozC&$A&^9x}kMwt1Aoi>Un# z_a8@=vk%Pn!m!7 z8ho6^dpuYQ>ODDnI0p2C7{mPeDQ9iql&HOA12_dnYpVkbuyIFM6z7t^@t0flnejO} zo5rnCVXP`p6V6z#xDpb9R0}EB2_4?BUXW~N{rs=VYK}g{9AWN_=P?5nDlwl06$1=MY2jA5b!akQo)Yx z$%Po;EOq4Rud}fS#ZOx zXKEOlV4ayh3ZutYjmL9PXdZ4O-XoF;`^$3jpro1BR$hF0wei)l)6#?dq)pcmuF1jk zt&R>^I|r7OLDMAdnnjy z1+C-#OrJ<1*b%Ushm5$AXaRMX@Ay&gb;?Xh8Wiu*rRB_hwG^;f_^d6HY{HH|`+@m# w*7hH7PyH|MfALSYvHq`>&bZyBT(}_! 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

&`pz%d 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 literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/README.md b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/README.md new file mode 100644 index 0000000..0cb7877 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/README.md @@ -0,0 +1,92 @@ +## 非匿名密钥证明(ArkTS) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-key-attestation-arkts.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### NonAnonymousKeyProof + +##### 介绍 + +1. 本示例主要介绍非匿名密钥证明,非匿名密钥证明是一种安全机制,用于验证密钥的合法性和有效性。 + +##### 效果预览 + +| 主页 | 删除 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| | | + +使用说明 + +1. 点击Call NonAnonymousKeyProof按钮将密钥别名与参数集作为参数传入huks.attestKeyItem方法中,即可证明密钥。 + +## 非匿名密钥证明(C/C++) + +### 介绍 + +1. 本工程主要实现了对以下指南文档中 https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/UniversalKeystoreKit/huks-key-attestation-ndk.md 示例代码片段的工程化,主要目标是实现指南中示例代码需要与sample工程文件同源。 + +#### Call C/C++ + +##### 介绍 + +1. 本示例主要介绍非匿名密钥证明,非匿名密钥证明是一种安全机制,用于验证密钥的合法性和有效性。 + +##### 效果预览 + +| 主页 | 跳转页 | +| -------------------------------------------------- | -------------------------------------------------- | +| | | + +使用说明 + +1. 点击Call C/C++按钮将密钥别名与参数集作为参数传入OH_Huks_AttestKeyItem方法中,即可证明密钥。 + +## 工程目录 + +``` +entry/src/main/ +|---ets +|---|---entryability +|---|---|---EntryAbility.ets +|---|---pages +|---|---|---Index.ets // 首页 +|---|---|---AnonymousKeyProof.ets +|---cpp +|---resources // 静态资源 +|---ohosTest +|---|---ets +|---|---|---tests +|---|---|---|---NonAnonymousKeyProof.test.ets // 自动化测试用例 +``` + + +## 相关权限 + +[ohos.permission.ATTEST_KEY](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/security/AccessToken/permissions-for-system-apps.md#ohospermissionattestkey) + +## 依赖 + +不涉及。 + +## 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:华为手机。 + +2. HarmonyOS系统:HarmonyOS 5.0.2 Release及以上。 + +3. DevEco Studio版本:DevEco Studio 5.0.2 Release及以上。 + +4. HarmonyOS SDK版本:HarmonyOS 5.0.2 Release及以上。 + +## 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof > .git/info/sparse-checkout +git remote add origin https://gitee.com/harmonyos_samples/guide-snippets.git +git pull origin master +``` \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/build-profile.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/build-profile.json5 new file mode 100644 index 0000000..fb5a1ab --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/build-profile.json5 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true, + "useNormalizedOHMUrl": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/code-linter.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/code-linter.json5 new file mode 100644 index 0000000..2858646 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/code-linter.json5 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/.gitignore b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/build-profile.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/build-profile.json5 new file mode 100644 index 0000000..2d8b081 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": [ + "arm64-v8a", + "x86_64" + ] + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/hvigorfile.ts b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/hvigorfile.ts new file mode 100644 index 0000000..e4f43d5 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/hvigorfile.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/oh-package.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/oh-package.json5 new file mode 100644 index 0000000..118bdd4 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/oh-package.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/CMakeLists.txt b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..5c714d5 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(NonanonymousKeyProof) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) +target_link_libraries(entry PUBLIC libace_napi.z.so libhuks_ndk.z.so) \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/napi_init.cpp b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000..ca39403 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start non_anonymized_key_proof] +#include "huks/native_huks_api.h" +#include "huks/native_huks_param.h" +#include "napi/native_api.h" +#include + +OH_Huks_Result InitParamSet(struct OH_Huks_ParamSet **paramSet, const struct OH_Huks_Param *params, + uint32_t paramCount) +{ + OH_Huks_Result ret = OH_Huks_InitParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + return ret; + } + ret = OH_Huks_AddParams(*paramSet, params, paramCount); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + ret = OH_Huks_BuildParamSet(paramSet); + if (ret.errorCode != OH_HUKS_SUCCESS) { + OH_Huks_FreeParamSet(paramSet); + return ret; + } + return ret; +} + +static uint32_t g_size = 4096; +static uint32_t CERT_COUNT = 4; + +void FreeCertChain(struct OH_Huks_CertChain *certChain, const uint32_t pos) +{ + if (certChain == nullptr || certChain->certs == nullptr) { + return; + } + for (uint32_t j = 0; j < pos; j++) { + if (certChain->certs[j].data != nullptr) { + free(certChain->certs[j].data); + certChain->certs[j].data = nullptr; + } + } + if (certChain->certs != nullptr) { + free(certChain->certs); + certChain->certs = nullptr; + } +} + +int32_t ConstructDataToCertChain(struct OH_Huks_CertChain *certChain) +{ + if (certChain == nullptr) { + return OH_HUKS_ERR_CODE_ILLEGAL_ARGUMENT; + } + certChain->certsCount = CERT_COUNT; + + certChain->certs = (struct OH_Huks_Blob *)malloc(sizeof(struct OH_Huks_Blob) * (certChain->certsCount)); + if (certChain->certs == nullptr) { + return OH_HUKS_ERR_CODE_INTERNAL_ERROR; + } + for (uint32_t i = 0; i < certChain->certsCount; i++) { + certChain->certs[i].size = g_size; + certChain->certs[i].data = (uint8_t *)malloc(certChain->certs[i].size); + if (certChain->certs[i].data == nullptr) { + FreeCertChain(certChain, i); + return OH_HUKS_ERR_CODE_ILLEGAL_ARGUMENT; + } + } + return 0; +} + +static struct OH_Huks_Param g_genAttestParams[] = { + {.tag = OH_HUKS_TAG_ALGORITHM, .uint32Param = OH_HUKS_ALG_RSA}, + {.tag = OH_HUKS_TAG_KEY_SIZE, .uint32Param = OH_HUKS_RSA_KEY_SIZE_2048}, + {.tag = OH_HUKS_TAG_PURPOSE, .uint32Param = OH_HUKS_KEY_PURPOSE_VERIFY}, + {.tag = OH_HUKS_TAG_DIGEST, .uint32Param = OH_HUKS_DIGEST_SHA256}, + {.tag = OH_HUKS_TAG_PADDING, .uint32Param = OH_HUKS_PADDING_PSS}, + {.tag = OH_HUKS_TAG_BLOCK_MODE, .uint32Param = OH_HUKS_MODE_ECB}, +}; + +#define CHALLENGE_DATA "hi_challenge_data" +static struct OH_Huks_Blob g_challenge = {sizeof(CHALLENGE_DATA), (uint8_t *)CHALLENGE_DATA}; +static napi_value AttestKey(napi_env env, napi_callback_info info) +{ + /* 1.确定密钥别名 */ + struct OH_Huks_Blob genAlias = {(uint32_t)strlen("test_attest"), (uint8_t *)"test_attest"}; + static struct OH_Huks_Param g_attestParams[] = { + {.tag = OH_HUKS_TAG_ATTESTATION_CHALLENGE, .blob = g_challenge}, + {.tag = OH_HUKS_TAG_ATTESTATION_ID_ALIAS, .blob = genAlias}, + }; + struct OH_Huks_ParamSet *genParamSet = nullptr; + struct OH_Huks_ParamSet *attestParamSet = nullptr; + OH_Huks_Result ohResult; + OH_Huks_Blob certs = {0}; + OH_Huks_CertChain certChain = {&certs, 0}; + do { + /* 2.初始化密钥参数集 */ + ohResult = InitParamSet(&genParamSet, g_genAttestParams, sizeof(g_genAttestParams) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + ohResult = InitParamSet(&attestParamSet, g_attestParams, sizeof(g_attestParams) / sizeof(OH_Huks_Param)); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + ohResult = OH_Huks_GenerateKeyItem(&genAlias, genParamSet, nullptr); + if (ohResult.errorCode != OH_HUKS_SUCCESS) { + break; + } + + (void)ConstructDataToCertChain(&certChain); + /* 3.证明密钥 */ + ohResult = OH_Huks_AttestKeyItem(&genAlias, attestParamSet, &certChain); + } while (0); + FreeCertChain(&certChain, CERT_COUNT); + OH_Huks_FreeParamSet(&genParamSet); + OH_Huks_FreeParamSet(&attestParamSet); + (void)OH_Huks_DeleteKeyItem(&genAlias, NULL); + + napi_value ret; + napi_create_int32(env, ohResult.errorCode, &ret); + return ret; +} +// [End non_anonymized_key_proof] +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + {"attestKey", nullptr, AttestKey, nullptr, nullptr, nullptr, napi_default, nullptr}}; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void *)0), + .reserved = {0}, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); } diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/types/libentry/index.d.ts b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 0000000..2d7892e --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const attestKey: () => number; \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/types/libentry/oh-package.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000..2826cc7 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libentry.so", + "types": "./index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/entryability/EntryAbility.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..edc2839 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000..b1e2129 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/pages/Index.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..0a1ef44 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; +import testNapi from 'libentry.so'; + +@Entry +@Component +struct Index { + @State message: string = 'NonanonymousKeyProof'; + + goToSample(url: string): void { + router.pushUrl({ + url: url, + }, router.RouterMode.Single, (err) => { + if (err) { + console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('pushUrl success'); + }) + } + + build() { + Column({ space: 5 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.non_anonymous_key_proof')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + this.goToSample('pages/NonAnonymousKeyProof') + }) + Button($r('app.string.call_cpp_attest_key')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(() => { + let ret: number = testNapi.attestKey(); + this.message = 'Call C/C++ Result: ' + ret.toString(); + }) + } + .height('100%') + .width('100%') + } +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/pages/NonAnonymousKeyProof.ets b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/pages/NonAnonymousKeyProof.ets new file mode 100644 index 0000000..a856527 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/ets/pages/NonAnonymousKeyProof.ets @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start Start non_anonymized_key_proof] +/* + * 以下以attestKey的Promise接口操作验证为例 + */ +import { huks } from '@kit.UniversalKeystoreKit'; + +/* 1.确定密钥别名 */ +let keyAliasString = 'key attest'; +let aliasString = keyAliasString; +let aliasUint8 = stringToUint8Array(keyAliasString); +let securityLevel = stringToUint8Array('sec_level'); +let challenge = stringToUint8Array('challenge_data'); +let versionInfo = stringToUint8Array('version_info'); +let attestCertChain: string[]; + +class ThrowObject { + public isThrow: boolean = false; +} + +/* 封装生成时的密钥参数集 */ +let genKeyProperties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ALGORITHM, + value: huks.HuksKeyAlg.HUKS_ALG_RSA + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, + value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 + }, + { + tag: huks.HuksTag.HUKS_TAG_PURPOSE, + value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY + }, + { + tag: huks.HuksTag.HUKS_TAG_DIGEST, + value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256 + }, + { + tag: huks.HuksTag.HUKS_TAG_PADDING, + value: huks.HuksKeyPadding.HUKS_PADDING_PSS + }, + { + tag: huks.HuksTag.HUKS_TAG_KEY_GENERATE_TYPE, + value: huks.HuksKeyGenerateType.HUKS_KEY_GENERATE_TYPE_DEFAULT + }, + { + tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, + value: huks.HuksCipherMode.HUKS_MODE_ECB + } +] +let genOptions: huks.HuksOptions = { + properties: genKeyProperties +}; + +/* 2.封装证明密钥的参数集 */ +let attestKeyproperties: huks.HuksParam[] = [ + { + tag: huks.HuksTag.HUKS_TAG_ATTESTATION_ID_SEC_LEVEL_INFO, + value: securityLevel + }, + { + tag: huks.HuksTag.HUKS_TAG_ATTESTATION_CHALLENGE, + value: challenge + }, + { + tag: huks.HuksTag.HUKS_TAG_ATTESTATION_ID_VERSION_INFO, + value: versionInfo + }, + { + tag: huks.HuksTag.HUKS_TAG_ATTESTATION_ID_ALIAS, + value: aliasUint8 + } +] +let huksOptions: huks.HuksOptions = { + properties: attestKeyproperties +}; + +function stringToUint8Array(str: string) { + let arr: number[] = []; + for (let i = 0, j = str.length; i < j; ++i) { + arr.push(str.charCodeAt(i)); + } + return new Uint8Array(arr); +} + +function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.generateKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +/* 3.生成密钥 */ +async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) { + console.info(`enter promise generateKeyItem`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await generateKeyItem(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`); + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`); + } + }); + } catch (error) { + console.error(`promise: generateKeyItem input arg invalid, ${JSON.stringify(error)}`); + } +} + +/* 4.证明密钥 */ +function attestKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: ThrowObject) { + return new Promise((resolve, reject) => { + try { + huks.attestKeyItem(keyAlias, huksOptions, (error, data) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + } catch (error) { + throwObject.isThrow = true; + throw (error as Error); + } + }); +} + +async function publicAttestKey(keyAlias: string, huksOptions: huks.HuksOptions): Promise { + console.info(`enter promise attestKeyItem`); + let throwObject: ThrowObject = { isThrow: false }; + try { + await attestKeyItem(keyAlias, huksOptions, throwObject) + .then((data) => { + console.info(`promise: attestKeyItem success, data = ${JSON.stringify(data)}`); + if (data !== null && data.certChains !== null) { + attestCertChain = data.certChains as string[]; + } + }) + .catch((error: Error) => { + if (throwObject.isThrow) { + throw (error as Error); + } else { + console.error(`promise: attestKeyItem failed, ${JSON.stringify(error)}`); + } + }); + return 'Success'; + } catch (error) { + console.error(`promise: attestKeyItem input arg invalid, ${JSON.stringify(error)}`); + return 'Failed'; + } +} + +async function attestKeyTest(): Promise { + await publicGenKeyFunc(aliasString, genOptions); + let ret = await publicAttestKey(aliasString, huksOptions); + console.info('attest certChain data: ' + attestCertChain) + return ret; +} +// [End Start non_anonymized_key_proof] +@Entry +@Component +struct Index { + @State message: string = 'NonAnonymousKeyProof'; + + build() { + Column({ space: 12 }) { + Text(this.message) + .fontWeight(FontWeight.Regular) + .fontSize($r('sys.float.ohos_id_text_size_body1')) + .fontColor($r('sys.color.ohos_id_color_text_primary')) + .maxLines(Infinity) + .textAlign(TextAlign.Start) + Button($r('app.string.call_non_anonymous_key_proof')) + .padding('12vp') + .height('40vp') + .borderRadius($r('sys.float.ohos_id_corner_radius_button')) + .backgroundColor($r('sys.color.ohos_id_color_emphasize')) + .fontSize('14sp') + .fontColor('#ffffff') + .onClick(async () => { + let ret = await attestKeyTest(); + this.message = 'NonAnonymousKeyProof Result: ' + ret; + }) + } + .height('100%') + .width('100%') + } +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/module.json5 b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/module.json5 new file mode 100644 index 0000000..f0261f2 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/module.json5 @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ], + "requestPermissions": [ + { + "name": "ohos.permission.ATTEST_KEY", + "reason": "$string:permissionsReason", + "usedScene": { + "abilities": [ + "EntryAbility" + ], + "when": "inuse" + } + } + ] + } +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/element/color.json b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/element/string.json b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..b75880b --- /dev/null +++ b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/element/string.json @@ -0,0 +1,32 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "NonAnonymousKeyProof" + }, + { + "name": "permissionsReason", + "value": "NonAnonymousKeyProof" + }, + { + "name": "non_anonymous_key_proof", + "value": "NonAnonymousKeyProof" + }, + { + "name": "call_cpp_attest_key", + "value": "Call C/C++" + }, + { + "name": "call_non_anonymous_key_proof", + "value": "Call NonAnonymousKeyProof" + } + ] +} diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/media/background.png b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/media/foreground.png b/UniversalKeystoreKit/KeyProving/DevelopmentGuidelines/NonanonymousKeyProof/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f 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