1 package org.metricshub.ipmi.core.coding.protocol.decoder;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import org.metricshub.ipmi.core.coding.protocol.AuthenticationType;
26 import org.metricshub.ipmi.core.coding.protocol.IpmiMessage;
27 import org.metricshub.ipmi.core.coding.protocol.Ipmiv15Message;
28 import org.metricshub.ipmi.core.coding.protocol.PayloadType;
29 import org.metricshub.ipmi.core.coding.rmcp.RmcpMessage;
30 import org.metricshub.ipmi.core.common.TypeConverter;
31
32
33
34
35 public class Protocolv15Decoder extends ProtocolDecoder {
36
37 public Protocolv15Decoder() {
38 super();
39 }
40
41
42
43
44
45
46
47
48
49
50
51
52 @Override
53 public IpmiMessage decode(RmcpMessage rmcpMessage) {
54 Ipmiv15Message message = new Ipmiv15Message();
55
56 byte[] raw = rmcpMessage.getData();
57
58
59 if (raw.length < 10) {
60 throw new IllegalArgumentException("Message is truncated");
61 }
62
63 message.setAuthenticationType(decodeAuthenticationType(raw[0]));
64
65 int offset = 1;
66
67 message.setSessionSequenceNumber(decodeSessionSequenceNumber(raw, offset));
68
69 offset += 4;
70
71 message.setSessionID(decodeSessionID(raw, offset));
72
73 offset += 4;
74
75 if (message.getAuthenticationType() != AuthenticationType.None) {
76 if (raw.length < 26) {
77 throw new IllegalArgumentException("Message is truncated");
78 }
79 message.setAuthCode(decodeAuthCode(raw, offset));
80 offset += 16;
81 }
82
83 int payloadLength = decodePayloadLength(raw, offset);
84
85 message.setPayloadLength(payloadLength);
86 ++offset;
87
88 if (raw.length < offset + payloadLength) {
89 throw new IllegalArgumentException("Message is truncated");
90 }
91
92 message
93 .setPayload(decodePayload(raw, offset, payloadLength, message.getConfidentialityAlgorithm(), PayloadType.Ipmi));
94
95 return message;
96 }
97
98
99
100
101
102
103
104
105
106
107 private byte[] decodeAuthCode(byte[] rawMessage, int offset) {
108 byte[] authCode = new byte[16];
109
110 System.arraycopy(rawMessage, offset, authCode, 0, 16);
111
112 return authCode;
113 }
114
115 @Override
116 protected int decodePayloadLength(byte[] rawData, int offset) {
117 return TypeConverter.byteToInt(rawData[offset]);
118 }
119 }