Преглед на файлове

- 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

Marc Mültin преди 9 години
родител
ревизия
fd20302604

+ 14 - 0
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);
 			}
 				

+ 1 - 0
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?

+ 19 - 8
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;
+		}
 	}
 }