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 "cmd_util.h"
1654aa6d63Sopenharmony_ci#include <set>
1754aa6d63Sopenharmony_ci#include <filesystem>
1854aa6d63Sopenharmony_ci
1954aa6d63Sopenharmony_ci#include "params_run_tool.h"
2054aa6d63Sopenharmony_ci#include "constant.h"
2154aa6d63Sopenharmony_ci#include "param_constants.h"
2254aa6d63Sopenharmony_ci
2354aa6d63Sopenharmony_cinamespace OHOS {
2454aa6d63Sopenharmony_cinamespace SignatureTools {
2554aa6d63Sopenharmony_ciconst std::regex INTEGER_PATTERN = std::regex("\\d{1,10}");
2654aa6d63Sopenharmony_ci
2754aa6d63Sopenharmony_cibool CmdUtil::String2Bool(Options* options, const std::string& option)
2854aa6d63Sopenharmony_ci{
2954aa6d63Sopenharmony_ci    std::string val = options->GetString(option);
3054aa6d63Sopenharmony_ci    if (val == "1" || val == "true" || val == "TRUE") {
3154aa6d63Sopenharmony_ci        (*options)[option] = true;
3254aa6d63Sopenharmony_ci    } else if (val == "0" || val == "false" || val == "FALSE") {
3354aa6d63Sopenharmony_ci        (*options)[option] = false;
3454aa6d63Sopenharmony_ci    } else {
3554aa6d63Sopenharmony_ci        PrintErrorNumberMsg("COMMAND_PARAM_ERROR", COMMAND_PARAM_ERROR,
3654aa6d63Sopenharmony_ci                            val + "is not valid value for " + "-" + option);
3754aa6d63Sopenharmony_ci        return false;
3854aa6d63Sopenharmony_ci    }
3954aa6d63Sopenharmony_ci    return true;
4054aa6d63Sopenharmony_ci}
4154aa6d63Sopenharmony_ci
4254aa6d63Sopenharmony_cistatic bool UpdateParamForVariantCertInt(const ParamsSharedPtr& param)
4354aa6d63Sopenharmony_ci{
4454aa6d63Sopenharmony_ci    int defaultValidity = 0;
4554aa6d63Sopenharmony_ci    Options* options = param->GetOptions();
4654aa6d63Sopenharmony_ci    if (options->count(Options::VALIDITY)) {
4754aa6d63Sopenharmony_ci        int validity = 0;
4854aa6d63Sopenharmony_ci        std::string val = options->GetString(Options::VALIDITY);
4954aa6d63Sopenharmony_ci        for (char x : val) {
5054aa6d63Sopenharmony_ci            if (!isdigit(x)) {
5154aa6d63Sopenharmony_ci                PrintErrorNumberMsg("COMMAND_PARAM_ERROR", COMMAND_PARAM_ERROR, "Invalid parameter '"
5254aa6d63Sopenharmony_ci                                    + val + "', You should fill in the numbers");
5354aa6d63Sopenharmony_ci                return false;
5454aa6d63Sopenharmony_ci            }
5554aa6d63Sopenharmony_ci        }
5654aa6d63Sopenharmony_ci        if (!StringUtils::CheckStringToint(val, validity)) {
5754aa6d63Sopenharmony_ci            PrintErrorNumberMsg("COMMAND_PARAM_ERROR", COMMAND_PARAM_ERROR, "Invalid parameter '"
5854aa6d63Sopenharmony_ci                                + val + "'");
5954aa6d63Sopenharmony_ci            return false;
6054aa6d63Sopenharmony_ci        }
6154aa6d63Sopenharmony_ci        validity *= ONE_DAY_TIME;
6254aa6d63Sopenharmony_ci        (*options)[Options::VALIDITY] = validity;
6354aa6d63Sopenharmony_ci    } else if (param->GetMethod() == GENERATE_CA || param->GetMethod() == GENERATE_APP_CERT ||
6454aa6d63Sopenharmony_ci               param->GetMethod() == GENERATE_PROFILE_CERT) {
6554aa6d63Sopenharmony_ci        defaultValidity = DEFAULT_VALIDITY_DAYS * ONE_DAY_TIME;
6654aa6d63Sopenharmony_ci        (*options)[Options::VALIDITY] = defaultValidity;
6754aa6d63Sopenharmony_ci    } else if (param->GetMethod() == GENERATE_CERT) {
6854aa6d63Sopenharmony_ci        defaultValidity = DEFAULT_CUSTOM_VALIDITY_DAYS * ONE_DAY_TIME;
6954aa6d63Sopenharmony_ci        (*options)[Options::VALIDITY] = defaultValidity;
7054aa6d63Sopenharmony_ci    }
7154aa6d63Sopenharmony_ci    return true;
7254aa6d63Sopenharmony_ci}
7354aa6d63Sopenharmony_ci
7454aa6d63Sopenharmony_cistatic bool UpdateParamForVariantInt(const ParamsSharedPtr& param)
7554aa6d63Sopenharmony_ci{
7654aa6d63Sopenharmony_ci    Options* options = param->GetOptions();
7754aa6d63Sopenharmony_ci    // general
7854aa6d63Sopenharmony_ci    if (options->count(Options::KEY_SIZE)) {
7954aa6d63Sopenharmony_ci        std::string keySize = options->GetString(Options::KEY_SIZE);
8054aa6d63Sopenharmony_ci        if (keySize == "NIST-P-256") {
8154aa6d63Sopenharmony_ci            (*options)[Options::KEY_SIZE] = NIST_P_256;
8254aa6d63Sopenharmony_ci        } else if (keySize == "NIST-P-384") {
8354aa6d63Sopenharmony_ci            (*options)[Options::KEY_SIZE] = NIST_P_384;
8454aa6d63Sopenharmony_ci        } else {
8554aa6d63Sopenharmony_ci            PrintErrorNumberMsg("COMMAND_ERROR", COMMAND_ERROR, "not supported '" + keySize
8654aa6d63Sopenharmony_ci                                + "' Key algorithms length");
8754aa6d63Sopenharmony_ci            return false;
8854aa6d63Sopenharmony_ci        }
8954aa6d63Sopenharmony_ci    }
9054aa6d63Sopenharmony_ci    if (options->count(Options::BASIC_CONSTRAINTS_PATH_LEN)) {
9154aa6d63Sopenharmony_ci        int basicConstraintsPathLen = 0;
9254aa6d63Sopenharmony_ci        std::string val = options->GetString(Options::BASIC_CONSTRAINTS_PATH_LEN);
9354aa6d63Sopenharmony_ci        if (!StringUtils::CheckStringToint(val, basicConstraintsPathLen)) {
9454aa6d63Sopenharmony_ci            PrintErrorNumberMsg("COMMAND_PARAM_ERROR", COMMAND_PARAM_ERROR, "Invalid parameter '"
9554aa6d63Sopenharmony_ci                                + val + "', You should fill in the numbers");
9654aa6d63Sopenharmony_ci            return false;
9754aa6d63Sopenharmony_ci        }
9854aa6d63Sopenharmony_ci        (*options)[Options::BASIC_CONSTRAINTS_PATH_LEN] = basicConstraintsPathLen;
9954aa6d63Sopenharmony_ci    } else if (param->GetMethod() == GENERATE_CA || param->GetMethod() == GENERATE_CERT) {
10054aa6d63Sopenharmony_ci        (*options)[Options::BASIC_CONSTRAINTS_PATH_LEN] = DEFAULT_BASIC_CONSTRAINTS_PATH_LEN;
10154aa6d63Sopenharmony_ci    }
10254aa6d63Sopenharmony_ci    if (!UpdateParamForVariantCertInt(param)) {
10354aa6d63Sopenharmony_ci        return false;
10454aa6d63Sopenharmony_ci    }
10554aa6d63Sopenharmony_ci    return true;
10654aa6d63Sopenharmony_ci}
10754aa6d63Sopenharmony_ci
10854aa6d63Sopenharmony_cistatic bool UpdateParamForVariantBoolKeyUsage(const ParamsSharedPtr& param)
10954aa6d63Sopenharmony_ci{
11054aa6d63Sopenharmony_ci    Options* options = param->GetOptions();
11154aa6d63Sopenharmony_ci
11254aa6d63Sopenharmony_ci    //The bool type is used only by the "generate-cert" module
11354aa6d63Sopenharmony_ci    if (options->count(Options::KEY_USAGE_CRITICAL)) {
11454aa6d63Sopenharmony_ci        if (!CmdUtil::String2Bool(options, Options::KEY_USAGE_CRITICAL)) {
11554aa6d63Sopenharmony_ci            return false;
11654aa6d63Sopenharmony_ci        }
11754aa6d63Sopenharmony_ci    } else if (param->GetMethod() == GENERATE_CERT) {
11854aa6d63Sopenharmony_ci        (*options)[Options::KEY_USAGE_CRITICAL] = DEFAULT_KEY_USAGE_CRITICAL;
11954aa6d63Sopenharmony_ci    }
12054aa6d63Sopenharmony_ci
12154aa6d63Sopenharmony_ci    //The bool type is used only by the "generate-cert" module
12254aa6d63Sopenharmony_ci    if (options->count(Options::EXT_KEY_USAGE_CRITICAL)) {
12354aa6d63Sopenharmony_ci        if (!CmdUtil::String2Bool(options, Options::EXT_KEY_USAGE_CRITICAL)) {
12454aa6d63Sopenharmony_ci            return false;
12554aa6d63Sopenharmony_ci        }
12654aa6d63Sopenharmony_ci    } else if (param->GetMethod() == GENERATE_CERT) {
12754aa6d63Sopenharmony_ci        (*options)[Options::EXT_KEY_USAGE_CRITICAL] = DEFAULT_EXT_KEY_USAGE_CRITICAL;
12854aa6d63Sopenharmony_ci    }
12954aa6d63Sopenharmony_ci    return true;
13054aa6d63Sopenharmony_ci}
13154aa6d63Sopenharmony_ci
13254aa6d63Sopenharmony_cistatic bool UpdateParamForVariantBoolProfileSigned(const ParamsSharedPtr& param)
13354aa6d63Sopenharmony_ci{
13454aa6d63Sopenharmony_ci    Options* options = param->GetOptions();
13554aa6d63Sopenharmony_ci
13654aa6d63Sopenharmony_ci    //The bool type is used only by the "sign-app" module
13754aa6d63Sopenharmony_ci    if (options->count(Options::PROFILE_SIGNED)) {
13854aa6d63Sopenharmony_ci        std::string val = options->GetString(Options::PROFILE_SIGNED);
13954aa6d63Sopenharmony_ci        if (val == "1" || val == "true" || val == "TRUE") {
14054aa6d63Sopenharmony_ci            (*options)[Options::PROFILE_SIGNED] = DEFAULT_PROFILE_SIGNED_1;
14154aa6d63Sopenharmony_ci        } else if (val == "0" || val == "false" || val == "FALSE") {
14254aa6d63Sopenharmony_ci            (*options)[Options::PROFILE_SIGNED] = DEFAULT_PROFILE_SIGNED_0;
14354aa6d63Sopenharmony_ci        } else {
14454aa6d63Sopenharmony_ci            PrintErrorNumberMsg("COMMAND_PARAM_ERROR", COMMAND_PARAM_ERROR,
14554aa6d63Sopenharmony_ci                                val + "is not valid value for "+"-" + Options::PROFILE_SIGNED);
14654aa6d63Sopenharmony_ci            return false;
14754aa6d63Sopenharmony_ci        }
14854aa6d63Sopenharmony_ci    } else if (param->GetMethod() == SIGN_APP) {
14954aa6d63Sopenharmony_ci        (*options)[Options::PROFILE_SIGNED] = DEFAULT_PROFILE_SIGNED_1;
15054aa6d63Sopenharmony_ci    }
15154aa6d63Sopenharmony_ci
15254aa6d63Sopenharmony_ci    return true;
15354aa6d63Sopenharmony_ci}
15454aa6d63Sopenharmony_ci
15554aa6d63Sopenharmony_cibool CmdUtil::UpdateParamForCheckOutFile(Options* options, const std::initializer_list<std::string>& outFileKeys)
15654aa6d63Sopenharmony_ci{
15754aa6d63Sopenharmony_ci    for (auto& key : outFileKeys) {
15854aa6d63Sopenharmony_ci        if (options->count(key)) {
15954aa6d63Sopenharmony_ci            std::string outFilePath = options->GetString(key);
16054aa6d63Sopenharmony_ci            std::filesystem::path filePath = outFilePath;
16154aa6d63Sopenharmony_ci            std::string parentPath = filePath.parent_path();
16254aa6d63Sopenharmony_ci
16354aa6d63Sopenharmony_ci            //Purpose: To prevent the user output path from passing an empty string. eg "   "
16454aa6d63Sopenharmony_ci            std::string tmpOutFilePath = outFilePath;
16554aa6d63Sopenharmony_ci            tmpOutFilePath.erase(std::remove_if(tmpOutFilePath.begin(),
16654aa6d63Sopenharmony_ci                tmpOutFilePath.end(), ::isspace), tmpOutFilePath.end());
16754aa6d63Sopenharmony_ci
16854aa6d63Sopenharmony_ci            if (parentPath.empty() && !tmpOutFilePath.empty()) {
16954aa6d63Sopenharmony_ci                parentPath = "./";
17054aa6d63Sopenharmony_ci            }
17154aa6d63Sopenharmony_ci            char realFilePath[PATH_MAX + 1] = {0x00};
17254aa6d63Sopenharmony_ci            if (parentPath.size() > PATH_MAX) {
17354aa6d63Sopenharmony_ci                PrintErrorNumberMsg("FILE_NOT_FOUND", FILE_NOT_FOUND, "'" + outFilePath + "' File path longer than '"
17454aa6d63Sopenharmony_ci                                    + std::to_string(PATH_MAX) + "' characters");
17554aa6d63Sopenharmony_ci                return false;
17654aa6d63Sopenharmony_ci            }
17754aa6d63Sopenharmony_ci            if (realpath(parentPath.c_str(), realFilePath) == nullptr) {
17854aa6d63Sopenharmony_ci                PrintErrorNumberMsg("FILE_NOT_FOUND", FILE_NOT_FOUND, "The '" + outFilePath +
17954aa6d63Sopenharmony_ci                                    "' file does not exist or the path is invalid"
18054aa6d63Sopenharmony_ci                                    + "', parameter name '-" + key + "'");
18154aa6d63Sopenharmony_ci                return false;
18254aa6d63Sopenharmony_ci            }
18354aa6d63Sopenharmony_ci            std::string charStr(realFilePath);
18454aa6d63Sopenharmony_ci            std::string fileName = filePath.filename();
18554aa6d63Sopenharmony_ci            if (fileName.empty()) {
18654aa6d63Sopenharmony_ci                PrintErrorNumberMsg("FILE_NOT_FOUND", FILE_NOT_FOUND, "The file name cannot be empty '"
18754aa6d63Sopenharmony_ci                                    + outFilePath + "', parameter name '-" + key + "'");
18854aa6d63Sopenharmony_ci                return false;
18954aa6d63Sopenharmony_ci            }
19054aa6d63Sopenharmony_ci            (*options)[key] = charStr + "/" + fileName;
19154aa6d63Sopenharmony_ci        }
19254aa6d63Sopenharmony_ci    }
19354aa6d63Sopenharmony_ci    return true;
19454aa6d63Sopenharmony_ci}
19554aa6d63Sopenharmony_ci
19654aa6d63Sopenharmony_cibool CmdUtil::UpdateParamForCheckInFile(Options* options, const std::initializer_list<std::string>& inFileKeys)
19754aa6d63Sopenharmony_ci{
19854aa6d63Sopenharmony_ci    for (auto& key : inFileKeys) {
19954aa6d63Sopenharmony_ci        if (options->count(key)) {
20054aa6d63Sopenharmony_ci            std::string inFilePath = options->GetString(key);
20154aa6d63Sopenharmony_ci            char realFilePath[PATH_MAX + 1] = {0x00};
20254aa6d63Sopenharmony_ci            if (inFilePath.size() > PATH_MAX) {
20354aa6d63Sopenharmony_ci                PrintErrorNumberMsg("FILE_NOT_FOUND", FILE_NOT_FOUND, "'" + inFilePath + "' File path longer than '"
20454aa6d63Sopenharmony_ci                                    + std::to_string(PATH_MAX) + "' characters");
20554aa6d63Sopenharmony_ci                return false;
20654aa6d63Sopenharmony_ci            }
20754aa6d63Sopenharmony_ci            if (realpath(inFilePath.c_str(), realFilePath) == nullptr) {
20854aa6d63Sopenharmony_ci                PrintErrorNumberMsg("FILE_NOT_FOUND", FILE_NOT_FOUND, "The '" + inFilePath +
20954aa6d63Sopenharmony_ci                                    "' file does not exist or the path is invalid"
21054aa6d63Sopenharmony_ci                                    + "', parameter name '-" + key + "'");
21154aa6d63Sopenharmony_ci                return false;
21254aa6d63Sopenharmony_ci            }
21354aa6d63Sopenharmony_ci            std::string charStr(realFilePath);
21454aa6d63Sopenharmony_ci            (*options)[key] = charStr;
21554aa6d63Sopenharmony_ci
21654aa6d63Sopenharmony_ci            if (!FileUtils::IsValidFile(inFilePath)) {
21754aa6d63Sopenharmony_ci                return false;
21854aa6d63Sopenharmony_ci            }
21954aa6d63Sopenharmony_ci        }
22054aa6d63Sopenharmony_ci    }
22154aa6d63Sopenharmony_ci
22254aa6d63Sopenharmony_ci    return true;
22354aa6d63Sopenharmony_ci}
22454aa6d63Sopenharmony_ci
22554aa6d63Sopenharmony_cistatic bool UpdateParamForCheckSignAlg(const ParamsSharedPtr& param)
22654aa6d63Sopenharmony_ci{
22754aa6d63Sopenharmony_ci    // check signAlg
22854aa6d63Sopenharmony_ci    Options* options = param->GetOptions();
22954aa6d63Sopenharmony_ci    if (options->count(Options::SIGN_ALG)) {
23054aa6d63Sopenharmony_ci        std::string signAlg = options->GetString(Options::SIGN_ALG);
23154aa6d63Sopenharmony_ci        if (signAlg != SIGN_ALG_SHA256 && signAlg != SIGN_ALG_SHA384) {
23254aa6d63Sopenharmony_ci            PrintErrorNumberMsg("NOT_SUPPORT_ERROR", NOT_SUPPORT_ERROR, "'" + signAlg + "' parameter is incorrect");
23354aa6d63Sopenharmony_ci            return false;
23454aa6d63Sopenharmony_ci        }
23554aa6d63Sopenharmony_ci    }
23654aa6d63Sopenharmony_ci    return true;
23754aa6d63Sopenharmony_ci}
23854aa6d63Sopenharmony_ci
23954aa6d63Sopenharmony_cistatic bool UpdateParamForInform(const ParamsSharedPtr& param)
24054aa6d63Sopenharmony_ci{
24154aa6d63Sopenharmony_ci    // check sign_app verify_app inform
24254aa6d63Sopenharmony_ci    Options* options = param->GetOptions();
24354aa6d63Sopenharmony_ci    if (param->GetMethod() == SIGN_APP ||
24454aa6d63Sopenharmony_ci        param->GetMethod() == VERIFY_APP) {
24554aa6d63Sopenharmony_ci        if (options->count(Options::INFORM)) {
24654aa6d63Sopenharmony_ci            std::string inForm = options->GetString(Options::INFORM);
24754aa6d63Sopenharmony_ci            if (!StringUtils::ContainsCase(ParamsRunTool::InformList, inForm)) {
24854aa6d63Sopenharmony_ci                PrintErrorNumberMsg("NOT_SUPPORT_ERROR", NOT_SUPPORT_ERROR, "parameter '"
24954aa6d63Sopenharmony_ci                                    + inForm + "' format error, Inform only support zip/elf/bin");
25054aa6d63Sopenharmony_ci                return false;
25154aa6d63Sopenharmony_ci            }
25254aa6d63Sopenharmony_ci        } else {
25354aa6d63Sopenharmony_ci            (*options)[Options::INFORM] = ZIP;
25454aa6d63Sopenharmony_ci        }
25554aa6d63Sopenharmony_ci    }
25654aa6d63Sopenharmony_ci    return true;
25754aa6d63Sopenharmony_ci}
25854aa6d63Sopenharmony_ci
25954aa6d63Sopenharmony_cistatic bool UpdateParamForOutform(const ParamsSharedPtr& param)
26054aa6d63Sopenharmony_ci{
26154aa6d63Sopenharmony_ci    // check generate_app_cert generate_profile_cert
26254aa6d63Sopenharmony_ci    Options* options = param->GetOptions();
26354aa6d63Sopenharmony_ci    if (param->GetMethod() == GENERATE_APP_CERT ||
26454aa6d63Sopenharmony_ci        param->GetMethod() == GENERATE_PROFILE_CERT) {
26554aa6d63Sopenharmony_ci        if (options->count(Options::OUT_FORM)) {
26654aa6d63Sopenharmony_ci            std::string outForm = options->GetString(Options::OUT_FORM);
26754aa6d63Sopenharmony_ci            if (outForm != OUT_FORM_CERT && outForm != OUT_FORM_CERT_CHAIN) {
26854aa6d63Sopenharmony_ci                PrintErrorNumberMsg("COMMAND_ERROR", COMMAND_ERROR, "parameter '" + outForm
26954aa6d63Sopenharmony_ci                                    + "' format error, Outform only supprot cert/cerChain");
27054aa6d63Sopenharmony_ci                return false;
27154aa6d63Sopenharmony_ci            }
27254aa6d63Sopenharmony_ci        } else {
27354aa6d63Sopenharmony_ci            (*options)[Options::OUT_FORM] = OUT_FORM_CERT_CHAIN;
27454aa6d63Sopenharmony_ci        }
27554aa6d63Sopenharmony_ci    }
27654aa6d63Sopenharmony_ci    return true;
27754aa6d63Sopenharmony_ci}
27854aa6d63Sopenharmony_ci
27954aa6d63Sopenharmony_ci//Check "remoteSign" additional parameters are required
28054aa6d63Sopenharmony_cistatic bool UpdateParamForCheckRemoteSignProfile(const ParamsSharedPtr& param)
28154aa6d63Sopenharmony_ci{
28254aa6d63Sopenharmony_ci    Options* options = param->GetOptions();
28354aa6d63Sopenharmony_ci    std::set<std::string> signProfileRemoteParams{ParamConstants::PARAM_REMOTE_SERVER,
28454aa6d63Sopenharmony_ci                                                ParamConstants::PARAM_REMOTE_USERNAME,
28554aa6d63Sopenharmony_ci                                                ParamConstants::PARAM_REMOTE_USERPWD,
28654aa6d63Sopenharmony_ci                                                ParamConstants::PARAM_REMOTE_ONLINEAUTHMODE,
28754aa6d63Sopenharmony_ci                                                ParamConstants::PARAM_REMOTE_SIGNERPLUGIN};
28854aa6d63Sopenharmony_ci
28954aa6d63Sopenharmony_ci    if (param->GetMethod() == SIGN_PROFILE && options->count(Options::MODE) &&
29054aa6d63Sopenharmony_ci        options->GetString(Options::MODE) == REMOTE_SIGN) {
29154aa6d63Sopenharmony_ci        for (const std::string& key : signProfileRemoteParams) {
29254aa6d63Sopenharmony_ci            if (options->count(key) == 0) {
29354aa6d63Sopenharmony_ci                PrintErrorNumberMsg("COMMAND_ERROR", COMMAND_ERROR, "sign profile RemoteSign absence param '"
29454aa6d63Sopenharmony_ci                                    + key + "'");
29554aa6d63Sopenharmony_ci                return false;
29654aa6d63Sopenharmony_ci            }
29754aa6d63Sopenharmony_ci        }
29854aa6d63Sopenharmony_ci    }
29954aa6d63Sopenharmony_ci    return true;
30054aa6d63Sopenharmony_ci}
30154aa6d63Sopenharmony_ci
30254aa6d63Sopenharmony_cistatic bool UpdateParam(const ParamsSharedPtr& param)
30354aa6d63Sopenharmony_ci{
30454aa6d63Sopenharmony_ci    if (!UpdateParamForVariantInt(param)) {
30554aa6d63Sopenharmony_ci        return false;
30654aa6d63Sopenharmony_ci    }
30754aa6d63Sopenharmony_ci    if (!UpdateParamForVariantBoolKeyUsage(param)) {
30854aa6d63Sopenharmony_ci        return false;
30954aa6d63Sopenharmony_ci    }
31054aa6d63Sopenharmony_ci    if (!UpdateParamForVariantBoolProfileSigned(param)) {
31154aa6d63Sopenharmony_ci        return false;
31254aa6d63Sopenharmony_ci    }
31354aa6d63Sopenharmony_ci    if (!UpdateParamForCheckSignAlg(param)) {
31454aa6d63Sopenharmony_ci        return false;
31554aa6d63Sopenharmony_ci    }
31654aa6d63Sopenharmony_ci    if (!UpdateParamForInform(param)) {
31754aa6d63Sopenharmony_ci        return false;
31854aa6d63Sopenharmony_ci    }
31954aa6d63Sopenharmony_ci    if (!UpdateParamForOutform(param)) {
32054aa6d63Sopenharmony_ci        return false;
32154aa6d63Sopenharmony_ci    }
32254aa6d63Sopenharmony_ci    if (!UpdateParamForCheckRemoteSignProfile(param)) {
32354aa6d63Sopenharmony_ci        return false;
32454aa6d63Sopenharmony_ci    }
32554aa6d63Sopenharmony_ci    return true;
32654aa6d63Sopenharmony_ci}
32754aa6d63Sopenharmony_ci
32854aa6d63Sopenharmony_ciint CmdUtil::GetCommandParameterKey(const char strChar, std::string& strChars, std::vector<std::string>& trustList,
32954aa6d63Sopenharmony_ci                                    std::string& keyStandBy)
33054aa6d63Sopenharmony_ci{
33154aa6d63Sopenharmony_ci    if (strChar == '-') {
33254aa6d63Sopenharmony_ci        bool isTrust = std::find(trustList.begin(), trustList.end(), strChars) != trustList.end();
33354aa6d63Sopenharmony_ci        if (!isTrust) {
33454aa6d63Sopenharmony_ci            PrintErrorNumberMsg("COMMAND_PARAM_ERROR", COMMAND_PARAM_ERROR, "There is no '"
33554aa6d63Sopenharmony_ci                                + strChars + "' command for the trust list");
33654aa6d63Sopenharmony_ci            return RET_FAILED;
33754aa6d63Sopenharmony_ci        }
33854aa6d63Sopenharmony_ci        keyStandBy = strChars.substr(1);
33954aa6d63Sopenharmony_ci    } else {
34054aa6d63Sopenharmony_ci        PrintErrorNumberMsg("COMMAND_PARAM_ERROR", COMMAND_PARAM_ERROR, "'" + strChars
34154aa6d63Sopenharmony_ci                            + "' Parameters error, Param key - value must in pairs");
34254aa6d63Sopenharmony_ci        return RET_FAILED;
34354aa6d63Sopenharmony_ci    }
34454aa6d63Sopenharmony_ci
34554aa6d63Sopenharmony_ci    return RET_OK;
34654aa6d63Sopenharmony_ci}
34754aa6d63Sopenharmony_ci
34854aa6d63Sopenharmony_cibool CmdUtil::Convert2Params(char** args, const size_t size, const ParamsSharedPtr& param)
34954aa6d63Sopenharmony_ci{
35054aa6d63Sopenharmony_ci    param->SetMethod(args[1]);
35154aa6d63Sopenharmony_ci    std::string keyStandBy = "";
35254aa6d63Sopenharmony_ci    bool readKey = true;
35354aa6d63Sopenharmony_ci    std::vector<std::string> trustList = ParamsTrustList::GetInstance().GetTrustList(args[1]);
35454aa6d63Sopenharmony_ci    if (trustList.empty()) {
35554aa6d63Sopenharmony_ci        return false;
35654aa6d63Sopenharmony_ci    }
35754aa6d63Sopenharmony_ci    std::string strChars;
35854aa6d63Sopenharmony_ci    for (size_t i = 2; i < size; i++) {
35954aa6d63Sopenharmony_ci        if (readKey) {
36054aa6d63Sopenharmony_ci            strChars = args[i];
36154aa6d63Sopenharmony_ci            if (GetCommandParameterKey(args[i][0], strChars, trustList, keyStandBy) == RET_OK) {
36254aa6d63Sopenharmony_ci                readKey = false;
36354aa6d63Sopenharmony_ci            } else {
36454aa6d63Sopenharmony_ci                return false;
36554aa6d63Sopenharmony_ci            }
36654aa6d63Sopenharmony_ci        } else {
36754aa6d63Sopenharmony_ci            bool success = ValidAndPutParam(param, keyStandBy, args[i]);
36854aa6d63Sopenharmony_ci            if (success) {
36954aa6d63Sopenharmony_ci                keyStandBy = "";
37054aa6d63Sopenharmony_ci                readKey = true;
37154aa6d63Sopenharmony_ci            } else {
37254aa6d63Sopenharmony_ci                return false;
37354aa6d63Sopenharmony_ci            }
37454aa6d63Sopenharmony_ci        }
37554aa6d63Sopenharmony_ci    }
37654aa6d63Sopenharmony_ci    if (!readKey) {
37754aa6d63Sopenharmony_ci        PrintErrorNumberMsg("INVALIDPARAM_ERROR", INVALIDPARAM_ERROR,
37854aa6d63Sopenharmony_ci                            "The last value of parameter cannot be omitted");
37954aa6d63Sopenharmony_ci        return false;
38054aa6d63Sopenharmony_ci    }
38154aa6d63Sopenharmony_ci    if (!UpdateParam(param)) {
38254aa6d63Sopenharmony_ci        return false;
38354aa6d63Sopenharmony_ci    }
38454aa6d63Sopenharmony_ci    return true;
38554aa6d63Sopenharmony_ci}
38654aa6d63Sopenharmony_ci
38754aa6d63Sopenharmony_cibool CmdUtil::ValidAndPutParam(const ParamsSharedPtr& params, const std::string& key, char* value)
38854aa6d63Sopenharmony_ci{
38954aa6d63Sopenharmony_ci    std::string  str = "Pwd";
39054aa6d63Sopenharmony_ci    bool result = true;
39154aa6d63Sopenharmony_ci    if (key.empty()) {
39254aa6d63Sopenharmony_ci        PrintErrorNumberMsg("COMMAND_PARAM_ERROR", COMMAND_PARAM_ERROR,
39354aa6d63Sopenharmony_ci                            "The command-line parameter key cannot be empty");
39454aa6d63Sopenharmony_ci        result = false;
39554aa6d63Sopenharmony_ci    } else if (strlen(value) == 0) {
39654aa6d63Sopenharmony_ci        PrintErrorNumberMsg("COMMAND_PARAM_ERROR", COMMAND_PARAM_ERROR,
39754aa6d63Sopenharmony_ci                            "The command-line parameter value cannot be empty");
39854aa6d63Sopenharmony_ci        result = false;
39954aa6d63Sopenharmony_ci    } else if (params->GetOptions()->count(key)) {
40054aa6d63Sopenharmony_ci        PrintErrorNumberMsg("COMMAND_ERROR", COMMAND_ERROR,
40154aa6d63Sopenharmony_ci                            "Duplicate command parameter are not allowed '" + key + "'");
40254aa6d63Sopenharmony_ci        result = false;
40354aa6d63Sopenharmony_ci    } else if (key.length() >= str.length() && key.substr(key.length() - INVALIDCHAR) == str) {
40454aa6d63Sopenharmony_ci        params->GetOptions()->emplace(key, value);
40554aa6d63Sopenharmony_ci    } else {
40654aa6d63Sopenharmony_ci        if (key == Options::KEY_ALIAS || key == Options::ISSUER_KEY_ALIAS) {
40754aa6d63Sopenharmony_ci            std::string keyAlias = value;
40854aa6d63Sopenharmony_ci            std::transform(keyAlias.begin(), keyAlias.end(), keyAlias.begin(),
40954aa6d63Sopenharmony_ci                           [](unsigned char c) { return std::tolower(c); });
41054aa6d63Sopenharmony_ci            params->GetOptions()->emplace(key, keyAlias);
41154aa6d63Sopenharmony_ci        } else {
41254aa6d63Sopenharmony_ci            params->GetOptions()->emplace(key, std::string(value));
41354aa6d63Sopenharmony_ci        }
41454aa6d63Sopenharmony_ci    }
41554aa6d63Sopenharmony_ci    return result;
41654aa6d63Sopenharmony_ci}
41754aa6d63Sopenharmony_ci
41854aa6d63Sopenharmony_cibool CmdUtil::JudgeAlgType(const std::string& keyAlg)
41954aa6d63Sopenharmony_ci{
42054aa6d63Sopenharmony_ci    if (keyAlg != "ECC") {
42154aa6d63Sopenharmony_ci        PrintErrorNumberMsg("COMMAND_ERROR", COMMAND_ERROR, "not supported '" + keyAlg + "' Key algorithms");
42254aa6d63Sopenharmony_ci        return false;
42354aa6d63Sopenharmony_ci    }
42454aa6d63Sopenharmony_ci    return true;
42554aa6d63Sopenharmony_ci}
42654aa6d63Sopenharmony_ci
42754aa6d63Sopenharmony_cibool CmdUtil::JudgeSize(const int size)
42854aa6d63Sopenharmony_ci{
42954aa6d63Sopenharmony_ci    if (size != NIST_P_256 && size != NIST_P_384) {
43054aa6d63Sopenharmony_ci        PrintErrorNumberMsg("COMMAND_ERROR", COMMAND_ERROR, "Keysize params is incorrect, Support only 256 or 384");
43154aa6d63Sopenharmony_ci        return false;
43254aa6d63Sopenharmony_ci    }
43354aa6d63Sopenharmony_ci    return true;
43454aa6d63Sopenharmony_ci}
43554aa6d63Sopenharmony_ci
43654aa6d63Sopenharmony_cibool CmdUtil::JudgeSignAlgType(const std::string& signAlg)
43754aa6d63Sopenharmony_ci{
43854aa6d63Sopenharmony_ci    if (signAlg != SIGN_ALG_SHA256 && signAlg != SIGN_ALG_SHA384) {
43954aa6d63Sopenharmony_ci        PrintErrorNumberMsg("COMMAND_ERROR", COMMAND_ERROR, "not supported '" + signAlg + "' signature algorithm");
44054aa6d63Sopenharmony_ci        return  false;
44154aa6d63Sopenharmony_ci    }
44254aa6d63Sopenharmony_ci    return true;
44354aa6d63Sopenharmony_ci}
44454aa6d63Sopenharmony_ci
44554aa6d63Sopenharmony_ci/**
44654aa6d63Sopenharmony_ci * @tc.name: Test parameter function
44754aa6d63Sopenharmony_ci * @tc.desc: Pass more than one parameter,but it needs to be in the parameter list.
44854aa6d63Sopenharmony_ci * @tc.type: FUNC
44954aa6d63Sopenharmony_ci */
45054aa6d63Sopenharmony_cibool CmdUtil::VerifyTypes(const std::string& inputType)
45154aa6d63Sopenharmony_ci{
45254aa6d63Sopenharmony_ci    if (inputType.size() == 0) {
45354aa6d63Sopenharmony_ci        return false;
45454aa6d63Sopenharmony_ci    }
45554aa6d63Sopenharmony_ci    std::vector<std::string> vecs = StringUtils::SplitString(inputType.c_str(), ',');
45654aa6d63Sopenharmony_ci    std::set<std::string> sets;
45754aa6d63Sopenharmony_ci    sets.insert("digitalSignature");
45854aa6d63Sopenharmony_ci    sets.insert("nonRepudiation");
45954aa6d63Sopenharmony_ci    sets.insert("keyEncipherment");
46054aa6d63Sopenharmony_ci    sets.insert("dataEncipherment");
46154aa6d63Sopenharmony_ci    sets.insert("keyAgreement");
46254aa6d63Sopenharmony_ci    sets.insert("certificateSignature");
46354aa6d63Sopenharmony_ci    sets.insert("crlSignature");
46454aa6d63Sopenharmony_ci    sets.insert("encipherOnly");
46554aa6d63Sopenharmony_ci    sets.insert("decipherOnly");
46654aa6d63Sopenharmony_ci    for (const auto& val : vecs) {
46754aa6d63Sopenharmony_ci        if (sets.count(val) == 0) {
46854aa6d63Sopenharmony_ci            PrintErrorNumberMsg("COMMAND_ERROR", COMMAND_ERROR,
46954aa6d63Sopenharmony_ci                                "Not support command param '" + val + "'");
47054aa6d63Sopenharmony_ci            return false;
47154aa6d63Sopenharmony_ci        }
47254aa6d63Sopenharmony_ci    }
47354aa6d63Sopenharmony_ci    return true;
47454aa6d63Sopenharmony_ci}
47554aa6d63Sopenharmony_ci
47654aa6d63Sopenharmony_ci/**
47754aa6d63Sopenharmony_ci * @tc.name: Test parameter function
47854aa6d63Sopenharmony_ci * @tc.desc: Pass one parameter,but it needs to be in the parameter list.
47954aa6d63Sopenharmony_ci * @tc.type: FUNC
48054aa6d63Sopenharmony_ci */
48154aa6d63Sopenharmony_cibool CmdUtil::VerifyType(const std::string& inputType)
48254aa6d63Sopenharmony_ci{
48354aa6d63Sopenharmony_ci    std::set<std::string> sets;
48454aa6d63Sopenharmony_ci    sets.insert("clientAuthentication");
48554aa6d63Sopenharmony_ci    sets.insert("serverAuthentication");
48654aa6d63Sopenharmony_ci    sets.insert("codeSignature");
48754aa6d63Sopenharmony_ci    sets.insert("emailProtection");
48854aa6d63Sopenharmony_ci    sets.insert("smartCardLogin");
48954aa6d63Sopenharmony_ci    sets.insert("timestamp");
49054aa6d63Sopenharmony_ci    sets.insert("ocspSignature");
49154aa6d63Sopenharmony_ci    if (sets.count(inputType) == 0) {
49254aa6d63Sopenharmony_ci        PrintErrorNumberMsg("COMMAND_PARAM_ERROR", COMMAND_PARAM_ERROR,
49354aa6d63Sopenharmony_ci                            "Not support command param '" + inputType + "'");
49454aa6d63Sopenharmony_ci        return false;
49554aa6d63Sopenharmony_ci    }
49654aa6d63Sopenharmony_ci    return true;
49754aa6d63Sopenharmony_ci}
49854aa6d63Sopenharmony_ci
49954aa6d63Sopenharmony_cibool CmdUtil::VerifyType(const std::string& inputType, const std::string& supportTypes)
50054aa6d63Sopenharmony_ci{
50154aa6d63Sopenharmony_ci    std::string firstStr = supportTypes.substr(0, supportTypes.find_last_of(","));
50254aa6d63Sopenharmony_ci    std::string secondStr = supportTypes.substr(supportTypes.find_first_of(",") + 1,
50354aa6d63Sopenharmony_ci                                                supportTypes.size() - supportTypes.find_first_of(","));
50454aa6d63Sopenharmony_ci    if (inputType == firstStr || inputType == secondStr) {
50554aa6d63Sopenharmony_ci        return true;
50654aa6d63Sopenharmony_ci    }
50754aa6d63Sopenharmony_ci    PrintErrorNumberMsg("COMMAND_PARAM_ERROR", COMMAND_PARAM_ERROR, "Not support command param '" + inputType + "'");
50854aa6d63Sopenharmony_ci
50954aa6d63Sopenharmony_ci    return false;
51054aa6d63Sopenharmony_ci}
51154aa6d63Sopenharmony_ci} // namespace SignatureTools
51254aa6d63Sopenharmony_ci} // namespace OHOS