#include "open_session.hpp" #include #include "comm_module.hpp" #include "endian.hpp" #include "main.hpp" namespace command { std::vector openSession(const std::vector& inPayload, const message::Handler& handler) { std::cout << ">> openSession\n"; std::vector outPayload(sizeof(OpenSessionResponse)); auto request = reinterpret_cast(inPayload.data()); auto response = reinterpret_cast(outPayload.data()); // Check for valid Authentication Algorithms if (request->authAlgo != static_cast (cipher::rakp_auth::Algorithms::RAKP_HMAC_SHA1)) { response->status_code = static_cast(RAKP_ReturnCode::INVALID_AUTH_ALGO); return outPayload; } // Check for valid Integrity Algorithms if(!cipher::integrity::Interface::isAlgorithmSupported(static_cast (request->intAlgo))) { response->status_code = static_cast(RAKP_ReturnCode::INVALID_INTEGRITY_ALGO); return outPayload; } // Check for valid Confidentiality Algorithms if(!cipher::crypt::Interface::isAlgorithmSupported(static_cast (request->confAlgo))) { response->status_code = static_cast(RAKP_ReturnCode::INVALID_CONF_ALGO); return outPayload; } std::shared_ptr session; try { // Start an IPMI session session = (std::get(singletonPool).startSession( endian::from_ipmi<>(request->remoteConsoleSessionID), static_cast(request->maxPrivLevel), static_cast(request->authAlgo), static_cast(request->intAlgo), static_cast(request->confAlgo) )).lock(); } catch (std::exception& e) { std::cerr << e.what() << "\n"; response->status_code = static_cast (RAKP_ReturnCode::INSUFFICIENT_RESOURCE); std::cerr << "openSession : Problem opening a session\n"; return outPayload; } response->messageTag = request->messageTag; response->status_code = static_cast(RAKP_ReturnCode::NO_ERROR); response->maxPrivLevel = static_cast(session->curPrivLevel); response->remoteConsoleSessionID = request->remoteConsoleSessionID; response->managedSystemSessionID = endian::to_ipmi<> (session->getBMCSessionID()); response->authPayload = request->authPayload ; response->authPayloadLen = request->authPayloadLen ; response->authAlgo = request->authAlgo; response->intPayload = request->intPayload ; response->intPayloadLen = request->intPayloadLen ; response->intAlgo = request->intAlgo; response->confPayload = request->confPayload ; response->confPayloadLen = request->confPayloadLen ; response->confAlgo = request->confAlgo; session->updateLastTransactionTime(); // Session state is Setup in progress session->state = session::State::SETUP_IN_PROGRESS; std::cout << "<< openSession\n"; return outPayload; } } // namespace command