Ejemplo n.º 1
0
static struct wpabuf * eap_tnc_build(struct eap_sm *sm,
				     struct eap_tnc_data *data)
{
	struct wpabuf *req;
	u8 *rpos, *rpos1;
	size_t rlen;
	char *start_buf, *end_buf;
	size_t start_len, end_len;
	size_t imv_len;

	imv_len = tncs_total_send_len(data->tncs);

	start_buf = tncs_if_tnccs_start(data->tncs);
	if (start_buf == NULL)
		return NULL;
	start_len = os_strlen(start_buf);
	end_buf = tncs_if_tnccs_end();
	if (end_buf == NULL) {
		os_free(start_buf);
		return NULL;
	}
	end_len = os_strlen(end_buf);

	rlen = start_len + imv_len + end_len;
	req = wpabuf_alloc(rlen);
	if (req == NULL) {
		os_free(start_buf);
		os_free(end_buf);
		return NULL;
	}

	wpabuf_put_data(req, start_buf, start_len);
	os_free(start_buf);

	rpos1 = wpabuf_put(req, 0);
	rpos = tncs_copy_send_buf(data->tncs, rpos1);
	wpabuf_put(req, rpos - rpos1);

	wpabuf_put_data(req, end_buf, end_len);
	os_free(end_buf);

	wpa_hexdump_ascii(MSG_MSGDUMP, "EAP-TNC: Request",
			  wpabuf_head(req), wpabuf_len(req));

	return req;
}
Ejemplo n.º 2
0
enum tncs_process_res tncs_process_if_tnccs(struct tncs_data *tncs,
        const u8 *msg, size_t len)
{
    char *buf, *start, *end, *pos, *pos2, *payload;
    unsigned int batch_id;
    unsigned char *decoded;
    size_t decoded_len;

    buf = os_malloc(len + 1);
    if (buf == NULL)
        return TNCCS_PROCESS_ERROR;

    os_memcpy(buf, msg, len);
    buf[len] = '\0';
    start = os_strstr(buf, "<TNCCS-Batch ");
    end = os_strstr(buf, "</TNCCS-Batch>");
    if (start == NULL || end == NULL || start > end) {
        os_free(buf);
        return TNCCS_PROCESS_ERROR;
    }

    start += 13;
    while (*start == ' ')
        start++;
    *end = '\0';

    pos = os_strstr(start, "BatchId=");
    if (pos == NULL) {
        os_free(buf);
        return TNCCS_PROCESS_ERROR;
    }

    pos += 8;
    if (*pos == '"')
        pos++;
    batch_id = atoi(pos);
    wpa_printf(MSG_DEBUG, "TNC: Received IF-TNCCS BatchId=%u",
               batch_id);
    if (batch_id != tncs->last_batchid + 1) {
        wpa_printf(MSG_DEBUG, "TNC: Unexpected IF-TNCCS BatchId "
                   "%u (expected %u)",
                   batch_id, tncs->last_batchid + 1);
        os_free(buf);
        return TNCCS_PROCESS_ERROR;
    }
    tncs->last_batchid = batch_id;

    while (*pos != '\0' && *pos != '>')
        pos++;
    if (*pos == '\0') {
        os_free(buf);
        return TNCCS_PROCESS_ERROR;
    }
    pos++;
    payload = start;

    /*
     * <IMC-IMV-Message>
     * <Type>01234567</Type>
     * <Base64>foo==</Base64>
     * </IMC-IMV-Message>
     */

    while (*start) {
        char *endpos;
        unsigned int type;

        pos = os_strstr(start, "<IMC-IMV-Message>");
        if (pos == NULL)
            break;
        start = pos + 17;
        end = os_strstr(start, "</IMC-IMV-Message>");
        if (end == NULL)
            break;
        *end = '\0';
        endpos = end;
        end += 18;

        if (tncs_get_type(start, &type) < 0) {
            *endpos = '<';
            start = end;
            continue;
        }
        wpa_printf(MSG_DEBUG, "TNC: IMC-IMV-Message Type 0x%x", type);

        decoded = tncs_get_base64(start, &decoded_len);
        if (decoded == NULL) {
            *endpos = '<';
            start = end;
            continue;
        }

        tncs_send_to_imvs(tncs, type, decoded, decoded_len);

        os_free(decoded);

        start = end;
    }

    /*
     * <TNCC-TNCS-Message>
     * <Type>01234567</Type>
     * <XML><TNCCS-Foo type="foo"></TNCCS-Foo></XML>
     * <Base64>foo==</Base64>
     * </TNCC-TNCS-Message>
     */

    start = payload;
    while (*start) {
        unsigned int type;
        char *xml, *xmlend, *endpos;

        pos = os_strstr(start, "<TNCC-TNCS-Message>");
        if (pos == NULL)
            break;
        start = pos + 19;
        end = os_strstr(start, "</TNCC-TNCS-Message>");
        if (end == NULL)
            break;
        *end = '\0';
        endpos = end;
        end += 20;

        if (tncs_get_type(start, &type) < 0) {
            *endpos = '<';
            start = end;
            continue;
        }
        wpa_printf(MSG_DEBUG, "TNC: TNCC-TNCS-Message Type 0x%x",
                   type);

        /* Base64 OR XML */
        decoded = NULL;
        xml = NULL;
        xmlend = NULL;
        pos = os_strstr(start, "<XML>");
        if (pos) {
            pos += 5;
            pos2 = os_strstr(pos, "</XML>");
            if (pos2 == NULL) {
                *endpos = '<';
                start = end;
                continue;
            }
            xmlend = pos2;
            xml = pos;
        } else {
            decoded = tncs_get_base64(start, &decoded_len);
            if (decoded == NULL) {
                *endpos = '<';
                start = end;
                continue;
            }
        }

        if (decoded) {
            wpa_hexdump_ascii(MSG_MSGDUMP,
                              "TNC: TNCC-TNCS-Message Base64",
                              decoded, decoded_len);
            os_free(decoded);
        }

        if (xml) {
            wpa_hexdump_ascii(MSG_MSGDUMP,
                              "TNC: TNCC-TNCS-Message XML",
                              (unsigned char *) xml,
                              xmlend - xml);
        }

        start = end;
    }

    os_free(buf);

    tncs_batch_ending(tncs);

    if (tncs_total_send_len(tncs) == 0)
        return tncs_derive_recommendation(tncs);

    return TNCCS_PROCESS_OK_NO_RECOMMENDATION;
}