SealingUntrusted.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. //
  2. // Created by miti on 21/07/19.
  3. //
  4. #include "UntrustedInclude/SealingUntrusted.h"
  5. namespace SealingUntrusted {
  6. namespace {
  7. int create_and_seal_signing_key_pair_to_disk(sgx_enclave_id_t enclave_id, int fd)
  8. {
  9. uint32_t ret_status=0, counter=0;
  10. size_t length=0;
  11. uint8_t* sealed_data;
  12. Decryptor_calculate_sealed_keypair_size_wrapper(enclave_id, &length);
  13. if(length == 0xFFFFFFFF)
  14. return -31;
  15. sealed_data=(uint8_t*) malloc(length);
  16. printf("length: %d\n", length); fflush(stdout);
  17. Decryptor_create_and_seal_long_term_signing_key_pair_wrapper(enclave_id, &ret_status, &length, sealed_data);
  18. if(ret_status != SGX_SUCCESS)
  19. {
  20. printf("create_and_seal called returned an error: %x", ret_status);
  21. free(sealed_data);
  22. return -32;
  23. }
  24. printf("It returned sgx_success\n"); fflush(stdout);
  25. for(counter=0; counter<length; counter++)
  26. printf("%02x ", sealed_data[counter]);
  27. ret_status = FileIO::write_to_fd(fd, sealed_data, &length);
  28. free(sealed_data);
  29. return ret_status;
  30. }
  31. int unseal_signing_key_pair_from_disk(sgx_enclave_id_t enclave_id, int fd, size_t sealed_msg_length_in_file)
  32. {
  33. uint32_t ret_status=0, counter=0;
  34. size_t length=sealed_msg_length_in_file;
  35. uint8_t* sealed_data;
  36. sealed_data = (uint8_t*) malloc(sealed_msg_length_in_file);
  37. ret_status = FileIO::read_from_fd(fd, sealed_data, &length);
  38. if(ret_status == -1)
  39. {
  40. free(sealed_data);
  41. return -1;
  42. }
  43. length=ret_status;
  44. for(counter=0;counter<length;counter++)
  45. printf("%x ", *(sealed_data+counter));
  46. printf("\n"); fflush(stdout);
  47. Decryptor_unseal_and_restore_long_term_signing_key_pair_wrapper(enclave_id, &ret_status, sealed_data, &length);
  48. free(sealed_data);
  49. return -1*ret_status; // ret_status is positive for error in sgx code.
  50. }
  51. }
  52. int look_for_signing_key_or_regenerate_it(sgx_enclave_id_t enclave_id, char* filename)
  53. {
  54. size_t sealed_key_size;
  55. uint32_t ret_status;
  56. int fd;
  57. sealed_key_size = FileIO::check_if_file_exists_return_size(filename, &fd);
  58. if(sealed_key_size == 0) // File is empty. create signing key pair.
  59. {
  60. printf("Creating new keypair.\n"); fflush(stdout);
  61. ret_status = create_and_seal_signing_key_pair_to_disk(enclave_id, fd);
  62. }
  63. else
  64. {
  65. printf("Unsealing keypair.\n"); fflush(stdout);
  66. ret_status = unseal_signing_key_pair_from_disk(enclave_id, fd, sealed_key_size);
  67. }
  68. close(fd);
  69. return ret_status;
  70. }
  71. }