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