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