1 /*
2  * Copyright (c) 2024-2024 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 <chrono>
16 #include <thread>
17 #include <string>
18 #include <filesystem>
19 
20 #include "gtest/gtest.h"
21 #include "options.h"
22 #include "sign_tool_service_impl.h"
23 #include "nlohmann/json.hpp"
24 #include "signer_factory.h"
25 #include "profile_sign_tool.h"
26 #include "params_run_tool.h"
27 #include "pkcs7_data.h"
28 #include "signer_config.h"
29 #include "local_signer.h"
30 #include "bc_pkcs7_generator.h"
31 #include "bc_signeddata_generator.h"
32 #include "profile_verify.h"
33 #include "constant.h"
34 #include "cms_utils.h"
35 
36 using  nlohmann::json;
37 
38 namespace OHOS {
39 namespace SignatureTools {
40 
41 // sign profile使用的全局参数
42 static const std::string SIGN_PROFILE_MODE = "localSign";
43 static const std::string SIGN_PROFILE_KEY_ALIAS = "oh-profile1-key-v1";
44 static const std::string SIGN_PROFILE_PROFILE_CERT_FILE = "./signProfile/profile-release1.pem";
45 static const std::string SIGN_PROFILE_SIGN_ALG = "SHA384withECDSA";
46 static const std::string SIGN_PROFILE_KEY_STORE_FILE = "./signProfile/ohtest.p12";
47 static const std::string SIGN_PROFILE_OUT_FILE = "./signProfile/signed-profile.p7b";
48 static const std::string SIGN_PROFILE_IN_FILE = "./signProfile/profile.json";
49 
50 static const std::string SIGN_PROFILE_CERT_PEM = "./signProfile/profile-release1-cert.pem";
51 static const std::string SIGN_PROFILE_REVERSE_PEM = "./signProfile/profile-release1-reverse.pem";
52 static const std::string SIGN_PROFILE_DOUBLE_CERT_PEM = "./signProfile/profile-release1-invalid_cert_chain.pem";
53 static const std::string SIGN_PROFILE_TMP_P7B = "./signProfile/tmp.p7b";
54 
55 // verify profile 使用的全局参数
56 static const std::string VERIFY_PROFILE_IN_FILE = "./signProfile/app1-profile1.p7b";
57 static const std::string VERIFY_PROFILE_OUT_FILE = "./signProfile/VerifyResult.json";
58 // sign app 使用全局参数
59 static const std::string SIGN_APP_MODE = "localSign";
60 static const std::string SIGN_APP_KEY_ALIAS = "oh-app1-key-v1";
61 static const std::string SIGN_APP_APP_CERT_FILE = "./signProfile/app-release1.pem";
62 static const std::string SIGN_APP_PROFILE_FILE = "./signProfile/app1-profile1.p7b";
63 static const std::string SIGN_APP_IN_FILE = "./signProfile/unsigned.hap";
64 static const std::string SIGN_APP_IN_FILE_TXT = "./signProfile/unsigned.txt";
65 static const std::string SIGN_APP_SIGN_ALG = "SHA256withECDSA";
66 static const std::string SIGN_APP_KEY_STORE_FILE = "./signProfile/ohtest.p12";
67 static const std::string SIGN_APP_OUT_FILE = "./signProfile/signed.hap";
68 
69 class ProfileTest : public testing::Test {
70 public:
71     static void SetUpTestCase(void);
72     static void TearDownTestCase(void);
73     void SetUp()override;
74     void TearDown()override;
75 };
SetUpTestCase(void)76 void ProfileTest::SetUpTestCase(void)
77 {
78     std::filesystem::copy(SIGN_APP_IN_FILE_TXT, SIGN_APP_IN_FILE);
79 }
80 
TearDownTestCase(void)81 void ProfileTest::TearDownTestCase(void)
82 {
83     std::filesystem::remove(SIGN_APP_IN_FILE);
84 }
85 
SetUp()86 void ProfileTest::SetUp()
87 {
88 }
89 
TearDown()90 void ProfileTest::TearDown()
91 {
92 }
93 
94 /**
95  * @tc.name: profile_test004
96  * @tc.desc: Test function of Pkcs7Generator::GenerateSignedData() failed for empty content.
97  * @tc.size: MEDIUM
98  * @tc.type: FUNC
99  * @tc.level Level 1
100  * @tc.require: SR000H63TL
101  */
HWTEST_F(ProfileTest, profile_test004, testing::ext::TestSize.Level1)102 HWTEST_F(ProfileTest, profile_test004, testing::ext::TestSize.Level1)
103 {
104     std::string content;
105     SignerConfig* config = nullptr;
106     std::string ret;
107     std::shared_ptr<Pkcs7Generator> generator = std::make_shared<BCPkcs7Generator>();
108     int result = generator->GenerateSignedData(content, config, ret);
109     EXPECT_TRUE(result <= 0);
110 }
111 
112 /**
113  * @tc.name: profile_test005
114  * @tc.desc: Test function of Pkcs7Generator::GenerateSignedData() failed for nullptr config.
115  * @tc.size: MEDIUM
116  * @tc.type: FUNC
117  * @tc.level Level 1
118  * @tc.require: SR000H63TL
119  */
HWTEST_F(ProfileTest, profile_test005, testing::ext::TestSize.Level1)120 HWTEST_F(ProfileTest, profile_test005, testing::ext::TestSize.Level1)
121 {
122     std::string content = "hello,world";
123     SignerConfig* config = nullptr;
124     std::string ret;
125     std::shared_ptr<Pkcs7Generator> generator = std::make_shared<BCPkcs7Generator>();
126     int result = generator->GenerateSignedData(content, config, ret);
127     EXPECT_TRUE(result <= 0);
128 }
129 
130 /**
131  * @tc.name: profile_test006
132  * @tc.desc: Test function of Pkcs7Generator::GenerateSignedData() failed for nullptr signer.
133  * @tc.size: MEDIUM
134  * @tc.type: FUNC
135  * @tc.level Level 1
136  * @tc.require: SR000H63TL
137  */
HWTEST_F(ProfileTest, profile_test006, testing::ext::TestSize.Level1)138 HWTEST_F(ProfileTest, profile_test006, testing::ext::TestSize.Level1)
139 {
140     Options options;
141     options[Options::MODE] = SIGN_APP_MODE;
142     options[Options::KEY_ALIAS] = SIGN_APP_KEY_ALIAS;
143     options[Options::APP_CERT_FILE] = SIGN_APP_APP_CERT_FILE;
144     options[Options::PROFILE_FILE] = SIGN_APP_PROFILE_FILE;
145     options[Options::IN_FILE] = SIGN_APP_IN_FILE;
146     options[Options::SIGN_ALG] = SIGN_APP_SIGN_ALG;
147     options[Options::KEY_STORE_FILE] = "";
148     options[Options::OUT_FILE] = SIGN_APP_OUT_FILE;
149     char keyStorePwd[] = "123456";
150     char keypwd[] = "123456";
151     options[Options::KEY_RIGHTS] = keyStorePwd;
152     options[Options::KEY_STORE_RIGHTS] = keypwd;
153 
154     // config设置算法 signer
155     SignerConfig config;
156     config.SetOptions(&options);
157     SignatureAlgorithmHelper algClass;
158     std::vector<SignatureAlgorithmHelper> sigs;
159     sigs.resize(1);
160     sigs[0].m_id = SignatureAlgorithmId::ECDSA_WITH_SHA256;
161     config.SetSignatureAlgorithms(sigs);
162 
163     std::string content = "digest content";
164     std::string signedData;
165     std::shared_ptr<Pkcs7Generator> pkcs7Generator = std::make_shared<BCPkcs7Generator>();
166     int result = pkcs7Generator->GenerateSignedData(content, &config, signedData);
167     EXPECT_TRUE(result < 0);
168 }
169 
170 /**
171  * @tc.name: profile_test007
172  * @tc.desc: Test function of Pkcs7Generator::GenerateSignedData() failed for generate pkcs7 block.
173  * @tc.size: MEDIUM
174  * @tc.type: FUNC
175  * @tc.level Level 1
176  * @tc.require: SR000H63TL
177  */
178 HWTEST_F(ProfileTest, profile_test007, testing::ext::TestSize.Level1)
179 {
180     Options options;
181     options[Options::MODE] = SIGN_APP_MODE;
182     options[Options::KEY_ALIAS] = SIGN_APP_KEY_ALIAS;
183     options[Options::APP_CERT_FILE] = SIGN_APP_APP_CERT_FILE;
184     options[Options::PROFILE_FILE] = SIGN_APP_PROFILE_FILE;
185     options[Options::IN_FILE] = SIGN_APP_IN_FILE;
186     options[Options::SIGN_ALG] = SIGN_APP_SIGN_ALG;
187     options[Options::KEY_STORE_FILE] = SIGN_PROFILE_KEY_STORE_FILE;
188     options[Options::OUT_FILE] = SIGN_APP_OUT_FILE;
189     char keyStorePwd[] = "123456";
190     char keypwd[] = "123456";
191     options[Options::KEY_RIGHTS] = keyStorePwd;
192     options[Options::KEY_STORE_RIGHTS] = keypwd;
193 
194     // config设置算法 signer
195     SignerConfig config;
196     config.SetOptions(&options);
197     SignatureAlgorithmHelper algClass;
198     std::vector<SignatureAlgorithmHelper> sigs;
199     sigs.resize(1);
200     sigs[0].m_id = SignatureAlgorithmId::DSA_WITH_SHA512;
201     config.SetSignatureAlgorithms(sigs);
202 
203     std::string content = "digest content";
204     std::string signedData;
205     std::shared_ptr<Pkcs7Generator> pkcs7Generator = std::make_shared<BCPkcs7Generator>();
206     int result = pkcs7Generator->GenerateSignedData(content, &config, signedData);
207     EXPECT_TRUE(result < 0);
208 }
209 
210 /**
211  * @tc.name: profile_test008
212  * @tc.desc: Test function of Pkcs7Generator::GenerateSignedData() failed for invalid certchain.
213  * @tc.size: MEDIUM
214  * @tc.type: FUNC
215  * @tc.level Level 1
216  * @tc.require: SR000H63TL
217  */
218 HWTEST_F(ProfileTest, profile_test008, testing::ext::TestSize.Level1)
219 {
220     Options options;
221     options[Options::MODE] = SIGN_APP_MODE;
222     options[Options::KEY_ALIAS] = SIGN_PROFILE_KEY_ALIAS;
223     options[Options::APP_CERT_FILE] = SIGN_PROFILE_DOUBLE_CERT_PEM;
224     options[Options::PROFILE_FILE] = SIGN_APP_PROFILE_FILE;
225     options[Options::IN_FILE] = SIGN_APP_IN_FILE;
226     options[Options::SIGN_ALG] = SIGN_APP_SIGN_ALG;
227     options[Options::KEY_STORE_FILE] = SIGN_PROFILE_KEY_STORE_FILE;
228     options[Options::OUT_FILE] = SIGN_APP_OUT_FILE;
229     char keyStorePwd[] = "123456";
230     char keypwd[] = "123456";
231     options[Options::KEY_RIGHTS] = keyStorePwd;
232     options[Options::KEY_STORE_RIGHTS] = keypwd;
233 
234     // config设置算法 signer
235     SignerConfig config;
236     config.SetOptions(&options);
237     SignatureAlgorithmHelper algClass;
238     std::vector<SignatureAlgorithmHelper> sigs;
239     sigs.resize(1);
240     sigs[0].m_id = SignatureAlgorithmId::ECDSA_WITH_SHA256;
241     config.SetSignatureAlgorithms(sigs);
242 
243     std::string content = "digest content";
244     std::string signedData;
245     std::shared_ptr<Pkcs7Generator> pkcs7Generator = std::make_shared<BCPkcs7Generator>();
246     int result = pkcs7Generator->GenerateSignedData(content, &config, signedData);
247     EXPECT_TRUE(result < 0);
248 }
249 
250 /**
251  * @tc.name: profile_test009
252  * @tc.desc: Test function of SignedDataGenerator::GenerateSignedData() failed for invalid sigAlg.
253  * @tc.size: MEDIUM
254  * @tc.type: FUNC
255  * @tc.level Level 1
256  * @tc.require: SR000H63TL
257  */
258 HWTEST_F(ProfileTest, profile_test009, testing::ext::TestSize.Level1)
259 {
260     Options options;
261     options[Options::MODE] = SIGN_APP_MODE;
262     options[Options::KEY_ALIAS] = SIGN_APP_KEY_ALIAS;
263     options[Options::APP_CERT_FILE] = SIGN_APP_APP_CERT_FILE;
264     options[Options::PROFILE_FILE] = SIGN_APP_PROFILE_FILE;
265     options[Options::IN_FILE] = SIGN_APP_IN_FILE;
266     options[Options::SIGN_ALG] = SIGN_APP_SIGN_ALG;
267     options[Options::KEY_STORE_FILE] = SIGN_APP_KEY_STORE_FILE;
268     options[Options::OUT_FILE] = SIGN_APP_OUT_FILE;
269     char keyStorePwd[] = "123456";
270     char keypwd[] = "123456";
271     options[Options::KEY_RIGHTS] = keyStorePwd;
272     options[Options::KEY_STORE_RIGHTS] = keypwd;
273 
274     // config设置算法 signer
275     SignerConfig config;
276     config.SetOptions(&options);
277     SignatureAlgorithmHelper algClass;
278     std::vector<SignatureAlgorithmHelper> sigs;
279     sigs.resize(1);
280     sigs[0].m_id = SignatureAlgorithmId::ECDSA_WITH_SHA512;
281     config.SetSignatureAlgorithms(sigs);
282 
283     std::string content = "digest content";
284     std::string signedData;
285     std::shared_ptr<BCSignedDataGenerator> signedDataGenerator =
286         std::make_shared<BCSignedDataGenerator>();
287     signedDataGenerator->SetOwnerId(OWNERID_OID);
288     int result = signedDataGenerator->GenerateSignedData(content, &config, signedData);
289     EXPECT_TRUE(result < 0);
290 }
291 
292 /**
293  * @tc.name: profile_test010
294  * @tc.desc: Test function of SignedDataGenerator::GenerateSignedData() failed for invalid certchain.
295  * @tc.size: MEDIUM
296  * @tc.type: FUNC
297  * @tc.level Level 1
298  * @tc.require: SR000H63TL
299  */
300 HWTEST_F(ProfileTest, profile_test010, testing::ext::TestSize.Level1)
301 {
302     Options options;
303     options[Options::MODE] = SIGN_APP_MODE;
304     options[Options::KEY_ALIAS] = SIGN_PROFILE_KEY_ALIAS;
305     options[Options::APP_CERT_FILE] = SIGN_PROFILE_DOUBLE_CERT_PEM;
306     options[Options::PROFILE_FILE] = SIGN_APP_PROFILE_FILE;
307     options[Options::IN_FILE] = SIGN_APP_IN_FILE;
308     options[Options::SIGN_ALG] = SIGN_APP_SIGN_ALG;
309     options[Options::KEY_STORE_FILE] = SIGN_PROFILE_KEY_STORE_FILE;
310     options[Options::OUT_FILE] = SIGN_APP_OUT_FILE;
311     char keyStorePwd[] = "123456";
312     char keypwd[] = "123456";
313     options[Options::KEY_RIGHTS] = keyStorePwd;
314     options[Options::KEY_STORE_RIGHTS] = keypwd;
315 
316     // config设置算法 signer
317     SignerConfig config;
318     config.SetOptions(&options);
319     SignatureAlgorithmHelper algClass;
320     std::vector<SignatureAlgorithmHelper> sigs;
321     sigs.resize(1);
322     sigs[0].m_id = SignatureAlgorithmId::ECDSA_WITH_SHA256;
323     config.SetSignatureAlgorithms(sigs);
324 
325     std::string content = "digest content";
326     std::string signedData;
327     std::shared_ptr<BCSignedDataGenerator> signedDataGenerator =
328         std::make_shared<BCSignedDataGenerator>();
329     signedDataGenerator->SetOwnerId("ownerID str");
330     int result = signedDataGenerator->GenerateSignedData(content, &config, signedData);
331     EXPECT_TRUE(result < 0);
332 }
333 
334 /**
335  * @tc.name: profile_test011
336  * @tc.desc: Test function of Pkcs7Data::Verify() failed for invalid certchain.
337  * @tc.size: MEDIUM
338  * @tc.type: FUNC
339  * @tc.level Level 1
340  * @tc.require: SR000H63TL
341  */
342 HWTEST_F(ProfileTest, profile_test011, testing::ext::TestSize.Level1)
343 {
344     std::string content = "signed content data";
345     Options options;
346     char keyStorePwd[] = "123456";
347     char keypwd[] = "123456";
348     options[Options::KEY_ALIAS] = SIGN_PROFILE_KEY_ALIAS;
349     options[Options::MODE] = SIGN_PROFILE_MODE;
350     options[Options::PROFILE_CERT_FILE] = SIGN_PROFILE_PROFILE_CERT_FILE;
351     options[Options::SIGN_ALG] = SIGN_PROFILE_SIGN_ALG;
352     options[Options::KEY_STORE_FILE] = SIGN_PROFILE_KEY_STORE_FILE;
353     options[Options::OUT_FILE] = SIGN_PROFILE_OUT_FILE;
354     options[Options::IN_FILE] = SIGN_PROFILE_IN_FILE;
355     options[Options::KEY_RIGHTS] = keypwd;
356     options[Options::KEY_STORE_RIGHTS] = keyStorePwd;
357 
358     LocalizationAdapter adapter(&options);
359     SignerFactory factory;
360     std::shared_ptr<Signer> signer = factory.GetSigner(adapter);
361     PKCS7Data p7;
362     std::string p7b;
363     PKCS7* pkcs7 = nullptr;
364     int result = p7.Sign(content, signer, "SHA384withECDSA", p7b);
365     EXPECT_EQ(result, 0);
366     const unsigned char* p = reinterpret_cast<const unsigned char*>(p7b.data());
367     pkcs7 = d2i_PKCS7(nullptr, &p, static_cast<long>(p7b.size()));
368     STACK_OF(X509)* certs = pkcs7->d.sign->cert;
369     int num = 1;
370     while (sk_X509_num(certs) > num) {
371         X509* cert = sk_X509_delete(certs, sk_X509_num(certs) - 1);
372         X509_free(cert);
373     }
374     sk_X509_push(certs, sk_X509_value(certs, 0));
375     X509_up_ref(sk_X509_value(certs, 0));
376     unsigned char* out = nullptr;
377     int len = 0;
378     len = i2d_PKCS7(pkcs7, &out);
379     p7b.assign(out, out + len);
380     result = p7.Parse(p7b);
381     EXPECT_EQ(result, 0);
382     result = p7.Verify();
383     PKCS7_free(pkcs7);
384     EXPECT_TRUE(result < 0);
385 }
386 
387 /**
388  * @tc.name: profile_test013
389  * @tc.desc: Test function of Pkcs7Data::Verify() failed for invalid certchain.
390  * @tc.size: MEDIUM
391  * @tc.type: FUNC
392  * @tc.level Level 1
393  * @tc.require: SR000H63TL
394  */
395 HWTEST_F(ProfileTest, profile_test013, testing::ext::TestSize.Level1)
396 {
397     std::string content = "signed content data";
398     Options options;
399     char keyStorePwd[] = "123456";
400     char keypwd[] = "123456";
401     options[Options::KEY_ALIAS] = SIGN_PROFILE_KEY_ALIAS;
402     options[Options::MODE] = SIGN_PROFILE_MODE;
403     options[Options::PROFILE_CERT_FILE] = SIGN_PROFILE_PROFILE_CERT_FILE;
404     options[Options::SIGN_ALG] = SIGN_PROFILE_SIGN_ALG;
405     options[Options::KEY_STORE_FILE] = SIGN_PROFILE_KEY_STORE_FILE;
406     options[Options::OUT_FILE] = SIGN_PROFILE_OUT_FILE;
407     options[Options::IN_FILE] = SIGN_PROFILE_IN_FILE;
408     options[Options::KEY_RIGHTS] = keypwd;
409     options[Options::KEY_STORE_RIGHTS] = keyStorePwd;
410 
411     LocalizationAdapter adapter(&options);
412     SignerFactory factory;
413     std::shared_ptr<Signer> signer = factory.GetSigner(adapter);
414     PKCS7Data p7;
415     std::string p7b;
416     PKCS7* pkcs7 = nullptr;
417     int result = p7.Sign(content, signer, "SHA384withECDSA", p7b);
418     EXPECT_EQ(result, 0);
419     const unsigned char* p = reinterpret_cast<const unsigned char*>(p7b.data());
420     pkcs7 = d2i_PKCS7(nullptr, &p, static_cast<long>(p7b.size()));
421     STACK_OF(X509)* certs = pkcs7->d.sign->cert;
422     sk_X509_delete(certs, 2);
423     unsigned char* out = nullptr;
424     int len = 0;
425     len = i2d_PKCS7(pkcs7, &out);
426     p7b.assign(out, out + len);
427     result = p7.Parse(p7b);
428     EXPECT_EQ(result, 0);
429     result = p7.Verify();
430     PKCS7_free(pkcs7);
431     EXPECT_TRUE(result < 0);
432 }
433 
434 /**
435  * @tc.name: profile_test014
436  * @tc.desc: Test function of Pkcs7Data::Verify() failed for invalid certchain.
437  * @tc.size: MEDIUM
438  * @tc.type: FUNC
439  * @tc.level Level 1
440  * @tc.require: SR000H63TL
441  */
442 HWTEST_F(ProfileTest, profile_test014, testing::ext::TestSize.Level1)
443 {
444     std::string content = "signed content data";
445     Options options;
446     char keyStorePwd[] = "123456";
447     char keypwd[] = "123456";
448     options[Options::KEY_ALIAS] = SIGN_PROFILE_KEY_ALIAS;
449     options[Options::MODE] = SIGN_PROFILE_MODE;
450     options[Options::PROFILE_CERT_FILE] = SIGN_PROFILE_PROFILE_CERT_FILE;
451     options[Options::SIGN_ALG] = SIGN_PROFILE_SIGN_ALG;
452     options[Options::KEY_STORE_FILE] = SIGN_PROFILE_KEY_STORE_FILE;
453     options[Options::OUT_FILE] = SIGN_PROFILE_OUT_FILE;
454     options[Options::IN_FILE] = SIGN_PROFILE_IN_FILE;
455     options[Options::KEY_RIGHTS] = keypwd;
456     options[Options::KEY_STORE_RIGHTS] = keyStorePwd;
457 
458     LocalizationAdapter adapter(&options);
459     SignerFactory factory;
460     std::shared_ptr<Signer> signer = factory.GetSigner(adapter);
461     PKCS7Data p7;
462     std::string p7b;
463     PKCS7* pkcs7 = nullptr;
464     int result = p7.Sign(content, signer, "SHA384withECDSA", p7b);
465     EXPECT_EQ(result, 0);
466     const unsigned char* p = reinterpret_cast<const unsigned char*>(p7b.data());
467     pkcs7 = d2i_PKCS7(nullptr, &p, static_cast<long>(p7b.size()));
468     STACK_OF(X509)* certs = pkcs7->d.sign->cert;
469     sk_X509_delete(certs, 2);
470     sk_X509_push(certs, sk_X509_value(certs, 1));
471     X509_up_ref(sk_X509_value(certs, 1));
472     PKCS7Data::PrintCertChainSub(certs);
473     unsigned char* out = nullptr;
474     int len = 0;
475     len = i2d_PKCS7(pkcs7, &out);
476     p7b.assign(out, out + len);
477     result = p7.Parse(p7b);
478     PKCS7Data::PrintCertChainSub(certs);
479     EXPECT_EQ(result, 0);
480     result = p7.Verify();
481     PKCS7_free(pkcs7);
482     EXPECT_TRUE(result < 0);
483 }
484 
485 /**
486  * @tc.name: profile_test015
487  * @tc.desc: Test function of Provision operator ==() interface .
488  * @tc.size: MEDIUM
489  * @tc.type: FUNC
490  * @tc.level Level 1
491  * @tc.require: SR000H63TL
492  */
493 HWTEST_F(ProfileTest, profile_test015, testing::ext::TestSize.Level1)
494 {
495     ProfileInfo* info = nullptr;
496     ProfileInfo info2;
497     info = &info2;
498     info2 = *info;
499     EXPECT_EQ(info2.profileBlockLength, info->profileBlockLength);
500 }
501 
502 /**
503  * @tc.name: profile_test016
504  * @tc.desc: Test function of CmsUtils::VerifySignDataWithUnsignedDataDigest() failed for not matched unsigned data.
505  * @tc.size: MEDIUM
506  * @tc.type: FUNC
507  * @tc.level Level 1
508  * @tc.require: SR000H63TL
509  */
510 HWTEST_F(ProfileTest, profile_test016, testing::ext::TestSize.Level1)
511 {
512     Options options;
513     std::string mode = SIGN_PROFILE_MODE;
514     std::string keyAlias = SIGN_PROFILE_KEY_ALIAS;
515     std::string profileCertFile = SIGN_PROFILE_PROFILE_CERT_FILE;
516     std::string signAlg = SIGN_PROFILE_SIGN_ALG;
517     std::string keystoreFile = SIGN_PROFILE_KEY_STORE_FILE;
518     std::string outFile = SIGN_PROFILE_OUT_FILE;
519     std::string inFile = SIGN_PROFILE_IN_FILE;
520     char keyStorePwd[] = "123456";
521     char keypwd[] = "123456";
522     options[Options::KEY_ALIAS] = keyAlias;
523     options[Options::MODE] = mode;
524     options[Options::PROFILE_CERT_FILE] = profileCertFile;
525     options[Options::SIGN_ALG] = signAlg;
526     options[Options::KEY_STORE_FILE] = keystoreFile;
527     options[Options::OUT_FILE] = outFile;
528     options[Options::IN_FILE] = inFile;
529     options[Options::KEY_RIGHTS] = keypwd;
530     options[Options::KEY_STORE_RIGHTS] = keyStorePwd;
531 
532     LocalizationAdapter adapter(&options);
533     std::string content = "json content";
534     std::string ret;
535     int result = ProfileSignTool::GenerateP7b(adapter, content, ret);
536     EXPECT_EQ(result, 0);
537     std::vector<int8_t> signedData(ret.begin(), ret.end());
538     std::string data = "hello,world";
539     std::vector<int8_t> unsignedData(data.begin(), data.end());
540     EXPECT_EQ(CmsUtils::VerifySignDataWithUnsignedDataDigest(unsignedData, signedData), false);
541 }
542 
543 /**
544  * @tc.name: profile_test017
545  * @tc.desc: Test function of PKCS7Data::SortX509Stack() failed for cert count is 0.
546  * @tc.size: MEDIUM
547  * @tc.type: FUNC
548  * @tc.level Level 1
549  * @tc.require: SR000H63TL
550  */
551 HWTEST_F(ProfileTest, test017, testing::ext::TestSize.Level1)
552 {
553     STACK_OF(X509)* certs = sk_X509_new(nullptr);
554     EXPECT_TRUE(PKCS7Data::SortX509Stack(certs) < 0);
555     sk_X509_free(certs);
556 }
557 
558 /**
559  * @tc.name: profile_test019
560  * @tc.desc: Test function of PKCS7Data::PrintCertChainSub() interface for SUCCESS.
561  * @tc.size: MEDIUM
562  * @tc.type: FUNC
563  * @tc.level Level 1
564  * @tc.require: SR000H63TL
565  */
566 HWTEST_F(ProfileTest, profile_test019, testing::ext::TestSize.Level1)
567 {
568     STACK_OF(X509)* certs = nullptr;
569     PKCS7Data::PrintCertChainSub(certs);
570     EXPECT_EQ(certs, nullptr);
571 }
572 
573 /**
574  * @tc.name: profile_test020
575  * @tc.desc: Test function of PKCS7Data::GetASN1Time() failed for nullptr asn1_time.
576  * @tc.size: MEDIUM
577  * @tc.type: FUNC
578  * @tc.level Level 1
579  * @tc.require: SR000H63TL
580  */
581 HWTEST_F(ProfileTest, profile_test020, testing::ext::TestSize.Level1)
582 {
583     ASN1_TIME* time = nullptr;
584     std::string result = PKCS7Data::GetASN1Time(time);
585     EXPECT_TRUE(result.empty());
586 }
587 
588 /**
589  * @tc.name: profile_test021
590  * @tc.desc: Test function of PKCS7Data::SortX509Stack() failed for invalide certs.
591  * @tc.size: MEDIUM
592  * @tc.type: FUNC
593  * @tc.level Level 1
594  * @tc.require: SR000H63TL
595  */
596 HWTEST_F(ProfileTest, profile_test021, testing::ext::TestSize.Level1)
597 {
598     STACK_OF(X509)* certs = nullptr;
599     EXPECT_TRUE(PKCS7Data::SortX509Stack(certs) < 0);
600 }
601 
602 /**
603  * @tc.name: profile_test022
604  * @tc.desc: Test function of ParseProfile() interface for SUCCESS.
605  * @tc.size: MEDIUM
606  * @tc.type: FUNC
607  * @tc.level Level 1
608  * @tc.require: SR000H63TL
609  */
610 HWTEST_F(ProfileTest, profile_test022, testing::ext::TestSize.Level1)
611 {
612     std::string  provision = "{\"bundle-info\":{\"app-feature\":\"hos_system_app\",\"bundle-n"
613         "ame\":\"com.OpenHarmony.app.test\",\"developer-id\":\"OpenHarmony\",\"development-certi"
614         "ficate\":\"-----BEGIN CERTIFICATE-----\\n"
615         "MIICMzCCAbegAwIBAgIEaOC/zDAMBggqhkjOPQQDAwUAMGMxCzAJBgNVBAYTAkNO\\n"
616         "MRQwEgYDVQQKEwtPcGVuSGFybW9ueTEZMBcGA1UECxMQT3Blbkhhcm1vbnkgVGVh\\n"
617         "bTEjMCEGA1UEAxMaT3Blbkhhcm1vbnkgQXBwbGljYXRpb24gQ0EwHhcNMjEwMjAy\\n"
618         "MTIxOTMxWhcNNDkxMjMxMTIxOTMxWjBoMQswCQYDVQQGEwJDTjEUMBIGA1UEChML\\n"
619         "T3Blbkhhcm1vbnkxGTAXBgNVBAsTEE9wZW5IYXJtb255IFRlYW0xKDAmBgNVBAMT\\n"
620         "H09wZW5IYXJtb255IEFwcGxpY2F0aW9uIFJlbGVhc2UwWTATBgcqhkjOPQIBBggq\\n"
621         "hkjOPQMBBwNCAATbYOCQQpW5fdkYHN45v0X3AHax12jPBdEDosFRIZ1eXmxOYzSG\\n"
622         "JwMfsHhUU90E8lI0TXYZnNmgM1sovubeQqATo1IwUDAfBgNVHSMEGDAWgBTbhrci\\n"
623         "FtULoUu33SV7ufEFfaItRzAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFPtxruhl\\n"
624         "cRBQsJdwcZqLu9oNUVgaMAwGCCqGSM49BAMDBQADaAAwZQIxAJta0PQ2p4DIu/ps\\n"
625         "LMdLCDgQ5UH1l0B4PGhBlMgdi2zf8nk9spazEQI/0XNwpft8QAIwHSuA2WelVi/o\\n"
626         "zAlF08DnbJrOOtOnQq5wHOPlDYB4OtUzOYJk9scotrEnJxJzGsh/\\n"
627         "-----END CERTIFICATE-----\\n"
628         "\"},\"debug-info\":{\"device-id-type\":\"udid\",\"device-ids\":[\"69C7505BE341BDA594"
629         "8C3C0CB44ABCD530296054159EFE0BD16A16CD0129CC42\",\"7EED06506FCE6325EB2E2FAA019458B856"
630         "AB10493A6718C7679A73F958732865\"]},\"issuer\":\"pki_internal\",\"permissions\":{\"rest"
631         "ricted-permissions\":[\"\"]},\"type\":\"debug\",\"uuid\":\"fe686e1b-3770-4824-a938-961"
632         "b140a7c98\",\"validity\":{\"not-after\":1705127532,\"not-before\":\"1610519532\"},\"ve"
633         "rsion-code\":1,\"version-name\":\"1.0.0\"}";
634     ProfileInfo info;
635     AppProvisionVerifyResult result = ParseProfile(provision, info);
636     EXPECT_EQ(result, AppProvisionVerifyResult::PROVISION_OK);
637 }
638 
639 /**
640  * @tc.name: profile_test023
641  * @tc.desc: Test function of ParseProfile() interface for SUCCESS.
642  * @tc.size: MEDIUM
643  * @tc.type: FUNC
644  * @tc.level Level 1
645  * @tc.require: SR000H63TL
646  */
647 HWTEST_F(ProfileTest, profile_test023, testing::ext::TestSize.Level1)
648 {
649     std::string  provision = "{\"bundle-info\":{\"app-feature\":\"hos_system_app\",\"bundle-nam"
650         "e\":\"com.OpenHarmony.app.test\",\"developer-id\":\"OpenHarmony\",\"development-certi"
651         "ficate\":\"-----BEGIN CERTIFICATE-----\\n"
652         "MIICMzCCAbegAwIBAgIEaOC/zDAMBggqhkjOPQQDAwUAMGMxCzAJBgNVBAYTAkNO\\n"
653         "MRQwEgYDVQQKEwtPcGVuSGFybW9ueTEZMBcGA1UECxMQT3Blbkhhcm1vbnkgVGVh\\n"
654         "bTEjMCEGA1UEAxMaT3Blbkhhcm1vbnkgQXBwbGljYXRpb24gQ0EwHhcNMjEwMjAy\\n"
655         "MTIxOTMxWhcNNDkxMjMxMTIxOTMxWjBoMQswCQYDVQQGEwJDTjEUMBIGA1UEChML\\n"
656         "T3Blbkhhcm1vbnkxGTAXBgNVBAsTEE9wZW5IYXJtb255IFRlYW0xKDAmBgNVBAMT\\n"
657         "H09wZW5IYXJtb255IEFwcGxpY2F0aW9uIFJlbGVhc2UwWTATBgcqhkjOPQIBBggq\\n"
658         "hkjOPQMBBwNCAATbYOCQQpW5fdkYHN45v0X3AHax12jPBdEDosFRIZ1eXmxOYzSG\\n"
659         "JwMfsHhUU90E8lI0TXYZnNmgM1sovubeQqATo1IwUDAfBgNVHSMEGDAWgBTbhrci\\n"
660         "FtULoUu33SV7ufEFfaItRzAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFPtxruhl\\n"
661         "cRBQsJdwcZqLu9oNUVgaMAwGCCqGSM49BAMDBQADaAAwZQIxAJta0PQ2p4DIu/ps\\n"
662         "LMdLCDgQ5UH1l0B4PGhBlMgdi2zf8nk9spazEQI/0XNwpft8QAIwHSuA2WelVi/o\\n"
663         "zAlF08DnbJrOOtOnQq5wHOPlDYB4OtUzOYJk9scotrEnJxJzGsh/\\n"
664         "-----END CERTIFICATE-----\\n"
665         "\"},\"debug-info\":{\"device-id-type\":\"udid\",\"device-ids\":[\"69C7505BE341BDA5948C"
666         "3C0CB44ABCD530296054159EFE0BD16A16CD0129CC42\",\"7EED06506FCE6325EB2E2FAA019458B856AB1"
667         "0493A6718C7679A73F958732865\"]},\"issuer\":\"pki_internal\",\"permissions\":{\"restric"
668         "ted-permissions\":[\"\"]},\"type\":\"debug\",\"uuid\":\"fe686e1b-3770-4824-a938-961b14"
669         "0a7c98\",\"validity\":{\"name\":\"weixing\"},\"version-code\":1,\"version-name\":\"1.0.0\"}";
670     ProfileInfo info;
671     AppProvisionVerifyResult result = ParseProfile(provision, info);
672     EXPECT_EQ(result, AppProvisionVerifyResult::PROVISION_OK);
673 }
674 
675 /**
676  * @tc.name: profile_test024
677  * @tc.desc: Test function of ParseProvision() interface for SUCCESS.
678  * @tc.size: MEDIUM
679  * @tc.type: FUNC
680  * @tc.level Level 1
681  * @tc.require: SR000H63TL
682  */
683 HWTEST_F(ProfileTest, profile_test024, testing::ext::TestSize.Level1)
684 {
685     std::string  provision = "{\"app-distribution-type\": \"app_gallery\",\"bundle-info\":{\"app-"
686         "feature\":\"hos_system_app\",\"bundle-name\":\"com.OpenHarmony.app.test\",\"developer-id\":\"O"
687         "penHarmony\",\"distribution-certificate\":\"-----BEGIN CERTIFICATE-----\\n"
688         "MIICMzCCAbegAwIBAgIEaOC/zDAMBggqhkjOPQQDAwUAMGMxCzAJBgNVBAYTAkNO\\n"
689         "MRQwEgYDVQQKEwtPcGVuSGFybW9ueTEZMBcGA1UECxMQT3Blbkhhcm1vbnkgVGVh\\n"
690         "bTEjMCEGA1UEAxMaT3Blbkhhcm1vbnkgQXBwbGljYXRpb24gQ0EwHhcNMjEwMjAy\\n"
691         "MTIxOTMxWhcNNDkxMjMxMTIxOTMxWjBoMQswCQYDVQQGEwJDTjEUMBIGA1UEChML\\n"
692         "T3Blbkhhcm1vbnkxGTAXBgNVBAsTEE9wZW5IYXJtb255IFRlYW0xKDAmBgNVBAMT\\n"
693         "H09wZW5IYXJtb255IEFwcGxpY2F0aW9uIFJlbGVhc2UwWTATBgcqhkjOPQIBBggq\\n"
694         "hkjOPQMBBwNCAATbYOCQQpW5fdkYHN45v0X3AHax12jPBdEDosFRIZ1eXmxOYzSG\\n"
695         "JwMfsHhUU90E8lI0TXYZnNmgM1sovubeQqATo1IwUDAfBgNVHSMEGDAWgBTbhrci\\n"
696         "FtULoUu33SV7ufEFfaItRzAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFPtxruhl\\n"
697         "cRBQsJdwcZqLu9oNUVgaMAwGCCqGSM49BAMDBQADaAAwZQIxAJta0PQ2p4DIu/ps\\n"
698         "LMdLCDgQ5UH1l0B4PGhBlMgdi2zf8nk9spazEQI/0XNwpft8QAIwHSuA2WelVi/o\\n"
699         "zAlF08DnbJrOOtOnQq5wHOPlDYB4OtUzOYJk9scotrEnJxJzGsh/\\n"
700         "-----END CERTIFICATE-----\\n"
701         "\"},\"debug-info\":{\"device-id-type\":\"udid\",\"device-ids\":[\"69C7505BE341BDA5948C3C0CB"
702         "44ABCD530296054159EFE0BD16A16CD0129CC42\",\"7EED06506FCE6325EB2E2FAA019458B856AB10493A6718C76"
703         "79A73F958732865\"]},\"issuer\":\"pki_internal\",\"permissions\":{\"restricted-permissions\":"
704         "[\"\"]},\"type\":\"release\",\"uuid\":\"fe686e1b-3770-4824-a938-961b140a7c98\",\"validity\":"
705         "{\"not-after\":1705127532,\"not-before\":1610519532},\"version-code\":1,\"version-name\":\"1.0.0\"}";
706     ProfileInfo info;
707     AppProvisionVerifyResult result = ParseProvision(provision, info);
708     EXPECT_EQ(result, AppProvisionVerifyResult::PROVISION_OK);
709 }
710 
711 /**
712  * @tc.name: profile_test027
713  * @tc.desc: Test function of ParseProvision() interface for SUCCESS.
714  * @tc.size: MEDIUM
715  * @tc.type: FUNC
716  * @tc.level Level 1
717  * @tc.require: SR000H63TL
718  */
719 HWTEST_F(ProfileTest, profile_test027, testing::ext::TestSize.Level1)
720 {
721     std::string  provision = "{\"app-distribution-type\": \"app_gallery\","
722         "\"bundle-info\":{\"app-feature\":\"hos_system_app\",\"bundle-name\":"
723         "\"com.OpenHarmony.app.test\",\"developer-id\":\"OpenHarmony\","
724         "\"distribution-certificate\":\"-----BEGIN CERTIFICATE-----\\n"
725         "MIICMzCCAbegAwIBAgIEaOC/zDAMBggqhkjOPQQDAwUAMGMxCzAJBgNVBAYTAkNO\\n"
726         "MRQwEgYDVQQKEwtPcGVuSGFybW9ueTEZMBcGA1UECxMQT3Blbkhhcm1vbnkgVGVh\\n"
727         "bTEjMCEGA1UEAxMaT3Blbkhhcm1vbnkgQXBwbGljYXRpb24gQ0EwHhcNMjEwMjAy\\n"
728         "MTIxOTMxWhcNNDkxMjMxMTIxOTMxWjBoMQswCQYDVQQGEwJDTjEUMBIGA1UEChML\\n"
729         "T3Blbkhhcm1vbnkxGTAXBgNVBAsTEE9wZW5IYXJtb255IFRlYW0xKDAmBgNVBAMT\\n"
730         "H09wZW5IYXJtb255IEFwcGxpY2F0aW9uIFJlbGVhc2UwWTATBgcqhkjOPQIBBggq\\n"
731         "hkjOPQMBBwNCAATbYOCQQpW5fdkYHN45v0X3AHax12jPBdEDosFRIZ1eXmxOYzSG\\n"
732         "JwMfsHhUU90E8lI0TXYZnNmgM1sovubeQqATo1IwUDAfBgNVHSMEGDAWgBTbhrci\\n"
733         "FtULoUu33SV7ufEFfaItRzAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFPtxruhl\\n"
734         "cRBQsJdwcZqLu9oNUVgaMAwGCCqGSM49BAMDBQADaAAwZQIxAJta0PQ2p4DIu/ps\\n"
735         "LMdLCDgQ5UH1l0B4PGhBlMgdi2zf8nk9spazEQI/0XNwpft8QAIwHSuA2WelVi/o\\n"
736         "zAlF08DnbJrOOtOnQq5wHOPlDYB4OtUzOYJk9scotrEnJxJzGsh/\\n"
737         "-----END CERTIFICATE-----\\n"
738         "\"},\"debug-info\":{\"device-id-type\":\"udid\",\"device-ids\":["
739         "\"69C7505BE341BDA5948C3C0CB44ABCD530296054159EFE0BD16A16CD0129CC42\","
740         "\"7EED06506FCE6325EB2E2FAA019458B856AB10493A6718C7679A73F958732865\"]},"
741         "\"issuer\":\"pki_internal\",\"permissions\":{\"restricted-permissions"
742         "\":[\"\"]},\"type\":\"release\",\"uuid\":\"\",\"validity\":{\"not-after"
743         "\":1705127532,\"not-before\":1610519532},\"version-code\":1,\"version-name\":\"1.0.0\"}";
744     ProfileInfo info;
745     AppProvisionVerifyResult result = ParseProvision(provision, info);
746     EXPECT_EQ(result, AppProvisionVerifyResult::PROVISION_OK);
747 }
748 
749 /**
750  * @tc.name: profile_test028
751  * @tc.desc: Test function of ParseProvision() interface for SUCCESS.
752  * @tc.size: MEDIUM
753  * @tc.type: FUNC
754  * @tc.level Level 1
755  * @tc.require: SR000H63TL
756  */
757 HWTEST_F(ProfileTest, profile_test028, testing::ext::TestSize.Level1)
758 {
759     std::string  provision = "{\"app-distribution-type\": \"app_gallery\","
760         "\"bundle-info\":{\"app-feature\":\"hos_system_app\",\"bundle-name\":"
761         "\"com.OpenHarmony.app.test\",\"developer-id\":\"OpenHarmony\","
762         "\"distribution-certificate\":\"-----BEGIN CERTIFICATE-----\\n"
763         "MIICMzCCAbegAwIBAgIEaOC/zDAMBggqhkjOPQQDAwUAMGMxCzAJBgNVBAYTAkNO\\n"
764         "MRQwEgYDVQQKEwtPcGVuSGFybW9ueTEZMBcGA1UECxMQT3Blbkhhcm1vbnkgVGVh\\n"
765         "bTEjMCEGA1UEAxMaT3Blbkhhcm1vbnkgQXBwbGljYXRpb24gQ0EwHhcNMjEwMjAy\\n"
766         "MTIxOTMxWhcNNDkxMjMxMTIxOTMxWjBoMQswCQYDVQQGEwJDTjEUMBIGA1UEChML\\n"
767         "T3Blbkhhcm1vbnkxGTAXBgNVBAsTEE9wZW5IYXJtb255IFRlYW0xKDAmBgNVBAMT\\n"
768         "H09wZW5IYXJtb255IEFwcGxpY2F0aW9uIFJlbGVhc2UwWTATBgcqhkjOPQIBBggq\\n"
769         "hkjOPQMBBwNCAATbYOCQQpW5fdkYHN45v0X3AHax12jPBdEDosFRIZ1eXmxOYzSG\\n"
770         "JwMfsHhUU90E8lI0TXYZnNmgM1sovubeQqATo1IwUDAfBgNVHSMEGDAWgBTbhrci\\n"
771         "FtULoUu33SV7ufEFfaItRzAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFPtxruhl\\n"
772         "cRBQsJdwcZqLu9oNUVgaMAwGCCqGSM49BAMDBQADaAAwZQIxAJta0PQ2p4DIu/ps\\n"
773         "LMdLCDgQ5UH1l0B4PGhBlMgdi2zf8nk9spazEQI/0XNwpft8QAIwHSuA2WelVi/o\\n"
774         "zAlF08DnbJrOOtOnQq5wHOPlDYB4OtUzOYJk9scotrEnJxJzGsh/\\n"
775         "-----END CERTIFICATE-----\\n"
776         "\"},\"debug-info\":{\"device-id-type\":\"udid\",\"device-ids\":["
777         "\"69C7505BE341BDA5948C3C0CB44ABCD530296054159EFE0BD16A16CD0129CC42\","
778         "\"7EED06506FCE6325EB2E2FAA019458B856AB10493A6718C7679A73F958732865\"]},"
779         "\"issuer\":\"pki_internal\",\"permissions\":{\"restricted-permissions"
780         "\":[\"\"]},\"type\":\"release\",\"uuid\":\"\",\"validity\":{\"not-after"
781         "\":1705127532,\"not-before\":1610519532},\"version-code\":1,\"version-name\":\"1.0.0\"}";
782     ProfileInfo info;
783     AppProvisionVerifyResult result = ParseProvision(provision, info);
784     EXPECT_EQ(result, AppProvisionVerifyResult::PROVISION_OK);
785 }
786 
787 /**
788  * @tc.name: profile_test029
789  * @tc.desc: Test function of RunSignApp() failed for invalid json.
790  * @tc.size: MEDIUM
791  * @tc.type: FUNC
792  * @tc.level Level 1
793  * @tc.require: SR000H63TL
794  */
795 HWTEST_F(ProfileTest, profile_test029, testing::ext::TestSize.Level1)
796 {
797     std::unique_ptr<SignToolServiceImpl> api = std::make_unique<SignToolServiceImpl>();
798     std::shared_ptr<Options> params = std::make_shared<Options>();
799     char keyPwd[] = "123456";
800     char keystorePwd[] = "123456";
801     std::string  provision = "{\"app-distribution-type\": \"app_gallery\",\"bundle-info\":{\"app-"
802         "feature\":\"hos_system_app\",\"bundle-name\":\"com.OpenHarmony.app.test\",\"developer-id\":\"O"
803         "penHarmony\",\"distribution-certificate\":\"-----BEGIN CERTIFICATE-----\\n"
804         "MIICMzCCAbegAwIBAgIEaOC/zDAMBggqhkjOPQQDAwUAMGMxCzAJBgNVBAYTAkNO\\n"
805         "MRQwEgYDVQQKEwtPcGVuSGFybW9ueTEZMBcGA1UECxMQT3Blbkhhcm1vbnkgVGVh\\n"
806         "bTEjMCEGA1UEAxMaT3Blbkhhcm1vbnkgQXBwbGljYXRpb24gQ0EwHhcNMjEwMjAy\\n"
807         "MTIxOTMxWhcNNDkxMjMxMTIxOTMxWjBoMQswCQYDVQQGEwJDTjEUMBIGA1UEChML\\n"
808         "T3Blbkhhcm1vbnkxGTAXBgNVBAsTEE9wZW5IYXJtb255IFRlYW0xKDAmBgNVBAMT\\n"
809         "H09wZW5IYXJtb255IEFwcGxpY2F0aW9uIFJlbGVhc2UwWTATBgcqhkjOPQIBBggq\\n"
810         "hkjOPQMBBwNCAATbYOCQQpW5fdkYHN45v0X3AHax12jPBdEDosFRIZ1eXmxOYzSG\\n"
811         "JwMfsHhUU90E8lI0TXYZnNmgM1sovubeQqATo1IwUDAfBgNVHSMEGDAWgBTbhrci\\n"
812         "FtULoUu33SV7ufEFfaItRzAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFPtxruhl\\n"
813         "cRBQsJdwcZqLu9oNUVgaMAwGCCqGSM49BAMDBQADaAAwZQIxAJta0PQ2p4DIu/ps\\n"
814         "LMdLCDgQ5UH1l0B4PGhBlMgdi2zf8nk9spazEQI/0XNwpft8QAIwHSuA2WelVi/o\\n"
815         "zAlF08DnbJrOOtOnQq5wHOPlDYB4OtUzOYJk9scotrEnJxJzGsh/\\n"
816         "-----END CERTIFICATE-----\\n"
817         "\"},\"debug-info\":{\"device-id-type\":\"udid\",\"device-ids\":[\"69C7505BE341BDA5948C3C0CB"
818         "44ABCD530296054159EFE0BD16A16CD0129CC42\",\"7EED06506FCE6325EB2E2FAA019458B856AB10493A6718C76"
819         "79A73F958732865\"]},\"issuer\":\"pki_internal\",\"permissions\":{\"restricted-permissions\":"
820         "[\"\"]},\"type\":\"release\",\"uuid\":\"fe686e1b-3770-4824-a938-961b140a7c98\",\"validity\":"
821         "{\"not-after\":1705127532,\"not-before\":1610519532},\"version-code\":1,\"version-name\":\"1.0.0\"}";
822     FileUtils::Write(provision, VERIFY_PROFILE_OUT_FILE);
823     (*params)["mode"] = SIGN_APP_MODE;
824     (*params)["keyAlias"] = SIGN_APP_KEY_ALIAS;
825     (*params)["signAlg"] = SIGN_APP_SIGN_ALG;
826     (*params)["appCertFile"] = SIGN_APP_APP_CERT_FILE;
827     (*params)["profileFile"] = VERIFY_PROFILE_OUT_FILE;
828     (*params)["inFile"] = SIGN_APP_IN_FILE;
829     (*params)["keystoreFile"] = SIGN_APP_KEY_STORE_FILE;
830     (*params)["outFile"] = SIGN_APP_OUT_FILE;
831     (*params)["keyPwd"] = keyPwd;
832     (*params)["keystorePwd"] = keystorePwd;
833     (*params)["inForm"] = std::string("zip");
834     (*params)["profileSigned"] = std::string("0");
835     (*params)["signCode"] = std::string("0");
836 
837     bool ret = ParamsRunTool::RunSignApp(params.get(), *api);
838     EXPECT_EQ(ret, true);
839 }
840 
841 static void GenerateTmpP7b()
842 {
843     Options options;
844     char keyStorePwd[] = "123456";
845     char keypwd[] = "123456";
846     options[Options::KEY_ALIAS] = SIGN_PROFILE_KEY_ALIAS;
847     options[Options::MODE] = SIGN_PROFILE_MODE;
848     options[Options::PROFILE_CERT_FILE] = SIGN_PROFILE_DOUBLE_CERT_PEM;
849     options[Options::SIGN_ALG] = SIGN_PROFILE_SIGN_ALG;
850     options[Options::KEY_STORE_FILE] = SIGN_PROFILE_KEY_STORE_FILE;
851     options[Options::OUT_FILE] = SIGN_PROFILE_OUT_FILE;
852     options[Options::IN_FILE] = SIGN_PROFILE_IN_FILE;
853     options[Options::KEY_RIGHTS] = keypwd;
854     options[Options::KEY_STORE_RIGHTS] = keyStorePwd;
855 
856     LocalizationAdapter adapter(&options);
857     std::string  provision = "45";
858     std::string ret;
859     int result = ProfileSignTool::GenerateP7b(adapter, provision, ret);
860     FileUtils::Write(ret, SIGN_PROFILE_TMP_P7B);
861     EXPECT_TRUE(result < 0);
862 }
863 
864 /**
865  * @tc.name: profile_test030
866  * @tc.desc: Test function of RunSignApp() failed for invalid p7b.
867  * @tc.size: MEDIUM
868  * @tc.type: FUNC
869  * @tc.level Level 1
870  * @tc.require: SR000H63TL
871  */
872 HWTEST_F(ProfileTest, profile_test030, testing::ext::TestSize.Level1)
873 {
874     GenerateTmpP7b();
875     std::unique_ptr<SignToolServiceImpl> api = std::make_unique<SignToolServiceImpl>();
876     std::shared_ptr<Options> params = std::make_shared<Options>();
877     char keyPwd[] = "123456";
878     char keystorePwd[] = "123456";
879     (*params)["mode"] = SIGN_APP_MODE;
880     (*params)["keyAlias"] = SIGN_APP_KEY_ALIAS;
881     (*params)["signAlg"] = SIGN_APP_SIGN_ALG;
882     (*params)["appCertFile"] = SIGN_APP_APP_CERT_FILE;
883     (*params)["profileFile"] = SIGN_PROFILE_TMP_P7B;
884     (*params)["inFile"] = SIGN_APP_IN_FILE;
885     (*params)["keystoreFile"] = SIGN_APP_KEY_STORE_FILE;
886     (*params)["outFile"] = SIGN_APP_OUT_FILE;
887     (*params)["keyPwd"] = keyPwd;
888     (*params)["keystorePwd"] = keystorePwd;
889     (*params)["inForm"] = std::string("zip");
890     (*params)["profileSigned"] = std::string("1");
891     (*params)["signCode"] = std::string("0");
892 
893     bool ret = ParamsRunTool::RunSignApp(params.get(), *api);
894     EXPECT_FALSE(ret);
895 }
896 
897 static STACK_OF(X509)* ReadCerts(const std::string& path)
898 {
899     X509* cert = nullptr;
900     BIO* in = nullptr;
901     STACK_OF(X509)* certs = nullptr;
902     certs = sk_X509_new(nullptr);
903     if (certs == nullptr)
904         goto err;
905     in = BIO_new_file(path.c_str(), "rb");
906     if (in == nullptr)
907         goto err;
908     while ((cert = PEM_read_bio_X509(in, nullptr, nullptr, nullptr)))
909     {
910         sk_X509_push(certs, cert);
911     }
912     BIO_free(in);
913     return certs;
914 err:
915     BIO_free(in);
916     sk_X509_pop_free(certs, X509_free);
917     return nullptr;
918 }
919 
920 /**
921  * @tc.name: profile_test031
922  * @tc.desc: Test function of SortX509Stack() failed for invalid certchain.
923  * @tc.size: MEDIUM
924  * @tc.type: FUNC
925  * @tc.level Level 1
926  * @tc.require: SR000H63TL
927  */
928 HWTEST_F(ProfileTest, profile_test031, testing::ext::TestSize.Level1)
929 {
930     STACK_OF(X509)* certs = ReadCerts(SIGN_PROFILE_CERT_PEM);
931     EXPECT_TRUE(PKCS7Data::SortX509Stack(certs) < 0);
932     sk_X509_pop_free(certs, X509_free);
933 }
934 
935 /**
936  * @tc.name: profile_test032
937  * @tc.desc: Test function of SortX509Stack() failed for invalid certchain.
938  * @tc.size: MEDIUM
939  * @tc.type: FUNC
940  * @tc.level Level 1
941  * @tc.require: SR000H63TL
942  */
943 HWTEST_F(ProfileTest, profile_test032, testing::ext::TestSize.Level1)
944 {
945     STACK_OF(X509)* certs = ReadCerts(SIGN_PROFILE_PROFILE_CERT_FILE);
946     EXPECT_TRUE(PKCS7Data::SortX509Stack(certs) == 0);
947     X509* entityCert = sk_X509_value(certs, 0);
948     X509* entityCopy = X509_dup(entityCert);
949     X509* root = sk_X509_pop(certs);
950     X509* middle = sk_X509_pop(certs);
951     X509_free(root);
952     X509_free(middle);
953     sk_X509_insert(certs, entityCopy, 0);
954     EXPECT_TRUE(PKCS7Data::SortX509Stack(certs) < 0);
955     sk_X509_pop_free(certs, X509_free);
956 }
957 
958 /**
959  * @tc.name: profile_test033
960  * @tc.desc: Test function of SortX509Stack() failed for invalid certchain.
961  * @tc.size: MEDIUM
962  * @tc.type: FUNC
963  * @tc.level Level 1
964  * @tc.require: SR000H63TL
965  */
966 HWTEST_F(ProfileTest, profile_test033, testing::ext::TestSize.Level1)
967 {
968     STACK_OF(X509)* certs = ReadCerts(SIGN_PROFILE_PROFILE_CERT_FILE);
969     EXPECT_TRUE(PKCS7Data::SortX509Stack(certs) == 0);
970     X509* root = sk_X509_pop(certs);
971     X509_free(root);
972     EXPECT_TRUE(PKCS7Data::SortX509Stack(certs) < 0);
973     sk_X509_pop_free(certs, X509_free);
974 }
975 
976 /**
977  * @tc.name: profile_test030
978  * @tc.desc: Test function of SortX509Stack() interface failed for invalid certchain.
979  * @tc.size: MEDIUM
980  * @tc.type: FUNC
981  * @tc.level Level 1
982  * @tc.require: SR000H63TL
983  */
984 HWTEST_F(ProfileTest, profile_test034, testing::ext::TestSize.Level1)
985 {
986     STACK_OF(X509)* certs = ReadCerts(SIGN_PROFILE_PROFILE_CERT_FILE);
987     EXPECT_TRUE(PKCS7Data::SortX509Stack(certs) == 0);
988     X509* root = sk_X509_pop(certs);
989     X509* middle = sk_X509_pop(certs);
990     X509* entity = sk_X509_pop(certs);
991     X509_free(entity);
992     sk_X509_insert(certs, middle, 0);
993     sk_X509_insert(certs, X509_dup(middle), 0);
994     sk_X509_insert(certs, root, 0);
995     EXPECT_TRUE(PKCS7Data::SortX509Stack(certs) < 0);
996     sk_X509_pop_free(certs, X509_free);
997 }
998 }
999 }
1000