blob: b41eefacd4e836a89b622c3d5def6bb51134af76 [file] [log] [blame]
Tom Joseph8e832ee2016-12-06 17:47:08 +05301#include "open_session.hpp"
2
Tom Joseph8e832ee2016-12-06 17:47:08 +05303#include "comm_module.hpp"
4#include "endian.hpp"
5#include "main.hpp"
6
Vernon Mauery9e801a22018-10-12 13:20:49 -07007#include <iostream>
8
Tom Joseph8e832ee2016-12-06 17:47:08 +05309namespace command
10{
11
Tom Joseph18a45e92017-04-11 11:30:44 +053012std::vector<uint8_t> openSession(const std::vector<uint8_t>& inPayload,
Tom Joseph8e832ee2016-12-06 17:47:08 +053013 const message::Handler& handler)
14{
Tom Joseph8e832ee2016-12-06 17:47:08 +053015
16 std::vector<uint8_t> outPayload(sizeof(OpenSessionResponse));
Vernon Mauery9e801a22018-10-12 13:20:49 -070017 auto request =
18 reinterpret_cast<const OpenSessionRequest*>(inPayload.data());
Tom Joseph8e832ee2016-12-06 17:47:08 +053019 auto response = reinterpret_cast<OpenSessionResponse*>(outPayload.data());
20
21 // Check for valid Authentication Algorithms
Vernon Mauery9b307be2017-11-22 09:28:16 -080022 if (!cipher::rakp_auth::Interface::isAlgorithmSupported(
Vernon Mauery9e801a22018-10-12 13:20:49 -070023 static_cast<cipher::rakp_auth::Algorithms>(request->authAlgo)))
Tom Joseph8e832ee2016-12-06 17:47:08 +053024 {
25 response->status_code =
26 static_cast<uint8_t>(RAKP_ReturnCode::INVALID_AUTH_ALGO);
27 return outPayload;
28 }
29
30 // Check for valid Integrity Algorithms
Vernon Mauery9b307be2017-11-22 09:28:16 -080031 if (!cipher::integrity::Interface::isAlgorithmSupported(
Vernon Mauery9e801a22018-10-12 13:20:49 -070032 static_cast<cipher::integrity::Algorithms>(request->intAlgo)))
Tom Joseph8e832ee2016-12-06 17:47:08 +053033 {
34 response->status_code =
35 static_cast<uint8_t>(RAKP_ReturnCode::INVALID_INTEGRITY_ALGO);
36 return outPayload;
37 }
38
39 // Check for valid Confidentiality Algorithms
Vernon Mauery9e801a22018-10-12 13:20:49 -070040 if (!cipher::crypt::Interface::isAlgorithmSupported(
41 static_cast<cipher::crypt::Algorithms>(request->confAlgo)))
Tom Joseph8e832ee2016-12-06 17:47:08 +053042 {
43 response->status_code =
44 static_cast<uint8_t>(RAKP_ReturnCode::INVALID_CONF_ALGO);
45 return outPayload;
46 }
47
48 std::shared_ptr<session::Session> session;
49 try
50 {
51 // Start an IPMI session
Vernon Mauery9e801a22018-10-12 13:20:49 -070052 session =
53 (std::get<session::Manager&>(singletonPool)
54 .startSession(
55 endian::from_ipmi<>(request->remoteConsoleSessionID),
56 static_cast<session::Privilege>(request->maxPrivLevel),
57 static_cast<cipher::rakp_auth::Algorithms>(
58 request->authAlgo),
59 static_cast<cipher::integrity::Algorithms>(
60 request->intAlgo),
61 static_cast<cipher::crypt::Algorithms>(request->confAlgo)))
62 .lock();
Tom Joseph8e832ee2016-12-06 17:47:08 +053063 }
64 catch (std::exception& e)
65 {
66 std::cerr << e.what() << "\n";
Vernon Mauery9e801a22018-10-12 13:20:49 -070067 response->status_code =
68 static_cast<uint8_t>(RAKP_ReturnCode::INSUFFICIENT_RESOURCE);
Tom Joseph8e832ee2016-12-06 17:47:08 +053069 std::cerr << "openSession : Problem opening a session\n";
70 return outPayload;
71 }
72
73 response->messageTag = request->messageTag;
74 response->status_code = static_cast<uint8_t>(RAKP_ReturnCode::NO_ERROR);
75 response->maxPrivLevel = static_cast<uint8_t>(session->curPrivLevel);
76 response->remoteConsoleSessionID = request->remoteConsoleSessionID;
Vernon Mauery9e801a22018-10-12 13:20:49 -070077 response->managedSystemSessionID =
78 endian::to_ipmi<>(session->getBMCSessionID());
Tom Joseph8e832ee2016-12-06 17:47:08 +053079
Vernon Mauery9e801a22018-10-12 13:20:49 -070080 response->authPayload = request->authPayload;
81 response->authPayloadLen = request->authPayloadLen;
Tom Joseph8e832ee2016-12-06 17:47:08 +053082 response->authAlgo = request->authAlgo;
83
Vernon Mauery9e801a22018-10-12 13:20:49 -070084 response->intPayload = request->intPayload;
85 response->intPayloadLen = request->intPayloadLen;
Tom Joseph8e832ee2016-12-06 17:47:08 +053086 response->intAlgo = request->intAlgo;
87
Vernon Mauery9e801a22018-10-12 13:20:49 -070088 response->confPayload = request->confPayload;
89 response->confPayloadLen = request->confPayloadLen;
Tom Joseph8e832ee2016-12-06 17:47:08 +053090 response->confAlgo = request->confAlgo;
91
92 session->updateLastTransactionTime();
93
94 // Session state is Setup in progress
95 session->state = session::State::SETUP_IN_PROGRESS;
Tom Joseph8e832ee2016-12-06 17:47:08 +053096 return outPayload;
97}
98
99} // namespace command