SealingUntrusted.cpp 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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, char* filename)
  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_filename(filename, 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, char* filename, 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_filename(filename, sealed_data, &length);
  38. if(ret_status == -1)
  39. {
  40. free(sealed_data);
  41. return -1;
  42. }
  43. printf("Here's the chars my dudes: they are of length %d.\n", length);
  44. fflush(stdout);
  45. for(counter=0;counter<length;counter++)
  46. printf("%x ", *(sealed_data+counter));
  47. printf("\n"); fflush(stdout);
  48. Decryptor_unseal_and_restore_long_term_signing_key_pair_wrapper(enclave_id, &ret_status, sealed_data, &length);
  49. free(sealed_data);
  50. return -1*ret_status; // ret_status is positive for error in sgx code.
  51. }
  52. }
  53. int look_for_signing_key_or_regenerate_it(sgx_enclave_id_t enclave_id, char* filename)
  54. {
  55. size_t sealed_key_size;
  56. uint32_t ret_status;
  57. int fd;
  58. sealed_key_size = FileIO::check_if_file_exists_return_size(filename);
  59. if(sealed_key_size == 0) // File is empty. create signing key pair.
  60. {
  61. printf("Creating new keypair.\n"); fflush(stdout);
  62. ret_status = create_and_seal_signing_key_pair_to_disk(enclave_id, filename);
  63. }
  64. else
  65. {
  66. printf("Unsealing keypair of size %d.\n", sealed_key_size); fflush(stdout);
  67. ret_status = unseal_signing_key_pair_from_disk(enclave_id, filename, sealed_key_size);
  68. }
  69. return ret_status;
  70. }
  71. }