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
1654aa6d63Sopenharmony_ci#include "params_run_tool.h"
1754aa6d63Sopenharmony_ci#include <unistd.h>
1854aa6d63Sopenharmony_ci#include <memory>
1954aa6d63Sopenharmony_ci#include <filesystem>
2054aa6d63Sopenharmony_ci
2154aa6d63Sopenharmony_ci#include "constant.h"
2254aa6d63Sopenharmony_ci#include "help.h"
2354aa6d63Sopenharmony_ci
2454aa6d63Sopenharmony_cinamespace OHOS {
2554aa6d63Sopenharmony_cinamespace SignatureTools {
2654aa6d63Sopenharmony_ciconst std::string ParamsRunTool::VERSION = "1.0.0";
2754aa6d63Sopenharmony_ci
2854aa6d63Sopenharmony_cistd::vector<std::string> ParamsRunTool::InformList = {
2954aa6d63Sopenharmony_ci    "bin",
3054aa6d63Sopenharmony_ci    "elf",
3154aa6d63Sopenharmony_ci    "zip"
3254aa6d63Sopenharmony_ci};
3354aa6d63Sopenharmony_ci
3454aa6d63Sopenharmony_cistatic std::unordered_map <std::string,
3554aa6d63Sopenharmony_ci                           std::function<bool(Options* params, SignToolServiceImpl& api)>> DISPATCH_RUN_METHOD {
3654aa6d63Sopenharmony_ci    {SIGN_APP, ParamsRunTool::RunSignApp},
3754aa6d63Sopenharmony_ci    {SIGN_PROFILE, ParamsRunTool::RunSignProfile},
3854aa6d63Sopenharmony_ci    {VERIFY_APP, ParamsRunTool::RunVerifyApp},
3954aa6d63Sopenharmony_ci    {VERIFY_PROFILE, ParamsRunTool::RunVerifyProfile}
4054aa6d63Sopenharmony_ci};
4154aa6d63Sopenharmony_ci
4254aa6d63Sopenharmony_cistatic std::unordered_map <std::string,
4354aa6d63Sopenharmony_ci                           std::function<bool(Options* params, SignToolServiceImpl& api)>> GENERATOR_RUN_METHOD {
4454aa6d63Sopenharmony_ci    {GENERATE_KEYPAIR, ParamsRunTool::RunKeypair},
4554aa6d63Sopenharmony_ci    {GENERATE_CSR, ParamsRunTool::RunCsr},
4654aa6d63Sopenharmony_ci    {GENERATE_CA, ParamsRunTool::RunCa},
4754aa6d63Sopenharmony_ci    {GENERATE_APP_CERT, ParamsRunTool::RunAppCert},
4854aa6d63Sopenharmony_ci    {GENERATE_PROFILE_CERT, ParamsRunTool::RunProfileCert},
4954aa6d63Sopenharmony_ci    {GENERATE_CERT, ParamsRunTool::RunCert},
5054aa6d63Sopenharmony_ci};
5154aa6d63Sopenharmony_ci
5254aa6d63Sopenharmony_ci
5354aa6d63Sopenharmony_cibool ParamsRunTool::ProcessCmd(char** args, size_t size)
5454aa6d63Sopenharmony_ci{
5554aa6d63Sopenharmony_ci    if (size < CmdUtil::ARGS_MIN_LEN) {
5654aa6d63Sopenharmony_ci        PrintHelp();
5754aa6d63Sopenharmony_ci        return true;
5854aa6d63Sopenharmony_ci    }
5954aa6d63Sopenharmony_ci    if (args == nullptr || strcmp(args[1], "") == 0) {
6054aa6d63Sopenharmony_ci        PrintHelp();
6154aa6d63Sopenharmony_ci        return true;
6254aa6d63Sopenharmony_ci    } else if (strcmp(args[1], "-h") == 0 || strcmp(args[1], "-help") == 0) {
6354aa6d63Sopenharmony_ci        PrintHelp();
6454aa6d63Sopenharmony_ci        return true;
6554aa6d63Sopenharmony_ci    } else if (strcmp(args[1], "-v") == 0 || strcmp(args[1], "-version") == 0) {
6654aa6d63Sopenharmony_ci        Version();
6754aa6d63Sopenharmony_ci        return true;
6854aa6d63Sopenharmony_ci    } else {
6954aa6d63Sopenharmony_ci        std::shared_ptr<SignToolServiceImpl> serviceApi = std::make_shared<SignToolServiceImpl>();
7054aa6d63Sopenharmony_ci        ParamsSharedPtr param = std::make_shared<Params>();
7154aa6d63Sopenharmony_ci        if (!CmdUtil::Convert2Params(args, size, param)) {
7254aa6d63Sopenharmony_ci            PrintMsg(param->GetMethod() + " failed");
7354aa6d63Sopenharmony_ci            return false;
7454aa6d63Sopenharmony_ci        }
7554aa6d63Sopenharmony_ci        PrintMsg("Start " + param->GetMethod());
7654aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGD("%s run start time  ", param->GetMethod().c_str());
7754aa6d63Sopenharmony_ci        if (!DispatchParams(param, *serviceApi)) {
7854aa6d63Sopenharmony_ci            SIGNATURE_TOOLS_LOGD("%s run end time  ", param->GetMethod().c_str());
7954aa6d63Sopenharmony_ci            PrintMsg(param->GetMethod() + " failed");
8054aa6d63Sopenharmony_ci            return false;
8154aa6d63Sopenharmony_ci        }
8254aa6d63Sopenharmony_ci        PrintMsg(param->GetMethod() + " success");
8354aa6d63Sopenharmony_ci        SIGNATURE_TOOLS_LOGD("%s run end time  ", param->GetMethod().c_str());
8454aa6d63Sopenharmony_ci    }
8554aa6d63Sopenharmony_ci    return true;
8654aa6d63Sopenharmony_ci}
8754aa6d63Sopenharmony_ci
8854aa6d63Sopenharmony_cibool ParamsRunTool::CallGenerators(const ParamsSharedPtr& params, SignToolServiceImpl& api)
8954aa6d63Sopenharmony_ci{
9054aa6d63Sopenharmony_ci    bool isSuccess = false;
9154aa6d63Sopenharmony_ci    std::string method = params->GetMethod();
9254aa6d63Sopenharmony_ci    auto it = GENERATOR_RUN_METHOD.find(method);
9354aa6d63Sopenharmony_ci    if (it == GENERATOR_RUN_METHOD.end()) {
9454aa6d63Sopenharmony_ci        PrintErrorNumberMsg("COMMAND_ERROR", COMMAND_ERROR, "Unsupported method: " + method);
9554aa6d63Sopenharmony_ci        return false;
9654aa6d63Sopenharmony_ci    } else {
9754aa6d63Sopenharmony_ci        isSuccess = it->second(params->GetOptions(), api);
9854aa6d63Sopenharmony_ci    }
9954aa6d63Sopenharmony_ci    return isSuccess;
10054aa6d63Sopenharmony_ci}
10154aa6d63Sopenharmony_ci
10254aa6d63Sopenharmony_cibool ParamsRunTool::RunSignApp(Options* params, SignToolServiceImpl& api)
10354aa6d63Sopenharmony_ci{
10454aa6d63Sopenharmony_ci    if (!params->Required({Options::MODE, Options::IN_FILE, Options::OUT_FILE, Options::SIGN_ALG})) {
10554aa6d63Sopenharmony_ci        return false;
10654aa6d63Sopenharmony_ci    }
10754aa6d63Sopenharmony_ci
10854aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckInFile(params, {Options::IN_FILE, Options::APP_CERT_FILE,
10954aa6d63Sopenharmony_ci                                            Options::PROFILE_FILE, Options::KEY_STORE_FILE,
11054aa6d63Sopenharmony_ci                                            ParamConstants::PARAM_REMOTE_SIGNERPLUGIN})) {
11154aa6d63Sopenharmony_ci        return false;
11254aa6d63Sopenharmony_ci    }
11354aa6d63Sopenharmony_ci
11454aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckOutFile(params, {Options::OUT_FILE})) {
11554aa6d63Sopenharmony_ci        return false;
11654aa6d63Sopenharmony_ci    }
11754aa6d63Sopenharmony_ci
11854aa6d63Sopenharmony_ci    std::string mode = params->GetString(Options::MODE);
11954aa6d63Sopenharmony_ci    if (!StringUtils::CaseCompare(mode, LOCAL_SIGN) &&
12054aa6d63Sopenharmony_ci        !StringUtils::CaseCompare(mode, REMOTE_SIGN)) {
12154aa6d63Sopenharmony_ci        PrintErrorNumberMsg("COMMAND_ERROR", COMMAND_ERROR, "not support command param '" + mode + "'");
12254aa6d63Sopenharmony_ci        return false;
12354aa6d63Sopenharmony_ci    }
12454aa6d63Sopenharmony_ci    if (StringUtils::CaseCompare(mode, LOCAL_SIGN)) {
12554aa6d63Sopenharmony_ci        if (!params->Required({Options::KEY_STORE_FILE, Options::KEY_ALIAS, Options::APP_CERT_FILE})) {
12654aa6d63Sopenharmony_ci            return false;
12754aa6d63Sopenharmony_ci        }
12854aa6d63Sopenharmony_ci        if (!FileUtils::ValidFileType(params->GetString(Options::KEY_STORE_FILE), {"p12", "jks"})) {
12954aa6d63Sopenharmony_ci            return false;
13054aa6d63Sopenharmony_ci        }
13154aa6d63Sopenharmony_ci    }
13254aa6d63Sopenharmony_ci    if (!CheckProfile(*params)) {
13354aa6d63Sopenharmony_ci        return false;
13454aa6d63Sopenharmony_ci    }
13554aa6d63Sopenharmony_ci    std::string inForm = params->GetString(Options::INFORM, ZIP);
13654aa6d63Sopenharmony_ci    if (!StringUtils::IsEmpty(inForm) && !StringUtils::ContainsCase(InformList, inForm)) {
13754aa6d63Sopenharmony_ci        PrintErrorNumberMsg("NOT_SUPPORT_ERROR", NOT_SUPPORT_ERROR, "parameter '" + inForm
13854aa6d63Sopenharmony_ci                            + "' format error, Inform only support zip/elf/bin");
13954aa6d63Sopenharmony_ci        return false;
14054aa6d63Sopenharmony_ci    }
14154aa6d63Sopenharmony_ci    std::string signAlg = params->GetString(Options::SIGN_ALG);
14254aa6d63Sopenharmony_ci    if (!CmdUtil::JudgeSignAlgType(signAlg)) {
14354aa6d63Sopenharmony_ci        return false;
14454aa6d63Sopenharmony_ci    }
14554aa6d63Sopenharmony_ci    return api.SignHap(params);
14654aa6d63Sopenharmony_ci}
14754aa6d63Sopenharmony_ci
14854aa6d63Sopenharmony_cibool ParamsRunTool::CheckProfile(Options& params)
14954aa6d63Sopenharmony_ci{
15054aa6d63Sopenharmony_ci    std::string inForm = params.GetString(Options::INFORM);
15154aa6d63Sopenharmony_ci    std::string profileFile = params.GetString(Options::PROFILE_FILE);
15254aa6d63Sopenharmony_ci
15354aa6d63Sopenharmony_ci    std::string profileSigned = params.GetString(Options::PROFILE_SIGNED);
15454aa6d63Sopenharmony_ci    if (StringUtils::CaseCompare(inForm, ELF) && FileUtils::IsEmpty(profileFile)) {
15554aa6d63Sopenharmony_ci        return true;
15654aa6d63Sopenharmony_ci    }
15754aa6d63Sopenharmony_ci
15854aa6d63Sopenharmony_ci    if (profileSigned == "1") {
15954aa6d63Sopenharmony_ci        if (!FileUtils::ValidFileType(profileFile, {"p7b"})) {
16054aa6d63Sopenharmony_ci            return false;
16154aa6d63Sopenharmony_ci        }
16254aa6d63Sopenharmony_ci    } else {
16354aa6d63Sopenharmony_ci        if (!FileUtils::ValidFileType(profileFile, {"json"})) {
16454aa6d63Sopenharmony_ci            return false;
16554aa6d63Sopenharmony_ci        }
16654aa6d63Sopenharmony_ci    }
16754aa6d63Sopenharmony_ci
16854aa6d63Sopenharmony_ci    return true;
16954aa6d63Sopenharmony_ci}
17054aa6d63Sopenharmony_ci
17154aa6d63Sopenharmony_cibool ParamsRunTool::DispatchParams(const ParamsSharedPtr& params, SignToolServiceImpl& api)
17254aa6d63Sopenharmony_ci{
17354aa6d63Sopenharmony_ci    bool isSuccess = false;
17454aa6d63Sopenharmony_ci    std::string method = params->GetMethod();
17554aa6d63Sopenharmony_ci    auto it = DISPATCH_RUN_METHOD.find(method);
17654aa6d63Sopenharmony_ci    if (it == DISPATCH_RUN_METHOD.end()) {
17754aa6d63Sopenharmony_ci        isSuccess = ParamsRunTool::CallGenerators(params, api);
17854aa6d63Sopenharmony_ci    } else {
17954aa6d63Sopenharmony_ci        isSuccess = it->second(params->GetOptions(), api);
18054aa6d63Sopenharmony_ci    }
18154aa6d63Sopenharmony_ci    return isSuccess;
18254aa6d63Sopenharmony_ci}
18354aa6d63Sopenharmony_ci
18454aa6d63Sopenharmony_cibool ParamsRunTool::RunCa(Options* params, SignToolServiceImpl& api)
18554aa6d63Sopenharmony_ci{
18654aa6d63Sopenharmony_ci    if (!params->Required({Options::KEY_ALIAS, Options::KEY_ALG,
18754aa6d63Sopenharmony_ci        Options::KEY_SIZE, Options::SUBJECT, Options::SIGN_ALG, Options::KEY_STORE_FILE})) {
18854aa6d63Sopenharmony_ci        return false;
18954aa6d63Sopenharmony_ci    }
19054aa6d63Sopenharmony_ci
19154aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckOutFile(params, {Options::OUT_FILE, Options::KEY_STORE_FILE,
19254aa6d63Sopenharmony_ci                                             Options::ISSUER_KEY_STORE_FILE})) {
19354aa6d63Sopenharmony_ci        return false;
19454aa6d63Sopenharmony_ci    }
19554aa6d63Sopenharmony_ci
19654aa6d63Sopenharmony_ci    std::string keyAlg = params->GetString(Options::KEY_ALG);
19754aa6d63Sopenharmony_ci    if (!CmdUtil::JudgeAlgType(keyAlg)) {
19854aa6d63Sopenharmony_ci        return false;
19954aa6d63Sopenharmony_ci    }
20054aa6d63Sopenharmony_ci    int keySize = params->GetInt(Options::KEY_SIZE);
20154aa6d63Sopenharmony_ci    if (!CmdUtil::JudgeSize(keySize)) {
20254aa6d63Sopenharmony_ci        return false;
20354aa6d63Sopenharmony_ci    }
20454aa6d63Sopenharmony_ci    std::string signAlg = params->GetString(Options::SIGN_ALG);
20554aa6d63Sopenharmony_ci    if (!CmdUtil::JudgeSignAlgType(signAlg)) {
20654aa6d63Sopenharmony_ci        return false;
20754aa6d63Sopenharmony_ci    }
20854aa6d63Sopenharmony_ci    if (!FileUtils::ValidFileType(params->GetString(Options::KEY_STORE_FILE), {"p12", "jks"})) {
20954aa6d63Sopenharmony_ci        return false;
21054aa6d63Sopenharmony_ci    }
21154aa6d63Sopenharmony_ci
21254aa6d63Sopenharmony_ci    return api.GenerateCA(params);
21354aa6d63Sopenharmony_ci}
21454aa6d63Sopenharmony_ci
21554aa6d63Sopenharmony_cibool ParamsRunTool::RunCert(Options* params, SignToolServiceImpl& api)
21654aa6d63Sopenharmony_ci{
21754aa6d63Sopenharmony_ci    if (!params->Required({Options::KEY_ALIAS, Options::ISSUER,
21854aa6d63Sopenharmony_ci        Options::ISSUER_KEY_ALIAS, Options::SUBJECT, Options::KEY_USAGE,
21954aa6d63Sopenharmony_ci        Options::SIGN_ALG, Options::KEY_STORE_FILE})) {
22054aa6d63Sopenharmony_ci        return false;
22154aa6d63Sopenharmony_ci    }
22254aa6d63Sopenharmony_ci
22354aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckInFile(params, {Options::KEY_STORE_FILE, Options::ISSUER_KEY_STORE_FILE})) {
22454aa6d63Sopenharmony_ci        return false;
22554aa6d63Sopenharmony_ci    }
22654aa6d63Sopenharmony_ci
22754aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckOutFile(params, {Options::OUT_FILE})) {
22854aa6d63Sopenharmony_ci        return false;
22954aa6d63Sopenharmony_ci    }
23054aa6d63Sopenharmony_ci
23154aa6d63Sopenharmony_ci    std::string keyusage = params->GetString(Options::KEY_USAGE);
23254aa6d63Sopenharmony_ci    if (!CmdUtil::VerifyTypes(keyusage)) {
23354aa6d63Sopenharmony_ci        return false;
23454aa6d63Sopenharmony_ci    }
23554aa6d63Sopenharmony_ci    std::string extkeyusage = params->GetString(Options::EXT_KEY_USAGE);
23654aa6d63Sopenharmony_ci    if (!extkeyusage.empty()) {
23754aa6d63Sopenharmony_ci        if (!CmdUtil::VerifyType(extkeyusage)) {
23854aa6d63Sopenharmony_ci            return false;
23954aa6d63Sopenharmony_ci        }
24054aa6d63Sopenharmony_ci    }
24154aa6d63Sopenharmony_ci    std::string signAlg = params->GetString(Options::SIGN_ALG);
24254aa6d63Sopenharmony_ci    if (!CmdUtil::JudgeSignAlgType(signAlg)) {
24354aa6d63Sopenharmony_ci        return false;
24454aa6d63Sopenharmony_ci    }
24554aa6d63Sopenharmony_ci    if (!FileUtils::ValidFileType(params->GetString(Options::KEY_STORE_FILE), {"p12", "jks"})) {
24654aa6d63Sopenharmony_ci        return false;
24754aa6d63Sopenharmony_ci    }
24854aa6d63Sopenharmony_ci    return api.GenerateCert(params);
24954aa6d63Sopenharmony_ci}
25054aa6d63Sopenharmony_ci
25154aa6d63Sopenharmony_cibool ParamsRunTool::CheckEndCertArguments(Options& params)
25254aa6d63Sopenharmony_ci{
25354aa6d63Sopenharmony_ci    if (!params.Required({Options::KEY_ALIAS, Options::ISSUER, Options::ISSUER_KEY_ALIAS,
25454aa6d63Sopenharmony_ci                        Options::SUBJECT, Options::SIGN_ALG, Options::KEY_STORE_FILE})) {
25554aa6d63Sopenharmony_ci        return false;
25654aa6d63Sopenharmony_ci    }
25754aa6d63Sopenharmony_ci    std::string signAlg = params.GetString(Options::SIGN_ALG);
25854aa6d63Sopenharmony_ci    if (!CmdUtil::JudgeSignAlgType(signAlg)) {
25954aa6d63Sopenharmony_ci        return false;
26054aa6d63Sopenharmony_ci    }
26154aa6d63Sopenharmony_ci    std::string outForm = params.GetString(Options::OUT_FORM);
26254aa6d63Sopenharmony_ci    if (!outForm.empty()) {
26354aa6d63Sopenharmony_ci        if (!CmdUtil::VerifyType(outForm, Options::OUT_FORM_SCOPE)) {
26454aa6d63Sopenharmony_ci            return false;
26554aa6d63Sopenharmony_ci        }
26654aa6d63Sopenharmony_ci    }
26754aa6d63Sopenharmony_ci    if (!outForm.empty() && "certChain" == outForm) {
26854aa6d63Sopenharmony_ci        if (!params.Required({Options::SUB_CA_CERT_FILE, Options::CA_CERT_FILE})) {
26954aa6d63Sopenharmony_ci            return false;
27054aa6d63Sopenharmony_ci        }
27154aa6d63Sopenharmony_ci        if (!FileUtils::ValidFileType(params.GetString(Options::SUB_CA_CERT_FILE), {"cer"}) ||
27254aa6d63Sopenharmony_ci            !FileUtils::ValidFileType(params.GetString(Options::CA_CERT_FILE), {"cer"})) {
27354aa6d63Sopenharmony_ci            return false;
27454aa6d63Sopenharmony_ci        }
27554aa6d63Sopenharmony_ci    }
27654aa6d63Sopenharmony_ci    std::string keyStoreFile = params.GetString(Options::KEY_STORE_FILE);
27754aa6d63Sopenharmony_ci    if (!FileUtils::ValidFileType(keyStoreFile, {"p12", "jks"})) {
27854aa6d63Sopenharmony_ci        return false;
27954aa6d63Sopenharmony_ci    }
28054aa6d63Sopenharmony_ci    if (params.find(Options::ISSUER_KEY_STORE_FILE) != params.end()) {
28154aa6d63Sopenharmony_ci        std::string issuerKeyStoreFile = params.GetString(Options::ISSUER_KEY_STORE_FILE);
28254aa6d63Sopenharmony_ci        if (!FileUtils::ValidFileType(issuerKeyStoreFile, {"p12", "jks"})) {
28354aa6d63Sopenharmony_ci            return false;
28454aa6d63Sopenharmony_ci        }
28554aa6d63Sopenharmony_ci    }
28654aa6d63Sopenharmony_ci    std::string outFile = params.GetString(Options::OUT_FILE);
28754aa6d63Sopenharmony_ci    if (!outFile.empty()) {
28854aa6d63Sopenharmony_ci        if (!FileUtils::ValidFileType(outFile, {"cer", "pem"})) {
28954aa6d63Sopenharmony_ci            return false;
29054aa6d63Sopenharmony_ci        }
29154aa6d63Sopenharmony_ci    }
29254aa6d63Sopenharmony_ci    return true;
29354aa6d63Sopenharmony_ci}
29454aa6d63Sopenharmony_ci
29554aa6d63Sopenharmony_cibool ParamsRunTool::RunAppCert(Options* params, SignToolServiceImpl& api)
29654aa6d63Sopenharmony_ci{
29754aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckInFile(params, {Options::KEY_STORE_FILE, Options::ISSUER_KEY_STORE_FILE,
29854aa6d63Sopenharmony_ci                                            Options::CA_CERT_FILE, Options::SUB_CA_CERT_FILE})) {
29954aa6d63Sopenharmony_ci        return false;
30054aa6d63Sopenharmony_ci    }
30154aa6d63Sopenharmony_ci
30254aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckOutFile(params, {Options::OUT_FILE})) {
30354aa6d63Sopenharmony_ci        return false;
30454aa6d63Sopenharmony_ci    }
30554aa6d63Sopenharmony_ci
30654aa6d63Sopenharmony_ci    if (!ParamsRunTool::CheckEndCertArguments(*params)) {
30754aa6d63Sopenharmony_ci        return false;
30854aa6d63Sopenharmony_ci    }
30954aa6d63Sopenharmony_ci    return api.GenerateAppCert(params);
31054aa6d63Sopenharmony_ci}
31154aa6d63Sopenharmony_ci
31254aa6d63Sopenharmony_cibool ParamsRunTool::RunProfileCert(Options* params, SignToolServiceImpl& api)
31354aa6d63Sopenharmony_ci{
31454aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckInFile(params, {Options::KEY_STORE_FILE, Options::ISSUER_KEY_STORE_FILE,
31554aa6d63Sopenharmony_ci                                            Options::CA_CERT_FILE, Options::SUB_CA_CERT_FILE})) {
31654aa6d63Sopenharmony_ci        return false;
31754aa6d63Sopenharmony_ci    }
31854aa6d63Sopenharmony_ci
31954aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckOutFile(params, {Options::OUT_FILE})) {
32054aa6d63Sopenharmony_ci        return false;
32154aa6d63Sopenharmony_ci    }
32254aa6d63Sopenharmony_ci
32354aa6d63Sopenharmony_ci    if (!ParamsRunTool::CheckEndCertArguments(*params)) {
32454aa6d63Sopenharmony_ci        return false;
32554aa6d63Sopenharmony_ci    }
32654aa6d63Sopenharmony_ci    return api.GenerateProfileCert(params);
32754aa6d63Sopenharmony_ci}
32854aa6d63Sopenharmony_ci
32954aa6d63Sopenharmony_cibool ParamsRunTool::RunKeypair(Options* params, SignToolServiceImpl& api)
33054aa6d63Sopenharmony_ci{
33154aa6d63Sopenharmony_ci    if (!params->Required({Options::KEY_ALIAS, Options::KEY_ALG, Options::KEY_SIZE, Options::KEY_STORE_FILE})) {
33254aa6d63Sopenharmony_ci        return false;
33354aa6d63Sopenharmony_ci    }
33454aa6d63Sopenharmony_ci
33554aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckOutFile(params, {Options::KEY_STORE_FILE})) {
33654aa6d63Sopenharmony_ci        return false;
33754aa6d63Sopenharmony_ci    }
33854aa6d63Sopenharmony_ci
33954aa6d63Sopenharmony_ci    std::string keyAlgorithm = params->GetString(Options::KEY_ALG);
34054aa6d63Sopenharmony_ci    if (!CmdUtil::JudgeAlgType(keyAlgorithm)) {
34154aa6d63Sopenharmony_ci        return false;
34254aa6d63Sopenharmony_ci    }
34354aa6d63Sopenharmony_ci    int keyAlgorithmSize = params->GetInt(Options::KEY_SIZE);
34454aa6d63Sopenharmony_ci    if (!CmdUtil::JudgeSize(keyAlgorithmSize)) {
34554aa6d63Sopenharmony_ci        return false;
34654aa6d63Sopenharmony_ci    }
34754aa6d63Sopenharmony_ci    if (!FileUtils::ValidFileType(params->GetString(Options::KEY_STORE_FILE), {"p12", "jks"})) {
34854aa6d63Sopenharmony_ci        return false;
34954aa6d63Sopenharmony_ci    }
35054aa6d63Sopenharmony_ci    return api.GenerateKeyStore(params);
35154aa6d63Sopenharmony_ci}
35254aa6d63Sopenharmony_ci
35354aa6d63Sopenharmony_cibool ParamsRunTool::RunCsr(Options* params, SignToolServiceImpl& api)
35454aa6d63Sopenharmony_ci{
35554aa6d63Sopenharmony_ci    if (!params->Required({Options::KEY_ALIAS, Options::SUBJECT, Options::SIGN_ALG, Options::KEY_STORE_FILE})) {
35654aa6d63Sopenharmony_ci        return false;
35754aa6d63Sopenharmony_ci    }
35854aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckInFile(params, {Options::KEY_STORE_FILE})) {
35954aa6d63Sopenharmony_ci        return false;
36054aa6d63Sopenharmony_ci    }
36154aa6d63Sopenharmony_ci
36254aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckOutFile(params, {Options::OUT_FILE})) {
36354aa6d63Sopenharmony_ci        return false;
36454aa6d63Sopenharmony_ci    }
36554aa6d63Sopenharmony_ci
36654aa6d63Sopenharmony_ci    std::string signAlg = params->GetString(Options::SIGN_ALG);
36754aa6d63Sopenharmony_ci    if (!CmdUtil::JudgeSignAlgType(signAlg)) {
36854aa6d63Sopenharmony_ci        return false;
36954aa6d63Sopenharmony_ci    }
37054aa6d63Sopenharmony_ci    if (!FileUtils::ValidFileType(params->GetString(Options::KEY_STORE_FILE), {"p12", "jks"})) {
37154aa6d63Sopenharmony_ci        return false;
37254aa6d63Sopenharmony_ci    }
37354aa6d63Sopenharmony_ci    if (params->count(Options::OUT_FILE)) {
37454aa6d63Sopenharmony_ci        if (!FileUtils::ValidFileType(params->GetString(Options::OUT_FILE), {"csr"})) {
37554aa6d63Sopenharmony_ci            return false;
37654aa6d63Sopenharmony_ci        }
37754aa6d63Sopenharmony_ci    }
37854aa6d63Sopenharmony_ci    return api.GenerateCsr(params);
37954aa6d63Sopenharmony_ci}
38054aa6d63Sopenharmony_ci
38154aa6d63Sopenharmony_cibool ParamsRunTool::RunSignProfile(Options* params, SignToolServiceImpl& api)
38254aa6d63Sopenharmony_ci{
38354aa6d63Sopenharmony_ci    if (!params->Required({params->MODE, params->SIGN_ALG, params->OUT_FILE, params->IN_FILE})) {
38454aa6d63Sopenharmony_ci        return false;
38554aa6d63Sopenharmony_ci    }
38654aa6d63Sopenharmony_ci
38754aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckInFile(params, {Options::KEY_STORE_FILE, Options::PROFILE_CERT_FILE,
38854aa6d63Sopenharmony_ci                                            Options::IN_FILE})) {
38954aa6d63Sopenharmony_ci        return false;
39054aa6d63Sopenharmony_ci    }
39154aa6d63Sopenharmony_ci
39254aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckOutFile(params, {Options::OUT_FILE})) {
39354aa6d63Sopenharmony_ci        return false;
39454aa6d63Sopenharmony_ci    }
39554aa6d63Sopenharmony_ci
39654aa6d63Sopenharmony_ci    std::string mode = params->GetString(Options::MODE);
39754aa6d63Sopenharmony_ci    if (!StringUtils::CaseCompare(mode, LOCAL_SIGN) &&
39854aa6d63Sopenharmony_ci        !StringUtils::CaseCompare(mode, REMOTE_SIGN)) {
39954aa6d63Sopenharmony_ci        PrintErrorNumberMsg("COMMAND_ERROR", COMMAND_ERROR, "not support command param '" + mode + "'");
40054aa6d63Sopenharmony_ci        return false;
40154aa6d63Sopenharmony_ci    }
40254aa6d63Sopenharmony_ci    if (StringUtils::CaseCompare(mode, LOCAL_SIGN)) {
40354aa6d63Sopenharmony_ci        if (!params->Required({params->KEY_STORE_FILE, params->KEY_ALIAS, params->PROFILE_CERT_FILE})) {
40454aa6d63Sopenharmony_ci            return false;
40554aa6d63Sopenharmony_ci        }
40654aa6d63Sopenharmony_ci
40754aa6d63Sopenharmony_ci        if (!FileUtils::ValidFileType(params->GetString(Options::KEY_STORE_FILE), {"p12", "jks"})) {
40854aa6d63Sopenharmony_ci            return false;
40954aa6d63Sopenharmony_ci        }
41054aa6d63Sopenharmony_ci    }
41154aa6d63Sopenharmony_ci    std::string signAlg = params->GetString(Options::SIGN_ALG);
41254aa6d63Sopenharmony_ci    if (!CmdUtil::JudgeSignAlgType(signAlg)) {
41354aa6d63Sopenharmony_ci        return false;
41454aa6d63Sopenharmony_ci    }
41554aa6d63Sopenharmony_ci    std::string outFile = params->GetString(Options::OUT_FILE);
41654aa6d63Sopenharmony_ci    if (FileUtils::ValidFileType(outFile, {"p7b"}) == false) {
41754aa6d63Sopenharmony_ci        return false;
41854aa6d63Sopenharmony_ci    }
41954aa6d63Sopenharmony_ci    return api.SignProfile(params);
42054aa6d63Sopenharmony_ci}
42154aa6d63Sopenharmony_ci
42254aa6d63Sopenharmony_cibool ParamsRunTool::RunVerifyProfile(Options* params, SignToolServiceImpl& api)
42354aa6d63Sopenharmony_ci{
42454aa6d63Sopenharmony_ci    if (!params->Required({Options::IN_FILE})) {
42554aa6d63Sopenharmony_ci        return false;
42654aa6d63Sopenharmony_ci    }
42754aa6d63Sopenharmony_ci
42854aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckInFile(params, {Options::IN_FILE})) {
42954aa6d63Sopenharmony_ci        return false;
43054aa6d63Sopenharmony_ci    }
43154aa6d63Sopenharmony_ci
43254aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckOutFile(params, {Options::OUT_FILE})) {
43354aa6d63Sopenharmony_ci        return false;
43454aa6d63Sopenharmony_ci    }
43554aa6d63Sopenharmony_ci
43654aa6d63Sopenharmony_ci    if (!FileUtils::ValidFileType(params->GetString(Options::IN_FILE), {"p7b"})) {
43754aa6d63Sopenharmony_ci        return false;
43854aa6d63Sopenharmony_ci    }
43954aa6d63Sopenharmony_ci
44054aa6d63Sopenharmony_ci    std::string outFile = params->GetString(Options::OUT_FILE);
44154aa6d63Sopenharmony_ci    if (!outFile.empty()) {
44254aa6d63Sopenharmony_ci        if (!FileUtils::ValidFileType(outFile, {"json"})) {
44354aa6d63Sopenharmony_ci            return false;
44454aa6d63Sopenharmony_ci        }
44554aa6d63Sopenharmony_ci    }
44654aa6d63Sopenharmony_ci    return api.VerifyProfile(params);
44754aa6d63Sopenharmony_ci}
44854aa6d63Sopenharmony_ci
44954aa6d63Sopenharmony_civoid ParamsRunTool::PrintHelp()
45054aa6d63Sopenharmony_ci{
45154aa6d63Sopenharmony_ci    PrintMsg(HELP_TXT);
45254aa6d63Sopenharmony_ci}
45354aa6d63Sopenharmony_ci
45454aa6d63Sopenharmony_civoid  ParamsRunTool::Version()
45554aa6d63Sopenharmony_ci{
45654aa6d63Sopenharmony_ci    PrintMsg(ParamsRunTool::VERSION);
45754aa6d63Sopenharmony_ci}
45854aa6d63Sopenharmony_ci
45954aa6d63Sopenharmony_cibool ParamsRunTool::RunVerifyApp(Options* params, SignToolServiceImpl& api)
46054aa6d63Sopenharmony_ci{
46154aa6d63Sopenharmony_ci    if (!params->Required({Options::IN_FILE, Options::OUT_CERT_CHAIN, Options::OUT_PROFILE})) {
46254aa6d63Sopenharmony_ci        return false;
46354aa6d63Sopenharmony_ci    }
46454aa6d63Sopenharmony_ci
46554aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckInFile(params, {Options::IN_FILE})) {
46654aa6d63Sopenharmony_ci        return false;
46754aa6d63Sopenharmony_ci    }
46854aa6d63Sopenharmony_ci
46954aa6d63Sopenharmony_ci    if (!CmdUtil::UpdateParamForCheckOutFile(params, {Options::OUT_CERT_CHAIN, Options::OUT_PROFILE})) {
47054aa6d63Sopenharmony_ci        return false;
47154aa6d63Sopenharmony_ci    }
47254aa6d63Sopenharmony_ci
47354aa6d63Sopenharmony_ci    std::string inForm = params->GetString(Options::INFORM, ZIP);
47454aa6d63Sopenharmony_ci    if (!StringUtils::ContainsCase(InformList, inForm)) {
47554aa6d63Sopenharmony_ci        PrintErrorNumberMsg("NOT_SUPPORT_ERROR", NOT_SUPPORT_ERROR, "parameter '" + inForm
47654aa6d63Sopenharmony_ci                            + "' format error, Inform only support zip/elf/bin");
47754aa6d63Sopenharmony_ci        return false;
47854aa6d63Sopenharmony_ci    }
47954aa6d63Sopenharmony_ci    if (!FileUtils::ValidFileType(params->GetString(Options::OUT_CERT_CHAIN), {"cer"})) {
48054aa6d63Sopenharmony_ci        return false;
48154aa6d63Sopenharmony_ci    }
48254aa6d63Sopenharmony_ci    if (!FileUtils::ValidFileType(params->GetString(Options::OUT_PROFILE), {"p7b"})) {
48354aa6d63Sopenharmony_ci        return false;
48454aa6d63Sopenharmony_ci    }
48554aa6d63Sopenharmony_ci    return api.VerifyHapSigner(params);
48654aa6d63Sopenharmony_ci}
48754aa6d63Sopenharmony_ci} // namespace SignatureTools
48854aa6d63Sopenharmony_ci} // namespace OHOS