pal-sgx-get-token 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #!/usr/bin/env python3
  2. import argparse
  3. import os
  4. import socket
  5. import struct
  6. import sys
  7. import aesm_pb2
  8. sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
  9. from generated_offsets import *
  10. def read_sigstruct(sig):
  11. """Reading Sigstruct."""
  12. # field format: (offset, type, value)
  13. # SGX_ARCH_SIGSTRUCT_
  14. fields = {
  15. 'date': (SGX_ARCH_SIGSTRUCT_DATE, "<HBB", 'year', 'month', 'day'),
  16. 'modulus': (SGX_ARCH_SIGSTRUCT_MODULUS, "384s", 'modulus'),
  17. 'exponent': (SGX_ARCH_SIGSTRUCT_EXPONENT, "<L", 'exponent'),
  18. 'signature': (SGX_ARCH_SIGSTRUCT_SIGNATURE, "384s", 'signature'),
  19. 'miscs': (SGX_ARCH_SIGSTRUCT_MISCSELECT, "4s", 'miscs'),
  20. 'miscmask': (SGX_ARCH_SIGSTRUCT_MISCSELECT_MASK, "4s", 'miscmask'),
  21. 'attrs': (SGX_ARCH_SIGSTRUCT_ATTRIBUTES, "8s8s", 'flags', 'xfrms'),
  22. 'attrmask': (SGX_ARCH_SIGSTRUCT_ATTRIBUTES_MASK,
  23. "8s8s", 'flagmask', 'xfrmmask'),
  24. 'mrenclave': (SGX_ARCH_SIGSTRUCT_ENCLAVE_HASH, "32s", 'mrenclave'),
  25. 'isvprodid': (SGX_ARCH_SIGSTRUCT_ISVPRODID, "<H", 'isvprodid'),
  26. 'isvsvn': (SGX_ARCH_SIGSTRUCT_ISVSVN, "<H", 'isvsvn'),
  27. }
  28. attr = dict()
  29. for field in fields.values():
  30. values = struct.unpack_from(field[1], sig, field[0])
  31. for i in range(len(values)):
  32. attr[field[i + 2]] = values[i]
  33. return attr
  34. def connect_aesmd(attr):
  35. """Connect with AESMD."""
  36. req_msg = aesm_pb2.GetTokenReq()
  37. req_msg.req.signature = attr['mrenclave']
  38. req_msg.req.key = attr['modulus']
  39. req_msg.req.attributes = attr['flags'] + attr['xfrms']
  40. req_msg.req.timeout = 10000
  41. req_msg_raw = req_msg.SerializeToString()
  42. aesm_service = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  43. connected = False
  44. # try to connect to the unnamed socket (for PSW 1.6 and 1.7)
  45. if not connected:
  46. try:
  47. aesm_service.connect("\0sgx_aesm_socket_base" + "\0" * 87)
  48. connected = True
  49. except socket.error:
  50. pass
  51. # try to connect to the named socket (for PSW 1.8+)
  52. if not connected:
  53. try:
  54. aesm_service.connect("/var/run/aesmd/aesm.socket")
  55. connected = True
  56. except socket.error:
  57. pass
  58. if not connected:
  59. raise socket.error("Cannot connect to the AESMD service")
  60. aesm_service.send(struct.pack("<I", len(req_msg_raw)))
  61. aesm_service.send(req_msg_raw)
  62. ret_msg_size = struct.unpack("<I", aesm_service.recv(4))[0]
  63. ret_msg = aesm_pb2.GetTokenRet()
  64. ret_msg_raw = aesm_service.recv(ret_msg_size)
  65. ret_msg.ParseFromString(ret_msg_raw)
  66. if ret_msg.ret.error != 0:
  67. raise Exception("Failed. (Error Code = %d)" % (ret_msg.ret.error))
  68. return ret_msg.ret.token
  69. argparser = argparse.ArgumentParser()
  70. argparser.add_argument('--sig', '-sig', metavar='SIGNATURE',
  71. type=argparse.FileType('rb'), required=True,
  72. help='Input .sig file (contains SIGSTRUCT)')
  73. argparser.add_argument('--output', '-output', metavar='OUTPUT',
  74. type=argparse.FileType('wb'), required=True,
  75. help='Output .token file (contains EINITTOKEN)')
  76. def main(args=None):
  77. """Main Program."""
  78. args = argparser.parse_args(args)
  79. attr = read_sigstruct(args.sig.read())
  80. print("Attributes:")
  81. print(" mrenclave: %s" % attr['mrenclave'].hex())
  82. print(" isvprodid: %d" % attr['isvprodid'])
  83. print(" isvsvn: %d" % attr['isvsvn'])
  84. print(" flags: %016x" % int.from_bytes(attr['flags'],
  85. byteorder='big'))
  86. print(" xfrms: %016x" % int.from_bytes(attr['xfrms'],
  87. byteorder='big'))
  88. print(" miscs: %08x" % int.from_bytes(attr['miscs'],
  89. byteorder='big'))
  90. print(" miscmask: %08x" % int.from_bytes(attr['miscmask'],
  91. byteorder='big'))
  92. print(" modulus: %s..." % attr['modulus'].hex()[:32])
  93. print(" exponent: %d" % attr['exponent'])
  94. print(" signature: %s..." % attr['signature'].hex()[:32])
  95. token = connect_aesmd(attr)
  96. args.output.write(token)
  97. return 0
  98. if __name__ == "__main__":
  99. sys.exit(main())