1e41f4b71Sopenharmony_ci# Key Agreement Using ECDH 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci 4e41f4b71Sopenharmony_ciFor details about the algorithm specifications, see [ECDH](crypto-key-agreement-overview.md#ecdh). 5e41f4b71Sopenharmony_ci 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci## How to Develop 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci1. Use [cryptoFramework.createAsyKeyGenerator](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreateasykeygenerator), [AsyKeyGenerator.generateKeyPair](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatekeypair-1), and [AsyKeyGenerator.convertKey](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#convertkey-3) to generate a 256-bit ECC key pair (**KeyPair**). 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ci In addition to the example in this topic, [ECC](crypto-asym-key-generation-conversion-spec.md#ecc) and [Randomly Generating an Asymmetric Key Pair](crypto-generate-asym-key-pair-randomly.md) may help you better understand how to generate an ECC asymmetric key pair. Note that the input parameters in the reference documents may be different from those in the example below. 12e41f4b71Sopenharmony_ci 13e41f4b71Sopenharmony_ci2. Use [cryptoFramework.createKeyAgreement](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatekeyagreement) with the string parameter **'ECC256'** to create a 256-bit ECC key agreement (**KeyAgreement**) instance. 14e41f4b71Sopenharmony_ci 15e41f4b71Sopenharmony_ci3. Use [KeyAgreement.generateSecret](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatesecret-1) to perform key agreement with the specified private key (**KeyPair.priKey**) and public key (**KeyPair.pubKey**), and return the shared secret. 16e41f4b71Sopenharmony_ci 17e41f4b71Sopenharmony_ci- Example: Perform key agreement using **await**. 18e41f4b71Sopenharmony_ci 19e41f4b71Sopenharmony_ci ```ts 20e41f4b71Sopenharmony_ci import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 21e41f4b71Sopenharmony_ci 22e41f4b71Sopenharmony_ci async function ecdhAwait() { 23e41f4b71Sopenharmony_ci // The public and private key pair data is transferred from an external system. 24e41f4b71Sopenharmony_ci let pubKeyArray = new Uint8Array([48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 83, 96, 142, 9, 86, 214, 126, 106, 247, 233, 92, 125, 4, 128, 138, 105, 246, 162, 215, 71, 81, 58, 202, 121, 26, 105, 211, 55, 130, 45, 236, 143, 55, 16, 248, 75, 167, 160, 167, 106, 2, 152, 243, 44, 68, 66, 0, 167, 99, 92, 235, 215, 159, 239, 28, 106, 124, 171, 34, 145, 124, 174, 57, 92]); 25e41f4b71Sopenharmony_ci let priKeyArray = new Uint8Array([48, 49, 2, 1, 1, 4, 32, 115, 56, 137, 35, 207, 0, 60, 191, 90, 61, 136, 105, 210, 16, 27, 4, 171, 57, 10, 61, 123, 40, 189, 28, 34, 207, 236, 22, 45, 223, 10, 189, 160, 10, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7]); 26e41f4b71Sopenharmony_ci let eccGen = cryptoFramework.createAsyKeyGenerator('ECC256'); 27e41f4b71Sopenharmony_ci // Key pair A transferred from an external system. 28e41f4b71Sopenharmony_ci let keyPairA = await eccGen.convertKey({ data: pubKeyArray }, { data: priKeyArray }); 29e41f4b71Sopenharmony_ci // Key pair B generated internally. 30e41f4b71Sopenharmony_ci let keyPairB = await eccGen.generateKeyPair(); 31e41f4b71Sopenharmony_ci let eccKeyAgreement = cryptoFramework.createKeyAgreement('ECC256'); 32e41f4b71Sopenharmony_ci // Use the public key of A and the private key of B to perform key agreement. 33e41f4b71Sopenharmony_ci let secret1 = await eccKeyAgreement.generateSecret(keyPairB.priKey, keyPairA.pubKey); 34e41f4b71Sopenharmony_ci // Use the private key of A and the public key of B to perform key agreement. 35e41f4b71Sopenharmony_ci let secret2 = await eccKeyAgreement.generateSecret(keyPairA.priKey, keyPairB.pubKey); 36e41f4b71Sopenharmony_ci // The two key agreement results should be the same. 37e41f4b71Sopenharmony_ci if (secret1.data.toString() == secret2.data.toString()) { 38e41f4b71Sopenharmony_ci console.info('ecdh success'); 39e41f4b71Sopenharmony_ci console.info('ecdh output is ' + secret1.data); 40e41f4b71Sopenharmony_ci } else { 41e41f4b71Sopenharmony_ci console.error('ecdh result is not equal'); 42e41f4b71Sopenharmony_ci } 43e41f4b71Sopenharmony_ci } 44e41f4b71Sopenharmony_ci ``` 45e41f4b71Sopenharmony_ci 46e41f4b71Sopenharmony_ci- Example (using synchronous APIs): 47e41f4b71Sopenharmony_ci 48e41f4b71Sopenharmony_ci ```ts 49e41f4b71Sopenharmony_ci import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 50e41f4b71Sopenharmony_ci 51e41f4b71Sopenharmony_ci function ecdhAwait() { 52e41f4b71Sopenharmony_ci // The public and private key pair data is transferred from an external system. 53e41f4b71Sopenharmony_ci let pubKeyArray = new Uint8Array([48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 83, 96, 142, 9, 86, 214, 126, 106, 247, 233, 92, 125, 4, 128, 138, 105, 246, 162, 215, 71, 81, 58, 202, 121, 26, 105, 211, 55, 130, 45, 236, 143, 55, 16, 248, 75, 167, 160, 167, 106, 2, 152, 243, 44, 68, 66, 0, 167, 99, 92, 235, 215, 159, 239, 28, 106, 124, 171, 34, 145, 124, 174, 57, 92]); 54e41f4b71Sopenharmony_ci let priKeyArray = new Uint8Array([48, 49, 2, 1, 1, 4, 32, 115, 56, 137, 35, 207, 0, 60, 191, 90, 61, 136, 105, 210, 16, 27, 4, 171, 57, 10, 61, 123, 40, 189, 28, 34, 207, 236, 22, 45, 223, 10, 189, 160, 10, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7]); 55e41f4b71Sopenharmony_ci let eccGen = cryptoFramework.createAsyKeyGenerator('ECC256'); 56e41f4b71Sopenharmony_ci // Key pair A transferred from an external system. 57e41f4b71Sopenharmony_ci let keyPairA = eccGen.convertKeySync({ data: pubKeyArray }, { data: priKeyArray }); 58e41f4b71Sopenharmony_ci // Key pair B generated internally. 59e41f4b71Sopenharmony_ci let keyPairB = eccGen.generateKeyPairSync(); 60e41f4b71Sopenharmony_ci let eccKeyAgreement = cryptoFramework.createKeyAgreement('ECC256'); 61e41f4b71Sopenharmony_ci // Use the public key of A and the private key of B to perform key agreement. 62e41f4b71Sopenharmony_ci let secret1 = eccKeyAgreement.generateSecretSync(keyPairB.priKey, keyPairA.pubKey); 63e41f4b71Sopenharmony_ci // Use the private key of A and the public key of B to perform key agreement. 64e41f4b71Sopenharmony_ci let secret2 = eccKeyAgreement.generateSecretSync(keyPairA.priKey, keyPairB.pubKey); 65e41f4b71Sopenharmony_ci // The two key agreement results should be the same. 66e41f4b71Sopenharmony_ci if (secret1.data.toString() == secret2.data.toString()) { 67e41f4b71Sopenharmony_ci console.info('ecdh success'); 68e41f4b71Sopenharmony_ci console.info('ecdh output is ' + secret1.data); 69e41f4b71Sopenharmony_ci } else { 70e41f4b71Sopenharmony_ci console.error('ecdh result is not equal'); 71e41f4b71Sopenharmony_ci } 72e41f4b71Sopenharmony_ci } 73e41f4b71Sopenharmony_ci ``` 74