1 /* ISAKMP packing and unpacking routines. 2 Copyright (C) 2002 Geoffrey Keating 3 Copyright (C) 2003-2005 Maurice Massar 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software 17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 19 $Id: isakmp-pkt.h 312 2008-06-15 18:09:42Z Joerg Mayer $ 20 */ 21 22 #ifndef __ISAKMP_PKT_H__ 23 #define __ISAKMP_PKT_H__ 24 #if defined(__linux__) 25 #include <stdint.h> 26 #endif 27 #include <sys/types.h> 28 29 #include "isakmp.h" 30 31 struct isakmp_attribute { 32 struct isakmp_attribute *next; 33 uint16_t type; 34 enum { 35 isakmp_attr_lots, 36 isakmp_attr_16, 37 isakmp_attr_2x8, 38 isakmp_attr_acl 39 } af; 40 union { 41 uint16_t attr_16; 42 uint8_t attr_2x8[2]; 43 struct { 44 uint16_t length; 45 uint8_t *data; 46 } lots; 47 struct { 48 uint16_t count; 49 struct acl_ent_s { 50 struct in_addr addr, mask; 51 uint16_t protocol, sport, dport; 52 } *acl_ent; 53 } acl; 54 } u; 55 }; 56 57 struct isakmp_payload { 58 struct isakmp_payload *next; 59 enum isakmp_payload_enum type; 60 union { 61 struct { 62 uint32_t doi; 63 uint32_t situation; 64 struct isakmp_payload *proposals; 65 } sa; 66 struct { 67 uint8_t number; 68 uint8_t prot_id; 69 uint8_t spi_size; 70 uint8_t *spi; 71 struct isakmp_payload *transforms; 72 } p; 73 struct { 74 uint8_t number; 75 uint8_t id; 76 struct isakmp_attribute *attributes; 77 } t; 78 struct { 79 uint16_t length; 80 uint8_t *data; 81 } ke, hash, sig, nonce, vid, natd; 82 struct { 83 uint8_t type; 84 uint8_t protocol; 85 uint16_t port; 86 uint16_t length; 87 uint8_t *data; 88 } id; 89 struct { 90 uint8_t encoding; 91 uint16_t length; 92 uint8_t *data; 93 } cert, cr; 94 struct { 95 uint32_t doi; 96 uint8_t protocol; 97 uint8_t spi_length; 98 uint8_t *spi; 99 uint16_t type; 100 uint16_t data_length; 101 uint8_t *data; 102 struct isakmp_attribute *attributes; /* sometimes, data is an attributes array */ 103 } n; 104 struct { 105 uint32_t doi; 106 uint8_t protocol; 107 uint8_t spi_length; 108 uint16_t num_spi; 109 uint8_t **spi; 110 } d; 111 struct { 112 uint8_t type; 113 uint16_t id; 114 struct isakmp_attribute *attributes; 115 } modecfg; 116 } u; 117 }; 118 119 struct isakmp_packet { 120 uint8_t i_cookie[ISAKMP_COOKIE_LENGTH]; 121 uint8_t r_cookie[ISAKMP_COOKIE_LENGTH]; 122 uint8_t isakmp_version; 123 uint8_t exchange_type; 124 uint8_t flags; 125 uint32_t message_id; 126 struct isakmp_payload *payload; 127 }; 128 129 extern void *xallocc(size_t x); 130 extern struct isakmp_packet *new_isakmp_packet(void); 131 extern struct isakmp_payload *new_isakmp_payload(uint8_t); 132 extern struct isakmp_payload *new_isakmp_data_payload(uint8_t type, const void *data, 133 size_t data_length); 134 extern struct isakmp_attribute *new_isakmp_attribute(uint16_t, struct isakmp_attribute *); 135 extern struct isakmp_attribute *new_isakmp_attribute_16(uint16_t type, uint16_t data, 136 struct isakmp_attribute *next); 137 extern void free_isakmp_packet(struct isakmp_packet *p); 138 extern void flatten_isakmp_payloads(struct isakmp_payload *p, uint8_t ** result, size_t * size); 139 extern void flatten_isakmp_payload(struct isakmp_payload *p, uint8_t ** result, size_t * size); 140 extern void flatten_isakmp_packet(struct isakmp_packet *p, 141 uint8_t ** result, size_t * size, size_t blksz); 142 extern struct isakmp_packet *parse_isakmp_packet(const uint8_t * data, 143 size_t data_len, int * reject); 144 extern void test_pack_unpack(void); 145 146 #endif 147