From 9752308763767aa231e4f5fbba049e1b295ad564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thoren=20Gr=C3=BCttemeier?= Date: Tue, 2 Apr 2024 13:28:11 +0200 Subject: [PATCH 1/5] fix for calculation of DIN physical value type --- Wireshark/plugins/v2gmsg.lua | 865 ++++++++++++++++++----------------- 1 file changed, 433 insertions(+), 432 deletions(-) diff --git a/Wireshark/plugins/v2gmsg.lua b/Wireshark/plugins/v2gmsg.lua index 0fe2bd3..54d2f70 100644 --- a/Wireshark/plugins/v2gmsg.lua +++ b/Wireshark/plugins/v2gmsg.lua @@ -1,432 +1,433 @@ --- --- Copyright 2024, dSPACE GmbH. All rights reserved. --- --- this plugin adds support for V2G Messages for --- - DIN 70121 --- - ISO 15118-2 --- - ISO 15118-20 --- --- powered by chargebyte cbexigen --- --- See license file (dsV2Gshark_LICENSE.txt) --- -DS_V2GSHARK_VERSION = "1.1.0" -- DO NOT CHANGE - -p_v2gmsg = Proto("v2gmsg","V2G Message") -local p_v2gmsg_info = { - version = DS_V2GSHARK_VERSION, - author = "dSPACE GmbH", - description = "Dissector for V2G Messages (DIN 70121, ISO15118-2, ISO15118-20)" -} -set_plugin_info(p_v2gmsg_info) - --- Load C-Decoder -local v2g_decoder = require('v2gLuaDecoder') -v2g_decoder.initValidator() -local cert_info_extractor = require('v2gX509CertInfos') - --- Settings -p_v2gmsg.prefs["infotext"] = Pref.statictext("dSPACE V2Gshark Wireshark Plugin") -p_v2gmsg.prefs["additionalinfo"] = Pref.statictext("powered by chargebyte cbExiGen") -p_v2gmsg.prefs["additionalinfo2"] = Pref.statictext("") -p_v2gmsg.prefs["portrange_tlssecret"] = Pref.range("TLS secret UDP port(s)", "49152-65535", "UDP source ports of TLS secret disclosure packets.\n\nDefault: '49152-65535'", 65535) -p_v2gmsg.prefs["portrange_v2g"] = Pref.range("V2G message TCP port(s)", "49152-65535", "TCP source ports of V2G request and response messages.\n\nDefault: '49152-65535'", 65535) -p_v2gmsg.prefs["additionalinfo3"] = Pref.statictext("") -p_v2gmsg.prefs["versioninfo"] = Pref.statictext("Version " .. DS_V2GSHARK_VERSION) - --- Buffer for all decoded messages. Maps packetID -> xml string (or nil) -local xml_buffer = {} - -local validation_buffer = {} -- maps packetID -> nil if valid, error string if invalid - --- Buffer to determine the schema -local last_schema_list_SAP_req = {} -- maps schema_ID (given by SAP-Req) to ProtocolNamespace -local decoded_error_code = {} -- maps (decoded) packet number to decode error code (0 = success) -local decoded_with_schema_namespace = {} -- maps (decoded) packet number to ProtocolNamespace that was used -local decoded_with_auto_schema_detection = {} -- maps (decoded) packet number to Boolean -selected_schema_at_packet_nr = {} -- maps packet number of SAP res to ProtocolNamespace. This var is also accessed in the v2gsdp dissector - --- Wireshark: ProtoFields init -local f_entry = ProtoField.string("v2gmsg.entry", " ") -local f_schema = ProtoField.string("v2gmsg.schema", "Schema",base.ASCII) -local f_exi = ProtoField.string("v2gmsg.exi", "EXI", base.ASCII) -local f_xml = ProtoField.string("v2gmsg.xml", "Decoded XML", base.ASCII) -local f_msg = ProtoField.string("v2gmsg.msgname", "Message", base.ASCII) -local f_validation = ProtoField.string("v2gmsg.validation", "Message Validation", base.ASCII) -p_v2gmsg.fields = {f_schema, f_exi, f_msg, f_entry, f_xml, f_validation} - -local MAX_FIELD_STR_LEN = 150 - -local ef_warning_generic = ProtoExpert.new("v2gmsg.warning", "V2G Warning", expert.group.PROTOCOL, expert.severity.WARN) -local ef_warning_validation = ProtoExpert.new("v2gmsg.warning.validation", "V2G-Message validation failed", expert.group.PROTOCOL, expert.severity.WARN) -local ef_error_generic = ProtoExpert.new("v2gmsg.error", "V2G Error", expert.group.UNDECODED, expert.severity.ERROR) -p_v2gmsg.experts = {ef_warning_generic, ef_warning_validation, ef_error_generic} - -local schema_namespace_to_schema_ID = {} -schema_namespace_to_schema_ID["urn:iso:15118:2:2010:AppProtocol"] = "SAP" -schema_namespace_to_schema_ID["urn:din:70121:2012:MsgDef"] = "DIN" -schema_namespace_to_schema_ID["urn:iso:15118:2:2013:MsgDef"] = "ISO-2" -schema_namespace_to_schema_ID["urn:iso:std:iso:15118:-20:CommonMessages"] = "ISO-20 CM" -schema_namespace_to_schema_ID["urn:iso:std:iso:15118:-20:DC"] = "ISO-20 DC" -schema_namespace_to_schema_ID["urn:iso:std:iso:15118:-20:AC"] = "ISO-20 AC" -schema_namespace_to_schema_ID["urn:iso:std:iso:15118:-20:ACDP"] = "ISO-20 ACDP" -schema_namespace_to_schema_ID["urn:iso:std:iso:15118:-20:WPT"] = "ISO-20 WPT" - --- reset everything on init (e.g., if new pcap is opened on same instance) -function p_v2gmsg.init() - xml_buffer = {} - validation_buffer = {} - last_schema_list_SAP_req = {} - selected_schema_at_packet_nr = {} - decoded_with_auto_schema_detection = {} - decoded_with_schema_namespace = {} - decoded_error_code = {} - - -- register v2g ports - DissectorTable.get("tls.port"):add(p_v2gmsg.prefs["portrange_v2g"], p_v2gtp) - DissectorTable.get("tcp.port"):add(p_v2gmsg.prefs["portrange_v2g"], p_v2gtp) -end - -local function decode_v2g_message(schema, exi_string, packet_number) - local xml_out - local xml_schema - - decoded_with_auto_schema_detection[packet_number] = false - xml_out, xml_schema, errn = v2g_decoder.decodeV2GExi(schema, exi_string) - if errn ~= 0 then -- on error use autoprotocol mode - local xml_out_auto, xml_schema_auto - xml_out_auto, xml_schema_auto, errn_auto = v2g_decoder.decodeV2GAuto(exi_string) - if xml_out_auto ~= nil then - decoded_with_auto_schema_detection[packet_number] = true - xml_out = xml_out_auto - xml_schema = xml_schema_auto - errn = errn_auto - end - end - - decoded_with_schema_namespace[packet_number] = xml_schema - decoded_error_code[packet_number] = errn - return xml_out -end - -local function add_expert_info(message, tree, pinfo, expertinfo) - tree:add_proto_expert_info(expertinfo, message) - local oldInfo = tostring(pinfo.cols.info) - if oldInfo:sub(0, 3) ~= "[!]" then - pinfo.cols.info = "[!] " .. oldInfo - end -end - -local function add_xml_table_to_tree(xml_table, tree_out, dissector_field, pinfo) - local new_element - if xml_table.value ~= "" then - - -- special handling for certificates - if xml_table.name == "Certificate" or xml_table.name == "OEMProvisioningCert" then - local cert_element = tree_out:add(dissector_field, xml_table.value) - if string.len(xml_table.value) > 150 then -- cut too long strings - cert_element:set_text(xml_table.name .. ": " .. xml_table.value:sub(0, 150) .. "(...)") - else - cert_element:set_text(xml_table.name .. ": " .. xml_table.value) - end - - local valid, subj, issuer, version, serial, not_before, not_after, sig_algo, sig_value, pk_algo, spk_curve, spk_pub, v3_constraint, v3_constraint_CA, v3_key_usage, v3_key_usage_crit, v3_sk_ID, v3_sk_ID_crit = cert_info_extractor.getX509Infos(xml_table.value) - if valid then - cert_element:add(dissector_field, subj):set_text("Subject: " .. subj) - cert_element:add(dissector_field, issuer):set_text("Issuer: " .. issuer) - cert_element:add(dissector_field, version):set_text("Version: v" .. (version + 1) .. " (" .. version .. ")") -- certificate version is always +1 according to the standard - cert_element:add(dissector_field, serial):set_text("Serial Number: 0x" .. serial) - cert_element:add(dissector_field, not_before):set_text("Not Valid Before: " .. not_before) - cert_element:add(dissector_field, not_after):set_text("Not Valid After: " .. not_after) - cert_element:add(dissector_field, sig_algo):set_text("Signature Algorithm: " .. sig_algo) - cert_element:add(dissector_field, sig_value):set_text("Signature Value: " .. sig_value) - cert_element:add(dissector_field, pk_algo):set_text("Public Key Algorithm: " .. pk_algo) - cert_element:add(dissector_field, spk_curve):set_text("Subject Public Key - Curve: " .. spk_curve) - cert_element:add(dissector_field, spk_pub):set_text("Subject Public Key - RAW: " .. spk_pub) - local x509_v3_element = cert_element:add(dissector_field, "X509v3") - x509_v3_element:set_text("X509v3") - x509_v3_element:add(dissector_field, v3_constraint):set_text("Basic Constraint: " .. v3_constraint) - x509_v3_element:add(dissector_field, v3_constraint_CA):set_text("Basic Constraint CA: " .. v3_constraint_CA) - x509_v3_element:add(dissector_field, v3_key_usage_crit):set_text("Key Usage: " .. v3_key_usage_crit) - x509_v3_element:add(dissector_field, v3_key_usage):set_text("Key Usage: " .. v3_key_usage) - x509_v3_element:add(dissector_field, v3_sk_ID_crit):set_text("Subject Key ID: " .. v3_sk_ID_crit) - x509_v3_element:add(dissector_field, v3_sk_ID):set_text("Subject Key ID: " .. v3_sk_ID) - else - add_expert_info("INVALID CERTIFICATE", cert_element, pinfo, ef_warning_generic) - end - else - new_element = tree_out:add(dissector_field, xml_table.value) - new_element:set_text(xml_table.name .. ": " .. xml_table.value) - end - else - new_element = tree_out:add(dissector_field, xml_table.name) - new_element:set_text(xml_table.name) - end - - -- physical value type (15118-2) - if #xml_table.children == 3 and - xml_table.children[1].name == "Multiplier" and - xml_table.children[2].name == "Unit" and - xml_table.children[3].name == "Value" then - -- 15118-2 physical value type - local calc_value = tonumber(xml_table.children[3].value) * 10 ^ tonumber(xml_table.children[1].value) - - local unit = xml_table.children[2].value - if calc_value > 1000 and (unit == "W" or unit == "Wh") then - unit = "k" .. unit - calc_value = calc_value / 1000 - end - - if unit == "s" then - local h = math.floor(calc_value/3600) - local m = math.floor((calc_value - h * 3600)/ 60) - local s = calc_value % 60 - local appendix - if pcall(function() appendix = string.format(": %02d:%02d:%02d [hh:mm:ss]", h, m, s) end) == false then - appendix = ": ?" - add_expert_info("INVALID FORMAT", new_element, pinfo, ef_warning_generic) - end - new_element:append_text(appendix) - else - local appendix - if pcall(function() appendix = string.format(": %s%s", tostring(calc_value):gsub(",","."), unit) end) == false then - appendix = ": ?" - add_expert_info("INVALID FORMAT", new_element, pinfo, ef_warning_generic) - end - new_element:append_text(appendix) - end - end - -- rational number type (15118-20) - if #xml_table.children == 2 and - xml_table.children[1].name == "Exponent" and - xml_table.children[2].name == "Value" then - -- 15118-2 physical value type - local calc_value = tonumber(xml_table.children[2].value) * 10 ^ tonumber(xml_table.children[1].value) - new_element:append_text(": " .. tostring(calc_value):gsub(",",".")) - end - - if xml_table.attributes ~= "" then - local att_element = new_element:add(dissector_field, xml_table.attributes) - if string.len(xml_table.attributes) > MAX_FIELD_STR_LEN then -- cut too long attributes - xml_table.attributes = xml_table.attributes:sub(0, MAX_FIELD_STR_LEN) .. "(...)" - end - att_element:set_text("[XML Attributes: " .. xml_table.attributes .. "]") - end - - for _, c in ipairs(xml_table.children) do - add_xml_table_to_tree(c, new_element, dissector_field, pinfo) - end -end - -local function parse_XML(xml_string) - local xml_table = {name = "root", attributes = "", parent = nil, children = {}, value = ""} - local current_element = xml_table - - for op, tag, attr, unary, val in string.gmatch(xml_string:gsub("\n",""), "<(%/?)([%w_:-]+)(.-)(%/?)>([^<]*)") do - if op == "/" then - -- close the current element - current_element = current_element.parent - else - -- cut prefix from element name - local clean_name = tag - local prefix_at = tag:find(":") - if prefix_at ~= nil then - clean_name = tag:sub(prefix_at + 1) - end - - -- create new element - local element = {name = clean_name, attributes = attr, parent = current_element, children = {}, value = val} - current_element.children[#current_element.children + 1] = element - if unary ~= "/" then - -- Set the current element to the new element - current_element = element - end - end - end - return xml_table.children[1] -end - -local function process_SAP(data, packet_number) - for sap_type in data:gmatch'<[^:]+:supportedAppProtocol([^ >]+)' do - -- the SAP-req contains a list of protocols from which one is selected in the SAP-Res by the concrete ID - if sap_type == "Req" then - for protocol_entry in data:gmatch'(.-)' do - local proto_namespace = protocol_entry:match'(.-)' - local proto_ID = protocol_entry:match'(.-)' - if proto_namespace ~= nil and proto_ID ~= nil then - last_schema_list_SAP_req[proto_ID] = proto_namespace - -- else: the request is invalid - end - end - elseif sap_type == "Res" and selected_schema_at_packet_nr[packet_number] == nil then - local selected_ID = data:match'(.-)' - if selected_ID ~= nil then - selected_schema_at_packet_nr[packet_number] = last_schema_list_SAP_req[selected_ID] - last_schema_list_SAP_req = {} - -- else: the response is invalid - end - end - end -end - -local function get_message_name(data) - local message_name = data:match'><(.-)[ >]' -- SAP / -20 - - if message_name ~= nil then - local prefix_at = message_name:find(":") -- cut prefix - if prefix_at ~= nil then - message_name = message_name:sub(prefix_at + 1) - end - if message_name == "V2G_Message" then - message_name = data:match'Body><(.-)[/ >]' -- ISO-2/DIN - prefix_at = message_name:find(":") -- cut prefix - if prefix_at ~= nil then - message_name = message_name:sub(prefix_at + 1) - end - end - end - - return message_name -end - --- Dissection function -function p_v2gmsg.dissector(buf, pinfo, root) - pinfo.cols.protocol = "V2GMSG" - pinfo.cols.info = "V2GMESSAGE FAILURE: Unknown error occured" -- default 'INFO'-field - - local subtree = root:add(p_v2gmsg, buf(0)) -- highlights all remaining bytes - - local iso20_warn_tree = subtree:add(f_entry, ""):set_text("WARNING: Preliminary ISO 15118-20 support!") - iso20_warn_tree.hidden = true -- only shown in ISO 15118-20 messages - - local metadata_tree = subtree:add(f_entry, ""):set_text("Metadata") - - local buf_as_hex = buf:bytes():tohex() -- exi as hex string - metadata_tree:add(f_exi, buf_as_hex) - - if not pinfo.visited then - -- this packet has not been decoded yet. Do it now and store the data inside xml_buffer - - -- retrieve schema info - local schema_namespace = pinfo.private["Schema"] - if schema_namespace == nil then -- if no schema is given, use the schema of the last SAP-messages - schema_namespace = "urn:iso:15118:2:2010:AppProtocol" -- use SAP as default schema - local last_closest = 0 - for k, v in pairs(selected_schema_at_packet_nr) do -- note: pairs are not sorted! - if k < pinfo.number and last_closest < k then - schema_namespace = v - last_closest = k - end - end - end - - -- decode exi - local xml_data = decode_v2g_message(schema_namespace, buf_as_hex, pinfo.number) - - if xml_data == nil then - -- decoding failed - pinfo.cols.info = "V2GMSG - Decoding failed" - add_expert_info("Decoding failed! Is the schema and payload-type correct?", subtree, pinfo, ef_error_generic) - return - end - - local message_name = get_message_name(xml_data) - if message_name ~= nil then - -- we only have to set the info field here, everything else will be done on next dissector call - pinfo.cols.info = message_name - - -- store decoded xml - xml_buffer[pinfo.number] = xml_data - - -- resolve & store schema if this is an SAP-msg - process_SAP(xml_data, pinfo.number) - - -- validate XML - local decoded_schema = decoded_with_schema_namespace[pinfo.number] - if decoded_schema ~= nil then - local error_msg = validation_buffer[pinfo.number] - if error_msg == nil then - -- msg not validated yet - local is_valid - is_valid, error_msg = v2g_decoder.validateXml(xml_data, decoded_schema) - if not is_valid then - validation_buffer[pinfo.number] = error_msg - end - end - if validation_buffer[pinfo.number] ~= nil then - add_expert_info("This message is invalid: " .. validation_buffer[pinfo.number]:sub(1,-2), subtree, pinfo, ef_warning_validation) - end - end - end - end - - if pinfo.visited or not gui_enabled() then -- in GUI mode we process the data on the second call for a better performance - -- packet already decoded, get the xml data from the buffer - local xml_data = xml_buffer[pinfo.number] - - if xml_data == nil then - -- decoding failed - pinfo.cols.info = "V2GMSG - Decoding failed" - add_expert_info("Decoding failed! Is the schema and payload-type correct?", subtree, pinfo, ef_error_generic) - return - end - - -- get the message name and write it to the info cols - local message_name = get_message_name(xml_data) - if message_name ~= nil then - pinfo.cols.info = message_name - metadata_tree:add(f_msg, message_name) - - if message_name == "supportedAppProtocolReq" or message_name == "supportedAppProtocolRes" then - -- re-process SAP. This is required in case of a delayed capture start (i.e. SAP-req missed) - if selected_schema_at_packet_nr[pinfo.number] == nil then - process_SAP(xml_data, pinfo.number) - end - end - end - - -- add XML data - ByteArray.tvb(ByteArray.new(xml_data, true), "XML Data"); - metadata_tree:add(f_xml, xml_data) - - local decoded_schema = decoded_with_schema_namespace[pinfo.number] - if decoded_schema ~= nil then - -- check decode error - if decoded_error_code[pinfo.number] ~= 0 then - add_expert_info("Decoding failed (" .. decoded_error_code[pinfo.number] .. ")! The decoded message is partially or completely invalid!", subtree, pinfo, ef_error_generic) - end - - -- add validation error message if available - if validation_buffer[pinfo.number] ~= nil then - validation_tree = metadata_tree:add(f_validation, "Failed! " .. validation_buffer[pinfo.number]:sub(1,-2)) - add_expert_info("This message is invalid: " .. validation_buffer[pinfo.number]:sub(1,-2), validation_tree, pinfo, ef_warning_validation) - else - metadata_tree:add(f_validation, "Successful") - end - - -- add schema_ID to protocol name - local schema_ID = schema_namespace_to_schema_ID[decoded_schema] - if decoded_with_auto_schema_detection[pinfo.number] then - pinfo.cols.protocol = "V2GMSG (" .. schema_ID .. " ?)" - metadata_tree:add(f_schema, "Automatically detected (" .. decoded_schema .. ")") - elseif schema_ID ~= nil then - pinfo.cols.protocol = "V2GMSG (" .. schema_ID .. ")" - metadata_tree:add(f_schema, decoded_schema) - end - if schema_ID:sub(0, 6) == "ISO-20" then - -- show warning for ISO 15118-20 messages. To be removed as soon as the decoder is finalized - iso20_warn_tree.hidden = false - end - - -- parse the xml data and add it to the tree - add_xml_table_to_tree(parse_XML(xml_data), subtree, f_entry, pinfo) - else - iso20_warn_tree.hidden = false -- always show the warning on decode errors - pinfo.cols.protocol = "V2GMSG (Decode Error)" - metadata_tree:add(f_schema, "Decode Error") - metadata_tree:add(f_validation, "Skipped (Decode Error)") - add_expert_info("Decoding failed! The decoded message is partially or completely invalid!", subtree, pinfo, ef_error_generic) - add_xml_table_to_tree(parse_XML(xml_data), subtree, f_entry, pinfo) - end - end -end +-- +-- Copyright 2024, dSPACE GmbH. All rights reserved. +-- +-- this plugin adds support for V2G Messages for +-- - DIN 70121 +-- - ISO 15118-2 +-- - ISO 15118-20 +-- +-- powered by chargebyte cbexigen +-- +-- See license file (dsV2Gshark_LICENSE.txt) +-- +DS_V2GSHARK_VERSION = "1.1.0" -- DO NOT CHANGE + +p_v2gmsg = Proto("v2gmsg","V2G Message") +local p_v2gmsg_info = { + version = DS_V2GSHARK_VERSION, + author = "dSPACE GmbH", + description = "Dissector for V2G Messages (DIN 70121, ISO15118-2, ISO15118-20)" +} +set_plugin_info(p_v2gmsg_info) + +-- Load C-Decoder +local v2g_decoder = require('v2gLuaDecoder') +v2g_decoder.initValidator() +local cert_info_extractor = require('v2gX509CertInfos') + +-- Settings +p_v2gmsg.prefs["infotext"] = Pref.statictext("dSPACE V2Gshark Wireshark Plugin") +p_v2gmsg.prefs["additionalinfo"] = Pref.statictext("powered by chargebyte cbExiGen") +p_v2gmsg.prefs["additionalinfo2"] = Pref.statictext("") +p_v2gmsg.prefs["portrange_tlssecret"] = Pref.range("TLS secret UDP port(s)", "49152-65535", "UDP source ports of TLS secret disclosure packets.\n\nDefault: '49152-65535'", 65535) +p_v2gmsg.prefs["portrange_v2g"] = Pref.range("V2G message TCP port(s)", "49152-65535", "TCP source ports of V2G request and response messages.\n\nDefault: '49152-65535'", 65535) +p_v2gmsg.prefs["additionalinfo3"] = Pref.statictext("") +p_v2gmsg.prefs["versioninfo"] = Pref.statictext("Version " .. DS_V2GSHARK_VERSION) + +-- Buffer for all decoded messages. Maps packetID -> xml string (or nil) +local xml_buffer = {} + +local validation_buffer = {} -- maps packetID -> nil if valid, error string if invalid + +-- Buffer to determine the schema +local last_schema_list_SAP_req = {} -- maps schema_ID (given by SAP-Req) to ProtocolNamespace +local decoded_error_code = {} -- maps (decoded) packet number to decode error code (0 = success) +local decoded_with_schema_namespace = {} -- maps (decoded) packet number to ProtocolNamespace that was used +local decoded_with_auto_schema_detection = {} -- maps (decoded) packet number to Boolean +selected_schema_at_packet_nr = {} -- maps packet number of SAP res to ProtocolNamespace. This var is also accessed in the v2gsdp dissector + +-- Wireshark: ProtoFields init +local f_entry = ProtoField.string("v2gmsg.entry", " ") +local f_schema = ProtoField.string("v2gmsg.schema", "Schema",base.ASCII) +local f_exi = ProtoField.string("v2gmsg.exi", "EXI", base.ASCII) +local f_xml = ProtoField.string("v2gmsg.xml", "Decoded XML", base.ASCII) +local f_msg = ProtoField.string("v2gmsg.msgname", "Message", base.ASCII) +local f_validation = ProtoField.string("v2gmsg.validation", "Message Validation", base.ASCII) +p_v2gmsg.fields = {f_schema, f_exi, f_msg, f_entry, f_xml, f_validation} + +local MAX_FIELD_STR_LEN = 150 + +local ef_warning_generic = ProtoExpert.new("v2gmsg.warning", "V2G Warning", expert.group.PROTOCOL, expert.severity.WARN) +local ef_warning_validation = ProtoExpert.new("v2gmsg.warning.validation", "V2G-Message validation failed", expert.group.PROTOCOL, expert.severity.WARN) +local ef_error_generic = ProtoExpert.new("v2gmsg.error", "V2G Error", expert.group.UNDECODED, expert.severity.ERROR) +p_v2gmsg.experts = {ef_warning_generic, ef_warning_validation, ef_error_generic} + +local schema_namespace_to_schema_ID = {} +schema_namespace_to_schema_ID["urn:iso:15118:2:2010:AppProtocol"] = "SAP" +schema_namespace_to_schema_ID["urn:din:70121:2012:MsgDef"] = "DIN" +schema_namespace_to_schema_ID["urn:iso:15118:2:2013:MsgDef"] = "ISO-2" +schema_namespace_to_schema_ID["urn:iso:std:iso:15118:-20:CommonMessages"] = "ISO-20 CM" +schema_namespace_to_schema_ID["urn:iso:std:iso:15118:-20:DC"] = "ISO-20 DC" +schema_namespace_to_schema_ID["urn:iso:std:iso:15118:-20:AC"] = "ISO-20 AC" +schema_namespace_to_schema_ID["urn:iso:std:iso:15118:-20:ACDP"] = "ISO-20 ACDP" +schema_namespace_to_schema_ID["urn:iso:std:iso:15118:-20:WPT"] = "ISO-20 WPT" + +-- reset everything on init (e.g., if new pcap is opened on same instance) +function p_v2gmsg.init() + xml_buffer = {} + validation_buffer = {} + last_schema_list_SAP_req = {} + selected_schema_at_packet_nr = {} + decoded_with_auto_schema_detection = {} + decoded_with_schema_namespace = {} + decoded_error_code = {} + + -- register v2g ports + DissectorTable.get("tls.port"):add(p_v2gmsg.prefs["portrange_v2g"], p_v2gtp) + DissectorTable.get("tcp.port"):add(p_v2gmsg.prefs["portrange_v2g"], p_v2gtp) +end + +local function decode_v2g_message(schema, exi_string, packet_number) + local xml_out + local xml_schema + + decoded_with_auto_schema_detection[packet_number] = false + xml_out, xml_schema, errn = v2g_decoder.decodeV2GExi(schema, exi_string) + if errn ~= 0 then -- on error use autoprotocol mode + local xml_out_auto, xml_schema_auto + xml_out_auto, xml_schema_auto, errn_auto = v2g_decoder.decodeV2GAuto(exi_string) + if xml_out_auto ~= nil then + decoded_with_auto_schema_detection[packet_number] = true + xml_out = xml_out_auto + xml_schema = xml_schema_auto + errn = errn_auto + end + end + + decoded_with_schema_namespace[packet_number] = xml_schema + decoded_error_code[packet_number] = errn + return xml_out +end + +local function add_expert_info(message, tree, pinfo, expertinfo) + tree:add_proto_expert_info(expertinfo, message) + local oldInfo = tostring(pinfo.cols.info) + if oldInfo:sub(0, 3) ~= "[!]" then + pinfo.cols.info = "[!] " .. oldInfo + end +end + +local function add_xml_table_to_tree(xml_table, tree_out, dissector_field, pinfo) + local new_element + if xml_table.value ~= "" then + + -- special handling for certificates + if xml_table.name == "Certificate" or xml_table.name == "OEMProvisioningCert" then + local cert_element = tree_out:add(dissector_field, xml_table.value) + if string.len(xml_table.value) > 150 then -- cut too long strings + cert_element:set_text(xml_table.name .. ": " .. xml_table.value:sub(0, 150) .. "(...)") + else + cert_element:set_text(xml_table.name .. ": " .. xml_table.value) + end + + local valid, subj, issuer, version, serial, not_before, not_after, sig_algo, sig_value, pk_algo, spk_curve, spk_pub, v3_constraint, v3_constraint_CA, v3_key_usage, v3_key_usage_crit, v3_sk_ID, v3_sk_ID_crit = cert_info_extractor.getX509Infos(xml_table.value) + if valid then + cert_element:add(dissector_field, subj):set_text("Subject: " .. subj) + cert_element:add(dissector_field, issuer):set_text("Issuer: " .. issuer) + cert_element:add(dissector_field, version):set_text("Version: v" .. (version + 1) .. " (" .. version .. ")") -- certificate version is always +1 according to the standard + cert_element:add(dissector_field, serial):set_text("Serial Number: 0x" .. serial) + cert_element:add(dissector_field, not_before):set_text("Not Valid Before: " .. not_before) + cert_element:add(dissector_field, not_after):set_text("Not Valid After: " .. not_after) + cert_element:add(dissector_field, sig_algo):set_text("Signature Algorithm: " .. sig_algo) + cert_element:add(dissector_field, sig_value):set_text("Signature Value: " .. sig_value) + cert_element:add(dissector_field, pk_algo):set_text("Public Key Algorithm: " .. pk_algo) + cert_element:add(dissector_field, spk_curve):set_text("Subject Public Key - Curve: " .. spk_curve) + cert_element:add(dissector_field, spk_pub):set_text("Subject Public Key - RAW: " .. spk_pub) + local x509_v3_element = cert_element:add(dissector_field, "X509v3") + x509_v3_element:set_text("X509v3") + x509_v3_element:add(dissector_field, v3_constraint):set_text("Basic Constraint: " .. v3_constraint) + x509_v3_element:add(dissector_field, v3_constraint_CA):set_text("Basic Constraint CA: " .. v3_constraint_CA) + x509_v3_element:add(dissector_field, v3_key_usage_crit):set_text("Key Usage: " .. v3_key_usage_crit) + x509_v3_element:add(dissector_field, v3_key_usage):set_text("Key Usage: " .. v3_key_usage) + x509_v3_element:add(dissector_field, v3_sk_ID_crit):set_text("Subject Key ID: " .. v3_sk_ID_crit) + x509_v3_element:add(dissector_field, v3_sk_ID):set_text("Subject Key ID: " .. v3_sk_ID) + else + add_expert_info("INVALID CERTIFICATE", cert_element, pinfo, ef_warning_generic) + end + else + new_element = tree_out:add(dissector_field, xml_table.value) + new_element:set_text(xml_table.name .. ": " .. xml_table.value) + end + else + new_element = tree_out:add(dissector_field, xml_table.name) + new_element:set_text(xml_table.name) + end + + -- physical value type (15118-2/DIN) + local calc_value = nil + if #xml_table.children == 3 and + xml_table.children[1].name == "Multiplier" and + xml_table.children[2].name == "Unit" and + xml_table.children[3].name == "Value" then + -- 15118-2 physical value type + calc_value = tonumber(xml_table.children[3].value) * 10 ^ tonumber(xml_table.children[1].value) + + local unit = xml_table.children[2].value + if calc_value > 1000 and (unit == "W" or unit == "Wh") then + unit = "k" .. unit + calc_value = calc_value / 1000 + end + + if unit == "s" then + local h = math.floor(calc_value/3600) + local m = math.floor((calc_value - h * 3600)/ 60) + local s = calc_value % 60 + local appendix + if pcall(function() appendix = string.format(": %02d:%02d:%02d [hh:mm:ss]", h, m, s) end) == false then + appendix = ": ?" + add_expert_info("INVALID FORMAT", new_element, pinfo, ef_warning_generic) + end + new_element:append_text(appendix) + else + local appendix + if pcall(function() appendix = string.format(": %s%s", tostring(calc_value):gsub(",","."), unit) end) == false then + appendix = ": ?" + add_expert_info("INVALID FORMAT", new_element, pinfo, ef_warning_generic) + end + new_element:append_text(appendix) + end + end + + -- rational number type (15118-20 + DIN without unnit) + if #xml_table.children == 2 and + (xml_table.children[1].name == "Exponent" or xml_table.children[1].name == "Multiplier") and + xml_table.children[2].name == "Value" then + calc_value = tonumber(xml_table.children[2].value) * 10 ^ tonumber(xml_table.children[1].value) + new_element:append_text(": " .. tostring(calc_value):gsub(",",".")) + end + + if xml_table.attributes ~= "" then + local att_element = new_element:add(dissector_field, xml_table.attributes) + if string.len(xml_table.attributes) > MAX_FIELD_STR_LEN then -- cut too long attributes + xml_table.attributes = xml_table.attributes:sub(0, MAX_FIELD_STR_LEN) .. "(...)" + end + att_element:set_text("[XML Attributes: " .. xml_table.attributes .. "]") + end + + for _, c in ipairs(xml_table.children) do + add_xml_table_to_tree(c, new_element, dissector_field, pinfo) + end +end + +local function parse_XML(xml_string) + local xml_table = {name = "root", attributes = "", parent = nil, children = {}, value = ""} + local current_element = xml_table + + for op, tag, attr, unary, val in string.gmatch(xml_string:gsub("\n",""), "<(%/?)([%w_:-]+)(.-)(%/?)>([^<]*)") do + if op == "/" then + -- close the current element + current_element = current_element.parent + else + -- cut prefix from element name + local clean_name = tag + local prefix_at = tag:find(":") + if prefix_at ~= nil then + clean_name = tag:sub(prefix_at + 1) + end + + -- create new element + local element = {name = clean_name, attributes = attr, parent = current_element, children = {}, value = val} + current_element.children[#current_element.children + 1] = element + if unary ~= "/" then + -- Set the current element to the new element + current_element = element + end + end + end + return xml_table.children[1] +end + +local function process_SAP(data, packet_number) + for sap_type in data:gmatch'<[^:]+:supportedAppProtocol([^ >]+)' do + -- the SAP-req contains a list of protocols from which one is selected in the SAP-Res by the concrete ID + if sap_type == "Req" then + for protocol_entry in data:gmatch'(.-)' do + local proto_namespace = protocol_entry:match'(.-)' + local proto_ID = protocol_entry:match'(.-)' + if proto_namespace ~= nil and proto_ID ~= nil then + last_schema_list_SAP_req[proto_ID] = proto_namespace + -- else: the request is invalid + end + end + elseif sap_type == "Res" and selected_schema_at_packet_nr[packet_number] == nil then + local selected_ID = data:match'(.-)' + if selected_ID ~= nil then + selected_schema_at_packet_nr[packet_number] = last_schema_list_SAP_req[selected_ID] + last_schema_list_SAP_req = {} + -- else: the response is invalid + end + end + end +end + +local function get_message_name(data) + local message_name = data:match'><(.-)[ >]' -- SAP / -20 + + if message_name ~= nil then + local prefix_at = message_name:find(":") -- cut prefix + if prefix_at ~= nil then + message_name = message_name:sub(prefix_at + 1) + end + if message_name == "V2G_Message" then + message_name = data:match'Body><(.-)[/ >]' -- ISO-2/DIN + prefix_at = message_name:find(":") -- cut prefix + if prefix_at ~= nil then + message_name = message_name:sub(prefix_at + 1) + end + end + end + + return message_name +end + +-- Dissection function +function p_v2gmsg.dissector(buf, pinfo, root) + pinfo.cols.protocol = "V2GMSG" + pinfo.cols.info = "V2GMESSAGE FAILURE: Unknown error occured" -- default 'INFO'-field + + local subtree = root:add(p_v2gmsg, buf(0)) -- highlights all remaining bytes + + local iso20_warn_tree = subtree:add(f_entry, ""):set_text("WARNING: Preliminary ISO 15118-20 support!") + iso20_warn_tree.hidden = true -- only shown in ISO 15118-20 messages + + local metadata_tree = subtree:add(f_entry, ""):set_text("Metadata") + + local buf_as_hex = buf:bytes():tohex() -- exi as hex string + metadata_tree:add(f_exi, buf_as_hex) + + if not pinfo.visited then + -- this packet has not been decoded yet. Do it now and store the data inside xml_buffer + + -- retrieve schema info + local schema_namespace = pinfo.private["Schema"] + if schema_namespace == nil then -- if no schema is given, use the schema of the last SAP-messages + schema_namespace = "urn:iso:15118:2:2010:AppProtocol" -- use SAP as default schema + local last_closest = 0 + for k, v in pairs(selected_schema_at_packet_nr) do -- note: pairs are not sorted! + if k < pinfo.number and last_closest < k then + schema_namespace = v + last_closest = k + end + end + end + + -- decode exi + local xml_data = decode_v2g_message(schema_namespace, buf_as_hex, pinfo.number) + + if xml_data == nil then + -- decoding failed + pinfo.cols.info = "V2GMSG - Decoding failed" + add_expert_info("Decoding failed! Is the schema and payload-type correct?", subtree, pinfo, ef_error_generic) + return + end + + local message_name = get_message_name(xml_data) + if message_name ~= nil then + -- we only have to set the info field here, everything else will be done on next dissector call + pinfo.cols.info = message_name + + -- store decoded xml + xml_buffer[pinfo.number] = xml_data + + -- resolve & store schema if this is an SAP-msg + process_SAP(xml_data, pinfo.number) + + -- validate XML + local decoded_schema = decoded_with_schema_namespace[pinfo.number] + if decoded_schema ~= nil then + local error_msg = validation_buffer[pinfo.number] + if error_msg == nil then + -- msg not validated yet + local is_valid + is_valid, error_msg = v2g_decoder.validateXml(xml_data, decoded_schema) + if not is_valid then + validation_buffer[pinfo.number] = error_msg + end + end + if validation_buffer[pinfo.number] ~= nil then + add_expert_info("This message is invalid: " .. validation_buffer[pinfo.number]:sub(1,-2), subtree, pinfo, ef_warning_validation) + end + end + end + end + + if pinfo.visited or not gui_enabled() then -- in GUI mode we process the data on the second call for a better performance + -- packet already decoded, get the xml data from the buffer + local xml_data = xml_buffer[pinfo.number] + + if xml_data == nil then + -- decoding failed + pinfo.cols.info = "V2GMSG - Decoding failed" + add_expert_info("Decoding failed! Is the schema and payload-type correct?", subtree, pinfo, ef_error_generic) + return + end + + -- get the message name and write it to the info cols + local message_name = get_message_name(xml_data) + if message_name ~= nil then + pinfo.cols.info = message_name + metadata_tree:add(f_msg, message_name) + + if message_name == "supportedAppProtocolReq" or message_name == "supportedAppProtocolRes" then + -- re-process SAP. This is required in case of a delayed capture start (i.e. SAP-req missed) + if selected_schema_at_packet_nr[pinfo.number] == nil then + process_SAP(xml_data, pinfo.number) + end + end + end + + -- add XML data + ByteArray.tvb(ByteArray.new(xml_data, true), "XML Data"); + metadata_tree:add(f_xml, xml_data) + + local decoded_schema = decoded_with_schema_namespace[pinfo.number] + if decoded_schema ~= nil then + -- check decode error + if decoded_error_code[pinfo.number] ~= 0 then + add_expert_info("Decoding failed (" .. decoded_error_code[pinfo.number] .. ")! The decoded message is partially or completely invalid!", subtree, pinfo, ef_error_generic) + end + + -- add validation error message if available + if validation_buffer[pinfo.number] ~= nil then + validation_tree = metadata_tree:add(f_validation, "Failed! " .. validation_buffer[pinfo.number]:sub(1,-2)) + add_expert_info("This message is invalid: " .. validation_buffer[pinfo.number]:sub(1,-2), validation_tree, pinfo, ef_warning_validation) + else + metadata_tree:add(f_validation, "Successful") + end + + -- add schema_ID to protocol name + local schema_ID = schema_namespace_to_schema_ID[decoded_schema] + if decoded_with_auto_schema_detection[pinfo.number] then + pinfo.cols.protocol = "V2GMSG (" .. schema_ID .. " ?)" + metadata_tree:add(f_schema, "Automatically detected (" .. decoded_schema .. ")") + elseif schema_ID ~= nil then + pinfo.cols.protocol = "V2GMSG (" .. schema_ID .. ")" + metadata_tree:add(f_schema, decoded_schema) + end + if schema_ID:sub(0, 6) == "ISO-20" then + -- show warning for ISO 15118-20 messages. To be removed as soon as the decoder is finalized + iso20_warn_tree.hidden = false + end + + -- parse the xml data and add it to the tree + add_xml_table_to_tree(parse_XML(xml_data), subtree, f_entry, pinfo) + else + iso20_warn_tree.hidden = false -- always show the warning on decode errors + pinfo.cols.protocol = "V2GMSG (Decode Error)" + metadata_tree:add(f_schema, "Decode Error") + metadata_tree:add(f_validation, "Skipped (Decode Error)") + add_expert_info("Decoding failed! The decoded message is partially or completely invalid!", subtree, pinfo, ef_error_generic) + add_xml_table_to_tree(parse_XML(xml_data), subtree, f_entry, pinfo) + end + end +end From 5ff6fd43539ae66f9fa10503cd33d2a52f95e44c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thoren=20Gr=C3=BCttemeier?= Date: Tue, 2 Apr 2024 13:28:39 +0200 Subject: [PATCH 2/5] added I/O Graph feature --- .gitignore | 1 + Images/IO_Graph.png | Bin 0 -> 108839 bytes Installer/InstallerScript.iss | 44 ++++++++++++++++++++++++++++++++++ README.md | 21 ++++++++++++---- Wireshark/plugins/v2gmsg.lua | 24 +++++++++++++++++++ 5 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 .gitignore create mode 100644 Images/IO_Graph.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c3d3a20 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +settings.json \ No newline at end of file diff --git a/Images/IO_Graph.png b/Images/IO_Graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4306c488e4cc8b6963e212d10158f29a84470506 GIT binary patch literal 108839 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%0Drh2K2 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 <48-byte master secret>" as payload data. This disclosure message has to be sent from one of the communication partners in a testing environment. + +### Wireshark I/O Graph +This optional feature updates the Wireshark I/O Graph preferences to display a V2G session. The graph can be accessed via 'Statistics' -> 'I/O Graphs' (shortcut: Alt + S + I). +The graph displays the data in 1 second intervals. This can be changed using the drop down menu at the bottom. +To simplify the visualisation, some V2G related signals (e.g., MaxVoltage) are disabled by default. They can be enabled using the check boxes in the selection view. ## Requirements - Wireshark (64 bit) 3.5.0 or higher @@ -41,10 +54,6 @@ This Wireshark plugin allows to analyze and decode packets between electric vehi - Supports normal and portable version of Wireshark - Filter buttons and color filters will be installed for the current user only. In multi-user environments, the plugin must be installed for each user to enable these two optional features. -## Live TLS Decryption -The plugin processes a TLS master secret disclosure packet after handshake to decode the following V2G session. -The disclosure message is a UDP packet within the source port range 49152-65535 (see Wireshark protocol settings) containing the ASCII string "CLIENT_RANDOM <32-byte client random> <48-byte master secret>" as payload data. This disclosure message has to be sent from one of the communication partners in a testing environment. - ## Limitations - ISO 15118-20 is not fully supported yet - some BPT messages are not fully decoded @@ -77,3 +86,5 @@ The disclosure message is a UDP packet within the source port range 49152-65535 ![Filter Buttons](Images/WS_FilterButtons.png) ### Plugin Preferences ![Plugin Preferences](Images/WS_Preferences.png) +### Wireshark I/O Graph +![I/O Graph](Images/IO_Graph.png) diff --git a/Wireshark/plugins/v2gmsg.lua b/Wireshark/plugins/v2gmsg.lua index 54d2f70..fe0578f 100644 --- a/Wireshark/plugins/v2gmsg.lua +++ b/Wireshark/plugins/v2gmsg.lua @@ -53,8 +53,20 @@ local f_exi = ProtoField.string("v2gmsg.exi", "EXI", base.ASCII) local f_xml = ProtoField.string("v2gmsg.xml", "Decoded XML", base.ASCII) local f_msg = ProtoField.string("v2gmsg.msgname", "Message", base.ASCII) local f_validation = ProtoField.string("v2gmsg.validation", "Message Validation", base.ASCII) + p_v2gmsg.fields = {f_schema, f_exi, f_msg, f_entry, f_xml, f_validation} +local values_to_plot = { + "EVTargetVoltage","EVTargetCurrent","EVSEPresentVoltage","EVSEPresentCurrent", -- common + "EVRESSSOC","EVRESSSOC","EVMaximumVoltageLimit","EVMaximumCurrentLimit","EVSEMaximumVoltageLimit","EVSEMaximumCurrentLimit", -- DIN/ISO2 + "EVPresentVoltage","PresentSOC","EVMaximumVoltage","EVMinimumVoltage","EVMaximumChargeCurrent","EVSEMaximumVoltage","EVSEMaximumChargeCurrent" -- ISO20 +} +local f_plot_fields = {} -- maps value name to iograph-field +for k,value in pairs(values_to_plot) do + f_plot_fields[value] = ProtoField.double("v2gmsg.xml.iograph." .. value, "I/O Graph Value") + table.insert(p_v2gmsg.fields, f_plot_fields[value]) +end + local MAX_FIELD_STR_LEN = 150 local ef_warning_generic = ProtoExpert.new("v2gmsg.warning", "V2G Warning", expert.group.PROTOCOL, expert.severity.WARN) @@ -205,6 +217,18 @@ local function add_xml_table_to_tree(xml_table, tree_out, dissector_field, pinfo calc_value = tonumber(xml_table.children[2].value) * 10 ^ tonumber(xml_table.children[1].value) new_element:append_text(": " .. tostring(calc_value):gsub(",",".")) end + + -- add I/O Graph fields + for name, field in pairs(f_plot_fields) do + if name == xml_table.name then + if calc_value ~= nil then + tree_out:add(field, calc_value).hidden = true + else + tree_out:add(field, xml_table.value).hidden = true + end + break + end + end if xml_table.attributes ~= "" then local att_element = new_element:add(dissector_field, xml_table.attributes) From d069740fdaffaeb3297ce77183675f8bfc0761d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thoren=20Gr=C3=BCttemeier?= Date: Tue, 2 Apr 2024 13:31:16 +0200 Subject: [PATCH 3/5] update version to 1.2.0 --- Installer/InstallerScript.iss | 2 +- V2G_Libraries/CertificateInfos/main.rc | 8 ++++---- V2G_Libraries/V2GDecoder/main.rc | 8 ++++---- Wireshark/plugins/v2gmsg.lua | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Installer/InstallerScript.iss b/Installer/InstallerScript.iss index d5715ce..44f24ba 100644 --- a/Installer/InstallerScript.iss +++ b/Installer/InstallerScript.iss @@ -1,5 +1,5 @@ // DO NOT CHANGE VERSION HERE! Run update_version.bat -#define AppVer "1.1.0" +#define AppVer "1.2.0" #define AppId "dsV2Gshark" [Setup] diff --git a/V2G_Libraries/CertificateInfos/main.rc b/V2G_Libraries/CertificateInfos/main.rc index 279b338..113b220 100644 --- a/V2G_Libraries/CertificateInfos/main.rc +++ b/V2G_Libraries/CertificateInfos/main.rc @@ -1,11 +1,11 @@ #include -#define VER_FILEVERSION 1,1,0,0 -#define VER_FILEVERSION_STR "1.1.0.0\0" +#define VER_FILEVERSION 1,2,0,0 +#define VER_FILEVERSION_STR "1.2.0.0\0" #define VER_COMPANYNAME_STR "dSPACE GmbH" #define VER_PRODUCTNAME_STR "V2gCertificateInfos" -#define VER_PRODUCTVERSION 1,1,0,0 -#define VER_PRODUCTVERSION_STR "1.1.0.0\0" +#define VER_PRODUCTVERSION 1,2,0,0 +#define VER_PRODUCTVERSION_STR "1.2.0.0\0" VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION diff --git a/V2G_Libraries/V2GDecoder/main.rc b/V2G_Libraries/V2GDecoder/main.rc index d7fdafa..0456968 100644 --- a/V2G_Libraries/V2GDecoder/main.rc +++ b/V2G_Libraries/V2GDecoder/main.rc @@ -1,11 +1,11 @@ #include -#define VER_FILEVERSION 1,1,0,0 -#define VER_FILEVERSION_STR "1.1.0.0\0" +#define VER_FILEVERSION 1,2,0,0 +#define VER_FILEVERSION_STR "1.2.0.0\0" #define VER_COMPANYNAME_STR "dSPACE GmbH" #define VER_PRODUCTNAME_STR "V2gDecoder" -#define VER_PRODUCTVERSION 1,1,0,0 -#define VER_PRODUCTVERSION_STR "1.1.0.0\0" +#define VER_PRODUCTVERSION 1,2,0,0 +#define VER_PRODUCTVERSION_STR "1.2.0.0\0" VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION diff --git a/Wireshark/plugins/v2gmsg.lua b/Wireshark/plugins/v2gmsg.lua index fe0578f..79a3628 100644 --- a/Wireshark/plugins/v2gmsg.lua +++ b/Wireshark/plugins/v2gmsg.lua @@ -10,7 +10,7 @@ -- -- See license file (dsV2Gshark_LICENSE.txt) -- -DS_V2GSHARK_VERSION = "1.1.0" -- DO NOT CHANGE +DS_V2GSHARK_VERSION = "1.2.0" -- DO NOT CHANGE p_v2gmsg = Proto("v2gmsg","V2G Message") local p_v2gmsg_info = { From 63ae2e005be60fb57863b4237d392a19284fc709 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thoren=20Gr=C3=BCttemeier?= Date: Tue, 2 Apr 2024 15:17:09 +0200 Subject: [PATCH 4/5] updated README: I/O Graph --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bb1389d..0575f93 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,6 @@ This Wireshark plugin allows to analyze and decode packets between electric vehi - Filter buttons for V2G packets - Wireshark I/O Graph support for V2G packets - ### Live TLS Decryption The plugin processes a TLS master secret disclosure packet after handshake to decode the following V2G session. The disclosure message is a UDP packet within the source port range 49152-65535 (see Wireshark protocol settings) containing the ASCII string "CLIENT_RANDOM <32-byte client random> <48-byte master secret>" as payload data. This disclosure message has to be sent from one of the communication partners in a testing environment. @@ -35,7 +34,8 @@ The disclosure message is a UDP packet within the source port range 49152-65535 ### Wireshark I/O Graph This optional feature updates the Wireshark I/O Graph preferences to display a V2G session. The graph can be accessed via 'Statistics' -> 'I/O Graphs' (shortcut: Alt + S + I). The graph displays the data in 1 second intervals. This can be changed using the drop down menu at the bottom. -To simplify the visualisation, some V2G related signals (e.g., MaxVoltage) are disabled by default. They can be enabled using the check boxes in the selection view. +To simplify the visualisation, some V2G related signals (e.g., MaxVoltage) are disabled by default. They can be enabled using the check boxes in the selection view. +Click on a packet in the graph to inspect it in the Wireshark main window. Press the SPACE key to activate a helper line on the graph if you need more precision. ## Requirements - Wireshark (64 bit) 3.5.0 or higher From 76cd7e1bbc55d7ae6672200e7afde9b747977ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thoren=20Gr=C3=BCttemeier?= Date: Wed, 3 Apr 2024 08:51:44 +0200 Subject: [PATCH 5/5] removed step line from I/O graph prefs to support older Wireshark verisons --- Installer/InstallerScript.iss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Installer/InstallerScript.iss b/Installer/InstallerScript.iss index 44f24ba..60dd73c 100644 --- a/Installer/InstallerScript.iss +++ b/Installer/InstallerScript.iss @@ -334,7 +334,7 @@ begin '"Disabled","[ISO20] Max Current EV","","#2E3436","Line","AVG(Y Field)","v2gmsg.xml.iograph.EVMaximumChargeCurrent","None","1"', '"Disabled","[ISO20] Max Voltage EVSE","","#2E3436","Line","AVG(Y Field)","v2gmsg.xml.iograph.EVSEMaximumVoltage","None","1"', '"Disabled","[ISO20] Max Current EVSE","","#2E3436","Line","AVG(Y Field)","v2gmsg.xml.iograph.EVSEMaximumChargeCurrent","None","1"', - '"Disabled","CP State","","#2E3436","Dot Step Line","AVG(Y Field)","homeplug_av.st_iotecha.cpstate.state","None","20"']; + '"Disabled","CP State","","#2E3436","Dot","AVG(Y Field)","homeplug_av.st_iotecha.cpstate.state","None","20"']; if FileExists(FileName) then begin if not PrependStringsToFile(FileName, StringsToAdd) then