// // Created by miti on 2019-12-24. // #include "PostLAMessages.pb.h" #include "PostLAMessaging.h" #include #include #include "Decryptor_u.h" int PostLAMessaging::process_target_data_msg(extension_to_decryptor_msg& incomingMsg, decryptor_to_extension_msg& outgoingMsg) { const char* client_public_key; uint8_t* incoming_client_data, *outgoing_client_data; const char *field_string; uint32_t* input_field_sizes, *output_field_sizes; std::string client_public_key_string; uint32_t sgx_ret_status, client_public_key_length, field_counter, byte_counter, field_size, no_of_fields, total_input_length, field_size_accumulator; uint32_t counter; // Initialize the client public key printf("Initialize the client public key\n"); fflush(stdout); client_public_key_string = incomingMsg.ciphertext_client_public_key(); client_public_key_length = client_public_key_string.length(); // client_public_key = (uint8_t*) malloc(client_public_key_length); client_public_key = client_public_key_string.c_str(); // Initialize an array of sizes - first element is the length of the public key // and rest are sizes of each of the incoming ciphertext fields (an input arg. to the ecall). // Initialize an array to store the sizes of the *outgoing* fields too. printf("Initialize an array of sizes \n"); fflush(stdout); no_of_fields = incomingMsg.fields_size() + 1; // extra one for public key. input_field_sizes = (uint32_t*) malloc(no_of_fields); output_field_sizes = (uint32_t*) malloc(no_of_fields); total_input_length = client_public_key_length; printf("Setting input_field_sizes\n"); fflush(stdout); input_field_sizes[0] = client_public_key_length; for(field_counter=1; field_counterset_field(outgoing_client_data + field_size_accumulator,field_size); printf("%u bytes\n", field_size); for(byte_counter=field_size_accumulator; byte_counter 400) { printf("Could not fit all of verifiers token into the buffer.\n"); fflush(stdout); return 0x2; } Decryptor_process_verifiers_message_wrapper(enclave_id, &sgx_ret_status, token, token_length); free(token); return sgx_ret_status; } int PostLAMessaging::receive_decrypt_client_data_from_target() { extension_to_decryptor_msg incomingMsg; decryptor_to_extension_msg outgoingMsg; int ret_status; printf("Listening for the target's msg.\n"); fflush(stdout); if( targetChannelData.read_msg(incomingMsg) != 0) { printf("Error in protobuf in receiving msg from target.\n"); fflush(stdout); return 0x1; } printf("Obtained a msg from the target. Processing it.\n"); fflush(stdout); ret_status = process_target_data_msg(incomingMsg, outgoingMsg); if(ret_status != 0) { printf("Error in processing msg from target.\n"); fflush(stdout); return 0x2; } printf("Writing the msg back to the target.\n"); fflush(stdout); if( targetChannelData.write_msg(outgoingMsg) != 0) { printf("Error in protobuf in sending msg to target.\n"); fflush(stdout); return 0x3; } return 0; } int PostLAMessaging::read_and_write_header() { uint32_t sgx_ret_status, value_length, protobuf_ret_status; uint8_t* header_value = (uint8_t*) malloc(400); mitigator_header headerMsg; if(targetChannelHeaders.read_msg(headerMsg) != 0) { printf("Error in reading msg for headers.\n"); fflush(stdout); return 0x1; } Decryptor_create_and_encrypt_mitigator_header_H_wrapper(enclave_id, &sgx_ret_status, header_value, &value_length); if(sgx_ret_status != 0 ) { printf("Could not create mitigator header.\n"); fflush(stdout); return sgx_ret_status; } uint32_t counter; for(counter=0;counter