• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# HUKS Cipher Algorithm Specifications
2
3## Application Scope
4This document provides the HUKS specifications. Mandatory specifications are algorithm specifications that must be supported. Optional specifications can be used based on actual situation. Before using the optional specifications, refer to the documents provided by the vendor to ensure that the specifications are supported.
5
6**You are advised to use mandatory specifications to develop applications for compatibility purposes.**
7
8## Supported Algorithm Types and Parameter Combinations
9
10### Key Import/Generation Specifications
11
12| Algorithm   | API Level| Supported Key Length (Bit)    |Mandatory|
13| -------------- | :---------------: | ------------------ |:------------------: |
14| AES    |        8+         | 128, 192, 256| Yes|
15| RSA    |        8+         | 512, 768, 1024|No|
16| RSA    |        8+         | 2048, 3072, 4096|Yes|
17| HMAC   |        8+         | An integer multiple of 8, ranging from 8 to 1024 (inclusive)  |Yes|
18| ECC    |        8+         | 224 |No|
19| ECC    |        8+         | 256, 384, 521|Yes|
20| Ed25519 |        8+         | 256    |Yes|
21| X25519  |        8+         | 256    |Yes|
22| DSA    |        8+         | An integer multiple of 8, ranging from 512 to 1024 (inclusive)    |No|
23| DH    |        8+         | 2048                |Yes|
24| DH    |        8+         | 3072, 4096               |No|
25| SM2    |        9+         | 256                |Yes|
26| SM4    |        9+         | 128                |Yes|
27
28### Specifications for the Combination of the Cipher Algorithm, Block Cipher Mode, and Padding Mode
29
30| Algorithm/Block Cipher Mode/Padding Mode| API Level| Remarks                                                        |Mandatory|
31| ----------------------- | :----: | ---------------- | :----------------: |
32| AES/ECB/NoPadding<br>AES/ECB/PKCS7 | 8+          |   |No|
33| AES/CBC/NoPadding <br> AES/CBC/PKCS7<br>AES/CTR/NoPadding| 8+  | The **IV** parameter is mandatory.|Yes|
34| AES/GCM/NoPadding | 8+        | **Nonce**, **AAD**, and **AEAD** are mandatory.  |Yes|
35| RSA/ECB/NoPadding<br>RSA/ECB/PKCS1_V1_5<br>RSA/ECB/OAEP             | 8+                |  The OAEP padding mode supports SHA-256, SHA-384, and SHA-512 digest algorithms. | Yes|
36| SM4/ECB/NoPadding<br> SM4/ECB/PKCS7<br>SM4/CBC/PKCS7 | 9+ | The **IV** parameter is mandatory in CBC mode. |No|
37| SM4/CTR/NoPadding<br>SM4/CBC/NoPadding<br>| 9+  | The **IV** parameter is mandatory. |Yes|
38
39
40
41### Specifications for the Combination of the Signing & Signature Verification Algorithm, Digest Algorithm, and Padding Mode
42
43
44| Algorithm/Digest Algorithm/Padding Mode     | API Level| Remarks|Mandatory|
45| --------- | :----------: | ---------- |  :-----------------: |
46| RSA/MD5/PKCS1_V1_5<br>RSA/SHA1/PKCS1_V1_5<br>RSA/SHA224/PKCS1_V1_5 <br>RSA/SHA224/PSS| 8+                | |No|
47| RSA/SHA256/PKCS1_V1_5<br>RSA/SHA384/PKCS1_V1_5<br>RSA/SHA512/PKCS1_V1_5<br>RSA/SHA256/PSS<br>RSA/SHA384/PSS<br>RSA/SHA512/PSS | 8+                | | Yes
48| RSA/NoDigest/PKCS1_V1_5 | 9+    |If **NoDigest** is used, **TAG HuksKeyDigest.HUKS_DIGEST_NONE** must be set.|No|
49| DSA/SHA1<br>DSA/SHA224<br>DSA/SHA256<br>DSA/SHA384<br>DSA/SHA512     |  8+                | |No|
50| DSA/NoDigest     |  9+   |If **NoDigest** is used, **TAG HuksKeyDigest.HUKS_DIGEST_NONE** must be set.|No|
51| ECC/SHA1<br>ECC/SHA224   | 8+      | |No|
52| ECC/SHA256<br>ECC/SHA384<br>ECC/SHA512      | 8+                | |Yes|
53| ECC/NoDigest     |  9+   |If **NoDigest** is used, **TAG HuksKeyDigest.HUKS_DIGEST_NONE** must be set.|No|
54| ED25519/NoDigest     |  8+       | If **NoDigest** is used, **TAG HuksKeyDigest.HUKS_DIGEST_NONE** must be set.|Yes|
55| SM2/SM3|9+      | |Yes|
56
57### Key Agreement Algorithms
58
59| Algorithm  | API Level| Remarks    | Mandatory|
60| ------ | :-----------: | ------------------------------ |:-----------: |
61| ECDH    | 8+   |  The key must be of the ECC type. | Yes|
62| DH        | 8+  |             |Yes|
63| X25519  | 8+  |             |Yes|
64
65### Specifications for the Combination of the Digest Algorithm and HMAC Key Length
66| Digest | Key Length| API Level| Mandatory|
67| ------ | :-----------: |:-----------: |:-----------: |
68| SHA256  |An integer multiple of 8, ranging from 192 to 1024| 8+   |   Yes|
69| SHA384  |An integer multiple of 8, ranging from 256 to 1024| 8+  |  Yes|
70| SHA512  |An integer multiple of 8, ranging from 256 to 1024| 8+  | Yes|
71### Specifications for the Combination of the Derivation Algorithm and Digest
72
73| Algorithm/Digest|  Algorithm/Length of the Base Key    | Available Algorithm/Length of the Derived Key             | Remarks|API Level|Mandatory|
74| ----------------- |-------------------------------- | ----------------------- | ------------ |:---------: |:--:|
75| HKDF/SHA256   | AES/192-256 | AES/128/192/256<br>HMAC/8-1024<br>SM4/128 | A derived key is the key session result obtained by the service using the Init-Update-Finish mechanism. It can be managed by the HUKS (the key is always in a TEE) or independently managed by the service based on service requirements.|8+|Yes|
76| HKDF/SHA384  | AES/256 | AES/128/192/256<br>HMAC/8-1024<br>SM4/128 | A derived key is the key session result obtained by the service using the Init-Update-Finish mechanism. It can be managed by the HUKS (the key is always in a TEE) or independently managed by the service based on service requirements.|8+|Yes|
77|HKDF/SHA512   | AES/256 | AES/128/192/256<br>HMAC/8-1024<br>SM4/128 | A derived key is the key session result obtained by the service using the Init-Update-Finish mechanism. It can be managed by the HUKS (the key is always in a TEE) or independently managed by the service based on service requirements.|8+|Yes|
78| PBKDF2/SHA256   | AES/192-256 | AES/128/192/256<br>HMAC/8-1024<br>SM4/128 | A derived key is the key session result obtained by the service using the Init-Update-Finish mechanism. It can be managed by the HUKS (the key is always in a TEE) or independently managed by the service based on service requirements.|8+|Yes|
79| PBKDF2/SHA384   |AES/256  | AES/128/192/256<br>HMAC/8-1024<br>SM4/128 | A derived key is the key session result obtained by the service using the Init-Update-Finish mechanism. It can be managed by the HUKS (the key is always in a TEE) or independently managed by the service based on service requirements.|8+|Yes|
80| PBKDF2/SHA512    | AES/256 | AES/128/192/256<br>HMAC/8-1024<br>SM4/128 | A derived key is the key session result obtained by the service using the Init-Update-Finish mechanism. It can be managed by the HUKS (the key is always in a TEE) or independently managed by the service based on service requirements.|8+|Yes|
81
82### Key Attestation
83
84| Algorithm|API Level| Remarks | Mandatory|
85| ------------------ | :-----: | ----------------------------- | :-------:|
86| RSA | 9+ |  The padding mode can be PSS or PKCS1_V1_5.|Yes|
87| ECC                | 9+ |   |Yes|
88| X25519             | 9+ |   |Yes|
89
90## Key Material Formats
91HUKS defines a set of formats for the material of key pairs, public keys, and private keys of different cipher algorithms.
92
93### Key Pair Material
94Key pair material = Key pair material header + Original key pair material
95
96The following uses the RSA key as an example. The application needs to apply for a Uint8Array and assign the variables to the corresponding positions based on the memory structure of the RSA key pair material.
97
98**Figure 1** Memory structure of the RSA key material
99
100![huks_keymaterial_struct](figures/huks_keymaterial_struct.png)
101
102```ts
103let rsa2048KeyPairMaterial = new Uint8Array([
104    0x01, 0x00, 0x00, 0x00, // Key algorithm: huks.HuksKeyAlg.HUKS_ALG_RSA = 1
105    0x00, 0x08, 0x00, 0x00, // Key size (bit): 2048
106    0x00, 0x01, 0x00, 0x00, // Length of modulus n (byte): 256
107    0x03, 0x00, 0x00, 0x00, // Length of the public key exponent e (byte): 3
108    0x00, 0x01, 0x00, 0x00, // Length of the private key exponent d (byte): 256
109    // Modulus n
110    0xc5, 0x35, 0x62, 0x48, 0xc4, 0x92, 0x87, 0x73, 0x0d, 0x42, 0x96, 0xfc, 0x7b, 0x11, 0x05, 0x06,
111    0x0f, 0x8d, 0x66, 0xc1, 0x0e, 0xad, 0x37, 0x44, 0x92, 0x95, 0x2f, 0x6a, 0x55, 0xba, 0xec, 0x1d,
112    0x54, 0x62, 0x0a, 0x4b, 0xd3, 0xc7, 0x05, 0xe4, 0x07, 0x40, 0xd9, 0xb7, 0xc2, 0x12, 0xcb, 0x9a,
113    0x90, 0xad, 0xe3, 0x24, 0xe8, 0x5e, 0xa6, 0xf8, 0xd0, 0x6e, 0xbc, 0xd1, 0x69, 0x7f, 0x6b, 0xe4,
114    0x2b, 0x4e, 0x1a, 0x65, 0xbb, 0x73, 0x88, 0x6b, 0x7c, 0xaf, 0x7e, 0xd0, 0x47, 0x26, 0xeb, 0xa5,
115    0xbe, 0xd6, 0xe8, 0xee, 0x9c, 0xa5, 0x66, 0xa5, 0xc9, 0xd3, 0x25, 0x13, 0xc4, 0x0e, 0x6c, 0xab,
116    0x50, 0xb6, 0x50, 0xc9, 0xce, 0x8f, 0x0a, 0x0b, 0xc6, 0x28, 0x69, 0xe9, 0x83, 0x69, 0xde, 0x42,
117    0x56, 0x79, 0x7f, 0xde, 0x86, 0x24, 0xca, 0xfc, 0xaa, 0xc0, 0xf3, 0xf3, 0x7f, 0x92, 0x8e, 0x8a,
118    0x12, 0x52, 0xfe, 0x50, 0xb1, 0x5e, 0x8c, 0x01, 0xce, 0xfc, 0x7e, 0xf2, 0x4f, 0x5f, 0x03, 0xfe,
119    0xa7, 0xcd, 0xa1, 0xfc, 0x94, 0x52, 0x00, 0x8b, 0x9b, 0x7f, 0x09, 0xab, 0xa8, 0xa4, 0xf5, 0xb4,
120    0xa5, 0xaa, 0xfc, 0x72, 0xeb, 0x17, 0x40, 0xa9, 0xee, 0xbe, 0x8f, 0xc2, 0xd1, 0x80, 0xc2, 0x0d,
121    0x44, 0xa9, 0x59, 0x44, 0x59, 0x81, 0x3b, 0x5d, 0x4a, 0xde, 0xfb, 0xae, 0x24, 0xfc, 0xa3, 0xd9,
122    0xbc, 0x57, 0x55, 0xc2, 0x26, 0xbc, 0x19, 0xa7, 0x9a, 0xc5, 0x59, 0xa3, 0xee, 0x5a, 0xef, 0x41,
123    0x80, 0x7d, 0xf8, 0x5e, 0xc1, 0x1d, 0x32, 0x38, 0x41, 0x5b, 0xb6, 0x92, 0xb8, 0xb7, 0x03, 0x0d,
124    0x3e, 0x59, 0x0f, 0x1c, 0xb3, 0xe1, 0x2a, 0x95, 0x1a, 0x3b, 0x50, 0x4f, 0xc4, 0x1d, 0xcf, 0x73,
125    0x7c, 0x14, 0xca, 0xe3, 0x0b, 0xa7, 0xc7, 0x1a, 0x41, 0x4a, 0xee, 0xbe, 0x1f, 0x43, 0xdd, 0xf9,
126    // Public key exponent e
127    0x01, 0x00, 0x01,
128    // Private key exponent d
129    0x88, 0x4b, 0x82, 0xe7, 0xe3, 0xe3, 0x99, 0x75, 0x6c, 0x9e, 0xaf, 0x17, 0x44, 0x3e, 0xd9, 0x07,
130    0xfd, 0x4b, 0xae, 0xce, 0x92, 0xc4, 0x28, 0x44, 0x5e, 0x42, 0x79, 0x08, 0xb6, 0xc3, 0x7f, 0x58,
131    0x2d, 0xef, 0xac, 0x4a, 0x07, 0xcd, 0xaf, 0x46, 0x8f, 0xb4, 0xc4, 0x43, 0xf9, 0xff, 0x5f, 0x74,
132    0x2d, 0xb5, 0xe0, 0x1c, 0xab, 0xf4, 0x6e, 0xd5, 0xdb, 0xc8, 0x0c, 0xfb, 0x76, 0x3c, 0x38, 0x66,
133    0xf3, 0x7f, 0x01, 0x43, 0x7a, 0x30, 0x39, 0x02, 0x80, 0xa4, 0x11, 0xb3, 0x04, 0xd9, 0xe3, 0x57,
134    0x23, 0xf4, 0x07, 0xfc, 0x91, 0x8a, 0xc6, 0xcc, 0xa2, 0x16, 0x29, 0xb3, 0xe5, 0x76, 0x4a, 0xa8,
135    0x84, 0x19, 0xdc, 0xef, 0xfc, 0xb0, 0x63, 0x33, 0x0b, 0xfa, 0xf6, 0x68, 0x0b, 0x08, 0xea, 0x31,
136    0x52, 0xee, 0x99, 0xef, 0x43, 0x2a, 0xbe, 0x97, 0xad, 0xb3, 0xb9, 0x66, 0x7a, 0xae, 0xe1, 0x8f,
137    0x57, 0x86, 0xe5, 0xfe, 0x14, 0x3c, 0x81, 0xd0, 0x64, 0xf8, 0x86, 0x1a, 0x0b, 0x40, 0x58, 0xc9,
138    0x33, 0x49, 0xb8, 0x99, 0xc6, 0x2e, 0x94, 0x70, 0xee, 0x09, 0x88, 0xe1, 0x5c, 0x4e, 0x6c, 0x22,
139    0x72, 0xa7, 0x2a, 0x21, 0xdd, 0xd7, 0x1d, 0xfc, 0x63, 0x15, 0x0b, 0xde, 0x06, 0x9c, 0xf3, 0x28,
140    0xf3, 0xac, 0x4a, 0xa8, 0xb5, 0x50, 0xca, 0x9b, 0xcc, 0x0a, 0x04, 0xfe, 0x3f, 0x98, 0x68, 0x81,
141    0xac, 0x24, 0x53, 0xea, 0x1f, 0x1c, 0x6e, 0x5e, 0xca, 0xe8, 0x31, 0x0d, 0x08, 0x12, 0xf3, 0x26,
142    0xf8, 0x5e, 0xeb, 0x10, 0x27, 0xae, 0xaa, 0xc3, 0xad, 0x6c, 0xc1, 0x89, 0xdb, 0x7d, 0x5a, 0x12,
143    0x55, 0xad, 0x11, 0x19, 0xa1, 0xa9, 0x8f, 0x0b, 0x6d, 0x78, 0x8d, 0x1c, 0xdf, 0xe5, 0x63, 0x82,
144    0x0b, 0x7d, 0x23, 0x04, 0xb4, 0x75, 0x8c, 0xed, 0x77, 0xfc, 0x1a, 0x85, 0x29, 0x11, 0xe0, 0x61,
145    ]);
146```
147
148The key algorithm is a value of [HuksKeyAlg](../reference/apis/js-apis-huks.md#hukskeyalg).
149
150- **RSA Key Pair Material Format**
151    | Key Algorithm| Key Size| Modulus n Length L<sub>n</sub>| Public Key Exponent e Length L<sub>e</sub>| Private Key Exponent d Length L<sub>d</sub>| n | e | d |
152    | :----: |:----:|:----:|:----:|:----:|:----:|:----:|:----:|
153    |4 bytes|4 bytes|4 bytes|4 bytes|4 bytes|L<sub>n</sub> bytes|L<sub>e</sub> bytes|L<sub>d</sub> bytes|
154
155
156- **ECC Key Pair Material Format**
157    | Key Algorithm| Key Size| Coordinate x Length L<sub>x</sub>| Coordinate y Length L<sub>y</sub>| Coordinate z Length L<sub>z</sub>| x | y | z |
158    | :----: |:----:|:----:|:----:|:----:|:----:|:----:|:----:|
159    |4 bytes|4 bytes|4 bytes|4 bytes|4 bytes|L<sub>x</sub> bytes|L<sub>y</sub> bytes|L<sub>z</sub> bytes|
160
161
162- **DSA Key Pair Material Format**
163    | Key Algorithm| Key Size| Private Key x Length L<sub>x</sub>| Public Key y Length L<sub>y</sub>| Prime p Length L<sub>p</sub>| Prime Factor q Length L<sub>q</sub>| g length L<sub>g</sub>| x | y | p | q | g |
164    | :----: |:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|
165    |4 bytes|4 bytes|4 bytes|4 bytes|4 bytes|4 bytes|4 bytes|L<sub>x</sub> bytes|L<sub>y</sub> bytes|L<sub>p</sub> bytes|L<sub>q</sub> bytes|L<sub>g</sub> bytes|
166
167
168- **DH Key Pair Material Format**
169    | Key Algorithm| Key Size| Public Key pk Length L<sub>pk</sub>| Private Key sk Length L<sub>sk</sub>| Reserved Field| pk | sk |
170    |:----:|:----:|:----:|:----:|:----:|:----:|:----:|
171    |4 bytes|4 bytes|4 bytes|4 bytes|4 bytes|L<sub>pk</sub> bytes|L<sub>sk</sub> bytes|
172
173
174- **Curve25519 Key Pair Material Format**
175    | Key Algorithm| Key Size| Public Key pk Length L<sub>pk</sub>| Private Key sk Length L<sub>sk</sub>| Reserved Field| pk | sk |
176    |:----:|:----:|:----:|:----:|:----:|:----:|:----:|
177    |4 bytes|4 bytes|4 bytes|4 bytes|4 bytes|L<sub>pk</sub> bytes|L<sub>sk</sub> bytes|
178
179
180### Public Key Material
181
182When a public key is exported or imported, the key material is encapsulated in the DER format defined in X.509.
183
184The following is ECC public key in EDR format:
185```ts
186let eccP256PubKey = new Uint8Array([
187  0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a,
188  0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, 0xc0, 0xfe, 0x1c, 0x67, 0xde,
189  0x86, 0x0e, 0xfb, 0xaf, 0xb5, 0x85, 0x52, 0xb4, 0x0e, 0x1f, 0x6c, 0x6c, 0xaa, 0xc5, 0xd9, 0xd2,
190  0x4d, 0xb0, 0x8a, 0x72, 0x24, 0xa1, 0x99, 0xaf, 0xfc, 0x3e, 0x55, 0x5a, 0xac, 0x99, 0x3d, 0xe8,
191  0x34, 0x72, 0xb9, 0x47, 0x9c, 0xa6, 0xd8, 0xfb, 0x00, 0xa0, 0x1f, 0x9f, 0x7a, 0x41, 0xe5, 0x44,
192  0x3e, 0xb2, 0x76, 0x08, 0xa2, 0xbd, 0xe9, 0x41, 0xd5, 0x2b, 0x9e]);
193```
194
195### Private Key Material
196
197The private key material is in the same format as the key pair material. When the private key material is encapsulated, the public key length in the header of the key pair material is set to 0 and original key pair material and the private key material are combined.
198
199Private key material = Header of the key pair material + Original private key material
200
201The following uses the RSA private key material as an example:
202
203![huks_keymaterial_rsa_priv_struct](figures/huks_keymaterial_rsa_priv_struct.png)
204
205```ts
206let rsa2048PrivateKeyMaterial = new Uint8Array([
207    0x01, 0x00, 0x00, 0x00, // Key algorithm: huks.HuksKeyAlg.HUKS_ALG_RSA = 1
208    0x00, 0x08, 0x00, 0x00, // Key size (bit): 2048
209    0x00, 0x01, 0x00, 0x00, // Length of modulus n (byte): 256
210    0x00, 0x00, 0x00, 0x00, // Length of the public key exponent e (byte): 0
211    0x00, 0x01, 0x00, 0x00, // Length of the private key exponent d (byte): 256
212    // Modulus n
213    0xc5, 0x35, 0x62, 0x48, 0xc4, 0x92, 0x87, 0x73, 0x0d, 0x42, 0x96, 0xfc, 0x7b, 0x11, 0x05, 0x06,
214    0x0f, 0x8d, 0x66, 0xc1, 0x0e, 0xad, 0x37, 0x44, 0x92, 0x95, 0x2f, 0x6a, 0x55, 0xba, 0xec, 0x1d,
215    0x54, 0x62, 0x0a, 0x4b, 0xd3, 0xc7, 0x05, 0xe4, 0x07, 0x40, 0xd9, 0xb7, 0xc2, 0x12, 0xcb, 0x9a,
216    0x90, 0xad, 0xe3, 0x24, 0xe8, 0x5e, 0xa6, 0xf8, 0xd0, 0x6e, 0xbc, 0xd1, 0x69, 0x7f, 0x6b, 0xe4,
217    0x2b, 0x4e, 0x1a, 0x65, 0xbb, 0x73, 0x88, 0x6b, 0x7c, 0xaf, 0x7e, 0xd0, 0x47, 0x26, 0xeb, 0xa5,
218    0xbe, 0xd6, 0xe8, 0xee, 0x9c, 0xa5, 0x66, 0xa5, 0xc9, 0xd3, 0x25, 0x13, 0xc4, 0x0e, 0x6c, 0xab,
219    0x50, 0xb6, 0x50, 0xc9, 0xce, 0x8f, 0x0a, 0x0b, 0xc6, 0x28, 0x69, 0xe9, 0x83, 0x69, 0xde, 0x42,
220    0x56, 0x79, 0x7f, 0xde, 0x86, 0x24, 0xca, 0xfc, 0xaa, 0xc0, 0xf3, 0xf3, 0x7f, 0x92, 0x8e, 0x8a,
221    0x12, 0x52, 0xfe, 0x50, 0xb1, 0x5e, 0x8c, 0x01, 0xce, 0xfc, 0x7e, 0xf2, 0x4f, 0x5f, 0x03, 0xfe,
222    0xa7, 0xcd, 0xa1, 0xfc, 0x94, 0x52, 0x00, 0x8b, 0x9b, 0x7f, 0x09, 0xab, 0xa8, 0xa4, 0xf5, 0xb4,
223    0xa5, 0xaa, 0xfc, 0x72, 0xeb, 0x17, 0x40, 0xa9, 0xee, 0xbe, 0x8f, 0xc2, 0xd1, 0x80, 0xc2, 0x0d,
224    0x44, 0xa9, 0x59, 0x44, 0x59, 0x81, 0x3b, 0x5d, 0x4a, 0xde, 0xfb, 0xae, 0x24, 0xfc, 0xa3, 0xd9,
225    0xbc, 0x57, 0x55, 0xc2, 0x26, 0xbc, 0x19, 0xa7, 0x9a, 0xc5, 0x59, 0xa3, 0xee, 0x5a, 0xef, 0x41,
226    0x80, 0x7d, 0xf8, 0x5e, 0xc1, 0x1d, 0x32, 0x38, 0x41, 0x5b, 0xb6, 0x92, 0xb8, 0xb7, 0x03, 0x0d,
227    0x3e, 0x59, 0x0f, 0x1c, 0xb3, 0xe1, 0x2a, 0x95, 0x1a, 0x3b, 0x50, 0x4f, 0xc4, 0x1d, 0xcf, 0x73,
228    0x7c, 0x14, 0xca, 0xe3, 0x0b, 0xa7, 0xc7, 0x1a, 0x41, 0x4a, 0xee, 0xbe, 0x1f, 0x43, 0xdd, 0xf9,
229    // Private key exponent d
230    0x88, 0x4b, 0x82, 0xe7, 0xe3, 0xe3, 0x99, 0x75, 0x6c, 0x9e, 0xaf, 0x17, 0x44, 0x3e, 0xd9, 0x07,
231    0xfd, 0x4b, 0xae, 0xce, 0x92, 0xc4, 0x28, 0x44, 0x5e, 0x42, 0x79, 0x08, 0xb6, 0xc3, 0x7f, 0x58,
232    0x2d, 0xef, 0xac, 0x4a, 0x07, 0xcd, 0xaf, 0x46, 0x8f, 0xb4, 0xc4, 0x43, 0xf9, 0xff, 0x5f, 0x74,
233    0x2d, 0xb5, 0xe0, 0x1c, 0xab, 0xf4, 0x6e, 0xd5, 0xdb, 0xc8, 0x0c, 0xfb, 0x76, 0x3c, 0x38, 0x66,
234    0xf3, 0x7f, 0x01, 0x43, 0x7a, 0x30, 0x39, 0x02, 0x80, 0xa4, 0x11, 0xb3, 0x04, 0xd9, 0xe3, 0x57,
235    0x23, 0xf4, 0x07, 0xfc, 0x91, 0x8a, 0xc6, 0xcc, 0xa2, 0x16, 0x29, 0xb3, 0xe5, 0x76, 0x4a, 0xa8,
236    0x84, 0x19, 0xdc, 0xef, 0xfc, 0xb0, 0x63, 0x33, 0x0b, 0xfa, 0xf6, 0x68, 0x0b, 0x08, 0xea, 0x31,
237    0x52, 0xee, 0x99, 0xef, 0x43, 0x2a, 0xbe, 0x97, 0xad, 0xb3, 0xb9, 0x66, 0x7a, 0xae, 0xe1, 0x8f,
238    0x57, 0x86, 0xe5, 0xfe, 0x14, 0x3c, 0x81, 0xd0, 0x64, 0xf8, 0x86, 0x1a, 0x0b, 0x40, 0x58, 0xc9,
239    0x33, 0x49, 0xb8, 0x99, 0xc6, 0x2e, 0x94, 0x70, 0xee, 0x09, 0x88, 0xe1, 0x5c, 0x4e, 0x6c, 0x22,
240    0x72, 0xa7, 0x2a, 0x21, 0xdd, 0xd7, 0x1d, 0xfc, 0x63, 0x15, 0x0b, 0xde, 0x06, 0x9c, 0xf3, 0x28,
241    0xf3, 0xac, 0x4a, 0xa8, 0xb5, 0x50, 0xca, 0x9b, 0xcc, 0x0a, 0x04, 0xfe, 0x3f, 0x98, 0x68, 0x81,
242    0xac, 0x24, 0x53, 0xea, 0x1f, 0x1c, 0x6e, 0x5e, 0xca, 0xe8, 0x31, 0x0d, 0x08, 0x12, 0xf3, 0x26,
243    0xf8, 0x5e, 0xeb, 0x10, 0x27, 0xae, 0xaa, 0xc3, 0xad, 0x6c, 0xc1, 0x89, 0xdb, 0x7d, 0x5a, 0x12,
244    0x55, 0xad, 0x11, 0x19, 0xa1, 0xa9, 0x8f, 0x0b, 0x6d, 0x78, 0x8d, 0x1c, 0xdf, 0xe5, 0x63, 0x82,
245    0x0b, 0x7d, 0x23, 0x04, 0xb4, 0x75, 0x8c, 0xed, 0x77, 0xfc, 0x1a, 0x85, 0x29, 0x11, 0xe0, 0x61,
246    ]);
247```
248