in samplecode/psi/MessageHandler/MessageHandler.cpp [494:576]
string MessageHandler::handlePsiHashDataFinished(Messages::MessagePsiHashDataFinished msg, bool* again) {
sgx_ra_context_t context = msg.context();
uint32_t id = msg.id();
uint8_t mac[SGX_MAC_SIZE] = {0};
uint8_t * data = NULL;
size_t data_size = 0;
sgx_status_t status;
sgx_status_t ret;
Log("[PSI] Received hash data finished, %d", id);
ret = get_result_size(this->enclave->getID(), &status, id, &data_size);
if (SGX_SUCCESS != ret) {
Log("[PSI] get_result_size failed, %d", ret);
return "";
}
if (SGX_SUCCESS != status) {
if (status == SGX_ERROR_INVALID_STATE) {
*again = true;
Messages::MessagePsiResult result;
result.set_type(RA_PSI_RESULT);
result.set_size(0);
result.set_state(1); //tell sp req result again
result.set_context(msg.context());
result.set_id(msg.id());
Log("[PSI] has not calc result success");
return nm->serialize(result);
} else {
Log("[PSI] get_result_size failed, %d, %d", ret, status);
return "";
}
}
if (data_size > 0) {
data = (uint8_t*)malloc(data_size);
if (data == NULL) {
Log("[PSI] alloc buffer for intersect data failed!");
return "";
}
ret = get_result(this->enclave->getID(),
&status,
id,
context,
data,
data_size,
mac);
if (SGX_SUCCESS != ret || SGX_SUCCESS != status) {
Log("[PSI] get_result failed, %d, %d", ret, status);
return "";
}
}
Messages::MessagePsiIntersect intersect;
intersect.set_type(RA_PSI_INTERSECT);
intersect.set_size(0);
intersect.set_id(msg.id());
intersect.set_context(context);
for (int i = 0; i < SGX_MAC_SIZE; i++) {
intersect.add_mac(mac[i]);
}
if (data && data_size) {
for (int i = 0; i < data_size; i++) {
intersect.add_data(data[i]);
}
}
if (data) {
SafeFree(data);
}
enclave_ra_close(this->enclave->getID(), &status, context);
Log("[PSI] get result success, %d", data_size/SGX_HASH_SIZE);
return nm->serialize(intersect);
}