Files
m241Neelima/components/ip_net2-6.9/ipike/src/ipike2_payload_identification.c
T
2026-07-30 11:19:44 +05:30

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
****************************************************************************
*/