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