310 lines
10 KiB
C
310 lines
10 KiB
C
/*
|
|
******************************************************************************
|
|
* SOURCE FILE
|
|
*
|
|
* Document no: @(#) $Name: VXWORKS_ITER40_RCPL8_2024030303 $ $RCSfile: ipike2_payload_identification.c,v $ $Revision: 1.10.16.4 $
|
|
* $Source: /home/interpeak/CVSRoot/ipike/src/ipike2_payload_identification.c,v $
|
|
* $Author: wdeng $ $Date: 2021-11-05 09:51:39 $
|
|
* $State: Exp $ $Locker: $
|
|
*
|
|
* INTERPEAK_COPYRIGHT_STRING
|
|
* Design and implementation by Kenneth Jonsson <kenneth@interpeak.se>
|
|
******************************************************************************
|
|
*/
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 1 DESCRIPTION
|
|
****************************************************************************
|
|
*/
|
|
|
|
/* Identification payload (IKE version 2) */
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 2 CONFIGURATION
|
|
****************************************************************************
|
|
*/
|
|
#include "ipike_config.h"
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 3 INCLUDE FILES
|
|
****************************************************************************
|
|
*/
|
|
|
|
#ifdef IPIKE_USE_VERSION2
|
|
|
|
#include "ipike_h.h"
|
|
#include "ipike_payload_identification.h"
|
|
#include "ipike2_payload_identification.h"
|
|
#include "ipike_util.h"
|
|
#include "ipike_configuration.h"
|
|
|
|
#include <ipcom_sock2.h>
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 4 EXTERN PROTOTYPES
|
|
****************************************************************************
|
|
*/
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 5 DEFINES
|
|
****************************************************************************
|
|
*/
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 6 TYPES
|
|
****************************************************************************
|
|
*/
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 7 LOCAL PROTOTYPES
|
|
****************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*===========================================================================
|
|
* ipike_payload_identification_data
|
|
*===========================================================================
|
|
* Description: Returns a pointer to the id data in the payload.
|
|
* Parameters: id - a id payload.
|
|
* Returns: A pointer to the id data.
|
|
*/
|
|
IP_STATIC Ip_u8 *
|
|
ipike_payload_identification_data(Ipike2_id_payload* id);
|
|
|
|
/*
|
|
*===========================================================================
|
|
* ipike_payload_identification_data_length
|
|
*===========================================================================
|
|
* Description: Returns the length of the indetification data.
|
|
* Parameters: id - a id payload.
|
|
* Returns: The length of the id data.
|
|
*/
|
|
IP_STATIC Ip_u16
|
|
ipike_payload_identification_data_length(Ipike2_id_payload* id);
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 8 DATA
|
|
****************************************************************************
|
|
*/
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 9 LOCAL FUNCTIONS
|
|
****************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*===========================================================================
|
|
* ipike_payload_identification_data
|
|
*===========================================================================
|
|
*/
|
|
IP_STATIC Ip_u8 *
|
|
ipike_payload_identification_data(Ipike2_id_payload* id)
|
|
{
|
|
return (Ip_u8*) id + sizeof(Ipike2_id_payload);
|
|
}
|
|
|
|
/*
|
|
*===========================================================================
|
|
* ipike_payload_identification_data_length
|
|
*===========================================================================
|
|
*/
|
|
IP_STATIC Ip_u16
|
|
ipike_payload_identification_data_length(Ipike2_id_payload* id)
|
|
{
|
|
return IPIKE_PAYLOAD_DATA_LENGTH(id->header.length, sizeof(Ipike2_id_payload));
|
|
}
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 10 PUBLIC FUNCTIONS
|
|
****************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*===========================================================================
|
|
* ipike_payload_identification_generate
|
|
*===========================================================================
|
|
*/
|
|
IP_GLOBAL Ipike_error
|
|
ipike_payload_identification_generate(
|
|
const char* value,
|
|
Ip_bool initiator,
|
|
Ipike2_id* id)
|
|
{
|
|
Ipike_error err;
|
|
char* type = IP_NULL;
|
|
|
|
ipcom_memset(id, 0, sizeof(*id));
|
|
if (IPIKE_SUCCESS != (err = ipike_parse_get_string(&value, ' ', &type)))
|
|
{
|
|
IPCOM_LOG0(ERR, "ipike_payload_identification_generate: failed to get id type");
|
|
}
|
|
else if (IPIKE_SUCCESS != (err = ipike_attribute_id_type_from_string(type, &id->info.id_type)))
|
|
{
|
|
IPCOM_LOG1(ERR, "ipike_payload_identification_generate: failed to get id type from string (%s)", type);
|
|
}
|
|
else
|
|
{
|
|
switch (id->info.id_type)
|
|
{
|
|
case IPIKE_ID_IPV4_ADDR:
|
|
case IPIKE_ID_IPV6_ADDR:
|
|
err = ipike_identification_init_ip_address(value, &id->info.id_type, &id->data);
|
|
break;
|
|
case IPIKE_ID_FQDN:
|
|
case IPIKE_ID_USER_FQDN:
|
|
case IPIKE_ID_KEY_ID:
|
|
err = ipike_identification_init_value(value, &id->data);
|
|
break;
|
|
case IPIKE_ID_DER_ASN1_DN:
|
|
err = ipike_identification_init_asn1_dn(value, &id->data);
|
|
break;
|
|
default:
|
|
IPCOM_LOG1(ERR, "ipike_payload_identification_generate: Type %s is not supported", type);
|
|
err = IPIKE_CONF_INVALID_VALUE;
|
|
}
|
|
}
|
|
id->initiator = initiator;
|
|
ipcom_free(type);
|
|
|
|
return err;
|
|
}
|
|
|
|
/*
|
|
*===========================================================================
|
|
* ipike_payload_identification_create
|
|
*===========================================================================
|
|
*/
|
|
IP_GLOBAL Ipike_error
|
|
ipike_payload_identification_create(
|
|
Ipike2_id* id,
|
|
Ipike2_id_payload** payload)
|
|
{
|
|
Ipike2_id_payload *id_payload;
|
|
|
|
if (IP_NULL == (id_payload = ipcom_calloc(1, sizeof(Ipike2_id_payload) + id->data.len)))
|
|
{
|
|
IP_PANIC();
|
|
return IPIKE_OUT_OF_MEMORY;
|
|
}
|
|
id_payload->header.length = (Ip_u16)(ip_htons(sizeof(Ipike2_id_payload) + id->data.len));
|
|
if (id->initiator)
|
|
id_payload->header.next_payload = IPIKE2_PAYLOAD_IDENTIFICATION_I;
|
|
else
|
|
id_payload->header.next_payload = IPIKE2_PAYLOAD_IDENTIFICATION_R;
|
|
id_payload->id_type = id->info.id_type;
|
|
ipcom_memcpy(ipike_payload_identification_data(id_payload), id->data.value, id->data.len);
|
|
*payload = id_payload;
|
|
|
|
return IPIKE_SUCCESS;
|
|
}
|
|
|
|
/*
|
|
*===========================================================================
|
|
* ipike_payload_identification_free
|
|
*===========================================================================
|
|
*/
|
|
IP_GLOBAL void
|
|
ipike_payload_identification_free(Ipike2_id* id)
|
|
{
|
|
if ( id->data.value )
|
|
{
|
|
ipcom_free(id->data.value);
|
|
ipcom_memset(id, 0, sizeof(*id));
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
*===========================================================================
|
|
* ipike_payload_identification_check
|
|
*===========================================================================
|
|
*/
|
|
IP_GLOBAL Ipike_error
|
|
ipike_payload_identification_check(Ipike2_id_payload* id)
|
|
{
|
|
if (ip_ntohs(id->header.length) < sizeof(Ipike2_id_payload))
|
|
{
|
|
IPCOM_LOG2(ERR,
|
|
"The length of the id payload must be at least %d, this was %d",
|
|
sizeof(Ipike2_id_payload), ip_ntohs(id->header.length));
|
|
return IPIKE_ISAKMP_PAYLOAD_LENGTH_ERROR;
|
|
}
|
|
|
|
return IPIKE_SUCCESS;
|
|
}
|
|
|
|
/*
|
|
*===========================================================================
|
|
* ipike_payload_identification_print
|
|
*===========================================================================
|
|
*/
|
|
IP_GLOBAL void
|
|
ipike_payload_identification_print(Ipike2_id_payload* id)
|
|
{
|
|
IPCOM_LOG1(DEBUG2, " id type: %s", ipike_attribute_id_type_to_string(id->id_type));
|
|
(void)ipike_print_memory(IPCOM_LOG_DEBUG2, " id data: ",
|
|
ipike_payload_identification_data(id),
|
|
ipike_payload_identification_data_length(id));
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
*===========================================================================
|
|
* ipike_payload_identification_extract
|
|
*===========================================================================
|
|
*/
|
|
IP_GLOBAL Ipike_error
|
|
ipike_payload_identification_extract(
|
|
Ipike2_id_payload* payload,
|
|
Ipike2_id* id)
|
|
{
|
|
Ip_u16 size;
|
|
|
|
IPIKE_FREEP(id->data.value);
|
|
size = ipike_payload_identification_data_length(payload);
|
|
if (0 == size)
|
|
{
|
|
IPCOM_LOG0(CRIT, "ipike_payload_identification_extract: no identification data");
|
|
return IPIKE_ISAKMP_INVALID_SYNTAX;
|
|
}
|
|
else if (IP_NULL == (id->data.value = ipcom_malloc(size)))
|
|
{
|
|
IP_PANIC();
|
|
return IPIKE_OUT_OF_MEMORY;
|
|
}
|
|
id->data.len = ipike_payload_identification_data_length(payload);
|
|
ipcom_memcpy(id->data.value, ipike_payload_identification_data(payload), id->data.len);
|
|
if (payload->header.next_payload == IPIKE2_PAYLOAD_IDENTIFICATION_I)
|
|
id->initiator = IP_TRUE;
|
|
else
|
|
id->initiator = IP_FALSE;
|
|
ipcom_memcpy((void*)&id->info, (void*)payload, sizeof(id->info));
|
|
|
|
return IPIKE_SUCCESS;
|
|
}
|
|
|
|
#else
|
|
|
|
int ipike_payload_identification_empty_file = 0;
|
|
|
|
#endif /* IPIKE_USE_VERSION2 */
|
|
|
|
/*
|
|
****************************************************************************
|
|
* END OF FILE
|
|
****************************************************************************
|
|
*/
|