1e41f4b71Sopenharmony_ci# Key Agreement Using X25519
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciFor details about the algorithm specifications, see [X25519](crypto-key-agreement-overview.md#x25519).
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 an X25519 asymmetric key pair (**KeyPair**).
10e41f4b71Sopenharmony_ci   In addition to the example in this topic, [X25519](crypto-asym-key-generation-conversion-spec.md#x25519) and [Randomly Generating an Asymmetric Key Pair](crypto-generate-asym-key-pair-randomly.md) may help you better understand how to generate an X25519 asymmetric key pair. Note that the input parameters in the reference documents may be different from those in the example below.
11e41f4b71Sopenharmony_ci
12e41f4b71Sopenharmony_ci2. Use [cryptoFramework.createKeyAgreement](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatekeyagreement) with the string parameter **'X25519'** to create an X25519 key agreement (**KeyAgreement**) instance.
13e41f4b71Sopenharmony_ci
14e41f4b71Sopenharmony_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.
15e41f4b71Sopenharmony_ci
16e41f4b71Sopenharmony_ci- Example: Perform key agreement using **await**.
17e41f4b71Sopenharmony_ci
18e41f4b71Sopenharmony_ci  ```ts
19e41f4b71Sopenharmony_ci  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ci  async function x25519Await() {
22e41f4b71Sopenharmony_ci    // The public and private key pair data is transferred from an external system.
23e41f4b71Sopenharmony_ci    let pubKeyArray = new Uint8Array([48, 42, 48, 5, 6, 3, 43, 101, 110, 3, 33, 0, 36, 98, 216, 106, 74, 99, 179, 203, 81, 145, 147, 101, 139, 57, 74, 225, 119, 196, 207, 0, 50, 232, 93, 147, 188, 21, 225, 228, 54, 251, 230, 52]);
24e41f4b71Sopenharmony_ci    let priKeyArray = new Uint8Array([48, 46, 2, 1, 0, 48, 5, 6, 3, 43, 101, 110, 4, 34, 4, 32, 112, 65, 156, 73, 65, 89, 183, 39, 119, 229, 110, 12, 192, 237, 186, 153, 21, 122, 28, 176, 248, 108, 22, 242, 239, 179, 106, 175, 85, 65, 214, 90]);
25e41f4b71Sopenharmony_ci    let keyGen = cryptoFramework.createAsyKeyGenerator('X25519');
26e41f4b71Sopenharmony_ci    // Key pair A transferred from an external system.
27e41f4b71Sopenharmony_ci    let keyPairA = await keyGen.convertKey({ data: pubKeyArray }, { data: priKeyArray });
28e41f4b71Sopenharmony_ci    // Key pair B generated internally.
29e41f4b71Sopenharmony_ci    let keyPairB = await keyGen.generateKeyPair();
30e41f4b71Sopenharmony_ci    let keyAgreement = cryptoFramework.createKeyAgreement('X25519');
31e41f4b71Sopenharmony_ci    // Use the public key of A and the private key of B to perform key agreement.
32e41f4b71Sopenharmony_ci    let secret1 = await keyAgreement.generateSecret(keyPairB.priKey, keyPairA.pubKey);
33e41f4b71Sopenharmony_ci    // Use the private key of A and the public key of B to perform key agreement.
34e41f4b71Sopenharmony_ci    let secret2 = await keyAgreement.generateSecret(keyPairA.priKey, keyPairB.pubKey);
35e41f4b71Sopenharmony_ci    // The two key agreement results should be the same.
36e41f4b71Sopenharmony_ci    if (secret1.data.toString() == secret2.data.toString()) {
37e41f4b71Sopenharmony_ci      console.info('x25519 success');
38e41f4b71Sopenharmony_ci      console.info('x25519 output is ' + secret1.data);
39e41f4b71Sopenharmony_ci    } else {
40e41f4b71Sopenharmony_ci      console.error('x25519 result is not equal');
41e41f4b71Sopenharmony_ci    }
42e41f4b71Sopenharmony_ci  }
43e41f4b71Sopenharmony_ci  ```
44e41f4b71Sopenharmony_ci
45e41f4b71Sopenharmony_ci- Example (using synchronous APIs):
46e41f4b71Sopenharmony_ci
47e41f4b71Sopenharmony_ci  ```ts
48e41f4b71Sopenharmony_ci  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
49e41f4b71Sopenharmony_ci
50e41f4b71Sopenharmony_ci  function x25519Await() {
51e41f4b71Sopenharmony_ci    // The public and private key pair data is transferred from an external system.
52e41f4b71Sopenharmony_ci    let pubKeyArray = new Uint8Array([48, 42, 48, 5, 6, 3, 43, 101, 110, 3, 33, 0, 36, 98, 216, 106, 74, 99, 179, 203, 81, 145, 147, 101, 139, 57, 74, 225, 119, 196, 207, 0, 50, 232, 93, 147, 188, 21, 225, 228, 54, 251, 230, 52]);
53e41f4b71Sopenharmony_ci    let priKeyArray = new Uint8Array([48, 46, 2, 1, 0, 48, 5, 6, 3, 43, 101, 110, 4, 34, 4, 32, 112, 65, 156, 73, 65, 89, 183, 39, 119, 229, 110, 12, 192, 237, 186, 153, 21, 122, 28, 176, 248, 108, 22, 242, 239, 179, 106, 175, 85, 65, 214, 90]);
54e41f4b71Sopenharmony_ci    let keyGen = cryptoFramework.createAsyKeyGenerator('X25519');
55e41f4b71Sopenharmony_ci    // Key pair A transferred from an external system.
56e41f4b71Sopenharmony_ci    let keyPairA = keyGen.convertKeySync({ data: pubKeyArray }, { data: priKeyArray });
57e41f4b71Sopenharmony_ci    // Key pair B generated internally.
58e41f4b71Sopenharmony_ci    let keyPairB = keyGen.generateKeyPairSync();
59e41f4b71Sopenharmony_ci    let keyAgreement = cryptoFramework.createKeyAgreement('X25519');
60e41f4b71Sopenharmony_ci    // Use the public key of A and the private key of B to perform key agreement.
61e41f4b71Sopenharmony_ci    let secret1 = keyAgreement.generateSecretSync(keyPairB.priKey, keyPairA.pubKey);
62e41f4b71Sopenharmony_ci    // Use the private key of A and the public key of B to perform key agreement.
63e41f4b71Sopenharmony_ci    let secret2 = keyAgreement.generateSecretSync(keyPairA.priKey, keyPairB.pubKey);
64e41f4b71Sopenharmony_ci    // The two key agreement results should be the same.
65e41f4b71Sopenharmony_ci    if (secret1.data.toString() == secret2.data.toString()) {
66e41f4b71Sopenharmony_ci      console.info('x25519 success');
67e41f4b71Sopenharmony_ci      console.info('x25519 output is ' + secret1.data);
68e41f4b71Sopenharmony_ci    } else {
69e41f4b71Sopenharmony_ci      console.error('x25519 result is not equal');
70e41f4b71Sopenharmony_ci    }
71e41f4b71Sopenharmony_ci  }
72e41f4b71Sopenharmony_ci  ```
73