File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ipsec-tools / src / racoon / proposal.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:39:10 2012 UTC (12 years, 4 months ago) by misho
Branches: ipsec-tools, MAIN
CVS tags: v0_8_2p2, v0_8_1p0, v0_8_1, v0_8_0p0, v0_8_0, HEAD
ipsec-tools

    1: /*	$NetBSD: proposal.h,v 1.7 2010/02/09 23:05:16 wiz Exp $	*/
    2: 
    3: /* Id: proposal.h,v 1.5 2004/06/11 16:00:17 ludvigm 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 _PROPOSAL_H
   35: #define _PROPOSAL_H
   36: 
   37: #include <sys/queue.h>
   38: 
   39: /*
   40:  *   A. chained list of transform, only for single proto_id
   41:  *      (this is same as set of transforms in single proposal payload)
   42:  *   B. proposal.  this will point to multiple (A) items (order is important
   43:  *      here so pointer to (A) must be ordered array, or chained list). 
   44:  *      this covers multiple proposal on a packet if proposal # is the same.
   45:  *   C. finally, (B) needs to be connected as chained list.
   46:  * 
   47:  * 	head ---> prop[.......] ---> prop[...] ---> prop[...] ---> ...
   48:  * 	               | | | |
   49:  * 	               | | | +- proto4  <== must preserve order here
   50:  * 	               | | +--- proto3
   51:  * 	               | +----- proto2
   52:  * 	               +------- proto1[trans1, trans2, trans3, ...]
   53:  *
   54:  *   incoming packets needs to be parsed to construct the same structure
   55:  *   (check "prop_pair" too).
   56:  */
   57: /* SA proposal specification */
   58: struct saprop {
   59: 	int prop_no;
   60: 	time_t lifetime;
   61: 	int lifebyte;
   62: 	int pfs_group;			/* pfs group */
   63: 	int claim;			/* flag to send RESPONDER-LIFETIME. */
   64: 					/* XXX assumed DOI values are 1 or 2. */
   65: #ifdef HAVE_SECCTX
   66: 	struct security_ctx sctx;       /* security context structure */
   67: #endif
   68: 	struct saproto *head;
   69: 	struct saprop *next;
   70: };
   71: 
   72: /* SA protocol specification */
   73: struct saproto {
   74: 	int proto_id;
   75: 	size_t spisize;			/* spi size */
   76: 	int encmode;			/* encryption mode */
   77: 
   78: 	int udp_encap;			/* UDP encapsulation */
   79: 
   80: 	/* XXX should be vchar_t * */
   81: 	/* these are network byte order */
   82: 	u_int32_t spi;			/* inbound. i.e. --SA-> me */
   83: 	u_int32_t spi_p;		/* outbound. i.e. me -SA-> */
   84: 
   85: 	vchar_t *keymat;		/* KEYMAT */
   86: 	vchar_t *keymat_p;		/* peer's KEYMAT */
   87: 
   88: 	int reqid_out;			/* request id (outbound) */
   89: 	int reqid_in;			/* request id (inbound) */
   90: 
   91: 	int ok;				/* if 1, success to set SA in kernel */
   92: 
   93: 	struct satrns *head;		/* header of transform */
   94: 	struct saproto *next;		/* next protocol */
   95: };
   96: 
   97: /* SA algorithm specification */
   98: struct satrns {
   99: 	int trns_no;
  100: 	int trns_id;			/* transform id */
  101: 	int encklen;			/* key length of encryption algorithm */
  102: 	int authtype;			/* authentication algorithm if ESP */
  103: 
  104: 	struct satrns *next;		/* next transform */
  105: };
  106: 
  107: /*
  108:  * prop_pair: (proposal number, transform number)
  109:  *
  110:  *	(SA (P1 (T1 T2)) (P1' (T1' T2')) (P2 (T1" T2")))
  111:  *
  112:  *              p[1]      p[2]
  113:  *      top     (P1,T1)   (P2",T1")
  114:  *		 |  |tnext     |tnext
  115:  *		 |  v          v
  116:  *		 | (P1, T2)   (P2", T2")
  117:  *		 v next
  118:  *		(P1', T1')
  119:  *		    |tnext
  120:  *		    v
  121:  *		   (P1', T2')
  122:  *
  123:  * when we convert it to saprop in prop2saprop(), it should become like:
  124:  * 
  125:  * 		 (next)
  126:  * 	saprop --------------------> saprop	
  127:  * 	 | (head)                     | (head)
  128:  * 	 +-> saproto                  +-> saproto
  129:  * 	      | | (head)                     | (head)
  130:  * 	      | +-> satrns(P1 T1)            +-> satrns(P2" T1")
  131:  * 	      |      | (next)                     | (next)
  132:  * 	      |      v                            v
  133:  * 	      |     satrns(P1, T2)               satrns(P2", T2")
  134:  * 	      v (next)
  135:  * 	     saproto
  136:  * 		| (head)
  137:  * 		+-> satrns(P1' T1')
  138:  * 		     | (next)
  139:  * 		     v
  140:  * 		    satrns(P1', T2')
  141:  */
  142: struct prop_pair {
  143: 	struct isakmp_pl_p *prop;
  144: 	struct isakmp_pl_t *trns;
  145: 	struct prop_pair *next;	/* next prop_pair with same proposal # */
  146: 				/* (bundle case) */
  147: 	struct prop_pair *tnext; /* next prop_pair in same proposal payload */
  148: 				/* (multiple tranform case) */
  149: };
  150: #define MAXPROPPAIRLEN	256	/* It's enough because field size is 1 octet. */
  151: 
  152: /*
  153:  * Lifetime length selection refered to the section 4.5.4 of RFC2407.  It does
  154:  * not completely conform to the description of RFC.  There are four types of
  155:  * the behavior.  If the value of "proposal_check" in "remote" directive is;
  156:  *     "obey"
  157:  *         the responder obey the initiator anytime.
  158:  *     "strict"
  159:  *         If the responder's length is longer than the initiator's one, the
  160:  *         responder uses the intitiator's one.  Otherwise rejects the proposal.
  161:  *         If PFS is not required by the responder, the responder obeys the
  162:  *         proposal.  If PFS is required by both sides and if the responder's
  163:  *         group is not equal to the initiator's one, then the responder reject
  164:  *         the proposal.
  165:  *     "claim"
  166:  *         If the responder's length is longer than the initiator's one, the
  167:  *         responder use the intitiator's one.  If the responder's length is
  168:  *         shorter than the initiator's one, the responder uses own length
  169:  *         AND send RESPONDER-LIFETIME notify message to a initiator in the
  170:  *         case of lifetime.
  171:  *         About PFS, this directive is same as "strict".
  172:  *     "exact"
  173:  *         If the initiator's length is not equal to the responder's one, the
  174:  *         responder rejects the proposal.
  175:  *         If PFS is required and if the responder's group is not equal to
  176:  *         the initiator's one, then the responder reject the proposal.
  177:  * XXX should be defined the behavior of key length.
  178:  */
  179: #define PROP_CHECK_OBEY		1
  180: #define PROP_CHECK_STRICT	2
  181: #define PROP_CHECK_CLAIM	3
  182: #define PROP_CHECK_EXACT	4
  183: 
  184: struct sainfo;
  185: struct ph1handle;
  186: struct secpolicy;
  187: extern struct saprop *newsaprop __P((void));
  188: extern struct saproto *newsaproto __P((void));
  189: extern void inssaprop __P((struct saprop **, struct saprop *));
  190: extern void inssaproto __P((struct saprop *, struct saproto *));
  191: extern void inssaprotorev __P((struct saprop *, struct saproto *));
  192: extern struct satrns *newsatrns __P((void));
  193: extern void inssatrns __P((struct saproto *, struct satrns *));
  194: extern struct saprop *cmpsaprop_alloc __P((struct ph1handle *,
  195: 	const struct saprop *, const struct saprop *, int));
  196: extern int cmpsaprop __P((const struct saprop *, const struct saprop *));
  197: extern int cmpsatrns __P((int, const struct satrns *, const struct satrns *, int));
  198: extern int set_satrnsbysainfo __P((struct saproto *, struct sainfo *));
  199: extern struct saprop *aproppair2saprop __P((struct prop_pair *));
  200: extern void free_proppair __P((struct prop_pair **));
  201: extern void flushsaprop __P((struct saprop *));
  202: extern void flushsaproto __P((struct saproto *));
  203: extern void flushsatrns __P((struct satrns *));
  204: extern void printsaprop __P((const int, const struct saprop *));
  205: extern void printsaprop0 __P((const int, const struct saprop *));
  206: extern void printsaproto __P((const int, const struct saproto *));
  207: extern void printsatrns __P((const int, const int, const struct satrns *));
  208: extern void print_proppair0 __P((int, struct prop_pair *, int));
  209: extern void print_proppair __P((int, struct prop_pair *));
  210: extern int set_proposal_from_policy __P((struct ph2handle *,
  211: 	struct secpolicy *, struct secpolicy *));
  212: extern int set_proposal_from_proposal __P((struct ph2handle *));
  213: 
  214: #endif /* _PROPOSAL_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>