Skip to content

Commit e8bb17b

Browse files
authored
Merge pull request #196 from m-oben/feature/ocpp-security-extensions
Feature/ocpp security extensions
2 parents d633f87 + ce6bad7 commit e8bb17b

File tree

98 files changed

+8673
-12
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+8673
-12
lines changed

ocpp-v1_6-test/src/main/java/eu/chargetime/ocpp/test/DummyHandlers.java

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
77
Copyright (C) 2016-2018 Thomas Volden <tv@chargetime.eu>
88
Copyright (C) 2019 Kevin Raddatz <kevin.raddatz@valtech-mobility.com>
9+
Copyright (C) 2022 Mathias Oben <mathias.oben@enervalis.com>
910
1011
Permission is hereby granted, free of charge, to any person obtaining a copy
1112
of this software and associated documentation files (the "Software"), to deal
@@ -29,6 +30,7 @@ of this software and associated documentation files (the "Software"), to deal
2930
import eu.chargetime.ocpp.ServerEvents;
3031
import eu.chargetime.ocpp.feature.profile.ServerCoreEventHandler;
3132
import eu.chargetime.ocpp.feature.profile.ServerFirmwareManagementEventHandler;
33+
import eu.chargetime.ocpp.feature.profile.securityext.ServerSecurityExtEventHandler;
3234
import eu.chargetime.ocpp.model.Confirmation;
3335
import eu.chargetime.ocpp.model.Request;
3436
import eu.chargetime.ocpp.model.SessionInformation;
@@ -37,6 +39,9 @@ of this software and associated documentation files (the "Software"), to deal
3739
import eu.chargetime.ocpp.model.firmware.DiagnosticsStatusNotificationRequest;
3840
import eu.chargetime.ocpp.model.firmware.FirmwareStatusNotificationConfirmation;
3941
import eu.chargetime.ocpp.model.firmware.FirmwareStatusNotificationRequest;
42+
import eu.chargetime.ocpp.model.securityext.*;
43+
import eu.chargetime.ocpp.model.securityext.types.GenericStatusEnumType;
44+
4045
import java.lang.reflect.Type;
4146
import java.time.ZonedDateTime;
4247
import java.util.UUID;
@@ -160,6 +165,39 @@ public FirmwareStatusNotificationConfirmation handleFirmwareStatusNotificationRe
160165
};
161166
}
162167

