blob: 2085c272d33cdc06496951173a31985a83a6fc19 [file] [log] [blame]
Anjali K K4a694f62018-07-12 19:09:19 +05301/*
2 * Copyright 2017-present Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onlab.packet;
18
19import java.nio.ByteBuffer;
20
21/**
22 * Class representing MKPDU MACSec SAK Use Parameter Set.
23 * IEEE 802.1X Clause 11; Figure 11-10
24 */
25public class EAPOLMkpduMACSecUseParameterSet extends BasePacket implements EAPOLMkpduParameterSet {
26
27 // Various Header Fields
28 private boolean delayProtect = false;
29 private boolean plainTX = false;
30 private boolean plainRX = false;
31 private byte[] latestKI;
32 private int latestKN;
33 private byte latestAN;
34 private int latestLAPN;
35 private boolean latestTX;
36 private boolean latestRX;
37 private byte[] oldKI;
38 private int oldKN;
39 private byte oldAN;
40 private int oldLAPN;
41 private boolean oldTX;
42 private boolean oldRX;
43
44 /* Body Length is fixed in SAK Use Parameter Set.
45 * Still variable kept for de-serialization purpose.
46 * */
47 private short bodyLength;
48
49 // Various constants.
50 public static final short TOTAL_SUPS_BODY_LENGTH = 44;
51 public static final short LATEST_KEY_AN_OFFSET = 6;
52 public static final short OLD_KEY_AN_OFFSET = 2;
53
54 public static final byte LATEST_KEY_RX_MASK = 0x10;
55 public static final byte LATEST_KEY_TX_MASK = 0X20;
56 public static final byte OLD_KEY_RX_MASK = 0x01;
57 public static final byte OLD_KEY_TX_MASK = 0x02;
58 public static final byte KEY_AN_MASK = 0x02;
59 public static final byte PLAIN_TX_MASK = (byte) 0x80;
60 public static final byte PLAIN_RX_MASK = 0x40;
61 public static final byte DELAY_PROTECT_MASK = 0x10;
62 public static final short SUPS_FIXED_PART_TOTAL_SIZE = 44;
63
64 @Override
65 public byte[] serialize() {
66 short length = getTotalLength();
67
68 // Serialize SAK Use Parameter Set. IEEE 802.1x, Figure 11.10
69 ByteBuffer data = ByteBuffer.wrap(new byte[length]);
70
71 /*
72 *Populate fields
73 * Octet 1
74 * */
75 data.put(EAPOLMkpduParameterSet.PARAMETERSET_TYPE_MACSEC_SAK_USE);
76
77 // Octet 2
78 byte octet = 0x00;
79 octet = (byte) ((latestRX) ? octet | LATEST_KEY_RX_MASK : octet & (byte) (~LATEST_KEY_RX_MASK));
80 octet = (byte) ((latestTX) ? octet | LATEST_KEY_TX_MASK : octet & (byte) (~LATEST_KEY_TX_MASK));
81 octet = (byte) ((oldRX) ? octet | OLD_KEY_RX_MASK : octet & (byte) (~OLD_KEY_RX_MASK));
82 octet = (byte) ((oldTX) ? octet | OLD_KEY_TX_MASK : octet & (byte) (~OLD_KEY_TX_MASK));
83 octet |= latestAN << LATEST_KEY_AN_OFFSET;
84 octet |= oldAN << OLD_KEY_AN_OFFSET;
85 data.put(octet);
86
87 // Octet 3
88 octet = 0x00;
89 octet = (byte) ((plainTX) ? octet | (byte) PLAIN_TX_MASK : octet & (byte) (~PLAIN_TX_MASK));
90 octet = (byte) ((plainRX) ? octet | (byte) PLAIN_RX_MASK : octet & (byte) (~PLAIN_RX_MASK));
91 octet = (byte) ((delayProtect) ? octet | DELAY_PROTECT_MASK : octet & (byte) (~DELAY_PROTECT_MASK));
92 length -= EAPOLMkpduParameterSet.BODY_LENGTH_OCTET_OFFSET;
93 octet |= (byte) (length >> BODY_LENGTH_MSB_SHIFT & BODY_LENGTH_MSB_MASK);
94 data.put(octet);
95
96 // Octet 4
97 data.put((byte) length);
98
99 // Latest & Old Key Server Details
100 data.put(latestKI);
101 data.putInt(latestKN);
102 data.putInt(latestLAPN);
103 data.put(oldKI);
104 data.putInt(oldKN);
105 data.putInt(oldLAPN);
106
107 return data.array();
108 }
109
110 /**
111 * Deserializer function for MACSec SAK Use Parameter Set.
112 *
113 * @return deserializer function
114 */
115 public static Deserializer<EAPOLMkpduMACSecUseParameterSet> deserializer() {
116 return (data, offset, length) -> {
117
118 // Needed components.
119 final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
120 EAPOLMkpduMACSecUseParameterSet macSecUsePS = new EAPOLMkpduMACSecUseParameterSet();
121
122 /*
123 *Extract fields.
124 *Octet 2
125 **/
126 byte[] mbField = new byte[1];
127 mbField[0] = bb.get();
128 macSecUsePS.setOldRX((mbField[0] & OLD_KEY_RX_MASK) != 0);
129 macSecUsePS.setOldTX((mbField[0] & OLD_KEY_TX_MASK) != 0);
130 macSecUsePS.setLatestRX((mbField[0] & OLD_KEY_RX_MASK) != 0);
131 macSecUsePS.setLatestTX((mbField[0] & OLD_KEY_TX_MASK) != 0);
132 macSecUsePS.setLatestAN((byte) ((mbField[0] >> LATEST_KEY_AN_OFFSET) & KEY_AN_MASK));
133 macSecUsePS.setOldAN((byte) ((mbField[0] >> OLD_KEY_AN_OFFSET) & KEY_AN_MASK));
134
135 // Octet 3 & 4
136 mbField[0] = bb.get();
137 macSecUsePS.setPlainRX((mbField[0] & PLAIN_RX_MASK) != 0);
138 macSecUsePS.setPlainTX((mbField[0] & PLAIN_TX_MASK) != 0);
139 macSecUsePS.setDelayProtect((mbField[0] & DELAY_PROTECT_MASK) != 0);
140
141 short bodyLength = (short) (((short) (mbField[0] & EAPOLMkpduParameterSet.BODY_LENGTH_MSB_MASK))
142 << EAPOLMkpduParameterSet.BODY_LENGTH_MSB_SHIFT);
143 bodyLength |= (short) (bb.get());
144 macSecUsePS.setBodyLength(bodyLength);
145
146 // Latest Key Server details.
147 mbField = new byte[EAPOLMkpduParameterSet.FIELD_MI_LENGTH];
148 bb.get(mbField, 0, EAPOLMkpduParameterSet.FIELD_MI_LENGTH);
149 macSecUsePS.setLatestKI(mbField);
150 macSecUsePS.setLatestKN(bb.getInt());
151 macSecUsePS.setLatestLAPN(bb.getInt());
152
153 // Old Key Server details.
154 mbField = new byte[EAPOLMkpduParameterSet.FIELD_MI_LENGTH];
155 bb.get(mbField, 0, EAPOLMkpduParameterSet.FIELD_MI_LENGTH);
156 macSecUsePS.setOldKI(mbField);
157 macSecUsePS.setOldKN(bb.getInt());
158 macSecUsePS.setOldLAPN(bb.getInt());
159
160 return macSecUsePS;
161 };
162 }
163
164 @Override
165 public byte getParameterSetType() {
166 return PARAMETERSET_TYPE_MACSEC_SAK_USE;
167 }
168
169 @Override
170 public short getTotalLength() {
171 return TOTAL_SUPS_BODY_LENGTH;
172 }
173
174 @Override
175 public short getBodyLength() {
176 return bodyLength;
177 }
178
179 public void setBodyLength(short bodyLength) {
180 this.bodyLength = bodyLength;
181 }
182
183 /**
184 * To set Delay Protect.
185 *
186 * @param delayProtect , type boolean
187 */
188 public void setDelayProtect(boolean delayProtect) {
189 this.delayProtect = delayProtect;
190 }
191
192 /**
193 * To set Plain TX supported or not.
194 *
195 * @param plainTX , type boolean
196 */
197 public void setPlainTX(boolean plainTX) {
198 this.plainTX = plainTX;
199 }
200
201 /**
202 * Plain RX supported or not.
203 *
204 * @param plainRX , type boolean
205 */
206 public void setPlainRX(boolean plainRX) {
207 this.plainRX = plainRX;
208 }
209
210 /**
211 * Lowest Acceptable Packet Number for Latest Key Server.
212 *
213 * @param latestLAPN ,type int
214 */
215 public void setLatestLAPN(int latestLAPN) {
216 this.latestLAPN = latestLAPN;
217 }
218
219 /**
220 * Latest Key Server Association Number.
221 *
222 * @param latestAN , type byte
223 */
224 public void setLatestAN(byte latestAN) {
225 this.latestAN = latestAN;
226 }
227
228 /**
229 * Latest Key Server Identifier.
230 *
231 * @param latestKI ,type byte[]
232 */
233 public void setLatestKI(byte[] latestKI) {
234 this.latestKI = latestKI;
235 }
236
237 /**
238 * Latest Key Server Key Number.
239 *
240 * @param latestKN ,type int
241 */
242 public void setLatestKN(int latestKN) {
243 this.latestKN = latestKN;
244 }
245
246 /**
247 * Latest Key Server used for TX protection.
248 *
249 * @param latestTX ,type boolean
250 */
251 public void setLatestTX(boolean latestTX) {
252 this.latestTX = latestTX;
253 }
254
255 /**
256 * Latest Key Server used for RX protection .
257 *
258 * @param latestRX ,type boolean.
259 */
260 public void setLatestRX(boolean latestRX) {
261 this.latestRX = latestRX;
262 }
263
264 /**
265 * Lowest Acceptable Packet Number for Old Key Server.
266 *
267 * @param oldLAPN , type int
268 */
269 public void setOldLAPN(int oldLAPN) {
270 this.oldLAPN = oldLAPN;
271 }
272
273 /**
274 * Old Key Server Association Number.
275 *
276 * @param oldAN , type byte
277 */
278 public void setOldAN(byte oldAN) {
279 this.oldAN = oldAN;
280 }
281
282 /**
283 * Old Key Server Identifier.
284 *
285 * @param oldKI , type byte[]
286 */
287 public void setOldKI(byte[] oldKI) {
288 this.oldKI = oldKI;
289 }
290
291 /**
292 * Old Key Server Number.
293 *
294 * @param oldKN , type int
295 */
296 public void setOldKN(int oldKN) {
297 this.oldKN = oldKN;
298 }
299
300 /**
301 * Old Key Server used for TX protection.
302 *
303 * @param oldTX ,type boolean
304 */
305 public void setOldTX(boolean oldTX) {
306 this.oldTX = oldTX;
307 }
308
309 /**
310 * Old Key Server used for RX protection.
311 *
312 * @param oldRX , type boolean
313 */
314 public void setOldRX(boolean oldRX) {
315 this.oldRX = oldRX;
316 }
317}