|
@@ -29,15 +29,26 @@
|
|
|
*
|
|
|
*/
|
|
|
|
|
|
-
|
|
|
-
|
|
|
#include "Decryptor.h"
|
|
|
+#include "sgx_tseal.h"
|
|
|
+#include "sgx_tcrypto.h"
|
|
|
+#include "sgx_dh.h"
|
|
|
+#include "datatypes.h"
|
|
|
+#include "error_codes.h"
|
|
|
+
|
|
|
+
|
|
|
+ ECDSASignatureBox Decryptor::signatureBox;
|
|
|
+ HybridEncryptionBox Decryptor::hybridEncryptionBoxClient;
|
|
|
+ SymmetricEncryptionBox Decryptor::symmetricEncryptionBoxApache;
|
|
|
+ SymmetricEncryptionBox Decryptor::symmetricEncryptionBoxVerifier;
|
|
|
+ uint8_t Decryptor::verifier_mr_enclave[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
|
|
+ uint8_t Decryptor::apache_mr_signer[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
|
|
+
|
|
|
|
|
|
uint32_t Decryptor::create_mitigator_token_M(uint8_t* token)
|
|
|
{
|
|
|
uint32_t internal_return_status;
|
|
|
uint32_t counter;
|
|
|
- uint8_t verifier_mr_enclave[32];
|
|
|
|
|
|
internal_return_status = hybridEncryptionBoxClient.generate_keypair();
|
|
|
if(internal_return_status == NULL)
|
|
@@ -45,7 +56,6 @@
|
|
|
hybridEncryptionBoxClient.get_public_key(token);
|
|
|
|
|
|
|
|
|
- LocalAttestationTrusted::get_verifier_mr_enclave(verifier_mr_enclave);
|
|
|
for(counter=0;counter<32;counter++)
|
|
|
*(token + counter + ECDH_PUBLIC_KEY_SIZE) = verifier_mr_enclave[counter];
|
|
|
|
|
@@ -59,7 +69,7 @@
|
|
|
uint8_t local_signature_data[ECDH_PUBLIC_KEY_SIZE + 32];
|
|
|
uint32_t counter;
|
|
|
|
|
|
- if(LocalAttestationTrusted::one_successful_la_done() < 1)
|
|
|
+ if(LocalAttestationTrusted::get_one_successful_la_done() < 1)
|
|
|
return 0xde;
|
|
|
internal_return_status = Decryptor::create_mitigator_token_M(local_signature_data);
|
|
|
if(internal_return_status != 0x0)
|
|
@@ -103,7 +113,7 @@
|
|
|
ciphertext_length = total_length - ECDH_PUBLIC_KEY_SIZE - 16;
|
|
|
tag = ciphertext + ciphertext_length;
|
|
|
|
|
|
- internal_return_status = hybridEncryptionBoxClient.encrypt_decrypt(ciphertext, ciphertext_length, plaintext_client_data, &plaintext_client_data_length, tag);
|
|
|
+ internal_return_status = hybridEncryptionBoxClient.encrypt_decrypt(0, ciphertext, ciphertext_length, plaintext_client_data, plaintext_client_data_length, tag);
|
|
|
return internal_return_status;
|
|
|
}
|
|
|
|
|
@@ -124,9 +134,8 @@
|
|
|
|
|
|
internal_return_status = create_long_term_signing_keypair(private_public_key_string);
|
|
|
|
|
|
- temp_sealed_data = (uint8_t*) malloc(*temp_sealed_data_length);
|
|
|
- sgx_libcall_status = sgx_seal_data(0, NULL, 3*SGX_ECP256_KEY_SIZE, private_public_key_string, *temp_sealed_data_length, (sgx_sealed_data_t*) temp_sealed_data);
|
|
|
- free(private_public_key_string);
|
|
|
+ temp_sealed_data = (uint8_t*) malloc(temp_sealed_data_length);
|
|
|
+ sgx_libcall_status = sgx_seal_data(0, NULL, 3*SGX_ECP256_KEY_SIZE, private_public_key_string, temp_sealed_data_length, (sgx_sealed_data_t*) temp_sealed_data);
|
|
|
if(sgx_libcall_status != SGX_SUCCESS)
|
|
|
{
|
|
|
free(temp_sealed_data);
|
|
@@ -135,6 +144,7 @@
|
|
|
|
|
|
for(counter=0;counter<temp_sealed_data_length;counter++)
|
|
|
*(sealed_data + counter)=*(temp_sealed_data + counter);
|
|
|
+ *sealed_data_length = temp_sealed_data_length;
|
|
|
free(temp_sealed_data);
|
|
|
return 0;
|
|
|
}
|
|
@@ -149,11 +159,11 @@
|
|
|
uint32_t temp_ciphertext_token_H_length;
|
|
|
uint32_t internal_return_status;
|
|
|
|
|
|
- internal_return_status = create_mitigator_header_value(token_H, sign_data_and_sign + ECDH_PUBLIC_KEY_SIZE + 32);
|
|
|
+ internal_return_status = create_mitigator_header_H(sign_data_and_sign, sign_data_and_sign + ECDH_PUBLIC_KEY_SIZE + 32);
|
|
|
if(internal_return_status != 0)
|
|
|
return internal_return_status;
|
|
|
|
|
|
- internal_return_status = localAttestation.symmetricEncryptionBoxApache.encrypt_decrypt(1, sign_data_and_sign, ECDH_PUBLIC_KEY_SIZE + 32 + 64, temp_ciphertext_token_H, &temp_ciphertext_token_H_length, temp_tag);
|
|
|
+ internal_return_status = symmetricEncryptionBoxApache.encrypt_decrypt(1, sign_data_and_sign, ECDH_PUBLIC_KEY_SIZE + 32 + 64, temp_ciphertext_token_H, &temp_ciphertext_token_H_length, temp_tag);
|
|
|
if(internal_return_status != 0)
|
|
|
return internal_return_status;
|
|
|
|
|
@@ -198,7 +208,7 @@
|
|
|
return ret_status;
|
|
|
}
|
|
|
|
|
|
- signatureBox.set_keypair(temp_plaintext);
|
|
|
+ signatureBox.set_private_public_key(temp_plaintext, temp_plaintext + ECDH_PRIVATE_KEY_SIZE);
|
|
|
free(temp_plaintext);
|
|
|
return 0;
|
|
|
}
|
|
@@ -213,7 +223,7 @@
|
|
|
uint8_t* tag;
|
|
|
|
|
|
tag = ciphertext_plus_tag + 32;
|
|
|
- internal_return_status = localAttestation.symmetricEncryptionBoxVerifier.encrypt_decrypt(0, ciphertext_plus_tag, 32, temp_apache_mrsigner, &temp_apache_mrsigner_length, tag);
|
|
|
+ internal_return_status = symmetricEncryptionBoxVerifier.encrypt_decrypt(0, ciphertext_plus_tag, 32, temp_apache_mrsigner, &temp_apache_mrsigner_length, tag);
|
|
|
if(internal_return_status != 0)
|
|
|
return internal_return_status;
|
|
|
if(temp_apache_mrsigner_length != 32)
|
|
@@ -227,14 +237,15 @@
|
|
|
}
|
|
|
|
|
|
|
|
|
- uint32_t Decryptor::process_apache_message_generate_response(uint8_t* input_ciphertext, uint32_t input_ciphertext_plus_tag_length, uint8_t* output_ciphertext, uint32_t* output_ciphertext_plus_tag_length)
|
|
|
+ uint32_t Decryptor::process_apache_message_generate_response(uint8_t* input_ciphertext, uint32_t input_ciphertext_plus_tag_length, uint8_t* output_ciphertext_plus_tag, uint32_t* output_ciphertext_plus_tag_length)
|
|
|
{
|
|
|
- uint8_t* first_decryption_output, plaintext_client_data, temp_output_ciphertext;
|
|
|
- uint32_t first_decryption_output_length, plaintext_client_data_length, temp_output_ciphertext_plus_tag_length, internal_return_status;
|
|
|
- uint8_t temp_output_tag[16];
|
|
|
+ uint8_t *first_decryption_output, *plaintext_client_data, *temp_output_ciphertext;
|
|
|
+ uint32_t first_decryption_output_length, plaintext_client_data_length;
|
|
|
+ uint32_t temp_output_ciphertext_length, internal_return_status;
|
|
|
+ uint8_t temp_output_tag[16]; uint32_t counter;
|
|
|
|
|
|
- first_decryption_output = (uint8_t*) malloc(input_ciphertext_length + 10);
|
|
|
- internal_return_status = localAttestation.symmetricEncryptionBoxApache.encrypt_decrypt(0, input_ciphertext, input_ciphertext_length, first_decryption_output, &first_decryption_output_length, input_ciphertext + input_ciphertext_length - 16);
|
|
|
+ first_decryption_output = (uint8_t*) malloc(input_ciphertext_plus_tag_length);
|
|
|
+ internal_return_status = symmetricEncryptionBoxApache.encrypt_decrypt(0, input_ciphertext, input_ciphertext_plus_tag_length, first_decryption_output, &first_decryption_output_length, input_ciphertext + input_ciphertext_plus_tag_length - 16);
|
|
|
if(internal_return_status != 0)
|
|
|
{
|
|
|
free(first_decryption_output);
|
|
@@ -249,7 +260,7 @@
|
|
|
|
|
|
temp_output_ciphertext = (uint8_t*) malloc(plaintext_client_data_length + 20);
|
|
|
|
|
|
- internal_return_status = localAttestation.symmetricEncryptionBoxApache.encrypt_decrypt(1, plaintext_client_data, plaintext_client_data_length, temp_output_ciphertext, &temp_output_ciphertext_length, temp_output_tag);
|
|
|
+ internal_return_status = symmetricEncryptionBoxApache.encrypt_decrypt(1, plaintext_client_data, plaintext_client_data_length, temp_output_ciphertext, &temp_output_ciphertext_length, temp_output_tag);
|
|
|
free(plaintext_client_data);
|
|
|
if(internal_return_status != 0)
|
|
|
{
|
|
@@ -258,8 +269,32 @@
|
|
|
}
|
|
|
|
|
|
for(counter=0; counter<temp_output_ciphertext_length; counter++)
|
|
|
- output_ciphertext[counter] = temp_output_ciphertext[counter];
|
|
|
- *output_ciphertext_length = temp_output_ciphertext_length + 16;
|
|
|
+ output_ciphertext_plus_tag[counter] = temp_output_ciphertext[counter];
|
|
|
free(temp_output_ciphertext);
|
|
|
+ for(counter=0; counter<16;counter++)
|
|
|
+ output_ciphertext_plus_tag[counter] = temp_output_tag[counter];
|
|
|
+ *output_ciphertext_plus_tag_length = temp_output_ciphertext_length + 16;
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+uint32_t Decryptor::verify_peer_enclave_trust(uint8_t* given_mr_enclave, uint8_t* given_mr_signer, uint8_t* dhaek)
|
|
|
+{
|
|
|
+ uint32_t count;
|
|
|
+ if(LocalAttestationTrusted::get_one_successful_la_done() == 0)
|
|
|
+ {
|
|
|
+ for(count=0; count<SGX_HASH_SIZE; count++)
|
|
|
+ verifier_mr_enclave[count] = given_mr_enclave[count];
|
|
|
+ symmetricEncryptionBoxVerifier.set_symmetric_key(dhaek);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ for(count=0; count<SGX_HASH_SIZE; count++)
|
|
|
+ {
|
|
|
+ if( given_mr_signer[count] != apache_mr_signer[count] )
|
|
|
+ return ENCLAVE_TRUST_ERROR;
|
|
|
+ }
|
|
|
+ symmetricEncryptionBoxApache.set_symmetric_key(dhaek);
|
|
|
+ }
|
|
|
+ return SGX_SUCCESS;
|
|
|
+ }
|
|
|
+
|