Implement Get Channel Cipher Suites command

Change-Id: I8c808ce7e2bbd3ae5e225573138d7e04871f1643
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
diff --git a/app/channel.hpp b/app/channel.hpp
index 1391d62..79522e4 100644
--- a/app/channel.hpp
+++ b/app/channel.hpp
@@ -1,4 +1,5 @@
 #include "ipmid.hpp"
+#include "nlohmann/json.hpp"
 
 /** @brief The set channel access IPMI command.
  *
@@ -57,3 +58,66 @@
         ipmi_data_len_t data_len,
         ipmi_context_t context);
 
+/** @brief Implementation of get channel cipher suites command
+ *
+ *  @param[in] netfn - Net Function
+ *  @param[in] cmd - Command
+ *  @param[in] request - Request pointer
+ *  @param[in,out] response - Response pointer
+ *  @param[in,out] data_len - Data Length
+ *  @param[in] context - Context
+ *
+ *  @return IPMI_CC_OK on success, non-zero otherwise.
+ */
+ipmi_ret_t getChannelCipherSuites(ipmi_netfn_t netfn,
+                                  ipmi_cmd_t cmd,
+                                  ipmi_request_t request,
+                                  ipmi_response_t response,
+                                  ipmi_data_len_t data_len,
+                                  ipmi_context_t context);
+
+namespace cipher
+{
+
+static constexpr auto defaultChannelNumber = 1;
+static constexpr auto listTypeMask = 0x80;
+static constexpr auto listCipherSuite = 0x80;
+static constexpr auto listIndexMask = 0x3F;
+static constexpr auto respSize = 16;
+
+using Json = nlohmann::json;
+static constexpr auto configFile =
+    "/usr/share/ipmi-providers/cipher_list.json";
+static constexpr auto cipher = "cipher";
+static constexpr auto stdCipherSuite = 0xC0;
+static constexpr auto oemCipherSuite = 0xC1;
+static constexpr auto oem = "oemiana";
+static constexpr auto auth = "authentication";
+static constexpr auto integrity = "integrity";
+static constexpr auto integrityTag = 0x40;
+static constexpr auto conf = "confidentiality";
+static constexpr auto confTag = 0x80;
+
+} //namespace cipher
+
+/** @struct GetChannelCipherRequest
+ *
+ *  IPMI payload for Get Channel Cipher Suites command request
+ */
+struct GetChannelCipherRequest
+{
+    uint8_t channelNumber;      //!< Channel Number
+    uint8_t payloadType;        //!< Payload type number
+    uint8_t listIndex;          //!< List Index
+} __attribute__((packed));
+
+/** @struct GetChannelCipherRespHeader
+ *
+ *  IPMI payload for Get Channel Cipher Suites command response header
+ */
+struct GetChannelCipherRespHeader
+{
+    uint8_t channelNumber;      //!< Channel Number
+} __attribute__((packed));
+
+