1845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project/*
2845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * EAP peer method: EAP-TLV (draft-josefsson-pppext-eap-tls-eap-07.txt)
3845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * Copyright (c) 2004-2008, Jouni Malinen <j@w1.fi>
4845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project *
5845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * This program is free software; you can redistribute it and/or modify
6845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * it under the terms of the GNU General Public License version 2 as
7845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * published by the Free Software Foundation.
8845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project *
9845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * Alternatively, this software may be distributed under the terms of BSD
10845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * license.
11845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project *
12845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * See README and COPYING for more details.
13845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project */
14845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
15845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include "includes.h"
16845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
17845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include "common.h"
18845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include "eap_i.h"
19845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include "eap_tlv.h"
20845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
21845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
22845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project/**
23845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * eap_tlv_build_nak - Build EAP-TLV NAK message
24845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * @id: EAP identifier for the header
25845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * @nak_type: TLV type (EAP_TLV_*)
26845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * @resp_len: Buffer for returning the response length
27845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * Returns: Buffer to the allocated EAP-TLV NAK message or %NULL on failure
28845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project *
29845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * This funtion builds an EAP-TLV NAK message. The caller is responsible for
30845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * freeing the returned buffer.
31845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project */
32845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectu8 * eap_tlv_build_nak(int id, u16 nak_type, size_t *resp_len)
33845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
34845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	struct eap_hdr *hdr;
35845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	u8 *pos;
36845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
37845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	hdr = eap_msg_alloc(EAP_VENDOR_IETF, EAP_TYPE_TLV, resp_len,
38845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			    10, EAP_CODE_RESPONSE, id, &pos);
39845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (hdr == NULL)
40845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return NULL;
41845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
42845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	*pos++ = 0x80; /* Mandatory */
43845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	*pos++ = EAP_TLV_NAK_TLV;
44845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	/* Length */
45845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	*pos++ = 0;
46845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	*pos++ = 6;
47845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	/* Vendor-Id */
48845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	*pos++ = 0;
49845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	*pos++ = 0;
50845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	*pos++ = 0;
51845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	*pos++ = 0;
52845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	/* NAK-Type */
53845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	WPA_PUT_BE16(pos, nak_type);
54845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
55845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return (u8 *) hdr;
56845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
57845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
58845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
59845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project/**
60845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * eap_tlv_build_result - Build EAP-TLV Result message
61845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * @id: EAP identifier for the header
62845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * @status: Status (EAP_TLV_RESULT_SUCCESS or EAP_TLV_RESULT_FAILURE)
63845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * @resp_len: Buffer for returning the response length
64845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * Returns: Buffer to the allocated EAP-TLV Result message or %NULL on failure
65845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project *
66845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * This funtion builds an EAP-TLV Result message. The caller is responsible for
67845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * freeing the returned buffer.
68845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project */
69845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectu8 * eap_tlv_build_result(int id, u16 status, size_t *resp_len)
70845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
71845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	struct eap_hdr *hdr;
72845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	u8 *pos;
73845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
74845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	hdr = eap_msg_alloc(EAP_VENDOR_IETF, EAP_TYPE_TLV, resp_len,
75845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			    6, EAP_CODE_RESPONSE, id, &pos);
76845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (hdr == NULL)
77845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return NULL;
78845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
79845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	*pos++ = 0x80; /* Mandatory */
80845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	*pos++ = EAP_TLV_RESULT_TLV;
81845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	/* Length */
82845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	*pos++ = 0;
83845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	*pos++ = 2;
84845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	/* Status */
85845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	WPA_PUT_BE16(pos, status);
86845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
87845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return (u8 *) hdr;
88845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
89845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
90845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
91845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project/**
92845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * eap_tlv_process - Process a received EAP-TLV message and generate a response
93845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * @sm: Pointer to EAP state machine allocated with eap_sm_init()
94845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * @ret: Return values from EAP request validation and processing
95845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * @hdr: EAP-TLV request to be processed. The caller must have validated that
96845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * the buffer is large enough to contain full request (hdr->length bytes) and
97845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * that the EAP type is EAP_TYPE_TLV.
98845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * @resp: Buffer to return a pointer to the allocated response message. This
99845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * field should be initialized to %NULL before the call. The value will be
100845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * updated if a response message is generated. The caller is responsible for
101845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * freeing the allocated message.
102845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * @resp_len: Buffer for returning the response length
103845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * Returns: 0 on success, -1 on failure
104845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project */
105845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectint eap_tlv_process(struct eap_sm *sm, struct eap_method_ret *ret,
106845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		    const struct eap_hdr *hdr, u8 **resp, size_t *resp_len,
107845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		    int force_failure)
108845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{
109845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	size_t left, tlv_len;
110845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	const u8 *pos;
111845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	const u8 *result_tlv = NULL;
112845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	size_t result_tlv_len = 0;
113845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int tlv_type, mandatory;
114845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
115845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	/* Parse TLVs */
116845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	left = be_to_host16(hdr->length) - sizeof(struct eap_hdr) - 1;
117845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos = (const u8 *) (hdr + 1);
118845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	pos++;
119845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	wpa_hexdump(MSG_DEBUG, "EAP-TLV: Received TLVs", pos, left);
120845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	while (left >= 4) {
121845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		mandatory = !!(pos[0] & 0x80);
122845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		tlv_type = WPA_GET_BE16(pos) & 0x3fff;
123845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos += 2;
124845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		tlv_len = WPA_GET_BE16(pos);
125845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos += 2;
126845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		left -= 4;
127845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (tlv_len > left) {
128845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_printf(MSG_DEBUG, "EAP-TLV: TLV underrun "
129845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   "(tlv_len=%lu left=%lu)",
130845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   (unsigned long) tlv_len,
131845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   (unsigned long) left);
132845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return -1;
133845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
134845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		switch (tlv_type) {
135845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		case EAP_TLV_RESULT_TLV:
136845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			result_tlv = pos;
137845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			result_tlv_len = tlv_len;
138845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			break;
139845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		default:
140845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_printf(MSG_DEBUG, "EAP-TLV: Unsupported TLV Type "
141845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   "%d%s", tlv_type,
142845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   mandatory ? " (mandatory)" : "");
143845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (mandatory) {
144845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				/* NAK TLV and ignore all TLVs in this packet.
145845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				 */
146845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				*resp = eap_tlv_build_nak(hdr->identifier,
147845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project							  tlv_type, resp_len);
148845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				return *resp == NULL ? -1 : 0;
149845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			}
150845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			/* Ignore this TLV, but process other TLVs */
151845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			break;
152845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
153845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
154845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		pos += tlv_len;
155845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		left -= tlv_len;
156845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
157845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (left) {
158845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_printf(MSG_DEBUG, "EAP-TLV: Last TLV too short in "
159845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			   "Request (left=%lu)", (unsigned long) left);
160845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		return -1;
161845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
162845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
163845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	/* Process supported TLVs */
164845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	if (result_tlv) {
165845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		int status, resp_status;
166845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		wpa_hexdump(MSG_DEBUG, "EAP-TLV: Result TLV",
167845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			    result_tlv, result_tlv_len);
168845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (result_tlv_len < 2) {
169845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_printf(MSG_INFO, "EAP-TLV: Too short Result TLV "
170845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   "(len=%lu)",
171845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   (unsigned long) result_tlv_len);
172845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			return -1;
173845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
174845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		status = WPA_GET_BE16(result_tlv);
175845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		if (status == EAP_TLV_RESULT_SUCCESS) {
176845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_printf(MSG_INFO, "EAP-TLV: TLV Result - Success "
177845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   "- EAP-TLV/Phase2 Completed");
178845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			if (force_failure) {
179845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				wpa_printf(MSG_INFO, "EAP-TLV: Earlier failure"
180845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project					   " - force failed Phase 2");
181845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				resp_status = EAP_TLV_RESULT_FAILURE;
182845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				ret->decision = DECISION_FAIL;
183845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			} else {
184845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				resp_status = EAP_TLV_RESULT_SUCCESS;
185845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				ret->decision = DECISION_UNCOND_SUCC;
186845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			}
187845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		} else if (status == EAP_TLV_RESULT_FAILURE) {
188845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_printf(MSG_INFO, "EAP-TLV: TLV Result - Failure");
189845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			resp_status = EAP_TLV_RESULT_FAILURE;
190845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			ret->decision = DECISION_FAIL;
191845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		} else {
192845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			wpa_printf(MSG_INFO, "EAP-TLV: Unknown TLV Result "
193845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project				   "Status %d", status);
194845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			resp_status = EAP_TLV_RESULT_FAILURE;
195845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			ret->decision = DECISION_FAIL;
196845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		}
197845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		ret->methodState = METHOD_DONE;
198845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
199845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		*resp = eap_tlv_build_result(hdr->identifier, resp_status,
200845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project					     resp_len);
201845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	}
202845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
203845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	return 0;
204845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project}
205