Implement encryptPayload and invoke it when flattening the packet

Change-Id: I85346e5ae47b81abef62a73ade3584cbf5a2df35
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
diff --git a/message_parsers.cpp b/message_parsers.cpp
index 6cdd694..66030cf 100644
--- a/message_parsers.cpp
+++ b/message_parsers.cpp
@@ -213,12 +213,27 @@
 
     size_t payloadLen = 0;
 
-    header->payloadLength = endian::to_ipmi<uint16_t>(
-             outMessage.payload.size());
-    payloadLen = outMessage.payload.size();
-    // Insert the Payload into the Packet
-    packet.insert(packet.end(), outMessage.payload.begin(),
-                  outMessage.payload.end());
+    // Encrypt the payload if needed
+    if (outMessage.isPacketEncrypted)
+    {
+        header->payloadType |= PAYLOAD_ENCRYPT_MASK;
+        auto cipherPayload = internal::encryptPayload(outMessage);
+        payloadLen = cipherPayload.size();
+        header->payloadLength = endian::to_ipmi<uint16_t>(cipherPayload.size());
+
+        // Insert the encrypted payload into the outgoing IPMI packet
+        packet.insert(packet.end(), cipherPayload.begin(), cipherPayload.end());
+    }
+    else
+    {
+        header->payloadLength = endian::to_ipmi<uint16_t>(
+                outMessage.payload.size());
+        payloadLen = outMessage.payload.size();
+
+        // Insert the Payload into the Packet
+        packet.insert(packet.end(), outMessage.payload.begin(),
+                      outMessage.payload.end());
+    }
 
     if (outMessage.isPacketAuthenticated)
     {
@@ -334,6 +349,14 @@
                                                   payloadLen);
 }
 
+std::vector<uint8_t> encryptPayload(Message& message)
+{
+    auto session = (std::get<session::Manager&>(singletonPool).getSession(
+                        message.bmcSessionID)).lock();
+
+    return session->getCryptAlgo()->encryptPayload(message.payload);
+}
+
 } // namespace internal
 
 } // namespace ipmi20parser
diff --git a/message_parsers.hpp b/message_parsers.hpp
index 774b985..fc82abc 100644
--- a/message_parsers.hpp
+++ b/message_parsers.hpp
@@ -208,6 +208,15 @@
                                     const Message& message,
                                     size_t payloadLen);
 
+/*
+ * @brief Encrypt the plain text payload for the outgoing IPMI packet
+ *
+ * @param[in] message - IPMI Message populated for the outgoing packet
+ *
+ * @return on successful completion, return the encrypted payload
+ */
+std::vector<uint8_t> encryptPayload(Message& message);
+
 } // namespace internal
 
 } // namespace ipmi20parser