App.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include <cstdio>
  2. #include "sgx_urts.h"
  3. #include "sgx_tcrypto.h"
  4. #include "sgx_tseal.h"
  5. #include "Untrusted.hpp"
  6. static void dump(const char *label, void *p, size_t len)
  7. {
  8. unsigned char *pc = (unsigned char *)p;
  9. if (label) {
  10. printf("%s: ", label);
  11. }
  12. for (size_t i=0; i<len; ++i) {
  13. printf("%02x", pc[i]);
  14. }
  15. printf("\n");
  16. }
  17. static void genkey()
  18. {
  19. size_t sealedprivsize =
  20. sizeof(sgx_sealed_data_t) + sizeof(sgx_ec256_private_t) + 19;
  21. sgx_ec256_public_t pubkey;
  22. sgx_sealed_data_t *sealedprivkey =
  23. (sgx_sealed_data_t *)malloc(sealedprivsize);
  24. ecall_identity_key_new(&pubkey, sealedprivkey);
  25. dump("Pubkey", &pubkey, sizeof(pubkey));
  26. printf("Saving sealed private key\n");
  27. sgx_destroy_enclave(global_eid);
  28. FILE *sprivf = fopen("privkey.seal", "wb");
  29. fwrite(sealedprivkey, sealedprivsize, 1, sprivf);
  30. fclose(sprivf);
  31. free(sealedprivkey);
  32. }
  33. static void loadkey(FILE *sprivf)
  34. {
  35. size_t sealedprivsize =
  36. sizeof(sgx_sealed_data_t) + sizeof(sgx_ec256_private_t) + 19;
  37. sgx_ec256_public_t pubkey;
  38. sgx_sealed_data_t *sealedprivkey =
  39. (sgx_sealed_data_t *)malloc(sealedprivsize);
  40. if (fread(sealedprivkey, sealedprivsize, 1, sprivf) != 1) {
  41. fprintf(stderr, "Could not read privkey.seal file\n");
  42. exit(1);
  43. }
  44. bool res = ecall_identity_key_load(&pubkey, sealedprivkey);
  45. if (!res) {
  46. fprintf(stderr, "Key load failed\n");
  47. exit(1);
  48. }
  49. printf("Loaded sealed private key\n");
  50. dump("Pubkey", &pubkey, sizeof(pubkey));
  51. free(sealedprivkey);
  52. }
  53. int main(int argc, char **argv)
  54. {
  55. if (initialize_enclave() < 0) {
  56. return -1;
  57. }
  58. FILE *sprivf = fopen("privkey.seal", "rb");
  59. if (sprivf) {
  60. loadkey(sprivf);
  61. fclose(sprivf);
  62. } else {
  63. genkey();
  64. }
  65. return 0;
  66. }