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

com.veraxsystems.vxipmi.coding.protocol.decoder.Protocolv15Decoder Maven / Gradle / Ivy

The newest version!
/*
 * Protocolv15Decoder.java 
 * Created on 2011-07-26
 *
 * 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.protocol.decoder;

import com.veraxsystems.vxipmi.coding.protocol.AuthenticationType;
import com.veraxsystems.vxipmi.coding.protocol.IpmiMessage;
import com.veraxsystems.vxipmi.coding.protocol.Ipmiv15Message;
import com.veraxsystems.vxipmi.coding.protocol.PayloadType;
import com.veraxsystems.vxipmi.coding.rmcp.RmcpMessage;
import com.veraxsystems.vxipmi.common.TypeConverter;

/**
 * Decodes IPMI v1.5 session header and retrieves encrypted payload.
 */
public class Protocolv15Decoder extends ProtocolDecoder {

    public Protocolv15Decoder() {
        super();
    }

    /**
     * Decodes IPMI v1.5 message fields.
     *
     * @param rmcpMessage
     *            - RMCP message to decode.
     * @return decoded message
     * @see Ipmiv15Message
     * @throws IllegalArgumentException
     *             when delivered RMCP message does not contain encapsulated
     *             IPMI message.
     */
    @Override
    public IpmiMessage decode(RmcpMessage rmcpMessage) {
        Ipmiv15Message message = new Ipmiv15Message();

        byte[] raw = rmcpMessage.getData();

        message.setAuthenticationType(decodeAuthenticationType(raw[0]));

        int offset = 1;

        message.setSessionSequenceNumber(decodeSessionSequenceNumber(raw,
                offset));

        offset += 4;

        message.setSessionID(decodeSessionID(raw, offset));

        offset += 4;

        if (message.getAuthenticationType() != AuthenticationType.None) {
            message.setAuthCode(decodeAuthCode(raw, offset));
            offset += 16;
        }

        int payloadLength = decodePayloadLength(raw, offset);

        message.setPayloadLength(payloadLength);
        ++offset;

        message.setPayload(decodePayload(raw, offset, payloadLength,
                message.getConfidentialityAlgorithm(), PayloadType.Ipmi));

        return message;
    }

    /**
     * Decodes authentication code.
     *
     * @param rawMessage
     *            - Byte array holding whole message data.
     * @param offset
     *            - Offset to authentication code in header.
     * @return authentication code.
     */
    private byte[] decodeAuthCode(byte[] rawMessage, int offset) {
        byte[] authCode = new byte[16];

        System.arraycopy(rawMessage, offset, authCode, 0, 16);

        return authCode;
    }

    @Override
    protected int decodePayloadLength(byte[] rawData, int offset) {
        return TypeConverter.byteToInt(rawData[offset]);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy