LA.cpp 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. //
  2. // Created by miti on 2020-01-01.
  3. //
  4. #include <stdio.h>
  5. #include "../../Decryptor/Decryptor_u.h"
  6. #include "sgx_eid.h"
  7. #include "sgx_urts.h"
  8. #define __STDC_FORMAT_MACROS
  9. #include <inttypes.h>
  10. #include "ProtobufLAMessages.pb.h"
  11. #include "Transforms.h"
  12. int LA::generate_protobuf_dh_msg1(uint32_t own_enclave_id, protobuf_sgx_dh_msg1_t& protobuf_msg1)
  13. {
  14. sgx_dh_msg1_t dh_msg1; //Diffie-Hellman Message 1
  15. memset(&dh_msg1, 0, sizeof(sgx_dh_msg1_t));
  16. uint32_t ret_status;
  17. Decryptor_session_request_wrapper(own_enclave_id, &ret_status, &dh_msg1);
  18. if(ret_status != SGX_SUCCESS)
  19. return 0xffffffff;
  20. Transforms::encode_msg1_to_protobuf(protobuf_msg1, &dh_msg1);
  21. printf("Generated the following Msg1: ------------- \n"); fflush(stdout);
  22. Transforms::print_initialized_msg1(protobuf_msg1, &dh_msg1);
  23. return 0;
  24. }
  25. int LA::process_protobuf_dh_msg2_generate_protobuf_dh_msg3(uint32_t own_enclave_id, protobuf_sgx_dh_msg2_t& protobuf_msg2, protobuf_sgx_dh_msg3_t& protobuf_msg3, uint32_t* session_id)
  26. {
  27. uint32_t ret_status;
  28. sgx_dh_msg2_t dh_msg2; //Diffie-Hellman Message 2
  29. sgx_dh_msg3_t dh_msg3; //Diffie-Hellman Message 3
  30. sgx_key_128bit_t dh_aek; // Session Key
  31. memset(&dh_aek,0, sizeof(sgx_key_128bit_t));
  32. memset(&dh_msg2, 0, sizeof(sgx_dh_msg2_t));
  33. memset(&dh_msg3, 0, sizeof(sgx_dh_msg3_t));
  34. if(decode_msg2_from_protobuf(protobuf_msg2, &dh_msg2)!=0)
  35. return -1;
  36. // process msg2 and generate msg3
  37. Decryptor_exchange_report_wrapper(own_enclave_id, &ret_status, &dh_msg2, &dh_msg3);
  38. if(ret_status!=SGX_SUCCESS)
  39. return 0x35;
  40. // convert msg3 sgx_dh_msg3_t object to a protobuf msg3 object.
  41. encode_msg3_to_protobuf(protobuf_msg3, &dh_msg3);
  42. return 0;
  43. }
  44. int LA::conduct_la(uint32_t own_enclave_id, int fd)
  45. {
  46. // declare msg1, msg2, msg3 protobuf objects
  47. protobuf_sgx_dh_msg1_t protobuf_msg1;
  48. protobuf_sgx_dh_msg2_t protobuf_msg2;
  49. protobuf_sgx_dh_msg3_t protobuf_msg3;
  50. uint32_t protobuf_sgx_ret;
  51. setbuf(stdout,NULL);
  52. protobufReaderWriter.set_fd(fd);
  53. protobuf_sgx_ret = generate_protobuf_dh_msg1(own_enclave_id, protobuf_msg1);
  54. if(protobuf_sgx_ret != 0)
  55. {
  56. printf("Error in generate_protobuf_dh_msg1: 0x%x", protobuf_sgx_ret); fflush(stdout); return protobuf_sgx_ret;
  57. }
  58. printf("Writing message 1\n"); fflush(stdout);
  59. if(protobufReaderWriter.write_msg(protobuf_msg1)!=0)
  60. return 0x1;
  61. printf("Reading message 2\n"); fflush(stdout);
  62. if(protobufReaderWriter.read_msg(protobuf_msg2)!=0)
  63. return 0x2;
  64. protobuf_sgx_ret = process_protobuf_dh_msg2_generate_protobuf_dh_msg3(own_enclave_id, protobuf_msg2, protobuf_msg3);
  65. if(protobuf_sgx_ret != 0)
  66. {
  67. printf("Error in process_protobuf_dh_msg2_generate_protobuf_dh_msg3: 0x%x", protobuf_sgx_ret);
  68. fflush(stdout);
  69. return protobuf_sgx_ret;
  70. }
  71. printf("Writing message 3\n"); fflush(stdout);
  72. if(protobufReaderWriter.write_msg(protobuf_msg3)!=0)
  73. return 0x3;
  74. return 0;
  75. }
  76. void LA::get_la_symmetric_key(uint8_t* op_key)
  77. {
  78. uint32_t counter;
  79. for(counter=0; counter<16; counter++)
  80. op_key[counter] = key[counter];
  81. }