114cf0368Sopenharmony_ci/*
214cf0368Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
314cf0368Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
414cf0368Sopenharmony_ci * you may not use this file except in compliance with the License.
514cf0368Sopenharmony_ci * You may obtain a copy of the License at
614cf0368Sopenharmony_ci *
714cf0368Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
814cf0368Sopenharmony_ci *
914cf0368Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1014cf0368Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1114cf0368Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1214cf0368Sopenharmony_ci * See the License for the specific language governing permissions and
1314cf0368Sopenharmony_ci * limitations under the License.
1414cf0368Sopenharmony_ci */
1514cf0368Sopenharmony_ci#include "udmf_utils.h"
1614cf0368Sopenharmony_ci#include <random>
1714cf0368Sopenharmony_ci#include <sstream>
1814cf0368Sopenharmony_ci#include "accesstoken_kit.h"
1914cf0368Sopenharmony_ci#include "ipc_skeleton.h"
2014cf0368Sopenharmony_ci
2114cf0368Sopenharmony_cinamespace OHOS {
2214cf0368Sopenharmony_cinamespace UDMF {
2314cf0368Sopenharmony_cinamespace UTILS {
2414cf0368Sopenharmony_cistatic constexpr int ID_LEN = 32;
2514cf0368Sopenharmony_cistatic constexpr int MINIMUM = 48;
2614cf0368Sopenharmony_cistatic constexpr int MAXIMUM = 121;
2714cf0368Sopenharmony_ciconstexpr char SPECIAL = '^';
2814cf0368Sopenharmony_ci
2914cf0368Sopenharmony_cistd::vector<std::string> StrSplit(const std::string &str, const std::string &delimiter)
3014cf0368Sopenharmony_ci{
3114cf0368Sopenharmony_ci    std::vector<std::string> result;
3214cf0368Sopenharmony_ci    size_t start = 0;
3314cf0368Sopenharmony_ci    size_t end = str.find(delimiter);
3414cf0368Sopenharmony_ci    while (end != std::string::npos) {
3514cf0368Sopenharmony_ci        result.push_back(str.substr(start, end - start));
3614cf0368Sopenharmony_ci        start = end + delimiter.length();
3714cf0368Sopenharmony_ci        end = str.find(delimiter, start);
3814cf0368Sopenharmony_ci    }
3914cf0368Sopenharmony_ci    result.push_back(str.substr(start));
4014cf0368Sopenharmony_ci    return result;
4114cf0368Sopenharmony_ci}
4214cf0368Sopenharmony_ci
4314cf0368Sopenharmony_cistd::vector<uint8_t> Random(int32_t len, int32_t minimum, int32_t maximum)
4414cf0368Sopenharmony_ci{
4514cf0368Sopenharmony_ci    std::random_device randomDevice;
4614cf0368Sopenharmony_ci    std::uniform_int_distribution<int> distribution(minimum, maximum);
4714cf0368Sopenharmony_ci    std::vector<uint8_t> key(len);
4814cf0368Sopenharmony_ci    for (int32_t i = 0; i < len; i++) {
4914cf0368Sopenharmony_ci        key[i] = static_cast<uint8_t>(distribution(randomDevice));
5014cf0368Sopenharmony_ci    }
5114cf0368Sopenharmony_ci    return key;
5214cf0368Sopenharmony_ci}
5314cf0368Sopenharmony_ci
5414cf0368Sopenharmony_cistd::string GenerateId()
5514cf0368Sopenharmony_ci{
5614cf0368Sopenharmony_ci    std::vector<uint8_t> randomDevices = Random(ID_LEN, MINIMUM, MAXIMUM);
5714cf0368Sopenharmony_ci    std::stringstream idStr;
5814cf0368Sopenharmony_ci    for (auto &randomDevice : randomDevices) {
5914cf0368Sopenharmony_ci        auto asc = randomDevice;
6014cf0368Sopenharmony_ci        asc = asc >= SPECIAL ? asc + 1 : asc;
6114cf0368Sopenharmony_ci        idStr << static_cast<uint8_t>(asc);
6214cf0368Sopenharmony_ci    }
6314cf0368Sopenharmony_ci    return idStr.str();
6414cf0368Sopenharmony_ci}
6514cf0368Sopenharmony_ci
6614cf0368Sopenharmony_cistd::string GetSdkVersionByToken(uint32_t tokenId)
6714cf0368Sopenharmony_ci{
6814cf0368Sopenharmony_ci    if (Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId) !=
6914cf0368Sopenharmony_ci        Security::AccessToken::ATokenTypeEnum::TOKEN_HAP) {
7014cf0368Sopenharmony_ci        return "";
7114cf0368Sopenharmony_ci    }
7214cf0368Sopenharmony_ci    Security::AccessToken::HapTokenInfo hapTokenInfo;
7314cf0368Sopenharmony_ci    auto ret = Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenId, hapTokenInfo);
7414cf0368Sopenharmony_ci    if (ret != 0) {
7514cf0368Sopenharmony_ci        return "";
7614cf0368Sopenharmony_ci    }
7714cf0368Sopenharmony_ci    return std::to_string(hapTokenInfo.apiVersion);
7814cf0368Sopenharmony_ci}
7914cf0368Sopenharmony_ci
8014cf0368Sopenharmony_cistd::string GetCurrentSdkVersion()
8114cf0368Sopenharmony_ci{
8214cf0368Sopenharmony_ci    return GetSdkVersionByToken(IPCSkeleton::GetSelfTokenID());
8314cf0368Sopenharmony_ci}
8414cf0368Sopenharmony_ci} // namespace UTILS
8514cf0368Sopenharmony_ci} // namespace UDMF
8614cf0368Sopenharmony_ci} // namespace OHOS