blob: 1d19578837c8aec23d52fb27bae217bd1fbd7865 [file] [log] [blame]
Ray Milkey967776a2015-10-07 14:37:17 -07001/*
Brian O'Connor4e33be22017-08-03 22:45:46 -07002 * Copyright 2015-present Open Networking Foundation
Ray Milkey967776a2015-10-07 14:37:17 -07003 *
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 */
Matteo Scandolocf847b82019-04-26 15:00:00 -070016package org.opencord.aaa.impl;
Ray Milkey967776a2015-10-07 14:37:17 -070017
pier99c6d1d2020-02-13 14:39:55 +010018import com.google.common.collect.Lists;
Ray Milkey967776a2015-10-07 14:37:17 -070019import org.onlab.packet.BasePacket;
20import org.onlab.packet.EAP;
21import org.onlab.packet.EAPOL;
22import org.onlab.packet.EthType;
23import org.onlab.packet.Ethernet;
Amit Ghoshf739be52017-09-21 15:49:37 +010024import org.onlab.packet.Ip4Address;
Ray Milkey967776a2015-10-07 14:37:17 -070025import org.onlab.packet.MacAddress;
Amit Ghoshf739be52017-09-21 15:49:37 +010026import org.onlab.packet.VlanId;
kartikey dubeye1545422019-05-22 12:53:45 +000027import org.onosproject.cfg.ComponentConfigService;
28import org.onosproject.cfg.ConfigProperty;
Amit Ghoshf739be52017-09-21 15:49:37 +010029import org.onosproject.net.Annotations;
30import org.onosproject.net.device.DeviceServiceAdapter;
31import org.onosproject.net.ConnectPoint;
32import org.onosproject.net.Element;
33import org.onosproject.net.Port;
34import org.onosproject.net.PortNumber;
Ray Milkey967776a2015-10-07 14:37:17 -070035import org.onosproject.net.packet.DefaultInboundPacket;
36import org.onosproject.net.packet.DefaultPacketContext;
37import org.onosproject.net.packet.InboundPacket;
38import org.onosproject.net.packet.OutboundPacket;
39import org.onosproject.net.packet.PacketContext;
40import org.onosproject.net.packet.PacketProcessor;
41import org.onosproject.net.packet.PacketServiceAdapter;
42
Gamze Abaka1cfdb192018-10-25 11:39:19 +000043import org.opencord.sadis.BandwidthProfileInformation;
44import org.opencord.sadis.BaseInformationService;
45import org.opencord.sadis.SadisService;
Amit Ghoshf739be52017-09-21 15:49:37 +010046import org.opencord.sadis.SubscriberAndDeviceInformation;
pier99c6d1d2020-02-13 14:39:55 +010047import org.opencord.sadis.UniTagInformation;
kartikey dubeye1545422019-05-22 12:53:45 +000048import org.osgi.framework.Bundle;
49import org.osgi.framework.BundleContext;
50import org.osgi.framework.ServiceReference;
51import org.osgi.service.component.ComponentContext;
52import org.osgi.service.component.ComponentInstance;
Amit Ghoshf739be52017-09-21 15:49:37 +010053
Jonathan Hart092dfb22015-11-16 23:05:21 -080054import java.nio.ByteBuffer;
55import java.security.MessageDigest;
kartikey dubeye1545422019-05-22 12:53:45 +000056import java.util.Dictionary;
57import java.util.Hashtable;
Jonathan Hart092dfb22015-11-16 23:05:21 -080058import java.util.LinkedList;
59import java.util.List;
Amit Ghoshf739be52017-09-21 15:49:37 +010060import java.util.Set;
Jonathan Hart092dfb22015-11-16 23:05:21 -080061
Ray Milkey967776a2015-10-07 14:37:17 -070062import static org.hamcrest.Matchers.instanceOf;
63import static org.hamcrest.Matchers.is;
64import static org.hamcrest.Matchers.notNullValue;
65import static org.junit.Assert.assertThat;
66import static org.junit.Assert.fail;
67import static org.onosproject.net.NetTestTools.connectPoint;
68
69/**
70 * Common methods for AAA app testing.
71 */
Jonathan Hart092dfb22015-11-16 23:05:21 -080072public class AaaTestBase {
Ray Milkey967776a2015-10-07 14:37:17 -070073
74 MacAddress clientMac = MacAddress.valueOf("1a:1a:1a:1a:1a:1a");
75 MacAddress serverMac = MacAddress.valueOf("2a:2a:2a:2a:2a:2a");
76
77 // Our session id will be the device ID ("of:1") with the port ("1") concatenated
78 static final String SESSION_ID = "of:11";
79
80 List<BasePacket> savedPackets = new LinkedList<>();
81 PacketProcessor packetProcessor;
82
83 /**
84 * Saves the given packet onto the saved packets list.
85 *
86 * @param packet packet to save
87 */
88 void savePacket(BasePacket packet) {
89 savedPackets.add(packet);
90 }
91
92 /**
93 * Keeps a reference to the PacketProcessor and saves the OutboundPackets.
94 */
95 class MockPacketService extends PacketServiceAdapter {
96
97 @Override
98 public void addProcessor(PacketProcessor processor, int priority) {
99 packetProcessor = processor;
100 }
101
102 @Override
103 public void emit(OutboundPacket packet) {
104 try {
105 Ethernet eth = Ethernet.deserializer().deserialize(packet.data().array(),
106 0, packet.data().array().length);
107 savePacket(eth);
108 } catch (Exception e) {
109 fail(e.getMessage());
110 }
111 }
112 }
kartikey dubeye1545422019-05-22 12:53:45 +0000113 class MockComponentContext implements ComponentContext {
114
115 @Override
116 public Dictionary<String, Object> getProperties() {
117 Dictionary<String, Object> cfgDict = new Hashtable<String, Object>();
118 cfgDict.put("statisticsGenerationEvent", 20);
119 return cfgDict;
120 }
121
122 @Override
123 public Object locateService(String name) {
124 // TODO Auto-generated method stub
125 return null;
126 }
127
128 @Override
129 public Object locateService(String name, ServiceReference reference) {
130 // TODO Auto-generated method stub
131 return null;
132 }
133
134 @Override
135 public Object[] locateServices(String name) {
136 // TODO Auto-generated method stub
137 return null;
138 }
139
140 @Override
141 public BundleContext getBundleContext() {
142 // TODO Auto-generated method stub
143 return null;
144 }
145
146 @Override
147 public Bundle getUsingBundle() {
148 // TODO Auto-generated method stub
149 return null;
150 }
151
152 @Override
153 public ComponentInstance getComponentInstance() {
154 // TODO Auto-generated method stub
155 return null;
156 }
157
158 @Override
159 public void enableComponent(String name) {
160 // TODO Auto-generated method stub
161 }
162
163 @Override
164 public void disableComponent(String name) {
165 // TODO Auto-generated method stub
166 }
167
168 @Override
169 public ServiceReference getServiceReference() {
170 // TODO Auto-generated method stub
171 return null;
172 }
173 }
Ray Milkey967776a2015-10-07 14:37:17 -0700174
175 /**
Amit Ghoshf739be52017-09-21 15:49:37 +0100176 * Mocks the DeviceService.
177 */
178 final class TestDeviceService extends DeviceServiceAdapter {
179 @Override
180 public Port getPort(ConnectPoint cp) {
181 return new MockPort();
182 }
183 }
184 private class MockPort implements Port {
185
186 @Override
187 public boolean isEnabled() {
188 return true;
189 }
190 public long portSpeed() {
191 return 1000;
192 }
193 public Element element() {
194 return null;
195 }
196 public PortNumber number() {
197 return null;
198 }
199 public Annotations annotations() {
200 return new MockAnnotations();
201 }
202 public Type type() {
203 return Port.Type.FIBER;
204 }
205
206 private class MockAnnotations implements Annotations {
207
208 @Override
209 public String value(String val) {
210 return "PON 1/1";
211 }
212 public Set<String> keys() {
213 return null;
214 }
215 }
216 }
217
218 private class MockSubscriberAndDeviceInformation extends SubscriberAndDeviceInformation {
219
pier99c6d1d2020-02-13 14:39:55 +0100220 MockSubscriberAndDeviceInformation(String id, VlanId uniTagMatch, VlanId ctag,
221 VlanId stag, int dsPonPrio, int upPonPrio,
222 int techProfileId, String dsBpId, String usBpId,
223 String nasPortId, String circuitId, MacAddress hardId,
Amit Ghoshf739be52017-09-21 15:49:37 +0100224 Ip4Address ipAddress) {
pier99c6d1d2020-02-13 14:39:55 +0100225 // Builds UniTagInformation
226 UniTagInformation.Builder tagInfoBuilder = new UniTagInformation.Builder();
227 UniTagInformation uniTagInfo = tagInfoBuilder.setUniTagMatch(uniTagMatch)
228 .setPonCTag(ctag)
229 .setPonSTag(stag)
230 .setDsPonCTagPriority(dsPonPrio)
231 .setUsPonSTagPriority(upPonPrio)
232 .setTechnologyProfileId(techProfileId)
233 .setDownstreamBandwidthProfile(dsBpId)
234 .setUpstreamBandwidthProfile(usBpId)
235 .build();
236
Amit Ghoshf739be52017-09-21 15:49:37 +0100237 this.setHardwareIdentifier(hardId);
238 this.setId(id);
239 this.setIPAddress(ipAddress);
Amit Ghoshf739be52017-09-21 15:49:37 +0100240 this.setNasPortId(nasPortId);
241 this.setCircuitId(circuitId);
pier99c6d1d2020-02-13 14:39:55 +0100242 this.setUniTagList(Lists.newArrayList(uniTagInfo));
Amit Ghoshf739be52017-09-21 15:49:37 +0100243 }
244 }
245
Gamze Abaka1cfdb192018-10-25 11:39:19 +0000246 final class MockSadisService implements SadisService {
247
248 @Override
249 public BaseInformationService<SubscriberAndDeviceInformation> getSubscriberInfoService() {
250 return new MockSubService();
251 }
252
253 @Override
254 public BaseInformationService<BandwidthProfileInformation> getBandwidthProfileService() {
255 return null;
256 }
257 }
258
kartikey dubeye1545422019-05-22 12:53:45 +0000259 final class MockCfgService implements ComponentConfigService {
260 @Override
261 public Set<String> getComponentNames() {
262 // TODO Auto-generated method stub
263 return null;
264 }
265
266 @Override
267 public void registerProperties(Class<?> componentClass) {
268 // TODO Auto-generated method stub
269 }
270
271 @Override
272 public void unregisterProperties(Class<?> componentClass, boolean clear) {
273 // TODO Auto-generated method stub
274 }
275
276 @Override
277 public Set<ConfigProperty> getProperties(String componentName) {
278 return null;
279 }
280
281 @Override
282 public void setProperty(String componentName, String name, String value) {
283 // TODO Auto-generated method stub
284 }
285
286 @Override
287 public void preSetProperty(String componentName, String name, String value) {
288 // TODO Auto-generated method stub
289 }
290
291 @Override
292 public void preSetProperty(String componentName, String name, String value, boolean override) {
293 // TODO Auto-generated method stub
294 }
295
296 @Override
297 public void unsetProperty(String componentName, String name) {
298 // TODO Auto-generated method stub
299 }
300
301 @Override
302 public ConfigProperty getProperty(String componentName, String attribute) {
303 return null;
304 }
305
306}
307
Gamze Abaka1cfdb192018-10-25 11:39:19 +0000308 final class MockSubService implements BaseInformationService<SubscriberAndDeviceInformation> {
pier99c6d1d2020-02-13 14:39:55 +0100309 private final VlanId uniTagMatch = VlanId.vlanId((short) 35);
Amit Ghoshf739be52017-09-21 15:49:37 +0100310 private final VlanId clientCtag = VlanId.vlanId((short) 999);
311 private final VlanId clientStag = VlanId.vlanId((short) 111);
pier99c6d1d2020-02-13 14:39:55 +0100312 private final int dsPrio = 0;
313 private final int usPrio = 0;
314 private final int techProfileId = 64;
315 private final String usBpId = "HSIA-US";
316 private final String dsBpId = "HSIA-DS";
Amit Ghoshf739be52017-09-21 15:49:37 +0100317 private final String clientNasPortId = "PON 1/1";
318 private final String clientCircuitId = "CIR-PON 1/1";
319
pier99c6d1d2020-02-13 14:39:55 +0100320
Amit Ghoshf739be52017-09-21 15:49:37 +0100321 MockSubscriberAndDeviceInformation sub =
pier99c6d1d2020-02-13 14:39:55 +0100322 new MockSubscriberAndDeviceInformation(clientNasPortId, uniTagMatch, clientCtag,
323 clientStag, dsPrio, usPrio,
324 techProfileId, dsBpId, usBpId,
325 clientNasPortId, clientCircuitId, null,
326 null);
Amit Ghoshf739be52017-09-21 15:49:37 +0100327 @Override
328 public SubscriberAndDeviceInformation get(String id) {
329
330 return sub;
331
332 }
333
334 @Override
335 public void invalidateAll() {}
336 public void invalidateId(String id) {}
337 public SubscriberAndDeviceInformation getfromCache(String id) {
338 return null;
339 }
340 }
341 /**
Ray Milkey967776a2015-10-07 14:37:17 -0700342 * Mocks the DefaultPacketContext.
343 */
344 final class TestPacketContext extends DefaultPacketContext {
345
Shubham Sharma1ad16632019-11-26 11:09:21 +0000346 TestPacketContext(long time, InboundPacket inPkt,
Ray Milkey967776a2015-10-07 14:37:17 -0700347 OutboundPacket outPkt, boolean block) {
348 super(time, inPkt, outPkt, block);
349 }
350
351 @Override
352 public void send() {
353 // We don't send anything out.
354 }
355 }
356
357 /**
358 * Sends an Ethernet packet to the process method of the Packet Processor.
359 *
360 * @param reply Ethernet packet
361 */
362 void sendPacket(Ethernet reply) {
363 final ByteBuffer byteBuffer = ByteBuffer.wrap(reply.serialize());
364 InboundPacket inPacket = new DefaultInboundPacket(connectPoint("1", 1),
365 reply,
366 byteBuffer);
367
368 PacketContext context = new TestPacketContext(127L, inPacket, null, false);
369 packetProcessor.process(context);
370 }
371
372 /**
373 * Constructs an Ethernet packet containing identification payload.
374 *
375 * @return Ethernet packet
376 */
377 Ethernet constructSupplicantIdentifyPacket(StateMachine stateMachine,
378 byte type,
379 byte id,
380 Ethernet radiusChallenge)
381 throws Exception {
382 Ethernet eth = new Ethernet();
383 eth.setDestinationMACAddress(clientMac.toBytes());
384 eth.setSourceMACAddress(serverMac.toBytes());
385 eth.setEtherType(EthType.EtherType.EAPOL.ethType().toShort());
386 eth.setVlanID((short) 2);
387
388 String username = "testuser";
389 byte[] data = username.getBytes();
390
391
392 if (type == EAP.ATTR_MD5) {
393 String password = "testpassword";
394 EAPOL eapol = (EAPOL) radiusChallenge.getPayload();
395 EAP eap = (EAP) eapol.getPayload();
396
397 byte[] identifier = new byte[password.length() + eap.getData().length];
398
399 identifier[0] = stateMachine.challengeIdentifier();
400 System.arraycopy(password.getBytes(), 0, identifier, 1, password.length());
401 System.arraycopy(eap.getData(), 1, identifier, 1 + password.length(), 16);
402
403 MessageDigest md = MessageDigest.getInstance("MD5");
404 byte[] hash = md.digest(identifier);
405 data = new byte[17];
406 data[0] = (byte) 16;
407 System.arraycopy(hash, 0, data, 1, 16);
408 }
409 EAP eap = new EAP(EAP.RESPONSE, (byte) 1, type,
410 data);
411 eap.setIdentifier(id);
412
413 // eapol header
414 EAPOL eapol = new EAPOL();
415 eapol.setEapolType(EAPOL.EAPOL_PACKET);
416 eapol.setPacketLength(eap.getLength());
417
418 // eap part
419 eapol.setPayload(eap);
420
421 eth.setPayload(eapol);
422 eth.setPad(true);
423 return eth;
424 }
425
426 /**
427 * Constructs an Ethernet packet containing a EAPOL_START Payload.
428 *
429 * @return Ethernet packet
430 */
431 Ethernet constructSupplicantStartPacket() {
432 Ethernet eth = new Ethernet();
433 eth.setDestinationMACAddress(clientMac.toBytes());
434 eth.setSourceMACAddress(serverMac.toBytes());
435 eth.setEtherType(EthType.EtherType.EAPOL.ethType().toShort());
436 eth.setVlanID((short) 2);
437
Shubham Sharma048cc262019-06-19 14:18:50 +0000438 EAP eap = new EAP(EAPOL.EAPOL_START, (byte) 3, EAPOL.EAPOL_START, null);
Ray Milkey967776a2015-10-07 14:37:17 -0700439
440 // eapol header
441 EAPOL eapol = new EAPOL();
442 eapol.setEapolType(EAPOL.EAPOL_START);
443 eapol.setPacketLength(eap.getLength());
444
445 // eap part
446 eapol.setPayload(eap);
447
448 eth.setPayload(eapol);
449 eth.setPad(true);
450 return eth;
451 }
452
453 /**
Shubham Sharma001ae112020-01-28 10:04:01 +0000454 * Constructs an Ethernet packet containing a EAPOL_ASF Payload.
455 *
456 * @return Ethernet packet
457 */
458 Ethernet constructSupplicantAsfPacket() {
459 Ethernet eth = new Ethernet();
460 eth.setDestinationMACAddress(clientMac.toBytes());
461 eth.setSourceMACAddress(serverMac.toBytes());
462 eth.setEtherType(EthType.EtherType.EAPOL.ethType().toShort());
463 eth.setVlanID((short) 2);
464
465 EAP eap = new EAP(EAPOL.EAPOL_START, (byte) 3, EAPOL.EAPOL_START, null);
466
467 // eapol header
468 EAPOL eapol = new EAPOL();
469 eapol.setEapolType(EAPOL.EAPOL_ASF);
470 eapol.setPacketLength(eap.getLength());
471
472 // eap part
473 eapol.setPayload(eap);
474
475 eth.setPayload(eapol);
476 eth.setPad(true);
477 return eth;
478 }
479
480 /**
Ray Milkey967776a2015-10-07 14:37:17 -0700481 * Checks the contents of a RADIUS packet being sent to the RADIUS server.
482 *
483 * @param radiusPacket packet to check
484 * @param code expected code
485 */
Jonathan Hart092dfb22015-11-16 23:05:21 -0800486 void checkRadiusPacket(AaaManager aaaManager, Ethernet radiusPacket, byte code) {
Ray Milkey967776a2015-10-07 14:37:17 -0700487
488 assertThat(radiusPacket.getSourceMAC(),
Jonathan Hart092dfb22015-11-16 23:05:21 -0800489 is(MacAddress.valueOf(aaaManager.nasMacAddress)));
Ray Milkey967776a2015-10-07 14:37:17 -0700490 assertThat(radiusPacket.getDestinationMAC(), is(serverMac));
491
492 assertThat(radiusPacket.getPayload(), instanceOf(EAPOL.class));
493 EAPOL eapol = (EAPOL) radiusPacket.getPayload();
494 assertThat(eapol, notNullValue());
495
496 assertThat(eapol.getEapolType(), is(EAPOL.EAPOL_PACKET));
497 assertThat(eapol.getPayload(), instanceOf(EAP.class));
498 EAP eap = (EAP) eapol.getPayload();
499 assertThat(eap, notNullValue());
500
501 assertThat(eap.getCode(), is(code));
502 }
Shubham Sharmac7aa6202019-12-12 10:19:10 +0000503
504 /**
505 * Constructs an Ethernet packet containing a EAPOL_LOGOFF Payload.
506 *
507 * @return Ethernet packet
508 */
509 Ethernet constructSupplicantLogoffPacket() {
510 Ethernet eth = new Ethernet();
511 eth.setDestinationMACAddress(clientMac.toBytes());
512 eth.setSourceMACAddress(serverMac.toBytes());
513 eth.setEtherType(EthType.EtherType.EAPOL.ethType().toShort());
514 eth.setVlanID((short) 2);
515
516 EAP eap = new EAP(EAPOL.EAPOL_LOGOFF, (byte) 2, EAPOL.EAPOL_LOGOFF, null);
517
518 // eapol header
519 EAPOL eapol = new EAPOL();
520 eapol.setEapolType(EAPOL.EAPOL_LOGOFF);
521 eapol.setPacketLength(eap.getLength());
522
523 // eap part
524 eapol.setPayload(eap);
525
526 eth.setPayload(eapol);
527 eth.setPad(true);
528 return eth;
529 }
530
Ray Milkey967776a2015-10-07 14:37:17 -0700531}