1 #pragma once
2 
3 #include "comm_module.hpp"
4 #include "message_handler.hpp"
5 
6 #include <vector>
7 
8 namespace command
9 {
10 
11 constexpr size_t userNameMaxLen = 16;
12 
13 /**
14  * @struct RAKP1request
15  *
16  * IPMI Payload for RAKP Message 1
17  */
18 struct RAKP1request
19 {
20     uint8_t messageTag;
21     uint8_t reserved1;
22     uint16_t reserved2;
23     uint32_t managedSystemSessionID;
24     uint8_t remote_console_random_number[16];
25     uint8_t req_max_privilege_level;
26     uint16_t reserved3;
27     uint8_t user_name_len;
28     char user_name[userNameMaxLen];
29 } __attribute__((packed));
30 
31 /**
32  * @struct RAKP2response
33  *
34  * IPMI Payload for RAKP Message 2
35  */
36 struct RAKP2response
37 {
38     uint8_t messageTag;
39     uint8_t rmcpStatusCode;
40     uint16_t reserved;
41     uint32_t remoteConsoleSessionID;
42     uint8_t managed_system_random_number[16];
43     uint8_t managed_system_guid[16];
44 } __attribute__((packed));
45 
46 /**
47  * @brief RAKP Message 1, RAKP Message 2
48  *
49  * These messages are used to exchange random number and identification
50  * information between the BMC and the remote console that are, in effect,
51  * mutual challenges for a challenge/response. (Unlike IPMI v1.5, the v2.0/RMCP+
52  * challenge/response is symmetric. I.e. the remote console and BMC both issues
53  * challenges,and both need to provide valid responses for the session to be
54  * activated.)
55  *
56  * The remote console request (RAKP Message 1) passes a random number and
57  * username/privilege information that the BMC will later use to ‘sign’ a
58  * response message based on key information associated with the user and the
59  * Authentication Algorithm negotiated in the Open Session Request/Response
60  * exchange. The BMC responds with RAKP Message 2 and passes a random number and
61  * GUID (globally unique ID) for the managed system that the remote console
62  * uses according the Authentication Algorithm to sign a response back to the
63  * BMC.
64  *
65  * @param[in] inPayload - Request Data for the command
66  * @param[in] handler - Reference to the Message Handler
67  *
68  * @return Response data for the command
69  */
70 std::vector<uint8_t> RAKP12(const std::vector<uint8_t>& inPayload,
71                             const message::Handler& handler);
72 
73 } // namespace command
74