154aa6d63Sopenharmony_ci/*
254aa6d63Sopenharmony_ci * Copyright (c) 2024-2024 Huawei Device Co., Ltd.
354aa6d63Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
454aa6d63Sopenharmony_ci * you may not use this file except in compliance with the License.
554aa6d63Sopenharmony_ci * You may obtain a copy of the License at
654aa6d63Sopenharmony_ci *
754aa6d63Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
854aa6d63Sopenharmony_ci *
954aa6d63Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1054aa6d63Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1154aa6d63Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1254aa6d63Sopenharmony_ci * See the License for the specific language governing permissions and
1354aa6d63Sopenharmony_ci * limitations under the License.
1454aa6d63Sopenharmony_ci */
1554aa6d63Sopenharmony_ci#include <memory>
1654aa6d63Sopenharmony_ci#include <gtest/gtest.h>
1754aa6d63Sopenharmony_ci#include "sign_bin.h"
1854aa6d63Sopenharmony_ci#include "sign_provider.h"
1954aa6d63Sopenharmony_ci#include "local_sign_provider.h"
2054aa6d63Sopenharmony_ci
2154aa6d63Sopenharmony_ci#define VERSION 9
2254aa6d63Sopenharmony_ci#define BYTE_NUMBER 32
2354aa6d63Sopenharmony_ci
2454aa6d63Sopenharmony_cinamespace OHOS {
2554aa6d63Sopenharmony_cinamespace SignatureTools {
2654aa6d63Sopenharmony_civoid ConstructSignerConfig(SignerConfig& signerConfig, Options& options)
2754aa6d63Sopenharmony_ci{
2854aa6d63Sopenharmony_ci    signerConfig.SetCompatibleVersion(VERSION);
2954aa6d63Sopenharmony_ci
3054aa6d63Sopenharmony_ci    std::map<std::string, std::string> params;
3154aa6d63Sopenharmony_ci    params["keyPwd"] = "123456";
3254aa6d63Sopenharmony_ci    params["mode"] = "localSign";
3354aa6d63Sopenharmony_ci    params["keyAlias"] = "oh-app1-key-v1";
3454aa6d63Sopenharmony_ci    params["signAlg"] = "SHA256withECDSA";
3554aa6d63Sopenharmony_ci    params["appCertFile"] = "./hapSign/app-release1.pem";
3654aa6d63Sopenharmony_ci    params["signCode"] = "1";
3754aa6d63Sopenharmony_ci    params["compatibleVersion"] = "9";
3854aa6d63Sopenharmony_ci    params["outFile"] = "./hapSign/signed.bin";
3954aa6d63Sopenharmony_ci    params["profileFile"] = "./hapSign/app1-profile1.p7b";
4054aa6d63Sopenharmony_ci    params["keystorePwd"] = "123456";
4154aa6d63Sopenharmony_ci    params["keystoreFile"] = "./hapSign/ohtest.p12";
4254aa6d63Sopenharmony_ci    params["inFile"] = "./hapSign/unsigned.bin";
4354aa6d63Sopenharmony_ci    params["profileSigned"] = "1";
4454aa6d63Sopenharmony_ci    signerConfig.FillParameters(params);
4554aa6d63Sopenharmony_ci
4654aa6d63Sopenharmony_ci    ContentDigestAlgorithm contentDigestAlgorithm("SHA-256", BYTE_NUMBER);
4754aa6d63Sopenharmony_ci    std::pair<std::string, void*> signatureAlgAndParams("SHA256withECDSA", nullptr);
4854aa6d63Sopenharmony_ci    SignatureAlgorithmHelper signatureAlgorithm(SignatureAlgorithmId::ECDSA_WITH_SHA256, "ECDSA_WITH_SHA256",
4954aa6d63Sopenharmony_ci                                                contentDigestAlgorithm, signatureAlgAndParams);
5054aa6d63Sopenharmony_ci    std::vector<SignatureAlgorithmHelper> signatureAlgorithms;
5154aa6d63Sopenharmony_ci    signatureAlgorithms.push_back(signatureAlgorithm);
5254aa6d63Sopenharmony_ci    signerConfig.SetSignatureAlgorithms(signatureAlgorithms);
5354aa6d63Sopenharmony_ci
5454aa6d63Sopenharmony_ci    options.emplace("mode", std::string("localSign"));
5554aa6d63Sopenharmony_ci    char keyPwd[] = "123456";
5654aa6d63Sopenharmony_ci    options.emplace("keyPwd", keyPwd);
5754aa6d63Sopenharmony_ci    options.emplace("outFile", std::string("./hapSign/signed.bin"));
5854aa6d63Sopenharmony_ci    options.emplace("keyAlias", std::string("oh-app1-key-v1"));
5954aa6d63Sopenharmony_ci    options.emplace("profileFile", std::string("./hapSign/app1-profile1.p7b"));
6054aa6d63Sopenharmony_ci    options.emplace("signAlg", std::string("SHA256withECDSA"));
6154aa6d63Sopenharmony_ci    char keystorePwd[] = "123456";
6254aa6d63Sopenharmony_ci    options.emplace("keystorePwd", keystorePwd);
6354aa6d63Sopenharmony_ci    options.emplace("keystoreFile", std::string("./hapSign/ohtest.p12"));
6454aa6d63Sopenharmony_ci    options.emplace("appCertFile", std::string("./hapSign/app-release1.pem"));
6554aa6d63Sopenharmony_ci    options.emplace("inFile", std::string("./hapSign/unsigned.bin"));
6654aa6d63Sopenharmony_ci    signerConfig.SetOptions(&options);
6754aa6d63Sopenharmony_ci}
6854aa6d63Sopenharmony_ci
6954aa6d63Sopenharmony_civoid ConstructSignParams(std::map<std::string, std::string>& signParams)
7054aa6d63Sopenharmony_ci{
7154aa6d63Sopenharmony_ci    signParams["a"] = "4";
7254aa6d63Sopenharmony_ci    signParams["appCertFile"] = "./hapSign/app-release1.pem";
7354aa6d63Sopenharmony_ci    signParams["compatibleVersion"] = "9";
7454aa6d63Sopenharmony_ci    signParams["inFile"] = "./hapSign/unsigned.bin";
7554aa6d63Sopenharmony_ci    signParams["inForm"] = "bin";
7654aa6d63Sopenharmony_ci    signParams["keyAlias"] = "oh-app1-key-v1";
7754aa6d63Sopenharmony_ci    signParams["keyPwd"] = "123456";
7854aa6d63Sopenharmony_ci    signParams["keystoreFile"] = "./hapSign/ohtest.p12";
7954aa6d63Sopenharmony_ci    signParams["keystorePwd"] = "123456";
8054aa6d63Sopenharmony_ci    signParams["outFile"] = "./hapSign/signed.bin";
8154aa6d63Sopenharmony_ci    signParams["profileFile"] = "./hapSign/app1-profile1.p7b";
8254aa6d63Sopenharmony_ci    signParams["profileSigned"] = "1";
8354aa6d63Sopenharmony_ci    signParams["signAlg"] = "SHA256withECDSA";
8454aa6d63Sopenharmony_ci    signParams["signCode"] = "1";
8554aa6d63Sopenharmony_ci}
8654aa6d63Sopenharmony_ci
8754aa6d63Sopenharmony_ciclass SignBinTest : public testing::Test {
8854aa6d63Sopenharmony_cipublic:
8954aa6d63Sopenharmony_ci    static void SetUpTestCase(void)
9054aa6d63Sopenharmony_ci    {
9154aa6d63Sopenharmony_ci        (void)rename("./hapSign/unsigned.txt", "./hapSign/unsigned.bin");
9254aa6d63Sopenharmony_ci    };
9354aa6d63Sopenharmony_ci    static void TearDownTestCase()
9454aa6d63Sopenharmony_ci    {
9554aa6d63Sopenharmony_ci    };
9654aa6d63Sopenharmony_ci    void SetUp()
9754aa6d63Sopenharmony_ci    {
9854aa6d63Sopenharmony_ci    };
9954aa6d63Sopenharmony_ci    void TearDown()
10054aa6d63Sopenharmony_ci    {
10154aa6d63Sopenharmony_ci    };
10254aa6d63Sopenharmony_ci};
10354aa6d63Sopenharmony_ci
10454aa6d63Sopenharmony_ci/**
10554aa6d63Sopenharmony_ci * @tc.name: GenerateFileDigest001
10654aa6d63Sopenharmony_ci * @tc.desc: The return digest size is 0, because the algorithm does not support.
10754aa6d63Sopenharmony_ci * @tc.size: MEDIUM
10854aa6d63Sopenharmony_ci * @tc.type: FUNC
10954aa6d63Sopenharmony_ci * @tc.level Level 1
11054aa6d63Sopenharmony_ci * @tc.require: SR000H63TL
11154aa6d63Sopenharmony_ci */
11254aa6d63Sopenharmony_ciHWTEST_F(SignBinTest, GenerateFileDigest001, testing::ext::TestSize.Level1)
11354aa6d63Sopenharmony_ci{
11454aa6d63Sopenharmony_ci    std::shared_ptr<SignBin> api = std::make_shared<SignBin>();
11554aa6d63Sopenharmony_ci    std::vector<int8_t> generateFileDigest = api->GenerateFileDigest("./signed.bin", "SHA266");
11654aa6d63Sopenharmony_ci    EXPECT_EQ(generateFileDigest.size(), 0);
11754aa6d63Sopenharmony_ci}
11854aa6d63Sopenharmony_ci
11954aa6d63Sopenharmony_ci/**
12054aa6d63Sopenharmony_ci * @tc.name: GenerateFileDigest002
12154aa6d63Sopenharmony_ci * @tc.desc: The return digest size is 0, because the input file does not exist.
12254aa6d63Sopenharmony_ci * @tc.size: MEDIUM
12354aa6d63Sopenharmony_ci * @tc.type: FUNC
12454aa6d63Sopenharmony_ci * @tc.level Level 1
12554aa6d63Sopenharmony_ci * @tc.require: SR000H63TL
12654aa6d63Sopenharmony_ci */
12754aa6d63Sopenharmony_ciHWTEST_F(SignBinTest, GenerateFileDigest002, testing::ext::TestSize.Level1)
12854aa6d63Sopenharmony_ci{
12954aa6d63Sopenharmony_ci    std::shared_ptr<SignBin> api = std::make_shared<SignBin>();
13054aa6d63Sopenharmony_ci    std::vector<int8_t> generateFileDigest = api->GenerateFileDigest("./signed.bin", "SHA384withECDSA");
13154aa6d63Sopenharmony_ci    EXPECT_EQ(generateFileDigest.size(), 0);
13254aa6d63Sopenharmony_ci}
13354aa6d63Sopenharmony_ci
13454aa6d63Sopenharmony_ci/**
13554aa6d63Sopenharmony_ci * @tc.name: Sign001
13654aa6d63Sopenharmony_ci * @tc.desc: The block head data made failed
13754aa6d63Sopenharmony_ci * @tc.size: MEDIUM
13854aa6d63Sopenharmony_ci * @tc.type: FUNC
13954aa6d63Sopenharmony_ci * @tc.level Level 1
14054aa6d63Sopenharmony_ci * @tc.require: SR000H63TL
14154aa6d63Sopenharmony_ci */
14254aa6d63Sopenharmony_ciHWTEST_F(SignBinTest, Sign001, testing::ext::TestSize.Level1)
14354aa6d63Sopenharmony_ci{
14454aa6d63Sopenharmony_ci    // go to branch "The block head data made failed"
14554aa6d63Sopenharmony_ci    std::shared_ptr<SignBin> api = std::make_shared<SignBin>();
14654aa6d63Sopenharmony_ci
14754aa6d63Sopenharmony_ci    // 1.construct SignerConfig
14854aa6d63Sopenharmony_ci    SignerConfig signerConfig;
14954aa6d63Sopenharmony_ci    Options options;
15054aa6d63Sopenharmony_ci    ConstructSignerConfig(signerConfig, options);
15154aa6d63Sopenharmony_ci
15254aa6d63Sopenharmony_ci    // 2.construct signParams
15354aa6d63Sopenharmony_ci    std::string appCertFile = "./hapSign/app-release1.pem";
15454aa6d63Sopenharmony_ci    std::string compatibleVersion = "9";
15554aa6d63Sopenharmony_ci    std::string inFile = "./hapSign/unvalid.bin";
15654aa6d63Sopenharmony_ci    std::string inForm = "bin";
15754aa6d63Sopenharmony_ci    std::string keyAlias = "oh-app1-key-v1";
15854aa6d63Sopenharmony_ci    static char keyPwd[] = "123456";
15954aa6d63Sopenharmony_ci    std::string keystoreFile = "./hapSign/ohtest.p12";
16054aa6d63Sopenharmony_ci    static char keystorePwd[] = "123456";
16154aa6d63Sopenharmony_ci    std::string outFile = "./hapSign/signed.bin";
16254aa6d63Sopenharmony_ci    std::string profileFile = "./hapSign/app1-profile1.p7b";
16354aa6d63Sopenharmony_ci    std::string profileSigned = "1";
16454aa6d63Sopenharmony_ci    std::string signAlg = "SHA256withECDSA";
16554aa6d63Sopenharmony_ci    std::string signCode = "1";
16654aa6d63Sopenharmony_ci    std::string mode = "localSign";
16754aa6d63Sopenharmony_ci
16854aa6d63Sopenharmony_ci    std::map<std::string, std::string> signParams;
16954aa6d63Sopenharmony_ci    signParams["a"] = "4";
17054aa6d63Sopenharmony_ci    signParams["appCertFile"] = appCertFile;
17154aa6d63Sopenharmony_ci    signParams["compatibleVersion"] = compatibleVersion;
17254aa6d63Sopenharmony_ci    signParams["inFile"] = inFile;
17354aa6d63Sopenharmony_ci    signParams["inForm"] = inForm;
17454aa6d63Sopenharmony_ci    signParams["keyAlias"] = keyAlias;
17554aa6d63Sopenharmony_ci    signParams["keyPwd"] = keyPwd;
17654aa6d63Sopenharmony_ci    signParams["keystoreFile"] = keystoreFile;
17754aa6d63Sopenharmony_ci    signParams["keystorePwd"] = keystorePwd;
17854aa6d63Sopenharmony_ci    signParams["outFile"] = outFile;
17954aa6d63Sopenharmony_ci    signParams["profileFile"] = profileFile;
18054aa6d63Sopenharmony_ci    signParams["profileSigned"] = profileSigned;
18154aa6d63Sopenharmony_ci    signParams["signAlg"] = signAlg;
18254aa6d63Sopenharmony_ci    signParams["signCode"] = signCode;
18354aa6d63Sopenharmony_ci    signParams["mode"] = mode;
18454aa6d63Sopenharmony_ci
18554aa6d63Sopenharmony_ci    bool flag = api->Sign(signerConfig, signParams);
18654aa6d63Sopenharmony_ci    EXPECT_EQ(flag, false);
18754aa6d63Sopenharmony_ci}
18854aa6d63Sopenharmony_ci
18954aa6d63Sopenharmony_ci/**
19054aa6d63Sopenharmony_ci * @tc.name: Sign002
19154aa6d63Sopenharmony_ci * @tc.desc: The sign data made failed.
19254aa6d63Sopenharmony_ci * @tc.size: MEDIUM
19354aa6d63Sopenharmony_ci * @tc.type: FUNC
19454aa6d63Sopenharmony_ci * @tc.level Level 1
19554aa6d63Sopenharmony_ci * @tc.require: SR000H63TL
19654aa6d63Sopenharmony_ci */
19754aa6d63Sopenharmony_ciHWTEST_F(SignBinTest, Sign002, testing::ext::TestSize.Level1)
19854aa6d63Sopenharmony_ci{
19954aa6d63Sopenharmony_ci    // go to branch "The sign data made failed"
20054aa6d63Sopenharmony_ci    std::shared_ptr<SignBin> api = std::make_shared<SignBin>();
20154aa6d63Sopenharmony_ci
20254aa6d63Sopenharmony_ci    // 1.construct SignerConfig
20354aa6d63Sopenharmony_ci    SignerConfig signerConfig;
20454aa6d63Sopenharmony_ci    Options options;
20554aa6d63Sopenharmony_ci    ConstructSignerConfig(signerConfig, options);
20654aa6d63Sopenharmony_ci
20754aa6d63Sopenharmony_ci    // 2.construct sign params
20854aa6d63Sopenharmony_ci    std::map<std::string, std::string> signParams;
20954aa6d63Sopenharmony_ci    ConstructSignParams(signParams);
21054aa6d63Sopenharmony_ci
21154aa6d63Sopenharmony_ci    bool flag = api->Sign(signerConfig, signParams);
21254aa6d63Sopenharmony_ci    EXPECT_EQ(flag, false);
21354aa6d63Sopenharmony_ci}
21454aa6d63Sopenharmony_ci
21554aa6d63Sopenharmony_ci/**
21654aa6d63Sopenharmony_ci * @tc.name: SignBin001
21754aa6d63Sopenharmony_ci * @tc.desc: check Compatible Version failed.
21854aa6d63Sopenharmony_ci * @tc.size: MEDIUM
21954aa6d63Sopenharmony_ci * @tc.type: FUNC
22054aa6d63Sopenharmony_ci * @tc.level Level 1
22154aa6d63Sopenharmony_ci * @tc.require: SR000H63TL
22254aa6d63Sopenharmony_ci */
22354aa6d63Sopenharmony_ciHWTEST_F(SignBinTest, SignBin001, testing::ext::TestSize.Level1)
22454aa6d63Sopenharmony_ci{
22554aa6d63Sopenharmony_ci    // go to branch "check Compatible Version failed"
22654aa6d63Sopenharmony_ci    std::unique_ptr<SignProvider> signProvider = std::make_unique<LocalSignProvider>();
22754aa6d63Sopenharmony_ci    std::shared_ptr<Options> params = std::make_shared<Options>();
22854aa6d63Sopenharmony_ci
22954aa6d63Sopenharmony_ci    std::string mode = "localSign";
23054aa6d63Sopenharmony_ci    std::string keyAlias = "oh-app1-key-v1";
23154aa6d63Sopenharmony_ci    std::string signAlg = "SHA256withECDSA";
23254aa6d63Sopenharmony_ci    std::string signCode = "1";
23354aa6d63Sopenharmony_ci    std::string appCertFile = "./hapSign/app-release1.pem";
23454aa6d63Sopenharmony_ci    std::string profileFile = "./hapSign/app1-profile1.p7b";
23554aa6d63Sopenharmony_ci    std::string inFile = "./hapSign/unsigned.bin";
23654aa6d63Sopenharmony_ci    std::string keystoreFile = "./hapSign/ohtest.p12";
23754aa6d63Sopenharmony_ci    std::string outFile = "./hapSign/signed.bin";
23854aa6d63Sopenharmony_ci    std::string inForm = "bin";
23954aa6d63Sopenharmony_ci    char keyPwd[] = "123456";
24054aa6d63Sopenharmony_ci    char keystorePwd[] = "123456";
24154aa6d63Sopenharmony_ci    std::string compatibleVersion = "";
24254aa6d63Sopenharmony_ci
24354aa6d63Sopenharmony_ci    (*params)["mode"] = mode;
24454aa6d63Sopenharmony_ci    (*params)["keyAlias"] = keyAlias;
24554aa6d63Sopenharmony_ci    (*params)["signAlg"] = signAlg;
24654aa6d63Sopenharmony_ci    (*params)["signCode"] = signCode;
24754aa6d63Sopenharmony_ci    (*params)["appCertFile"] = appCertFile;
24854aa6d63Sopenharmony_ci    (*params)["profileFile"] = profileFile;
24954aa6d63Sopenharmony_ci    (*params)["inFile"] = inFile;
25054aa6d63Sopenharmony_ci    (*params)["keystoreFile"] = keystoreFile;
25154aa6d63Sopenharmony_ci    (*params)["outFile"] = outFile;
25254aa6d63Sopenharmony_ci    (*params)["inForm"] = inForm;
25354aa6d63Sopenharmony_ci    (*params)["keyPwd"] = keyPwd;
25454aa6d63Sopenharmony_ci    (*params)["keystorePwd"] = keystorePwd;
25554aa6d63Sopenharmony_ci    (*params)["compatibleVersion"] = compatibleVersion;
25654aa6d63Sopenharmony_ci    bool ret = signProvider->SignBin(params.get());
25754aa6d63Sopenharmony_ci    EXPECT_EQ(ret, false);
25854aa6d63Sopenharmony_ci}
25954aa6d63Sopenharmony_ci
26054aa6d63Sopenharmony_ci/**
26154aa6d63Sopenharmony_ci * @tc.name: SignBin002
26254aa6d63Sopenharmony_ci * @tc.desc: Test function result of SignBin002 will be SUCCESS.
26354aa6d63Sopenharmony_ci * @tc.size: MEDIUM
26454aa6d63Sopenharmony_ci * @tc.type: FUNC
26554aa6d63Sopenharmony_ci * @tc.level Level 1
26654aa6d63Sopenharmony_ci * @tc.require: SR000H63TL
26754aa6d63Sopenharmony_ci */
26854aa6d63Sopenharmony_ciHWTEST_F(SignBinTest, SignBin002, testing::ext::TestSize.Level1)
26954aa6d63Sopenharmony_ci{
27054aa6d63Sopenharmony_ci    std::unique_ptr<SignProvider> signProvider = std::make_unique<LocalSignProvider>();
27154aa6d63Sopenharmony_ci    std::shared_ptr<Options> params = std::make_shared<Options>();
27254aa6d63Sopenharmony_ci
27354aa6d63Sopenharmony_ci    std::string mode = "localSign";
27454aa6d63Sopenharmony_ci    std::string keyAlias = "oh-app1-key-v1";
27554aa6d63Sopenharmony_ci    std::string signAlg = "SHA256withECDSA";
27654aa6d63Sopenharmony_ci    std::string signCode = "1";
27754aa6d63Sopenharmony_ci    std::string appCertFile = "./hapSign/app-release1.pem";
27854aa6d63Sopenharmony_ci    std::string profileFile = "./hapSign/app1-profile1.p7b";
27954aa6d63Sopenharmony_ci    std::string inFile = "./hapSign/unsigned.bin";
28054aa6d63Sopenharmony_ci    std::string keystoreFile = "./hapSign/ohtest.p12";
28154aa6d63Sopenharmony_ci    std::string outFile = "./hapSign/signed.bin";
28254aa6d63Sopenharmony_ci    std::string inForm = "bin";
28354aa6d63Sopenharmony_ci    char keyPwd[] = "123456";
28454aa6d63Sopenharmony_ci    char keystorePwd[] = "123456";
28554aa6d63Sopenharmony_ci    std::string compatibleVersion = "9";
28654aa6d63Sopenharmony_ci
28754aa6d63Sopenharmony_ci    (*params)["mode"] = mode;
28854aa6d63Sopenharmony_ci    (*params)["keyAlias"] = keyAlias;
28954aa6d63Sopenharmony_ci    (*params)["signAlg"] = signAlg;
29054aa6d63Sopenharmony_ci    (*params)["signCode"] = signCode;
29154aa6d63Sopenharmony_ci    (*params)["appCertFile"] = appCertFile;
29254aa6d63Sopenharmony_ci    (*params)["profileFile"] = profileFile;
29354aa6d63Sopenharmony_ci    (*params)["inFile"] = inFile;
29454aa6d63Sopenharmony_ci    (*params)["keystoreFile"] = keystoreFile;
29554aa6d63Sopenharmony_ci    (*params)["outFile"] = outFile;
29654aa6d63Sopenharmony_ci    (*params)["inForm"] = inForm;
29754aa6d63Sopenharmony_ci    (*params)["keyPwd"] = keyPwd;
29854aa6d63Sopenharmony_ci    (*params)["keystorePwd"] = keystorePwd;
29954aa6d63Sopenharmony_ci    (*params)["compatibleVersion"] = compatibleVersion;
30054aa6d63Sopenharmony_ci    bool ret = signProvider->SignBin(params.get());
30154aa6d63Sopenharmony_ci    EXPECT_EQ(ret, true);
30254aa6d63Sopenharmony_ci}
30354aa6d63Sopenharmony_ci
30454aa6d63Sopenharmony_ci} // namespace SignatureTools
30554aa6d63Sopenharmony_ci} // namespace OHOS
306