proper notification handling

This commit is contained in:
Martin Willi
2007-04-10 15:00:51 +00:00
parent 83e60eb29a
commit d3e1da2378
+103 -1
View File
@@ -398,6 +398,30 @@ static status_t process_start(private_eap_sim_t *this, eap_payload_t *in,
/* only include AT_IDENTITY if requested */
include_id = AT_IDENTITY;
break;
case AT_NOTIFICATION:
{
u_int16_t code = 0;
if (data.len == 2)
{
code = ntohs(*(u_int16_t*)data.ptr);
}
if (code <= 32767) /* no success bit */
{
DBG1(DBG_IKE, "received %N error %d",
sim_attribute_names, attribute, code);
*out = build_payload(this,
in->get_identifier(in), SIM_CLIENT_ERROR,
AT_CLIENT_ERROR_CODE, client_error_general,
AT_END);
return NEED_MORE;
}
else
{
DBG1(DBG_IKE, "received %N code %d",
sim_attribute_names, attribute, code);
}
break;
}
default:
DBG1(DBG_IKE, "ignoring EAP_SIM attribute %N",
sim_attribute_names, attribute);
@@ -456,6 +480,30 @@ static status_t process_challenge(private_eap_sim_t *this, eap_payload_t *in,
memset(data.ptr, 0, data.len);
break;
}
case AT_NOTIFICATION:
{
u_int16_t code = 0;
if (data.len == 2)
{
code = ntohs(*(u_int16_t*)data.ptr);
}
if (code <= 32767) /* no success bit */
{
DBG1(DBG_IKE, "received %N error %d",
sim_attribute_names, attribute, code);
*out = build_payload(this,
in->get_identifier(in), SIM_CLIENT_ERROR,
AT_CLIENT_ERROR_CODE, client_error_general,
AT_END);
return NEED_MORE;
}
else
{
DBG1(DBG_IKE, "received %N code %d",
sim_attribute_names, attribute, code);
}
break;
}
default:
DBG1(DBG_IKE, "ignoring EAP_SIM attribute %N",
sim_attribute_names, attribute);
@@ -472,7 +520,7 @@ static status_t process_challenge(private_eap_sim_t *this, eap_payload_t *in,
*out = build_payload(this, identifier, SIM_CLIENT_ERROR,
AT_CLIENT_ERROR_CODE, client_error_insufficient,
AT_END);
return FAILED;
return NEED_MORE;
}
if (mac.len != MAC_LEN)
{
@@ -556,6 +604,58 @@ static status_t process_challenge(private_eap_sim_t *this, eap_payload_t *in,
return NEED_MORE;
}
/**
* process an EAP-SIM/Request/Notification message
*/
static status_t process_notification(private_eap_sim_t *this, eap_payload_t *in,
eap_payload_t **out)
{
chunk_t message, data;
sim_attribute_t attribute;
message = in->get_data(in);
read_header(&message);
while ((attribute = read_attribute(&message, &data)) != AT_END)
{
switch (attribute)
{
case AT_NOTIFICATION:
{
u_int16_t code = 0;
if (data.len == 2)
{
code = ntohs(*(u_int16_t*)data.ptr);
}
if (code <= 32767) /* no success bit */
{
DBG1(DBG_IKE, "received %N error %d",
sim_attribute_names, attribute, code);
*out = build_payload(this,
in->get_identifier(in), SIM_CLIENT_ERROR,
AT_CLIENT_ERROR_CODE, client_error_general,
AT_END);
return NEED_MORE;
}
else
{
DBG1(DBG_IKE, "received %N code %d",
sim_attribute_names, attribute, code);
}
break;
}
default:
DBG1(DBG_IKE, "ignoring EAP_SIM attribute %N",
sim_attribute_names, attribute);
break;
}
}
/* reply with empty notification */
*out = build_payload(this, in->get_identifier(in), SIM_NOTIFICATION, AT_END);
return NEED_MORE;
}
/**
* Implementation of eap_method_t.process for the peer
*/
@@ -574,6 +674,8 @@ static status_t process(private_eap_sim_t *this,
return process_start(this, in, out);
case SIM_CHALLENGE:
return process_challenge(this, in, out);
case SIM_NOTIFICATION:
return process_notification(this, in, out);
default:
DBG1(DBG_IKE, "unable to process EAP_SIM subtype %N",
sim_subtype_names, type);