• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Key Derivation Using Scrypt (ArkTS)
2
3<!--Kit: Crypto Architecture Kit-->
4<!--Subsystem: Security-->
5<!--Owner: @zxz--3-->
6<!--Designer: @lanming-->
7<!--Tester: @PAFT-->
8<!--Adviser: @zengyawen-->
9
10For details about the corresponding algorithm specifications, see [Scrypt](crypto-key-derivation-overview.md#scrypt).
11
12## How to Develop
13
141. Create an [ScryptSpec](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#scryptspec18) object and use it as a parameter for key derivation.
15
16   **ScryptSpec** is a child class of [KdfSpec](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#kdfspec11). You need to specify the following:
17
18   - **algName**: algorithm to use, which is **SCRYPT**.
19   - **passphrase**: original password used to generate the derived key.
20      If the string type is used, pass in the data used for key derivation instead of the string type such as HexString or base64. In addition, ensure that the string is encoded in UTF-8 format. Otherwise, the derived key may be different from what you expected.
21   - **salt**: salt value.
22   - **n**: number of iterations. The value must be a positive integer.
23   - **p**: parallelization parameter. The value must be a positive integer.
24   - **r**: block size. The value must be a positive integer.
25   - **maxMemory**: maximum memory size. The value must be a positive integer.
26   - **keySize**: length of the key to derive, in bytes. The value must be a positive integer.
27
282. Call [cryptoFramework.createKdf](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatekdf11) with the string parameter set to **SCRYPT** to create a key derivation function object (**Kdf**) with the scrypt algorithm.
29
303. Call [Kdf.generateSecret](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generatesecret11) with the **SCRYPT** object to generate a derived key.
31
32   The following table lists how **Kdf.generateSecret** delivers the return value.
33
34   | API| Return Mode|
35   | -------- | -------- |
36   | generateSecret(params: KdfSpec, callback: AsyncCallback&lt;DataBlob&gt;): void | This API uses an asynchronous callback to return the result.|
37   | generateSecret(params: KdfSpec): Promise&lt;DataBlob&gt; | This API uses a promise to return the result.|
38   | generateSecretSync(params: KdfSpec): DataBlob | This API returns the result synchronously.|
39
40- Return the result using **await**:
41
42  ```ts
43  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
44  import { BusinessError } from '@kit.BasicServicesKit';
45
46  async function ScryptAwait() {
47    try {
48      let spec: cryptoFramework.ScryptSpec = {
49        algName: 'SCRYPT',
50        salt: new Uint8Array(16),
51        passphrase: "password",
52        n:1024,
53        p:16,
54        r:8,
55        maxMemory:1024 * 16 * 8 * 10, //n * p * r * 10
56        keySize: 64
57      };
58      let kdf = cryptoFramework.createKdf('SCRYPT');
59      let secret = await kdf.generateSecret(spec);
60      console.info("key derivation output is " + secret.data);
61    } catch(error) {
62      let e: BusinessError = error as BusinessError;
63      console.error('key derivation failed, errCode: ' + e.code + ', errMsg: ' + e.message);
64    }
65  }
66  ```
67
68- Return the result using a promise:
69
70  ```ts
71  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
72  import { BusinessError } from '@kit.BasicServicesKit';
73
74  function ScryptPromise() {
75    let spec: cryptoFramework.ScryptSpec = {
76      algName: 'SCRYPT',
77      passphrase: '123456',
78      salt: new Uint8Array(16),
79      n:1024,
80      p:16,
81      r:8,
82      maxMemory:1024 * 16 * 8 * 10, //n * p * r * 10
83      keySize: 64
84    };
85    let kdf = cryptoFramework.createKdf('SCRYPT');
86    let kdfPromise = kdf.generateSecret(spec);
87    kdfPromise.then((secret) => {
88      console.info("key derivation output is " + secret.data);
89    }).catch((error: BusinessError) => {
90      console.error("key derivation error.");
91    });
92  }
93  ```
94
95- Return the result synchronously:
96
97  ```ts
98  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
99  import { BusinessError } from '@kit.BasicServicesKit';
100
101  function kdfSync() {
102    try {
103      let spec: cryptoFramework.ScryptSpec = {
104        algName: 'SCRYPT',
105        passphrase: '123456',
106        salt: new Uint8Array(16),
107        n:1024,
108        p:16,
109        r:8,
110        maxMemory:1024 * 16 * 8 * 10, //n * p * r * 10
111        keySize: 64
112      };
113      let kdf = cryptoFramework.createKdf('SCRYPT');
114      let secret = kdf.generateSecretSync(spec);
115      console.info("[Sync]key derivation output is " + secret.data);
116    } catch(error) {
117      let e: BusinessError = error as BusinessError;
118      console.error('key derivation failed, errCode: ' + e.code + ', errMsg: ' + e.message);
119    }
120  }
121  ```
122