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