| #!/usr/bin/env python3 |
| # Copyright 2017 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Python wrapper of hammerd API.""" |
| |
| from __future__ import print_function |
| |
| import ctypes |
| import time |
| |
| import hammerd_api |
| |
| |
| PUBLIC_KEY_SIZE = 32 |
| |
| |
| def main(): |
| """Demonstrates FirmwareUpdater usage.""" |
| updater = hammerd_api.FirmwareUpdater(0x18D1, 0x503C, usb_path="1-1.1") |
| public_key = (ctypes.c_ubyte * PUBLIC_KEY_SIZE)() |
| # Load EC image. |
| with open("/lib/firmware/hammer.fw", "rb") as f: |
| ec_image = f.read() |
| updater.LoadEcImage(ec_image) |
| |
| print("Connect to base EC.") |
| updater.TryConnectUsb() |
| updater.SendFirstPdu() |
| updater.SendDone() |
| |
| 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("Assume EC already in RW, send pairing challenge.") |
| pair_manager = hammerd_api.PairManager() |
| challenge_status = pair_manager.PairChallenge(updater.object, public_key) |
| print("Challenge status: %d" % challenge_status) |
| |
| print("Jump back to RO.") |
| updater.SendSubcommand(hammerd_api.UpdateExtraCommand.ImmediateReset) |
| updater.CloseUsb() |
| |
| print("Inject all-zero entropy.") |
| time.sleep(0.5) |
| updater.TryConnectUsb() |
| updater.SendSubcommand(hammerd_api.UpdateExtraCommand.StayInRO) |
| updater.InjectEntropyWithPayload("\x00" * hammerd_api.ENTROPY_SIZE) |
| updater.CloseUsb() |
| |
| |
| if __name__ == "__main__": |
| main() |