/* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef SECURITY_LABEL_H #define SECURITY_LABEL_H #include #include #include #include #include #include namespace OHOS { namespace FileManagement { namespace ModuleSecurityLabel { const char XATTR_KEY[] = {"user.security"}; const std::string DEFAULT_DATA_LEVEL = "s3"; const int DEFAULT_DATA_LENGTH = 2; const std::set DATA_LEVEL = {"s0", "s1", "s2", "s3", "s4"}; class SecurityLabel { public: static bool SetSecurityLabel(const std::string &path, const std::string &dataLevel) { if (DATA_LEVEL.count(dataLevel) != 1) { errno = EINVAL; return false; } #ifdef IOS_PLATFORM auto xattrValueSize = getxattr(path.c_str(), XATTR_KEY, nullptr, 0, 0, 0); #else auto xattrValueSize = getxattr(path.c_str(), XATTR_KEY, nullptr, 0); #endif if (xattrValueSize == static_cast(DEFAULT_DATA_LENGTH)) { char xattrValue[DEFAULT_DATA_LENGTH + 1]; #ifdef IOS_PLATFORM xattrValueSize = getxattr(path.c_str(), XATTR_KEY, xattrValue, xattrValueSize, 0, 0); #else xattrValueSize = getxattr(path.c_str(), XATTR_KEY, xattrValue, xattrValueSize); #endif xattrValue[DEFAULT_DATA_LENGTH] = '\0'; if (std::string(xattrValue) > dataLevel) { errno = EINVAL; return false; } } #ifdef IOS_PLATFORM if (setxattr(path.c_str(), XATTR_KEY, dataLevel.c_str(), dataLevel.size(), 0, 0) < 0) { #else if (setxattr(path.c_str(), XATTR_KEY, dataLevel.c_str(), dataLevel.size(), 0) < 0) { #endif return false; } return true; } static std::string GetSecurityLabel(const std::string &path) { #ifdef IOS_PLATFORM auto xattrValueSize = getxattr(path.c_str(), XATTR_KEY, nullptr, 0, 0, 0); #else auto xattrValueSize = getxattr(path.c_str(), XATTR_KEY, nullptr, 0); #endif if (xattrValueSize == -1 || xattrValueSize == 0) { return DEFAULT_DATA_LEVEL; } std::unique_ptr xattrValue = std::make_unique((long)xattrValueSize + 1); if (xattrValue == nullptr) { return DEFAULT_DATA_LEVEL; } #ifdef IOS_PLATFORM xattrValueSize = getxattr(path.c_str(), XATTR_KEY, xattrValue.get(), xattrValueSize, 0, 0); #else xattrValueSize = getxattr(path.c_str(), XATTR_KEY, xattrValue.get(), xattrValueSize); #endif if (xattrValueSize == -1 || xattrValueSize == 0) { return DEFAULT_DATA_LEVEL; } return std::string(xattrValue.get()); } }; } // namespace ModuleSecurityLabel } // namespace FileManagement } // namespace OHOS #endif