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