1e41f4b71Sopenharmony_ci# HUKS Access Control Development 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci 4e41f4b71Sopenharmony_ciFor details about scenarios and related concepts, see [HUKS Access Control Overview](huks-identity-authentication-overview.md). 5e41f4b71Sopenharmony_ci 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci## How to Develop 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci1. Generate a key, enable fingerprint authentication for key access, and set related parameters. 10e41f4b71Sopenharmony_ci When a key is generated or imported, set [HuksUserAuthType](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksuserauthtype9), [HuksAuthAccessType](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksauthaccesstype9), and [HuksChallengeType](../../reference/apis-universal-keystore-kit/js-apis-huks.md#hukschallengetype9). 11e41f4b71Sopenharmony_ci 12e41f4b71Sopenharmony_ci```ts 13e41f4b71Sopenharmony_ciimport { huks } from '@kit.UniversalKeystoreKit'; 14e41f4b71Sopenharmony_ci 15e41f4b71Sopenharmony_ci/* 16e41f4b71Sopenharmony_ci* Set the key alias and encapsulate the key property set. 17e41f4b71Sopenharmony_ci*/ 18e41f4b71Sopenharmony_cilet keyAlias = 'test_sm4_key_alias'; 19e41f4b71Sopenharmony_cilet properties: Array<huks.HuksParam> = [{ 20e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_ALGORITHM, 21e41f4b71Sopenharmony_ci value: huks.HuksKeyAlg.HUKS_ALG_SM4 22e41f4b71Sopenharmony_ci}, { 23e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_PURPOSE, 24e41f4b71Sopenharmony_ci value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT 25e41f4b71Sopenharmony_ci}, { 26e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, 27e41f4b71Sopenharmony_ci value: huks.HuksKeySize.HUKS_SM4_KEY_SIZE_128, 28e41f4b71Sopenharmony_ci}, { 29e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, 30e41f4b71Sopenharmony_ci value: huks.HuksCipherMode.HUKS_MODE_CBC, 31e41f4b71Sopenharmony_ci}, { 32e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_PADDING, 33e41f4b71Sopenharmony_ci value: huks.HuksKeyPadding.HUKS_PADDING_NONE, 34e41f4b71Sopenharmony_ci}, 35e41f4b71Sopenharmony_ci // Set HuksUserAuthType to fingerprint authentication. 36e41f4b71Sopenharmony_ci { 37e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_USER_AUTH_TYPE, 38e41f4b71Sopenharmony_ci value: huks.HuksUserAuthType.HUKS_USER_AUTH_TYPE_FINGERPRINT 39e41f4b71Sopenharmony_ci }, 40e41f4b71Sopenharmony_ci // Set HuksAuthAccessType to HUKS_AUTH_ACCESS_INVALID_NEW_BIO_ENROLL, which invalidates the key when a new biometric feature (fingerprint) is enrolled. 41e41f4b71Sopenharmony_ci { 42e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_KEY_AUTH_ACCESS_TYPE, 43e41f4b71Sopenharmony_ci value: huks.HuksAuthAccessType.HUKS_AUTH_ACCESS_INVALID_NEW_BIO_ENROLL 44e41f4b71Sopenharmony_ci }, 45e41f4b71Sopenharmony_ci // Use the default challenge type. 46e41f4b71Sopenharmony_ci { 47e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_CHALLENGE_TYPE, 48e41f4b71Sopenharmony_ci value: huks.HuksChallengeType.HUKS_CHALLENGE_TYPE_NORMAL 49e41f4b71Sopenharmony_ci }]; 50e41f4b71Sopenharmony_ci 51e41f4b71Sopenharmony_cilet huksOptions: huks.HuksOptions = { 52e41f4b71Sopenharmony_ci properties: properties, 53e41f4b71Sopenharmony_ci inData: new Uint8Array(new Array()) 54e41f4b71Sopenharmony_ci} 55e41f4b71Sopenharmony_ci 56e41f4b71Sopenharmony_ci/* 57e41f4b71Sopenharmony_ci * Generate a key. 58e41f4b71Sopenharmony_ci */ 59e41f4b71Sopenharmony_ciclass throwObject { 60e41f4b71Sopenharmony_ci isThrow: boolean = false 61e41f4b71Sopenharmony_ci} 62e41f4b71Sopenharmony_ci 63e41f4b71Sopenharmony_cifunction generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) { 64e41f4b71Sopenharmony_ci return new Promise<void>((resolve, reject) => { 65e41f4b71Sopenharmony_ci try { 66e41f4b71Sopenharmony_ci huks.generateKeyItem(keyAlias, huksOptions, (error, data) => { 67e41f4b71Sopenharmony_ci if (error) { 68e41f4b71Sopenharmony_ci reject(error); 69e41f4b71Sopenharmony_ci } else { 70e41f4b71Sopenharmony_ci resolve(data); 71e41f4b71Sopenharmony_ci } 72e41f4b71Sopenharmony_ci }); 73e41f4b71Sopenharmony_ci } catch (error) { 74e41f4b71Sopenharmony_ci throwObject.isThrow = true; 75e41f4b71Sopenharmony_ci throw (error as Error); 76e41f4b71Sopenharmony_ci } 77e41f4b71Sopenharmony_ci }); 78e41f4b71Sopenharmony_ci} 79e41f4b71Sopenharmony_ci 80e41f4b71Sopenharmony_ciasync function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) { 81e41f4b71Sopenharmony_ci console.info(`enter promise generateKeyItem`); 82e41f4b71Sopenharmony_ci let throwObject: throwObject = { isThrow: false }; 83e41f4b71Sopenharmony_ci try { 84e41f4b71Sopenharmony_ci await generateKeyItem(keyAlias, huksOptions, throwObject) 85e41f4b71Sopenharmony_ci .then((data) => { 86e41f4b71Sopenharmony_ci console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`); 87e41f4b71Sopenharmony_ci }) 88e41f4b71Sopenharmony_ci .catch((error: Error) => { 89e41f4b71Sopenharmony_ci if (throwObject.isThrow) { 90e41f4b71Sopenharmony_ci throw (error as Error); 91e41f4b71Sopenharmony_ci } else { 92e41f4b71Sopenharmony_ci console.error(`promise: generateKeyItem failed, ` + JSON.stringify(error)); 93e41f4b71Sopenharmony_ci } 94e41f4b71Sopenharmony_ci }); 95e41f4b71Sopenharmony_ci } catch (error) { 96e41f4b71Sopenharmony_ci console.error(`promise: generateKeyItem input arg invalid, ` + JSON.stringify(error)); 97e41f4b71Sopenharmony_ci } 98e41f4b71Sopenharmony_ci} 99e41f4b71Sopenharmony_ci 100e41f4b71Sopenharmony_ciasync function TestGenKeyForFingerprintAccessControl() { 101e41f4b71Sopenharmony_ci await publicGenKeyFunc(keyAlias, huksOptions); 102e41f4b71Sopenharmony_ci} 103e41f4b71Sopenharmony_ci``` 104e41f4b71Sopenharmony_ci 105e41f4b71Sopenharmony_ci2. Initialize a key session to initiate fingerprint authentication. If the authentication is successful, an authentication token (**AuthToken**) is returned. 106e41f4b71Sopenharmony_ci 107e41f4b71Sopenharmony_ci```ts 108e41f4b71Sopenharmony_ciimport { huks } from '@kit.UniversalKeystoreKit'; 109e41f4b71Sopenharmony_ciimport { userAuth } from '@kit.UserAuthenticationKit'; 110e41f4b71Sopenharmony_ci 111e41f4b71Sopenharmony_ci/* 112e41f4b71Sopenharmony_ci * Set the key alias and encapsulate the key property set. 113e41f4b71Sopenharmony_ci */ 114e41f4b71Sopenharmony_cilet srcKeyAlias = 'test_sm4_key_alias'; 115e41f4b71Sopenharmony_cilet handle: number; 116e41f4b71Sopenharmony_cilet challenge: Uint8Array; 117e41f4b71Sopenharmony_cilet fingerAuthToken: Uint8Array; 118e41f4b71Sopenharmony_cilet authType = userAuth.UserAuthType.FINGERPRINT; 119e41f4b71Sopenharmony_cilet authTrustLevel = userAuth.AuthTrustLevel.ATL1; 120e41f4b71Sopenharmony_ci/* Set the key generation parameter set and key encryption parameter set. */ 121e41f4b71Sopenharmony_cilet properties: Array<huks.HuksParam> = [{ 122e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_ALGORITHM, 123e41f4b71Sopenharmony_ci value: huks.HuksKeyAlg.HUKS_ALG_SM4, 124e41f4b71Sopenharmony_ci}, { 125e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_PURPOSE, 126e41f4b71Sopenharmony_ci value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT, 127e41f4b71Sopenharmony_ci}, { 128e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, 129e41f4b71Sopenharmony_ci value: huks.HuksKeySize.HUKS_SM4_KEY_SIZE_128, 130e41f4b71Sopenharmony_ci}, { 131e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, 132e41f4b71Sopenharmony_ci value: huks.HuksCipherMode.HUKS_MODE_CBC, 133e41f4b71Sopenharmony_ci}, { 134e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_PADDING, 135e41f4b71Sopenharmony_ci value: huks.HuksKeyPadding.HUKS_PADDING_NONE, 136e41f4b71Sopenharmony_ci}, { 137e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_IV, 138e41f4b71Sopenharmony_ci value: StringToUint8Array(IV), 139e41f4b71Sopenharmony_ci}]; 140e41f4b71Sopenharmony_ci 141e41f4b71Sopenharmony_cilet huksOptions: huks.HuksOptions = { 142e41f4b71Sopenharmony_ci properties: properties, 143e41f4b71Sopenharmony_ci inData: new Uint8Array(new Array()) 144e41f4b71Sopenharmony_ci} 145e41f4b71Sopenharmony_ci 146e41f4b71Sopenharmony_ciclass throwObject { 147e41f4b71Sopenharmony_ci isThrow: boolean = false 148e41f4b71Sopenharmony_ci} 149e41f4b71Sopenharmony_ci 150e41f4b71Sopenharmony_cifunction initSession(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) { 151e41f4b71Sopenharmony_ci return new Promise<huks.HuksSessionHandle>((resolve, reject) => { 152e41f4b71Sopenharmony_ci try { 153e41f4b71Sopenharmony_ci huks.initSession(keyAlias, huksOptions, (error, data) => { 154e41f4b71Sopenharmony_ci if (error) { 155e41f4b71Sopenharmony_ci reject(error); 156e41f4b71Sopenharmony_ci } else { 157e41f4b71Sopenharmony_ci resolve(data); 158e41f4b71Sopenharmony_ci } 159e41f4b71Sopenharmony_ci }); 160e41f4b71Sopenharmony_ci } catch (error) { 161e41f4b71Sopenharmony_ci throwObject.isThrow = true; 162e41f4b71Sopenharmony_ci throw (error as Error); 163e41f4b71Sopenharmony_ci } 164e41f4b71Sopenharmony_ci }); 165e41f4b71Sopenharmony_ci} 166e41f4b71Sopenharmony_ci 167e41f4b71Sopenharmony_ciasync function publicInitFunc(keyAlias: string, huksOptions: huks.HuksOptions) { 168e41f4b71Sopenharmony_ci console.info(`enter promise doInit`); 169e41f4b71Sopenharmony_ci let throwObject: throwObject = { isThrow: false }; 170e41f4b71Sopenharmony_ci try { 171e41f4b71Sopenharmony_ci await initSession(keyAlias, huksOptions, throwObject) 172e41f4b71Sopenharmony_ci .then((data) => { 173e41f4b71Sopenharmony_ci console.info(`promise: doInit success, data = ${JSON.stringify(data)}`); 174e41f4b71Sopenharmony_ci handle = data.handle; 175e41f4b71Sopenharmony_ci challenge = data.challenge as Uint8Array; 176e41f4b71Sopenharmony_ci }) 177e41f4b71Sopenharmony_ci .catch((error: Error) => { 178e41f4b71Sopenharmony_ci if (throwObject.isThrow) { 179e41f4b71Sopenharmony_ci throw (error as Error); 180e41f4b71Sopenharmony_ci } else { 181e41f4b71Sopenharmony_ci console.error(`promise: doInit failed, ` + JSON.stringify(error)); 182e41f4b71Sopenharmony_ci } 183e41f4b71Sopenharmony_ci }); 184e41f4b71Sopenharmony_ci } catch (error) { 185e41f4b71Sopenharmony_ci console.error(`promise: doInit input arg invalid, ` + JSON.stringify(error)); 186e41f4b71Sopenharmony_ci } 187e41f4b71Sopenharmony_ci} 188e41f4b71Sopenharmony_ci 189e41f4b71Sopenharmony_cifunction userIAMAuthFinger(huksChallenge: Uint8Array) { 190e41f4b71Sopenharmony_ci // Obtain an authentication object. 191e41f4b71Sopenharmony_ci let authTypeList: userAuth.UserAuthType[] = [authType]; 192e41f4b71Sopenharmony_ci const authParam: userAuth.AuthParam = { 193e41f4b71Sopenharmony_ci challenge: huksChallenge, 194e41f4b71Sopenharmony_ci authType: authTypeList, 195e41f4b71Sopenharmony_ci authTrustLevel: userAuth.AuthTrustLevel.ATL1 196e41f4b71Sopenharmony_ci }; 197e41f4b71Sopenharmony_ci const widgetParam: userAuth.WidgetParam = { 198e41f4b71Sopenharmony_ci title: 'Enter password', 199e41f4b71Sopenharmony_ci }; 200e41f4b71Sopenharmony_ci let auth: userAuth.UserAuthInstance; 201e41f4b71Sopenharmony_ci try { 202e41f4b71Sopenharmony_ci auth = userAuth.getUserAuthInstance(authParam, widgetParam); 203e41f4b71Sopenharmony_ci console.info("get auth instance success"); 204e41f4b71Sopenharmony_ci } catch (error) { 205e41f4b71Sopenharmony_ci console.error("get auth instance failed" + JSON.stringify(error)); 206e41f4b71Sopenharmony_ci return; 207e41f4b71Sopenharmony_ci } 208e41f4b71Sopenharmony_ci // Subscribe to the authentication result. 209e41f4b71Sopenharmony_ci try { 210e41f4b71Sopenharmony_ci auth.on("result", { 211e41f4b71Sopenharmony_ci onResult(result) { 212e41f4b71Sopenharmony_ci console.info("[HUKS] -> [IAM] userAuthInstance callback result = " + JSON.stringify(result)); 213e41f4b71Sopenharmony_ci fingerAuthToken = result.token; 214e41f4b71Sopenharmony_ci } 215e41f4b71Sopenharmony_ci }); 216e41f4b71Sopenharmony_ci console.log("subscribe authentication event success"); 217e41f4b71Sopenharmony_ci } catch (error) { 218e41f4b71Sopenharmony_ci console.error("subscribe authentication event failed, " + JSON.stringify(error)); 219e41f4b71Sopenharmony_ci } 220e41f4b71Sopenharmony_ci // Start user authentication. 221e41f4b71Sopenharmony_ci try { 222e41f4b71Sopenharmony_ci auth.start(); 223e41f4b71Sopenharmony_ci console.info("authV9 start auth success"); 224e41f4b71Sopenharmony_ci } catch (error) { 225e41f4b71Sopenharmony_ci console.error("authV9 start auth failed, error = " + JSON.stringify(error)); 226e41f4b71Sopenharmony_ci } 227e41f4b71Sopenharmony_ci} 228e41f4b71Sopenharmony_ci 229e41f4b71Sopenharmony_ciasync function testInitAndAuthFinger() { 230e41f4b71Sopenharmony_ci /* Initialize the key session to obtain a challenge. */ 231e41f4b71Sopenharmony_ci await publicInitFunc(srcKeyAlias, huksOptions); 232e41f4b71Sopenharmony_ci /* Invoke userIAM to perform user identity authentication. */ 233e41f4b71Sopenharmony_ci userIAMAuthFinger(challenge); 234e41f4b71Sopenharmony_ci} 235e41f4b71Sopenharmony_ci``` 236e41f4b71Sopenharmony_ci 237e41f4b71Sopenharmony_ci3. Pass in **AuthToken** to perform data operations. 238e41f4b71Sopenharmony_ci 239e41f4b71Sopenharmony_ci```ts 240e41f4b71Sopenharmony_ci/* 241e41f4b71Sopenharmony_ci* The following uses a 128-bit SM4 key as an example. 242e41f4b71Sopenharmony_ci*/ 243e41f4b71Sopenharmony_ciimport { huks } from '@kit.UniversalKeystoreKit'; 244e41f4b71Sopenharmony_ci 245e41f4b71Sopenharmony_ci/* 246e41f4b71Sopenharmony_ci* Determine the key property set to be encapsulated. 247e41f4b71Sopenharmony_ci*/ 248e41f4b71Sopenharmony_cilet IV = '1234567890123456'; 249e41f4b71Sopenharmony_cilet cipherInData = 'Hks_SM4_Cipher_Test_101010101010101010110_string'; 250e41f4b71Sopenharmony_cilet handle: number; 251e41f4b71Sopenharmony_cilet fingerAuthToken: Uint8Array; 252e41f4b71Sopenharmony_cilet finishOutData: Uint8Array; 253e41f4b71Sopenharmony_ci 254e41f4b71Sopenharmony_ciclass throwObject { 255e41f4b71Sopenharmony_ci isThrow: boolean = false; 256e41f4b71Sopenharmony_ci} 257e41f4b71Sopenharmony_ci 258e41f4b71Sopenharmony_ci/* Set the key generation parameter set and key encryption parameter set. */ 259e41f4b71Sopenharmony_ciclass propertyEncryptType { 260e41f4b71Sopenharmony_ci tag: huks.HuksTag = huks.HuksTag.HUKS_TAG_ALGORITHM; 261e41f4b71Sopenharmony_ci value: huks.HuksKeyAlg | huks.HuksKeyPurpose | huks.HuksKeySize | huks.HuksKeyPadding | huks.HuksCipherMode 262e41f4b71Sopenharmony_ci | Uint8Array = huks.HuksKeyAlg.HUKS_ALG_SM4; 263e41f4b71Sopenharmony_ci} 264e41f4b71Sopenharmony_ci 265e41f4b71Sopenharmony_cilet propertiesEncrypt: propertyEncryptType[] = [ 266e41f4b71Sopenharmony_ci { 267e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_ALGORITHM, 268e41f4b71Sopenharmony_ci value: huks.HuksKeyAlg.HUKS_ALG_SM4, 269e41f4b71Sopenharmony_ci }, 270e41f4b71Sopenharmony_ci { 271e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_PURPOSE, 272e41f4b71Sopenharmony_ci value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT, 273e41f4b71Sopenharmony_ci }, 274e41f4b71Sopenharmony_ci { 275e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, 276e41f4b71Sopenharmony_ci value: huks.HuksKeySize.HUKS_SM4_KEY_SIZE_128, 277e41f4b71Sopenharmony_ci }, 278e41f4b71Sopenharmony_ci { 279e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_PADDING, 280e41f4b71Sopenharmony_ci value: huks.HuksKeyPadding.HUKS_PADDING_NONE, 281e41f4b71Sopenharmony_ci }, 282e41f4b71Sopenharmony_ci { 283e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, 284e41f4b71Sopenharmony_ci value: huks.HuksCipherMode.HUKS_MODE_CBC, 285e41f4b71Sopenharmony_ci }, 286e41f4b71Sopenharmony_ci { 287e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_IV, 288e41f4b71Sopenharmony_ci value: StringToUint8Array(IV), 289e41f4b71Sopenharmony_ci } 290e41f4b71Sopenharmony_ci] 291e41f4b71Sopenharmony_cilet encryptOptions: huks.HuksOptions = { 292e41f4b71Sopenharmony_ci properties: propertiesEncrypt, 293e41f4b71Sopenharmony_ci inData: new Uint8Array(new Array()) 294e41f4b71Sopenharmony_ci} 295e41f4b71Sopenharmony_ci 296e41f4b71Sopenharmony_cifunction StringToUint8Array(str: string) { 297e41f4b71Sopenharmony_ci let arr: number[] = []; 298e41f4b71Sopenharmony_ci for (let i = 0, j = str.length; i < j; ++i) { 299e41f4b71Sopenharmony_ci arr.push(str.charCodeAt(i)); 300e41f4b71Sopenharmony_ci } 301e41f4b71Sopenharmony_ci return new Uint8Array(arr); 302e41f4b71Sopenharmony_ci} 303e41f4b71Sopenharmony_ci 304e41f4b71Sopenharmony_cifunction updateSession(handle: number, huksOptions: huks.HuksOptions, token: Uint8Array, throwObject: throwObject) { 305e41f4b71Sopenharmony_ci return new Promise<huks.HuksReturnResult>((resolve, reject) => { 306e41f4b71Sopenharmony_ci try { 307e41f4b71Sopenharmony_ci huks.updateSession(handle, huksOptions, token, (error, data) => { 308e41f4b71Sopenharmony_ci if (error) { 309e41f4b71Sopenharmony_ci reject(error); 310e41f4b71Sopenharmony_ci } else { 311e41f4b71Sopenharmony_ci resolve(data); 312e41f4b71Sopenharmony_ci } 313e41f4b71Sopenharmony_ci }); 314e41f4b71Sopenharmony_ci } catch (error) { 315e41f4b71Sopenharmony_ci throwObject.isThrow = true; 316e41f4b71Sopenharmony_ci throw (error as Error); 317e41f4b71Sopenharmony_ci } 318e41f4b71Sopenharmony_ci }); 319e41f4b71Sopenharmony_ci} 320e41f4b71Sopenharmony_ci 321e41f4b71Sopenharmony_ciasync function publicUpdateFunc(handle: number, token: Uint8Array, huksOptions: huks.HuksOptions) { 322e41f4b71Sopenharmony_ci console.info(`enter promise doUpdate`); 323e41f4b71Sopenharmony_ci let throwObject: throwObject = { isThrow: false }; 324e41f4b71Sopenharmony_ci try { 325e41f4b71Sopenharmony_ci await updateSession(handle, huksOptions, token, throwObject) 326e41f4b71Sopenharmony_ci .then((data) => { 327e41f4b71Sopenharmony_ci console.info(`promise: doUpdate success, data = ${JSON.stringify(data)}`); 328e41f4b71Sopenharmony_ci }) 329e41f4b71Sopenharmony_ci .catch((error: Error) => { 330e41f4b71Sopenharmony_ci if (throwObject.isThrow) { 331e41f4b71Sopenharmony_ci throw (error as Error); 332e41f4b71Sopenharmony_ci } else { 333e41f4b71Sopenharmony_ci console.error(`promise: doUpdate failed, ` + JSON.stringify(error)); 334e41f4b71Sopenharmony_ci } 335e41f4b71Sopenharmony_ci }); 336e41f4b71Sopenharmony_ci } catch (error) { 337e41f4b71Sopenharmony_ci console.error(`promise: doUpdate input arg invalid, ` + JSON.stringify(error)); 338e41f4b71Sopenharmony_ci } 339e41f4b71Sopenharmony_ci} 340e41f4b71Sopenharmony_ci 341e41f4b71Sopenharmony_cifunction finishSession(handle: number, huksOptions: huks.HuksOptions, token: Uint8Array, throwObject: throwObject) { 342e41f4b71Sopenharmony_ci return new Promise<huks.HuksReturnResult>((resolve, reject) => { 343e41f4b71Sopenharmony_ci try { 344e41f4b71Sopenharmony_ci huks.finishSession(handle, huksOptions, token, (error, data) => { 345e41f4b71Sopenharmony_ci if (error) { 346e41f4b71Sopenharmony_ci reject(error); 347e41f4b71Sopenharmony_ci } else { 348e41f4b71Sopenharmony_ci resolve(data); 349e41f4b71Sopenharmony_ci } 350e41f4b71Sopenharmony_ci }); 351e41f4b71Sopenharmony_ci } catch (error) { 352e41f4b71Sopenharmony_ci throwObject.isThrow = true; 353e41f4b71Sopenharmony_ci throw (error as Error); 354e41f4b71Sopenharmony_ci } 355e41f4b71Sopenharmony_ci }); 356e41f4b71Sopenharmony_ci} 357e41f4b71Sopenharmony_ci 358e41f4b71Sopenharmony_ciasync function publicFinishFunc(handle: number, token: Uint8Array, huksOptions: huks.HuksOptions) { 359e41f4b71Sopenharmony_ci console.info(`enter promise doFinish`); 360e41f4b71Sopenharmony_ci let throwObject: throwObject = { isThrow: false }; 361e41f4b71Sopenharmony_ci try { 362e41f4b71Sopenharmony_ci await finishSession(handle, huksOptions, token, throwObject) 363e41f4b71Sopenharmony_ci .then((data) => { 364e41f4b71Sopenharmony_ci finishOutData = data.outData as Uint8Array; 365e41f4b71Sopenharmony_ci console.info(`promise: doFinish success, data = ${JSON.stringify(data)}`); 366e41f4b71Sopenharmony_ci }) 367e41f4b71Sopenharmony_ci .catch((error: Error) => { 368e41f4b71Sopenharmony_ci if (throwObject.isThrow) { 369e41f4b71Sopenharmony_ci throw (error as Error); 370e41f4b71Sopenharmony_ci } else { 371e41f4b71Sopenharmony_ci console.error(`promise: doFinish failed, ` + JSON.stringify(error)); 372e41f4b71Sopenharmony_ci } 373e41f4b71Sopenharmony_ci }); 374e41f4b71Sopenharmony_ci } catch (error) { 375e41f4b71Sopenharmony_ci console.error(`promise: doFinish input arg invalid, ` + JSON.stringify(error)); 376e41f4b71Sopenharmony_ci } 377e41f4b71Sopenharmony_ci} 378e41f4b71Sopenharmony_ci 379e41f4b71Sopenharmony_ciasync function testSm4Cipher() { 380e41f4b71Sopenharmony_ci encryptOptions.inData = StringToUint8Array(cipherInData); 381e41f4b71Sopenharmony_ci /* Pass in AuthToken. */ 382e41f4b71Sopenharmony_ci await publicUpdateFunc(handle, fingerAuthToken, encryptOptions); 383e41f4b71Sopenharmony_ci /* Pass in AuthToken. */ 384e41f4b71Sopenharmony_ci await publicFinishFunc(handle, fingerAuthToken, encryptOptions); 385e41f4b71Sopenharmony_ci if (finishOutData === StringToUint8Array(cipherInData)) { 386e41f4b71Sopenharmony_ci console.info('test finish encrypt error '); 387e41f4b71Sopenharmony_ci } else { 388e41f4b71Sopenharmony_ci console.info('test finish encrypt success'); 389e41f4b71Sopenharmony_ci } 390e41f4b71Sopenharmony_ci} 391e41f4b71Sopenharmony_ci``` 392