349 lines
11 KiB
C
349 lines
11 KiB
C
/*
|
|
* Copyright (C) 2005-2006 Martin Willi
|
|
* Copyright (C) 2005 Jan Hutter
|
|
* HSR Hochschule fuer Technik Rapperswil
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* for more details.
|
|
*/
|
|
|
|
/**
|
|
* @defgroup encodings encodings
|
|
* @{ @ingroup payloads
|
|
*/
|
|
|
|
#ifndef ENCODINGS_H_
|
|
#define ENCODINGS_H_
|
|
|
|
typedef enum encoding_type_t encoding_type_t;
|
|
typedef struct encoding_rule_t encoding_rule_t;
|
|
|
|
#include <library.h>
|
|
|
|
/**
|
|
* All different kinds of encoding types.
|
|
*
|
|
* Each field of an IKEv2-Message (in header or payload)
|
|
* which has to be parsed or generated differently has its own
|
|
* type defined here.
|
|
*
|
|
* Header is parsed like a payload and gets its one payload_id
|
|
* from PRIVATE USE space. Also the substructures
|
|
* of specific payload types get their own payload_id
|
|
* from PRIVATE_USE space. See IKEv2-Draft for more information.
|
|
*/
|
|
enum encoding_type_t {
|
|
|
|
/**
|
|
* Representing a 4 Bit unsigned int value.
|
|
*
|
|
*
|
|
* When generating it must be changed from host to network order.
|
|
* The value is read from the associated data struct.
|
|
* The current write position is moved 4 bit forward afterwards.
|
|
*
|
|
* When parsing it must be changed from network to host order.
|
|
* The value is written to the associated data struct.
|
|
* The current read pointer is moved 4 bit forward afterwards.
|
|
*/
|
|
U_INT_4,
|
|
|
|
/**
|
|
* Representing a 8 Bit unsigned int value.
|
|
*
|
|
*
|
|
* When generating it must be changed from host to network order.
|
|
* The value is read from the associated data struct.
|
|
* The current write position is moved 8 bit forward afterwards.
|
|
*
|
|
* When parsing it must be changed from network to host order.
|
|
* The value is written to the associated data struct.
|
|
* The current read pointer is moved 8 bit forward afterwards.
|
|
*/
|
|
U_INT_8,
|
|
|
|
/**
|
|
* Representing a 16 Bit unsigned int value.
|
|
*
|
|
*
|
|
* When generating it must be changed from host to network order.
|
|
* The value is read from the associated data struct.
|
|
* The current write position is moved 16 bit forward afterwards.
|
|
*
|
|
* When parsing it must be changed from network to host order.
|
|
* The value is written to the associated data struct.
|
|
* The current read pointer is moved 16 bit forward afterwards.
|
|
*/
|
|
U_INT_16,
|
|
|
|
/**
|
|
* Representing a 32 Bit unsigned int value.
|
|
*
|
|
* When generating it must be changed from host to network order.
|
|
* The value is read from the associated data struct.
|
|
* The current write position is moved 32 bit forward afterwards.
|
|
*
|
|
* When parsing it must be changed from network to host order.
|
|
* The value is written to the associated data struct.
|
|
* The current read pointer is moved 32 bit forward afterwards.
|
|
*/
|
|
U_INT_32,
|
|
|
|
/**
|
|
* represents a RESERVED_BIT used in FLAG-Bytes.
|
|
*
|
|
* When generating, the next bit is set to zero and the current write
|
|
* position is moved one bit forward.
|
|
* No value is read from the associated data struct.
|
|
* The current write position is moved 1 bit forward afterwards.
|
|
*
|
|
* When parsing, the current read pointer is moved one bit forward.
|
|
* No value is written to the associated data struct.
|
|
* The current read pointer is moved 1 bit forward afterwards.
|
|
*/
|
|
RESERVED_BIT,
|
|
|
|
/**
|
|
* represents a RESERVED_BYTE.
|
|
*
|
|
* When generating, the next byte is set to zero and the current write
|
|
* position is moved one byte forward.
|
|
* No value is read from the associated data struct.
|
|
* The current write position is moved 1 byte forward afterwards.
|
|
*
|
|
* When parsing, the current read pointer is moved one byte forward.
|
|
* No value is written to the associated data struct.
|
|
* The current read pointer is moved 1 byte forward afterwards.
|
|
*/
|
|
RESERVED_BYTE,
|
|
|
|
/**
|
|
* Representing a 1 Bit flag.
|
|
*
|
|
* When generation, the next bit is set to 1 if the associated value
|
|
* in the data struct is TRUE, 0 otherwise. The current write position
|
|
* is moved 1 bit forward afterwards.
|
|
*
|
|
* When parsing, the next bit is read and stored in the associated data
|
|
* struct. 0 means FALSE, 1 means TRUE, The current read pointer
|
|
* is moved 1 bit forward afterwards
|
|
*/
|
|
FLAG,
|
|
|
|
/**
|
|
* Representing a length field of a payload.
|
|
*
|
|
* When generating it must be changed from host to network order.
|
|
* The value is read from the associated data struct.
|
|
* The current write position is moved 16 bit forward afterwards.
|
|
*
|
|
* When parsing it must be changed from network to host order.
|
|
* The value is written to the associated data struct.
|
|
* The current read pointer is moved 16 bit forward afterwards.
|
|
*/
|
|
PAYLOAD_LENGTH,
|
|
|
|
/**
|
|
* Representing a length field of a header.
|
|
*
|
|
* When generating it must be changed from host to network order.
|
|
* The value is read from the associated data struct.
|
|
* The current write position is moved 32 bit forward afterwards.
|
|
*
|
|
* When parsing it must be changed from network to host order.
|
|
* The value is written to the associated data struct.
|
|
* The current read pointer is moved 32 bit forward afterwards.
|
|
*/
|
|
HEADER_LENGTH,
|
|
|
|
/**
|
|
* Representing a spi size field.
|
|
*
|
|
* When generating it must be changed from host to network order.
|
|
* The value is read from the associated data struct.
|
|
* The current write position is moved 8 bit forward afterwards.
|
|
*
|
|
* When parsing it must be changed from network to host order.
|
|
* The value is written to the associated data struct.
|
|
* The current read pointer is moved 8 bit forward afterwards.
|
|
*/
|
|
SPI_SIZE,
|
|
|
|
/**
|
|
* Representing a spi field.
|
|
*
|
|
* When generating the content of the chunk pointing to
|
|
* is written.
|
|
*
|
|
* When parsing SPI_SIZE bytes are read and written into the chunk pointing to.
|
|
*/
|
|
SPI,
|
|
|
|
/**
|
|
* Representing a 1 Bit flag specifying the format of a transform attribute.
|
|
*
|
|
* When generation, the next bit is set to 1 if the associated value
|
|
* in the data struct is TRUE, 0 otherwise. The current write position
|
|
* is moved 1 bit forward afterwards.
|
|
*
|
|
* When parsing, the next bit is read and stored in the associated data
|
|
* struct. 0 means FALSE, 1 means TRUE, The current read pointer
|
|
* is moved 1 bit forward afterwards.
|
|
*/
|
|
ATTRIBUTE_FORMAT,
|
|
|
|
/**
|
|
* Representing a 15 Bit unsigned int value used as attribute type
|
|
* in an attribute transform.
|
|
*
|
|
*
|
|
* When generating it must be changed from host to network order.
|
|
* The value is read from the associated data struct.
|
|
* The current write position is moved 15 bit forward afterwards.
|
|
*
|
|
* When parsing it must be changed from network to host order.
|
|
* The value is written to the associated data struct.
|
|
* The current read pointer is moved 15 bit forward afterwards.
|
|
*/
|
|
ATTRIBUTE_TYPE,
|
|
|
|
/**
|
|
* Depending on the field of type ATTRIBUTE_FORMAT
|
|
* this field contains the length or the value of an transform attribute.
|
|
* Its stored in a 16 unsigned integer field.
|
|
*
|
|
* When generating it must be changed from host to network order.
|
|
* The value is read from the associated data struct.
|
|
* The current write position is moved 16 bit forward afterwards.
|
|
*
|
|
* When parsing it must be changed from network to host order.
|
|
* The value is written to the associated data struct.
|
|
* The current read pointer is moved 16 bit forward afterwards.
|
|
*/
|
|
ATTRIBUTE_LENGTH_OR_VALUE,
|
|
|
|
/**
|
|
* This field contains the length or the value of an configuration attribute.
|
|
* Its stored in a 16 unsigned integer field.
|
|
*
|
|
* When generating it must be changed from host to network order.
|
|
* The value is read from the associated data struct.
|
|
* The current write position is moved 16 bit forward afterwards.
|
|
*
|
|
* When parsing it must be changed from network to host order.
|
|
* The value is written to the associated data struct.
|
|
* The current read pointer is moved 16 bit forward afterwards.
|
|
*/
|
|
ATTRIBUTE_LENGTH,
|
|
|
|
/**
|
|
* Depending on the field of type ATTRIBUTE_FORMAT
|
|
* this field is available or missing and so parsed/generated
|
|
* or not parsed/not generated.
|
|
*
|
|
* When generating the content of the chunk pointing to
|
|
* is written.
|
|
*
|
|
* When parsing SPI_SIZE bytes are read and written into the chunk pointing to.
|
|
*/
|
|
ATTRIBUTE_VALUE,
|
|
|
|
/**
|
|
* Representing a Traffic selector type field.
|
|
*
|
|
* When generating it must be changed from host to network order.
|
|
* The value is read from the associated data struct.
|
|
* The current write position is moved 16 bit forward afterwards.
|
|
*
|
|
* When parsing it must be changed from network to host order.
|
|
* The value is written to the associated data struct.
|
|
* The current read pointer is moved 16 bit forward afterwards.
|
|
*/
|
|
TS_TYPE,
|
|
|
|
/**
|
|
* Representing an address field in a traffic selector.
|
|
*
|
|
* Depending on the last field of type TS_TYPE
|
|
* this field is either 4 or 16 byte long.
|
|
*
|
|
* When generating the content of the chunk pointing to
|
|
* is written.
|
|
*
|
|
* When parsing 4 or 16 bytes are read and written into the chunk pointing to.
|
|
*/
|
|
ADDRESS,
|
|
|
|
/**
|
|
* Representing a variable length byte field.
|
|
*/
|
|
CHUNK_DATA,
|
|
|
|
/**
|
|
* Representing an IKE_SPI field in an IKEv2 Header.
|
|
*
|
|
* When generating the value of the uint64_t pointing to
|
|
* is written (host and network order is not changed).
|
|
*
|
|
* When parsing 8 bytes are read and written into the uint64_t pointing to.
|
|
*/
|
|
IKE_SPI,
|
|
|
|
/**
|
|
* Representing an encrypted IKEv1 message.
|
|
*/
|
|
ENCRYPTED_DATA,
|
|
|
|
/**
|
|
* Representing a field containing a set of wrapped payloads.
|
|
*
|
|
* This type is not used directly, but as an offset to the wrapped payloads.
|
|
* The type of the wrapped payload is added to this encoding type.
|
|
*
|
|
* @note As payload types are added to this encoding type, it has
|
|
* to be the last in encoding_type_t.
|
|
*/
|
|
PAYLOAD_LIST = 1000 /* no comma, read above! */
|
|
};
|
|
|
|
/**
|
|
* enum name for encoding_type_t
|
|
*/
|
|
extern enum_name_t *encoding_type_names;
|
|
|
|
/**
|
|
* Rule how to en-/decode a payload field.
|
|
*
|
|
* An encoding rule is a mapping of a specific encoding type to
|
|
* a location in the data struct where the current field is stored to
|
|
* or read from.
|
|
* This rules are used by parser and generator.
|
|
*/
|
|
struct encoding_rule_t {
|
|
|
|
/**
|
|
* Encoding type.
|
|
*/
|
|
encoding_type_t type;
|
|
|
|
/**
|
|
* Offset in the data struct.
|
|
*
|
|
* When parsing, data are written to this offset of the
|
|
* data struct.
|
|
*
|
|
* When generating, data are read from this offset in the
|
|
* data struct.
|
|
*/
|
|
uint32_t offset;
|
|
};
|
|
|
|
#endif /** ENCODINGS_H_ @}*/
|