153c3577eSopenharmony_ci/*
253c3577eSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
353c3577eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
453c3577eSopenharmony_ci * you may not use this file except in compliance with the License.
553c3577eSopenharmony_ci * You may obtain a copy of the License at
653c3577eSopenharmony_ci *
753c3577eSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
853c3577eSopenharmony_ci *
953c3577eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1053c3577eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1153c3577eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1253c3577eSopenharmony_ci * See the License for the specific language governing permissions and
1353c3577eSopenharmony_ci * limitations under the License.
1453c3577eSopenharmony_ci */
1553c3577eSopenharmony_ci
1653c3577eSopenharmony_ci#include "sensitive.h"
1753c3577eSopenharmony_ci#include <utility>
1853c3577eSopenharmony_ci#include <vector>
1953c3577eSopenharmony_ci#include "log_print.h"
2053c3577eSopenharmony_ci#include "utils/anonymous.h"
2153c3577eSopenharmony_ci#undef LOG_TAG
2253c3577eSopenharmony_ci#define LOG_TAG "Sensitive"
2353c3577eSopenharmony_ci
2453c3577eSopenharmony_cinamespace OHOS {
2553c3577eSopenharmony_cinamespace DistributedKv {
2653c3577eSopenharmony_ciusing Anonymous = DistributedData::Anonymous;
2753c3577eSopenharmony_ciSensitive::Sensitive(std::string deviceId)
2853c3577eSopenharmony_ci    : deviceId(std::move(deviceId)), securityLevel(DATA_SEC_LEVEL1)
2953c3577eSopenharmony_ci{
3053c3577eSopenharmony_ci}
3153c3577eSopenharmony_ci
3253c3577eSopenharmony_ciSensitive::Sensitive()
3353c3577eSopenharmony_ci    : deviceId(""), securityLevel(DATA_SEC_LEVEL1)
3453c3577eSopenharmony_ci{
3553c3577eSopenharmony_ci}
3653c3577eSopenharmony_ci
3753c3577eSopenharmony_ciuint32_t Sensitive::GetDeviceSecurityLevel()
3853c3577eSopenharmony_ci{
3953c3577eSopenharmony_ci    if (securityLevel > DATA_SEC_LEVEL1) {
4053c3577eSopenharmony_ci        ZLOGI("the device security level had gotten");
4153c3577eSopenharmony_ci        return securityLevel;
4253c3577eSopenharmony_ci    }
4353c3577eSopenharmony_ci    return GetSensitiveLevel(deviceId);
4453c3577eSopenharmony_ci}
4553c3577eSopenharmony_ci
4653c3577eSopenharmony_cibool Sensitive::InitDEVSLQueryParams(DEVSLQueryParams *params, const std::string &udid)
4753c3577eSopenharmony_ci{
4853c3577eSopenharmony_ci    ZLOGI("udid is [%{public}s]", Anonymous::Change(udid).c_str());
4953c3577eSopenharmony_ci    if (params == nullptr || udid.empty()) {
5053c3577eSopenharmony_ci        return false;
5153c3577eSopenharmony_ci    }
5253c3577eSopenharmony_ci    std::vector<uint8_t> vec(udid.begin(), udid.end());
5353c3577eSopenharmony_ci    for (size_t i = 0; i < MAX_UDID_LENGTH && i < vec.size(); i++) {
5453c3577eSopenharmony_ci        params->udid[i] = vec[i];
5553c3577eSopenharmony_ci    }
5653c3577eSopenharmony_ci    params->udidLen = uint32_t(udid.size());
5753c3577eSopenharmony_ci    return true;
5853c3577eSopenharmony_ci}
5953c3577eSopenharmony_ci
6053c3577eSopenharmony_ciSensitive::operator bool() const
6153c3577eSopenharmony_ci{
6253c3577eSopenharmony_ci    return (!deviceId.empty()) && (securityLevel > DATA_SEC_LEVEL1);
6353c3577eSopenharmony_ci}
6453c3577eSopenharmony_ci
6553c3577eSopenharmony_cibool Sensitive::operator >= (const DistributedDB::SecurityOption &option)
6653c3577eSopenharmony_ci{
6753c3577eSopenharmony_ci    if (option.securityLabel == DistributedDB::NOT_SET) {
6853c3577eSopenharmony_ci        return true;
6953c3577eSopenharmony_ci    }
7053c3577eSopenharmony_ci
7153c3577eSopenharmony_ci    uint32_t level = securityLevel;
7253c3577eSopenharmony_ci    if (level <= DATA_SEC_LEVEL1 && static_cast<uint32_t>(option.securityLabel - 1) > level) {
7353c3577eSopenharmony_ci        ZLOGI("the device security level hadn't gotten");
7453c3577eSopenharmony_ci        level = GetSensitiveLevel(deviceId);
7553c3577eSopenharmony_ci    }
7653c3577eSopenharmony_ci    return (level >= static_cast<uint32_t>(option.securityLabel - 1));
7753c3577eSopenharmony_ci}
7853c3577eSopenharmony_ci
7953c3577eSopenharmony_ciSensitive::Sensitive(const Sensitive &sensitive)
8053c3577eSopenharmony_ci{
8153c3577eSopenharmony_ci    this->operator=(sensitive);
8253c3577eSopenharmony_ci}
8353c3577eSopenharmony_ci
8453c3577eSopenharmony_ciSensitive &Sensitive::operator=(const Sensitive &sensitive)
8553c3577eSopenharmony_ci{
8653c3577eSopenharmony_ci    if (this == &sensitive) {
8753c3577eSopenharmony_ci        return *this;
8853c3577eSopenharmony_ci    }
8953c3577eSopenharmony_ci    deviceId = sensitive.deviceId;
9053c3577eSopenharmony_ci    securityLevel = sensitive.securityLevel;
9153c3577eSopenharmony_ci    return *this;
9253c3577eSopenharmony_ci}
9353c3577eSopenharmony_ci
9453c3577eSopenharmony_ciSensitive::Sensitive(Sensitive &&sensitive) noexcept
9553c3577eSopenharmony_ci{
9653c3577eSopenharmony_ci    this->operator=(std::move(sensitive));
9753c3577eSopenharmony_ci}
9853c3577eSopenharmony_ci
9953c3577eSopenharmony_ciSensitive &Sensitive::operator=(Sensitive &&sensitive) noexcept
10053c3577eSopenharmony_ci{
10153c3577eSopenharmony_ci    if (this == &sensitive) {
10253c3577eSopenharmony_ci        return *this;
10353c3577eSopenharmony_ci    }
10453c3577eSopenharmony_ci    deviceId = std::move(sensitive.deviceId);
10553c3577eSopenharmony_ci    securityLevel = sensitive.securityLevel;
10653c3577eSopenharmony_ci    return *this;
10753c3577eSopenharmony_ci}
10853c3577eSopenharmony_ci
10953c3577eSopenharmony_ciuint32_t Sensitive::GetSensitiveLevel(const std::string &udid)
11053c3577eSopenharmony_ci{
11153c3577eSopenharmony_ci    DEVSLQueryParams query;
11253c3577eSopenharmony_ci    if (!InitDEVSLQueryParams(&query, udid)) {
11353c3577eSopenharmony_ci        ZLOGE("init query params failed! udid:[%{public}s]", Anonymous::Change(udid).c_str());
11453c3577eSopenharmony_ci        return DATA_SEC_LEVEL1;
11553c3577eSopenharmony_ci    }
11653c3577eSopenharmony_ci
11753c3577eSopenharmony_ci    uint32_t level = DATA_SEC_LEVEL1;
11853c3577eSopenharmony_ci    int32_t result = DATASL_GetHighestSecLevel(&query, &level);
11953c3577eSopenharmony_ci    if (result != DEVSL_SUCCESS) {
12053c3577eSopenharmony_ci        ZLOGE("get highest level failed(%{public}s)! level: %{public}d, error: %d",
12153c3577eSopenharmony_ci            Anonymous::Change(udid).c_str(), securityLevel, result);
12253c3577eSopenharmony_ci        return DATA_SEC_LEVEL1;
12353c3577eSopenharmony_ci    }
12453c3577eSopenharmony_ci    securityLevel = level;
12553c3577eSopenharmony_ci    ZLOGI("get highest level success(%{public}s)! level: %{public}d, error: %d",
12653c3577eSopenharmony_ci        Anonymous::Change(udid).c_str(), securityLevel, result);
12753c3577eSopenharmony_ci    return securityLevel;
12853c3577eSopenharmony_ci}
12953c3577eSopenharmony_ci} // namespace DistributedKv
13053c3577eSopenharmony_ci} // namespace OHOS
131