#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2017 The Chromium OS Authors. All rights reserved.
# 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, '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()
