All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.veraxsystems.vxipmi.coding.commands.session.OpenSession Maven / Gradle / Ivy

The newest version!
/*
 * OpenSession.java 
 * Created on 2011-08-21
 *
 * Copyright (c) Verax Systems 2011.
 * All rights reserved.
 *
 * This software is furnished under a license. Use, duplication,
 * disclosure and all other uses are restricted to the rights
 * specified in the written license agreement.
 */
package com.veraxsystems.vxipmi.coding.commands.session;

import com.veraxsystems.vxipmi.coding.commands.IpmiCommandCoder;
import com.veraxsystems.vxipmi.coding.commands.IpmiVersion;
import com.veraxsystems.vxipmi.coding.commands.PrivilegeLevel;
import com.veraxsystems.vxipmi.coding.commands.ResponseData;
import com.veraxsystems.vxipmi.coding.payload.CompletionCode;
import com.veraxsystems.vxipmi.coding.payload.IpmiPayload;
import com.veraxsystems.vxipmi.coding.payload.PlainMessage;
import com.veraxsystems.vxipmi.coding.payload.lan.IPMIException;
import com.veraxsystems.vxipmi.coding.payload.lan.NetworkFunction;
import com.veraxsystems.vxipmi.coding.protocol.AuthenticationType;
import com.veraxsystems.vxipmi.coding.protocol.IpmiMessage;
import com.veraxsystems.vxipmi.coding.protocol.Ipmiv20Message;
import com.veraxsystems.vxipmi.coding.protocol.PayloadType;
import com.veraxsystems.vxipmi.coding.security.AuthenticationAlgorithm;
import com.veraxsystems.vxipmi.coding.security.CipherSuite;
import com.veraxsystems.vxipmi.coding.security.ConfidentialityAlgorithm;
import com.veraxsystems.vxipmi.coding.security.ConfidentialityNone;
import com.veraxsystems.vxipmi.coding.security.IntegrityAlgorithm;
import com.veraxsystems.vxipmi.common.TypeConverter;

/**
 * Wrapper class for RMCP+ Open Session request.
 */
public class OpenSession extends IpmiCommandCoder {

    private PrivilegeLevel requestedPrivilegeLevel;

    /**
     * Remote console Session ID.
     */
    private int sessionID;

    public void setRequestedPrivilegeLevel(
            PrivilegeLevel requestedPrivilegeLevel) {
        this.requestedPrivilegeLevel = requestedPrivilegeLevel;
    }

    public PrivilegeLevel getRequestedPrivilegeLevel() {
        return requestedPrivilegeLevel;
    }

    private byte getRequestedPrivilegeLevelEncoded() {
        switch (requestedPrivilegeLevel) {
        case MaximumAvailable:
            return 0;
        case Callback:
            return TypeConverter.intToByte(0x1);
        case User:
            return TypeConverter.intToByte(0x2);
        case Operator:
            return TypeConverter.intToByte(0x3);
        case Administrator:
            return TypeConverter.intToByte(0x4);
        default:
            throw new IllegalArgumentException("Invalid privilege level");
        }
    }

    public void setSessionID(int sessionID) {
        this.sessionID = sessionID;
    }

    public int getSessionID() {
        return sessionID;
    }

    /**
     * Initiates class for decoding. Sets IPMI version to
     * {@link IpmiVersion#V20} since OpenSession is a RMCP+ command. Sets
     * authentication type to RMCP+.
     *
     * @param cipherSuite
     *            {@link CipherSuite} containing authentication,
     *            confidentiality and integrity algorithms for this session.
     *            Cipher Suite might (and probably will be, because at this
     *            point of session creation SIK is not yet known) be not
     *            initialized.
     *
     * @see IpmiVersion
     */
    public OpenSession(CipherSuite cipherSuite) {
        super(IpmiVersion.V20, cipherSuite, AuthenticationType.RMCPPlus);
        setCipherSuite(cipherSuite);
    }

    /**
     * Initiates class for encoding and decoding. Sets IPMI version to
     * {@link IpmiVersion#V20} since OpenSession is a RMCP+ command. Sets
     * authentication type to RMCP+.
     *
     * @see IpmiVersion
     *
     * @param sessionID
     *            Session ID selected by the remote console.
     * @param privilegeLevel
     *            Requested privilege level for the session. Can be
     *            {@link PrivilegeLevel#MaximumAvailable}.
     * @param cipherSuite
     *            {@link CipherSuite} containing authentication,
     *            confidentiality and integrity algorithms for this session.
     *            Cipher Suite might (and probably will be, because at this
     *            point of session creation SIK is not yet known) be not
     *            initialized.
     * @see CipherSuite
     * @see AuthenticationAlgorithm
     * @see IntegrityAlgorithm
     * @see ConfidentialityAlgorithm
     */
    public OpenSession(int sessionID, PrivilegeLevel privilegeLevel,
            CipherSuite cipherSuite) {
        super(IpmiVersion.V20, cipherSuite, AuthenticationType.RMCPPlus);

        setSessionID(sessionID);
        setRequestedPrivilegeLevel(privilegeLevel);
    }

