string MessageHandler::handleAttestationResult()

in samplecode/psi/MessageHandler/MessageHandler.cpp [337:420]


string MessageHandler::handleAttestationResult(Messages::AttestationMessage msg) {
    Log("Received Attestation result");

    ra_samp_response_header_t *p_att_result_msg_full = NULL;
    this->assembleAttestationMSG(msg, &p_att_result_msg_full);
    sample_ra_att_result_msg_t *p_att_result_msg_body = (sample_ra_att_result_msg_t *) ((uint8_t*) p_att_result_msg_full + sizeof(ra_samp_response_header_t));

    sgx_status_t status;
    sgx_status_t ret;
    sgx_ra_context_t context = msg.context();
    uint32_t id = 0;
    uint8_t salt[SALT_SIZE];
    uint8_t mac[SGX_MAC_SIZE];

    ret = verify_att_result_mac(this->enclave->getID(),
                                &status,
                                context,
                                (uint8_t*)&p_att_result_msg_body->platform_info_blob,
                                sizeof(ias_platform_info_blob_t),
                                (uint8_t*)&p_att_result_msg_body->mac);


    if ((SGX_SUCCESS != ret) || (SGX_SUCCESS != status)) {
        Log("Error: INTEGRITY FAILED - attestation result message MK based cmac failed", log::error);
        SafeFree(p_att_result_msg_full);
        return generateAttestationFailed(context, id);
    }

    if (0 != p_att_result_msg_full->status[0] || 0 != p_att_result_msg_full->status[1]) {
        Log("Error, attestation mac result message MK based cmac failed", log::error);
        SafeFree(p_att_result_msg_full);
        return generateAttestationFailed(context, id);
    } else {
        ret = verify_secret_data(this->enclave->getID(),
                                 &status,
                                 context,
                                 p_att_result_msg_body->secret.payload,
                                 p_att_result_msg_body->secret.payload_size,
                                 p_att_result_msg_body->secret.payload_tag,
                                 MAX_VERIFICATION_RESULT,
                                 salt,
                                 mac,
                                 &id);

        SafeFree(p_att_result_msg_full);

        if (SGX_SUCCESS != ret) {
            Log("Error, attestation result message secret using SK based AESGCM failed", log::error);
            Log("Error  on ret , code : %08X\n",ret);
            print_error_message(ret);

            return generateAttestationFailed(context, id);

        } else if (SGX_SUCCESS != status) {
            Log("Error, attestation result message secret using SK based AESGCM failed", log::error);
            Log("Error  on status, code : %08X\n",status);
            print_error_message(status);

            return generateAttestationFailed(context, id);

        } else {
            Log("Send attestation okay");

            Messages::MessagePsiSalt msg;
            msg.set_type(RA_PSI_SLAT);
            msg.set_size(0);
            msg.set_state(1);
            msg.set_context(context);
            msg.set_id(id);

            for (int i = 0; i < SALT_SIZE; i++) {
                msg.add_salt(salt[i]);
            }

            for (int i = 0; i < SGX_MAC_SIZE; i++) {
                msg.add_mac(mac[i]);
            }

            return nm->serialize(msg);
        }
    }

    return "";
}