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