#!/usr/bin/env python import os import sys import struct import socket from google.protobuf import message as _message from Crypto.PublicKey import RSA import aesm_pb2 """ Utilities """ def int_to_bytes(i): b = "" l = 0 while i > 0: b = b + chr(i % 256) i = i // 256 l = l + 1 return b def bytes_to_int(b): i = 0 for c in b: i = i * 256 + ord(c) return i """ Reading Sigstruct """ def read_sigstruct(sig): # field format: (offset, type, value) fields = dict() fields['date'] = ( 20, "' if not optval[0]: usage_message += ']' print >> sys.stderr, usage_message os._exit(-1) def parse_args(): args = dict() for opt, optval in options.items(): if optval[1] is None: args[opt] = False i = 1 while i < len(sys.argv): got = sys.argv[i] if got == '-help' or got == '-h': usage() invalid = True for opt, optval in options.items(): if got != '-' + opt: continue if optval[1] is not None: i += 1 if i == len(sys.argv): print >>sys.stderr, "Option %s needs a value." % (opt) usage() args[opt] = sys.argv[i] else: args[opt] = True invalid = False break if invalid: print >>sys.stderr, "Unknown option: %s." % (got[1:]) usage() i += 1 for opt, optval in options.items(): if optval[0] and opt not in args: print >>sys.stderr, "Must specify %s <%s>." % (opt, optval[1]) usage() return args if __name__ == "__main__": # Parse arguments args = parse_args() attr = read_sigstruct(open(args['sig'], 'rb').read()) print >>sys.stderr, "Attributes:" print >>sys.stderr, " mrenclave: %s" % (attr['mrenclave'].encode('hex')) print >>sys.stderr, " isvprodid: %d" % (attr['isvprodid']) print >>sys.stderr, " isvsvn: %d" % (attr['isvsvn']) print >>sys.stderr, " flags: %016x" % (bytes_to_int(attr['flags'])) print >>sys.stderr, " xfrms: %016x" % (bytes_to_int(attr['xfrms'])) print >>sys.stderr, " miscs: %08x" % (bytes_to_int(attr['miscs'])) print >>sys.stderr, " modulus: %s..." % (attr['modulus'].encode('hex')[:32]) print >>sys.stderr, " exponent: %d" % (attr['exponent']) print >>sys.stderr, " signature: %s..." % (attr['signature'].encode('hex')[:32]) token = connect_aesmd(attr) open(args['output'], 'wb').write(token)