#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}; uint8_t Decryptor::apache_mr_signer[32] = {0}; unsigned int successful_la_count; uint8_t Decryptor::plaintext_mitigator_header_H[ECDH_PUBLIC_KEY_SIZE + 32 + 64] = {0}; uint8_t Decryptor::first_decryption_output[1092] = {0}; uint8_t Decryptor::plaintext_client_data[1000] = {0}; // INTERNAL uint32_t Decryptor::create_mitigator_token_M(uint8_t* token) { uint32_t internal_return_status; uint32_t counter; // create short-term ECDH key pair internal_return_status = hybridEncryptionBoxClient.generate_keypair(); if(internal_return_status != 0) return internal_return_status; hybridEncryptionBoxClient.get_public_key(token); // create token: concatenate short-term keypair with verifiers mrenclave. for(counter=0;counter<32;counter++) *(token + counter + ECDH_PUBLIC_KEY_SIZE) = verifier_mr_enclave[counter]; return 0; } // INTERNAL uint32_t Decryptor::create_mitigator_header_H(uint8_t* signature_data_and_signature) { uint32_t internal_return_status; uint8_t local_signature_data_and_signature[ECDH_PUBLIC_KEY_SIZE + 32 + 64]; uint32_t counter; internal_return_status = Decryptor::create_mitigator_token_M(local_signature_data_and_signature); if(internal_return_status != 0x0) return internal_return_status; internal_return_status = signatureBox.sign(local_signature_data_and_signature, ECDH_PUBLIC_KEY_SIZE + 32, local_signature_data_and_signature + ECDH_PUBLIC_KEY_SIZE + 32); if(internal_return_status != 0x0) return internal_return_status; for(counter=0;counter