blob: 51da9e196bd52e547d830e9504b79deb126d645b [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 Maueryfc37e592018-12-19 14:55:15 -08007#include <phosphor-logging/log.hpp>
8
9using namespace phosphor::logging;
Vernon Mauery9e801a22018-10-12 13:20:49 -070010
Tom Joseph8e832ee2016-12-06 17:47:08 +053011namespace command
12{
13
Tom Joseph18a45e92017-04-11 11:30:44 +053014std::vector<uint8_t> openSession(const std::vector<uint8_t>& inPayload,
Tom Joseph8e832ee2016-12-06 17:47:08 +053015 const message::Handler& handler)
16{
Tom Joseph8e832ee2016-12-06 17:47:08 +053017
18 std::vector<uint8_t> outPayload(sizeof(OpenSessionResponse));
Vernon Mauery9e801a22018-10-12 13:20:49 -070019 auto request =
20 reinterpret_cast<const OpenSessionRequest*>(inPayload.data());
Tom Joseph8e832ee2016-12-06 17:47:08 +053021 auto response = reinterpret_cast<OpenSessionResponse*>(outPayload.data());
22
23 // Check for valid Authentication Algorithms
Vernon Mauery9b307be2017-11-22 09:28:16 -080024 if (!cipher::rakp_auth::Interface::isAlgorithmSupported(
Vernon Mauery9e801a22018-10-12 13:20:49 -070025 static_cast<cipher::rakp_auth::Algorithms>(request->authAlgo)))
Tom Joseph8e832ee2016-12-06 17:47:08 +053026 {
27 response->status_code =
28 static_cast<uint8_t>(RAKP_ReturnCode::INVALID_AUTH_ALGO);
29 return outPayload;
30 }
31
32 // Check for valid Integrity Algorithms
Vernon Mauery9b307be2017-11-22 09:28:16 -080033 if (!cipher::integrity::Interface::isAlgorithmSupported(
Vernon Mauery9e801a22018-10-12 13:20:49 -070034 static_cast<cipher::integrity::Algorithms>(request->intAlgo)))
Tom Joseph8e832ee2016-12-06 17:47:08 +053035 {
36 response->status_code =
37 static_cast<uint8_t>(RAKP_ReturnCode::INVALID_INTEGRITY_ALGO);
38 return outPayload;
39 }
40
41 // Check for valid Confidentiality Algorithms
Vernon Mauery9e801a22018-10-12 13:20:49 -070042 if (!cipher::crypt::Interface::isAlgorithmSupported(
43 static_cast<cipher::crypt::Algorithms>(request->confAlgo)))
Tom Joseph8e832ee2016-12-06 17:47:08 +053044 {
45 response->status_code =
46 static_cast<uint8_t>(RAKP_ReturnCode::INVALID_CONF_ALGO);
47 return outPayload;
48 }
49
50 std::shared_ptr<session::Session> session;
51 try
52 {
53 // Start an IPMI session
Vernon Mauery9e801a22018-10-12 13:20:49 -070054 session =
Vernon Maueryae1fda42018-10-15 12:55:34 -070055 std::get<session::Manager&>(singletonPool)
56 .startSession(
57 endian::from_ipmi<>(request->remoteConsoleSessionID),
58 static_cast<session::Privilege>(request->maxPrivLevel),
59 static_cast<cipher::rakp_auth::Algorithms>(
60 request->authAlgo),
61 static_cast<cipher::integrity::Algorithms>(
62 request->intAlgo),
63 static_cast<cipher::crypt::Algorithms>(request->confAlgo));
Tom Joseph8e832ee2016-12-06 17:47:08 +053064 }
65 catch (std::exception& e)
66 {
Vernon Mauery9e801a22018-10-12 13:20:49 -070067 response->status_code =
68 static_cast<uint8_t>(RAKP_ReturnCode::INSUFFICIENT_RESOURCE);
Vernon Maueryfc37e592018-12-19 14:55:15 -080069 log<level::ERR>("openSession : Problem opening a session",
70 entry("EXCEPTION=%s", e.what()));
Tom Joseph8e832ee2016-12-06 17:47:08 +053071 return outPayload;
72 }
73
74 response->messageTag = request->messageTag;
75 response->status_code = static_cast<uint8_t>(RAKP_ReturnCode::NO_ERROR);
76 response->maxPrivLevel = static_cast<uint8_t>(session->curPrivLevel);
77 response->remoteConsoleSessionID = request->remoteConsoleSessionID;
Vernon Mauery9e801a22018-10-12 13:20:49 -070078 response->managedSystemSessionID =
79 endian::to_ipmi<>(session->getBMCSessionID());
Tom Joseph8e832ee2016-12-06 17:47:08 +053080
Vernon Mauery9e801a22018-10-12 13:20:49 -070081 response->authPayload = request->authPayload;
82 response->authPayloadLen = request->authPayloadLen;
Tom Joseph8e832ee2016-12-06 17:47:08 +053083 response->authAlgo = request->authAlgo;
84
Vernon Mauery9e801a22018-10-12 13:20:49 -070085 response->intPayload = request->intPayload;
86 response->intPayloadLen = request->intPayloadLen;
Tom Joseph8e832ee2016-12-06 17:47:08 +053087 response->intAlgo = request->intAlgo;
88
Vernon Mauery9e801a22018-10-12 13:20:49 -070089 response->confPayload = request->confPayload;
90 response->confPayloadLen = request->confPayloadLen;
Tom Joseph8e832ee2016-12-06 17:47:08 +053091 response->confAlgo = request->confAlgo;
92
93 session->updateLastTransactionTime();
94
95 // Session state is Setup in progress
96 session->state = session::State::SETUP_IN_PROGRESS;
Tom Joseph8e832ee2016-12-06 17:47:08 +053097 return outPayload;
98}
99
100} // namespace command