SealingUntrusted.cpp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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(int fd)
  8. {
  9. uint32_t ret_status=0, length=0, counter=0;
  10. uint8_t* sealed_data;
  11. Decryptor_calculate_sealed_keypair_size_wrapper(e2_enclave_id, &length);
  12. if(length == 0xFFFFFFFF)
  13. return -31;
  14. sealed_data=(uint8_t*) malloc(length); // 0x300); // TODO: Shouldn't it be malloc of length?
  15. printf("length: %d\n", length); fflush(stdout);
  16. Decryptor_create_and_seal_long_term_signing_key_pair_wrapper(e2_enclave_id, &ret_status, &length, sealed_data);
  17. if(ret_status != SGX_SUCCESS)
  18. {
  19. printf("create_and_seal called returned an error: %x", ret_status);
  20. free(sealed_data);
  21. return -32;
  22. }
  23. printf("It returned sgx_success\n"); fflush(stdout);
  24. for(counter=0; counter<length; counter++)
  25. printf("%02x ", sealed_data[counter]);
  26. ret_status = FileIO::write_to_fd(fd, sealed_data, &length);
  27. free(sealed_data);
  28. return ret_status;
  29. }
  30. int unseal_signing_key_pair_from_disk(int fd, size_t sealed_msg_length_in_file)
  31. {
  32. uint32_t ret_status=0, length=sealed_msg_length_in_file, counter=0;
  33. uint8_t* sealed_data;
  34. sealed_data = (uint8_t*) malloc(sealed_msg_length_in_file);
  35. ret_status = FileIO::read_from_fd(fd, sealed_data, &length);
  36. if(ret_status == -1)
  37. {
  38. free(sealed_data);
  39. return -1;
  40. }
  41. length=ret_status;
  42. for(counter=0;counter<length;counter++)
  43. printf("%x ", *(sealed_data+counter));
  44. printf("\n"); fflush(stdout);
  45. Decryptor_unseal_and_restore_long_term_signing_key_pair_wrapper(e2_enclave_id, &ret_status, sealed_data, &length);
  46. free(sealed_data);
  47. return -1*ret_status; // ret_status is positive for error in sgx code.
  48. }
  49. }
  50. int look_for_signing_key_or_regenerate_it(char* filename)
  51. {
  52. size_t sealed_key_size;
  53. uint32_t ret_status;
  54. int fd;
  55. sealed_key_size = check_if_file_exists_return_size(filename, &fd);
  56. if(sealed_key_size == 0) // File is empty. create signing key pair.
  57. {
  58. printf("Creating new keypair.\n"); fflush(stdout);
  59. ret_status = create_and_seal_signing_key_pair_to_disk(fd);
  60. }
  61. else
  62. {
  63. printf("Unsealing keypair.\n"); fflush(stdout);
  64. ret_status = unseal_signing_key_pair_from_disk(fd, sealed_key_size);
  65. }
  66. close(fd);
  67. return ret_status;
  68. }
  69. }