1 package org.metricshub.ipmi.core.coding;
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.commands.IpmiVersion;
26 import org.metricshub.ipmi.core.coding.commands.ResponseData;
27 import org.metricshub.ipmi.core.coding.payload.IpmiPayload;
28 import org.metricshub.ipmi.core.coding.payload.lan.IPMIException;
29 import org.metricshub.ipmi.core.coding.protocol.AuthenticationType;
30 import org.metricshub.ipmi.core.coding.protocol.IpmiMessage;
31 import org.metricshub.ipmi.core.coding.protocol.Ipmiv15Message;
32 import org.metricshub.ipmi.core.coding.protocol.Ipmiv20Message;
33 import org.metricshub.ipmi.core.coding.protocol.PayloadType;
34 import org.metricshub.ipmi.core.coding.protocol.encoder.Protocolv20Encoder;
35 import org.metricshub.ipmi.core.coding.security.CipherSuite;
36 import org.metricshub.ipmi.core.coding.security.SecurityConstants;
37
38 import java.security.InvalidKeyException;
39 import java.security.NoSuchAlgorithmException;
40
41
42
43
44 public abstract class PayloadCoder {
45
46 private IpmiVersion ipmiVersion;
47
48
49
50
51 private AuthenticationType authenticationType;
52
53 private CipherSuite cipherSuite;
54
55 public void setIpmiVersion(IpmiVersion ipmiVersion) {
56 this.ipmiVersion = ipmiVersion;
57 }
58
59 public IpmiVersion getIpmiVersion() {
60 return ipmiVersion;
61 }
62
63 public void setAuthenticationType(AuthenticationType authenticationType) {
64 this.authenticationType = authenticationType;
65 }
66
67 public AuthenticationType getAuthenticationType() {
68 return authenticationType;
69 }
70
71 public void setCipherSuite(CipherSuite cipherSuite) {
72 this.cipherSuite = cipherSuite;
73 }
74
75 public CipherSuite getCipherSuite() {
76 return cipherSuite;
77 }
78
79 public PayloadCoder() {
80 setSessionParameters(IpmiVersion.V20, CipherSuite.getEmpty(),
81 AuthenticationType.RMCPPlus);
82 }
83
84 public PayloadCoder(IpmiVersion version, CipherSuite cipherSuite,
85 AuthenticationType authenticationType) {
86 setSessionParameters(version, cipherSuite, authenticationType);
87 }
88
89
90
91
92
93
94
95
96
97
98
99
100 public void setSessionParameters(IpmiVersion version,
101 CipherSuite cipherSuite, AuthenticationType authenticationType) {
102
103 if (version == IpmiVersion.V20
104 && authenticationType != AuthenticationType.RMCPPlus) {
105 throw new IllegalArgumentException(
106 "Authentication Type must be RMCPPlus for IPMI v2.0 messages");
107 }
108
109 setIpmiVersion(version);
110 setAuthenticationType(authenticationType);
111 setCipherSuite(cipherSuite);
112 }
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 public IpmiMessage encodePayload(int messageSequenceNumber, int sessionSequenceNumber, int sessionId) throws NoSuchAlgorithmException, InvalidKeyException {
136 if (getIpmiVersion() == IpmiVersion.V15) {
137 return encodeV15Payload(messageSequenceNumber, sessionSequenceNumber, sessionId);
138 } else {
139 return encodeV20Payload(messageSequenceNumber, sessionSequenceNumber, sessionId);
140 }
141 }
142
143 private Ipmiv15Message encodeV15Payload(int messageSequenceNumber, int sessionSequenceNumber, int sessionId) throws NoSuchAlgorithmException, InvalidKeyException {
144 Ipmiv15Message message = new Ipmiv15Message();
145
146 message.setAuthenticationType(getAuthenticationType());
147
148 message.setSessionID(sessionId);
149
150 message.setSessionSequenceNumber(sessionSequenceNumber);
151
152 message.setPayload(preparePayload(messageSequenceNumber));
153
154 return message;
155 }
156
157 private Ipmiv20Message encodeV20Payload(int messageSequenceNumber, int sessionSequenceNumber, int sessionId) throws NoSuchAlgorithmException, InvalidKeyException {
158 Ipmiv20Message message = new Ipmiv20Message(getCipherSuite()
159 .getConfidentialityAlgorithm());
160
161 message.setAuthenticationType(getAuthenticationType());
162
163 message.setSessionID(sessionId);
164
165 message.setSessionSequenceNumber(sessionSequenceNumber);
166
167 message.setPayloadType(getSupportedPayloadType());
168
169 message.setPayloadAuthenticated(getCipherSuite()
170 .getIntegrityAlgorithm().getCode() != SecurityConstants.IA_NONE);
171
172 message.setPayloadEncrypted(getCipherSuite()
173 .getConfidentialityAlgorithm().getCode() != SecurityConstants.CA_NONE);
174
175 message.setPayload(preparePayload(messageSequenceNumber));
176
177 message.setAuthCode(getCipherSuite()
178 .getIntegrityAlgorithm()
179 .generateAuthCode(message.getIntegrityAlgorithmBase(new Protocolv20Encoder())));
180
181 return message;
182 }
183
184 public abstract PayloadType getSupportedPayloadType();
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199 protected abstract IpmiPayload preparePayload(int sequenceNumber) throws NoSuchAlgorithmException, InvalidKeyException;
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218 public abstract ResponseData getResponseData(IpmiMessage message) throws IPMIException, NoSuchAlgorithmException, InvalidKeyException;
219
220 }