#!/usr/bin/env python3

# Copyright (c) 2021 Arista Networks, Inc.  All rights reserved.
# Arista Networks, Inc. Confidential and Proprietary.

import argparse
import sys

import TpmGeneric.Defs
import TpmGeneric.Tpm

def main():
   parser = argparse.ArgumentParser( description='Extend TPM PCR register' )
   parser.add_argument( 'pcrIndex', metavar='PCR', type=int,
                        help='Index of the pcr to extend' )
   parser.add_argument( '--event', type=str,
                        default=TpmGeneric.Defs.PcrEventType.UNKNOWN_EVENT.name,
                        help='Type of this extension event',
                        choices=list( TpmGeneric.Defs.PcrEventType.__members__ ) )
   parser.add_argument( '--log', type=str, default=None,
                        help='Log message to add to PCR logs' )

   sps = parser.add_subparsers( help='subparsers' )

   filesp = sps.add_parser('file', help='Extend PCR with the hash of a file')
   filesp.add_argument( 'filePath', metavar='FILE', type=str, action='store',
                        help='File path to measure and extend the PCR with' )

   hashsp = sps.add_parser('hash', help='Extend PCR with a hash)' )
   hashsp.add_argument( 'hashValue', metavar='HASH', type=str, action='store',
                        help='Hash to extend the PCR with' )

   args = parser.parse_args()

   log = [ args.log ] if args.log else []
   event = TpmGeneric.Defs.PcrEventType[ args.event ]

   try:
      tpm = TpmGeneric.Tpm.TpmGeneric()

      stdout = sys.stdout.buffer
      if 'filePath' in args:
         if args.filePath == '-':
            stdin = sys.stdin.buffer
            stdout.write( tpm.pcrExtendFromData( args.pcrIndex, event,
                                                 stdin.read(), log=log ) + b'\n' )
         else:
            stdout.write( tpm.pcrExtendFromFile( args.pcrIndex, event,
                                                 args.filePath, log=log ) + b'\n' )
      else:
         stdout.write( tpm.pcrExtend( args.pcrIndex, event, args.hashValue,
                                      log=log ) + b'\n' )

      return 0
   except TpmGeneric.Defs.Error as e:
      print( e )
      return 1

if __name__ == '__main__':
   sys.exit( main() )
