def main(argv): if argv: sys.exit('Test takes no args!') updater = hammerd_api.FirmwareUpdater(common.BASE_VENDOR_ID, common.BASE_PRODUCT_ID, common.BASE_USB_PATH) # Load EC image. with open(common.OLDER_IMAGE, 'rb') as f: ec_image = f.read() updater.LoadEcImage(ec_image) common.disable_hammerd() init_before_updaterw(updater) common.reset_stay_ro(updater) unlock_rw(updater) print('Updating to OLDER_IMAGE fw from RO') transfer_rw(updater, common.OLDER_IMAGE) common.sim_disconnect_connect(updater) common.disable_hammerd() init_before_updaterw(updater) common.reset_stay_ro(updater) unlock_rw(updater) print('Updating to NEWER_IMAGE from RO') transfer_rw(updater, common.NEWER_IMAGE) common.sim_disconnect_connect(updater)
def init_transfer(updater): with open(common.TP, 'rb') as f: ec_image = f.read() updater.LoadTouchpadImage(ec_image) assert updater.SendFirstPdu() is True, 'Error sending first PDU' updater.SendDone() unlock_rw(updater) common.sim_disconnect_connect(updater)
def inc_rollback(updater, expected_rb): current_rb = updater.GetFirstResponsePdu().contents.min_rollback print('Current RB: %s' % current_rb) updater.SendSubcommand(hammerd_api.UpdateExtraCommand.UnlockRollback) common.sim_disconnect_connect(updater) common.connect_usb(updater) pdu_resp = updater.GetFirstResponsePdu().contents print('PDU Response: %s' % pdu_resp) print('Current running section: %s' % updater.CurrentSection()) new_rb = updater.GetFirstResponsePdu().contents.min_rollback print('New RB version: %s' % new_rb) assert new_rb == expected_rb, 'Error: Failed to increment RB version!'
def restore_valid_rw(updater, image): print('Restoring to valid RW') transfer_rw(updater, image) updater.SendSubcommand(hammerd_api.UpdateExtraCommand.JumpToRW) time.sleep(2) updater.CloseUsb() time.sleep(0.5) # Jump to RW resets the base. Need to reconnect common.connect_usb(updater) updater.SendFirstPdu() updater.SendDone() print('Current section after valid RW update: %s' % updater.CurrentSection()) assert updater.CurrentSection() == 1, 'Running section should be 1 (RW)' common.sim_disconnect_connect(updater)
def main(argv): if len(argv) > 0: sys.exit('Test takes no args!') updater = hammerd_api.FirmwareUpdater(common.BASE_VENDOR_ID, common.BASE_PRODUCT_ID, common.BASE_BUS, common.BASE_PORT) # Load EC image. with open(common.IMAGE, 'rb') as f: ec_image = f.read() updater.LoadEcImage(ec_image) common.disable_hammerd() common.connect_usb(updater) print('PDU Response: %s' % updater.GetFirstResponsePdu().contents) print('Current running section: %s' % updater.CurrentSection()) assert get_flash_protection(updater) == FLASH_PROTECT_INIT, \ 'Initial WP status error' unlock_rw(updater) common.sim_disconnect_connect(updater) # Catch it right after reset: RW is still unlocked and can be updated. common.connect_usb(updater) print('PDU Response: %s' % updater.GetFirstResponsePdu().contents) print('Current running section: %s' % updater.CurrentSection()) assert get_flash_protection(updater) == FLASH_PROTECT_NORW, \ 'WP status after Unlock RW' updater.CloseUsb() time.sleep(2) # By now, hammer will have jumped to RW and locked the flash again common.connect_usb(updater) assert get_flash_protection(updater) == FLASH_PROTECT_INIT, \ 'WP status after jump RW' updater.SendSubcommand(hammerd_api.UpdateExtraCommand.UnlockRollback) common.sim_disconnect_connect(updater) common.connect_usb(updater) print('PDU Response: %s' % updater.GetFirstResponsePdu().contents) print('Current running section: %s' % updater.CurrentSection()) assert get_flash_protection(updater) == FLASH_PROTECT_NORB, \ 'WP status after Unlock RB' updater.CloseUsb() time.sleep(2) # By now, hammer will have jumped to RW and locked the flash again common.connect_usb(updater) assert get_flash_protection(updater) == FLASH_PROTECT_INIT, \ 'WP status after jump RW'
def main(argv): if len(argv) > 0: sys.exit('Test takes no args!') updater = hammerd_api.FirmwareUpdater(common.BASE_VENDOR_ID, common.BASE_PRODUCT_ID, common.BASE_BUS, common.BASE_PORT) # Load EC image. with open(common.IMAGE, 'rb') as f: ec_image = f.read() updater.LoadEcImage(ec_image) common.disable_hammerd() common.connect_usb(updater) print('PDU Response: %s' % updater.GetFirstResponsePdu().contents) print('Current section before ro update: %s' % updater.CurrentSection()) transfer_ro(updater, common.IMAGE) common.sim_disconnect_connect(updater)
def main(argv): if argv: sys.exit('Test takes no args!') updater = hammerd_api.FirmwareUpdater(common.BASE_VENDOR_ID, common.BASE_PRODUCT_ID, common.BASE_USB_PATH) # Load EC image. with open(common.IMAGE, 'rb') as f: ec_image = f.read() updater.LoadEcImage(ec_image) common.disable_hammerd() common.connect_usb(updater) print('EC information:') pdu_resp = updater.GetFirstResponsePdu().contents print('PDU Response: %s' % pdu_resp) print('RO: %s' % updater.GetSectionVersion(hammerd_api.SectionName.RO)) print('RW: %s' % updater.GetSectionVersion(hammerd_api.SectionName.RW)) print('Current section before StayInRO cmd: %s' % updater.CurrentSection()) assert updater.CurrentSection() == 1, 'Running section should be 1 (RW)' # Jump to RO by resetting base updater.SendSubcommand(hammerd_api.UpdateExtraCommand.ImmediateReset) updater.CloseUsb() time.sleep(0.5) updater.TryConnectUsb() updater.SendSubcommand(hammerd_api.UpdateExtraCommand.StayInRO) # Keep DUT in RO for 10 sec to check that it stays in RO time.sleep(10) # Reconnect, in case RO still decided to jump updater.CloseUsb() updater.TryConnectUsb() # Need to SendFirstPdu again after sendig cmd because # CurrentSection reads from results of SendFirstPdu by checking the # writable offset. Non Zero writable offset means RO is running assert updater.SendFirstPdu() is True, 'Error sending first PDU' updater.SendDone() print('Current section after StayInRO cmd: %s' % updater.CurrentSection()) assert updater.CurrentSection() == 0, 'Running section should be 0 (RO)' # Reset dut common.sim_disconnect_connect(updater)
def restore_valid_rb(updater, image, image_desc): print(image_desc) transfer_rw(updater, image) common.sim_disconnect_connect(updater)
def main(argv): if argv: sys.exit('Test takes no args!') updater = hammerd_api.FirmwareUpdater(common.BASE_VENDOR_ID, common.BASE_PRODUCT_ID, common.BASE_USB_PATH) public_key_first = (ctypes.c_ubyte * PUBLIC_KEY_SIZE)() # Load EC image. with open(common.IMAGE, 'rb') as f: ec_image = f.read() updater.LoadEcImage(ec_image) common.disable_hammerd() print('Connect to base EC.') common.connect_usb(updater) print('EC information:') print('PDU Response: %s' % updater.GetFirstResponsePdu().contents) print('RO: %s' % updater.GetSectionVersion(hammerd_api.SectionName.RO)) print('RW: %s' % updater.GetSectionVersion(hammerd_api.SectionName.RW)) print('Current section : %s' % updater.CurrentSection()) assert updater.CurrentSection() == 1, 'Running section should be 1 (RW)' # Sends 'Need to inject entropy' message if base is new pair_manager = hammerd_api.PairManager() challenge_status = pair_manager.PairChallenge(updater.object, public_key_first) print('Challenge status: %d' % challenge_status) # assert challenge_status == 9, 'Need to inject the entropy' for iteratn in range(INJECTION_RUNS): print('Jumping back to RO to inject entropy. Iteratn: %d' % (iteratn + 1)) updater.SendSubcommand(hammerd_api.UpdateExtraCommand.UnlockRollback) updater.SendSubcommand(hammerd_api.UpdateExtraCommand.ImmediateReset) updater.CloseUsb() time.sleep(0.5) updater.TryConnectUsb() updater.SendSubcommand(hammerd_api.UpdateExtraCommand.StayInRO) # Wait for RO to run, else SendFirstPdu() picks up RW time.sleep(1) # Verify that we're in RO assert updater.SendFirstPdu() is True, 'Error sending first PDU' updater.SendDone() assert updater.CurrentSection( ) == 0, 'Not in RO: Cannot inject entropy' print('Inject entropy and sys jump to RW') updater.InjectEntropyWithPayload(b'\x87' * hammerd_api.ENTROPY_SIZE) updater.SendSubcommand(hammerd_api.UpdateExtraCommand.ImmediateReset) updater.CloseUsb() time.sleep(0.5) common.connect_usb(updater) updater.SendSubcommand(hammerd_api.UpdateExtraCommand.JumpToRW) # Wait for RW to run time.sleep(1) updater.CloseUsb() time.sleep(0.5) # Jump to RW resets the base. Need to reconnect common.connect_usb(updater) print('PDU Response: %s' % updater.GetFirstResponsePdu().contents) # Check that RW is running assert updater.SendFirstPdu() is True, 'Error sending first PDU' updater.SendDone() print('Current running section after jumping to RW: %s' % updater.CurrentSection()) assert updater.CurrentSection( ) == 1, 'Running section should be 1 (RW)' # Autheticator should match for each pairing run for i in range(PAIRING_RUNS): public_key = (ctypes.c_ubyte * PUBLIC_KEY_SIZE)() pair_manager = hammerd_api.PairManager() challenge_status = pair_manager.PairChallenge( updater.object, public_key) print('Challenge status: %d' % challenge_status) assert challenge_status == 0, 'Pairing challenge failed!' if i == 0: same = True for j in range(0, PUBLIC_KEY_SIZE - 1): if public_key_first[j] != public_key[j]: same = False assert not same, 'The key did not change after entropy injection!' public_key_first = public_key else: for j in range(0, PUBLIC_KEY_SIZE - 1): assert public_key_first[j] == public_key[j], 'Key changed!' # Reset the base common.sim_disconnect_connect(updater)