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