1 /*
2  * Copyright (c) 2022 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 
16 #include <gtest/gtest.h>
17 
18 #include <openssl/evp.h>
19 #include <openssl/x509.h>
20 
21 #include "securec.h"
22 
23 #include "cm_cert_data_part1_rsa.h"
24 #include "cm_module_cert_data.h"
25 #include "cm_pfx.h"
26 #include "cm_type.h"
27 #include "cm_x509.h"
28 
29 using namespace testing::ext;
30 namespace {
31 static constexpr uint32_t DEFAULT_SIZE = 1024;
32 
33 class CmCertParseTest : public testing::Test {
34 public:
35     static void SetUpTestCase(void);
36 
37     static void TearDownTestCase(void);
38 
39     void SetUp();
40 
41     void TearDown();
42 };
43 
SetUpTestCase(void)44 void CmCertParseTest::SetUpTestCase(void)
45 {
46 }
47 
TearDownTestCase(void)48 void CmCertParseTest::TearDownTestCase(void)
49 {
50 }
51 
SetUp()52 void CmCertParseTest::SetUp()
53 {
54 }
55 
TearDown()56 void CmCertParseTest::TearDown()
57 {
58 }
59 
60 /**
61 * @tc.name: CmCertParseTest001
62 * @tc.desc: test InitCertContext certBuf nullptr
63 * @tc.type: FUNC
64 * @tc.require: AR000H0MIA /SR000H09NA
65 */
66 HWTEST_F(CmCertParseTest, CmCertParseTest001, TestSize.Level0)
67 {
68     X509 *x509 = InitCertContext(nullptr, 0);
69     EXPECT_EQ(x509, nullptr);
70     FreeCertContext(x509);
71 }
72 
73 /**
74 * @tc.name: CmCertParseTest002
75 * @tc.desc: test InitCertContext size invalid
76 * @tc.type: FUNC
77 * @tc.require: AR000H0MIA /SR000H09NA
78 */
79 HWTEST_F(CmCertParseTest, CmCertParseTest002, TestSize.Level0)
80 {
81     uint8_t certBuf[] = "this is test for certBuf";
82     X509 *x509 = InitCertContext(certBuf, MAX_LEN_CERTIFICATE + 1);
83     EXPECT_EQ(x509, nullptr);
84     FreeCertContext(x509);
85 }
86 
87 /**
88 * @tc.name: CmCertParseTest003
89 * @tc.desc: test InitCertContext cert buffer pem format invalid
90 * @tc.type: FUNC
91 * @tc.require: AR000H0MIA /SR000H09NA
92 */
93 HWTEST_F(CmCertParseTest, CmCertParseTest003, TestSize.Level0)
94 {
95     uint8_t certBuf[] = "this is test for certBuf";
96     certBuf[0] = '-';
97     X509 *x509 = InitCertContext(certBuf, sizeof(certBuf));
98     EXPECT_EQ(x509, nullptr);
99     FreeCertContext(x509);
100 }
101 
102 /**
103 * @tc.name: CmCertParseTest004
104 * @tc.desc: test InitCertContext cert buffer der format invalid
105 * @tc.type: FUNC
106 * @tc.require: AR000H0MIA /SR000H09NA
107 */
108 HWTEST_F(CmCertParseTest, CmCertParseTest004, TestSize.Level0)
109 {
110     uint8_t certBuf[] = "this is test for certBuf";
111     certBuf[0] = ASN1_TAG_TYPE_SEQ;
112     X509 *x509 = InitCertContext(certBuf, sizeof(certBuf));
113     EXPECT_EQ(x509, nullptr);
114     FreeCertContext(x509);
115 }
116 
117 /**
118 * @tc.name: CmCertParseTest005
119 * @tc.desc: test InitCertContext cert buffer not pem or der format
120 * @tc.type: FUNC
121 * @tc.require: AR000H0MIA /SR000H09NA
122 */
123 HWTEST_F(CmCertParseTest, CmCertParseTest005, TestSize.Level0)
124 {
125     uint8_t certBuf[] = "this is test for certBuf";
126     X509 *x509 = InitCertContext(certBuf, sizeof(certBuf));
127     EXPECT_EQ(x509, nullptr);
128     FreeCertContext(x509);
129 }
130 
131 /**
132 * @tc.name: CmCertParseTest006
133 * @tc.desc: test GetX509SerialNumber x509 is nullptr
134 * @tc.type: FUNC
135 * @tc.require: AR000H0MIA /SR000H09NA
136 */
137 HWTEST_F(CmCertParseTest, CmCertParseTest006, TestSize.Level0)
138 {
139     char tmpSerialNumber[DEFAULT_SIZE] = {0};
140     int32_t ret = GetX509SerialNumber(nullptr, tmpSerialNumber, sizeof(tmpSerialNumber));
141     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
142 }
143 
144 /**
145 * @tc.name: CmCertParseTest007
146 * @tc.desc: test GetX509SerialNumber outBuf is nullptr
147 * @tc.type: FUNC
148 * @tc.require: AR000H0MIA /SR000H09NA
149 */
150 HWTEST_F(CmCertParseTest, CmCertParseTest007, TestSize.Level0)
151 {
152     X509 *x509 = InitCertContext(g_certData, sizeof(g_certData));
153     EXPECT_NE(x509, nullptr);
154 
155     char tmpSerialNumber[DEFAULT_SIZE] = {0};
156     int32_t ret = GetX509SerialNumber(x509, nullptr, sizeof(tmpSerialNumber));
157     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
158 
159     FreeCertContext(x509);
160 }
161 
162 /**
163 * @tc.name: CmCertParseTest008
164 * @tc.desc: test GetX509SerialNumber outBufMaxSize is 0
165 * @tc.type: FUNC
166 * @tc.require: AR000H0MIA /SR000H09NA
167 */
168 HWTEST_F(CmCertParseTest, CmCertParseTest008, TestSize.Level0)
169 {
170     X509 *x509 = InitCertContext(g_certData, sizeof(g_certData));
171     EXPECT_NE(x509, nullptr);
172 
173     char tmpSerialNumber[DEFAULT_SIZE] = {0};
174     int32_t ret = GetX509SerialNumber(x509, tmpSerialNumber, 0);
175     EXPECT_EQ(ret, CMR_ERROR_BUFFER_TOO_SMALL);
176 
177     FreeCertContext(x509);
178 }
179 
180 /**
181 * @tc.name: CmCertParseTest009
182 * @tc.desc: test GetX509SubjectNameLongFormat outBufMaxSize is 0
183 * @tc.type: FUNC
184 * @tc.require: AR000H0MIA /SR000H09NA
185 */
186 HWTEST_F(CmCertParseTest, CmCertParseTest009, TestSize.Level0)
187 {
188     X509 *x509 = InitCertContext(g_certData, sizeof(g_certData));
189     EXPECT_NE(x509, nullptr);
190 
191     char tmpSubjectName[DEFAULT_SIZE] = {0};
192     int32_t ret = GetX509SubjectNameLongFormat(x509, tmpSubjectName, 0);
193     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
194 
195     FreeCertContext(x509);
196 }
197 
198 /**
199 * @tc.name: CmCertParseTest010
200 * @tc.desc: test GetX509SubjectNameLongFormat outBuf is nullptr
201 * @tc.type: FUNC
202 * @tc.require: AR000H0MIA /SR000H09NA
203 */
204 HWTEST_F(CmCertParseTest, CmCertParseTest010, TestSize.Level0)
205 {
206     X509 *x509 = InitCertContext(g_certData, sizeof(g_certData));
207     EXPECT_NE(x509, nullptr);
208 
209     char tmpSubjectName[DEFAULT_SIZE] = {0};
210     int32_t ret = GetX509SubjectNameLongFormat(x509, nullptr, sizeof(tmpSubjectName));
211     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
212 
213     FreeCertContext(x509);
214 }
215 
216 /**
217 * @tc.name: CmCertParseTest011
218 * @tc.desc: test GetX509SubjectNameLongFormat x509 is nullptr
219 * @tc.type: FUNC
220 * @tc.require: AR000H0MIA /SR000H09NA
221 */
222 HWTEST_F(CmCertParseTest, CmCertParseTest011, TestSize.Level0)
223 {
224     char tmpSubjectName[DEFAULT_SIZE] = {0};
225     int32_t ret = GetX509SubjectNameLongFormat(nullptr, tmpSubjectName, sizeof(tmpSubjectName));
226     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
227 }
228 
229 /**
230 * @tc.name: CmCertParseTest012
231 * @tc.desc: test GetX509IssueNameLongFormat outBufMaxSize is 0
232 * @tc.type: FUNC
233 * @tc.require: AR000H0MIA /SR000H09NA
234 */
235 HWTEST_F(CmCertParseTest, CmCertParseTest012, TestSize.Level0)
236 {
237     X509 *x509 = InitCertContext(g_certData, sizeof(g_certData));
238     EXPECT_NE(x509, nullptr);
239 
240     char tmpIssueName[DEFAULT_SIZE] = {0};
241     int32_t ret = GetX509IssueNameLongFormat(x509, tmpIssueName, 0);
242     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
243 
244     FreeCertContext(x509);
245 }
246 
247 /**
248 * @tc.name: CmCertParseTest013
249 * @tc.desc: test GetX509IssueNameLongFormat outBuf is nullptr
250 * @tc.type: FUNC
251 * @tc.require: AR000H0MIA /SR000H09NA
252 */
253 HWTEST_F(CmCertParseTest, CmCertParseTest013, TestSize.Level0)
254 {
255     X509 *x509 = InitCertContext(g_certData, sizeof(g_certData));
256     EXPECT_NE(x509, nullptr);
257 
258     char tmpIssueName[DEFAULT_SIZE] = {0};
259     int32_t ret = GetX509IssueNameLongFormat(x509, nullptr, sizeof(tmpIssueName));
260     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
261 
262     FreeCertContext(x509);
263 }
264 
265 /**
266 * @tc.name: CmCertParseTest014
267 * @tc.desc: test GetX509IssueNameLongFormat x509 is nullptr
268 * @tc.type: FUNC
269 * @tc.require: AR000H0MIA /SR000H09NA
270 */
271 HWTEST_F(CmCertParseTest, CmCertParseTest014, TestSize.Level0)
272 {
273     char tmpIssueName[DEFAULT_SIZE] = {0};
274     int32_t ret = GetX509IssueNameLongFormat(nullptr, tmpIssueName, sizeof(tmpIssueName));
275     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
276 }
277 
278 /**
279 * @tc.name: CmCertParseTest015
280 * @tc.desc: test GetX509NotBefore x509 is nullptr
281 * @tc.type: FUNC
282 * @tc.require: AR000H0MIA /SR000H09NA
283 */
284 HWTEST_F(CmCertParseTest, CmCertParseTest015, TestSize.Level0)
285 {
286     char tmpTimeOut[DEFAULT_SIZE] = {0};
287     int32_t ret = GetX509NotBefore(nullptr, tmpTimeOut, sizeof(tmpTimeOut));
288     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
289 }
290 
291 /**
292 * @tc.name: CmCertParseTest016
293 * @tc.desc: test GetX509NotBefore size is 0
294 * @tc.type: FUNC
295 * @tc.require: AR000H0MIA /SR000H09NA
296 */
297 HWTEST_F(CmCertParseTest, CmCertParseTest016, TestSize.Level0)
298 {
299     X509 *x509 = InitCertContext(g_certData, sizeof(g_certData));
300     EXPECT_NE(x509, nullptr);
301 
302     char tmpTimeOut[DEFAULT_SIZE] = {0};
303     int32_t ret = GetX509NotBefore(x509, tmpTimeOut, 0);
304     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
305 
306     FreeCertContext(x509);
307 }
308 
309 /**
310 * @tc.name: CmCertParseTest017
311 * @tc.desc: test GetX509NotBefore outBuf is nullptr
312 * @tc.type: FUNC
313 * @tc.require: AR000H0MIA /SR000H09NA
314 */
315 HWTEST_F(CmCertParseTest, CmCertParseTest017, TestSize.Level0)
316 {
317     X509 *x509 = InitCertContext(g_certData, sizeof(g_certData));
318     EXPECT_NE(x509, nullptr);
319 
320     char tmpTimeOut[DEFAULT_SIZE] = {0};
321     int32_t ret = GetX509NotBefore(x509, nullptr, sizeof(tmpTimeOut));
322     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
323 
324     FreeCertContext(x509);
325 }
326 
327 /**
328 * @tc.name: CmCertParseTest018
329 * @tc.desc: test GetX509NotBefore size too small
330 * @tc.type: FUNC
331 * @tc.require: AR000H0MIA /SR000H09NA
332 */
333 HWTEST_F(CmCertParseTest, CmCertParseTest018, TestSize.Level0)
334 {
335     X509 *x509 = InitCertContext(g_certData, sizeof(g_certData));
336     EXPECT_NE(x509, nullptr);
337 
338     char tmpTimeOut[DEFAULT_SIZE] = {0};
339     int32_t ret = GetX509NotBefore(x509, tmpTimeOut, 1); /* buffer not enough */
340     EXPECT_EQ(ret, CMR_ERROR_BUFFER_TOO_SMALL);
341 
342     FreeCertContext(x509);
343 }
344 
345 /**
346 * @tc.name: CmCertParseTest019
347 * @tc.desc: test GetX509NotBefore x509 is invalid
348 * @tc.type: FUNC
349 * @tc.require: AR000H0MIA /SR000H09NA
350 */
351 HWTEST_F(CmCertParseTest, CmCertParseTest019, TestSize.Level0)
352 {
353     X509 *tempX509 = X509_new();
354     if (tempX509 == nullptr) {
355         return;
356     }
357     char tmpTimeOut[DEFAULT_SIZE] = {0};
358     int32_t ret = GetX509NotBefore(tempX509, tmpTimeOut, sizeof(tmpTimeOut));
359     EXPECT_EQ(ret, CMR_ERROR_INVALID_CERT_FORMAT);
360 
361     X509_free(tempX509);
362 }
363 
364 /**
365 * @tc.name: CmCertParseTest020
366 * @tc.desc: test GetX509Fingerprint x509 is nullptr
367 * @tc.type: FUNC
368 * @tc.require: AR000H0MIA /SR000H09NA
369 */
370 HWTEST_F(CmCertParseTest, CmCertParseTest020, TestSize.Level0)
371 {
372     char tmpFinggerOut[DEFAULT_SIZE] = {0};
373     int32_t ret = GetX509Fingerprint(nullptr, tmpFinggerOut, sizeof(tmpFinggerOut));
374     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
375 }
376 
377 /**
378 * @tc.name: CmCertParseTest021
379 * @tc.desc: test GetX509Fingerprint size too small
380 * @tc.type: FUNC
381 * @tc.require: AR000H0MIA /SR000H09NA
382 */
383 HWTEST_F(CmCertParseTest, CmCertParseTest021, TestSize.Level0)
384 {
385     X509 *x509 = InitCertContext(g_certData, sizeof(g_certData));
386     EXPECT_NE(x509, nullptr);
387 
388     char tmpFinggerOut[DEFAULT_SIZE] = {0};
389     int32_t ret = GetX509Fingerprint(x509, tmpFinggerOut, 1); /* buffer not enough */
390     EXPECT_EQ(ret, CMR_ERROR_BUFFER_TOO_SMALL);
391 
392     FreeCertContext(x509);
393 }
394 
395 /**
396 * @tc.name: CmCertParseTest022
397 * @tc.desc: test GetX509Fingerprint outBuf is nullptr
398 * @tc.type: FUNC
399 * @tc.require: AR000H0MIA /SR000H09NA
400 */
401 HWTEST_F(CmCertParseTest, CmCertParseTest022, TestSize.Level0)
402 {
403     X509 *x509 = InitCertContext(g_certData, sizeof(g_certData));
404     EXPECT_NE(x509, nullptr);
405 
406     char tmpFinggerOut[DEFAULT_SIZE] = {0};
407     int32_t ret = GetX509Fingerprint(x509, nullptr, sizeof(tmpFinggerOut));
408     EXPECT_EQ(ret, CMR_ERROR_INVALID_OPERATION);
409 
410     FreeCertContext(x509);
411 }
412 
413 /**
414 * @tc.name: CmCertParseTest023
415 * @tc.desc: test CmParsePkcs12Cert normal testcase
416 * @tc.type: FUNC
417 * @tc.require: AR000H0MIA /SR000H09NA
418 */
419 HWTEST_F(CmCertParseTest, CmCertParseTest023, TestSize.Level0)
420 {
421     struct AppCert appCert;
422     (void)memset_s(&appCert, sizeof(struct AppCert), 0, sizeof(struct AppCert));
423     EVP_PKEY *pkey = nullptr;
424     struct CmBlob certInfo = { sizeof(g_rsa2048P12CertInfo), const_cast<uint8_t *>(g_rsa2048P12CertInfo) };
425 
426     X509 *cert = nullptr;
427     int32_t ret = CmParsePkcs12Cert(&certInfo, reinterpret_cast<char *>(const_cast<uint8_t *>(g_certPwd)),
428         &pkey, &appCert, &cert);
429     if (cert != nullptr) {
430         FreeCertContext(cert);
431     }
432     EXPECT_EQ(ret, CM_SUCCESS);
433 
434     EVP_PKEY_free(pkey);
435 }
436 
437 /**
438 * @tc.name: CmCertParseTest024
439 * @tc.desc: test CmParsePkcs12Cert p12Cert is nullptr
440 * @tc.type: FUNC
441 * @tc.require: AR000H0MIA /SR000H09NA
442 */
443 HWTEST_F(CmCertParseTest, CmCertParseTest024, TestSize.Level0)
444 {
445     struct AppCert appCert;
446     (void)memset_s(&appCert, sizeof(struct AppCert), 0, sizeof(struct AppCert));
447     EVP_PKEY *pkey = nullptr;
448 
449     X509 *cert = nullptr;
450     int32_t ret = CmParsePkcs12Cert(nullptr, reinterpret_cast<char *>(const_cast<uint8_t *>(g_certPwd)),
451         &pkey, &appCert, &cert);
452     if (cert != nullptr) {
453         FreeCertContext(cert);
454     }
455     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
456 
457     EVP_PKEY_free(pkey);
458 }
459 
460 /**
461 * @tc.name: CmCertParseTest025
462 * @tc.desc: test CmParsePkcs12Cert p12Cert data is nullptr
463 * @tc.type: FUNC
464 * @tc.require: AR000H0MIA /SR000H09NA
465 */
466 HWTEST_F(CmCertParseTest, CmCertParseTest025, TestSize.Level0)
467 {
468     struct AppCert appCert;
469     (void)memset_s(&appCert, sizeof(struct AppCert), 0, sizeof(struct AppCert));
470     EVP_PKEY *pkey = nullptr;
471     struct CmBlob certInfo = { sizeof(g_rsa2048P12CertInfo), nullptr };
472 
473     X509 *cert = nullptr;
474     int32_t ret = CmParsePkcs12Cert(&certInfo, reinterpret_cast<char *>(const_cast<uint8_t *>(g_certPwd)),
475         &pkey, &appCert, &cert);
476     if (cert != nullptr) {
477         FreeCertContext(cert);
478     }
479     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
480 
481     EVP_PKEY_free(pkey);
482 }
483 
484 /**
485 * @tc.name: CmCertParseTest026
486 * @tc.desc: test CmParsePkcs12Cert p12Cert size too big
487 * @tc.type: FUNC
488 * @tc.require: AR000H0MIA /SR000H09NA
489 */
490 HWTEST_F(CmCertParseTest, CmCertParseTest026, TestSize.Level0)
491 {
492     struct AppCert appCert;
493     (void)memset_s(&appCert, sizeof(struct AppCert), 0, sizeof(struct AppCert));
494     EVP_PKEY *pkey = nullptr;
495     struct CmBlob certInfo = { MAX_LEN_CERTIFICATE_CHAIN + 1, const_cast<uint8_t *>(g_rsa2048P12CertInfo) };
496 
497     X509 *cert = nullptr;
498     int32_t ret = CmParsePkcs12Cert(&certInfo, reinterpret_cast<char *>(const_cast<uint8_t *>(g_certPwd)),
499         &pkey, &appCert, &cert);
500     if (cert != nullptr) {
501         FreeCertContext(cert);
502     }
503     EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
504 
505     EVP_PKEY_free(pkey);
506 }
507 
508 /**
509 * @tc.name: CmCertParseTest027
510 * @tc.desc: test CmParsePkcs12Cert p12Cert invalid
511 * @tc.type: FUNC
512 * @tc.require: AR000H0MIA /SR000H09NA
513 */
514 HWTEST_F(CmCertParseTest, CmCertParseTest027, TestSize.Level0)
515 {
516     struct AppCert appCert;
517     (void)memset_s(&appCert, sizeof(struct AppCert), 0, sizeof(struct AppCert));
518     EVP_PKEY *pkey = nullptr;
519     uint8_t tempBuf[] = "this is for test error";
520     struct CmBlob certInfo = { sizeof(tempBuf), tempBuf };
521 
522     X509 *cert = nullptr;
523     int32_t ret = CmParsePkcs12Cert(&certInfo, reinterpret_cast<char *>(const_cast<uint8_t *>(g_certPwd)),
524         &pkey, &appCert, &cert);
525     if (cert != nullptr) {
526         FreeCertContext(cert);
527     }
528     EXPECT_EQ(ret, CMR_ERROR_INVALID_CERT_FORMAT);
529 
530     EVP_PKEY_free(pkey);
531 }
532 
533 /**
534 * @tc.name: CmCertParseTest028
535 * @tc.desc: test CmParsePkcs12Cert pwd invalid
536 * @tc.type: FUNC
537 * @tc.require: AR000H0MIA /SR000H09NA
538 */
539 HWTEST_F(CmCertParseTest, CmCertParseTest028, TestSize.Level0)
540 {
541     struct AppCert appCert;
542     (void)memset_s(&appCert, sizeof(struct AppCert), 0, sizeof(struct AppCert));
543     EVP_PKEY *pkey = nullptr;
544     struct CmBlob certInfo = { sizeof(g_rsa2048P12CertInfo), const_cast<uint8_t *>(g_rsa2048P12CertInfo) };
545     char tempPwd[] = "this is for test error123";
546 
547     X509 *cert = nullptr;
548     int32_t ret = CmParsePkcs12Cert(&certInfo, tempPwd, &pkey, &appCert, &cert);
549     if (cert != nullptr) {
550         FreeCertContext(cert);
551     }
552     EXPECT_EQ(ret, CMR_ERROR_PASSWORD_IS_ERR);
553 
554     EVP_PKEY_free(pkey);
555 }
556 } // end of namespace
557