original files of m241
This commit is contained in:
@@ -0,0 +1,309 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
* 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
|
||||
****************************************************************************
|
||||
*/
|
||||
Reference in New Issue
Block a user