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