blob: f2ea9f3f9d3074d4fd5a6df94fe196332c57aeb4 [file] [log] [blame]
Sumanth Bhate4e633e2019-05-14 12:13:57 +00001/*
2// Copyright (c) 2018 Intel Corporation
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16#pragma once
17#include "channel_layer.hpp"
18
jayaprakash Mutyalab741b992019-12-02 17:29:09 +000019#include <ipmid/api-types.hpp>
Sumanth Bhate4e633e2019-05-14 12:13:57 +000020#include <ipmid/message/types.hpp>
21#include <map>
22#include <nlohmann/json.hpp>
23
24namespace ipmi
25{
26static const std::string csPrivDefaultFileName =
27 "/usr/share/ipmi-providers/cs_privilege_levels.json";
28
29static const std::string csPrivFileName =
30 "/var/lib/ipmi/cs_privilege_levels.json";
31
32static const size_t maxCSRecords = 16;
33
34using ChannelNumCipherIDPair = std::pair<uint8_t, uint8_t>;
35using privMap = std::map<ChannelNumCipherIDPair, uint4_t>;
36
37/** @class CipherConfig
38 * @brief Class to provide cipher suite functionalities
39 */
40class CipherConfig
41{
42 public:
43 ~CipherConfig() = default;
44 explicit CipherConfig(const std::string& csFileName,
45 const std::string& csDefaultFileName);
46 CipherConfig() = delete;
47
jayaprakash Mutyalab741b992019-12-02 17:29:09 +000048 /** @brief function to get cipher suite privileges from config file
49 *
50 * @param[in] chNum - channel number for which we want to get cipher suite
51 * privilege levels
52 *
53 * @param[in] csPrivilegeLevels - gets filled by cipher suite privilege
54 * levels
55 *
56 * @return 0 for success, non zero value for failure
57 */
58 ipmi::Cc getCSPrivilegeLevels(
59 uint8_t chNum, std::array<uint4_t, maxCSRecords>& csPrivilegeLevels);
60
61 /** @brief function to set/update cipher suite privileges in config file
62 *
63 * @param[in] chNum - channel number for which we want to update cipher
64 * suite privilege levels
65 *
66 * @param[in] csPrivilegeLevels - cipher suite privilege levels to update
67 * in config file
68 *
69 * @return 0 for success, non zero value for failure
70 */
71 ipmi::Cc setCSPrivilegeLevels(
72 uint8_t chNum,
73 const std::array<uint4_t, maxCSRecords>& csPrivilegeLevels);
74
Sumanth Bhate4e633e2019-05-14 12:13:57 +000075 private:
76 std::string cipherSuitePrivFileName, cipherSuiteDefaultPrivFileName;
77
78 privMap csPrivilegeMap;
79
80 /** @brief function to read json config file
81 *
82 * @return nlohmann::json object
83 */
84 nlohmann::json readCSPrivilegeLevels(const std::string& csFileName);
85
86 /** @brief function to write json config file
87 *
88 * @param[in] jsonData - json object
89 *
90 * @return 0 for success, -errno for failure.
91 */
92 int writeCSPrivilegeLevels(const nlohmann::json& jsonData);
93
94 /** @brief convert to cipher suite privilege from string to value
95 *
96 * @param[in] value - privilege value
97 *
98 * @return cipher suite privilege index
99 */
100 uint4_t convertToPrivLimitIndex(const std::string& value);
101
102 /** @brief function to convert privilege value to string
103 *
104 * @param[in] value - privilege value
105 *
106 * @return privilege in string
107 */
108 std::string convertToPrivLimitString(const uint4_t& value);
109
110 /** @brief function to load CS Privilege Levels from json file/files to map
111 *
112 */
113 void loadCSPrivilegesToMap();
114
115 /** @brief function to update CS privileges map from json object data,
116 * jsonData
117 *
118 */
119 void updateCSPrivilegesMap(const nlohmann::json& jsonData);
120};
121
122/** @brief function to create static CipherConfig object
123 *
124 * @param[in] csFileName - user setting cipher suite privilege file name
125 * @param[in] csDefaultFileName - default cipher suite privilege file name
126 *
127 * @return static CipherConfig object
128 */
129CipherConfig& getCipherConfigObject(const std::string& csFileName,
130 const std::string& csDefaultFileName);
131} // namespace ipmi