    @Override
    public IpmiMessage encodePayload(int messageSequenceNumber, int sessionSequenceNumber, int sessionId) {
        if (sessionId != 0) {
            throw new IllegalArgumentException("Session ID must be 0");
        }
        Ipmiv20Message message = new Ipmiv20Message(new ConfidentialityNone());

        message.setPayloadType(PayloadType.RmcpOpenSessionRequest);
        message.setSessionID(0);
        message.setSessionSequenceNumber(0);
        message.setAuthenticationType(getAuthenticationType());
        message.setPayloadAuthenticated(false);
        message.setPayloadEncrypted(false);
        message.setPayload(preparePayload(messageSequenceNumber));

        return message;
    }

    @Override
    protected IpmiPayload preparePayload(int sequenceNumber) {
        byte[] payload = new byte[32];

        payload[0] = TypeConverter.intToByte(sequenceNumber);

        payload[1] = getRequestedPrivilegeLevelEncoded();

        payload[2] = 0; // reserved
        payload[3] = 0; // reserved

        // prepare requested session ID
        byte[] id = TypeConverter.intToLittleEndianByteArray(sessionID);

        System.arraycopy(id, 0, payload, 4, 4);

        // Authentication Payload

        payload[8] = 0; // payload type
        payload[9] = 0; // reserved
        payload[10] = 0; // reserved
        payload[11] = 0x08; // payload length
        payload[12] = getCipherSuite().getAuthenticationAlgorithm().getCode(); // authentication
                                                                                // algorithm
                                                                                // specific
                                                                                // code
        payload[13] = 0; // reserved
        payload[14] = 0; // reserved
        payload[15] = 0; // reserved

        // Integrity Payload

        payload[16] = 0x01; // payload type
        payload[17] = 0; // reserved
        payload[18] = 0; // reserved
        payload[19] = 0x08; // payload length
        payload[20] = getCipherSuite().getIntegrityAlgorithm().getCode(); // integrity
                                                                            // algorithm
                                                                            // specific
                                                                            // code
        payload[21] = 0; // reserved
        payload[22] = 0; // reserved
        payload[23] = 0; // reserved

        // Confidentiality Payload

        payload[24] = 0x02; // payload type
        payload[25] = 0; // reserved
        payload[26] = 0; // reserved
        payload[27] = 0x08; // payload length
        payload[28] = getCipherSuite().getConfidentialityAlgorithm().getCode(); // confidentiality
                                                                                // algorithm
                                                                                // specific
                                                                                // code
        payload[29] = 0; // reserved
        payload[30] = 0; // reserved
        payload[31] = 0; // reserved

        return new PlainMessage(payload);
    }

    @Override
    public NetworkFunction getNetworkFunction() {
        return NetworkFunction.ChassisRequest;
    }

    @Override
    public byte getCommandCode() {
        return 0;
    }

    @Override
    public ResponseData getResponseData(IpmiMessage message) throws IPMIException {
        if (!isCommandResponse(message)) {
            throw new IllegalArgumentException(
                    "This is not a response for Open Session command");
        }

        byte[] payload = message.getPayload().getPayloadData();

        if (payload[1] != 0) {
            throw new IPMIException(CompletionCode.parseInt(TypeConverter
                    .byteToInt(payload[1])));
        }

        if (payload.length < 36) {
            throw new IllegalArgumentException("Invalid payload length");
        }

        OpenSessionResponseData data = new OpenSessionResponseData();

        data.setMessageTag(payload[0]);

        data.setStatusCode(payload[1]);

        data.setPrivilegeLevel(payload[2]);

        byte[] buffer = new byte[4];

        System.arraycopy(payload, 4, buffer, 0, 4);

        data.setRemoteConsoleSessionId(TypeConverter
                .littleEndianByteArrayToInt(buffer));

        System.arraycopy(payload, 8, buffer, 0, 4);

        data.setManagedSystemSessionId(TypeConverter
                .littleEndianByteArrayToInt(buffer));

        byte[] auth = new byte[8];

        System.arraycopy(payload, 12, auth, 0, 8);

        data.setAuthenticationAlgorithm(auth[4]);

        byte[] integr = new byte[8];

        System.arraycopy(payload, 20, integr, 0, 8);

        data.setIntegrityAlgorithm(integr[4]);

        byte[] conf = new byte[8];

        System.arraycopy(payload, 28, conf, 0, 8);

        data.setConfidentialityAlgorithm(conf[4]);

        return data;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy