From fd203026047d28fe16b24158a3200602a2579504 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20M=C3=BCltin?= Date: Tue, 29 Nov 2016 18:46:42 +0800 Subject: [PATCH] - added signature creation when sending MeteringReceiptReq during DC charging - added a fix that prevents a NullPointerException in case MeterInfo element is not present when checked on SECC while processing MeteringReceiptReq --- .../evcc/states/WaitForCurrentDemandRes.java | 14 ++++++++++ .../secc/states/WaitForCurrentDemandReq.java | 1 + .../states/WaitForMeteringReceiptReq.java | 27 +++++++++++++------ 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/RISE-V2G-EVCC/src/main/java/org/eclipse/risev2g/evcc/states/WaitForCurrentDemandRes.java b/RISE-V2G-EVCC/src/main/java/org/eclipse/risev2g/evcc/states/WaitForCurrentDemandRes.java index 67ef591..e822a46 100644 --- a/RISE-V2G-EVCC/src/main/java/org/eclipse/risev2g/evcc/states/WaitForCurrentDemandRes.java +++ b/RISE-V2G-EVCC/src/main/java/org/eclipse/risev2g/evcc/states/WaitForCurrentDemandRes.java @@ -11,9 +11,11 @@ package org.eclipse.risev2g.evcc.states; import org.eclipse.risev2g.evcc.session.V2GCommunicationSessionEVCC; +import org.eclipse.risev2g.shared.enumerations.GlobalValues; import org.eclipse.risev2g.shared.enumerations.V2GMessages; import org.eclipse.risev2g.shared.messageHandling.ReactionToIncomingMessage; import org.eclipse.risev2g.shared.messageHandling.TerminateSession; +import org.eclipse.risev2g.shared.utils.SecurityUtils; import org.eclipse.risev2g.shared.v2gMessages.msgDef.ChargeProgressType; import org.eclipse.risev2g.shared.v2gMessages.msgDef.CurrentDemandResType; import org.eclipse.risev2g.shared.v2gMessages.msgDef.DCEVSEStatusType; @@ -47,6 +49,18 @@ public class WaitForCurrentDemandRes extends ClientState { meteringReceiptReq.setMeterInfo(currentDemandRes.getMeterInfo()); meteringReceiptReq.setSAScheduleTupleID(currentDemandRes.getSAScheduleTupleID()); meteringReceiptReq.setSessionID(getCommSessionContext().getSessionID()); + + // Set xml reference element + getXMLSignatureRefElements().put(meteringReceiptReq.getId(), SecurityUtils.generateDigest(meteringReceiptReq, false)); + + // Set signing private key + setSignaturePrivateKey(SecurityUtils.getPrivateKey( + SecurityUtils.getKeyStore( + GlobalValues.EVCC_KEYSTORE_FILEPATH.toString(), + GlobalValues.PASSPHRASE_FOR_CERTIFICATES_AND_KEYS.toString()), + GlobalValues.ALIAS_CONTRACT_CERTIFICATE.toString()) + ); + return getSendMessage(meteringReceiptReq, V2GMessages.METERING_RECEIPT_RES); } diff --git a/RISE-V2G-SECC/src/main/java/org/eclipse/risev2g/secc/states/WaitForCurrentDemandReq.java b/RISE-V2G-SECC/src/main/java/org/eclipse/risev2g/secc/states/WaitForCurrentDemandReq.java index 170ea18..e1dd203 100644 --- a/RISE-V2G-SECC/src/main/java/org/eclipse/risev2g/secc/states/WaitForCurrentDemandReq.java +++ b/RISE-V2G-SECC/src/main/java/org/eclipse/risev2g/secc/states/WaitForCurrentDemandReq.java @@ -56,6 +56,7 @@ public class WaitForCurrentDemandReq extends ServerState { currentDemandRes.setEVSEPresentCurrent(evseController.getPresentCurrent()); currentDemandRes.setEVSEPresentVoltage(evseController.getPresentVoltage()); currentDemandRes.setMeterInfo(evseController.getMeterInfo()); + getCommSessionContext().setSentMeterInfo(evseController.getMeterInfo()); currentDemandRes.setSAScheduleTupleID(getCommSessionContext().getChosenSAScheduleTuple()); // TODO how to determine if a receipt is required or not? diff --git a/RISE-V2G-SECC/src/main/java/org/eclipse/risev2g/secc/states/WaitForMeteringReceiptReq.java b/RISE-V2G-SECC/src/main/java/org/eclipse/risev2g/secc/states/WaitForMeteringReceiptReq.java index 02c0dbc..b58efe1 100644 --- a/RISE-V2G-SECC/src/main/java/org/eclipse/risev2g/secc/states/WaitForMeteringReceiptReq.java +++ b/RISE-V2G-SECC/src/main/java/org/eclipse/risev2g/secc/states/WaitForMeteringReceiptReq.java @@ -77,6 +77,8 @@ public class WaitForMeteringReceiptReq extends ServerState { .getAllowedRequests().add(V2GMessages.POWER_DELIVERY_REQ); ((ForkState) getCommSessionContext().getStates().get(V2GMessages.FORK)) .getAllowedRequests().add(V2GMessages.CHARGING_STATUS_REQ); + ((ForkState) getCommSessionContext().getStates().get(V2GMessages.FORK)) + .getAllowedRequests().add(V2GMessages.CURRENT_DEMAND_REQ); return getSendMessage(meteringReceiptRes, V2GMessages.FORK); } else { @@ -115,13 +117,22 @@ public class WaitForMeteringReceiptReq extends ServerState { } - private boolean meterInfoEquals(MeterInfoType sentMeterInfo, MeterInfoType receivedMeterInfo) { - // Only meterID is mandatory field, thus check for null values as well - if (!sentMeterInfo.getMeterID().equals(receivedMeterInfo.getMeterID()) || - (sentMeterInfo.getMeterReading() != null && !sentMeterInfo.getMeterReading().equals(receivedMeterInfo.getMeterReading())) || - (sentMeterInfo.getMeterStatus() != null && !sentMeterInfo.getMeterStatus().equals(receivedMeterInfo.getMeterStatus())) || - (sentMeterInfo.getSigMeterReading() != null && !Arrays.equals(sentMeterInfo.getSigMeterReading(), receivedMeterInfo.getSigMeterReading())) || - (sentMeterInfo.getTMeter() != null && !sentMeterInfo.getTMeter().equals(receivedMeterInfo.getTMeter()))) return false; - else return true; + private boolean meterInfoEquals(MeterInfoType meterInfoSentBySECC, MeterInfoType meterInfoReceivedFromEVCC) { + if (meterInfoSentBySECC == null) { + getLogger().error("MeterInfo sent by SECC is not saved in session context, value is null"); + return false; + } else if (meterInfoReceivedFromEVCC == null) { + getLogger().error("MeterInfo received from EVCC is null"); + return false; + } else { + // Only meterID is mandatory field, thus check for null values as well + if (!meterInfoSentBySECC.getMeterID().equals(meterInfoReceivedFromEVCC.getMeterID()) || + (meterInfoSentBySECC.getMeterReading() != null && !meterInfoSentBySECC.getMeterReading().equals(meterInfoReceivedFromEVCC.getMeterReading())) || + (meterInfoSentBySECC.getMeterStatus() != null && !meterInfoSentBySECC.getMeterStatus().equals(meterInfoReceivedFromEVCC.getMeterStatus())) || + (meterInfoSentBySECC.getSigMeterReading() != null && !Arrays.equals(meterInfoSentBySECC.getSigMeterReading(), meterInfoReceivedFromEVCC.getSigMeterReading())) || + (meterInfoSentBySECC.getTMeter() != null && !meterInfoSentBySECC.getTMeter().equals(meterInfoReceivedFromEVCC.getTMeter())) + ) return false; + else return true; + } } } \ No newline at end of file