1 #pragma once
2 
3 #include "message_handler.hpp"
4 
5 #include <vector>
6 
7 namespace command
8 {
9 
10 /**
11  * @struct GetChannelCapabilitiesReq
12  *
13  * IPMI Request data for Get Channel Authentication Capabilities command
14  */
15 struct GetChannelCapabilitiesReq
16 {
17     uint8_t channelNumber;
18     uint8_t reqMaxPrivLevel;
19 } __attribute__((packed));
20 
21 /**
22  * @struct GetChannelCapabilitiesResp
23  *
24  * IPMI Response data for Get Channel Authentication Capabilities command
25  */
26 struct GetChannelCapabilitiesResp
27 {
28     uint8_t completionCode; // Completion Code
29 
30     uint8_t channelNumber;  // Channel number that the request was
31     // received on
32 
33 #if BYTE_ORDER == LITTLE_ENDIAN
34     uint8_t none:1;
35     uint8_t md2:1;
36     uint8_t md5:1;
37     uint8_t reserved2:1;
38     uint8_t straightKey:1; // Straight password/key support
39     // Support OEM identified by the IANA OEM ID in RMCP+ ping response
40     uint8_t oem:1;
41     uint8_t reserved1:1;
42     uint8_t ipmiVersion:1; // 0b = IPMIV1.5 support only, 1B = IPMI V2.0
43     // support
44 #endif
45 
46 #if BYTE_ORDER == BIG_ENDIAN
47     uint8_t ipmiVersion:1; // 0b = IPMIV1.5 support only, 1B = IPMI V2.0
48     // support
49     uint8_t reserved1:1;
50     // Support OEM identified by the IANA OEM ID in RMCP+ ping response
51     uint8_t oem:1;
52     uint8_t straightKey:1; // Straight password/key support
53     uint8_t reserved2:1;
54     uint8_t md5:1;
55     uint8_t md2:1;
56     uint8_t none:1;
57 #endif
58 
59 #if BYTE_ORDER == LITTLE_ENDIAN
60     // Anonymous login status for anonymous login enabled/disabled
61     uint8_t anonymousLogin:1;
62     // Anonymous login status for null usernames enabled/disabled
63     uint8_t nullUsers:1;
64     // Anonymous login status for non-null usernames enabled/disabled
65     uint8_t nonNullUsers:1;
66     uint8_t userAuth:1;       // User level authentication status
67     uint8_t perMessageAuth:1; // Per-message authentication support
68     // Two key login status . only for IPMI V2.0 RMCP+ RAKP
69     uint8_t KGStatus:1;
70     uint8_t reserved3:2;
71 #endif
72 
73 #if BYTE_ORDER == BIG_ENDIAN
74     uint8_t reserved3:2;
75     // Two key login status . only for IPMI V2.0 RMCP+ RAKP
76     uint8_t KGStatus:1;
77     uint8_t perMessageAuth:1; // Per-message authentication support
78     uint8_t userAuth:1;       // User level authentication status
79     // Anonymous login status for non-null usernames enabled/disabled
80     uint8_t nonNullUsers:1;
81     // Anonymous login status for null usernames enabled/disabled
82     uint8_t nullUsers:1;
83     // Anonymous login status for anonymous login enabled/disabled
84     uint8_t anonymousLogin:1;
85 #endif
86 
87 #if BYTE_ORDER == LITTLE_ENDIAN
88     // Extended capabilities will be present only if IPMI version is V2.0
89     uint8_t extCapabilities:2; // Channel support for IPMI V2.0 connections
90     uint8_t reserved4:6;
91 #endif
92 
93 #if BYTE_ORDER == BIG_ENDIAN
94     // Extended capabilities will be present only if IPMI version is V2.0
95     uint8_t reserved4:6;
96     uint8_t extCapabilities:2; // Channel support for IPMI V2.0 connections
97 #endif
98 
99     // Below 4 bytes will all the 0's if no OEM authentication type available.
100     uint8_t oemID[3];     // IANA enterprise number for OEM/organization
101     uint8_t oemAuxillary; // Addition OEM specific information..
102 } __attribute__((packed));
103 
104 /**
105  * @brief Get Channel Authentication Capabilities
106  *
107  * This message exchange provides a way for a remote console to discover what
108  * IPMI version is supported i.e. whether or not the BMC supports the IPMI
109  * v2.0 / RMCP+ packet format. It also provides information that the remote
110  * console can use to determine whether anonymous, “one-key”, or “two-key”
111  * logins are used.This information can guide a remote console in how it
112  * presents queries to users for username and password information. This is a
113  * ‘session-less’ command that the BMC accepts in both IPMI v1.5 and v2.0/RMCP+
114  * packet formats.
115  *
116  * @param[in] inPayload - Request Data for the command
117  * @param[in] handler - Reference to the Message Handler
118  *
119  * @return Response data for the command
120  */
121 std::vector<uint8_t>
122     GetChannelCapabilities(const std::vector<uint8_t>& inPayload,
123                            std::shared_ptr<message::Handler>& handler);
124 
125 /**
126  * @brief Get Channel Cipher Suites
127  *
128  * This command is used to look up what authentication, integrity, and
129  * confidentiality algorithms are supported. The algorithms are used in
130  * combination as ‘Cipher Suites’. This command only applies to implementations
131  * that support IPMI v2.0/RMCP+ sessions. This command can be executed prior to
132  * establishing a session with the BMC.
133  *
134  * @param[in] inPayload - Request Data for the command
135  * @param[in] handler - Reference to the Message Handler
136  *
137  * @return Response data for the command
138  */
139 std::vector<uint8_t>
140     getChannelCipherSuites(const std::vector<uint8_t>& inPayload,
141                            std::shared_ptr<message::Handler>& handler);
142 
143 } // namespace command
144