168+
public ServerSecurityExtEventHandler createServerSecurityExtEventHandler() {
169+
return new ServerSecurityExtEventHandler() {
170+
171+
@Override
172+
public LogStatusNotificationConfirmation handleLogStatusNotificationRequest(UUID sessionIndex, LogStatusNotificationRequest request) {
173+
receivedRequest = request;
174+
LogStatusNotificationConfirmation confirmation = new LogStatusNotificationConfirmation();
175+
return failurePoint(confirmation);
176+
}
177+
178+
@Override
179+
public SecurityEventNotificationConfirmation handleSecurityEventNotificationRequest(UUID sessionIndex, SecurityEventNotificationRequest request) {
180+
receivedRequest = request;
181+
SecurityEventNotificationConfirmation confirmation = new SecurityEventNotificationConfirmation();
182+
return failurePoint(confirmation);
183+
}
184+
185+
@Override
186+
public SignCertificateConfirmation handleSignCertificateRequest(UUID sessionIndex, SignCertificateRequest request) {
187+
receivedRequest = request;
188+
SignCertificateConfirmation confirmation = new SignCertificateConfirmation(GenericStatusEnumType.Accepted);
189+
return failurePoint(confirmation);
190+
}
191+
192+
@Override
193+
public SignedFirmwareStatusNotificationConfirmation handleSignedFirmwareStatusNotificationRequest(UUID sessionIndex, SignedFirmwareStatusNotificationRequest request) {
194+
receivedRequest = request;
195+
SignedFirmwareStatusNotificationConfirmation confirmation = new SignedFirmwareStatusNotificationConfirmation();
196+
return failurePoint(confirmation);
197+
}
198+
};
199+
}
200+
163201
public ServerEvents generateServerEventsHandler() {
164202
return new ServerEvents() {
165203
@Override
@@ -201,9 +239,8 @@ public boolean wasLatestRequest(Type requestType) {
201239
&& requestType.equals(receivedRequest.getClass());
202240
}
203241

204-
public <T extends Request> T getReceivedRequest(T requestType) {
205-
if (wasLatestRequest(requestType.getClass())) return (T) receivedRequest;
206-
return null;
242+
public <T extends Request> T getReceivedRequest(Class<T> clazz) {
243+
return wasLatestRequest(clazz) ? (T) receivedRequest : null;
207244
}
208245

209246
public boolean wasLatestConfirmation(Type confirmationType) {
@@ -212,9 +249,8 @@ public boolean wasLatestConfirmation(Type confirmationType) {
212249
&& confirmationType.equals(receivedConfirmation.getClass());
213250
}
214251

215-
public <T extends Confirmation> T getReceivedConfirmation(T confirmationType) {
216-
if (wasLatestConfirmation(confirmationType.getClass())) return (T) receivedConfirmation;
217-
return null;
252+
public <T extends Confirmation> T getReceivedConfirmation(Class<T> clazz) {
253+
return wasLatestConfirmation(clazz) ? (T) receivedConfirmation : null;
218254
}
219255

220256
public void setRiggedToFail(boolean riggedToFail) {

ocpp-v1_6-test/src/main/java/eu/chargetime/ocpp/test/FakeCentralSystem.java

Lines changed: 108 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
88
Copyright (C) 2016-2018 Thomas Volden
99
Copyright (C) 2019 Kevin Raddatz <kevin.raddatz@valtech-mobility.com>
10+
Copyright (C) 2022 Mathias Oben <mathias.oben@enervalis.com>
1011
1112
Permission is hereby granted, free of charge, to any person obtaining a copy
1213
of this software and associated documentation files (the "Software"), to deal
@@ -31,6 +32,7 @@ of this software and associated documentation files (the "Software"), to deal
3132
import eu.chargetime.ocpp.JSONConfiguration;
3233
import eu.chargetime.ocpp.PropertyConstraintException;
3334
import eu.chargetime.ocpp.feature.profile.*;
35+
import eu.chargetime.ocpp.feature.profile.securityext.ServerSecurityExtProfile;
3436
import eu.chargetime.ocpp.model.Request;
3537
import eu.chargetime.ocpp.model.core.*;
3638
import eu.chargetime.ocpp.model.firmware.*;
@@ -41,6 +43,8 @@ of this software and associated documentation files (the "Software"), to deal
4143
import eu.chargetime.ocpp.model.reservation.CancelReservationRequest;
4244
import eu.chargetime.ocpp.model.reservation.ReserveNowConfirmation;
4345
import eu.chargetime.ocpp.model.reservation.ReserveNowRequest;
46+
import eu.chargetime.ocpp.model.securityext.*;
47+
import eu.chargetime.ocpp.model.securityext.types.*;
4448
import eu.chargetime.ocpp.model.smartcharging.SetChargingProfileConfirmation;
4549
import eu.chargetime.ocpp.model.smartcharging.SetChargingProfileRequest;
4650
import eu.chargetime.ocpp.test.FakeCentral.serverType;
@@ -91,6 +95,11 @@ private void initializeServer() {
9195

9296
ServerReservationProfile serverReservationProfile = new ServerReservationProfile();
9397
server.addFeatureProfile(serverReservationProfile);
98+
99+
ServerSecurityExtProfile serverSecurityExtProfile = new ServerSecurityExtProfile(
100+
dummyHandlers.createServerSecurityExtEventHandler()
101+
);
102+
server.addFeatureProfile(serverSecurityExtProfile);
94103
}
95104

96105
public boolean isClosed() {
@@ -141,7 +150,7 @@ public boolean hasHandledAuthorizeRequest() {
141150
public boolean hasHandledBootNotification(String vendor, String model) {
142151
boolean result = false;
143152
BootNotificationRequest request =
144-
dummyHandlers.getReceivedRequest(new BootNotificationRequest());
153+
dummyHandlers.getReceivedRequest(BootNotificationRequest.class);
145154
if (request != null) {
146155
result = request.getChargePointVendor().equals(vendor);
147156
result &= request.getChargePointModel().equals(model);
@@ -188,7 +197,7 @@ public boolean hasReceivedSetChargingProfileConfirmation() {
188197
public boolean hasReceivedChangeAvailabilityConfirmation(String status) {
189198
boolean result = false;
190199
ChangeAvailabilityConfirmation confirmation =
191-
dummyHandlers.getReceivedConfirmation(new ChangeAvailabilityConfirmation());
200+
dummyHandlers.getReceivedConfirmation(ChangeAvailabilityConfirmation.class);
192201
if (confirmation != null) result = confirmation.getStatus().toString().equals(status);
193202
return result;
194203
}
@@ -279,7 +288,7 @@ public void sendRemoteStartTransactionWithProfileRequest(int connectorId, String
279288
public boolean hasReceivedRemoteStartTransactionConfirmation(String status) {
280289
boolean result = false;
281290
RemoteStartTransactionConfirmation confirmation =
282-
dummyHandlers.getReceivedConfirmation(new RemoteStartTransactionConfirmation());
291+
dummyHandlers.getReceivedConfirmation(RemoteStartTransactionConfirmation.class);
283292
if (confirmation != null) result = confirmation.getStatus().toString().equals(status);
284293
return result;
285294
}
@@ -293,7 +302,7 @@ public void sendRemoteStopTransactionRequest(int transactionId) throws Exception
293302
public boolean hasReceivedRemoteStopTransactionConfirmation(String status) {
294303
boolean result = false;
295304
RemoteStopTransactionConfirmation confirmation =
296-
dummyHandlers.getReceivedConfirmation(new RemoteStopTransactionConfirmation());
305+
dummyHandlers.getReceivedConfirmation(RemoteStopTransactionConfirmation.class);
297306
if (confirmation != null) result = confirmation.getStatus().toString().equals(status);
298307
return result;
299308
}
@@ -348,7 +357,7 @@ public void sendSetChargingProfileRequest(Integer connectorId, ChargingProfile c
348357

349358
public boolean hasReceivedResetConfirmation(String status) {
350359
boolean result = false;
351-
ResetConfirmation confirmation = dummyHandlers.getReceivedConfirmation(new ResetConfirmation());
360+
ResetConfirmation confirmation = dummyHandlers.getReceivedConfirmation(ResetConfirmation.class);
352361
if (confirmation != null) result = confirmation.getStatus().toString().equals(status);
353362
return result;
354363
}
@@ -374,11 +383,104 @@ public void sendUnlockConnectorRequest(int connectorId) throws Exception {
374383
public boolean hasReceivedUnlockConnectorConfirmation(String status) {
375384
boolean result = false;
376385
UnlockConnectorConfirmation confirmation =
377-
dummyHandlers.getReceivedConfirmation(new UnlockConnectorConfirmation());
386+
dummyHandlers.getReceivedConfirmation(UnlockConnectorConfirmation.class);
378387
if (confirmation != null) result = confirmation.getStatus().toString().equals(status);
379388
return result;
380389
}
381390

391+
public void sendCertificateSignedRequest(String certificateChain) throws Exception {
392+
Request request = new CertificateSignedRequest(certificateChain);
393+
send(request);
394+
}
395+
396+
public boolean hasReceivedCertificateSignedConfirmation(String status) {
397+
CertificateSignedConfirmation confirmation =
398+
dummyHandlers.getReceivedConfirmation(CertificateSignedConfirmation.class);
399+
return confirmation != null && confirmation.getStatus().toString().equals(status);
400+
}
401+
402+
public void sendDeleteCertificateRequest(CertificateHashDataType certificateHashDataType) throws Exception {
403+
Request request = new DeleteCertificateRequest(certificateHashDataType);
404+
send(request);
405+
}
406+
407+
public boolean hasReceivedDeleteCertificateConfirmation(String status) {
408+
DeleteCertificateConfirmation confirmation =
409+
dummyHandlers.getReceivedConfirmation(DeleteCertificateConfirmation.class);
410+
return confirmation != null && confirmation.getStatus().toString().equals(status);
411+
}
412+
413+
public void sendExtendedTriggerMessageRequest(MessageTriggerEnumType requestedMessage) throws Exception {
414+
Request request = new ExtendedTriggerMessageRequest(requestedMessage);
415+
send(request);
416+
}
417+
418+
public boolean hasReceivedExtendedTriggerMessageConfirmation(String status) {
419+
ExtendedTriggerMessageConfirmation confirmation =
420+
dummyHandlers.getReceivedConfirmation(ExtendedTriggerMessageConfirmation.class);
421+
return confirmation != null && confirmation.getStatus().toString().equals(status);
422+
}
423+
424+
public void sendGetInstalledCertificateIdsRequest(CertificateUseEnumType certificateType) throws Exception {
425+
Request request = new GetInstalledCertificateIdsRequest(certificateType);
426+
send(request);
427+
}
428+
429+
public boolean hasReceivedGetInstalledCertificateIdsConfirmation(String status) {
430+
GetInstalledCertificateIdsConfirmation confirmation =
431+
dummyHandlers.getReceivedConfirmation(GetInstalledCertificateIdsConfirmation.class);
432+
return confirmation != null && confirmation.getStatus().toString().equals(status);
433+
}
434+
435+
public void sendGetLogRequest(LogEnumType logType, Integer requestId, LogParametersType log) throws Exception {
436+
Request request = new GetLogRequest(logType, requestId, log);
437+
send(request);
438+
}
439+
440+
public boolean hasReceivedGetLogConfirmation(String status) {
441+
GetLogConfirmation confirmation =
442+
dummyHandlers.getReceivedConfirmation(GetLogConfirmation.class);
443+
return confirmation != null && confirmation.getStatus().toString().equals(status);
444+
}
445+
446+
public void sendInstallCertificateRequest(CertificateUseEnumType certificateType, String certificate) throws Exception {
447+
Request request = new InstallCertificateRequest(certificateType, certificate);
448+
send(request);
449+
}
450+
451+
public boolean hasReceivedInstallCertificateConfirmation(String status) {
452+
InstallCertificateConfirmation confirmation =
453+
dummyHandlers.getReceivedConfirmation(InstallCertificateConfirmation.class);
454+
return confirmation != null && confirmation.getStatus().toString().equals(status);
455+
}
456+
457+
public boolean hasHandledLogStatusNotificationRequest() {
458+
return dummyHandlers.wasLatestRequest(LogStatusNotificationRequest.class);
459+
}
460+
461+
public boolean hasHandledSecurityEventNotificationRequest() {
462+
return dummyHandlers.wasLatestRequest(SecurityEventNotificationRequest.class);
463+
}
464+
465+
public boolean hasHandledSignCertificateRequest() {
466+
return dummyHandlers.wasLatestRequest(SignCertificateRequest.class);
467+
}
468+
469+
public boolean hasHandledSignedFirmwareStatusNotificationRequest() {
470+
return dummyHandlers.wasLatestRequest(SignedFirmwareStatusNotificationRequest.class);
471+
}
472+
473+
public void sendSignedUpdateFirmwareRequest(Integer requestId, FirmwareType firmware) throws Exception {
474+
Request request = new SignedUpdateFirmwareRequest(requestId, firmware);
475+
send(request);
476+
}
477+
478+
public boolean hasReceivedSignedUpdateFirmwareConfirmation(String status) {
479+
SignedUpdateFirmwareConfirmation confirmation =
480+
dummyHandlers.getReceivedConfirmation(SignedUpdateFirmwareConfirmation.class);
481+
return confirmation != null && confirmation.getStatus().toString().equals(status);
482+
}
483+
382484
public void rigNextRequestToFail() {
383485
dummyHandlers.setRiggedToFail(true);
384486
}

0 commit comments

Comments
 (0)