• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *    http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <pthread.h>
18 #include <string.h>
19 
20 #include "crypto_framework_agreement_test.h"
21 #include "blob.h"
22 #include "log.h"
23 
24 #include <gtest/gtest.h>
25 
26 using namespace testing::ext;
27 namespace Unittest::CryptoFrameworkAgreementNapiTest {
28 class OHCryptoFrameworkAgreementNapiTest : public testing::Test {
29 public:
SetUpTestCase(void)30     static void SetUpTestCase(void) {};
TearDownTestCase(void)31     static void TearDownTestCase(void) {};
SetUp()32     void SetUp() {};
TearDown()33     void TearDown() {};
34 };
35 
36 class AGREEMENT_TEST : public testing::TestWithParam<AgreementSpec> {
37     public:
SetUpTestCase()38         static void SetUpTestCase() {};
TearDownTestCase()39         static void TearDownTestCase() {};
40 };
41 
42 class AGREEMENT_VECTOR_TEST : public testing::TestWithParam<VectorAgreementSpec> {
43     public:
SetUpTestCase()44         static void SetUpTestCase() {};
TearDownTestCase()45         static void TearDownTestCase() {};
46 };
47 
48 class AGREEMENT_VECTOR_ECC_TEST : public testing::TestWithParam<VectorEccAgreementSpec> {
49     public:
SetUpTestCase()50         static void SetUpTestCase() {};
TearDownTestCase()51         static void TearDownTestCase() {};
52 };
53 
54 class AGREEMENT_VECTOR_DH_TEST : public testing::TestWithParam<VectorDhAgreementSpec> {
55     public:
SetUpTestCase()56         static void SetUpTestCase() {};
TearDownTestCase()57         static void TearDownTestCase() {};
58 };
59 
OHTEST_GetAgreementKeyPair(const char * algoNameA,const char * algoNameB,OH_CryptoKeyPair ** keyPairA,OH_CryptoKeyPair ** keyPairB)60 static OH_Crypto_ErrCode OHTEST_GetAgreementKeyPair(const char *algoNameA, const char *algoNameB,
61     OH_CryptoKeyPair **keyPairA, OH_CryptoKeyPair **keyPairB)
62 {
63     OH_CryptoAsymKeyGenerator *ctxA = nullptr;
64     OH_CryptoAsymKeyGenerator *ctxB = nullptr;
65     OH_Crypto_ErrCode ret = CRYPTO_SUCCESS;
66 
67     ret = OH_CryptoAsymKeyGenerator_Create(algoNameA, &ctxA);
68     if (ret != CRYPTO_SUCCESS) {
69         goto EXIT;
70     }
71     ret = OH_CryptoAsymKeyGenerator_Create(algoNameB, &ctxB);
72     if (ret != CRYPTO_SUCCESS) {
73         goto EXIT;
74     }
75     ret = OH_CryptoAsymKeyGenerator_Generate(ctxA, keyPairA);
76     if (ret != CRYPTO_SUCCESS) {
77         goto EXIT;
78     }
79     ret = OH_CryptoAsymKeyGenerator_Generate(ctxB, keyPairB);
80     if (ret != CRYPTO_SUCCESS) {
81         goto EXIT;
82     }
83 
84 EXIT:
85     OH_CryptoAsymKeyGenerator_Destroy(ctxA);
86     OH_CryptoAsymKeyGenerator_Destroy(ctxB);
87     return ret;
88 }
89 
OHTEST_GetAgreementKey(OH_CryptoKeyPair * keyPair,OH_CryptoPrivKey ** privkey,OH_CryptoPubKey ** pubkey)90 static OH_Crypto_ErrCode OHTEST_GetAgreementKey(OH_CryptoKeyPair *keyPair,
91     OH_CryptoPrivKey **privkey, OH_CryptoPubKey **pubkey)
92 {
93     OH_Crypto_ErrCode ret = CRYPTO_SUCCESS;
94 
95     *privkey = OH_CryptoKeyPair_GetPrivKey(keyPair);
96     if (*privkey == nullptr) {
97         ret = CRYPTO_OPERTION_ERROR;
98         goto EXIT;
99     }
100     *pubkey = OH_CryptoKeyPair_GetPubKey(keyPair);
101     if (*pubkey == nullptr) {
102         ret = CRYPTO_OPERTION_ERROR;
103         goto EXIT;
104     }
105 
106 EXIT:
107     return ret;
108 }
109 
110 AgreementSpec g_agreementSpec[] = {
111     /* ECC */
112     {"ECC224", "ECC224"},
113     {"ECC256", "ECC256"},
114     {"ECC384", "ECC384"},
115     {"ECC521", "ECC521"},
116     {"ECC_BrainPoolP160r1", "ECC_BrainPoolP160r1"},
117     {"ECC_BrainPoolP160t1", "ECC_BrainPoolP160t1"},
118     {"ECC_BrainPoolP192r1", "ECC_BrainPoolP192r1"},
119     {"ECC_BrainPoolP192t1", "ECC_BrainPoolP192t1"},
120     {"ECC_BrainPoolP224r1", "ECC_BrainPoolP224r1"},
121     {"ECC_BrainPoolP224t1", "ECC_BrainPoolP224t1"},
122     {"ECC_BrainPoolP256r1", "ECC_BrainPoolP256r1"},
123     {"ECC_BrainPoolP256t1", "ECC_BrainPoolP256t1"},
124     {"ECC_BrainPoolP320r1", "ECC_BrainPoolP320r1"},
125     {"ECC_BrainPoolP320t1", "ECC_BrainPoolP320t1"},
126     {"ECC_BrainPoolP384r1", "ECC_BrainPoolP384r1"},
127     {"ECC_BrainPoolP384t1", "ECC_BrainPoolP384t1"},
128     {"ECC_BrainPoolP512r1", "ECC_BrainPoolP512r1"},
129     {"ECC_BrainPoolP512t1", "ECC_BrainPoolP512t1"},
130     {"ECC_Secp256k1", "ECC_Secp256k1"},
131     /* X25519 */
132     {"X25519", "X25519"},
133     /* DH */
134     {"DH_modp1536", "DH_modp1536"},
135     {"DH_modp2048", "DH_modp2048"},
136     {"DH_modp3072", "DH_modp3072"},
137     {"DH_modp4096", "DH_modp4096"},
138     {"DH_modp6144", "DH_modp6144"},
139     {"DH_modp8192", "DH_modp8192"},
140     {"DH_ffdhe2048", "DH_ffdhe2048"},
141     {"DH_ffdhe3072", "DH_ffdhe3072"},
142     {"DH_ffdhe4096", "DH_ffdhe4096"},
143     {"DH_ffdhe6144", "DH_ffdhe6144"},
144     {"DH_ffdhe8192", "DH_ffdhe8192"},
145 };
146 INSTANTIATE_TEST_CASE_P(OHCryptoFrameworkAgreementNapiTest, AGREEMENT_TEST, ::testing::ValuesIn(g_agreementSpec));
147 
148 /**
149 * @tc.number SUB_Security_CryptoFramework_NAPI_Agreement_Test_0100
150 * @tc.name OHCryptoFrameworkAgreementNapiTest/AGREEMENT_TEST.SUB_Security_CryptoFramework_NAPI_Agreement_Test_0100/x
151 * @tc.desc algorithm is Agreement
152 * @tc.size Medium
153 * @tc.type Func
154 * @tc.level Level0
155 */
156 HWTEST_P(AGREEMENT_TEST, SUB_Security_CryptoFramework_NAPI_Agreement_Test_0100, TestSize.Level0)
157 {
158     AgreementSpec infoSpec = GetParam();
159     const char *algoNameA = infoSpec.algoNameA;
160     const char *algoNameB = infoSpec.algoNameB;
161     OH_CryptoKeyPair *keyPairA = nullptr;
162     OH_CryptoKeyPair *keyPairB = nullptr;
163     OH_CryptoPrivKey *privkeyA = nullptr;
164     OH_CryptoPubKey *pubkeyA = nullptr;
165     OH_CryptoPrivKey *privkeyB = nullptr;
166     OH_CryptoPubKey *pubkeyB = nullptr;
167     OH_CryptoKeyAgreement *ctx = nullptr;
168     Crypto_DataBlob secretA = {.data = nullptr, .len = 0};
169     Crypto_DataBlob secretB = {.data = nullptr, .len = 0};
170 
171     EXPECT_EQ(OHTEST_GetAgreementKeyPair(algoNameA, algoNameB, &keyPairA, &keyPairB), CRYPTO_SUCCESS);
172     EXPECT_EQ(OHTEST_GetAgreementKey(keyPairA, &privkeyA, &pubkeyA), CRYPTO_SUCCESS);
173     EXPECT_EQ(OHTEST_GetAgreementKey(keyPairB, &privkeyB, &pubkeyB), CRYPTO_SUCCESS);
174     EXPECT_EQ(OH_CryptoKeyAgreement_Create(algoNameA, &ctx), CRYPTO_SUCCESS);
175     EXPECT_EQ(OH_CryptoKeyAgreement_GenerateSecret(ctx, privkeyA, pubkeyB, &secretA), CRYPTO_SUCCESS);
176     EXPECT_EQ(OH_CryptoKeyAgreement_GenerateSecret(ctx, privkeyB, pubkeyA, &secretB), CRYPTO_SUCCESS);
177     EXPECT_TRUE(memcmp(secretB.data, secretA.data, secretB.len) == 0);
178     EXPECT_EQ(secretB.len, secretA.len);
179 
180     OH_CryptoKeyPair_Destroy(keyPairA);
181     OH_CryptoKeyPair_Destroy(keyPairB);
182     OH_CryptoKeyAgreement_Destroy(ctx);
183     OH_Crypto_FreeDataBlob(&secretA);
184     OH_Crypto_FreeDataBlob(&secretB);
185 }
186 
187 /**
188 * @tc.number SUB_Security_CryptoFramework_NAPI_Agreement_Test_0200
189 * @tc.name OHCryptoFrameworkAgreementNapiTest.SUB_Security_CryptoFramework_NAPI_Agreement_Test_0200
190 * @tc.desc algorithm is Agreement
191 * @tc.size Medium
192 * @tc.type Func
193 * @tc.level Level0
194 */
195 HWTEST_F(OHCryptoFrameworkAgreementNapiTest, SUB_Security_CryptoFramework_NAPI_Agreement_Test_0200, TestSize.Level0)
196 {
197     const char *algoNameA = "ECC224";
198     const char *algoNameB = "ECC256";
199     OH_CryptoKeyPair *keyPairA = nullptr;
200     OH_CryptoKeyPair *keyPairB = nullptr;
201     OH_CryptoPrivKey *privkeyA = nullptr;
202     OH_CryptoPubKey *pubkeyA = nullptr;
203     OH_CryptoPrivKey *privkeyB = nullptr;
204     OH_CryptoPubKey *pubkeyB = nullptr;
205     OH_CryptoKeyAgreement *ctx = nullptr;
206     Crypto_DataBlob secretA = {.data = nullptr, .len = 0};
207     Crypto_DataBlob secretB = {.data = nullptr, .len = 0};
208 
209     EXPECT_EQ(OHTEST_GetAgreementKeyPair(algoNameA, algoNameB, &keyPairA, &keyPairB), CRYPTO_SUCCESS);
210     EXPECT_EQ(OHTEST_GetAgreementKey(keyPairA, &privkeyA, &pubkeyA), CRYPTO_SUCCESS);
211     EXPECT_EQ(OHTEST_GetAgreementKey(keyPairB, &privkeyB, &pubkeyB), CRYPTO_SUCCESS);
212     EXPECT_EQ(OH_CryptoKeyAgreement_Create(algoNameA, &ctx), CRYPTO_SUCCESS);
213     EXPECT_EQ(OH_CryptoKeyAgreement_GenerateSecret(ctx, privkeyA, pubkeyB, &secretA), CRYPTO_OPERTION_ERROR);
214     EXPECT_EQ(OH_CryptoKeyAgreement_GenerateSecret(ctx, privkeyB, pubkeyA, &secretB), CRYPTO_OPERTION_ERROR);
215 
216     OH_CryptoKeyPair_Destroy(keyPairA);
217     OH_CryptoKeyPair_Destroy(keyPairB);
218     OH_CryptoKeyAgreement_Destroy(ctx);
219     OH_Crypto_FreeDataBlob(&secretA);
220     OH_Crypto_FreeDataBlob(&secretB);
221 }
222 
223 /**
224 * @tc.number SUB_Security_CryptoFramework_NAPI_Agreement_Test_0300
225 * @tc.name OHCryptoFrameworkAgreementNapiTest.SUB_Security_CryptoFramework_NAPI_Agreement_Test_0300
226 * @tc.desc algorithm is Agreement
227 * @tc.size Medium
228 * @tc.type Func
229 * @tc.level Level0
230 */
231 HWTEST_F(OHCryptoFrameworkAgreementNapiTest, SUB_Security_CryptoFramework_NAPI_Agreement_Test_0300, TestSize.Level0)
232 {
233     const char *algoNameA = "X25519";
234     const char *algoNameB = "ECC256";
235     OH_CryptoKeyPair *keyPairA = nullptr;
236     OH_CryptoKeyPair *keyPairB = nullptr;
237     OH_CryptoPrivKey *privkeyA = nullptr;
238     OH_CryptoPubKey *pubkeyA = nullptr;
239     OH_CryptoPrivKey *privkeyB = nullptr;
240     OH_CryptoPubKey *pubkeyB = nullptr;
241     OH_CryptoKeyAgreement *ctx = nullptr;
242     Crypto_DataBlob secretA = {.data = nullptr, .len = 0};
243     Crypto_DataBlob secretB = {.data = nullptr, .len = 0};
244 
245     EXPECT_EQ(OHTEST_GetAgreementKeyPair(algoNameA, algoNameB, &keyPairA, &keyPairB), CRYPTO_SUCCESS);
246     EXPECT_EQ(OHTEST_GetAgreementKey(keyPairA, &privkeyA, &pubkeyA), CRYPTO_SUCCESS);
247     EXPECT_EQ(OHTEST_GetAgreementKey(keyPairB, &privkeyB, &pubkeyB), CRYPTO_SUCCESS);
248     EXPECT_EQ(OH_CryptoKeyAgreement_Create(algoNameA, &ctx), CRYPTO_SUCCESS);
249     EXPECT_EQ(OH_CryptoKeyAgreement_GenerateSecret(ctx, privkeyA, pubkeyB, &secretA), CRYPTO_PARAMETER_CHECK_FAILED);
250     EXPECT_EQ(OH_CryptoKeyAgreement_GenerateSecret(ctx, privkeyB, pubkeyA, &secretB), CRYPTO_PARAMETER_CHECK_FAILED);
251 
252     OH_CryptoKeyPair_Destroy(keyPairA);
253     OH_CryptoKeyPair_Destroy(keyPairB);
254     OH_CryptoKeyAgreement_Destroy(ctx);
255     OH_Crypto_FreeDataBlob(&secretA);
256     OH_Crypto_FreeDataBlob(&secretB);
257 }
258 
259 /**
260 * @tc.number SUB_Security_CryptoFramework_NAPI_Agreement_Test_0400
261 * @tc.name OHCryptoFrameworkAgreementNapiTest.SUB_Security_CryptoFramework_NAPI_Agreement_Test_0400
262 * @tc.desc algorithm is Agreement
263 * @tc.size Medium
264 * @tc.type Func
265 * @tc.level Level0
266 */
267 HWTEST_F(OHCryptoFrameworkAgreementNapiTest, SUB_Security_CryptoFramework_NAPI_Agreement_Test_0400, TestSize.Level0)
268 {
269     const char *algoNameA = "DH_modp2048";
270     const char *algoNameB = "DH_ffdhe2048";
271     OH_CryptoKeyPair *keyPairA = nullptr;
272     OH_CryptoKeyPair *keyPairB = nullptr;
273     OH_CryptoPrivKey *privkeyA = nullptr;
274     OH_CryptoPubKey *pubkeyA = nullptr;
275     OH_CryptoPrivKey *privkeyB = nullptr;
276     OH_CryptoPubKey *pubkeyB = nullptr;
277     OH_CryptoKeyAgreement *ctx = nullptr;
278     Crypto_DataBlob secretA = {.data = nullptr, .len = 0};
279     Crypto_DataBlob secretB = {.data = nullptr, .len = 0};
280 
281     EXPECT_EQ(OHTEST_GetAgreementKeyPair(algoNameA, algoNameB, &keyPairA, &keyPairB), CRYPTO_SUCCESS);
282     EXPECT_EQ(OHTEST_GetAgreementKey(keyPairA, &privkeyA, &pubkeyA), CRYPTO_SUCCESS);
283     EXPECT_EQ(OHTEST_GetAgreementKey(keyPairB, &privkeyB, &pubkeyB), CRYPTO_SUCCESS);
284     EXPECT_EQ(OH_CryptoKeyAgreement_Create(algoNameA, &ctx), CRYPTO_SUCCESS);
285     EXPECT_EQ(OH_CryptoKeyAgreement_GenerateSecret(ctx, privkeyA, pubkeyB, &secretA), CRYPTO_OPERTION_ERROR);
286     EXPECT_EQ(OH_CryptoKeyAgreement_GenerateSecret(ctx, privkeyB, pubkeyA, &secretB), CRYPTO_OPERTION_ERROR);
287 
288     OH_CryptoKeyPair_Destroy(keyPairA);
289     OH_CryptoKeyPair_Destroy(keyPairB);
290     OH_CryptoKeyAgreement_Destroy(ctx);
291     OH_Crypto_FreeDataBlob(&secretA);
292     OH_Crypto_FreeDataBlob(&secretB);
293 }
294 
295 /**
296 * @tc.number SUB_Security_CryptoFramework_NAPI_Agreement_Test_0500
297 * @tc.name OHCryptoFrameworkAgreementNapiTest.SUB_Security_CryptoFramework_NAPI_Agreement_Test_0500
298 * @tc.desc algorithm is Agreement
299 * @tc.size Medium
300 * @tc.type Func
301 * @tc.level Level0
302 */
303 HWTEST_F(OHCryptoFrameworkAgreementNapiTest, SUB_Security_CryptoFramework_NAPI_Agreement_Test_0500, TestSize.Level0)
304 {
305     const char *algoName = "SM2";
306     OH_CryptoKeyAgreement *ctx = nullptr;
307 
308     EXPECT_EQ(OH_CryptoKeyAgreement_Create(algoName, &ctx), CRYPTO_NOT_SUPPORTED);
309 
310     OH_CryptoKeyAgreement_Destroy(ctx);
311 }
312 
313 static VectorAgreementSpec g_vec[] = {
314     {
315         .algoName = "X25519",
316         .vectorSource = "RFC7748",
317         .localPrivKey = "ebe088ff278b2f1cfdb6182629b13b6fe60e80838b7fe1794b8a4a627e08ab5d", // Big-end sequence
318         .localPubKey = "4f2b886f147efcad4d67785bc843833f3735e4ecc2615bd3b4c17d7b7ddb9ede", // Big-end sequence
319         .peerPrivKey = "2a2cb91da5fb77b12a99c0eb872f4cdf4566b25172c1163c7da518730a6d0777", // Big-end sequence
320         .peerPubKey = "6a4e9baa8ea9a4ebf41a38260d3abf0d5af73eb4dc7d8b7454a7308909f02085", // Big-end sequence
321         .sharedKey = "4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742"
322     },
323 };
324 
OHTEST_HexStringToDataBlob(const char * in,Crypto_DataBlob * out,bool isBigEnd)325 static OH_Crypto_ErrCode OHTEST_HexStringToDataBlob(const char *in, Crypto_DataBlob *out, bool isBigEnd)
326 {
327     uint32_t inLen = (uint32_t)strlen(in);
328 
329     if (in == nullptr && inLen % 2 != 0) {
330         return CRYPTO_PARAMETER_CHECK_FAILED;
331     }
332     out->data = (uint8_t *)malloc(inLen / 2);
333     if (out->data == nullptr) {
334         return CRYPTO_MEMORY_ERROR;
335     }
336     for (int i = 0; i < inLen; i += 2) {
337         uint32_t bit1 = ((uint8_t)in[i] % 32 + 9) % 25;
338         uint32_t bit2 = ((uint8_t)in[i+1] % 32 + 9) % 25;
339         if (bit1 > 15 || bit2 > 15) {
340             return CRYPTO_PARAMETER_CHECK_FAILED;
341         }
342         if (isBigEnd) {
343             out->data[i/2] = bit1 * 16 + bit2;
344         } else {
345             out->data[inLen / 2 - i/2 - 1] = bit1 * 16 + bit2;
346         }
347     }
348     out->len = inLen / 2;
349 
350     return CRYPTO_SUCCESS;
351 }
352 
OHTEST_ConvertX25519AsymKey(VectorAgreementSpec * vec,bool isLocal)353 static OH_CryptoKeyPair *OHTEST_ConvertX25519AsymKey(VectorAgreementSpec *vec, bool isLocal)
354 {
355     OH_CryptoKeyPair *keyPair = nullptr;
356     OH_CryptoAsymKeySpec *specCtx = nullptr;
357     OH_CryptoAsymKeyGeneratorWithSpec *generator = nullptr;
358     Crypto_DataBlob sk = {.data = nullptr, .len = 0};
359     Crypto_DataBlob pk = {.data = nullptr, .len = 0};
360     if (isLocal) {
361         if (OHTEST_HexStringToDataBlob(vec->localPrivKey, &sk, true) != CRYPTO_SUCCESS
362             || OHTEST_HexStringToDataBlob(vec->localPubKey, &pk, true) != CRYPTO_SUCCESS) {
363             goto EXIT;
364         }
365     } else {
366         if (OHTEST_HexStringToDataBlob(vec->peerPrivKey, &sk, true) != CRYPTO_SUCCESS
367             || OHTEST_HexStringToDataBlob(vec->peerPubKey, &pk, true) != CRYPTO_SUCCESS) {
368             goto EXIT;
369         }
370     }
371     if (OH_CryptoAsymKeySpec_Create(vec->algoName, CRYPTO_ASYM_KEY_KEY_PAIR_SPEC, &specCtx) != CRYPTO_SUCCESS
372         || OH_CryptoAsymKeySpec_SetParam(specCtx, CRYPTO_X25519_SK_DATABLOB, &sk) != CRYPTO_SUCCESS
373         || OH_CryptoAsymKeySpec_SetParam(specCtx, CRYPTO_X25519_PK_DATABLOB, &pk) != CRYPTO_SUCCESS
374         || OH_CryptoAsymKeyGeneratorWithSpec_Create(specCtx, &generator) != CRYPTO_SUCCESS
375         || OH_CryptoAsymKeyGeneratorWithSpec_GenKeyPair(generator, &keyPair) != CRYPTO_SUCCESS) {
376         goto EXIT;
377     }
378 
379 EXIT:
380     OH_CryptoAsymKeyGeneratorWithSpec_Destroy(generator);
381     OH_CryptoAsymKeySpec_Destroy(specCtx);
382     OH_Crypto_FreeDataBlob(&sk);
383     OH_Crypto_FreeDataBlob(&pk);
384     return keyPair;
385 }
386 
387 INSTANTIATE_TEST_CASE_P(OHCryptoFrameworkAgreementNapiTest, AGREEMENT_VECTOR_TEST, ::testing::ValuesIn(g_vec));
388 
389 /**
390 * @tc.number SUB_Security_CryptoFramework_NAPI_Agreement_Vector_Test_0100
391 * @tc.name OHCryptoFrameworkAgreementNapiTest/AGREEMENT_VECTOR_TEST.SUB_Security_CryptoFramework_NAPI_Agreement_Vector_Test_0100/x
392 * @tc.desc algorithm is Agreement
393 * @tc.size Medium
394 * @tc.type Func
395 * @tc.level Level0
396 */
397 HWTEST_P(AGREEMENT_VECTOR_TEST, SUB_Security_CryptoFramework_NAPI_Agreement_Vector_Test_0100, TestSize.Level0)
398 {
399     VectorAgreementSpec vecInfo = GetParam();
400     Crypto_DataBlob localSharedKey = {.data = nullptr, .len = 0};
401     Crypto_DataBlob peerSharedKey = {.data = nullptr, .len = 0};
402     Crypto_DataBlob sharedKey = {.data = nullptr, .len = 0};
403     OH_CryptoKeyAgreement *localCtx = nullptr;
404     OH_CryptoKeyAgreement *peerCtx = nullptr;
405     OH_CryptoKeyPair *localKeyPair = OHTEST_ConvertX25519AsymKey(&vecInfo, true);
406     OH_CryptoKeyPair *peerKeyPair = OHTEST_ConvertX25519AsymKey(&vecInfo, false);
407     EXPECT_TRUE(localKeyPair != nullptr && peerKeyPair != nullptr);
408     OH_CryptoPrivKey *localPrivkey = OH_CryptoKeyPair_GetPrivKey(localKeyPair);
409     OH_CryptoPubKey *localPubkey = OH_CryptoKeyPair_GetPubKey(localKeyPair);
410     EXPECT_TRUE(localPrivkey != nullptr && localPubkey != nullptr);
411     OH_CryptoPrivKey *peerPrivkey = OH_CryptoKeyPair_GetPrivKey(peerKeyPair);
412     OH_CryptoPubKey *peerPubkey = OH_CryptoKeyPair_GetPubKey(peerKeyPair);
413     EXPECT_TRUE(peerPrivkey != nullptr && peerPubkey != nullptr);
414     EXPECT_EQ(OH_CryptoKeyAgreement_Create(vecInfo.algoName, &localCtx), CRYPTO_SUCCESS);
415     EXPECT_EQ(OH_CryptoKeyAgreement_GenerateSecret(localCtx, localPrivkey, peerPubkey, &localSharedKey), CRYPTO_SUCCESS);
416     EXPECT_EQ(OH_CryptoKeyAgreement_Create(vecInfo.algoName, &peerCtx), CRYPTO_SUCCESS);
417     EXPECT_EQ(OH_CryptoKeyAgreement_GenerateSecret(peerCtx, peerPrivkey, localPubkey, &peerSharedKey), CRYPTO_SUCCESS);
418     if (localSharedKey.len == peerSharedKey.len) {
419         EXPECT_TRUE(memcmp(peerSharedKey.data, localSharedKey.data, localSharedKey.len) == 0);
420     }
421     EXPECT_EQ(localSharedKey.len, peerSharedKey.len);
422     EXPECT_EQ(OHTEST_HexStringToDataBlob(vecInfo.sharedKey, &sharedKey, true), CRYPTO_SUCCESS);
423     EXPECT_TRUE(memcmp(peerSharedKey.data, sharedKey.data, sharedKey.len) == 0);
424 
425     OH_CryptoKeyAgreement_Destroy(peerCtx);
426     OH_CryptoKeyAgreement_Destroy(localCtx);
427     OH_Crypto_FreeDataBlob(&sharedKey);
428     OH_Crypto_FreeDataBlob(&peerSharedKey);
429     OH_Crypto_FreeDataBlob(&localSharedKey);
430     OH_CryptoKeyPair_Destroy(localKeyPair);
431     OH_CryptoKeyPair_Destroy(peerKeyPair);
432 }
433 
OHTEST_ConvertEccAsymKey(VectorEccAgreementSpec * infoSpec,bool isBob)434 static OH_CryptoKeyPair *OHTEST_ConvertEccAsymKey(VectorEccAgreementSpec *infoSpec, bool isBob)
435 {
436     OH_CryptoAsymKeySpec *commonSpec = nullptr;
437     OH_CryptoAsymKeySpec *specCtx = nullptr;
438     OH_CryptoAsymKeyGeneratorWithSpec *generator = nullptr;
439     OH_CryptoKeyPair *keyPair = nullptr;
440     Crypto_DataBlob sk = { .data = nullptr, .len = 0};
441     Crypto_DataBlob pk_x = { .data = nullptr, .len = 0};
442     Crypto_DataBlob pk_y = { .data = nullptr, .len = 0};
443 
444     if (isBob) {
445         if (OHTEST_HexStringToDataBlob(infoSpec->bobD, &sk, true) != CRYPTO_SUCCESS
446             || OHTEST_HexStringToDataBlob(infoSpec->bobX, &pk_x, true) != CRYPTO_SUCCESS
447             || OHTEST_HexStringToDataBlob(infoSpec->bobY, &pk_y, true) != CRYPTO_SUCCESS) {
448             goto EXIT;
449         }
450     } else {
451         if (OHTEST_HexStringToDataBlob(infoSpec->aliceD, &sk, true) != CRYPTO_SUCCESS
452             || OHTEST_HexStringToDataBlob(infoSpec->aliceX, &pk_x, true) != CRYPTO_SUCCESS
453             || OHTEST_HexStringToDataBlob(infoSpec->aliceY, &pk_y, true) != CRYPTO_SUCCESS) {
454             goto EXIT;
455         }
456     }
457     if (OH_CryptoAsymKeySpec_Create("ECC", CRYPTO_ASYM_KEY_KEY_PAIR_SPEC, &specCtx) != CRYPTO_SUCCESS
458         || OH_CryptoAsymKeySpec_GenEcCommonParamsSpec(infoSpec->nidName, &commonSpec) != CRYPTO_SUCCESS) {
459         goto EXIT;
460     }
461     if (OH_CryptoAsymKeySpec_SetCommonParamsSpec(specCtx, commonSpec) != CRYPTO_SUCCESS
462         || OH_CryptoAsymKeySpec_SetParam(specCtx, CRYPTO_ECC_SK_DATABLOB, &sk) != CRYPTO_SUCCESS
463         || OH_CryptoAsymKeySpec_SetParam(specCtx, CRYPTO_ECC_PK_X_DATABLOB, &pk_x) != CRYPTO_SUCCESS
464         || OH_CryptoAsymKeySpec_SetParam(specCtx, CRYPTO_ECC_PK_Y_DATABLOB, &pk_y) != CRYPTO_SUCCESS
465         || OH_CryptoAsymKeyGeneratorWithSpec_Create(specCtx, &generator) != CRYPTO_SUCCESS
466         || OH_CryptoAsymKeyGeneratorWithSpec_GenKeyPair(generator, &keyPair) != CRYPTO_SUCCESS) {
467         goto EXIT;
468     }
469 
470 EXIT:
471     OH_Crypto_FreeDataBlob(&sk);
472     OH_Crypto_FreeDataBlob(&pk_x);
473     OH_Crypto_FreeDataBlob(&pk_y);
474     OH_CryptoAsymKeyGeneratorWithSpec_Destroy(generator);
475     OH_CryptoAsymKeySpec_Destroy(specCtx);
476     OH_CryptoAsymKeySpec_Destroy(commonSpec);
477     return keyPair;
478 }
479 
480 static VectorEccAgreementSpec g_vectors[] = {
481     {
482         .algoName = "ECC224",
483         .nidName = "NID_secp224r1",
484         .vectorSource = "https://csrc.nist.gov",
485         .bobD = "d58751997b3a551ccdc6f507bf6ab87e2be7f8267067a455a5815a54",
486         .bobX = "c7893ced15c3009b93cb0abeaea2ede308b67fbbd902c6c5d94c24a4",
487         .bobY = "858afc2edd61fcefef3469dd5a004e74a3c727d16498a9408a8e3224",
488         .aliceD = "e935434303d842605d07112b3b7789ccbe4c6d987db5fa15ea1cdadb",
489         .aliceX = "784028a2246950401ec81f8e4e03fd3765c4da4d45eba652ed5ba2b5",
490         .aliceY = "d071c32634bcf058f072493b6943453a0bd117f5ee5c5866f037f6ab",
491         .sharedKey = "dfd0570d4ae5c9f690c757aead04f7e14758fdc4ee05d8f0d089b91a"
492     },
493     {
494         .algoName = "ECC256",
495         .nidName = "NID_X9_62_prime256v1",
496         .vectorSource = "https://csrc.nist.gov",
497         .bobD = "346be42646f881c24da1e9fcfa214f36d32f2a72c9c053032496836bab168dd5",
498         .bobX = "b2240711b80d28f7b22b9c0e17efbcb6c11d1aca3e1fb5f1c3de9e9e8a612c9a",
499         .bobY = "597a619dc69436837e0d05e9974da9ea83bc03aa9aae3b1156f5b2a02f0df780",
500         .aliceD = "d10f3f9b31bd3dc826b215344ba1746090cf11d5476bf8eafc0b5bfdbb7182b5",
501         .aliceX = "8c1934b6688635531a54a049755417865db7d93d5cab1b2b3360eda96032f07c",
502         .aliceY = "bfdd434a49e78c13886bd3d0b5322e74b35b6905f65274266cd3b0dc18645733",
503         .sharedKey = "b2936bd75eee3f815742a7a545c080485bea730997fae4422aacdadf238d7afb"
504     },
505     {
506         .algoName = "ECC384",
507         .nidName = "NID_secp384r1",
508         .vectorSource = "https://csrc.nist.gov",
509         .bobD = "d164e6e7491a7f01aae746b133d54215edc63b22105c8379e465d7fb7ce4c652a70d0c15b8c195d77c2344ba0c547827",
510         .bobX = "9272c72001bcc2265e9573a8f8d778bafcf54b524a13255dcb112f6f0982280a972d68be67f3b665f55a96e3953bada8",
511         .bobY = "1712493a0c84c35bd8dc073521a205040a2e414d4176da6bbc10acc56cd72952785073d3a56401ccdb62f4b24d52207c",
512         .aliceD = "03f6a1d42a029cfa05c5ef0fab8cdffb85e487053d464b700eeb5ed78097c9f30c633bd3db89f4f48258a32440f215df",
513         .aliceX = "d324916ec06a97f632c962c6f29721ff8b6ad10cb5374a8b031e43a8b8a16e3bc9d78190d9d57498d06c0970fc08ea10",
514         .aliceY = "3dcea5e6478d3ad599f8d58197704b35039e685c13333e5b213c3d0b6fd5687370af858b29443d9a828314f2dce52c37",
515         .sharedKey = "ef1104cfde9c34dc4b3e6ec69a85ff2ef850cb8e935cbefb8b00a4a64d90c9fd0049470234b2bbf91c5359575ed01f01"
516     },
517     {
518         .algoName = "ECC521",
519         .nidName = "NID_secp521r1",
520         .vectorSource = "https://csrc.nist.gov",
521         .bobD = "0000002601f8c65f750bd5aa1099a2eba1197ec6e4001d5b6b4bfd06a2c9344c0b8504157d071f46cd611bae8fa5b39dddd81d4e458def2682d6ab8a68e5dc83dbf1bd24",
522         .bobX = "000001405fe4fa19287fad4b929195cd6aa06800fddaaa3ff07c3e6344751adc4de373c9546c43162ed862a4461c1cb24843ec8e945663e7c9765fbe77423fa362063147",
523         .bobY = "00000080f8fdf9ad2a276b68bcfd42c5412d3460856e3a4724292e4c63c4b03f51c8f82b4503c10be04070f66561983b6e9596806730e48cd0a97628b55d6ffd4c7406eb",
524         .aliceD = "00000143253d19be2489ab254f71a1ee0e294c2b73ca65dcc9929a2de741d886b878459bf595d7b7620ada2a797b429219e926b49daa9a4a8d2de7bcf885bba5b7949e77",
525         .aliceX = "00000031b99843ddfc55e807c20c506c934c93ad5711f00ec0045483fd74b3513696a49ae00153bcaa263b9d86ae1d1eec587d366e614385373449191be385761a0c1b0e",
526         .aliceY = "00000012a7fed0fc77d6fe888f346f18eb34c33d63ea63ae384e21545a1a934b416cb403a7c67a51a4c9f98aa40987e7619dc349960b0cd21911cf82bfe6ef4eb5080e2c",
527         .sharedKey = "00c59aa457630c8490bbb25d3a7e26cf62122516e508920e153151a9019cfc679271b0edbe5cf22f439c127bf1a20cb088557c9bb566f295338c475d8e7883f96a61"
528     },
529     {
530         .algoName = "ECC521",
531         .nidName = "NID_secp521r1",
532         .vectorSource = "https://csrc.nist.gov",
533         .bobD = "00000116b6cf2ee3b79bbec7aee5bfb631e333c675002a41b2a49745fc01b9e24c32403b78d520fac3f56d2e0fcec3c00484931c24fc9a84cdcaf694deb3c69352e17a70",
534         .bobX = "000000e5c00427691ea7c1b49c56c94baaabc0850e4af59e886c92b121590b745aa04ffc87c39673d8ebb66ec7f21ded402f69d4138950b5e5f346880b7d08c9ba69ea30",
535         .bobY = "000000ce7e1d3c7b66979578e5c40903895de8f2fd283542a6386ff2a4728f0b51f0cd7e202a15eed37b0e8f543238ac00fd25f4c51b6b935756c3067d0200602a1e59da",
536         .aliceD = "00000116274c4e5ad28a1de66a7e1b655ace107b575e71e8885e6708a38da344f307ebc30b4febfd4f14af64eac79ac08259dc527c0b760b9fe7f77c4bdad007cebf0587",
537         .aliceX = "000000ebda84610caa6aabd577cfa529045c6f78a3ff0f1c19f2e667be22bee2edac6dcfaa60c97af212b79cb118b2720d2eb45398efdceacf55f3d907e7c070d96db1de",
538         .aliceY = "000001be5ce182f299d7131ad24f363e8ae5fe34da1e3ba213b57f17eae640d04188b5955dbe139560b7f7700b8f017872d48b8ecadb032055e91d8b86ceca5e6981edda",
539         .sharedKey = "01b5aca8c27eebbb704707222f408bd1e7f2fe40cbb976433cd5f5e66eaa0ca1ef812f1b4ad6e5f400f2e3d707aeac3b4bed3bb04668014372009d6654098599d70e"
540     },
541 };
542 INSTANTIATE_TEST_CASE_P(OHCryptoFrameworkAgreementNapiTest, AGREEMENT_VECTOR_ECC_TEST, ::testing::ValuesIn(g_vectors));
543 
544 /**
545 * @tc.number SUB_Security_CryptoFramework_NAPI_Agreement_Vector_Test_0200
546 * @tc.name OHCryptoFrameworkAgreementNapiTest/AGREEMENT_VECTOR_ECC_TEST.SUB_Security_CryptoFramework_NAPI_Agreement_Vector_Test_0200/x
547 * @tc.desc algorithm is Agreement
548 * @tc.size Medium
549 * @tc.type Func
550 * @tc.level Level0
551 */
552 HWTEST_P(AGREEMENT_VECTOR_ECC_TEST, SUB_Security_CryptoFramework_NAPI_Agreement_Vector_Test_0200, TestSize.Level0)
553 {
554     VectorEccAgreementSpec vecInfo = GetParam();
555     Crypto_DataBlob localSharedKey = {.data = nullptr, .len = 0};
556     Crypto_DataBlob peerSharedKey = {.data = nullptr, .len = 0};
557     Crypto_DataBlob sharedKey = {.data = nullptr, .len = 0};
558     OH_CryptoKeyAgreement *localCtx = nullptr;
559     OH_CryptoKeyAgreement *peerCtx = nullptr;
560     OH_CryptoKeyPair *localKeyPair = OHTEST_ConvertEccAsymKey(&vecInfo, true);
561     OH_CryptoKeyPair *peerKeyPair = OHTEST_ConvertEccAsymKey(&vecInfo, false);
562     EXPECT_TRUE(localKeyPair != nullptr && peerKeyPair != nullptr);
563     OH_CryptoPrivKey *localPrivkey = OH_CryptoKeyPair_GetPrivKey(localKeyPair);
564     OH_CryptoPubKey *localPubkey = OH_CryptoKeyPair_GetPubKey(localKeyPair);
565     EXPECT_TRUE(localPrivkey != nullptr && localPubkey != nullptr);
566     OH_CryptoPrivKey *peerPrivkey = OH_CryptoKeyPair_GetPrivKey(peerKeyPair);
567     OH_CryptoPubKey *peerPubkey = OH_CryptoKeyPair_GetPubKey(peerKeyPair);
568     EXPECT_TRUE(peerPrivkey != nullptr && peerPubkey != nullptr);
569     EXPECT_EQ(OH_CryptoKeyAgreement_Create(vecInfo.algoName, &localCtx), CRYPTO_SUCCESS);
570     EXPECT_EQ(OH_CryptoKeyAgreement_GenerateSecret(localCtx, localPrivkey, peerPubkey, &localSharedKey), CRYPTO_SUCCESS);
571     EXPECT_EQ(OH_CryptoKeyAgreement_Create(vecInfo.algoName, &peerCtx), CRYPTO_SUCCESS);
572     EXPECT_EQ(OH_CryptoKeyAgreement_GenerateSecret(peerCtx, peerPrivkey, localPubkey, &peerSharedKey), CRYPTO_SUCCESS);
573     if (localSharedKey.len == peerSharedKey.len) {
574         EXPECT_TRUE(memcmp(peerSharedKey.data, localSharedKey.data, localSharedKey.len) == 0);
575     }
576     EXPECT_EQ(localSharedKey.len, peerSharedKey.len);
577     EXPECT_EQ(OHTEST_HexStringToDataBlob(vecInfo.sharedKey, &sharedKey, true), CRYPTO_SUCCESS);
578     EXPECT_TRUE(memcmp(peerSharedKey.data, sharedKey.data, sharedKey.len) == 0);
579 
580     OH_CryptoKeyAgreement_Destroy(peerCtx);
581     OH_CryptoKeyAgreement_Destroy(localCtx);
582     OH_Crypto_FreeDataBlob(&sharedKey);
583     OH_Crypto_FreeDataBlob(&peerSharedKey);
584     OH_Crypto_FreeDataBlob(&localSharedKey);
585     OH_CryptoKeyPair_Destroy(localKeyPair);
586     OH_CryptoKeyPair_Destroy(peerKeyPair);
587 }
588 
OHTEST_ConvertDhAsymKey(VectorDhAgreementSpec * infoSpec,bool isBob)589 static OH_CryptoKeyPair *OHTEST_ConvertDhAsymKey(VectorDhAgreementSpec *infoSpec, bool isBob)
590 {
591     OH_CryptoAsymKeySpec *specCtx = nullptr;
592     OH_CryptoAsymKeyGeneratorWithSpec *generator = nullptr;
593     OH_CryptoKeyPair *keyPair = nullptr;
594     Crypto_DataBlob sk = { .data = nullptr, .len = 0};
595     Crypto_DataBlob pk = { .data = nullptr, .len = 0};
596     Crypto_DataBlob p = { .data = nullptr, .len = 0};
597     Crypto_DataBlob g = { .data = nullptr, .len = 0};
598 
599     if (isBob) {
600         if (OHTEST_HexStringToDataBlob(infoSpec->bobSk, &sk, true) != CRYPTO_SUCCESS
601             || OHTEST_HexStringToDataBlob(infoSpec->bobPk, &pk, true) != CRYPTO_SUCCESS
602             || OHTEST_HexStringToDataBlob(infoSpec->g, &g, true) != CRYPTO_SUCCESS
603             || OHTEST_HexStringToDataBlob(infoSpec->p, &p, true) != CRYPTO_SUCCESS) {
604             goto EXIT;
605         }
606     } else {
607         if (OHTEST_HexStringToDataBlob(infoSpec->aliceSk, &sk, true) != CRYPTO_SUCCESS
608             || OHTEST_HexStringToDataBlob(infoSpec->alicePk, &pk, true) != CRYPTO_SUCCESS
609             || OHTEST_HexStringToDataBlob(infoSpec->g, &g, true) != CRYPTO_SUCCESS
610             || OHTEST_HexStringToDataBlob(infoSpec->p, &p, true) != CRYPTO_SUCCESS) {
611             goto EXIT;
612         }
613     }
614     if (OH_CryptoAsymKeySpec_Create("DH", CRYPTO_ASYM_KEY_KEY_PAIR_SPEC, &specCtx) != CRYPTO_SUCCESS
615         || OH_CryptoAsymKeySpec_SetParam(specCtx, CRYPTO_DH_P_DATABLOB, &p) != CRYPTO_SUCCESS
616         || OH_CryptoAsymKeySpec_SetParam(specCtx, CRYPTO_DH_G_DATABLOB, &g) != CRYPTO_SUCCESS
617         || OH_CryptoAsymKeySpec_SetParam(specCtx, CRYPTO_DH_SK_DATABLOB, &sk) != CRYPTO_SUCCESS
618         || OH_CryptoAsymKeySpec_SetParam(specCtx, CRYPTO_DH_PK_DATABLOB, &pk) != CRYPTO_SUCCESS) {
619         goto EXIT;
620     }
621 
622     if (OH_CryptoAsymKeyGeneratorWithSpec_Create(specCtx, &generator) != CRYPTO_SUCCESS
623         || OH_CryptoAsymKeyGeneratorWithSpec_GenKeyPair(generator, &keyPair) != CRYPTO_SUCCESS) {
624         goto EXIT;
625     }
626 
627 EXIT:
628     OH_Crypto_FreeDataBlob(&sk);
629     OH_Crypto_FreeDataBlob(&pk);
630     OH_Crypto_FreeDataBlob(&g);
631     OH_Crypto_FreeDataBlob(&p);
632     OH_CryptoAsymKeyGeneratorWithSpec_Destroy(generator);
633     OH_CryptoAsymKeySpec_Destroy(specCtx);
634     return keyPair;
635 }
636 
637 static VectorDhAgreementSpec g_dh_vectors[] = {
638     {
639         .algoName = "DH",
640         .vectorSource = "NIST",
641         .p = "ec6d9f4922c4b88d8d1918ced6f9eb56bcfd2bf5ab4578c0074918d9196ea9b90b9d56c23d981646953ce04afe702fa10d4190e676fa9e37330ca0aa0c79bd1f271cbcbf8f8d4e27d3078113aed0f7f9b6514f1d70e88392ce3675577cf20d29a9bac7297be781bf8b27ffa3e862b4f17a99c5881fbf473fa277219322859b2d6caf73704f4d5c2f5d6aa53e5debec4c580a717f51e1e654f1d7334900c3e7c88b08fff04e4eb3a17552b671c6ec44556008bb65bdd7ee82c1f614bd8060bafbda7f6f2fd8b53a2c2a00edf2d5b1f3283393d196567feeae5ea8d2ceeabe53fdc9edfc9a2483d9ba47c79b54da03dd884ec447b367161efd6b3cc62e3ed9977d",
642         .g = "aecb0bce4bfc90dadda6353533f7214ad4f9abc2e2fa67da3e7785c26f9b44c33c46caa99f1ade901d6af729d437b9500df739047de7d92f751d49a622569d5f1c882f28bd5b54e8ffe57fc43675bf58c40becb93fb988b7eea49b6fb5d63cd7f7a96572ce4e2b2da9b9e46ff70ac4e68b90684602d882363925f0b836062f7f12c3e639d09e3ea34251ff30b9ea1f4bd19199d371ef41d8017dff39cffb2b56dc2d7f20cb8ea074421d9f083e2e5a340454877459d8ee82c5d2eed9b6d6d99c245b9ab1fc76e99363eab561bf110288c470a23cc6f415bff26f3d808ebf06442da31c100fce731c282477184c1a8fd2d27bcab967e33bd3ce3d2a6dd57f3bff",
643         .bobSk = "3abef2371deeb26adfd40c1788b514c5f420eb09fa5e1bc0f9a552b1",
644         .bobPk = "6088cd6a9308c4418d17f3c2764c5ac98d62c5655a3128b6bd2d81a6f2937347ad8d8dc6d01ca6a231bee08c187261ca963470e0cce76c14cf05e9b7b391642ae9d5c5cfe99d49d352d5f8e772815355800550c76c1072098216183e580f973c1aca1244a3a0cdd322ef6a70bb3d9d6067b8405191c7c217e11e47eee85adee1ef73b4aa565233eb323da013b9fa00b0664de3aa289ff70fc6339ef2b94ecd2bdba9017e9503b149559348d1cf461f41e8a12937157b71b14b7e514f907d07e95496874b559ce25eb6c6318b4ba050ffaa521b8b8233ce5c93cf0c2aafd4a59b27268f943feabc81e15daee6ac847036cc962d28b4d1d40f3968c695432881bd",
645         .aliceSk = "6f01b4a219e081b50f856aebc011e41680692e805a498df408960dba",
646         .alicePk = "e796a148656a2b391a6f81dd7f83ad4a3a72f629a87fad6ec9f4616e0ae0b3de34cfb0640c0c92c1e8d845c517258bebcc9d8ae7fdd77dc72c6edc0ee05c2561294c0ef50ab90ba3b740bac32c9a2df17294f22bf5fea474e7ff48daea6abf48dba6f6c7562a6ddfaaf9c2146d3ae2f1de8b9e68092ad76caa767a2c96975fc8b1a88e8848eb089c438d5f932d633e79da19808fa3a1e411ad260565c4954ad32bb0d94b0b746f5266241928f3f0a4441f318700d9e93c6d0f7d57e883eb8b373f4e7893285967028e9e09c774344c05418d6359236fb092f2e3a454483656817317abf309cd7f8016c501133bb8b40875a0ff3b04580abe4d4e717151105bd2",
647         .sharedKey = "b5f47d4a7dabd5e69c2890df50c0cd6f4ab9568fc66779381fae5385b80d7577d5eae00f307ab39b7efc68f885c365e19f0a30c65ecb46b95fd08e0ebeac55d3d012b9f70294a268a254069574fb07a31625077b720cc1b943ab205e7a29e3dbefaa4701a5afbb05e3d90ffe7c5f1b9ca9ad77d14a7d4448d7b7f552ec18aba47dc034a8268b0438cc2ee4f1dad9f08000bf371dffeb8be77a7521e786add03144be775ce1c3425a62226b1aacef10476e6936b831828d9c545ddd9d6c4e76861ba1825deff55d4bd3b0c4a9a938fdef3adbbea48206902b5665b9bed6b7c12eb5fd8c0b6da425654b41235d7852e139073bfb2cb7dce01294eec20f85847cac",
648     },
649     {
650         .algoName = "DH",
651         .vectorSource = "NIST",
652         .p = "ec6d9f4922c4b88d8d1918ced6f9eb56bcfd2bf5ab4578c0074918d9196ea9b90b9d56c23d981646953ce04afe702fa10d4190e676fa9e37330ca0aa0c79bd1f271cbcbf8f8d4e27d3078113aed0f7f9b6514f1d70e88392ce3675577cf20d29a9bac7297be781bf8b27ffa3e862b4f17a99c5881fbf473fa277219322859b2d6caf73704f4d5c2f5d6aa53e5debec4c580a717f51e1e654f1d7334900c3e7c88b08fff04e4eb3a17552b671c6ec44556008bb65bdd7ee82c1f614bd8060bafbda7f6f2fd8b53a2c2a00edf2d5b1f3283393d196567feeae5ea8d2ceeabe53fdc9edfc9a2483d9ba47c79b54da03dd884ec447b367161efd6b3cc62e3ed9977d",
653         .g = "aecb0bce4bfc90dadda6353533f7214ad4f9abc2e2fa67da3e7785c26f9b44c33c46caa99f1ade901d6af729d437b9500df739047de7d92f751d49a622569d5f1c882f28bd5b54e8ffe57fc43675bf58c40becb93fb988b7eea49b6fb5d63cd7f7a96572ce4e2b2da9b9e46ff70ac4e68b90684602d882363925f0b836062f7f12c3e639d09e3ea34251ff30b9ea1f4bd19199d371ef41d8017dff39cffb2b56dc2d7f20cb8ea074421d9f083e2e5a340454877459d8ee82c5d2eed9b6d6d99c245b9ab1fc76e99363eab561bf110288c470a23cc6f415bff26f3d808ebf06442da31c100fce731c282477184c1a8fd2d27bcab967e33bd3ce3d2a6dd57f3bff",
654         .bobSk = "13309c3a9d824a4fb0e6c103bcf33504e98a4e52474a62a28e68269e",
655         .bobPk = "4ede61e9c7444400fcacf1d91e4a6d1bdbb68166668a60b2f54593ee9cd9861cae788e0d8c1deb8e109f4f051cc339477acc08b77d5540bbbeb290dbe1f560b6c4d35223a8ffea34d91c5075e11e2439f58ba2ef606347588250ecfc909e27d8b43c4d8765e51ee9a147fdcf829062dfe99b342e0e3a253561ea6107236760b7334b46749aa85e96493f5c1e1e52177840aaedcb64b98987571154095130ceb249de8f2410e6ab511273b02dbf733bdb8134d5a19a28690b38ba8e0802cf9414d28c1db4864a5c65876aa364aa80dae00df7ecd01fa2089f1dcd843a9f6d87dd018dfdb171e7d5b4e67d0e9d8564019367bf726ce21f08aa52bf0bdd619523f7",
656         .aliceSk = "2cefac774b820ffff233f843981f00feb396095bc4dc6462398d5251",
657         .alicePk = "97dffa91e261f7d56ce9d3cf014de4fe76f101ab02c63966cf2a4aaeb26f8c5006d4a9c664c472c24c683b26852a8dc89fcc517261ada6f365bc625f2e5d223e6f6e81ce451a97143e6d8c5c6db5ca62af32a6eb178ac027504c03f96f5c5448ee527ad639dd4e54de239ac9e2104672af2b0884ef951cc0b50a5af225457cb7364d90dcbc0e357d46309203a387769ca6dc24903bf108d01d975546405863e0d1ff61460e158254fd4af495badffc167742df5be8c8228fe038fea95342f762769cddb74b109f90d60b2a5e2a17c791ad3ea71fb48f064e1a0ae1f901953294394a7cd54a08de0ae52c9c0805c0d862c830c60d4ac66551e5dbdcbb439de29e",
658         .sharedKey = "9731a340d8511a83cfee6497b5bb9cc089678e0be85df16b4afb36bc597a949f8bf49941f3cd514faba6a2cf41928ed87b4aafd4d0febc3774c868e02e0bbf644c2f675573a048583babfb4eb11d41921d392c4f10bd81f096af9510a76eeab652fede4ba4288e876122e265aa7f9415830f8274958f106d24246b488cd0d80ad117bc631d800db5e059db630769a86f99e87d483006358a6faeb44a8e1646d7e9c44a60d8d8a1a36106f01484fa3da93b56e4145c7f156ce848939f79069cbef22bb52df7008adb32880d4da2e803fce901498d8cdcb7fc317ab129ea1a743870b82ab4c5b5acb20dbd4e7f0dbda93ca5faa84aeb556237d25fe56ee21d6b5d",
659     },
660     {
661         .algoName = "DH",
662         .vectorSource = "NIST",
663         .p = "ec6d9f4922c4b88d8d1918ced6f9eb56bcfd2bf5ab4578c0074918d9196ea9b90b9d56c23d981646953ce04afe702fa10d4190e676fa9e37330ca0aa0c79bd1f271cbcbf8f8d4e27d3078113aed0f7f9b6514f1d70e88392ce3675577cf20d29a9bac7297be781bf8b27ffa3e862b4f17a99c5881fbf473fa277219322859b2d6caf73704f4d5c2f5d6aa53e5debec4c580a717f51e1e654f1d7334900c3e7c88b08fff04e4eb3a17552b671c6ec44556008bb65bdd7ee82c1f614bd8060bafbda7f6f2fd8b53a2c2a00edf2d5b1f3283393d196567feeae5ea8d2ceeabe53fdc9edfc9a2483d9ba47c79b54da03dd884ec447b367161efd6b3cc62e3ed9977d",
664         .g = "aecb0bce4bfc90dadda6353533f7214ad4f9abc2e2fa67da3e7785c26f9b44c33c46caa99f1ade901d6af729d437b9500df739047de7d92f751d49a622569d5f1c882f28bd5b54e8ffe57fc43675bf58c40becb93fb988b7eea49b6fb5d63cd7f7a96572ce4e2b2da9b9e46ff70ac4e68b90684602d882363925f0b836062f7f12c3e639d09e3ea34251ff30b9ea1f4bd19199d371ef41d8017dff39cffb2b56dc2d7f20cb8ea074421d9f083e2e5a340454877459d8ee82c5d2eed9b6d6d99c245b9ab1fc76e99363eab561bf110288c470a23cc6f415bff26f3d808ebf06442da31c100fce731c282477184c1a8fd2d27bcab967e33bd3ce3d2a6dd57f3bff",
665         .bobSk = "991b062bd3d604203eeba196d94642150c07e9ea17ebe6b571f5bc9e",
666         .bobPk = "93e4cb6d5f2fa98600ca6e99d2e1882f8fcbe55adc15bdc71df925427f1b832b80e545abd9022b65fe691846c1cc0400bd13e54aacde58f1067c73d67fb252b4d789acd65d899ffeb6fb32e9ec6e0de882f108345fd2c653c1d212e84d78937360a2da6f3bff24ffd5f30915dfaae84ba91b17e9dafd9bbe39a56cc53c932ad72fb7dd45538bc9e4faf13b21843e04d5dc86681db97d6b9cd83c6d39c8c67cf9385ae05c55f3669f7fee7f18736b7fb6a1d8ff55210485f777d7ef5aca6c5af3e2a2f2975e5c9f9ecad22f88181bbf77f16e8c45bfe7934fc81a554295c6fbd18d2e5b7cf3370b746a17a1010c3f1466594649bce01a13f805a36d24dd7bc7c6",
667         .aliceSk = "77227c7376005860f62b3d1269e339f0f62f3a57efedb5636835d613",
668         .alicePk = "5cdf1e3247c60fc224eacfdc5a6753224d029eb0680a4cf855e4da86b0d92efd3fe59292871cd16fee4afa89d525b40218d4971241297a9e1f2490b58fa0d6c746e2e324a0855dc7fffdc30dc1704e946f143ffa208ead22496482faeef5649546d7e82412f3e7e590a60832c2ba44f359aa2ffcdf6e9201037353346052ffe5f8532c9b3b0bebd0bf03247f07c3cff5167aeb7e8d842cb810f15f62a3460aeafa63c208e4189acfdb3ea3f9476a8df1dbe9cc2265f41c78c6a7fe02708313fe151f0e38a70cead01cfc1df1c54975f97ab21e2f0b09582034e9799e04f42aea04c2f496ddc2b1ff4bae0c4a84e1468c15e4b0a2fe8f7d7bbb553a00eafddb19",
669         .sharedKey = "66257222d2cc3a25f7f5a6174fb11362875e74aba8d342a782dd981f677bc9d4f98387c835c3de999f80b077866098c7939d58f1253a76f9f92dae298b42ff60c7e5e03bc685458d5637b17f6f8f80710ea3887061d621fe18ad7335f31aa4d87eee568d90c3c1c4924136152ac166e13cb4c56ee19d2b0f4acd6930cfcdaca23be49781e88d28d6e172f656b08fb4f32303b60ff8bd8b7b61d4e22e427e1fb9498123285535effd9c74af7af7fc6fb431013363be8b85627a51edf45470fd369ea7300156dac3465ede79f91c0f0c2c3563f1e151b20567c97aac3033e55068f91afaa0f39f84436c179c5c2f27588b982c5c9dfeb3675bdd600c46a736a997",
670     },
671     {
672         .algoName = "DH",
673         .vectorSource = "NIST",
674         .p = "ec6d9f4922c4b88d8d1918ced6f9eb56bcfd2bf5ab4578c0074918d9196ea9b90b9d56c23d981646953ce04afe702fa10d4190e676fa9e37330ca0aa0c79bd1f271cbcbf8f8d4e27d3078113aed0f7f9b6514f1d70e88392ce3675577cf20d29a9bac7297be781bf8b27ffa3e862b4f17a99c5881fbf473fa277219322859b2d6caf73704f4d5c2f5d6aa53e5debec4c580a717f51e1e654f1d7334900c3e7c88b08fff04e4eb3a17552b671c6ec44556008bb65bdd7ee82c1f614bd8060bafbda7f6f2fd8b53a2c2a00edf2d5b1f3283393d196567feeae5ea8d2ceeabe53fdc9edfc9a2483d9ba47c79b54da03dd884ec447b367161efd6b3cc62e3ed9977d",
675         .g = "aecb0bce4bfc90dadda6353533f7214ad4f9abc2e2fa67da3e7785c26f9b44c33c46caa99f1ade901d6af729d437b9500df739047de7d92f751d49a622569d5f1c882f28bd5b54e8ffe57fc43675bf58c40becb93fb988b7eea49b6fb5d63cd7f7a96572ce4e2b2da9b9e46ff70ac4e68b90684602d882363925f0b836062f7f12c3e639d09e3ea34251ff30b9ea1f4bd19199d371ef41d8017dff39cffb2b56dc2d7f20cb8ea074421d9f083e2e5a340454877459d8ee82c5d2eed9b6d6d99c245b9ab1fc76e99363eab561bf110288c470a23cc6f415bff26f3d808ebf06442da31c100fce731c282477184c1a8fd2d27bcab967e33bd3ce3d2a6dd57f3bff",
676         .bobSk = "90304ebe3fe2cfc052fa7a8e8907c9d53b9c95fee2a7934ccabd15bd",
677         .bobPk = "d9bda4c8d4d7d678ed57d5fa534ebe302a1537ca1006b6b271a9ed76feff75baf70b162724ac53a7282b59c7ba4e03efb0b8c2112f8e5b7af6f9ddb40d67b065db9576c6fad05db4dd4ebd66fb9b61ac26c9118ea919faf4ab1e956759d149ea809fed69200bff850f3fc94498956ba5e84cd091925b0e8b0495bfbf0fbfec14b52512809a675bd7982a19f3a9bd9791fb23934adbd2625789a53f3baca53dc71837c7f949d7dd37f1ee61fa2a6910df7674db49f48e3725f7a6828270d89b75716f6ad1831008e405c547ee218c38816f253bf773ad046389516bdae7e440026a02bf42c56c22323ab6fdeeee8cd8ba9cd01e096aab87bd264c6499e5640bad",
678         .aliceSk = "48561d8c5f969cb0b70c037d119bbdd339e900bc075d82e54a3a2187",
679         .alicePk = "c65d07a6ede99c32713b8b20a2f29b52c81a3c68c0230a190836b7a129c35f79c0ecf70787846bd36f7ea910498b94bbe2a1e47fadca535ab4ec26e41de4f43dde4430598638054b08cf547009c8fb780695133a1f424c885cce914efcc3bb81d4cc97b2ab44f1bf1824639f264d6647cb3a5aeedf6f743ea768c1a96a01376f64c251fd9669c9a64dd330020bd15039f9bb68666b646e1fd1f1d24f7b214043140968b66fe2ccec9c653584dc8adbaabdf232a86dcf7fc9f675b35fe0689768a88614af3ef8e0b18ee5e50c8575aa62f1af5bd17f34d133f13bf4e7dc7eaed212ac6760946a0163caddabad68d3dd9561c0f66ccd75068d50bc93a642c6dd53",
680         .sharedKey = "b288765f0c306ad3f439f0eff63667795c53929bcb885ec61522d6caa8f43fb86f135dfe6efd0357a738802af8b87bce442c8673d4dab0dcf28c005aee821d17b281fe7d7376c7b0a7c634d53f06b67acc9795baeee72cf95fad97ff4dc6b6454f0af157fc9ad5b5aa8e21cda68c90fa0839c3dcc1dd51550b7c926f455ae663f97fff135376dedf0fd22c2d4366c474c03e1a559f3858c35b3f01e7f53b7456c7efeef2abc039cf97a4fbed6e144de09f9d1426bf76cf1b17f3195acde1d40f59be6e126a87c59a414afb392b1f8af6d78b0dd8c598bad5a55a5dcf4660f0a852a43a1a4d4a8f11d91c82ed47b658d03917e88b8dc3cdda938a1f5075634d8e",
681     },
682     {
683         .algoName = "DH",
684         .vectorSource = "NIST",
685         .p = "ec6d9f4922c4b88d8d1918ced6f9eb56bcfd2bf5ab4578c0074918d9196ea9b90b9d56c23d981646953ce04afe702fa10d4190e676fa9e37330ca0aa0c79bd1f271cbcbf8f8d4e27d3078113aed0f7f9b6514f1d70e88392ce3675577cf20d29a9bac7297be781bf8b27ffa3e862b4f17a99c5881fbf473fa277219322859b2d6caf73704f4d5c2f5d6aa53e5debec4c580a717f51e1e654f1d7334900c3e7c88b08fff04e4eb3a17552b671c6ec44556008bb65bdd7ee82c1f614bd8060bafbda7f6f2fd8b53a2c2a00edf2d5b1f3283393d196567feeae5ea8d2ceeabe53fdc9edfc9a2483d9ba47c79b54da03dd884ec447b367161efd6b3cc62e3ed9977d",
686         .g = "aecb0bce4bfc90dadda6353533f7214ad4f9abc2e2fa67da3e7785c26f9b44c33c46caa99f1ade901d6af729d437b9500df739047de7d92f751d49a622569d5f1c882f28bd5b54e8ffe57fc43675bf58c40becb93fb988b7eea49b6fb5d63cd7f7a96572ce4e2b2da9b9e46ff70ac4e68b90684602d882363925f0b836062f7f12c3e639d09e3ea34251ff30b9ea1f4bd19199d371ef41d8017dff39cffb2b56dc2d7f20cb8ea074421d9f083e2e5a340454877459d8ee82c5d2eed9b6d6d99c245b9ab1fc76e99363eab561bf110288c470a23cc6f415bff26f3d808ebf06442da31c100fce731c282477184c1a8fd2d27bcab967e33bd3ce3d2a6dd57f3bff",
687         .bobSk = "45e344e143fd629e6dbc9ea3856227e9bc85a05bf204cc076bca0d14",
688         .bobPk = "1e7eeeb1f82425b04fec5268e50f123bb9bcb00c4dd5d154a869f4f0e9cbfc7c3cc2220764a7da885148f0b621a72aff827dca426572d500e22e36cb76eb1db50adfdec678271c4a811b25dbe653801a1ce5f3744a75a3b8a5c3b252f2c70275d3995fad65daca10f6056dea8122ecca1b7ad5814b623e4ab1fbf7254b3b25b8c4a47639d7d3887cc627b4f89291dfdf8d8fb60630b370ebd944d528e44f6682d62f1438a86f5ea339ed511258d230f7b5eeab8263ee6522c98a6bd1261321d05e77dabce970ca062ea199bd3383e89cc61de4057a737207933bf32ea418fab424ba7b608b5d3991833ee5742e9417b11f5f41c9aa420563e9f654ef6b751bf5",
689         .aliceSk = "21b48fa77080e8fe23887a8b5539c821c8cfb0023993a145f9380e09",
690         .alicePk = "502c9154b03197a8d992d7c63f3e3e140b00a8bf49d8d3c4e79d0f2a3163bc0f3b73fe6e72b92bfa9abc1d4f9f81190e89383383b709c1352f328c524bd036a54a685fc6e231d9addcc20069e5a972d0372f362285e41a099345ccf7e3460afe2482b0bc41558f7e887b58ceb3ddb9a77d42aaaedac7565d8f4201f338fe87d27b9438058fd342740a30ce776f40266b019acf3ced9b414b842a0322821d171cbfdba711410ce7c3f3a5225344088f9c581033cb382aedbcd964841dece56376495ff1d1525aaf6f46c045ed7719f723d4bff6a3abb030fa7f625e4eb8199692c9a83a9278a294dfdbb1ce3ddc9f33064b5b061704d9fe7478bfe755ddaa1f4d",
691         .sharedKey = "231073548f845acfffe37aaf04af10ecf4dede34508521ddf8800dbdb637cfaff9ac47870050eb0be7a4cb44173528dc37ca1d696ce227067fc628bb0d8634df38ef8a2aa913d7d72260aac7aa2f8aec0814fba0477e2812d689f785e2ca4e84db29612f95a668c25c9cfb932fc307f63e0fa6ecc7d0778d486cf29c322d12c5afac31b5779d86ed9f696c1b6235a09f6fe29207defd4be2bdfafe9f9f8d5698f8193ca852d49e9dfda293fd5ff872c23e71874bb0b897019ce7e1d6a5e208dccb1b541158c70a5be029283fa26d5a5d311d9f82cf4714782ddeb4bba48f716bc8ca812557e78cb2244e5a1fd98f67e1bbade66efc8c2119db3b090a6d5717f4",
692     },
693     {
694         .algoName = "DH",
695         .vectorSource = "NIST",
696         .p = "bbe983d501d1c8f328ff361a82c89b9f72be14205e1513a02489790a6744d90559905183f0edb57d1a9af4696d82c35fe2979459b9b27a7bac6dba21e9b4e964d9885ce0bf625bd44c0ec90dab62e6f323f0a1d1da836606d3771400761121b6a56ac54d38bc506a9f89d69173ee2f7745ebcf0266d5d6c994246b99880d5fe61953303d01409f4c75ae7bfdd8ea2d776d0a3a6161cb284da6c92cbe459ec5ee42cfde8668014234c363ddeb5244e25eefdd96176690c4c9d8524508c2c26a447316ad12bf90ac48d3d0658a18c96c2324614201c5e58e1d85b74072536d3c155152093805c7f58e9da0f0b9415054c67046313ec64d6f4885a46b161586a699",
697         .g = "34499084ea17683867394ada44d286ac8c9c755050dd7e8f1f4235b0466e40a02f55a09eb8f68bc862437f5f45b69fb12a923eff93d1a96c0a55513591cca8377ca2ddb50da0bd4adda14d8ba21e59734958b723f2673e5007abce8e4ef6df09984004652598a2939b1e151b8dbf0c8780eea40fd9e808b6ae1ecffa730d193f78c9eb7fd728391fa6ec6515d284c08c2ac11b273dc9709dd763b3e18dbb9d5e611bc783c337382aea6a6622e7045b878b3dc58c45d6502280beca16637cdc0bad352eb59bf736fc6b17f0e28cb68f816dfa498c5e706e5d5fdd4981e4752fe371b42d10b5a27e25422e7c70005efc2ec03f21026fe5008bdeee9b1a5a8a1940",
698         .bobSk = "d72a8b812b227a7e0ec1be32fedcdaf4da4ee2e36e73402872f94620b6d4b1dc",
699         .bobPk = "b40d9a6860c30f0c2ad3304f4b548126b9ba583ceb7745e110c6faceb9c69155213bea8a86cd5b9fc19f64cc0d66fe332128bc7ffeafd3188c5273b4e7ba505e981eac7db5f12ad95047fb6f1e34aa9dff3120b8550fc571b9349f2339cd96de9c119d0e6be10f690a77c75aedc52a9590c79294f80381aafc343cec6b624d037a6a7c92f72c3884337ef3fdae20b0c660765360f37750960dbc40e499fce579da3b6598fe286868c687bbc8127c1d0b42e9b46cd91b23ba34593b866045b62548537cc7f824b8f671b54298de8c6e617e1bf9ab524f03d1de30b485a73b97da975fbe8ad62e199129b4666d037343be134782208021f23ebc66a607387177e4",
700         .aliceSk = "641f5aa7c7394af1b21a975dfb692094078eee35cafce0f5605863431a6da681",
701         .alicePk = "43888d2ef03e8b1e709fe5803b7f258b785515547151e5a91805344e6f0fbd7cdfe5c21b77404fc70989e635c7215ce5e5116884efe29818bbc0ee95d1858b3c9734d4595dee0ac275b1cee1ad119595666a420ac170b2bdf973671d6772eaaafc8a310422852eb16d1fe2f278dc70f0baddeb5cba5ad7b8c2d7a60fb485bc9da9d35d954d1ce469f211136fa2001d7864a57effb00857891d810b8f36d46847414575d0538eedc46dc991eda739f42a9b7f362717795e586ab95105946429f10f00456771387d65a8923da9969559742bf265b683e001fe65c3ee0598979565b49e8393a761be8a8a5a254d3b391257a7dcf4204d58152aced1ee0be943e211",
702         .sharedKey = "8ad927defbd51c3f0010486493a6016c91f7b462552a1688e4f6b49747da924cb8eacace8efa194cd563397e0bb5e38b7248992b7fb51579e12ea85061e6688b302e9a5e2e0d61e55ac08b30f7a63276d79e65249a473f3f852b7caadb3ff44d5561b27a24d43f850e2065c39bb8d187fcb6e8c8c37a9f5e8b00fa5e8f33732857d49b591884fa50bf55e24dd0d63a9b586da470dc51509b884956a373d9bb0e0fec33602793d514aba435e8b5bcffc93f32f92b22ed995c54483abf1bf202e97b51eb985c19efb41ad371784494b788f318144e793faab766c9bfadcafcb858a0a4c279539e0d5064fe8e78b70d8e866132d62c35fd779f725a1123596db8c4",
703     },
704     {
705         .algoName = "DH",
706         .vectorSource = "NIST",
707         .p = "c170a05419ed997cfe34143808f447a982c91cfa8238ba3fc12d1bfb717843aa99a4a27e1d1a9797440be156391be3bb2636c2bbbdf60aa3b80bf9df700fe58322b6c6c18e813b213d64709b4178a54ebc8feb39766c1b7d93fd55db01b8e284ba68f528f0b004aa436a9e3b7fb30f4b86d050aba98cdb17556eeb4e6c2c963b00da63d739185d0cc4ac52232d288945dd1c50e02930c3b186869325e987defa04d6e5363a2f5b5e7e1b9246199f493fbb4cd018c06777f5138a21c0fa8b111248520977b472ca4c95456979bce3dcf483102a58b1dc21f78a5f23a13c72458aeebd0b685497c91a66b70d3ad2f2f009c22cf60f23e5a47985cd4f5731094515",
708         .g = "0b3eb89f51aee5f9008b0712d0b8312985f864f1e2cd112fd945ed82928a688dbaf83a23e73ea84dff0ad532b8d9e04df8103ed771a6342f0ecb5e4364cacca3d1a1aa41f12444f1fbd4c6a0d7620fdcd378affeb9802db0730c3ac82ec99641d733450360cb84c7150b07ba7b6a3247eeb63b5d35b16ebc026f32bfd8bdef1e3cc2c41abecf36f39909d9e3d1fe7e6eac0b94b925249b7a4c1cdab82e5937d993c960d8fd88860b999691bea622fd2850c72d1c10b35a32c7a7b662523750da17b6d6992606f179467c36aa6b2a1777843c3e72e066c77ccce82f3791e7ecf85ca3d5a41a5695e7e7ae333ab1d6f6cbd23d2ee0956346c31f67b4a0c9ae04c5",
709         .bobSk = "ba55f824ff37b9e2ca94d2f5b5756c592a74aed1895e2a64b8ee47cd6b6e8c05",
710         .bobPk = "b7896bad94401daf346901f6b3b48d6d82bb86fac1f7038dc795d7d131494b2d6957fc4a85476a9ea28659c00371e8b81f83a9d55506488dc7f964f5a7cf747906262e8940b9359c623af445a9d82478b6a9946c6e28d55e2f29827179715b8ce0269eb21dce3a112ed3e38091559adb7f4cc5bc8cc719c3cad6adbba9a0201932a3589476d69171ae6c18354a6cc5f7ed8aa60d5239b20fa852c65ae57801c0867be164ca7c199a88fe5fcb33b81601761340d7e124a7a3b70b7fd371e933750a43bb741d631e4dde965a373895e0be090838585f3698beab147675519d9b36cab1265d8ea550a1a9ef018bfb2d222ed4da99880ab54e321f98e65bbea72575",
711         .aliceSk = "65fae866df2f463bd596159fe88efdfc9bf76bb47ded413a176902bb8fe1b9ff",
712         .alicePk = "0aef33da26c75f03261b2ce928765ac3a546eef8d07242fd8a7e3bad8760a5349c90db18880e9165fbd11631c6b07f88cdad2be71f21dbb95be744ad7b62d4a4a226d16429877dc60ecba4067a398a2d434ab9e63195987ba1d73a9b9d0dbd0fbd6c938084657bc35b3b5c2d4037789969344c58f452654057421486355c806bc8f6d2c3ee6b0694b012241f2d739a349043d46342e72e2da8ad15e92005986ecfc90b93c2c1100081dc2eedcf8f9180d53c1d7a81e3a4dfe71f233a04db0f10680c0fa2d087c647b9758f2f1e347388524b8865479da7aa2f736ee8f828fa157f405d6abb762f62a6d83deaf7092ba06996018455234d1673b86a63320ff9ba",
713         .sharedKey = "ca89b9c87e4233aabda6cf39cb3ad74c02ba29fc7a35ee6d7a3ee05261704d1834c24f42a695d470494f66e373f87dfeaa414478150ea54560db0dee5f4a47011a6a2e522c23a33aeeb567f881ea05522de1b1173d3713e6ebd7e63d8939afedc728021e2ea613d4899e3187391d4c838f3ac979fa11cb704b71f9d586cf1134e039546cd243c935f19ef04614f7d58c808bbe33aa71578019cc5b665aa4c7e6d23249fc7202046c059386c0e85076dd4f2371c6ce16df7804d8002561c69fab27160316f45cfa9b3b3645014ed22ea38eb8720dfcc2616cf32cd6454c911c64a4cbf3b38f6608d2604a7e6549184391c52348c14b2e5f282cecea583dc65d",
714     },
715 };
716 INSTANTIATE_TEST_CASE_P(OHCryptoFrameworkAgreementNapiTest, AGREEMENT_VECTOR_DH_TEST, ::testing::ValuesIn(g_dh_vectors));
717 
718 /**
719 * @tc.number SUB_Security_CryptoFramework_NAPI_Agreement_Vector_Test_0300
720 * @tc.name OHCryptoFrameworkAgreementNapiTest/AGREEMENT_VECTOR_DH_TEST.SUB_Security_CryptoFramework_NAPI_Agreement_Vector_Test_0300/x
721 * @tc.desc algorithm is Agreement
722 * @tc.size Medium
723 * @tc.type Func
724 * @tc.level Level0
725 */
726 HWTEST_P(AGREEMENT_VECTOR_DH_TEST, SUB_Security_CryptoFramework_NAPI_Agreement_Vector_Test_0300, TestSize.Level0)
727 {
728     VectorDhAgreementSpec vecInfo = GetParam();
729     Crypto_DataBlob localSharedKey = {.data = nullptr, .len = 0};
730     Crypto_DataBlob peerSharedKey = {.data = nullptr, .len = 0};
731     Crypto_DataBlob sharedKey = {.data = nullptr, .len = 0};
732     OH_CryptoKeyAgreement *localCtx = nullptr;
733     OH_CryptoKeyAgreement *peerCtx = nullptr;
734     OH_CryptoKeyPair *localKeyPair = OHTEST_ConvertDhAsymKey(&vecInfo, true);
735     OH_CryptoKeyPair *peerKeyPair = OHTEST_ConvertDhAsymKey(&vecInfo, false);
736     EXPECT_TRUE(localKeyPair != nullptr && peerKeyPair != nullptr);
737     OH_CryptoPrivKey *localPrivkey = OH_CryptoKeyPair_GetPrivKey(localKeyPair);
738     OH_CryptoPubKey *localPubkey = OH_CryptoKeyPair_GetPubKey(localKeyPair);
739     EXPECT_TRUE(localPrivkey != nullptr && localPubkey != nullptr);
740     OH_CryptoPrivKey *peerPrivkey = OH_CryptoKeyPair_GetPrivKey(peerKeyPair);
741     OH_CryptoPubKey *peerPubkey = OH_CryptoKeyPair_GetPubKey(peerKeyPair);
742     EXPECT_TRUE(peerPrivkey != nullptr && peerPubkey != nullptr);
743     EXPECT_EQ(OH_CryptoKeyAgreement_Create(vecInfo.algoName, &localCtx), CRYPTO_SUCCESS);
744     EXPECT_EQ(OH_CryptoKeyAgreement_GenerateSecret(localCtx, localPrivkey, peerPubkey, &localSharedKey), CRYPTO_SUCCESS);
745     EXPECT_EQ(OH_CryptoKeyAgreement_Create(vecInfo.algoName, &peerCtx), CRYPTO_SUCCESS);
746     EXPECT_EQ(OH_CryptoKeyAgreement_GenerateSecret(peerCtx, peerPrivkey, localPubkey, &peerSharedKey), CRYPTO_SUCCESS);
747     if (localSharedKey.len == peerSharedKey.len) {
748         EXPECT_TRUE(memcmp(peerSharedKey.data, localSharedKey.data, localSharedKey.len) == 0);
749     }
750     EXPECT_EQ(localSharedKey.len, peerSharedKey.len);
751     EXPECT_EQ(OHTEST_HexStringToDataBlob(vecInfo.sharedKey, &sharedKey, true), CRYPTO_SUCCESS);
752     EXPECT_TRUE(memcmp(peerSharedKey.data, sharedKey.data, sharedKey.len) == 0);
753 
754     OH_CryptoKeyAgreement_Destroy(peerCtx);
755     OH_CryptoKeyAgreement_Destroy(localCtx);
756     OH_Crypto_FreeDataBlob(&sharedKey);
757     OH_Crypto_FreeDataBlob(&peerSharedKey);
758     OH_Crypto_FreeDataBlob(&localSharedKey);
759     OH_CryptoKeyPair_Destroy(localKeyPair);
760     OH_CryptoKeyPair_Destroy(peerKeyPair);
761 }
762 
763 } // namespace Unittest::CryptoFrameworkAgreementNapiTest
764