From f1b24c1e82aef0d4549a95b9c78dcd65c59d9010 Mon Sep 17 00:00:00 2001 From: hid21342512 Date: Thu, 14 Aug 2025 17:43:43 +0800 Subject: [PATCH 1/2] copyright log and quote fix --- README.md | 2 +- entry/src/main/ets/Utils/AssetUtils.ets | 49 +++-- .../main/ets/entryability/EntryAbility.ets | 24 ++- .../entrybackupability/EntryBackupAbility.ets | 14 ++ .../main/ets/model/TrustedAuthentication.ets | 179 ++++++++++-------- entry/src/main/ets/pages/MainPage.ets | 82 ++++---- entry/src/main/ets/pages/PageOne.ets | 35 +++- entry/src/main/ets/pages/PageTwo.ets | 50 +++-- screenshots/index.jpg | Bin 106578 -> 0 bytes screenshots/index.png | Bin 0 -> 163711 bytes 10 files changed, 263 insertions(+), 172 deletions(-) delete mode 100644 screenshots/index.jpg create mode 100644 screenshots/index.png diff --git a/README.md b/README.md index d275efe..de5e619 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ## 效果预览 | 数字盾预览 | |-----------------------------------------------| -| | +| | ## 使用说明 ### 数字盾服务签名申请 diff --git a/entry/src/main/ets/Utils/AssetUtils.ets b/entry/src/main/ets/Utils/AssetUtils.ets index 2e7417d..6033fea 100644 --- a/entry/src/main/ets/Utils/AssetUtils.ets +++ b/entry/src/main/ets/Utils/AssetUtils.ets @@ -1,6 +1,23 @@ +/* +* Copyright (c) 2025 Huawei Device Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT 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 { util } from '@kit.ArkTS'; import { asset } from '@kit.AssetStoreKit'; import { BusinessError } from '@kit.BasicServicesKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; + +const DOMAIN = 0x0000 class AssetUtils { hasShield: boolean = false; @@ -15,35 +32,35 @@ class AssetUtils { query.set(asset.Tag.ALIAS, this.stringToArray(name)); try { asset.remove(query).then(() => { - console.info(`Asset removed successfully`); + hilog.info(DOMAIN, 'testTag', 'Asset removed successfully'); }).catch((err: BusinessError) => { - console.error(`Failed to remove Asset. Code is ${err.code}, message is ${err.message}`); + hilog.error(DOMAIN, 'testTag', `Failed to remove Asset. Code is ${err.code}, message is ${err.message}`); }); } catch (error) { let err = error as BusinessError; - console.error(`Failed to remove Asset. Code is ${err.code}, message is ${err.message}`); + hilog.error(DOMAIN, 'testTag', `Failed to remove Asset. Code is ${err.code}, message is ${err.message}`); } } AddDataToAssetStore(data: Uint8Array, name: string, label: string): void { let attr: asset.AssetMap = new Map(); - console.info('secret input', data); + hilog.info(DOMAIN, 'testTag', 'secret input', data); attr.set(asset.Tag.SECRET, data); attr.set(asset.Tag.ALIAS, this.stringToArray(name)); attr.set(asset.Tag.ACCESSIBILITY, asset.Accessibility.DEVICE_FIRST_UNLOCKED); attr.set(asset.Tag.DATA_LABEL_NORMAL_1, this.stringToArray(label)); try { asset.add(attr).then(() => { - console.info('Asset Added successfully'); + hilog.info(DOMAIN, 'testTag', 'Asset Added successfully'); }).catch((err: BusinessError) => { - console.error(`Failed to add Asset. Code is ${err.code}, message is ${err.message}`); + hilog.error(DOMAIN, 'testTag', `Failed to add Asset. Code is ${err.code}, message is ${err.message}`); if (err.code === 24000003) { this.UpdateDataToAssetStore(data, name, label); } }); } catch (error) { let err = error as BusinessError; - console.error(`Failed to add Asset. Code is ${err.code}, message is ${err.message}`); + hilog.error(DOMAIN, 'testTag', `Failed to add Asset. Code is ${err.code}, message is ${err.message}`); } } @@ -55,13 +72,13 @@ class AssetUtils { attrsToUpdate.set(asset.Tag.DATA_LABEL_NORMAL_1, this.stringToArray(label)); try { asset.update(query, attrsToUpdate).then(() => { - console.info('Asset updated successfully'); + hilog.info(DOMAIN, 'testTag', 'Asset updated successfully'); }).catch((err: BusinessError) => { - console.error(`Failed to update Asset. Code is ${err.code}, message is ${err.message}`); + hilog.error(DOMAIN, 'testTag', `Failed to update Asset. Code is ${err.code}, message is ${err.message}`); }); } catch (error) { let err = error as BusinessError; - console.error(`Failed to update Asset. Code is ${err.code}, message is ${err.message}`); + hilog.error(DOMAIN, 'testTag', `Failed to update Asset. Code is ${err.code}, message is ${err.message}`); } } @@ -70,20 +87,20 @@ class AssetUtils { query.set(asset.Tag.ALIAS, this.stringToArray(name)); query.set(asset.Tag.RETURN_TYPE, asset.ReturnType.ALL); let emptyArray = new Uint8Array(0); - console.info('Asset query begin'); + hilog.info(DOMAIN, 'testTag', 'Asset query begin'); try { - console.info('Asset query begin in try'); + hilog.info(DOMAIN, 'testTag', 'Asset query begin in try'); let res: Array = await asset.query(query); for (let i = 0; i < res.length; i++) { - console.info('Asset query begin in loop'); + hilog.info(DOMAIN, 'testTag', 'Asset query begin in loop'); let secret: Uint8Array = res[i].get(asset.Tag.SECRET) as Uint8Array; - console.info('secret output', secret); + hilog.info(DOMAIN, 'testTag', 'secret output', secret); return secret; } - console.info('Asset query begin again'); + hilog.info(DOMAIN, 'testTag', 'Asset query begin again'); } catch (error) { let err = error as BusinessError; - console.error(`Failed to query Asset. Code is ${err.code}, message is ${err.message}`); + hilog.error(DOMAIN, 'testTag', `Failed to query Asset. Code is ${err.code}, message is ${err.message}`); return emptyArray; } return emptyArray; diff --git a/entry/src/main/ets/entryability/EntryAbility.ets b/entry/src/main/ets/entryability/EntryAbility.ets index 508880a..3456b0e 100644 --- a/entry/src/main/ets/entryability/EntryAbility.ets +++ b/entry/src/main/ets/entryability/EntryAbility.ets @@ -1,12 +1,30 @@ -import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; +/* +* Copyright (c) 2025 Huawei Device Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT 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 { ConfigurationConstant, UIAbility } from '@kit.AbilityKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { window } from '@kit.ArkUI'; const DOMAIN = 0x0000; export default class EntryAbility extends UIAbility { - onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { - this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + onCreate(): void { + try{ + this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET); + } catch (error) { + hilog.error(DOMAIN, 'testTag', '%{public}s', 'setColorMode Error'); + } hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate'); } diff --git a/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets index 54ae78a..56fcf22 100644 --- a/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets +++ b/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -1,3 +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. +*/ import { hilog } from '@kit.PerformanceAnalysisKit'; import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; diff --git a/entry/src/main/ets/model/TrustedAuthentication.ets b/entry/src/main/ets/model/TrustedAuthentication.ets index 8e3f03d..014563b 100644 --- a/entry/src/main/ets/model/TrustedAuthentication.ets +++ b/entry/src/main/ets/model/TrustedAuthentication.ets @@ -1,3 +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. +*/ import { resourceManager } from '@kit.LocalizationKit'; import { huks } from '@kit.UniversalKeystoreKit'; import { BusinessError } from '@kit.BasicServicesKit'; @@ -5,6 +19,7 @@ import { userAuth } from '@kit.UserAuthenticationKit'; import { trustedAuthentication } from '@kit.DeviceSecurityKit'; import { util } from '@kit.ArkTS'; import AssetUtils from '../Utils/AssetUtils'; +import { hilog } from '@kit.PerformanceAnalysisKit'; const TUI_PIN_SET = 1 const TUI_PIN_MODIFY = 2 @@ -15,6 +30,7 @@ const TUI_BIND_FACE = 7 const TUI_BIND_FINGERPRINT = 8 const TUI_PIN_SET_MIX = 9 const TUI_PIN_MODIFY_MIX = 10 +const DOMAIN = 0x0000 let keyAlias = 'test_sign_key_alias'; let handle: number; let challenge: Uint8Array; @@ -83,22 +99,22 @@ function GetEccSignProperties(): Array { } async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions): Promise { - console.info(`enter promise generatekeyItem`); + hilog.info(DOMAIN, 'testTag', `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)}`); + hilog.info(DOMAIN, 'testTag', `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)); + hilog.error(DOMAIN, 'testTag', `promise: generateKeyItem failed, ` + JSON.stringify(error)); } }); } catch (error) { - console.error(`promise: generateKeyItem input arg invlaid ` + JSON.stringify(error)) + hilog.error(DOMAIN, 'testTag', `promise: generateKeyItem input arg invlaid ` + JSON.stringify(error)); } }; @@ -108,15 +124,15 @@ async function SignFinish(handle: number, authToken: Uint8Array, plaintext: stri properties: signProperties, inData: stringToUint8Array(plaintext) } - console.log("====inData====" + options.inData); - console.error("AAA finish 开始" + handle, options, authToken); + hilog.info(DOMAIN, 'testTag', '====inData====' + options.inData); + hilog.info(DOMAIN, 'testTag', 'AAA finish 开始' + handle, options, authToken); try { let data = await huks.finishSession(handle, options, authToken); let signature = data.outData as Uint8Array; - console.log('Sign Finish Success! Result: ' + JSON.stringify(data)); + hilog.info(DOMAIN, 'testTag', 'Sign Finish Success! Result: ' + JSON.stringify(data)); return signature } catch (error) { - console.error('Sign Finish Exception ' + JSON.stringify(error)); + hilog.error(DOMAIN, 'testTag', 'Sign Finish Exception ' + JSON.stringify(error)); throw new Error('Sign Finish Exception ' + (error as BusinessError).message); } } @@ -136,7 +152,7 @@ function stringToUint8Array(str: string): Uint8Array { async function Verify(indata: string, signature: Uint8Array): Promise { let indataArray = stringToUint8Array(indata) - console.log('indata size = ' + indataArray.length + ' signature size = ' + signature.length); + hilog.info(DOMAIN, 'testTag', 'indata size = ' + indataArray.length + ' signature size = ' + signature.length); let appendInfo = signature.subarray(0, 41); let newSignature = signature.subarray(41); @@ -150,33 +166,31 @@ async function Verify(indata: string, signature: Uint8Array): Promise { } await huks.initSession(keyAlias, options).then((data) => { handle = data.handle; - console.log('Verify Init Success! Result: ' + JSON.stringify(data)) + hilog.info(DOMAIN, 'testTag', 'Verify Init Success! Result: ' + JSON.stringify(data)); }).catch((err: Error) => { - console.error('Init err: ' + JSON.stringify(err)); + hilog.error(DOMAIN, 'testTag', 'Init err: ' + JSON.stringify(err)); }) - - console.log('Verify Update Begin' + JSON.stringify(options) + 'handel' + JSON.stringify(handle)); + hilog.info(DOMAIN, 'testTag', 'Verify Update Begin' + JSON.stringify(options) + 'handel' + JSON.stringify(handle)); options.inData = newIndata; await huks.updateSession(handle, options).then(() => { - console.log('Verify Update Begin(infunction)' + JSON.stringify(options.inData)); + hilog.info(DOMAIN, 'testTag', 'Verify Update Begin(infunction)' + JSON.stringify(options.inData)); }).catch((err: Error) => { - console.log('Verify update err: ' + JSON.stringify(err)); + hilog.error(DOMAIN, 'testTag', 'Verify update err: ' + JSON.stringify(err)); }) - - console.log('Verify Finish Begin' + JSON.stringify(options)); - console.log('Verify Finish SIG' + JSON.stringify(signature)); + hilog.info(DOMAIN, 'testTag', 'Verify Finish Begin' + JSON.stringify(options)); + hilog.info(DOMAIN, 'testTag', 'Verify Finish SIG' + JSON.stringify(signature)); options.inData = newSignature; await huks.finishSession(handle, options).then(() => { - console.log('Verify Finisht Success! Result:' + JSON.stringify(options.inData)); + hilog.info(DOMAIN, 'testTag', 'Verify Finisht Success! Result:' + JSON.stringify(options.inData)); }).catch((err: Error) => { - console.log('Verify finish err: ' + JSON.stringify(err)); + hilog.error(DOMAIN, 'testTag', 'Verify finish err: ' + JSON.stringify(err)); }); }; class TrustedAuth { bigIntToUint8Array(value: bigint): Uint8Array { if (value < 0n) { - throw new Error("only non-negative bigint values are supported"); + throw new Error('only non-negative bigint values are supported'); } if (value === 0n) { @@ -209,9 +223,9 @@ class TrustedAuth { let credentialID = appendInfo.subarray(8, 40); let checkHash = appendInfo.subarray(40, 41); let authType = appendInfo.subarray(4, 8); - console.log('credentialId', credentialID); - console.log('checkHash', checkHash); - console.log('authType', authType); + hilog.info(DOMAIN, 'testTag', 'credentialId', credentialID); + hilog.info(DOMAIN, 'testTag', 'checkHash', checkHash); + hilog.info(DOMAIN, 'testTag', 'authType', authType); await AssetUtils.AddDataToAssetStore(credentialID, 'face_credentialID', 'face_credential_label'); } @@ -222,11 +236,11 @@ class TrustedAuth { const fileData: Uint8Array = await resourceMgr.getRawFileContent('startIcon.png'); const firstTenElementsView = fileData.subarray(0, 20); - console.log('image size is ', fileData.buffer.byteLength); - console.log('image subarray is ', firstTenElementsView); + hilog.info(DOMAIN, 'testTag', 'image size is ', fileData.buffer.byteLength); + hilog.info(DOMAIN, 'testTag', 'image subarray is ', firstTenElementsView); return fileData.buffer; } catch (error) { - console.error('Failed to load image:', error); + hilog.error(DOMAIN, 'testTag', 'Failed to load image:', error); throw new Error('Unable to import image:' + (error as BusinessError).message); } } @@ -241,10 +255,10 @@ class TrustedAuth { title: '数字盾密码验证' } const result = await trustedAuthentication.trustedAuthentication(challenge, credentialID, label); - console.log('数字盾密码认证:', result.authToken.length, result.authToken); + hilog.info(DOMAIN, 'testTag', '数字盾密码认证:', result.authToken.length, result.authToken); return result; } catch (error) { - console.error('数字盾密码认证:', error); + hilog.error(DOMAIN, 'testTag', '数字盾密码认证:', error); throw new Error('数字盾密码认证失败:' + (error as BusinessError).message); } } @@ -265,10 +279,10 @@ class TrustedAuth { const authInfo = await trustedAuthentication.enableTrustedAuthentication(challenge, passwordInfo, label); let assetLabel = assetName + 'label'; await AssetUtils.AddDataToAssetStore(this.bigIntToUint8Array(authInfo.authID), assetName, assetLabel); - console.log('开通数字盾成功:', authInfo.authID, authInfo.authToken.length, authInfo.authToken); + hilog.info(DOMAIN, 'testTag', '开通数字盾成功:', authInfo.authID, authInfo.authToken.length, authInfo.authToken); return authInfo; } catch (error) { - console.error('开通数字盾失败:', error); + hilog.error(DOMAIN, 'testTag', '开通数字盾失败:', error); throw new Error('开通数字盾失败:' + (error as BusinessError).message); } } @@ -289,10 +303,10 @@ class TrustedAuth { const authInfo = await trustedAuthentication.enableTrustedAuthentication(challenge, passwordInfo, label); let assetLabel = assetName + 'label'; await AssetUtils.AddDataToAssetStore(this.bigIntToUint8Array(authInfo.authID), assetName, assetLabel); - console.log('开通数字盾成功:', authInfo.authID, authInfo.authToken.length, authInfo.authToken); + hilog.info(DOMAIN, 'testTag', '开通数字盾成功:', authInfo.authID, authInfo.authToken.length, authInfo.authToken); return authInfo; } catch (error) { - console.error('开通数字盾失败:', error); + hilog.error(DOMAIN, 'testTag', '开通数字盾失败:', error); throw new Error('开通数字盾失败:' + (error as BusinessError).message); } } @@ -314,10 +328,10 @@ class TrustedAuth { } const authInfo = await trustedAuthentication.modifyTrustedAuthenticationPwd(challenge, passwordInfo, credentialID, label); - console.log('修改数字盾成功:', authInfo.authToken); + hilog.info(DOMAIN, 'testTag', '修改数字盾成功:', authInfo.authToken); return authInfo; } catch (error) { - console.error('密码修改失败:', error); + hilog.error(DOMAIN, 'testTag', '密码修改失败:', error); throw new Error('密码修改失败:' + (error as BusinessError).message); } } @@ -339,10 +353,10 @@ class TrustedAuth { } const authInfo = await trustedAuthentication.modifyTrustedAuthenticationPwd(challenge, passwordInfo, credentialID, label); - console.log('修改数字盾成功:', authInfo.authToken); + hilog.info(DOMAIN, 'testTag', '修改数字盾成功:', authInfo.authToken); return authInfo; } catch (error) { - console.error('密码修改失败:', error); + hilog.error(DOMAIN, 'testTag', '密码修改失败:', error); throw new Error('密码修改失败:' + (error as BusinessError).message); } } @@ -361,10 +375,10 @@ class TrustedAuth { AssetUtils.DeleteDataFromAssetStore('credentialID'); AssetUtils.DeleteDataFromAssetStore('face_credentialID'); AssetUtils.DeleteDataFromAssetStore('finger_credentialID'); - console.log('关闭数字盾成功:', authInfo.authToken); + hilog.info(DOMAIN, 'testTag', '关闭数字盾成功:', authInfo.authToken); return authInfo; } catch (error) { - console.error('关闭数字盾失败:', error); + hilog.error(DOMAIN, 'testTag', '关闭数字盾失败:', error); throw new Error('关闭数字盾失败:' + (error as BusinessError).message); } } @@ -376,17 +390,17 @@ class TrustedAuth { let emptyBuffer = new ArrayBuffer(0); const label: trustedAuthentication.TUILable = { image: emptyBuffer, - title: "" + title: '' } const authInfo = await trustedAuthentication.disableTrustedAuthentication(challenge, false, credentialID, label); AssetUtils.DeleteDataFromAssetStore('pin_label1'); AssetUtils.DeleteDataFromAssetStore('credentialID'); AssetUtils.DeleteDataFromAssetStore('face_credentialID'); AssetUtils.DeleteDataFromAssetStore('finger+credentialID'); - console.log('关闭数字盾成功:', authInfo.authToken); + hilog.info(DOMAIN, 'testTag', '关闭数字盾成功:', authInfo.authToken); return authInfo.authToken; } catch (error) { - console.error('关闭数字盾失败:', error); + hilog.error(DOMAIN, 'testTag', '关闭数字盾失败:', error); throw new Error('关闭数字盾失败:' + (error as BusinessError).message); } } @@ -394,24 +408,24 @@ class TrustedAuth { async FaceAuthContent(challenge: Uint8Array, assetName: string): Promise { try { let enrolledState = userAuth.getEnrolledState(userAuth.UserAuthType.FACE); - console.info(`get current enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); + hilog.info(DOMAIN, 'testTag', `get current enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); let resArray: Uint8Array = await AssetUtils.QueryDataFromAssetStore(assetName); let credentialID: bigint = this.uint8ArrayToBigInt(resArray); const buffer: ArrayBuffer = await this.ImportImage(); const reqParams: trustedAuthentication.AuthReqParams = { reqType: trustedAuthentication.AuthType.AUTH_TYPE_FACE, - authContent: ["challenge:123456|0", "用户:张家龙|1", "账号:123456|1", "交易金额: 10000000|2", - "交易时间:2025-0605|2"] + authContent: ['challenge:123456|0', '用户:张家龙|1', '账号:123456|1', '交易金额: 10000000|2', + '交易时间:2025-0605|2'] } const label: trustedAuthentication.TUILable = { image: buffer, title: '人脸交易认证' } const result = await trustedAuthentication.procContentAuthentication(challenge, credentialID, reqParams, label); - console.log('人脸交易认证:', result.authToken); + hilog.info(DOMAIN, 'testTag', '人脸交易认证:', result.authToken); return result; } catch (error) { - console.error('人脸交易认证失败:', error); + hilog.error(DOMAIN, 'testTag', '人脸交易认证失败:', error); throw new Error('人脸交易认证失败:' + (error as BusinessError).message); } } @@ -419,24 +433,24 @@ class TrustedAuth { async FingerPrintAuthContent(challenge: Uint8Array, assetName: string): Promise { try { let enrolledState = userAuth.getEnrolledState(userAuth.UserAuthType.FINGERPRINT); - console.info(`get current enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); + hilog.info(DOMAIN, 'testTag', `get current enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); let resArray: Uint8Array = await AssetUtils.QueryDataFromAssetStore(assetName); let credentialID: bigint = this.uint8ArrayToBigInt(resArray); const buffer: ArrayBuffer = await this.ImportImage(); const reqParams: trustedAuthentication.AuthReqParams = { reqType: trustedAuthentication.AuthType.AUTH_TYPE_FINGERPRINT, - authContent: ["challenge:123456|0", "用户:张家龙|1", "账号:123456|1", "交易金额: 10000000|2", - "交易时间:2025-0605|2"] + authContent: ['challenge:123456|0', '用户:张家龙|1', '账号:123456|1', '交易金额: 10000000|2', + '交易时间:2025-0605|2'] } const label: trustedAuthentication.TUILable = { image: buffer, title: '指纹交易认证' } const result = await trustedAuthentication.procContentAuthentication(challenge, credentialID, reqParams, label); - console.log('指纹交易认证:', result.authToken); + hilog.info(DOMAIN, 'testTag', '指纹交易认证:', result.authToken); return result; } catch (error) { - console.error('指纹交易认证失败:', error); + hilog.error(DOMAIN, 'testTag', '指纹交易认证失败:', error); throw new Error('指纹交易认证失败:' + (error as BusinessError).message); } } @@ -448,18 +462,18 @@ class TrustedAuth { const buffer: ArrayBuffer = await this.ImportImage(); const reqParams: trustedAuthentication.AuthReqParams = { reqType: trustedAuthentication.AuthType.AUTH_TYPE_TUI_PIN, - authContent: ["challenge:123456|0", "用户:张家龙|1", "账号:123456|1", "交易金额: 10000000|2", - "交易时间:2025-0605|2"] + authContent: ['challenge:123456|0', '用户:张家龙|1', '账号:123456|1', '交易金额: 10000000|2', + '交易时间:2025-0605|2'] } const label: trustedAuthentication.TUILable = { image: buffer, title: '密码交易认证' } const result = await trustedAuthentication.procContentAuthentication(challenge, credentialID, reqParams, label); - console.log('密码交易认证:', result.authToken); + hilog.info(DOMAIN, 'testTag', '密码交易认证:', result.authToken); return result; } catch (error) { - console.error('密码交易认证失败:', error); + hilog.error(DOMAIN, 'testTag', '密码交易认证失败:', error); throw new Error('密码交易认证失败:' + (error as BusinessError).message); } } @@ -508,7 +522,7 @@ class TrustedAuth { let result = await huks.initSession(keyAlias, options); handle = result.handle; challenge = result.challenge as Uint8Array - console.error('initSession complete' + handle + '----' + challenge); + hilog.info(DOMAIN, 'testTag', 'initSession complete' + handle + '----' + challenge); return result; } @@ -517,21 +531,20 @@ class TrustedAuth { let resArray: Uint8Array = await AssetUtils.QueryDataFromAssetStore(assetName); let credentialID: bigint = this.uint8ArrayToBigInt(resArray); await trustedAuthentication.disableTrustedBioAuthentication(credentialID, authType); - console.log('解绑成功'); + hilog.info(DOMAIN, 'testTag', '解绑成功'); } catch (error) { - console.error('解绑失败', JSON.stringify(error)); + hilog.error(DOMAIN, 'testTag', '解绑失败', JSON.stringify(error)); throw new Error('解绑失败' + (error as BusinessError).message); } } async HuksSignAndVerify(session: huks.HuksSessionHandle, authToken: Uint8Array): Promise { - let inputdata = "challenge:123456|0\n用户:张家龙|1\n账号:123456|1\n交易金额: 10000000|2\n交易时间:2025-0605|2"; + let inputdata = 'challenge:123456|0\n用户:张家龙|1\n账号:123456|1\n交易金额: 10000000|2\n交易时间:2025-0605|2'; try { let signature = await SignFinish(session.handle, authToken, inputdata); - - console.log('IAM auth on success'); + hilog.info(DOMAIN, 'testTag', 'IAM auth on success'); } catch (error) { - console.error('IAM auth catch error', JSON.stringify(error)); + hilog.error(DOMAIN, 'testTag','IAM auth catch error', JSON.stringify(error)); throw new Error('拉起IAM控件失败' + (error as BusinessError).message); } } @@ -541,41 +554,41 @@ class TrustedAuth { let challenge: Uint8Array = session.challenge as Uint8Array; let tempAuthToken: trustedAuthentication.AuthToken; if (authType === TUI_PIN_SET) { - console.log('============创建密码============'); + hilog.info(DOMAIN, 'testTag', '============创建密码============'); tempAuthToken = await this.SetPwd(challenge, label); } else if (authType === TUI_PIN_MODIFY) { - console.log('============修改密码============'); + hilog.info(DOMAIN, 'testTag', '============修改密码============'); tempAuthToken = await this.ModifyPwd(challenge, label); } else if (authType === TUI_PIN_DISABLE) { - console.log('============关闭数字盾============'); + hilog.info(DOMAIN, 'testTag', '============关闭数字盾============'); tempAuthToken = await this.DisablePwd(challenge, label); } else if (authType === TUI_PIN_SET_MIX) { - console.log('============创建密码============'); + hilog.info(DOMAIN, 'testTag', '============创建密码============'); tempAuthToken = await this.SetPwdMix(challenge, label); } else if (authType === TUI_PIN_MODIFY_MIX) { - console.log('============修改密码============'); + hilog.info(DOMAIN, 'testTag', '============修改密码============'); tempAuthToken = await this.ModifyPwdMix(challenge, label); } else { - console.log('============开始密码交易认证============'); + hilog.info(DOMAIN, 'testTag', '============开始密码交易认证============'); tempAuthToken = await this.ContentVerifyByPwd(challenge, label); } const TuiAuthToken: trustedAuthentication.AuthToken = tempAuthToken; let authToken = TuiAuthToken.authToken; let inputdata = - "challenge:123456|0\n用户:张家龙|1\n账号:123456|1\n交易金额: 10000000|2\n交易时间:2025-0605|2"; + 'challenge:123456|0\n用户:张家龙|1\n账号:123456|1\n交易金额: 10000000|2\n交易时间:2025-0605|2'; try { SignFinish(session.handle, authToken, inputdata).then((data) => { signature = data as Uint8Array; Verify(inputdata, signature); }); - console.log('HUKS -> IAM auth on success'); + hilog.info(DOMAIN, 'testTag', 'HUKS -> IAM auth on success'); } catch (error) { - console.error('HUKS -> IAM auth error', JSON.stringify(error)); + hilog.error(DOMAIN, 'testTag', 'HUKS -> IAM auth error', JSON.stringify(error)); throw new Error('拉起IAM控件失败' + (error as BusinessError).message); } } - async UserAuthBeforeSign(indata: string, session: huks.HuksSessionHandle, authType: number): Promise { + async UserAuthBeforeSign(session: huks.HuksSessionHandle, authType: number): Promise { let authTypeList: number[] = new Array(); if (authType === TUI_BIND_FACE || authType === TUI_CONTENT_FACE_VERIFY) { authTypeList[0] = userAuth.UserAuthType.FACE; @@ -591,22 +604,22 @@ class TrustedAuth { title: ' ' }; try { - console.log('auth start'); + hilog.info(DOMAIN, 'testTag', 'auth start'); const userAuthInstance = userAuth.getUserAuthInstance(authParam, widgetParam); - console.log('auth success'); + hilog.info(DOMAIN, 'testTag', 'auth success'); - return new Promise((resolve, reject) => { + return new Promise((resolve) => { userAuthInstance.on('result', { onResult(result) { authTokenData = result.token; - console.log('auth result authTokenData', authTokenData); + hilog.info(DOMAIN, 'testTag', 'auth result authTokenData', authTokenData); resolve(authTokenData); } }); userAuthInstance.start(); }); } catch (error) { - console.error('HUKS -> IAM auth error', JSON.stringify(error)); + hilog.error(DOMAIN, 'testTag', 'HUKS -> IAM auth error', JSON.stringify(error)); throw new Error('拉起IAM控件失败' + (error as BusinessError).message); } } @@ -620,18 +633,18 @@ class TrustedAuth { if (authType === TUI_BIND_FACE) { try { let enrolledState = userAuth.getEnrolledState(userAuth.UserAuthType.FACE); - console.info(`get current face enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); + hilog.info(DOMAIN, 'testTag', `get current face enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); } catch (error) { - console.error(`get current face enrolled state failed, error = ${JSON.stringify(error)}`); + hilog.error(DOMAIN, 'testTag', `get current face enrolled state failed, error = ${JSON.stringify(error)}`); throw new Error('bind' + (error as BusinessError).message); } tempAuthToken = await this.PwdVerify(challenge, assetName); } else if (authType === TUI_BIND_FINGERPRINT) { try { let enrolledState = userAuth.getEnrolledState(userAuth.UserAuthType.FINGERPRINT); - console.info(`get current fingerprint enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); + hilog.info(DOMAIN, 'testTag', `get current fingerprint enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); } catch (error) { - console.error(`get current fingerprint enrolled state failed, error = ${JSON.stringify(error)}`); + hilog.error(DOMAIN, 'testTag', `get current fingerprint enrolled state failed, error = ${JSON.stringify(error)}`); throw new Error('bind' + (error as BusinessError).message); } tempAuthToken = await this.PwdVerify(challenge, assetName); @@ -645,7 +658,7 @@ class TrustedAuth { return tempAuthToken.authToken; } catch (error) { const err: BusinessError = error as BusinessError; - console.error(`get TUI Authtoken failed. Code is ${err?.code}, message is ${err?.message}`); + hilog.error(DOMAIN, 'testTag', `get TUI Authtoken failed. Code is ${err?.code}, message is ${err?.message}`); throw new Error((err as BusinessError).message); } } diff --git a/entry/src/main/ets/pages/MainPage.ets b/entry/src/main/ets/pages/MainPage.ets index b2f1946..288e012 100644 --- a/entry/src/main/ets/pages/MainPage.ets +++ b/entry/src/main/ets/pages/MainPage.ets @@ -23,13 +23,15 @@ import { userAuth } from '@kit.UserAuthenticationKit'; import { PromptAction } from '@kit.ArkUI'; import AssetUtils from '../Utils/AssetUtils'; +import { hilog } from '@kit.PerformanceAnalysisKit'; const TUI_PIN_DISABLE = 3 const TUI_BIND_FACE = 7 const TUI_BIND_FINGERPRINT = 8 +const DOMAIN = 0x0000 @Builder -export function MainPageBuilder(name: string, param: Object) { +export function MainPageBuilder() { MainPage() } @@ -75,13 +77,13 @@ export struct MainPage { if(this.hasFingerprintAbility){ try { userAuth.getAvailableStatus(userAuth.UserAuthType.FINGERPRINT, userAuth.AuthTrustLevel.ATL3); - console.info('current auth trust level supported'); + hilog.info(DOMAIN, 'testTag', 'current auth trust level supported'); } catch (error) { const err: BusinessError = error as BusinessError; if(error.code === 12500010){ - console.error(`Authentication bio is not enrolled. Code is ${err?.code}, message is ${err?.message}`) + hilog.error(DOMAIN, 'testTag', `Authentication bio is not enrolled. Code is ${err?.code}, message is ${err?.message}`); }else{ - console.error(`current auth trust level not supported. Code is ${err?.code}, message is ${err?.message}`) + hilog.error(DOMAIN, 'testTag', `current auth trust level not supported. Code is ${err?.code}, message is ${err?.message}`); this.hasFingerprintAbility = false; this.bioState--; } @@ -90,13 +92,13 @@ export struct MainPage { if(this.hasFaceAbility){ try { userAuth.getAvailableStatus(userAuth.UserAuthType.FACE, userAuth.AuthTrustLevel.ATL4); - console.info('current auth trust level supported'); + hilog.info(DOMAIN, 'testTag', 'current auth trust level supported'); } catch (error) { const err: BusinessError = error as BusinessError; if(error.code === 12500010){ - console.error(`Authentication bio is not enrolled. Code is ${err?.code}, message is ${err?.message}`) + hilog.error(DOMAIN, 'testTag', `Authentication bio is not enrolled. Code is ${err?.code}, message is ${err?.message}`); }else{ - console.error(`current auth trust level not supported. Code is ${err?.code}, message is ${err?.message}`) + hilog.error(DOMAIN, 'testTag', `current auth trust level not supported. Code is ${err?.code}, message is ${err?.message}`); this.hasFaceAbility = false; this.bioState--; } @@ -130,14 +132,14 @@ export struct MainPage { .buttonStyle(ButtonStyleMode.NORMAL) .margin({ top: 14, bottom: 14, right: 12 }) .onClick(async () => { - this.pageInfos.pushPath({name: "PageOne"}) + this.pageInfos.pushPath({name: 'PageOne'}) }); } else { Button(' 开通 ') .buttonStyle(ButtonStyleMode.NORMAL) .margin({ top: 14, bottom: 14, right: 12 }) .onClick(() => { - this.pageInfos.pushPath({ name: "PageOne" }) + this.pageInfos.pushPath({ name: 'PageOne' }) }) } } @@ -176,16 +178,16 @@ export struct MainPage { this.message = ''; try { let session = await TrustedAuth.SignInit(); - console.info("签名初始化完成"); - let indata: string = "aaabbb"; - await TrustedAuth.UserAuthTUIPINBeforeSign(indata, session, TUI_PIN_DISABLE, "pin_label1"); + hilog.info(DOMAIN, 'testTag', '签名初始化完成'); + let indata: string = 'aaabbb'; + await TrustedAuth.UserAuthTUIPINBeforeSign(indata, session, TUI_PIN_DISABLE, 'pin_label1'); this.message += `关闭数字盾成功`; this.hasShield = false; this.fingerprintBind = false; this.faceBind = false; } catch (error) { - console.error('n关闭数字盾失败:', error); - this.message += `\n\n关闭数字盾失败: ${error}`; + hilog.error(DOMAIN, 'testTag', 'n关闭数字盾失败:', error); + this.message += `关闭数字盾失败: ${error}`; } this.promptAction.openToast({ message: this.message, @@ -209,15 +211,15 @@ export struct MainPage { const rand = cryptoFramework.createRandom(); const len: number = 32; const challenge: Uint8Array = rand?.generateRandomSync(len)?.data; - const authToken = await TrustedAuth.disablePwdWithoutAuth(challenge, "pin_label1"); - console.log('关闭数字盾成功:', authToken); + const authToken = await TrustedAuth.disablePwdWithoutAuth(challenge, 'pin_label1'); + hilog.info(DOMAIN, 'testTag', '关闭数字盾成功:', authToken); this.message += `关闭数字盾成功`; this.hasShield = false; this.fingerprintBind = false; this.faceBind = false; } catch (error) { - console.error('n关闭数字盾失败:', error); - this.message += `\n\n关闭数字盾失败: ${error}`; + hilog.error(DOMAIN, 'testTag', 'n关闭数字盾失败:', error); + this.message += `关闭数字盾失败: ${error}`; } this.promptAction.openToast({ message: this.message, @@ -266,26 +268,25 @@ export struct MainPage { this.message = ''; try { let session = await TrustedAuth.SignInit(); - console.info("签名初始化完成"); - let indata: string = "aaabbb"; + hilog.info(DOMAIN, 'testTag', '签名初始化完成'); const tuiAuthToken: Uint8Array = await TrustedAuth.GetTUIAuthTokenBeforeBioVerify(session, TUI_BIND_FINGERPRINT, - "pin_label1"); + 'pin_label1'); let bioAuthToken: Uint8Array = - await TrustedAuth.UserAuthBeforeSign(indata, session, TUI_BIND_FINGERPRINT); + await TrustedAuth.UserAuthBeforeSign(session, TUI_BIND_FINGERPRINT); let operType = trustedAuthentication.OperateType.OPERATE_TYPE_BIOMETRIC_AUTH; let resignAuthToken = await trustedAuthentication.getBiometricAuthToken(operType, tuiAuthToken, bioAuthToken); - let inputdata = "challenge:123456|0\n用户:张家龙|1\n账号:123456|1\n交易金额:1000000000|2"; + let inputdata = 'challenge:123456|0\n用户:张家龙|1\n账号:123456|1\n交易金额:1000000000|2'; await TrustedAuth.bindFaceID(session.handle, resignAuthToken.authToken, inputdata) this.message += `指纹绑定成功`; this.fingerprintBind = true; } catch (error) { - console.error('n指纹绑定失败:', error); + hilog.error(DOMAIN, 'testTag', 'n指纹绑定失败:', error); if(error.message === 'Authentication template has not been enrolled.'){ - this.message += `\n\n指纹绑定失败:请前往系统界面绑定生物信息` + this.message += `指纹绑定失败:请前往系统界面绑定生物信息` }else{ - this.message += `\n\n指纹绑定失败: ${error}`; + this.message += `指纹绑定失败: ${error}`; } } this.promptAction.openToast({ @@ -307,13 +308,13 @@ export struct MainPage { this.message = ''; try { let authType = trustedAuthentication.AuthType.AUTH_TYPE_FINGERPRINT; - await TrustedAuth.disableTrustedBioAuthentication("pin_label1", authType); + await TrustedAuth.disableTrustedBioAuthentication('pin_label1', authType); this.message += `解绑指纹成功`; this.fingerprintBind = false; } catch (error) { // 捕获错误并处理 - console.error('解绑指纹失败:', error); - this.message += `\n\n解绑指纹失败: ${error}`; + hilog.error(DOMAIN, 'testTag', '解绑指纹失败:', error); + this.message += `解绑指纹失败: ${error}`; } this.promptAction.openToast({ message: this.message, @@ -339,25 +340,24 @@ export struct MainPage { this.message = ''; try { let session = await TrustedAuth.SignInit(); - console.info("签名初始化完成"); - let indata: string = "aaabbb"; + hilog.info(DOMAIN, 'testTag', '签名初始化完成'); const tuiAuthToken: Uint8Array = - await TrustedAuth.GetTUIAuthTokenBeforeBioVerify(session, TUI_BIND_FACE, "pin_label1"); + await TrustedAuth.GetTUIAuthTokenBeforeBioVerify(session, TUI_BIND_FACE, 'pin_label1'); let bioAuthToken: Uint8Array = - await TrustedAuth.UserAuthBeforeSign(indata, session, TUI_BIND_FACE); + await TrustedAuth.UserAuthBeforeSign(session, TUI_BIND_FACE); let operType = trustedAuthentication.OperateType.OPERATE_TYPE_BIOMETRIC_AUTH; let resignAuthToken = await trustedAuthentication.getBiometricAuthToken(operType, tuiAuthToken, bioAuthToken); - let inputdata = "challenge:123456|0\n用户:张家龙|1\n账号:123456|1\n交易金额:1000000000|2"; + let inputdata = 'challenge:123456|0\n用户:张家龙|1\n账号:123456|1\n交易金额:1000000000|2'; await TrustedAuth.bindFaceID(session.handle, resignAuthToken.authToken, inputdata) this.message += `人脸绑定成功`; this.faceBind = true; } catch (error) { - console.error('n人脸绑定失败:', error); + hilog.error(DOMAIN, 'testTag', 'n人脸绑定失败:', error); if(error.message === 'Authentication template has not been enrolled.'){ - this.message += `\n\n人脸绑定失败:请前往系统界面绑定生物信息` + this.message += `人脸绑定失败:请前往系统界面绑定生物信息` }else{ - this.message += `\n\n人脸绑定失败: ${error}`; + this.message += `人脸绑定失败: ${error}`; } } this.promptAction.openToast({ @@ -378,13 +378,13 @@ export struct MainPage { this.message = ''; try { let authType = trustedAuthentication.AuthType.AUTH_TYPE_FACE; - await TrustedAuth.disableTrustedBioAuthentication("pin_label1", authType); + await TrustedAuth.disableTrustedBioAuthentication('pin_label1', authType); this.message += `解绑人脸成功`; this.faceBind = false; } catch (error) { // 捕获错误并处理 - console.error('检查失败:', error); - this.message += `\n\n解绑人脸失败: ${error}`; + hilog.error(DOMAIN, 'testTag', '检查失败:', error); + this.message += `解绑人脸失败: ${error}`; } this.promptAction.openToast({ message: this.message, @@ -413,7 +413,7 @@ export struct MainPage { .width('100%') }.height('calc(100% - 56vp)') Button('去转账').width('calc(100% - 32vp)').onClick(() => { - this.pageInfos.pushPath({ name: "PageTwo" }) + this.pageInfos.pushPath({ name: 'PageTwo' }) }).margin({ bottom: 16 }) } .title('金融数字盾') diff --git a/entry/src/main/ets/pages/PageOne.ets b/entry/src/main/ets/pages/PageOne.ets index 20327fb..d96b56a 100644 --- a/entry/src/main/ets/pages/PageOne.ets +++ b/entry/src/main/ets/pages/PageOne.ets @@ -1,14 +1,29 @@ +/* +* Copyright (c) 2025 Huawei Device Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT 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 TrustedAuth from '../model/TrustedAuthentication'; import { PromptAction } from '@kit.ArkUI'; +import { hilog } from '@kit.PerformanceAnalysisKit'; const TUI_PIN_SET = 1 const TUI_PIN_MODIFY = 2 const TUI_PIN_SET_MIX = 9 const TUI_PIN_MODIFY_MIX = 10 - +const DOMAIN = 0x0000 @Builder -export function PageOneBuilder(name: string, param: Object) { +export function PageOneBuilder() { PageOne() } @@ -79,16 +94,16 @@ export struct PageOne { } try { await TrustedAuth.TestGenKeyForTuiPinSign(); - console.log('生成密钥成功'); + hilog.info(DOMAIN, 'testTag', '生成密钥成功'); let session = await TrustedAuth.SignInit(); - console.info("签名初始化完成"); - let indata: string = "aaabbb"; + hilog.info(DOMAIN, 'testTag', '签名初始化完成'); + let indata: string = 'aaabbb'; await TrustedAuth.UserAuthTUIPINBeforeSign(indata, session, this.type, 'pin_label1'); this.message += `修改数字盾密码成功`; this.hasShield = true; } catch (error) { // 捕获错误并处理 - console.error('检查失败:', error); + hilog.error(DOMAIN, 'testTag', '检查失败:', error); this.message += `修改数字盾密码失败: ${error}`; } this.promptAction.openToast({ @@ -108,16 +123,16 @@ export struct PageOne { } try { await TrustedAuth.TestGenKeyForTuiPinSign(); - console.log('生成密钥成功'); + hilog.info(DOMAIN, 'testTag', '生成密钥成功'); let session = await TrustedAuth.SignInit(); - console.info("签名初始化完成"); - let indata: string = "aaabbb"; + hilog.info(DOMAIN, 'testTag', '签名初始化完成'); + let indata: string = 'aaabbb'; await TrustedAuth.UserAuthTUIPINBeforeSign(indata, session, this.type, 'pin_label1'); this.message += `开通数字盾成功`; this.hasShield = true; } catch (error) { // 捕获错误并处理 - console.error('检查失败:', error); + hilog.error(DOMAIN, 'testTag', '检查失败:', error); this.message += `\n\n开通数字盾失败: ${error}`; } this.promptAction.openToast({ diff --git a/entry/src/main/ets/pages/PageTwo.ets b/entry/src/main/ets/pages/PageTwo.ets index 2a74cc9..b81f3d2 100644 --- a/entry/src/main/ets/pages/PageTwo.ets +++ b/entry/src/main/ets/pages/PageTwo.ets @@ -1,18 +1,34 @@ +/* +* Copyright (c) 2025 Huawei Device Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT 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 TrustedAuth from '../model/TrustedAuthentication'; -import { PromptAction } from "@kit.ArkUI"; +import { PromptAction } from '@kit.ArkUI'; import { trustedAuthentication } from '@kit.DeviceSecurityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; const TUI_CONTENT_PWD_VERIFY = 4 const TUI_CONTENT_FACE_VERIFY = 5 const TUI_CONTENT_FINGERPRINT_VERIFY = 6 +const DOMAIN = 0x0000 @Builder -export function PageTwoBuilder(name: string, param: Object) { +export function PageTwoBuilder() { PageTwo() } @Builder -export function BindSheetBuilder(name: string, param: Object) { +export function BindSheetBuilder() { BindSheetTemp() } @@ -33,13 +49,13 @@ export struct BindSheetTemp { this.message = ''; try { let session = await TrustedAuth.SignInit(); - console.info("签名初始化完成"); + hilog.info(DOMAIN, 'testTag', '签名初始化完成'); let indata: string = this.receiver + '/' + this.receiveAccount + '/' + this.tradingAmount; - await TrustedAuth.UserAuthTUIPINBeforeSign(indata, session, TUI_CONTENT_PWD_VERIFY, "pin_label1"); + await TrustedAuth.UserAuthTUIPINBeforeSign(indata, session, TUI_CONTENT_PWD_VERIFY, 'pin_label1'); this.message += `密码交易认证成功`; } catch (error) { - console.error('n密码交易认证失败:', error); - this.message += `\n\n密码交易认证失败: ${error}`; + hilog.error(DOMAIN, 'testTag', 'n密码交易认证失败:', error); + this.message += `密码交易认证失败: ${error}`; } this.promptAction.openToast({ message: this.message, @@ -51,19 +67,18 @@ export struct BindSheetTemp { this.message = ''; try { let session = await TrustedAuth.SignInit(); - console.info("签名初始化完成"); - let indata: string = "aaabbb"; + hilog.info(DOMAIN, 'testTag', '签名初始化完成'); const tuiAuthToken: Uint8Array = - await TrustedAuth.GetTUIAuthTokenBeforeBioVerify(session, TUI_CONTENT_FINGERPRINT_VERIFY, "pin_label1"); + await TrustedAuth.GetTUIAuthTokenBeforeBioVerify(session, TUI_CONTENT_FINGERPRINT_VERIFY, 'pin_label1'); let bioAuthToken: Uint8Array = - await TrustedAuth.UserAuthBeforeSign(indata, session, TUI_CONTENT_FINGERPRINT_VERIFY); + await TrustedAuth.UserAuthBeforeSign(session, TUI_CONTENT_FINGERPRINT_VERIFY); let operType = trustedAuthentication.OperateType.OPERATE_TYPE_CONTENT_AUTH; let resignAuthToken = await trustedAuthentication.getBiometricAuthToken(operType, tuiAuthToken, bioAuthToken); await TrustedAuth.HuksSignAndVerify(session, resignAuthToken.authToken) this.message += `指纹交易认证成功`; } catch (error) { - console.error('n指纹交易认证失败:', error); + hilog.error(DOMAIN, 'testTag', 'n指纹交易认证失败:', error); if(error.code === 1019100019){ this.message += `指纹交易认证失败:请用数字盾的指纹进行认证,多次失败请返回上一页解绑后重新绑定`; } @@ -82,19 +97,18 @@ export struct BindSheetTemp { this.message = ''; try { let session = await TrustedAuth.SignInit(); - console.info("签名初始化完成"); - let indata: string = "aaabbb"; + hilog.info(DOMAIN, 'testTag', '签名初始化完成'); const tuiAuthToken: Uint8Array = - await TrustedAuth.GetTUIAuthTokenBeforeBioVerify(session, TUI_CONTENT_FACE_VERIFY, "pin_label1"); + await TrustedAuth.GetTUIAuthTokenBeforeBioVerify(session, TUI_CONTENT_FACE_VERIFY, 'pin_label1'); let bioAuthToken: Uint8Array = - await TrustedAuth.UserAuthBeforeSign(indata, session, TUI_CONTENT_FACE_VERIFY); + await TrustedAuth.UserAuthBeforeSign(session, TUI_CONTENT_FACE_VERIFY); let operType = trustedAuthentication.OperateType.OPERATE_TYPE_CONTENT_AUTH; let resignAuthToken = await trustedAuthentication.getBiometricAuthToken(operType, tuiAuthToken, bioAuthToken); await TrustedAuth.HuksSignAndVerify(session, resignAuthToken.authToken) this.message += `人脸交易认证成功`; } catch (error) { - console.error('n人脸交易认证失败:', error); + hilog.error(DOMAIN, 'testTag', 'n人脸交易认证失败:', error); if(error.code === 1019100019){ this.message += `人脸交易认证失败:请确认认证信息是否正确,多次失败请返回上一页解绑后重新绑定`; } @@ -170,7 +184,7 @@ export struct PageTwo { .onClick(() => { this.bindSheetShow = true; }) - .bindSheet(this.bindSheetShow!!, BindSheetBuilder('', ''), this.sheetOption); + .bindSheet(this.bindSheetShow!!, BindSheetBuilder(), this.sheetOption); } } .title('银行卡转账') diff --git a/screenshots/index.jpg b/screenshots/index.jpg deleted file mode 100644 index d430df5f20855c5b6849efb792cdb4ad92093833..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106578 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 diff --git a/screenshots/index.png b/screenshots/index.png new file mode 100644 index 0000000000000000000000000000000000000000..af6be326a0025d3c0c0fba9d8221bfd8b558aafb GIT binary patch literal 163711 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\gLy?R)^u^2iOHI7aI1+}(3;uI< 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 GasLm}^;Zf2 literal 0 HcmV?d00001 -- Gitee From 51ddc2df74e3706b26cc3841586a497fd583fb6a Mon Sep 17 00:00:00 2001 From: hid21342512 Date: Thu, 14 Aug 2025 23:23:19 +0800 Subject: [PATCH 2/2] code review fix 1 --- README.md | 13 +- .../main/ets/model/TrustedAuthentication.ets | 148 +++++----- entry/src/main/ets/pages/MainPage.ets | 113 ++++---- ...{PageOne.ets => PasswordSelectionPage.ets} | 42 +-- .../pages/{PageTwo.ets => TradingPage.ets} | 54 ++-- .../main/ets/{Utils => utils}/AssetUtils.ets | 2 +- .../TrustedServiceOption.ets | 0 .../main/resources/base/element/string.json | 241 +++++++++++++++- .../resources/base/profile/router_map.json | 16 +- .../main/resources/en_US/element/color.json | 8 + .../main/resources/en_US/element/float.json | 8 + .../main/resources/en_US/element/string.json | 259 ++++++++++++++++++ .../main/resources/zh_CN/element/color.json | 8 + .../main/resources/zh_CN/element/float.json | 8 + .../main/resources/zh_CN/element/string.json | 259 ++++++++++++++++++ 15 files changed, 979 insertions(+), 200 deletions(-) rename entry/src/main/ets/pages/{PageOne.ets => PasswordSelectionPage.ets} (74%) rename entry/src/main/ets/pages/{PageTwo.ets => TradingPage.ets} (70%) rename entry/src/main/ets/{Utils => utils}/AssetUtils.ets (97%) rename entry/src/main/ets/{Common => utils}/TrustedServiceOption.ets (100%) create mode 100644 entry/src/main/resources/en_US/element/color.json create mode 100644 entry/src/main/resources/en_US/element/float.json create mode 100644 entry/src/main/resources/en_US/element/string.json create mode 100644 entry/src/main/resources/zh_CN/element/color.json create mode 100644 entry/src/main/resources/zh_CN/element/float.json create mode 100644 entry/src/main/resources/zh_CN/element/string.json diff --git a/README.md b/README.md index de5e619..a7e61fe 100644 --- a/README.md +++ b/README.md @@ -33,8 +33,6 @@ ``` ├──entry/src/main/ets/ -│ ├──Common -│ │ └──TrustedServiceOption.ets // 可信服务配置 │ ├──entryability │ │ └──EntryAbility.ets // Ability的生命周期回调内容 │ ├──entrybackupability @@ -44,10 +42,11 @@ │ ├──pages │ │ ├──Index.ets // Navigation导航入口界面 │ │ ├──MainPage.ets // 数字盾信息主界面 -│ │ ├──PageOne.ets // 密码类型选择界面 -│ │ └──PageTwo.ets // 交易信息界面 -│ └──Utils // 工具 -│ └──AssetUtils.ets // 关键资产存储服务工具 +│ │ ├──PasswordSelectionPage.ets // 密码类型选择界面 +│ │ └──TradingPage.ets // 交易信息界面 +│ └──utils // 工具 +│ ├──AssetUtils.ets // 关键资产存储服务工具 +│ └──TrustedServiceOption.ets // 可信服务配置 ├──resource └──module.json5 @@ -68,7 +67,7 @@ 3. User Authentication Kit (用户认证服务) ## 约束与限制 -1. 本示例仅支持标准系统上运行,支持设备:phone。 +1. 本示例仅支持标准系统上运行,支持设备:手机。 2. HarmonyOS系统:HarmonyOS 6.0 Beta3及以上。 3. DevEco Studio版本:DevEco Studio 6.0 Beta3及以上。 4. HarmonyOS SDK版本:HarmonyOS 6.0 Bete3 SDK及以上。 diff --git a/entry/src/main/ets/model/TrustedAuthentication.ets b/entry/src/main/ets/model/TrustedAuthentication.ets index 014563b..30fcb2c 100644 --- a/entry/src/main/ets/model/TrustedAuthentication.ets +++ b/entry/src/main/ets/model/TrustedAuthentication.ets @@ -18,7 +18,7 @@ import { BusinessError } from '@kit.BasicServicesKit'; import { userAuth } from '@kit.UserAuthenticationKit'; import { trustedAuthentication } from '@kit.DeviceSecurityKit'; import { util } from '@kit.ArkTS'; -import AssetUtils from '../Utils/AssetUtils'; +import AssetUtils from '../utils/AssetUtils'; import { hilog } from '@kit.PerformanceAnalysisKit'; const TUI_PIN_SET = 1 @@ -31,11 +31,8 @@ const TUI_BIND_FINGERPRINT = 8 const TUI_PIN_SET_MIX = 9 const TUI_PIN_MODIFY_MIX = 10 const DOMAIN = 0x0000 -let keyAlias = 'test_sign_key_alias'; +const KEY_ALIAS = 'test_sign_key_alias'; let handle: number; -let challenge: Uint8Array; -let signature: Uint8Array; -let authTokenData: Uint8Array; class throwObject { isThrow: boolean = false @@ -125,7 +122,7 @@ async function SignFinish(handle: number, authToken: Uint8Array, plaintext: stri inData: stringToUint8Array(plaintext) } hilog.info(DOMAIN, 'testTag', '====inData====' + options.inData); - hilog.info(DOMAIN, 'testTag', 'AAA finish 开始' + handle, options, authToken); + hilog.info(DOMAIN, 'testTag', 'AAA finish Start' + handle, options, authToken); try { let data = await huks.finishSession(handle, options, authToken); let signature = data.outData as Uint8Array; @@ -164,16 +161,16 @@ async function Verify(indata: string, signature: Uint8Array): Promise { properties: verifyProperties, inData: signature } - await huks.initSession(keyAlias, options).then((data) => { + await huks.initSession(KEY_ALIAS, options).then((data) => { handle = data.handle; hilog.info(DOMAIN, 'testTag', 'Verify Init Success! Result: ' + JSON.stringify(data)); }).catch((err: Error) => { hilog.error(DOMAIN, 'testTag', 'Init err: ' + JSON.stringify(err)); }) - hilog.info(DOMAIN, 'testTag', 'Verify Update Begin' + JSON.stringify(options) + 'handel' + JSON.stringify(handle)); + hilog.info(DOMAIN, 'testTag', 'Verify Update Begin' + JSON.stringify(options) + 'handle' + JSON.stringify(handle)); options.inData = newIndata; await huks.updateSession(handle, options).then(() => { - hilog.info(DOMAIN, 'testTag', 'Verify Update Begin(infunction)' + JSON.stringify(options.inData)); + hilog.info(DOMAIN, 'testTag', 'Verify Update Begin(inFunction)' + JSON.stringify(options.inData)); }).catch((err: Error) => { hilog.error(DOMAIN, 'testTag', 'Verify update err: ' + JSON.stringify(err)); }) @@ -181,7 +178,7 @@ async function Verify(indata: string, signature: Uint8Array): Promise { hilog.info(DOMAIN, 'testTag', 'Verify Finish SIG' + JSON.stringify(signature)); options.inData = newSignature; await huks.finishSession(handle, options).then(() => { - hilog.info(DOMAIN, 'testTag', 'Verify Finisht Success! Result:' + JSON.stringify(options.inData)); + hilog.info(DOMAIN, 'testTag', 'Verify Finish Success! Result:' + JSON.stringify(options.inData)); }).catch((err: Error) => { hilog.error(DOMAIN, 'testTag', 'Verify finish err: ' + JSON.stringify(err)); }); @@ -252,14 +249,14 @@ class TrustedAuth { const buffer: ArrayBuffer = await this.ImportImage(); const label: trustedAuthentication.TUILable = { image: buffer, - title: '数字盾密码验证' + title: $r('app.string.ShieldPwVerification') } const result = await trustedAuthentication.trustedAuthentication(challenge, credentialID, label); - hilog.info(DOMAIN, 'testTag', '数字盾密码认证:', result.authToken.length, result.authToken); + hilog.info(DOMAIN, 'testTag', 'DigitalShield password verification success:', result.authToken.length, result.authToken); return result; } catch (error) { - hilog.error(DOMAIN, 'testTag', '数字盾密码认证:', error); - throw new Error('数字盾密码认证失败:' + (error as BusinessError).message); + hilog.error(DOMAIN, 'testTag', 'DigitalShield password verification failed:', error); + throw new Error('DigitalShield password verification failed:' + (error as BusinessError).message); } } @@ -274,16 +271,16 @@ class TrustedAuth { const buffer: ArrayBuffer = await this.ImportImage(); const label: trustedAuthentication.TUILable = { image: buffer, - title: '开通数字盾' + title: $r('app.string.OpenShield') } const authInfo = await trustedAuthentication.enableTrustedAuthentication(challenge, passwordInfo, label); let assetLabel = assetName + 'label'; await AssetUtils.AddDataToAssetStore(this.bigIntToUint8Array(authInfo.authID), assetName, assetLabel); - hilog.info(DOMAIN, 'testTag', '开通数字盾成功:', authInfo.authID, authInfo.authToken.length, authInfo.authToken); + hilog.info(DOMAIN, 'testTag', 'Open Shield Success:', authInfo.authID, authInfo.authToken.length, authInfo.authToken); return authInfo; } catch (error) { - hilog.error(DOMAIN, 'testTag', '开通数字盾失败:', error); - throw new Error('开通数字盾失败:' + (error as BusinessError).message); + hilog.error(DOMAIN, 'testTag', 'Open Shield Fail:', error); + throw new Error('Open Shield Fail:' + (error as BusinessError).message); } } @@ -298,16 +295,16 @@ class TrustedAuth { const buffer: ArrayBuffer = await this.ImportImage(); const label: trustedAuthentication.TUILable = { image: buffer, - title: '开通数字盾' + title: $r('app.string.OpenShield') } const authInfo = await trustedAuthentication.enableTrustedAuthentication(challenge, passwordInfo, label); let assetLabel = assetName + 'label'; await AssetUtils.AddDataToAssetStore(this.bigIntToUint8Array(authInfo.authID), assetName, assetLabel); - hilog.info(DOMAIN, 'testTag', '开通数字盾成功:', authInfo.authID, authInfo.authToken.length, authInfo.authToken); + hilog.info(DOMAIN, 'testTag', 'Open Shield Success:', authInfo.authID, authInfo.authToken.length, authInfo.authToken); return authInfo; } catch (error) { - hilog.error(DOMAIN, 'testTag', '开通数字盾失败:', error); - throw new Error('开通数字盾失败:' + (error as BusinessError).message); + hilog.error(DOMAIN, 'testTag', 'Open Shield Fail:', error); + throw new Error('Open Shield Fail:' + (error as BusinessError).message); } } @@ -324,15 +321,15 @@ class TrustedAuth { const buffer: ArrayBuffer = await this.ImportImage(); const label: trustedAuthentication.TUILable = { image: buffer, - title: '修改金融盾' + title: $r('app.string.ModifyShield') } const authInfo = await trustedAuthentication.modifyTrustedAuthenticationPwd(challenge, passwordInfo, credentialID, label); - hilog.info(DOMAIN, 'testTag', '修改数字盾成功:', authInfo.authToken); + hilog.info(DOMAIN, 'testTag', 'Modify Shield Success:', authInfo.authToken); return authInfo; } catch (error) { - hilog.error(DOMAIN, 'testTag', '密码修改失败:', error); - throw new Error('密码修改失败:' + (error as BusinessError).message); + hilog.error(DOMAIN, 'testTag', 'Modify Shield Fail:', error); + throw new Error('Modify Shield Fail:' + (error as BusinessError).message); } } @@ -349,15 +346,15 @@ class TrustedAuth { const buffer: ArrayBuffer = await this.ImportImage(); const label: trustedAuthentication.TUILable = { image: buffer, - title: '修改金融盾' + title: $r('app.string.ModifyShield') } const authInfo = await trustedAuthentication.modifyTrustedAuthenticationPwd(challenge, passwordInfo, credentialID, label); - hilog.info(DOMAIN, 'testTag', '修改数字盾成功:', authInfo.authToken); + hilog.info(DOMAIN, 'testTag', 'Modify Shield Success:', authInfo.authToken); return authInfo; } catch (error) { - hilog.error(DOMAIN, 'testTag', '密码修改失败:', error); - throw new Error('密码修改失败:' + (error as BusinessError).message); + hilog.error(DOMAIN, 'testTag', 'Modify Shield Fail:', error); + throw new Error('Modify Shield Fail:' + (error as BusinessError).message); } } @@ -368,18 +365,18 @@ class TrustedAuth { const buffer: ArrayBuffer = await this.ImportImage(); const label: trustedAuthentication.TUILable = { image: buffer, - title: '关闭金融盾' + title: $r('app.string.CloseShield') } const authInfo = await trustedAuthentication.disableTrustedAuthentication(challenge, true, credentialID, label); AssetUtils.DeleteDataFromAssetStore('pin_label1'); AssetUtils.DeleteDataFromAssetStore('credentialID'); AssetUtils.DeleteDataFromAssetStore('face_credentialID'); AssetUtils.DeleteDataFromAssetStore('finger_credentialID'); - hilog.info(DOMAIN, 'testTag', '关闭数字盾成功:', authInfo.authToken); + hilog.info(DOMAIN, 'testTag', 'Close Shield Success:', authInfo.authToken); return authInfo; } catch (error) { - hilog.error(DOMAIN, 'testTag', '关闭数字盾失败:', error); - throw new Error('关闭数字盾失败:' + (error as BusinessError).message); + hilog.error(DOMAIN, 'testTag', 'Close Shield Fail:', error); + throw new Error('Close Shield Fail:' + (error as BusinessError).message); } } @@ -397,18 +394,19 @@ class TrustedAuth { AssetUtils.DeleteDataFromAssetStore('credentialID'); AssetUtils.DeleteDataFromAssetStore('face_credentialID'); AssetUtils.DeleteDataFromAssetStore('finger+credentialID'); - hilog.info(DOMAIN, 'testTag', '关闭数字盾成功:', authInfo.authToken); + hilog.info(DOMAIN, 'testTag', 'Close Shield Success:', authInfo.authToken); return authInfo.authToken; } catch (error) { - hilog.error(DOMAIN, 'testTag', '关闭数字盾失败:', error); - throw new Error('关闭数字盾失败:' + (error as BusinessError).message); + hilog.error(DOMAIN, 'testTag', 'Close Shield Fail:', error); + throw new Error('Close Shield Fail:' + (error as BusinessError).message); } } async FaceAuthContent(challenge: Uint8Array, assetName: string): Promise { try { let enrolledState = userAuth.getEnrolledState(userAuth.UserAuthType.FACE); - hilog.info(DOMAIN, 'testTag', `get current enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); + hilog.info(DOMAIN, 'testTag', + `get current enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); let resArray: Uint8Array = await AssetUtils.QueryDataFromAssetStore(assetName); let credentialID: bigint = this.uint8ArrayToBigInt(resArray); const buffer: ArrayBuffer = await this.ImportImage(); @@ -419,21 +417,22 @@ class TrustedAuth { } const label: trustedAuthentication.TUILable = { image: buffer, - title: '人脸交易认证' + title: $r('app.string.FaceVerification') } const result = await trustedAuthentication.procContentAuthentication(challenge, credentialID, reqParams, label); - hilog.info(DOMAIN, 'testTag', '人脸交易认证:', result.authToken); + hilog.info(DOMAIN, 'testTag', 'Face Verification Success:', result.authToken); return result; } catch (error) { - hilog.error(DOMAIN, 'testTag', '人脸交易认证失败:', error); - throw new Error('人脸交易认证失败:' + (error as BusinessError).message); + hilog.error(DOMAIN, 'testTag', 'Face Verification Fail:', error); + throw new Error('Face Verification Fail:' + (error as BusinessError).message); } } async FingerPrintAuthContent(challenge: Uint8Array, assetName: string): Promise { try { let enrolledState = userAuth.getEnrolledState(userAuth.UserAuthType.FINGERPRINT); - hilog.info(DOMAIN, 'testTag', `get current enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); + hilog.info(DOMAIN, 'testTag', + `get current enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); let resArray: Uint8Array = await AssetUtils.QueryDataFromAssetStore(assetName); let credentialID: bigint = this.uint8ArrayToBigInt(resArray); const buffer: ArrayBuffer = await this.ImportImage(); @@ -444,14 +443,14 @@ class TrustedAuth { } const label: trustedAuthentication.TUILable = { image: buffer, - title: '指纹交易认证' + title: $r('app.string.FingerprintVerification') } const result = await trustedAuthentication.procContentAuthentication(challenge, credentialID, reqParams, label); - hilog.info(DOMAIN, 'testTag', '指纹交易认证:', result.authToken); + hilog.info(DOMAIN, 'testTag', 'Fingerprint Verification Success:', result.authToken); return result; } catch (error) { - hilog.error(DOMAIN, 'testTag', '指纹交易认证失败:', error); - throw new Error('指纹交易认证失败:' + (error as BusinessError).message); + hilog.error(DOMAIN, 'testTag', 'Fingerprint Verification Fail:', error); + throw new Error('Fingerprint Verification Fail:' + (error as BusinessError).message); } } @@ -467,14 +466,14 @@ class TrustedAuth { } const label: trustedAuthentication.TUILable = { image: buffer, - title: '密码交易认证' + title: $r('app.string.PINVerification') } const result = await trustedAuthentication.procContentAuthentication(challenge, credentialID, reqParams, label); - hilog.info(DOMAIN, 'testTag', '密码交易认证:', result.authToken); + hilog.info(DOMAIN, 'testTag', 'Pin Verification Success:', result.authToken); return result; } catch (error) { - hilog.error(DOMAIN, 'testTag', '密码交易认证失败:', error); - throw new Error('密码交易认证失败:' + (error as BusinessError).message); + hilog.error(DOMAIN, 'testTag', 'Pin Verification Fail:', error); + throw new Error('Pin Verification Fail:' + (error as BusinessError).message); } } @@ -509,7 +508,7 @@ class TrustedAuth { properties: properties, inData: new Uint8Array(new Array()) } - await publicGenKeyFunc(keyAlias, huksOptions); + await publicGenKeyFunc(KEY_ALIAS, huksOptions); }; async SignInit(): Promise { @@ -519,9 +518,9 @@ class TrustedAuth { inData: new Uint8Array } - let result = await huks.initSession(keyAlias, options); - handle = result.handle; - challenge = result.challenge as Uint8Array + let result = await huks.initSession(KEY_ALIAS, options); + let handle = result.handle; + let challenge = result.challenge as Uint8Array hilog.info(DOMAIN, 'testTag', 'initSession complete' + handle + '----' + challenge); return result; } @@ -531,10 +530,10 @@ class TrustedAuth { let resArray: Uint8Array = await AssetUtils.QueryDataFromAssetStore(assetName); let credentialID: bigint = this.uint8ArrayToBigInt(resArray); await trustedAuthentication.disableTrustedBioAuthentication(credentialID, authType); - hilog.info(DOMAIN, 'testTag', '解绑成功'); + hilog.info(DOMAIN, 'testTag', 'unBound success'); } catch (error) { - hilog.error(DOMAIN, 'testTag', '解绑失败', JSON.stringify(error)); - throw new Error('解绑失败' + (error as BusinessError).message); + hilog.error(DOMAIN, 'testTag', 'unBound fail', JSON.stringify(error)); + throw new Error('unBound fail' + (error as BusinessError).message); } } @@ -544,8 +543,8 @@ class TrustedAuth { let signature = await SignFinish(session.handle, authToken, inputdata); hilog.info(DOMAIN, 'testTag', 'IAM auth on success'); } catch (error) { - hilog.error(DOMAIN, 'testTag','IAM auth catch error', JSON.stringify(error)); - throw new Error('拉起IAM控件失败' + (error as BusinessError).message); + hilog.error(DOMAIN, 'testTag', 'IAM auth catch error', JSON.stringify(error)); + throw new Error('pull up IAM Fail' + (error as BusinessError).message); } } @@ -554,22 +553,22 @@ class TrustedAuth { let challenge: Uint8Array = session.challenge as Uint8Array; let tempAuthToken: trustedAuthentication.AuthToken; if (authType === TUI_PIN_SET) { - hilog.info(DOMAIN, 'testTag', '============创建密码============'); + hilog.info(DOMAIN, 'testTag', '============createPW============'); tempAuthToken = await this.SetPwd(challenge, label); } else if (authType === TUI_PIN_MODIFY) { - hilog.info(DOMAIN, 'testTag', '============修改密码============'); + hilog.info(DOMAIN, 'testTag', '============modifyPW============'); tempAuthToken = await this.ModifyPwd(challenge, label); } else if (authType === TUI_PIN_DISABLE) { - hilog.info(DOMAIN, 'testTag', '============关闭数字盾============'); + hilog.info(DOMAIN, 'testTag', '============closeShield============'); tempAuthToken = await this.DisablePwd(challenge, label); } else if (authType === TUI_PIN_SET_MIX) { - hilog.info(DOMAIN, 'testTag', '============创建密码============'); + hilog.info(DOMAIN, 'testTag', '============createPW============'); tempAuthToken = await this.SetPwdMix(challenge, label); } else if (authType === TUI_PIN_MODIFY_MIX) { - hilog.info(DOMAIN, 'testTag', '============修改密码============'); + hilog.info(DOMAIN, 'testTag', '============modifyPW============'); tempAuthToken = await this.ModifyPwdMix(challenge, label); } else { - hilog.info(DOMAIN, 'testTag', '============开始密码交易认证============'); + hilog.info(DOMAIN, 'testTag', '============startPINVerification============'); tempAuthToken = await this.ContentVerifyByPwd(challenge, label); } const TuiAuthToken: trustedAuthentication.AuthToken = tempAuthToken; @@ -578,13 +577,13 @@ class TrustedAuth { 'challenge:123456|0\n用户:张家龙|1\n账号:123456|1\n交易金额: 10000000|2\n交易时间:2025-0605|2'; try { SignFinish(session.handle, authToken, inputdata).then((data) => { - signature = data as Uint8Array; + let signature = data as Uint8Array; Verify(inputdata, signature); }); hilog.info(DOMAIN, 'testTag', 'HUKS -> IAM auth on success'); } catch (error) { hilog.error(DOMAIN, 'testTag', 'HUKS -> IAM auth error', JSON.stringify(error)); - throw new Error('拉起IAM控件失败' + (error as BusinessError).message); + throw new Error('pull up IAM Fail' + (error as BusinessError).message); } } @@ -611,7 +610,7 @@ class TrustedAuth { return new Promise((resolve) => { userAuthInstance.on('result', { onResult(result) { - authTokenData = result.token; + let authTokenData = result.token; hilog.info(DOMAIN, 'testTag', 'auth result authTokenData', authTokenData); resolve(authTokenData); } @@ -620,7 +619,7 @@ class TrustedAuth { }); } catch (error) { hilog.error(DOMAIN, 'testTag', 'HUKS -> IAM auth error', JSON.stringify(error)); - throw new Error('拉起IAM控件失败' + (error as BusinessError).message); + throw new Error('pull up IAM Fail' + (error as BusinessError).message); } } @@ -633,7 +632,8 @@ class TrustedAuth { if (authType === TUI_BIND_FACE) { try { let enrolledState = userAuth.getEnrolledState(userAuth.UserAuthType.FACE); - hilog.info(DOMAIN, 'testTag', `get current face enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); + hilog.info(DOMAIN, 'testTag', + `get current face enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); } catch (error) { hilog.error(DOMAIN, 'testTag', `get current face enrolled state failed, error = ${JSON.stringify(error)}`); throw new Error('bind' + (error as BusinessError).message); @@ -642,9 +642,11 @@ class TrustedAuth { } else if (authType === TUI_BIND_FINGERPRINT) { try { let enrolledState = userAuth.getEnrolledState(userAuth.UserAuthType.FINGERPRINT); - hilog.info(DOMAIN, 'testTag', `get current fingerprint enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); + hilog.info(DOMAIN, 'testTag', + `get current fingerprint enrolled state success enrolledState = ${JSON.stringify(enrolledState)}`); } catch (error) { - hilog.error(DOMAIN, 'testTag', `get current fingerprint enrolled state failed, error = ${JSON.stringify(error)}`); + hilog.error(DOMAIN, 'testTag', + `get current fingerprint enrolled state failed, error = ${JSON.stringify(error)}`); throw new Error('bind' + (error as BusinessError).message); } tempAuthToken = await this.PwdVerify(challenge, assetName); diff --git a/entry/src/main/ets/pages/MainPage.ets b/entry/src/main/ets/pages/MainPage.ets index 288e012..1dfc656 100644 --- a/entry/src/main/ets/pages/MainPage.ets +++ b/entry/src/main/ets/pages/MainPage.ets @@ -13,22 +13,21 @@ * limitations under the License. */ -import { trustedAppService } from '@kit.DeviceSecurityKit'; import { trustedAuthentication } from '@kit.DeviceSecurityKit'; import TrustedAuth from '../model/TrustedAuthentication'; -import createOptions from '../Common/TrustedServiceOption'; import { BusinessError } from '@kit.BasicServicesKit'; import { cryptoFramework } from '@kit.CryptoArchitectureKit'; import { userAuth } from '@kit.UserAuthenticationKit'; import { PromptAction } from '@kit.ArkUI'; -import AssetUtils from '../Utils/AssetUtils'; +import AssetUtils from '../utils/AssetUtils'; import { hilog } from '@kit.PerformanceAnalysisKit'; const TUI_PIN_DISABLE = 3 const TUI_BIND_FACE = 7 const TUI_BIND_FINGERPRINT = 8 const DOMAIN = 0x0000 +const NOT_ENROLLED_ERROR = 12500010 @Builder export function MainPageBuilder() { @@ -48,16 +47,6 @@ export struct MainPage { uiContext: UIContext = this.getUIContext(); promptAction: PromptAction = this.uiContext.getPromptAction(); - async createAttestKey(): Promise { - trustedAppService.createAttestKey(createOptions) - .then(() => { - this.message += '\n\n 创建证明密钥成功'; - }) - .catch((err: BusinessError) => { - this.message += '\n\n 创建证明密钥失败: ' + err.message; - }); - } - async aboutToAppear(): Promise { const bytes = [0x00, 0x00, 0x00, 0x80, 0x80, 0xd2, 0x41, 0x40]; const buffer = new ArrayBuffer(bytes.length); @@ -80,7 +69,7 @@ export struct MainPage { hilog.info(DOMAIN, 'testTag', 'current auth trust level supported'); } catch (error) { const err: BusinessError = error as BusinessError; - if(error.code === 12500010){ + if(error.code === NOT_ENROLLED_ERROR){ hilog.error(DOMAIN, 'testTag', `Authentication bio is not enrolled. Code is ${err?.code}, message is ${err?.message}`); }else{ hilog.error(DOMAIN, 'testTag', `current auth trust level not supported. Code is ${err?.code}, message is ${err?.message}`); @@ -95,7 +84,7 @@ export struct MainPage { hilog.info(DOMAIN, 'testTag', 'current auth trust level supported'); } catch (error) { const err: BusinessError = error as BusinessError; - if(error.code === 12500010){ + if(error.code === NOT_ENROLLED_ERROR){ hilog.error(DOMAIN, 'testTag', `Authentication bio is not enrolled. Code is ${err?.code}, message is ${err?.message}`); }else{ hilog.error(DOMAIN, 'testTag', `current auth trust level not supported. Code is ${err?.code}, message is ${err?.message}`); @@ -111,7 +100,7 @@ export struct MainPage { Scroll() { Column() { Column() { - Text('身份认证设置') + Text($r('app.string.IDSetting')) .width('100%') .fontSize(500) .fontSize(14) @@ -125,21 +114,21 @@ export struct MainPage { }) Row() { - Text('数字盾').textAlign(TextAlign.Start).margin({ left: 12 }) + Text($r('app.string.DigitalShield')).textAlign(TextAlign.Start).margin({ left: 12 }) Blank() if (this.hasShield) { - Button('修改密码') + Button($r('app.string.ModifyPassword')) .buttonStyle(ButtonStyleMode.NORMAL) .margin({ top: 14, bottom: 14, right: 12 }) .onClick(async () => { - this.pageInfos.pushPath({name: 'PageOne'}) + this.pageInfos.pushPath({name: 'PasswordSelectionPage'}) }); } else { - Button(' 开通 ') + Button($r('app.string.OpenWord')) .buttonStyle(ButtonStyleMode.NORMAL) .margin({ top: 14, bottom: 14, right: 12 }) .onClick(() => { - this.pageInfos.pushPath({ name: 'PageOne' }) + this.pageInfos.pushPath({ name: 'PasswordSelectionPage' }) }) } } @@ -154,7 +143,7 @@ export struct MainPage { if (this.hasShield) { Column() { - Text('关闭数字盾') + Text($r('app.string.CloseShield')) .width('100%') .fontSize(500) .fontSize(14) @@ -169,25 +158,25 @@ export struct MainPage { Column() { Row() { - Text('需认证关闭数字盾').textAlign(TextAlign.Start).margin({ left: 12 }) + Text($r('app.string.CloseShieldWithVerification')).textAlign(TextAlign.Start).margin({ left: 12 }) Blank() - Button('关闭') + Button($r('app.string.CloseWord')) .buttonStyle(ButtonStyleMode.NORMAL) .margin({ top: 14, bottom: 14, right: 12 }) .onClick(async () => { this.message = ''; try { let session = await TrustedAuth.SignInit(); - hilog.info(DOMAIN, 'testTag', '签名初始化完成'); + hilog.info(DOMAIN, 'testTag', 'Finish Signature Initialization'); let indata: string = 'aaabbb'; await TrustedAuth.UserAuthTUIPINBeforeSign(indata, session, TUI_PIN_DISABLE, 'pin_label1'); - this.message += `关闭数字盾成功`; + this.message += $r('app.string.CloseShieldSuccess'); this.hasShield = false; this.fingerprintBind = false; this.faceBind = false; } catch (error) { - hilog.error(DOMAIN, 'testTag', 'n关闭数字盾失败:', error); - this.message += `关闭数字盾失败: ${error}`; + hilog.error(DOMAIN, 'testTag', 'Close Shield Fail:', error); + this.message += $r('app.string.CloseShieldFail') + `: ${error}`; } this.promptAction.openToast({ message: this.message, @@ -200,9 +189,9 @@ export struct MainPage { Divider().width('93%') Row() { - Text('无需认证关闭数字盾').textAlign(TextAlign.Start).margin({ left: 12 }) + Text($r('app.string.CloseShieldWithoutVerification')).textAlign(TextAlign.Start).margin({ left: 12 }) Blank() - Button('关闭') + Button($r('app.string.CloseWord')) .buttonStyle(ButtonStyleMode.NORMAL) .margin({ top: 14, bottom: 14, right: 12 }) .onClick(async () => { @@ -212,14 +201,14 @@ export struct MainPage { const len: number = 32; const challenge: Uint8Array = rand?.generateRandomSync(len)?.data; const authToken = await TrustedAuth.disablePwdWithoutAuth(challenge, 'pin_label1'); - hilog.info(DOMAIN, 'testTag', '关闭数字盾成功:', authToken); - this.message += `关闭数字盾成功`; + hilog.info(DOMAIN, 'testTag', 'Close Shield Success:', authToken); + this.message += $r('app.string.CloseShieldSuccess'); this.hasShield = false; this.fingerprintBind = false; this.faceBind = false; } catch (error) { - hilog.error(DOMAIN, 'testTag', 'n关闭数字盾失败:', error); - this.message += `关闭数字盾失败: ${error}`; + hilog.error(DOMAIN, 'testTag', 'Close Shield Fail:', error); + this.message += $r('app.string.CloseShieldFail')+ `: ${error}`; } this.promptAction.openToast({ message: this.message, @@ -241,7 +230,7 @@ export struct MainPage { if(this.bioState != 0){ Column() { - Text('生物特征认证方式') + Text($r('app.string.BioFeatureVerification')) .width('100%') .fontSize(500) .fontSize(14) @@ -259,16 +248,16 @@ export struct MainPage { if(this.hasFingerprintAbility){ if (!this.fingerprintBind) { Row() { - Text('指纹识别').textAlign(TextAlign.Start).margin({ left: 12 }) + Text($r('app.string.Fingerprint')).textAlign(TextAlign.Start).margin({ left: 12 }) Blank() - Button('绑定') + Button($r('app.string.Bind')) .buttonStyle(ButtonStyleMode.NORMAL) .margin({ top: 14, bottom: 14, right: 12 }) .onClick(async () => { this.message = ''; try { let session = await TrustedAuth.SignInit(); - hilog.info(DOMAIN, 'testTag', '签名初始化完成'); + hilog.info(DOMAIN, 'testTag', 'Finish Signature Initialization'); const tuiAuthToken: Uint8Array = await TrustedAuth.GetTUIAuthTokenBeforeBioVerify(session, TUI_BIND_FINGERPRINT, 'pin_label1'); @@ -279,14 +268,14 @@ export struct MainPage { await trustedAuthentication.getBiometricAuthToken(operType, tuiAuthToken, bioAuthToken); let inputdata = 'challenge:123456|0\n用户:张家龙|1\n账号:123456|1\n交易金额:1000000000|2'; await TrustedAuth.bindFaceID(session.handle, resignAuthToken.authToken, inputdata) - this.message += `指纹绑定成功`; + this.message += $r('app.string.BindFingerprintSuccess'); this.fingerprintBind = true; } catch (error) { - hilog.error(DOMAIN, 'testTag', 'n指纹绑定失败:', error); + hilog.error(DOMAIN, 'testTag', 'Bind Fingerprint Fail:', error); if(error.message === 'Authentication template has not been enrolled.'){ - this.message += `指纹绑定失败:请前往系统界面绑定生物信息` + this.message += $r('app.string.BindFingerprintFailWithNotification') }else{ - this.message += `指纹绑定失败: ${error}`; + this.message += $r('app.string.BindFingerprintFail')+ `: ${error}`; } } this.promptAction.openToast({ @@ -299,9 +288,9 @@ export struct MainPage { .height(56) } else { Row() { - Text('指纹识别--已绑定').textAlign(TextAlign.Start).margin({ left: 12 }) + Text( $r('app.string.FingerprintBound')).textAlign(TextAlign.Start).margin({ left: 12 }) Blank() - Button('解绑') + Button($r('app.string.UnBound')) .buttonStyle(ButtonStyleMode.NORMAL) .margin({ top: 14, bottom: 14, right: 12 }) .onClick(async () => { @@ -309,12 +298,12 @@ export struct MainPage { try { let authType = trustedAuthentication.AuthType.AUTH_TYPE_FINGERPRINT; await TrustedAuth.disableTrustedBioAuthentication('pin_label1', authType); - this.message += `解绑指纹成功`; + this.message += $r('app.string.UnBoundFingerprintSuccess'); this.fingerprintBind = false; } catch (error) { // 捕获错误并处理 - hilog.error(DOMAIN, 'testTag', '解绑指纹失败:', error); - this.message += `解绑指纹失败: ${error}`; + hilog.error(DOMAIN, 'testTag', 'UnBound Fingerprint Fail:', error); + this.message += $r('app.string.UnBoundFingerprintFail')+`: ${error}`; } this.promptAction.openToast({ message: this.message, @@ -331,16 +320,16 @@ export struct MainPage { if(this.hasFaceAbility){ if (!this.faceBind) { Row() { - Text('人脸识别').textAlign(TextAlign.Start).margin({ left: 12 }) + Text($r('app.string.Face')).textAlign(TextAlign.Start).margin({ left: 12 }) Blank() - Button('绑定') + Button($r('app.string.Bind')) .buttonStyle(ButtonStyleMode.NORMAL) .margin({ top: 14, bottom: 14, right: 12 }) .onClick(async () => { this.message = ''; try { let session = await TrustedAuth.SignInit(); - hilog.info(DOMAIN, 'testTag', '签名初始化完成'); + hilog.info(DOMAIN, 'testTag', 'Finish Signature Initialization'); const tuiAuthToken: Uint8Array = await TrustedAuth.GetTUIAuthTokenBeforeBioVerify(session, TUI_BIND_FACE, 'pin_label1'); let bioAuthToken: Uint8Array = @@ -350,14 +339,14 @@ export struct MainPage { await trustedAuthentication.getBiometricAuthToken(operType, tuiAuthToken, bioAuthToken); let inputdata = 'challenge:123456|0\n用户:张家龙|1\n账号:123456|1\n交易金额:1000000000|2'; await TrustedAuth.bindFaceID(session.handle, resignAuthToken.authToken, inputdata) - this.message += `人脸绑定成功`; + this.message += $r('app.string.BindFaceSuccess'); this.faceBind = true; } catch (error) { - hilog.error(DOMAIN, 'testTag', 'n人脸绑定失败:', error); + hilog.error(DOMAIN, 'testTag', 'Bind Face Fail:', error); if(error.message === 'Authentication template has not been enrolled.'){ - this.message += `人脸绑定失败:请前往系统界面绑定生物信息` + this.message += $r('app.string.BindFaceFailWithNotification') }else{ - this.message += `人脸绑定失败: ${error}`; + this.message += $r('app.string.BindFaceFail')+ ` : ${error}`; } } this.promptAction.openToast({ @@ -369,9 +358,9 @@ export struct MainPage { .height(56) } else { Row() { - Text('人脸识别--已绑定').textAlign(TextAlign.Start).margin({ left: 12 }) + Text($r('app.string.FaceBound')).textAlign(TextAlign.Start).margin({ left: 12 }) Blank() - Button('解绑') + Button($r('app.string.UnBound')) .buttonStyle(ButtonStyleMode.NORMAL) .margin({ top: 14, bottom: 14, right: 12 }) .onClick(async () => { @@ -379,12 +368,12 @@ export struct MainPage { try { let authType = trustedAuthentication.AuthType.AUTH_TYPE_FACE; await TrustedAuth.disableTrustedBioAuthentication('pin_label1', authType); - this.message += `解绑人脸成功`; + this.message += $r('app.string.UnBoundFaceSuccess'); this.faceBind = false; } catch (error) { // 捕获错误并处理 - hilog.error(DOMAIN, 'testTag', '检查失败:', error); - this.message += `解绑人脸失败: ${error}`; + hilog.error(DOMAIN, 'testTag', 'UnBound Face Fail:', error); + this.message += $r('app.string.UnBoundFaceFail')+`: ${error}`; } this.promptAction.openToast({ message: this.message, @@ -412,11 +401,11 @@ export struct MainPage { .constraintSize({minHeight:'100%'}) .width('100%') }.height('calc(100% - 56vp)') - Button('去转账').width('calc(100% - 32vp)').onClick(() => { - this.pageInfos.pushPath({ name: 'PageTwo' }) + Button($r('app.string.Trade')).width('calc(100% - 32vp)').onClick(() => { + this.pageInfos.pushPath({ name: 'TradingPage' }) }).margin({ bottom: 16 }) } - .title('金融数字盾') + .title($r('app.string.FinDigitalShield')) .hideBackButton(true) .backgroundColor('#F1F3F5') .width('100%') diff --git a/entry/src/main/ets/pages/PageOne.ets b/entry/src/main/ets/pages/PasswordSelectionPage.ets similarity index 74% rename from entry/src/main/ets/pages/PageOne.ets rename to entry/src/main/ets/pages/PasswordSelectionPage.ets index d96b56a..5ff9689 100644 --- a/entry/src/main/ets/pages/PageOne.ets +++ b/entry/src/main/ets/pages/PasswordSelectionPage.ets @@ -23,12 +23,12 @@ const TUI_PIN_MODIFY_MIX = 10 const DOMAIN = 0x0000 @Builder -export function PageOneBuilder() { - PageOne() +export function PasswordSelectionPageBuilder() { + PasswordSelectionPage() } @Component -export struct PageOne { +export struct PasswordSelectionPage { @State onlyNum: boolean = true; @State message: string = ''; @State type: number = 0; @@ -41,7 +41,7 @@ export struct PageOne { NavDestination() { Column() { Column() { - Text('请设定数字盾的验证方式') + Text($r('app.string.PlzSetVerificationWay')) .width('100%') .fontSize(500) .fontSize(14) @@ -56,7 +56,7 @@ export struct PageOne { Row() { Checkbox().margin({ left: 18 }).select(this.onlyNum!!) - Text('数字密码').textAlign(TextAlign.Start).margin({ left: 8 }) + Text($r('app.string.PureNumber')).textAlign(TextAlign.Start).margin({ left: 8 }) } .width('calc(100% - 32vp)') .height(56) @@ -72,7 +72,7 @@ export struct PageOne { Checkbox().margin({ left: 18 }).select(!this.onlyNum).onClick(() => { this.onlyNum = !this.onlyNum }) - Text('数字+英文组合密码').textAlign(TextAlign.Start).margin({ left: 8 }) + Text($r('app.string.NumberPlusAlphabet')).textAlign(TextAlign.Start).margin({ left: 8 }) } .width('calc(100% - 32vp)') .height(56) @@ -85,7 +85,7 @@ export struct PageOne { Blank() if(this.hasShield){ - Button('立即修改').width('calc(100% - 32vp)').onClick(async () => { + Button($r('app.string.ModifyWord')).width('calc(100% - 32vp)').onClick(async () => { this.message = ''; if (this.onlyNum) { this.type = TUI_PIN_MODIFY; @@ -94,17 +94,17 @@ export struct PageOne { } try { await TrustedAuth.TestGenKeyForTuiPinSign(); - hilog.info(DOMAIN, 'testTag', '生成密钥成功'); + hilog.info(DOMAIN, 'testTag', 'Generate Key Success'); let session = await TrustedAuth.SignInit(); - hilog.info(DOMAIN, 'testTag', '签名初始化完成'); + hilog.info(DOMAIN, 'testTag', 'Signature Initialization success'); let indata: string = 'aaabbb'; await TrustedAuth.UserAuthTUIPINBeforeSign(indata, session, this.type, 'pin_label1'); - this.message += `修改数字盾密码成功`; + this.message += $r('app.string.ModifyPwSuccess'); this.hasShield = true; } catch (error) { - // 捕获错误并处理 - hilog.error(DOMAIN, 'testTag', '检查失败:', error); - this.message += `修改数字盾密码失败: ${error}`; + // catch error + hilog.error(DOMAIN, 'testTag', 'Modify Pw Fail:', error); + this.message += $r('app.string.ModifyPwFail')+`: ${error}`; } this.promptAction.openToast({ message: this.message, @@ -114,7 +114,7 @@ export struct PageOne { }).margin({ bottom: 16 }) } else{ - Button('立即开通').width('calc(100% - 32vp)').onClick(async () => { + Button($r('app.string.OpenWord')).width('calc(100% - 32vp)').onClick(async () => { this.message = ''; if (this.onlyNum) { this.type = TUI_PIN_SET; @@ -123,17 +123,17 @@ export struct PageOne { } try { await TrustedAuth.TestGenKeyForTuiPinSign(); - hilog.info(DOMAIN, 'testTag', '生成密钥成功'); + hilog.info(DOMAIN, 'testTag', 'GenerateKeySuccess'); let session = await TrustedAuth.SignInit(); - hilog.info(DOMAIN, 'testTag', '签名初始化完成'); + hilog.info(DOMAIN, 'testTag', 'Signature Initialization success'); let indata: string = 'aaabbb'; await TrustedAuth.UserAuthTUIPINBeforeSign(indata, session, this.type, 'pin_label1'); - this.message += `开通数字盾成功`; + this.message += $r('app.string.OpenShieldSuccess'); this.hasShield = true; } catch (error) { - // 捕获错误并处理 - hilog.error(DOMAIN, 'testTag', '检查失败:', error); - this.message += `\n\n开通数字盾失败: ${error}`; + // catch error + hilog.error(DOMAIN, 'testTag', 'OpenShield Fail:', error); + this.message += $r('app.string.OpenShieldFail')+`: ${error}`; } this.promptAction.openToast({ message: this.message, @@ -144,7 +144,7 @@ export struct PageOne { } }.width('100%').height('100%') } - .title('数字盾') + .title($r('app.string.DigitalShield')) .backgroundColor('#F1F3F5') } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/PageTwo.ets b/entry/src/main/ets/pages/TradingPage.ets similarity index 70% rename from entry/src/main/ets/pages/PageTwo.ets rename to entry/src/main/ets/pages/TradingPage.ets index b81f3d2..1b0ce10 100644 --- a/entry/src/main/ets/pages/PageTwo.ets +++ b/entry/src/main/ets/pages/TradingPage.ets @@ -23,8 +23,8 @@ const TUI_CONTENT_FINGERPRINT_VERIFY = 6 const DOMAIN = 0x0000 @Builder -export function PageTwoBuilder() { - PageTwo() +export function TradingPageBuilder() { + TradingPage() } @Builder @@ -45,17 +45,17 @@ export struct BindSheetTemp { build() { Column({ space: 12 }) { - Button('密码交易认证').width('calc(100% - 32vp)').buttonStyle(ButtonStyleMode.NORMAL).onClick(async () => { + Button($r('app.string.PINVerification')).width('calc(100% - 32vp)').buttonStyle(ButtonStyleMode.NORMAL).onClick(async () => { this.message = ''; try { let session = await TrustedAuth.SignInit(); - hilog.info(DOMAIN, 'testTag', '签名初始化完成'); + hilog.info(DOMAIN, 'testTag', 'Signature Initialization success'); let indata: string = this.receiver + '/' + this.receiveAccount + '/' + this.tradingAmount; await TrustedAuth.UserAuthTUIPINBeforeSign(indata, session, TUI_CONTENT_PWD_VERIFY, 'pin_label1'); - this.message += `密码交易认证成功`; + this.message += $r('app.string.PINVerificationSuccess'); } catch (error) { - hilog.error(DOMAIN, 'testTag', 'n密码交易认证失败:', error); - this.message += `密码交易认证失败: ${error}`; + hilog.error(DOMAIN, 'testTag', 'PIN Verification Fail:', error); + this.message += $r('app.string.PINVerificationFail')+ `: ${error}`; } this.promptAction.openToast({ message: this.message, @@ -63,11 +63,11 @@ export struct BindSheetTemp { }) }); if (this.fingerprintBind) { - Button('指纹交易认证').width('calc(100% - 32vp)').buttonStyle(ButtonStyleMode.NORMAL).onClick(async () => { + Button($r('app.string.FingerprintVerification')).width('calc(100% - 32vp)').buttonStyle(ButtonStyleMode.NORMAL).onClick(async () => { this.message = ''; try { let session = await TrustedAuth.SignInit(); - hilog.info(DOMAIN, 'testTag', '签名初始化完成'); + hilog.info(DOMAIN, 'testTag', 'Signature Initialization success'); const tuiAuthToken: Uint8Array = await TrustedAuth.GetTUIAuthTokenBeforeBioVerify(session, TUI_CONTENT_FINGERPRINT_VERIFY, 'pin_label1'); let bioAuthToken: Uint8Array = @@ -76,14 +76,14 @@ export struct BindSheetTemp { let resignAuthToken = await trustedAuthentication.getBiometricAuthToken(operType, tuiAuthToken, bioAuthToken); await TrustedAuth.HuksSignAndVerify(session, resignAuthToken.authToken) - this.message += `指纹交易认证成功`; + this.message += $r('app.string.FingerprintVerificationSuccess'); } catch (error) { - hilog.error(DOMAIN, 'testTag', 'n指纹交易认证失败:', error); + hilog.error(DOMAIN, 'testTag', 'Fingerprint Verification Fail:', error); if(error.code === 1019100019){ - this.message += `指纹交易认证失败:请用数字盾的指纹进行认证,多次失败请返回上一页解绑后重新绑定`; + this.message += $r('app.string.FingerprintVerificationFailWithNotification'); } else{ - this.message += `\n\n指纹交易认证失败: ${error}`; + this.message += $r('app.string.FingerprintVerificationFail')+ `: ${error}`; } } this.promptAction.openToast({ @@ -93,11 +93,11 @@ export struct BindSheetTemp { }); } if (this.faceBind) { - Button('人脸交易认证').width('calc(100% - 32vp)').buttonStyle(ButtonStyleMode.NORMAL).onClick(async () => { + Button($r('app.string.FaceVerification')).width('calc(100% - 32vp)').buttonStyle(ButtonStyleMode.NORMAL).onClick(async () => { this.message = ''; try { let session = await TrustedAuth.SignInit(); - hilog.info(DOMAIN, 'testTag', '签名初始化完成'); + hilog.info(DOMAIN, 'testTag', 'Signature Initialization success'); const tuiAuthToken: Uint8Array = await TrustedAuth.GetTUIAuthTokenBeforeBioVerify(session, TUI_CONTENT_FACE_VERIFY, 'pin_label1'); let bioAuthToken: Uint8Array = @@ -106,14 +106,14 @@ export struct BindSheetTemp { let resignAuthToken = await trustedAuthentication.getBiometricAuthToken(operType, tuiAuthToken, bioAuthToken); await TrustedAuth.HuksSignAndVerify(session, resignAuthToken.authToken) - this.message += `人脸交易认证成功`; + this.message += $r('app.string.FaceVerificationSuccess'); } catch (error) { - hilog.error(DOMAIN, 'testTag', 'n人脸交易认证失败:', error); + hilog.error(DOMAIN, 'testTag', 'Face Verification Fail:', error); if(error.code === 1019100019){ - this.message += `人脸交易认证失败:请确认认证信息是否正确,多次失败请返回上一页解绑后重新绑定`; + this.message += $r('app.string.FaceVerificationFailWithNotification'); } else{ - this.message += `\n\n人脸交易认证失败: ${error}`; + this.message += $r('app.string.FaceVerificationFail')+ `: ${error}`; } } this.promptAction.openToast({ @@ -127,14 +127,14 @@ export struct BindSheetTemp { } @Component -export struct PageTwo { +export struct TradingPage { @State onlyNum: boolean = true; @Provide receiver: string = ''; @Provide receiveAccount: string = ''; @Provide tradingAmount: string = ''; @State bindSheetShow: boolean = false; pageInfos: NavPathStack = new NavPathStack(); - sheetTitleOption: SheetTitleOptions = { title: '选择认证方式' } + sheetTitleOption: SheetTitleOptions = { title: $r('app.string.ChooseVerificationMethod') } sheetOption: SheetOptions = { height: SheetSize.FIT_CONTENT, title: this.sheetTitleOption } build() { @@ -143,8 +143,8 @@ export struct PageTwo { Column() { Blank().height(4) Row() { - Text('收款人').width('20%').fontSize(14).textAlign(TextAlign.Start).margin({ left: 12 }) - TextArea({ placeholder: '张某某', text: this.receiver }) + Text($r('app.string.Recipient')).width('20%').fontSize(14).textAlign(TextAlign.Start).margin({ left: 12 }) + TextArea({ placeholder: $r('app.string.MRZhang'), text: this.receiver }) .width('75%') .fontSize(16) .backgroundColor(Color.White) @@ -152,7 +152,7 @@ export struct PageTwo { Divider().width('93%') Row() { - Text('收款账号').width('20%').fontSize(14).textAlign(TextAlign.Start).margin({ left: 12 }) + Text($r('app.string.AccountNumber')).width('20%').fontSize(14).textAlign(TextAlign.Start).margin({ left: 12 }) TextArea({ placeholder: '6666 1234 **** **** 888', text: this.receiveAccount }) .width('75%') .fontSize(16) @@ -161,7 +161,7 @@ export struct PageTwo { Divider().width('93%') Row() { - Text('交易金额').width('20%').fontSize(14).textAlign(TextAlign.Start).margin({ left: 12 }) + Text($r('app.string.TradingAmount')).width('20%').fontSize(14).textAlign(TextAlign.Start).margin({ left: 12 }) TextArea({ placeholder: '0.0', text: this.tradingAmount }) .width('75%') .fontSize(16) @@ -180,14 +180,14 @@ export struct PageTwo { bottom: 24 }) - Button('下一步').width('calc(100% - 32vp)') + Button($r('app.string.NextWord')).width('calc(100% - 32vp)') .onClick(() => { this.bindSheetShow = true; }) .bindSheet(this.bindSheetShow!!, BindSheetBuilder(), this.sheetOption); } } - .title('银行卡转账') + .title($r('app.string.TransactionWord')) .backgroundColor('#F1F3F5') } } \ No newline at end of file diff --git a/entry/src/main/ets/Utils/AssetUtils.ets b/entry/src/main/ets/utils/AssetUtils.ets similarity index 97% rename from entry/src/main/ets/Utils/AssetUtils.ets rename to entry/src/main/ets/utils/AssetUtils.ets index 6033fea..1e525d5 100644 --- a/entry/src/main/ets/Utils/AssetUtils.ets +++ b/entry/src/main/ets/utils/AssetUtils.ets @@ -64,7 +64,7 @@ class AssetUtils { } } - async UpdateDataToAssetStore(newData: Uint8Array, name: string, label: string): Promise { + UpdateDataToAssetStore(newData: Uint8Array, name: string, label: string): void { let query: asset.AssetMap = new Map(); query.set(asset.Tag.ALIAS, this.stringToArray(name)); let attrsToUpdate: asset.AssetMap = new Map(); diff --git a/entry/src/main/ets/Common/TrustedServiceOption.ets b/entry/src/main/ets/utils/TrustedServiceOption.ets similarity index 100% rename from entry/src/main/ets/Common/TrustedServiceOption.ets rename to entry/src/main/ets/utils/TrustedServiceOption.ets diff --git a/entry/src/main/resources/base/element/string.json b/entry/src/main/resources/base/element/string.json index 8fb7a77..cc9f5b7 100644 --- a/entry/src/main/resources/base/element/string.json +++ b/entry/src/main/resources/base/element/string.json @@ -14,7 +14,246 @@ }, { "name": "reason", - "value": "申请必要权限" + "value": "Apply Necessary Rights" + }, + { + "name": "IDSetting", + "value": "Setting" + }, + { + "name": "DigitalShield", + "value": "Digital Shield" + }, + { + "name": "ModifyPassword", + "value": "Modify Password" + }, + { + "name": "OpenWord", + "value": "Enable" + }, + { + "name": "CloseShield", + "value": "Unable shield" + }, + { + "name": "CloseShieldWithVerification", + "value": "Unable shield with verification" + }, + { + "name": "CloseWord", + "value": "Unable" + }, + { + "name": "FinishSignatureInitialization", + "value": "Signature initialization finish" + }, + { + "name": "CloseShieldSuccess", + "value": "Unable shield success" + }, + { + "name": "CloseShieldFail", + "value": "Unable shield fail" + }, + { + "name": "CloseShieldWithoutVerification", + "value": "Unable shield without Verification" + }, + { + "name": "BioFeatureVerification", + "value": "Bio verification method" + }, + { + "name": "Fingerprint", + "value": "Fingerprint" + }, + { + "name": "Bind", + "value": "Bind" + }, + { + "name": "BindFingerprintSuccess", + "value": "Bind fingerprint success" + }, + { + "name": "BindFingerprintFail", + "value": "Bind fingerprint fail" + }, + { + "name": "BindFingerprintFailWithNotification", + "value": "Bind fingerprint fail:please bind bio feature in system setting" + }, + { + "name": "FingerprintBound", + "value": "Fingerprint--Bound" + }, + { + "name": "UnBound", + "value": "Unbound" + }, + { + "name": "UnBoundFingerprintSuccess", + "value": "Unbound fingerprint success" + }, + { + "name": "UnBoundFingerprintFail", + "value": "Unbound fingerprint fail" + }, + { + "name": "Face", + "value": "Face" + }, + { + "name": "BindFaceSuccess", + "value": "Bind face success" + }, + { + "name": "BindFaceFail", + "value": "Bind face fail" + }, + { + "name": "BindFaceFailWithNotification", + "value": "Bind face fail:please bind bio feature in system setting" + }, + { + "name": "FaceBound", + "value": "Face--Bound" + }, + { + "name": "UnBoundFaceSuccess", + "value": "Unbound face success" + }, + { + "name": "UnBoundFaceFail", + "value": "Unbound face fail" + }, + { + "name": "Trade", + "value": "Transfer" + }, + { + "name": "FinDigitalShield", + "value": "Financial Digital Shield" + }, + { + "name": "PlzSetVerificationWay", + "value": "Verification method setting" + }, + { + "name": "PureNumber", + "value": "Pure Number" + }, + { + "name": "NumberPlusAlphabet", + "value": "Number + Alphabet" + }, + { + "name": "ModifyWord", + "value": "Modify" + }, + { + "name": "GenerateKeySuccess", + "value": "Generate key success" + }, + { + "name": "ModifyPwSuccess", + "value": "Modify password success" + }, + { + "name": "ModifyPwFail", + "value": "Modify password fail" + }, + { + "name": "OpenShieldSuccess", + "value": "Enable Shield Success" + }, + { + "name": "OpenShieldFail", + "value": "Enable Shield Fail" + }, + { + "name": "ChooseVerificationMethod", + "value": "Choose verification method" + }, + { + "name": "Recipient", + "value": "Recipient" + }, + { + "name": "MRZhang", + "value": "Mr.Zhang" + }, + { + "name": "AccountNumber", + "value": "Target account number" + }, + { + "name": "TradingAmount", + "value": "Transaction amount" + }, + { + "name": "NextWord", + "value": "Next" + }, + { + "name": "TransactionWord", + "value": "Transaction" + }, + { + "name": "ShieldPwVerification", + "value": "Shield PIN verification" + }, + { + "name": "OpenShield", + "value": "Enable Shield" + }, + { + "name": "ModifyShield", + "value": "Modify Shield" + }, + { + "name": "FaceVerification", + "value": "Face Verification" + }, + { + "name": "FingerprintVerification", + "value": "Fingerprint Verification" + }, + { + "name": "PINVerification", + "value": "Pin Verification" + }, + { + "name": "PINVerificationSuccess", + "value": "PIN verification success" + }, + { + "name": "PINVerificationFail", + "value": "PIN verification fail" + }, + { + "name": "FingerprintVerificationSuccess", + "value": "Fingerprint verification success" + }, + { + "name": "FingerprintVerificationFail", + "value": "Fingerprint verification fail" + },{ + "name": "FingerprintVerificationFailWithNotification", + "value": "Fingerprint verification fail:please use the bound fingerprint,unbound after mutiple trys" + }, + { + "name": "FaceVerificationSuccess", + "value": "Face verification success" + }, + { + "name": "FaceVerificationFail", + "value": "Face verification fail" + }, + { + "name": "FaceVerificationFailWithNotification", + "value": "Face verification fail:please check the bound info,unbound after mutiple trys" } ] } \ No newline at end of file diff --git a/entry/src/main/resources/base/profile/router_map.json b/entry/src/main/resources/base/profile/router_map.json index 868d93f..05daf5b 100644 --- a/entry/src/main/resources/base/profile/router_map.json +++ b/entry/src/main/resources/base/profile/router_map.json @@ -9,19 +9,19 @@ } }, { - "name": "PageOne", - "pageSourceFile": "src/main/ets/pages/PageOne.ets", - "buildFunction": "PageOneBuilder", + "name": "PasswordSelectionPage", + "pageSourceFile": "src/main/ets/pages/PasswordSelectionPage.ets", + "buildFunction": "PasswordSelectionPageBuilder", "data": { - "description": "this is pageOne" + "description": "this is PasswordSelectionPage" } }, { - "name": "PageTwo", - "pageSourceFile": "src/main/ets/pages/PageTwo.ets", - "buildFunction": "PageTwoBuilder", + "name": "TradingPage", + "pageSourceFile": "src/main/ets/pages/TradingPage.ets", + "buildFunction": "TradingPageBuilder", "data": { - "description": "this is pageTwo" + "description": "this is TradingPage" } } ] diff --git a/entry/src/main/resources/en_US/element/color.json b/entry/src/main/resources/en_US/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/entry/src/main/resources/en_US/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/entry/src/main/resources/en_US/element/float.json b/entry/src/main/resources/en_US/element/float.json new file mode 100644 index 0000000..a0a93dd --- /dev/null +++ b/entry/src/main/resources/en_US/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "page_text_font_size", + "value": "50fp" + } + ] +} \ No newline at end of file diff --git a/entry/src/main/resources/en_US/element/string.json b/entry/src/main/resources/en_US/element/string.json new file mode 100644 index 0000000..cc9f5b7 --- /dev/null +++ b/entry/src/main/resources/en_US/element/string.json @@ -0,0 +1,259 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "TestDigitalShield" + }, + { + "name": "reason", + "value": "Apply Necessary Rights" + }, + { + "name": "IDSetting", + "value": "Setting" + }, + { + "name": "DigitalShield", + "value": "Digital Shield" + }, + { + "name": "ModifyPassword", + "value": "Modify Password" + }, + { + "name": "OpenWord", + "value": "Enable" + }, + { + "name": "CloseShield", + "value": "Unable shield" + }, + { + "name": "CloseShieldWithVerification", + "value": "Unable shield with verification" + }, + { + "name": "CloseWord", + "value": "Unable" + }, + { + "name": "FinishSignatureInitialization", + "value": "Signature initialization finish" + }, + { + "name": "CloseShieldSuccess", + "value": "Unable shield success" + }, + { + "name": "CloseShieldFail", + "value": "Unable shield fail" + }, + { + "name": "CloseShieldWithoutVerification", + "value": "Unable shield without Verification" + }, + { + "name": "BioFeatureVerification", + "value": "Bio verification method" + }, + { + "name": "Fingerprint", + "value": "Fingerprint" + }, + { + "name": "Bind", + "value": "Bind" + }, + { + "name": "BindFingerprintSuccess", + "value": "Bind fingerprint success" + }, + { + "name": "BindFingerprintFail", + "value": "Bind fingerprint fail" + }, + { + "name": "BindFingerprintFailWithNotification", + "value": "Bind fingerprint fail:please bind bio feature in system setting" + }, + { + "name": "FingerprintBound", + "value": "Fingerprint--Bound" + }, + { + "name": "UnBound", + "value": "Unbound" + }, + { + "name": "UnBoundFingerprintSuccess", + "value": "Unbound fingerprint success" + }, + { + "name": "UnBoundFingerprintFail", + "value": "Unbound fingerprint fail" + }, + { + "name": "Face", + "value": "Face" + }, + { + "name": "BindFaceSuccess", + "value": "Bind face success" + }, + { + "name": "BindFaceFail", + "value": "Bind face fail" + }, + { + "name": "BindFaceFailWithNotification", + "value": "Bind face fail:please bind bio feature in system setting" + }, + { + "name": "FaceBound", + "value": "Face--Bound" + }, + { + "name": "UnBoundFaceSuccess", + "value": "Unbound face success" + }, + { + "name": "UnBoundFaceFail", + "value": "Unbound face fail" + }, + { + "name": "Trade", + "value": "Transfer" + }, + { + "name": "FinDigitalShield", + "value": "Financial Digital Shield" + }, + { + "name": "PlzSetVerificationWay", + "value": "Verification method setting" + }, + { + "name": "PureNumber", + "value": "Pure Number" + }, + { + "name": "NumberPlusAlphabet", + "value": "Number + Alphabet" + }, + { + "name": "ModifyWord", + "value": "Modify" + }, + { + "name": "GenerateKeySuccess", + "value": "Generate key success" + }, + { + "name": "ModifyPwSuccess", + "value": "Modify password success" + }, + { + "name": "ModifyPwFail", + "value": "Modify password fail" + }, + { + "name": "OpenShieldSuccess", + "value": "Enable Shield Success" + }, + { + "name": "OpenShieldFail", + "value": "Enable Shield Fail" + }, + { + "name": "ChooseVerificationMethod", + "value": "Choose verification method" + }, + { + "name": "Recipient", + "value": "Recipient" + }, + { + "name": "MRZhang", + "value": "Mr.Zhang" + }, + { + "name": "AccountNumber", + "value": "Target account number" + }, + { + "name": "TradingAmount", + "value": "Transaction amount" + }, + { + "name": "NextWord", + "value": "Next" + }, + { + "name": "TransactionWord", + "value": "Transaction" + }, + { + "name": "ShieldPwVerification", + "value": "Shield PIN verification" + }, + { + "name": "OpenShield", + "value": "Enable Shield" + }, + { + "name": "ModifyShield", + "value": "Modify Shield" + }, + { + "name": "FaceVerification", + "value": "Face Verification" + }, + { + "name": "FingerprintVerification", + "value": "Fingerprint Verification" + }, + { + "name": "PINVerification", + "value": "Pin Verification" + }, + { + "name": "PINVerificationSuccess", + "value": "PIN verification success" + }, + { + "name": "PINVerificationFail", + "value": "PIN verification fail" + }, + { + "name": "FingerprintVerificationSuccess", + "value": "Fingerprint verification success" + }, + { + "name": "FingerprintVerificationFail", + "value": "Fingerprint verification fail" + },{ + "name": "FingerprintVerificationFailWithNotification", + "value": "Fingerprint verification fail:please use the bound fingerprint,unbound after mutiple trys" + }, + { + "name": "FaceVerificationSuccess", + "value": "Face verification success" + }, + { + "name": "FaceVerificationFail", + "value": "Face verification fail" + }, + { + "name": "FaceVerificationFailWithNotification", + "value": "Face verification fail:please check the bound info,unbound after mutiple trys" + } + ] +} \ No newline at end of file diff --git a/entry/src/main/resources/zh_CN/element/color.json b/entry/src/main/resources/zh_CN/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/entry/src/main/resources/zh_CN/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/entry/src/main/resources/zh_CN/element/float.json b/entry/src/main/resources/zh_CN/element/float.json new file mode 100644 index 0000000..a0a93dd --- /dev/null +++ b/entry/src/main/resources/zh_CN/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "page_text_font_size", + "value": "50fp" + } + ] +} \ No newline at end of file diff --git a/entry/src/main/resources/zh_CN/element/string.json b/entry/src/main/resources/zh_CN/element/string.json new file mode 100644 index 0000000..1fb6260 --- /dev/null +++ b/entry/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,259 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "TestDigitalShield" + }, + { + "name": "reason", + "value": "申请必要权限" + }, + { + "name": "IDSetting", + "value": "身份认证设置" + }, + { + "name": "DigitalShield", + "value": "数字盾" + }, + { + "name": "ModifyPassword", + "value": "修改密码" + }, + { + "name": "OpenWord", + "value": "立即开通" + }, + { + "name": "CloseShield", + "value": "关闭数字盾" + }, + { + "name": "CloseShieldWithVerification", + "value": "需认证关闭数字盾" + }, + { + "name": "CloseWord", + "value": "关闭" + }, + { + "name": "FinishSignatureInitialization", + "value": "签名初始化完成" + }, + { + "name": "CloseShieldSuccess", + "value": "关闭数字盾成功" + }, + { + "name": "CloseShieldFail", + "value": "关闭数字盾失败" + }, + { + "name": "CloseShieldWithoutVerification", + "value": "无需认证关闭数字盾" + }, + { + "name": "BioFeatureVerification", + "value": "生物特征认证方式" + }, + { + "name": "Fingerprint", + "value": "指纹识别" + }, + { + "name": "Bind", + "value": "绑定" + }, + { + "name": "BindFingerprintSuccess", + "value": "指纹绑定成功" + }, + { + "name": "BindFingerprintFail", + "value": "指纹绑定失败" + }, + { + "name": "BindFingerprintFailWithNotification", + "value": "指纹绑定失败:请前往系统界面绑定生物信息" + }, + { + "name": "FingerprintBound", + "value": "指纹识别--已绑定" + }, + { + "name": "UnBound", + "value": "解绑" + }, + { + "name": "UnBoundFingerprintSuccess", + "value": "解绑指纹成功" + }, + { + "name": "UnBoundFingerprintFail", + "value": "解绑指纹失败" + }, + { + "name": "Face", + "value": "人脸识别" + }, + { + "name": "BindFaceSuccess", + "value": "人脸绑定成功" + }, + { + "name": "BindFaceFail", + "value": "人脸绑定失败" + }, + { + "name": "BindFaceFailWithNotification", + "value": "人脸绑定失败:请前往系统界面绑定生物信息" + }, + { + "name": "FaceBound", + "value": "人脸识别--已绑定" + }, + { + "name": "UnBoundFaceSuccess", + "value": "解绑人脸成功" + }, + { + "name": "UnBoundFaceFail", + "value": "解绑人脸失败" + }, + { + "name": "Trade", + "value": "去转账" + }, + { + "name": "FinDigitalShield", + "value": "金融数字盾" + }, + { + "name": "PlzSetVerificationWay", + "value": "请设定数字盾的验证方式" + }, + { + "name": "PureNumber", + "value": "数字密码" + }, + { + "name": "NumberPlusAlphabet", + "value": "数字+英文组合密码" + }, + { + "name": "ModifyWord", + "value": "立即修改" + }, + { + "name": "GenerateKeySuccess", + "value": "生成密钥成功" + }, + { + "name": "ModifyPwSuccess", + "value": "修改数字盾密码成功" + }, + { + "name": "ModifyPwFail", + "value": "修改数字盾密码失败" + }, + { + "name": "OpenShieldSuccess", + "value": "开通数字盾成功" + }, + { + "name": "OpenShieldFail", + "value": "开通数字盾失败" + }, + { + "name": "ChooseVerificationMethod", + "value": "选择认证方式" + }, + { + "name": "Recipient", + "value": "收款人" + }, + { + "name": "MRZhang", + "value": "张某某" + }, + { + "name": "AccountNumber", + "value": "收款账号" + }, + { + "name": "TradingAmount", + "value": "交易金额" + }, + { + "name": "NextWord", + "value": "下一步" + }, + { + "name": "TransactionWord", + "value": "银行卡转账" + }, + { + "name": "ShieldPwVerification", + "value": "数字盾密码验证" + }, + { + "name": "OpenShield", + "value": "开通数字盾" + }, + { + "name": "ModifyShield", + "value": "修改金融盾" + }, + { + "name": "FaceVerification", + "value": "人脸交易认证" + }, + { + "name": "FingerprintVerification", + "value": "指纹交易认证" + }, + { + "name": "PINVerification", + "value": "密码交易认证" + }, + { + "name": "PINVerificationSuccess", + "value": "密码交易认证成功" + }, + { + "name": "PINVerificationFail", + "value": "密码交易认证失败" + }, + { + "name": "FingerprintVerificationSuccess", + "value": "指纹交易认证成功" + }, + { + "name": "FingerprintVerificationFail", + "value": "指纹交易认证失败" + },{ + "name": "FingerprintVerificationFailWithNotification", + "value": "指纹交易认证失败:请用数字盾的指纹进行认证,多次失败请返回上一页解绑后重新绑定," + }, + { + "name": "FaceVerificationSuccess", + "value": "人脸交易认证成功" + }, + { + "name": "FaceVerificationFail", + "value": "人脸交易认证失败" + }, + { + "name": "FaceVerificationFailWithNotification", + "value": "人脸交易认证失败:请确认认证信息是否正确,多次失败请返回上一页解绑后重新绑定" + } + ] +} \ No newline at end of file -- Gitee