1e41f4b71Sopenharmony_ci# HMAC (ArkTS) 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci 4e41f4b71Sopenharmony_ciThis topic walks you through on how to generate a hash-based message authentication code (HMAC), which provides authentication using a shared secret instead of using digital signatures with asymmetric cryptography. 5e41f4b71Sopenharmony_ci 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci 8e41f4b71Sopenharmony_ci## How to Develop 9e41f4b71Sopenharmony_ci 10e41f4b71Sopenharmony_ci**Key Generation** 11e41f4b71Sopenharmony_ci 12e41f4b71Sopenharmony_ci1. Set the key alias. 13e41f4b71Sopenharmony_ci 14e41f4b71Sopenharmony_ci2. Initialize the key property set. 15e41f4b71Sopenharmony_ci 16e41f4b71Sopenharmony_ci3. Use [generateKeyItem](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksgeneratekeyitem9) to generate a key. For details about the HMAC specifications supported, see [huks-key-generation-overview.md#supported-algorithms). 17e41f4b71Sopenharmony_ci 18e41f4b71Sopenharmony_ciYou can also import a key. For details about the supported algorithms, see [Supported Algorithms](huks-key-import-overview.md#supported-algorithms). 19e41f4b71Sopenharmony_ci 20e41f4b71Sopenharmony_ci**HMAC Generation** 21e41f4b71Sopenharmony_ci 22e41f4b71Sopenharmony_ci1. Obtain the key alias. 23e41f4b71Sopenharmony_ci 24e41f4b71Sopenharmony_ci2. Obtains the data to be calculated. 25e41f4b71Sopenharmony_ci 26e41f4b71Sopenharmony_ci3. Use [initSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksinitsession9) to initialize a key session. The session handle is returned after the initialization. 27e41f4b71Sopenharmony_ci 28e41f4b71Sopenharmony_ci4. Use [finishSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksfinishsession9) to obtain the hashed data. 29e41f4b71Sopenharmony_ci 30e41f4b71Sopenharmony_ci 31e41f4b71Sopenharmony_ci```ts 32e41f4b71Sopenharmony_ci/* 33e41f4b71Sopenharmony_ci * Perform HMAC calculation using promise-based APIs. 34e41f4b71Sopenharmony_ci */ 35e41f4b71Sopenharmony_ciimport { huks } from '@kit.UniversalKeystoreKit'; 36e41f4b71Sopenharmony_ci 37e41f4b71Sopenharmony_cilet HmackeyAlias = 'test_HMAC'; 38e41f4b71Sopenharmony_cilet handle: number; 39e41f4b71Sopenharmony_cilet plainText = '123456'; 40e41f4b71Sopenharmony_cilet hashData: Uint8Array; 41e41f4b71Sopenharmony_ci 42e41f4b71Sopenharmony_cifunction StringToUint8Array(str: String) { 43e41f4b71Sopenharmony_ci let arr: number[] = new Array(); 44e41f4b71Sopenharmony_ci for (let i = 0, j = str.length; i < j; ++i) { 45e41f4b71Sopenharmony_ci arr.push(str.charCodeAt(i)); 46e41f4b71Sopenharmony_ci } 47e41f4b71Sopenharmony_ci return new Uint8Array(arr); 48e41f4b71Sopenharmony_ci} 49e41f4b71Sopenharmony_ci 50e41f4b71Sopenharmony_cifunction Uint8ArrayToString(fileData: Uint8Array) { 51e41f4b71Sopenharmony_ci let dataString = ''; 52e41f4b71Sopenharmony_ci for (let i = 0; i < fileData.length; i++) { 53e41f4b71Sopenharmony_ci dataString += String.fromCharCode(fileData[i]); 54e41f4b71Sopenharmony_ci } 55e41f4b71Sopenharmony_ci return dataString; 56e41f4b71Sopenharmony_ci} 57e41f4b71Sopenharmony_ci 58e41f4b71Sopenharmony_cifunction GetHMACProperties() { 59e41f4b71Sopenharmony_ci const properties: Array<huks.HuksParam> = [{ 60e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_ALGORITHM, 61e41f4b71Sopenharmony_ci value: huks.HuksKeyAlg.HUKS_ALG_HMAC 62e41f4b71Sopenharmony_ci }, { 63e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, 64e41f4b71Sopenharmony_ci value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256 65e41f4b71Sopenharmony_ci }, { 66e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_PURPOSE, 67e41f4b71Sopenharmony_ci value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_MAC 68e41f4b71Sopenharmony_ci }, { 69e41f4b71Sopenharmony_ci tag: huks.HuksTag.HUKS_TAG_DIGEST, 70e41f4b71Sopenharmony_ci value: huks.HuksKeyDigest.HUKS_DIGEST_SHA384, 71e41f4b71Sopenharmony_ci }]; 72e41f4b71Sopenharmony_ci return properties; 73e41f4b71Sopenharmony_ci} 74e41f4b71Sopenharmony_ci 75e41f4b71Sopenharmony_ciasync function GenerateHMACKey() { 76e41f4b71Sopenharmony_ci /* 77e41f4b71Sopenharmony_ci * Simulate the key generation scenario. 78e41f4b71Sopenharmony_ci * 1. Set the key alias. 79e41f4b71Sopenharmony_ci */ 80e41f4b71Sopenharmony_ci /* 81e41f4b71Sopenharmony_ci * 2. Obtain the parameters for key generation. 82e41f4b71Sopenharmony_ci */ 83e41f4b71Sopenharmony_ci let genProperties = GetHMACProperties(); 84e41f4b71Sopenharmony_ci let options: huks.HuksOptions = { 85e41f4b71Sopenharmony_ci properties: genProperties 86e41f4b71Sopenharmony_ci } 87e41f4b71Sopenharmony_ci /* 88e41f4b71Sopenharmony_ci * 3. Call generateKeyItem to generate a key. 89e41f4b71Sopenharmony_ci */ 90e41f4b71Sopenharmony_ci await huks.generateKeyItem(HmackeyAlias, options) 91e41f4b71Sopenharmony_ci .then((data) => { 92e41f4b71Sopenharmony_ci console.info(`promise: generate HMAC Key success`); 93e41f4b71Sopenharmony_ci }).catch((error: Error) => { 94e41f4b71Sopenharmony_ci console.error(`promise: generate HMAC Key failed, ${JSON.stringify(error)}`); 95e41f4b71Sopenharmony_ci }) 96e41f4b71Sopenharmony_ci} 97e41f4b71Sopenharmony_ci 98e41f4b71Sopenharmony_ciasync function HMACData() { 99e41f4b71Sopenharmony_ci /* 100e41f4b71Sopenharmony_ci * Simulate the HMAC scenario. 101e41f4b71Sopenharmony_ci * 1. Obtain the key alias. 102e41f4b71Sopenharmony_ci */ 103e41f4b71Sopenharmony_ci /* 104e41f4b71Sopenharmony_ci * 2. Obtain the data to be hashed. 105e41f4b71Sopenharmony_ci */ 106e41f4b71Sopenharmony_ci /* 107e41f4b71Sopenharmony_ci * 3. Obtain HMAC algorithm parameter settings. 108e41f4b71Sopenharmony_ci */ 109e41f4b71Sopenharmony_ci let hmacProperties = GetHMACProperties(); 110e41f4b71Sopenharmony_ci let options: huks.HuksOptions = { 111e41f4b71Sopenharmony_ci properties: hmacProperties, 112e41f4b71Sopenharmony_ci inData: StringToUint8Array(plainText) 113e41f4b71Sopenharmony_ci } 114e41f4b71Sopenharmony_ci /* 115e41f4b71Sopenharmony_ci * 4. Call initSession to obtain a session handle. 116e41f4b71Sopenharmony_ci */ 117e41f4b71Sopenharmony_ci await huks.initSession(HmackeyAlias, options) 118e41f4b71Sopenharmony_ci .then((data) => { 119e41f4b71Sopenharmony_ci handle = data.handle; 120e41f4b71Sopenharmony_ci }).catch((error: Error) => { 121e41f4b71Sopenharmony_ci console.error(`promise: init EncryptData failed, ${JSON.stringify(error)}`); 122e41f4b71Sopenharmony_ci }) 123e41f4b71Sopenharmony_ci /* 124e41f4b71Sopenharmony_ci * 5. Call finishSession to obtain the HMAC result. 125e41f4b71Sopenharmony_ci */ 126e41f4b71Sopenharmony_ci await huks.finishSession(handle, options) 127e41f4b71Sopenharmony_ci .then((data) => { 128e41f4b71Sopenharmony_ci console.info(`promise: HMAC data success, data is ` + Uint8ArrayToString(data.outData as Uint8Array)); 129e41f4b71Sopenharmony_ci hashData = data.outData as Uint8Array; 130e41f4b71Sopenharmony_ci }).catch((error: Error) => { 131e41f4b71Sopenharmony_ci console.error(`promise: HMAC data failed, ${JSON.stringify(error)}`); 132e41f4b71Sopenharmony_ci }) 133e41f4b71Sopenharmony_ci} 134e41f4b71Sopenharmony_ci``` 135