Annotation of embedaddon/ipsec-tools/src/racoon/isakmp.h, revision 1.1
1.1 ! misho 1: /* $NetBSD: isakmp.h,v 1.7 2009/05/20 07:54:50 vanhu Exp $ */
! 2:
! 3: /* Id: isakmp.h,v 1.11 2005/04/25 22:19:39 manubsd Exp */
! 4:
! 5: /*
! 6: * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
! 7: * All rights reserved.
! 8: *
! 9: * Redistribution and use in source and binary forms, with or without
! 10: * modification, are permitted provided that the following conditions
! 11: * are met:
! 12: * 1. Redistributions of source code must retain the above copyright
! 13: * notice, this list of conditions and the following disclaimer.
! 14: * 2. Redistributions in binary form must reproduce the above copyright
! 15: * notice, this list of conditions and the following disclaimer in the
! 16: * documentation and/or other materials provided with the distribution.
! 17: * 3. Neither the name of the project nor the names of its contributors
! 18: * may be used to endorse or promote products derived from this software
! 19: * without specific prior written permission.
! 20: *
! 21: * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 31: * SUCH DAMAGE.
! 32: */
! 33:
! 34: #ifndef _ISAKMP_H
! 35: #define _ISAKMP_H
! 36:
! 37: /* refer to RFC 2408 */
! 38:
! 39: #include <netinet/in.h>
! 40: #include "isakmp_var.h"
! 41:
! 42: #define INITIATOR 0 /* synonym sender */
! 43: #define RESPONDER 1 /* synonym receiver */
! 44:
! 45: #define GENERATE 1
! 46: #define VALIDATE 0
! 47:
! 48: /* 3.1 ISAKMP Header Format
! 49: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
! 50: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 51: ! Initiator !
! 52: ! Cookie !
! 53: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 54: ! Responder !
! 55: ! Cookie !
! 56: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 57: ! Next Payload ! MjVer ! MnVer ! Exchange Type ! Flags !
! 58: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 59: ! Message ID !
! 60: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 61: ! Length !
! 62: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 63: */
! 64: struct isakmp {
! 65: cookie_t i_ck; /* Initiator Cookie */
! 66: cookie_t r_ck; /* Responder Cookie */
! 67: u_int8_t np; /* Next Payload Type */
! 68: u_int8_t v;
! 69: u_int8_t etype; /* Exchange Type */
! 70: u_int8_t flags; /* Flags */
! 71: u_int32_t msgid;
! 72: u_int32_t len; /* Length */
! 73: } __attribute__((__packed__));
! 74:
! 75: /* Next Payload Type */
! 76: #define ISAKMP_NPTYPE_NONE 0 /* NONE*/
! 77: #define ISAKMP_NPTYPE_SA 1 /* Security Association */
! 78: #define ISAKMP_NPTYPE_P 2 /* Proposal */
! 79: #define ISAKMP_NPTYPE_T 3 /* Transform */
! 80: #define ISAKMP_NPTYPE_KE 4 /* Key Exchange */
! 81: #define ISAKMP_NPTYPE_ID 5 /* Identification */
! 82: #define ISAKMP_NPTYPE_CERT 6 /* Certificate */
! 83: #define ISAKMP_NPTYPE_CR 7 /* Certificate Request */
! 84: #define ISAKMP_NPTYPE_HASH 8 /* Hash */
! 85: #define ISAKMP_NPTYPE_SIG 9 /* Signature */
! 86: #define ISAKMP_NPTYPE_NONCE 10 /* Nonce */
! 87: #define ISAKMP_NPTYPE_N 11 /* Notification */
! 88: #define ISAKMP_NPTYPE_D 12 /* Delete */
! 89: #define ISAKMP_NPTYPE_VID 13 /* Vendor ID */
! 90: #define ISAKMP_NPTYPE_ATTR 14 /* Attribute */
! 91:
! 92:
! 93: /* NAT-T draft-ietf-ipsec-nat-t-ike-05 and later */
! 94: /* XXX conflicts with values assigned to RFC 3547 */
! 95: #define ISAKMP_NPTYPE_NATD_BADDRAFT 15 /* NAT Discovery */
! 96: #define ISAKMP_NPTYPE_NATOA_BADDRAFT 16 /* NAT Original Address */
! 97:
! 98:
! 99: /* NAT-T RFC */
! 100: #define ISAKMP_NPTYPE_NATD_RFC 20 /* NAT Discovery */
! 101: #define ISAKMP_NPTYPE_NATOA_RFC 21 /* NAT Original Address */
! 102:
! 103: /* NAT-T up to draft-ietf-ipsec-nat-t-ike-04 */
! 104: #define ISAKMP_NPTYPE_NATD_DRAFT 130 /* NAT Discovery */
! 105: #define ISAKMP_NPTYPE_NATOA_DRAFT 131 /* NAT Original Address */
! 106:
! 107: /* Frag does not seems to be documented */
! 108: #define ISAKMP_NPTYPE_FRAG 132 /* IKE fragmentation payload */
! 109:
! 110: #define ISAKMP_NPTYPE_MAX 17
! 111: /* 128 - 255 Private Use */
! 112:
! 113: /*
! 114: * The following are valid when the Vendor ID is one of the
! 115: * following:
! 116: *
! 117: * MD5("A GSS-API Authentication Method for IKE")
! 118: * MD5("GSSAPI") (recognized by Windows 2000)
! 119: * MD5("MS NT5 ISAKMPOAKLEY") (sent by Windows 2000)
! 120: *
! 121: * See draft-ietf-ipsec-isakmp-gss-auth-06.txt.
! 122: */
! 123: #define ISAKMP_NPTYPE_GSS 129 /* GSS token */
! 124:
! 125: #define ISAKMP_MAJOR_VERSION 1
! 126: #define ISAKMP_MINOR_VERSION 0
! 127: #define ISAKMP_VERSION_NUMBER 0x10
! 128: #define ISAKMP_GETMAJORV(v) (((v) & 0xf0) >> 4)
! 129: #define ISAKMP_SETMAJORV(v, m) ((v) = ((v) & 0x0f) | (((m) << 4) & 0xf0))
! 130: #define ISAKMP_GETMINORV(v) ((v) & 0x0f)
! 131: #define ISAKMP_SETMINORV(v, m) ((v) = ((v) & 0xf0) | ((m) & 0x0f))
! 132:
! 133: /* Exchange Type */
! 134: #define ISAKMP_ETYPE_NONE 0 /* NONE */
! 135: #define ISAKMP_ETYPE_BASE 1 /* Base */
! 136: #define ISAKMP_ETYPE_IDENT 2 /* Identity Protection */
! 137: #define ISAKMP_ETYPE_AUTH 3 /* Authentication Only */
! 138: #define ISAKMP_ETYPE_AGG 4 /* Aggressive */
! 139: #define ISAKMP_ETYPE_INFO 5 /* Informational */
! 140: #define ISAKMP_ETYPE_CFG 6 /* Mode config */
! 141: /* Additional Exchange Type */
! 142: #define ISAKMP_ETYPE_QUICK 32 /* Quick Mode */
! 143: #define ISAKMP_ETYPE_NEWGRP 33 /* New group Mode */
! 144: #define ISAKMP_ETYPE_ACKINFO 34 /* Acknowledged Informational */
! 145:
! 146: /* Flags */
! 147: #define ISAKMP_FLAG_E 0x01 /* Encryption Bit */
! 148: #define ISAKMP_FLAG_C 0x02 /* Commit Bit */
! 149: #define ISAKMP_FLAG_A 0x04 /* Authentication Only Bit */
! 150:
! 151: /* 3.2 Payload Generic Header
! 152: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
! 153: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 154: ! Next Payload ! RESERVED ! Payload Length !
! 155: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 156: */
! 157: struct isakmp_gen {
! 158: u_int8_t np; /* Next Payload */
! 159: u_int8_t reserved; /* RESERVED, unused, must set to 0 */
! 160: u_int16_t len; /* Payload Length */
! 161: } __attribute__((__packed__));
! 162:
! 163: /* 3.3 Data Attributes
! 164: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
! 165: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 166: !A! Attribute Type ! AF=0 Attribute Length !
! 167: !F! ! AF=1 Attribute Value !
! 168: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 169: . AF=0 Attribute Value .
! 170: . AF=1 Not Transmitted .
! 171: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 172: */
! 173: struct isakmp_data {
! 174: u_int16_t type; /* defined by DOI-spec, and Attribute Format */
! 175: u_int16_t lorv; /* if f equal 1, Attribute Length */
! 176: /* if f equal 0, Attribute Value */
! 177: /* if f equal 1, Attribute Value */
! 178: } __attribute__((__packed__));
! 179: #define ISAKMP_GEN_TLV 0x0000
! 180: #define ISAKMP_GEN_TV 0x8000
! 181: /* mask for type of attribute format */
! 182: #define ISAKMP_GEN_MASK 0x8000
! 183:
! 184: #if 0
! 185: /* MAY NOT be used, because of being defined in ipsec-doi. */
! 186: /* 3.4 Security Association Payload */
! 187: struct isakmp_pl_sa {
! 188: struct isakmp_gen h;
! 189: u_int32_t doi; /* Domain of Interpretation */
! 190: u_int32_t sit; /* Situation */
! 191: } __attribute__((__packed__));
! 192: #endif
! 193:
! 194: /* 3.5 Proposal Payload */
! 195: /*
! 196: The value of the next payload field MUST only contain the value "2"
! 197: or "0". If there are additional Proposal payloads in the message,
! 198: then this field will be 2. If the current Proposal payload is the
! 199: last within the security association proposal, then this field will
! 200: be 0.
! 201: */
! 202: struct isakmp_pl_p {
! 203: struct isakmp_gen h;
! 204: u_int8_t p_no; /* Proposal # */
! 205: u_int8_t proto_id; /* Protocol */
! 206: u_int8_t spi_size; /* SPI Size */
! 207: u_int8_t num_t; /* Number of Transforms */
! 208: /* SPI */
! 209: } __attribute__((__packed__));
! 210:
! 211: /* 3.6 Transform Payload */
! 212: /*
! 213: The value of the next payload field MUST only contain the value "3"
! 214: or "0". If there are additional Transform payloads in the proposal,
! 215: then this field will be 3. If the current Transform payload is the
! 216: last within the proposal, then this field will be 0.
! 217: */
! 218: struct isakmp_pl_t {
! 219: struct isakmp_gen h;
! 220: u_int8_t t_no; /* Transform # */
! 221: u_int8_t t_id; /* Transform-Id */
! 222: u_int16_t reserved; /* RESERVED2 */
! 223: /* SA Attributes */
! 224: } __attribute__((__packed__));
! 225:
! 226: /* 3.7 Key Exchange Payload */
! 227: struct isakmp_pl_ke {
! 228: struct isakmp_gen h;
! 229: /* Key Exchange Data */
! 230: } __attribute__((__packed__));
! 231:
! 232: #if 0
! 233: /* NOTE: MUST NOT use because of being defined in ipsec-doi instead them. */
! 234: /* 3.8 Identification Payload */
! 235: struct isakmp_pl_id {
! 236: struct isakmp_gen h;
! 237: union {
! 238: u_int8_t id_type; /* ID Type */
! 239: u_int32_t doi_data; /* DOI Specific ID Data */
! 240: } d;
! 241: /* Identification Data */
! 242: } __attribute__((__packed__));
! 243: /* A.4 ISAKMP Identification Type Values */
! 244: #define ISAKMP_ID_IPV4_ADDR 0
! 245: #define ISAKMP_ID_IPV4_ADDR_SUBNET 1
! 246: #define ISAKMP_ID_IPV6_ADDR 2
! 247: #define ISAKMP_ID_IPV6_ADDR_SUBNET 3
! 248: #endif
! 249:
! 250: /* 3.9 Certificate Payload */
! 251: struct isakmp_pl_cert {
! 252: struct isakmp_gen h;
! 253: /*
! 254: * Encoding type of 1 octet follows immediately,
! 255: * variable length CERT data follows encoding type.
! 256: */
! 257: } __attribute__((__packed__));
! 258:
! 259: /* Certificate Type */
! 260: #define ISAKMP_CERT_NONE 0
! 261: #define ISAKMP_CERT_PKCS7 1
! 262: #define ISAKMP_CERT_PGP 2
! 263: #define ISAKMP_CERT_DNS 3
! 264: #define ISAKMP_CERT_X509SIGN 4
! 265: #define ISAKMP_CERT_X509KE 5
! 266: #define ISAKMP_CERT_KERBEROS 6
! 267: #define ISAKMP_CERT_CRL 7
! 268: #define ISAKMP_CERT_ARL 8
! 269: #define ISAKMP_CERT_SPKI 9
! 270: #define ISAKMP_CERT_X509ATTR 10
! 271: #define ISAKMP_CERT_PLAINRSA 11
! 272:
! 273: /* 3.10 Certificate Request Payload */
! 274: struct isakmp_pl_cr {
! 275: struct isakmp_gen h;
! 276: u_int8_t num_cert; /* # Cert. Types */
! 277: /*
! 278: Certificate Types (variable length)
! 279: -- Contains a list of the types of certificates requested,
! 280: sorted in order of preference. Each individual certificate
! 281: type is 1 octet. This field is NOT required.
! 282: */
! 283: /* # Certificate Authorities (1 octet) */
! 284: /* Certificate Authorities (variable length) */
! 285: } __attribute__((__packed__));
! 286:
! 287: /* 3.11 Hash Payload */
! 288: struct isakmp_pl_hash {
! 289: struct isakmp_gen h;
! 290: /* Hash Data */
! 291: } __attribute__((__packed__));
! 292:
! 293: /* 3.12 Signature Payload */
! 294: struct isakmp_pl_sig {
! 295: struct isakmp_gen h;
! 296: /* Signature Data */
! 297: } __attribute__((__packed__));
! 298:
! 299: /* 3.13 Nonce Payload */
! 300: struct isakmp_pl_nonce {
! 301: struct isakmp_gen h;
! 302: /* Nonce Data */
! 303: } __attribute__((__packed__));
! 304:
! 305: /* 3.14 Notification Payload */
! 306: struct isakmp_pl_n {
! 307: struct isakmp_gen h;
! 308: u_int32_t doi; /* Domain of Interpretation */
! 309: u_int8_t proto_id; /* Protocol-ID */
! 310: u_int8_t spi_size; /* SPI Size */
! 311: u_int16_t type; /* Notify Message Type */
! 312: /* SPI */
! 313: /* Notification Data */
! 314: } __attribute__((__packed__));
! 315:
! 316: /* 3.14.1 Notify Message Types */
! 317: /* NOTIFY MESSAGES - ERROR TYPES */
! 318: #define ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE 1
! 319: #define ISAKMP_NTYPE_DOI_NOT_SUPPORTED 2
! 320: #define ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED 3
! 321: #define ISAKMP_NTYPE_INVALID_COOKIE 4
! 322: #define ISAKMP_NTYPE_INVALID_MAJOR_VERSION 5
! 323: #define ISAKMP_NTYPE_INVALID_MINOR_VERSION 6
! 324: #define ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE 7
! 325: #define ISAKMP_NTYPE_INVALID_FLAGS 8
! 326: #define ISAKMP_NTYPE_INVALID_MESSAGE_ID 9
! 327: #define ISAKMP_NTYPE_INVALID_PROTOCOL_ID 10
! 328: #define ISAKMP_NTYPE_INVALID_SPI 11
! 329: #define ISAKMP_NTYPE_INVALID_TRANSFORM_ID 12
! 330: #define ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED 13
! 331: #define ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN 14
! 332: #define ISAKMP_NTYPE_BAD_PROPOSAL_SYNTAX 15
! 333: #define ISAKMP_NTYPE_PAYLOAD_MALFORMED 16
! 334: #define ISAKMP_NTYPE_INVALID_KEY_INFORMATION 17
! 335: #define ISAKMP_NTYPE_INVALID_ID_INFORMATION 18
! 336: #define ISAKMP_NTYPE_INVALID_CERT_ENCODING 19
! 337: #define ISAKMP_NTYPE_INVALID_CERTIFICATE 20
! 338: #define ISAKMP_NTYPE_BAD_CERT_REQUEST_SYNTAX 21
! 339: #define ISAKMP_NTYPE_INVALID_CERT_AUTHORITY 22
! 340: #define ISAKMP_NTYPE_INVALID_HASH_INFORMATION 23
! 341: #define ISAKMP_NTYPE_AUTHENTICATION_FAILED 24
! 342: #define ISAKMP_NTYPE_INVALID_SIGNATURE 25
! 343: #define ISAKMP_NTYPE_ADDRESS_NOTIFICATION 26
! 344: #define ISAKMP_NTYPE_NOTIFY_SA_LIFETIME 27
! 345: #define ISAKMP_NTYPE_CERTIFICATE_UNAVAILABLE 28
! 346: #define ISAKMP_NTYPE_UNSUPPORTED_EXCHANGE_TYPE 29
! 347: #define ISAKMP_NTYPE_UNEQUAL_PAYLOAD_LENGTHS 30
! 348: #define ISAKMP_NTYPE_MINERROR 1
! 349: #define ISAKMP_NTYPE_MAXERROR 16383
! 350: /* NOTIFY MESSAGES - STATUS TYPES */
! 351: #define ISAKMP_NTYPE_CONNECTED 16384
! 352: /* 4.6.3 IPSEC DOI Notify Message Types */
! 353: #define ISAKMP_NTYPE_RESPONDER_LIFETIME 24576
! 354: #define ISAKMP_NTYPE_REPLAY_STATUS 24577
! 355: #define ISAKMP_NTYPE_INITIAL_CONTACT 24578
! 356:
! 357: /* DPD */
! 358: #define ISAKMP_NTYPE_R_U_THERE 36136
! 359: #define ISAKMP_NTYPE_R_U_THERE_ACK 36137
! 360:
! 361: #define ISAKMP_NTYPE_HEARTBEAT 40503
! 362:
! 363: /* using only to log */
! 364: #define ISAKMP_LOG_RETRY_LIMIT_REACHED 65530
! 365:
! 366: /* XXX means internal error but it's not reserved by any drafts... */
! 367: #define ISAKMP_INTERNAL_ERROR -1
! 368:
! 369: /* 3.15 Delete Payload */
! 370: struct isakmp_pl_d {
! 371: struct isakmp_gen h;
! 372: u_int32_t doi; /* Domain of Interpretation */
! 373: u_int8_t proto_id; /* Protocol-Id */
! 374: u_int8_t spi_size; /* SPI Size */
! 375: u_int16_t num_spi; /* # of SPIs */
! 376: /* SPI(es) */
! 377: } __attribute__((__packed__));
! 378:
! 379: struct payload_list {
! 380: struct payload_list *next, *prev;
! 381: vchar_t *payload;
! 382: u_int8_t payload_type;
! 383: u_int8_t free_payload;
! 384: };
! 385:
! 386:
! 387: /* See draft-ietf-ipsec-isakmp-mode-cfg-04.txt, 3.2 */
! 388: struct isakmp_pl_attr {
! 389: struct isakmp_gen h;
! 390: u_int8_t type; /* Exchange type */
! 391: u_int8_t res2;
! 392: u_int16_t id; /* Per transaction id */
! 393: } __attribute__((__packed__));
! 394:
! 395: /* Exchange type */
! 396: #define ISAKMP_CFG_REQUEST 1
! 397: #define ISAKMP_CFG_REPLY 2
! 398: #define ISAKMP_CFG_SET 3
! 399: #define ISAKMP_CFG_ACK 4
! 400:
! 401: /* IKE fragmentation payload */
! 402: struct isakmp_frag {
! 403: u_int16_t unknown0; /* always set to zero? */
! 404: u_int16_t len;
! 405: u_int16_t unknown1; /* always set to 1? */
! 406: u_int8_t index;
! 407: u_int8_t flags;
! 408: } __attribute__((__packed__));
! 409:
! 410: /* flags */
! 411: #define ISAKMP_FRAG_LAST 1
! 412:
! 413: /* DPD R-U-THERE / R-U-THERE-ACK Payload */
! 414: struct isakmp_pl_ru {
! 415: struct isakmp_gen h;
! 416: u_int32_t doi; /* Domain of Interpretation */
! 417: u_int8_t proto_id; /* Protocol-Id */
! 418: u_int8_t spi_size; /* SPI Size */
! 419: u_int16_t type; /* Notify type */
! 420: cookie_t i_ck; /* Initiator Cookie */
! 421: cookie_t r_ck; /* Responder cookie*/
! 422: u_int32_t data; /* Notification data */
! 423: } __attribute__((__packed__));
! 424:
! 425: #endif /* _ISAKMP_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>