blob: b38da402cecae227415e6ae357f8af4d5343034d [file] [log] [blame]
Tom Joseph4e57ada2016-08-10 06:51:12 -05001#pragma once
2
3#include "message.hpp"
4#include "session.hpp"
5
6namespace message
7{
8
9namespace parser
10{
11
12constexpr size_t RMCP_VERSION = 6;
13
14// RMCP Messages with class=IPMI should be sent with an RMCP Sequence
15// Number of FFh to indicate that an RMCP ACK message should not be
16// generated by the message receiver.
17constexpr size_t RMCP_SEQ = 0xFF;
18
19// RMCP Message Class 7h is for IPMI
20constexpr size_t RMCP_MESSAGE_CLASS_IPMI = 7;
21
Tom Joseph64703f42017-01-10 17:03:48 +053022// RMCP Session Header Size
23constexpr size_t RMCP_SESSION_HEADER_SIZE = 4;
24
Tom Joseph1efcb492017-01-31 16:56:47 +053025// Maximum payload size
26constexpr size_t MAX_PAYLOAD_SIZE = 255;
27
Tom Joseph4e57ada2016-08-10 06:51:12 -050028enum class SessionHeader
29{
30 IPMI15 = 0x00,
31 IPMI20 = 0x06,
32 INVALID = 0xFF,
33};
34
35struct BasicHeader_t
36{
37 // RMCP Header
38 uint8_t version;
39 uint8_t reserved;
40 uint8_t rmcpSeqNum;
41 uint8_t classOfMsg;
42
43 // IPMI partial session header
44 union
45 {
Vernon Mauery9e801a22018-10-12 13:20:49 -070046 uint8_t reserved1 : 4;
47 uint8_t authType : 4;
Tom Joseph4e57ada2016-08-10 06:51:12 -050048 uint8_t formatType;
49 } format;
50} __attribute__((packed));
51
Tom Joseph3563f8f2017-05-08 15:42:54 +053052/**
Tom Joseph4e57ada2016-08-10 06:51:12 -050053 * @brief Unflatten an incoming packet and prepare the IPMI message
54 *
55 * @param[in] inPacket - Incoming IPMI packet
56 *
57 * @return A tuple with IPMI message and the session header type to sent the
58 * response packet. In case of success incoming message and session
59 * header type. In case of failure nullptr and session header type
60 * would be invalid.
61 */
Vernon Maueryd999ffc2018-10-25 09:16:05 -070062std::tuple<std::shared_ptr<Message>, SessionHeader>
Vernon Mauery9e801a22018-10-12 13:20:49 -070063 unflatten(std::vector<uint8_t>& inPacket);
Tom Joseph4e57ada2016-08-10 06:51:12 -050064
Tom Joseph3563f8f2017-05-08 15:42:54 +053065/**
Tom Joseph4e57ada2016-08-10 06:51:12 -050066 * @brief Flatten an IPMI message and generate the IPMI packet with the
67 * session header
68 *
69 * @param[in] outMessage - IPMI message to be flattened
70 * @param[in] authType - Session header type to be added to the IPMI
71 * packet
72 *
73 * @return IPMI packet on success
74 */
Vernon Maueryd999ffc2018-10-25 09:16:05 -070075std::vector<uint8_t> flatten(std::shared_ptr<Message> outMessage,
76 SessionHeader authType, session::Session& session);
Tom Joseph4e57ada2016-08-10 06:51:12 -050077
78} // namespace parser
79
80namespace ipmi15parser
81{
82
83struct SessionHeader_t
84{
85 struct parser::BasicHeader_t base;
86 uint32_t sessSeqNum;
87 uint32_t sessId;
88 // <Optional Field: AuthCode>
89 uint8_t payloadLength;
90} __attribute__((packed));
91
92struct SessionTrailer_t
93{
94 uint8_t legacyPad;
95} __attribute__((packed));
96
Tom Joseph3563f8f2017-05-08 15:42:54 +053097/**
Tom Joseph4e57ada2016-08-10 06:51:12 -050098 * @brief Unflatten an incoming packet and prepare the IPMI message
99 *
100 * @param[in] inPacket - Incoming IPMI packet
101 *
102 * @return IPMI message in the packet on success
103 */
Vernon Maueryd999ffc2018-10-25 09:16:05 -0700104std::shared_ptr<Message> unflatten(std::vector<uint8_t>& inPacket);
Tom Joseph4e57ada2016-08-10 06:51:12 -0500105
Tom Joseph3563f8f2017-05-08 15:42:54 +0530106/**
Tom Joseph4e57ada2016-08-10 06:51:12 -0500107 * @brief Flatten an IPMI message and generate the IPMI packet with the
108 * session header
109 *
110 * @param[in] outMessage - IPMI message to be flattened
111 *
112 * @return IPMI packet on success
113 */
Vernon Maueryd999ffc2018-10-25 09:16:05 -0700114std::vector<uint8_t> flatten(std::shared_ptr<Message> outMessage,
115 session::Session& session);
Tom Joseph4e57ada2016-08-10 06:51:12 -0500116
117} // namespace ipmi15parser
118
119namespace ipmi20parser
120{
121
122constexpr size_t MAX_INTEGRITY_DATA_LENGTH = 12;
123constexpr size_t PAYLOAD_ENCRYPT_MASK = 0x80;
124constexpr size_t PAYLOAD_AUTH_MASK = 0x40;
125
126struct SessionHeader_t
127{
128 struct parser::BasicHeader_t base;
129
130 uint8_t payloadType;
131
132 uint32_t sessId;
133 uint32_t sessSeqNum;
134 uint16_t payloadLength;
135} __attribute__((packed));
136
137struct SessionTrailer_t
138{
139 // Integrity Pad
140 uint8_t padLength;
141 uint8_t nextHeader;
Tom Joseph4e57ada2016-08-10 06:51:12 -0500142} __attribute__((packed));
143
Tom Joseph3563f8f2017-05-08 15:42:54 +0530144/**
Tom Joseph4e57ada2016-08-10 06:51:12 -0500145 * @brief Unflatten an incoming packet and prepare the IPMI message
146 *
147 * @param[in] inPacket - Incoming IPMI packet
148 *
149 * @return IPMI message in the packet on success
150 */
Vernon Maueryd999ffc2018-10-25 09:16:05 -0700151std::shared_ptr<Message> unflatten(std::vector<uint8_t>& inPacket);
Tom Joseph4e57ada2016-08-10 06:51:12 -0500152
Tom Joseph3563f8f2017-05-08 15:42:54 +0530153/**
Tom Joseph4e57ada2016-08-10 06:51:12 -0500154 * @brief Flatten an IPMI message and generate the IPMI packet with the
155 * session header
156 *
157 * @param[in] outMessage - IPMI message to be flattened
158 *
159 * @return IPMI packet on success
160 */
Vernon Maueryd999ffc2018-10-25 09:16:05 -0700161std::vector<uint8_t> flatten(std::shared_ptr<Message> outMessage,
162 session::Session& session);
Tom Joseph4e57ada2016-08-10 06:51:12 -0500163
164namespace internal
165{
166
Tom Joseph3563f8f2017-05-08 15:42:54 +0530167/**
Tom Joseph4e57ada2016-08-10 06:51:12 -0500168 * @brief Add sequence number to the message
169 *
170 * @param[in] packet - outgoing packet to which to add sequence number
171 * @param[in] session - session handle
172 *
173 */
174void addSequenceNumber(std::vector<uint8_t>& packet, session::Session& session);
175
Tom Joseph3563f8f2017-05-08 15:42:54 +0530176/**
Tom Joseph64703f42017-01-10 17:03:48 +0530177 * @brief Verify the integrity data of the incoming IPMI packet
178 *
179 * @param[in] packet - Incoming IPMI packet
Tom Joseph027dfc22017-01-26 13:30:53 +0530180 * @param[in] message - IPMI Message populated from the incoming packet
181 * @param[in] payloadLen - Length of the IPMI payload
Tom Joseph64703f42017-01-10 17:03:48 +0530182 *
183 */
184bool verifyPacketIntegrity(const std::vector<uint8_t>& packet,
Vernon Maueryd999ffc2018-10-25 09:16:05 -0700185 const std::shared_ptr<Message> message,
186 size_t payloadLen);
Tom Joseph64703f42017-01-10 17:03:48 +0530187
Tom Joseph3563f8f2017-05-08 15:42:54 +0530188/**
Tom Joseph64703f42017-01-10 17:03:48 +0530189 * @brief Add Integrity data to the outgoing IPMI packet
190 *
191 * @param[in] packet - Outgoing IPMI packet
Tom Joseph1404bca2017-01-26 14:17:02 +0530192 * @param[in] message - IPMI Message populated for the outgoing packet
193 * @param[in] payloadLen - Length of the IPMI payload
Tom Joseph64703f42017-01-10 17:03:48 +0530194 */
Vernon Maueryd999ffc2018-10-25 09:16:05 -0700195void addIntegrityData(std::vector<uint8_t>& packet,
196 const std::shared_ptr<Message> message,
Tom Joseph1404bca2017-01-26 14:17:02 +0530197 size_t payloadLen);
Tom Joseph64703f42017-01-10 17:03:48 +0530198
Tom Joseph3563f8f2017-05-08 15:42:54 +0530199/**
Tom Joseph78478a82017-01-26 14:24:29 +0530200 * @brief Decrypt the encrypted payload in the incoming IPMI packet
201 *
202 * @param[in] packet - Incoming IPMI packet
203 * @param[in] message - IPMI Message populated from the incoming packet
204 * @param[in] payloadLen - Length of encrypted IPMI payload
205 *
206 * @return on successful completion, return the plain text payload
207 */
208std::vector<uint8_t> decryptPayload(const std::vector<uint8_t>& packet,
Vernon Maueryd999ffc2018-10-25 09:16:05 -0700209 const std::shared_ptr<Message> message,
210 size_t payloadLen);
Tom Joseph78478a82017-01-26 14:24:29 +0530211
Tom Joseph3563f8f2017-05-08 15:42:54 +0530212/**
Tom Joseph75362832017-01-26 15:17:04 +0530213 * @brief Encrypt the plain text payload for the outgoing IPMI packet
214 *
215 * @param[in] message - IPMI Message populated for the outgoing packet
216 *
217 * @return on successful completion, return the encrypted payload
218 */
Vernon Maueryd999ffc2018-10-25 09:16:05 -0700219std::vector<uint8_t> encryptPayload(std::shared_ptr<Message> message);
Tom Joseph75362832017-01-26 15:17:04 +0530220
Tom Joseph4e57ada2016-08-10 06:51:12 -0500221} // namespace internal
222
223} // namespace ipmi20parser
224
225} // namespace message