Skip to content

Commit 10996e2

Browse files
authored
Add security enhancement for OCPP 1.6
This commit adds support for the security enhancements in OCPP 1.6 as defined by the OCA[0] [0]: https://www.openchargealliance.org/news/enhanced-security-for-ocpp-16/
1 parent 41d4a16 commit 10996e2

26 files changed

+927
-1
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,6 @@ venv.bak/
105105
.mypy_cache/
106106

107107
.idea/*
108+
109+
### OSX ###
110+
*.DS_Store

ocpp/v16/call.py

+71
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
Reason,
1414
ResetType,
1515
UpdateType,
16+
CertificateUse,
17+
Log,
18+
UploadLogStatus,
1619
)
1720

1821
# Most types of CALL messages can originate from only 1 source, either
@@ -38,6 +41,11 @@ class CancelReservationPayload:
3841
reservation_id: int
3942

4043

44+
@dataclass
45+
class CertificateSignedPayload:
46+
certificate_chain: str
47+
48+
4149
@dataclass
4250
class ChangeAvailabilityPayload:
4351
connector_id: int
@@ -63,6 +71,17 @@ class ClearChargingProfilePayload:
6371
stack_level: Optional[int] = None
6472

6573

74+
@dataclass
75+
class DeleteCertificatePayload:
76+
certificate_hash_data: Dict
77+
78+
79+
@dataclass
80+
class ExtendedTriggerMessagePayload:
81+
requested_message: MessageTrigger
82+
connector_id: Optional[int] = None
83+
84+
6685
@dataclass
6786
class GetCompositeSchedulePayload:
6887
connector_id: int
@@ -84,11 +103,31 @@ class GetDiagnosticsPayload:
84103
stop_time: Optional[str] = None
85104

86105

106+
@dataclass
107+
class GetInstalledCertificateIdsPayload:
108+
certificate_type: CertificateUse
109+
110+
87111
@dataclass
88112
class GetLocalListVersionPayload:
89113
pass
90114

91115

116+
@dataclass
117+
class GetLogPayload:
118+
log: Dict
119+
log_type: Log
120+
request_id: int
121+
retries: Optional[int] = None
122+
retry_interval: Optional[int] = None
123+
124+
125+
@dataclass
126+
class InstallCertificatePayload:
127+
certificate_type: CertificateUse
128+
certificate: str
129+
130+
92131
@dataclass
93132
class RemoteStartTransactionPayload:
94133
id_tag: str
@@ -128,6 +167,14 @@ class SetChargingProfilePayload:
128167
cs_charging_profiles: Dict
129168

130169

170+
@dataclass
171+
class SignedUpdateFirmwarePayload:
172+
request_id: int
173+
firmware: Dict
174+
retries: Optional[int] = None
175+
retry_interval: Optional[int] = None
176+
177+
131178
@dataclass
132179
class TriggerMessagePayload:
133180
requested_message: MessageTrigger
@@ -183,13 +230,37 @@ class HeartbeatPayload:
183230
pass
184231

185232

233+
@dataclass
234+
class LogStatusNotificationPayload:
235+
status: UploadLogStatus
236+
request_id: int
237+
238+
186239
@dataclass
187240
class MeterValuesPayload:
188241
connector_id: int
189242
meter_value: List = field(default_factory=list)
190243
transaction_id: Optional[int] = None
191244

192245

246+
@dataclass
247+
class SecurityEventNotificationPayload:
248+
type: str
249+
timestamp: str
250+
tech_info: Optional[str]
251+
252+
253+
@dataclass
254+
class SignCertificatePayload:
255+
csr: str
256+
257+
258+
@dataclass
259+
class SignedFirmwareStatusNotificationPayload:
260+
status: FirmwareStatus
261+
request_id: int
262+
263+
193264
@dataclass
194265
class StartTransactionPayload:
195266
connector_id: int

ocpp/v16/call_result.py

+64
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@
1616
TriggerMessageStatus,
1717
UpdateStatus,
1818
UnlockStatus,
19+
CertificateSignedStatus,
20+
CertificateStatus,
21+
DeleteCertificateStatus,
22+
GenericStatus,
23+
GetInstalledCertificateStatus,
24+
LogStatus,
25+
UpdateFirmwareStatus
1926
)
2027

2128
# Most types of CALLRESULT messages can originate from only 1 source, either
@@ -63,6 +70,21 @@ class HeartbeatPayload:
6370
current_time: str
6471

6572

73+
@dataclass
74+
class LogStatusNotificationPayload:
75+
pass
76+
77+
78+
@dataclass
79+
class SecurityEventNotificationPayload:
80+
pass
81+
82+
83+
@dataclass
84+
class SignCertificatePayload:
85+
status: GenericStatus
86+
87+
6688
@dataclass
6789
class MeterValuesPayload:
6890
pass
@@ -93,6 +115,11 @@ class CancelReservationPayload:
93115
status: CancelReservationStatus
94116

95117

118+
@dataclass
119+
class CertificateSignedPayload:
120+
status: CertificateSignedStatus
121+
122+
96123
@dataclass
97124
class ChangeAvailabilityPayload:
98125
status: AvailabilityStatus
@@ -113,6 +140,22 @@ class ClearChargingProfilePayload:
113140
status: ClearChargingProfileStatus
114141

115142

143+
@dataclass
144+
class DeleteCertificatePayload:
145+
status: DeleteCertificateStatus
146+
147+
148+
@dataclass
149+
class ExtendedTriggerMessagePayload:
150+
status: TriggerMessageStatus
151+
152+
153+
@dataclass
154+
class GetInstalledCertificateIdsPayload:
155+
status: GetInstalledCertificateStatus
156+
certificate_hash_data: Optional[List] = None
157+
158+
116159
@dataclass
117160
class GetCompositeSchedulePayload:
118161
status: GetCompositeScheduleStatus
@@ -137,6 +180,17 @@ class GetLocalListVersionPayload:
137180
list_version: int
138181

139182

183+
@dataclass
184+
class GetLogPayload:
185+
status: LogStatus
186+
filename: Optional[str] = None
187+
188+
189+
@dataclass
190+
class InstallCertificatePayload:
191+
status: CertificateStatus
192+
193+
140194
@dataclass
141195
class RemoteStartTransactionPayload:
142196
status: RemoteStartStopStatus
@@ -167,6 +221,16 @@ class SetChargingProfilePayload:
167221
status: ChargingProfileStatus
168222

169223

224+
@dataclass
225+
class SignedFirmwareStatusNotificationPayload:
226+
pass
227+
228+
229+
@dataclass
230+
class SignedUpdateFirmwarePayload:
231+
status: UpdateFirmwareStatus
232+
233+
170234
@dataclass
171235
class TriggerMessagePayload:
172236
status: TriggerMessageStatus

0 commit comments

Comments
 (0)