def __security_seed_wrapper(args): """Wrapper used to initiate security seed dump""" arb_id_request = args.src arb_id_response = args.dst reset_type = args.reset session_type = args.sess_type level = args.sec_level num_seeds = args.num reset_delay = args.delay seed_list = [] try: print("Security seed dump started. Press Ctrl+C to stop.\n") while num_seeds > len(seed_list) or num_seeds == 0: # Extended diagnostics response = extended_session(arb_id_request, arb_id_response, session_type) if not Iso14229_1.is_positive_response(response): print("Unable to enter extended session. Retrying...\n") continue # Request seed response = request_seed(arb_id_request, arb_id_response, level, None, None) if response is None: print("\nInvalid response") elif Iso14229_1.is_positive_response(response): seed_list.append(list_to_hex_str(response[2:])) print("Seed received: {}\t(Total captured: {})".format( list_to_hex_str(response[2:]), len(seed_list)), end="\r") stdout.flush() else: print_negative_response(response) break if reset_type: ecu_reset(arb_id_request, arb_id_response, reset_type, None) time.sleep(reset_delay) except KeyboardInterrupt: print("Interrupted by user.") except ValueError as e: print(e) return if len(seed_list) > 0: print("\n") print("Security Access Seeds captured:") for seed in seed_list: print(seed)
def __ecu_reset_wrapper(args): """Wrapper used to initiate ECU Reset""" arb_id_request = args.src arb_id_response = args.dst reset_type = args.reset_type timeout = args.timeout print( "Sending ECU reset, type 0x{0:02x} to arbitration ID {1} (0x{1:02x})". format(reset_type, arb_id_request)) try: response = ecu_reset(arb_id_request, arb_id_response, reset_type, timeout) except ValueError as e: print("ValueError: {0}".format(e)) return # Decode response if response is None: print("No response was received") else: response_length = len(response) if response_length == 0: # Empty response print("Received empty response") elif response_length == 1: # Invalid response length print( "Received response [{0:02x}] (1 byte), expected at least 2 bytes" .format(response[0], len(response))) elif Iso14229_1.is_positive_response(response): # Positive response handling response_service_id = response[0] subfunction = response[1] expected_response_id = Iso14229_1.get_service_response_id( Services.EcuReset.service_id) if response_service_id == expected_response_id and subfunction == reset_type: # Positive response print("Received positive response") if response_length > 2: # Additional data can be seconds left to reset (powerDownTime) or manufacturer specific additional_data = list_to_hex_str(response[2:], ",") print("Response contains additional data: [{0}]".format( additional_data)) else: # Service and/or subfunction mismatch print( "Response service ID 0x{0:02x} and subfunction 0x{1:02x} do not match expected values " "0x{2:02x} and 0x{3:02x}".format(response_service_id, subfunction, expected_response_id, reset_type)) else: # Negative response handling nrc = response[1] nrc_description = NRC_NAMES.get(nrc, "Unknown NRC value") print( "Received negative response code (NRC) 0x{0:02x}: {1}".format( nrc, nrc_description))