|
1 |
| -#! /usr/bin/env python |
2 |
| - |
3 | 1 | # This file is part of Scapy
|
4 | 2 | # See http://www.secdev.org/projects/scapy for more information
|
5 | 3 | # Copyright (C) Nils Weiss <[email protected]>
|
|
11 | 9 |
|
12 | 10 | from scapy.packet import Packet, bind_layers
|
13 | 11 | from scapy.fields import ByteField, ShortField, ByteEnumField, X3BytesField, \
|
14 |
| - StrField |
| 12 | + StrField, StrFixedLenField, LEIntField, LEThreeBytesField, PacketListField |
15 | 13 | from scapy.contrib.automotive.uds import UDS, UDS_RDBI, UDS_DSC, UDS_IOCBI, \
|
16 |
| - UDS_RC, UDS_RD, UDS_RSDBI |
| 14 | + UDS_RC, UDS_RD, UDS_RSDBI, UDS_RDBIPR |
17 | 15 |
|
18 | 16 |
|
19 | 17 | BMW_specific_enum = {
|
@@ -245,6 +243,111 @@ class UDS2S_REQ(Packet):
|
245 | 243 | UDS.services[0xa5] = 'UnpackDS2Service'
|
246 | 244 |
|
247 | 245 |
|
| 246 | +class SVK_DateField(LEThreeBytesField): |
| 247 | + def i2repr(self, pkt, x): |
| 248 | + x = self.addfield(pkt, b"", x) |
| 249 | + return "%02X.%02X.20%02X" % (x[0], x[1], x[2]) |
| 250 | + |
| 251 | + |
| 252 | +class SVK_Entry(Packet): |
| 253 | + fields_desc = [ |
| 254 | + ByteEnumField("processClass", 0, {1: "HWEL", 2: "HWAP", 4: "GWTB", |
| 255 | + 5: "CAFD", 6: "BTLD", 7: "FLSL", |
| 256 | + 8: "SWFL"}), |
| 257 | + StrFixedLenField("svk_id", b"", length=4), |
| 258 | + ByteField("mainVersion", 0), |
| 259 | + ByteField("subVersion", 0), |
| 260 | + ByteField("patchVersion", 0)] |
| 261 | + |
| 262 | + def extract_padding(self, p): |
| 263 | + return b"", p |
| 264 | + |
| 265 | + |
| 266 | +class SVK(Packet): |
| 267 | + prog_status_enum = { |
| 268 | + 1: "signature check and programming-dependencies check passed", |
| 269 | + 2: "software entry invalid or programming-dependencies check failed", |
| 270 | + 3: "software entry incompatible to hardware entry", |
| 271 | + 4: "software entry incompatible with other software entry"} |
| 272 | + |
| 273 | + fields_desc = [ |
| 274 | + ByteEnumField("prog_status1", 0, prog_status_enum), |
| 275 | + ByteEnumField("prog_status2", 0, prog_status_enum), |
| 276 | + ShortField("entries_count", 0), |
| 277 | + SVK_DateField("prog_date", b'\x00\x00\x00'), |
| 278 | + ByteField("pad1", 0), |
| 279 | + LEIntField("prog_milage", 0), |
| 280 | + StrFixedLenField("pad2", 0, length=5), |
| 281 | + PacketListField("entries", [], cls=SVK_Entry, |
| 282 | + count_from=lambda x: x.entries_count)] |
| 283 | + |
| 284 | + |
| 285 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf101) |
| 286 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf102) |
| 287 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf103) |
| 288 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf104) |
| 289 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf105) |
| 290 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf106) |
| 291 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf107) |
| 292 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf108) |
| 293 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf109) |
| 294 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf10a) |
| 295 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf10b) |
| 296 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf10c) |
| 297 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf10d) |
| 298 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf10e) |
| 299 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf10f) |
| 300 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf110) |
| 301 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf111) |
| 302 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf112) |
| 303 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf113) |
| 304 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf114) |
| 305 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf115) |
| 306 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf116) |
| 307 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf117) |
| 308 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf118) |
| 309 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf119) |
| 310 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf11a) |
| 311 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf11b) |
| 312 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf11c) |
| 313 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf11d) |
| 314 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf11e) |
| 315 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf11f) |
| 316 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf120) |
| 317 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf121) |
| 318 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf122) |
| 319 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf123) |
| 320 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf124) |
| 321 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf125) |
| 322 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf126) |
| 323 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf127) |
| 324 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf128) |
| 325 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf129) |
| 326 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf12a) |
| 327 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf12b) |
| 328 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf12c) |
| 329 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf12d) |
| 330 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf12e) |
| 331 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf12f) |
| 332 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf130) |
| 333 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf131) |
| 334 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf132) |
| 335 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf133) |
| 336 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf134) |
| 337 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf135) |
| 338 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf136) |
| 339 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf137) |
| 340 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf138) |
| 341 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf139) |
| 342 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf13a) |
| 343 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf13b) |
| 344 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf13c) |
| 345 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf13d) |
| 346 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf13e) |
| 347 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf13f) |
| 348 | +bind_layers(UDS_RDBIPR, SVK, dataIdentifier=0xf140) |
| 349 | + |
| 350 | + |
248 | 351 | UDS_RDBI.dataIdentifiers[0x0014] = "RDBCI_IS_LESEN_DETAIL_REQ"
|
249 | 352 | UDS_RDBI.dataIdentifiers[0x0015] = "RDBCI_HS_LESEN_DETAIL_REQ"
|
250 | 353 | UDS_RDBI.dataIdentifiers[0x0e80] = "AirbagLock"
|
|
0 commit comments