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