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 "string_utils.h" 1654aa6d63Sopenharmony_ci#include <cstring> 1754aa6d63Sopenharmony_ci#include <algorithm> 1854aa6d63Sopenharmony_ci 1954aa6d63Sopenharmony_ci#include "securec.h" 2054aa6d63Sopenharmony_ci 2154aa6d63Sopenharmony_cinamespace OHOS { 2254aa6d63Sopenharmony_cinamespace SignatureTools { 2354aa6d63Sopenharmony_ci 2454aa6d63Sopenharmony_cibool StringUtils::IsEmpty(const std::string& cs) 2554aa6d63Sopenharmony_ci{ 2654aa6d63Sopenharmony_ci return cs.empty(); 2754aa6d63Sopenharmony_ci} 2854aa6d63Sopenharmony_ci 2954aa6d63Sopenharmony_cibool StringUtils::ContainsCase(const std::vector<std::string> &strs, const std::string& str) 3054aa6d63Sopenharmony_ci{ 3154aa6d63Sopenharmony_ci std::string fileSuffix = str; 3254aa6d63Sopenharmony_ci std::transform(fileSuffix.begin(), fileSuffix.end(), fileSuffix.begin(), 3354aa6d63Sopenharmony_ci [](unsigned char c) { return std::tolower(c); }); 3454aa6d63Sopenharmony_ci 3554aa6d63Sopenharmony_ci for (const std::string& val : strs) { 3654aa6d63Sopenharmony_ci if (val == fileSuffix) 3754aa6d63Sopenharmony_ci return true; 3854aa6d63Sopenharmony_ci } 3954aa6d63Sopenharmony_ci return false; 4054aa6d63Sopenharmony_ci} 4154aa6d63Sopenharmony_ci 4254aa6d63Sopenharmony_cibool StringUtils::CaseCompare(const std::string& str1, const std::string& str2) 4354aa6d63Sopenharmony_ci{ 4454aa6d63Sopenharmony_ci return str1 == str2; 4554aa6d63Sopenharmony_ci} 4654aa6d63Sopenharmony_cistd::vector<std::string> StringUtils::SplitString(const std::string& str, char delimiter) 4754aa6d63Sopenharmony_ci{ 4854aa6d63Sopenharmony_ci std::vector<std::string> tokens; 4954aa6d63Sopenharmony_ci std::istringstream tokenStream(str); 5054aa6d63Sopenharmony_ci std::string token; 5154aa6d63Sopenharmony_ci while (std::getline(tokenStream, token, delimiter)) { 5254aa6d63Sopenharmony_ci tokens.push_back(token); 5354aa6d63Sopenharmony_ci } 5454aa6d63Sopenharmony_ci return tokens; 5554aa6d63Sopenharmony_ci} 5654aa6d63Sopenharmony_cistd::string StringUtils::Trim(const std::string& str) 5754aa6d63Sopenharmony_ci{ 5854aa6d63Sopenharmony_ci size_t startpos = str.find_first_not_of(" \n\r\f\v"); 5954aa6d63Sopenharmony_ci if (std::string::npos == startpos) { 6054aa6d63Sopenharmony_ci return ""; 6154aa6d63Sopenharmony_ci } 6254aa6d63Sopenharmony_ci size_t endpos = str.find_last_not_of(" \n\r\f\v"); 6354aa6d63Sopenharmony_ci return str.substr(startpos, endpos - startpos + 1); 6454aa6d63Sopenharmony_ci} 6554aa6d63Sopenharmony_cistd::string StringUtils::FormatLoading(std::string& dealStr) 6654aa6d63Sopenharmony_ci{ 6754aa6d63Sopenharmony_ci char comma = ','; 6854aa6d63Sopenharmony_ci char slash = '/'; 6954aa6d63Sopenharmony_ci std::string del = dealStr.substr(dealStr.find_first_of("/") + 1, dealStr.size()); 7054aa6d63Sopenharmony_ci int position = 0; 7154aa6d63Sopenharmony_ci while ((position = del.find(slash, position)) != std::string::npos) { 7254aa6d63Sopenharmony_ci del.insert(position + 1, " "); 7354aa6d63Sopenharmony_ci position++; 7454aa6d63Sopenharmony_ci } 7554aa6d63Sopenharmony_ci for (auto& ch : del) { 7654aa6d63Sopenharmony_ci if (ch == slash) { 7754aa6d63Sopenharmony_ci ch = comma; 7854aa6d63Sopenharmony_ci } 7954aa6d63Sopenharmony_ci } 8054aa6d63Sopenharmony_ci return del.append("\n"); 8154aa6d63Sopenharmony_ci} 8254aa6d63Sopenharmony_cistd::string StringUtils::Pkcs7ToString(PKCS7* p7) 8354aa6d63Sopenharmony_ci{ 8454aa6d63Sopenharmony_ci unsigned char* out = NULL; 8554aa6d63Sopenharmony_ci int outSize = i2d_PKCS7(p7, &out); 8654aa6d63Sopenharmony_ci if (out == NULL || outSize <= 0) { 8754aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("pkcs7 to string failed"); 8854aa6d63Sopenharmony_ci return ""; 8954aa6d63Sopenharmony_ci } 9054aa6d63Sopenharmony_ci std::string ret; 9154aa6d63Sopenharmony_ci ret.clear(); 9254aa6d63Sopenharmony_ci ret.resize(outSize); 9354aa6d63Sopenharmony_ci std::copy(out, out + outSize, &ret[0]); 9454aa6d63Sopenharmony_ci OPENSSL_free(out); 9554aa6d63Sopenharmony_ci return ret; 9654aa6d63Sopenharmony_ci} 9754aa6d63Sopenharmony_cistd::string StringUtils::x509CertToString(X509* cert) 9854aa6d63Sopenharmony_ci{ 9954aa6d63Sopenharmony_ci VerifyHapOpensslUtils::GetOpensslErrorMessage(); 10054aa6d63Sopenharmony_ci BIO* bio = BIO_new(BIO_s_mem()); 10154aa6d63Sopenharmony_ci PEM_write_bio_X509(bio, cert); 10254aa6d63Sopenharmony_ci char* buffer; 10354aa6d63Sopenharmony_ci long length = BIO_get_mem_data(bio, &buffer); 10454aa6d63Sopenharmony_ci std::string certStr(buffer, length); 10554aa6d63Sopenharmony_ci BIO_free(bio); 10654aa6d63Sopenharmony_ci return certStr; 10754aa6d63Sopenharmony_ci} 10854aa6d63Sopenharmony_cistd::string StringUtils::SubjectToString(X509* cert) 10954aa6d63Sopenharmony_ci{ 11054aa6d63Sopenharmony_ci VerifyHapOpensslUtils::GetOpensslErrorMessage(); 11154aa6d63Sopenharmony_ci X509_NAME* subjectName = X509_get_subject_name(cert); 11254aa6d63Sopenharmony_ci if (!subjectName) { 11354aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Error getting subject name"); 11454aa6d63Sopenharmony_ci return ""; 11554aa6d63Sopenharmony_ci } 11654aa6d63Sopenharmony_ci VerifyHapOpensslUtils::GetOpensslErrorMessage(); 11754aa6d63Sopenharmony_ci char* subjectStr = X509_NAME_oneline(subjectName, NULL, 0); 11854aa6d63Sopenharmony_ci if (!subjectStr) { 11954aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Error create subject string"); 12054aa6d63Sopenharmony_ci return ""; 12154aa6d63Sopenharmony_ci } 12254aa6d63Sopenharmony_ci std::string subjectString(subjectStr); 12354aa6d63Sopenharmony_ci std::string result = FormatLoading(subjectString); 12454aa6d63Sopenharmony_ci OPENSSL_free(subjectStr); 12554aa6d63Sopenharmony_ci return result; 12654aa6d63Sopenharmony_ci} 12754aa6d63Sopenharmony_cibool StringUtils::CheckStringToint(const std::string& in, int& out) 12854aa6d63Sopenharmony_ci{ 12954aa6d63Sopenharmony_ci std::istringstream iss(in); 13054aa6d63Sopenharmony_ci if ((iss >> out) && iss.eof()) { 13154aa6d63Sopenharmony_ci return true; 13254aa6d63Sopenharmony_ci } 13354aa6d63Sopenharmony_ci SIGNATURE_TOOLS_LOGE("Cannot convert string:%s to integer", in.c_str()); 13454aa6d63Sopenharmony_ci return false; 13554aa6d63Sopenharmony_ci} 13654aa6d63Sopenharmony_ci} // namespace SignatureTools 13754aa6d63Sopenharmony_ci} // namespace OHOS 138