]>
git.saurik.com Git - apple/ipsec.git/blob - ipsec-tools/racoon/fsm.h
2 * Copyright (c) 2008 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
20 * @APPLE_LICENSE_HEADER_END@
27 #include <sys/types.h>
28 #include <sys/param.h>
29 #include <sys/socket.h>
32 #include "ike_session.h"
35 #include "ipsec_xpc.h"
37 //================================
39 //================================
46 // 0 Ike Version 0 = v1 1= v2
50 // 4-5 Ike Phase 1 = Phase1 2 = phase2
52 // 7 Direction 0 = Initiator 1 = Responder
56 #define IKE_STATE_MASK_VERSION 0x8000
57 #define IKE_STATE_MASK_EXPIRED 0x4000
58 #define IKE_STATE_MASK_ESTABLISHED 0x2000
59 #define IKE_STATE_MASK_NEGOTIATING 0x1000
60 #define IKE_STATE_MASK_PHASE 0x0C00
61 #define IKE_STATE_MASK_XAUTH_OR_EAP_SUCC 0x0200
62 #define IKE_STATE_MASK_DIRECTION 0x0100
63 #define IKE_STATE_MASK_MODE 0x00C0
64 #define IKE_STATE_MASK_STATE 0X003F
66 #define IKE_STATE_FLAG_VALUE_IKEV1 0x0000
67 #define IKE_STATE_FLAG_VALUE_IKEV2 0x8000
68 #define IKE_STATE_FLAG_VALUE_EXPIRED 0x4000
69 #define IKE_STATE_FLAG_VALUE_ESTABLISED 0x2000
70 #define IKE_STATE_FLAG_VALUE_NEGOTIATING 0x1000
71 #define IKE_STATE_FLAG_VALUE_PHASE1 0x0400
72 #define IKE_STATE_FLAG_VALUE_PHASE2 0x0800
73 #define IKE_STATE_FLAG_XAUTH_OR_EAP_SUCC 0x0200
74 #define IKE_STATE_FLAG_VALUE_INITIATOR 0x0000
75 #define IKE_STATE_FLAG_VALUE_RESPONDER 0x0100
78 //================================
80 //================================
82 #define FSM_STATE_IS_EXPIRED(s) \
83 ((s) & IKE_STATE_MASK_EXPIRED)
85 #define FSM_STATE_IS_ESTABLISHED(s) \
86 ((s) & IKE_STATE_MASK_ESTABLISHED)
88 #define FSM_STATE_IS_ESTABLISHED_OR_EXPIRED(s) \
89 (((s) & IKE_STATE_MASK_ESTABLISHED) | ((s) & IKE_STATE_MASK_EXPIRED))
91 #define FSM_STATE_IS_NEGOTIATING(s) \
92 ((s) & IKE_STATE_MASK_NEGOTIATING)
94 #define FSM_STATE_IS_INITIATOR(s) \
95 ((s & IKE_STATE_MASK_DIRECTION) == IKE_STATE_FLAG_VALUE_INITIATOR)
97 #define FSM_STATE_IS_RESPONDER(s) \
98 ((s & IKE_STATE_MASK_DIRECTION) == IKE_STATE_FLAG_VALUE_RESPONDER)
100 //================================
102 //================================
104 //================================
106 //================================
108 #define IKEV1_STATE_FLAG_VALUE_INFO (IKE_STATE_FLAG_VALUE_IKEV1 | 0x0000)
109 #define IKEV1_STATE_FLAG_VALUE_IDENTMODE (IKE_STATE_FLAG_VALUE_IKEV1 | 0x0040)
110 #define IKEV1_STATE_FLAG_VALUE_AGGMODE (IKE_STATE_FLAG_VALUE_IKEV1 | 0x0080)
111 #define IKEV1_STATE_FLAG_VALUE_QUICKMODE (IKE_STATE_FLAG_VALUE_IKEV1 | 0x00C0)
114 #define IKEV1_STATE_FLAG_VALUE_SENT 0x0020
115 #define IKEV1_STATE_FLAG_VALUE_SPI 0x0010
116 #define IKEV1_STATE_FLAG_VALUE_ADDSA 0x0008
119 #define IKEV1_STATE_INITIATOR_IDENT (IKE_STATE_FLAG_VALUE_PHASE1 | IKE_STATE_MASK_NEGOTIATING \
120 | IKE_STATE_FLAG_VALUE_INITIATOR | IKEV1_STATE_FLAG_VALUE_IDENTMODE)
122 #define IKEV1_STATE_RESPONDER_IDENT (IKE_STATE_FLAG_VALUE_PHASE1 | IKE_STATE_MASK_NEGOTIATING \
123 | IKE_STATE_FLAG_VALUE_RESPONDER | IKEV1_STATE_FLAG_VALUE_IDENTMODE)
125 #define IKEV1_STATE_INITIATOR_AGG (IKE_STATE_FLAG_VALUE_PHASE1 | IKE_STATE_MASK_NEGOTIATING \
126 | IKE_STATE_FLAG_VALUE_INITIATOR | IKEV1_STATE_FLAG_VALUE_AGGMODE)
128 #define IKEV1_STATE_RESPONDER_AGG (IKE_STATE_FLAG_VALUE_PHASE1 | IKE_STATE_MASK_NEGOTIATING \
129 | IKE_STATE_FLAG_VALUE_RESPONDER | IKEV1_STATE_FLAG_VALUE_AGGMODE)
131 #define IKEV1_STATE_INITIATOR_QUICK (IKE_STATE_FLAG_VALUE_PHASE2 | IKE_STATE_MASK_NEGOTIATING \
132 | IKE_STATE_FLAG_VALUE_INITIATOR | IKEV1_STATE_FLAG_VALUE_QUICKMODE)
134 #define IKEV1_STATE_RESPONDER_QUICK (IKE_STATE_FLAG_VALUE_PHASE2 | IKE_STATE_MASK_NEGOTIATING \
135 | IKE_STATE_FLAG_VALUE_RESPONDER | IKEV1_STATE_FLAG_VALUE_QUICKMODE)
138 #define IKEV1_STATE_PHASE1_ESTABLISHED (IKE_STATE_FLAG_VALUE_IKEV1 | IKE_STATE_FLAG_VALUE_PHASE1| IKE_STATE_FLAG_VALUE_ESTABLISED)
139 #define IKEV1_STATE_PHASE2_ESTABLISHED (IKE_STATE_FLAG_VALUE_IKEV1 | IKE_STATE_FLAG_VALUE_PHASE2| IKE_STATE_FLAG_VALUE_ESTABLISED)
140 #define IKEV1_STATE_PHASE1_EXPIRED (IKE_STATE_FLAG_VALUE_IKEV1 | IKE_STATE_FLAG_VALUE_PHASE1| IKE_STATE_FLAG_VALUE_EXPIRED)
141 #define IKEV1_STATE_PHASE2_EXPIRED (IKE_STATE_FLAG_VALUE_IKEV1 | IKE_STATE_FLAG_VALUE_PHASE2| IKE_STATE_FLAG_VALUE_EXPIRED)
144 #define IKEV1_STATE_INFO (IKE_STATE_FLAG_VALUE_IKEV1 | IKEV1_STATE_FLAG_VALUE_INFO | 0x3F)
147 #define IKEV1_STATE_IDENT_I_START (IKEV1_STATE_INITIATOR_IDENT)
148 #define IKEV1_STATE_IDENT_I_MSG1SENT (IKEV1_STATE_INITIATOR_IDENT | IKEV1_STATE_FLAG_VALUE_SENT | 1)
149 #define IKEV1_STATE_IDENT_I_MSG2RCVD (IKEV1_STATE_INITIATOR_IDENT | 2)
150 #define IKEV1_STATE_IDENT_I_MSG3SENT (IKEV1_STATE_INITIATOR_IDENT | IKEV1_STATE_FLAG_VALUE_SENT | 3)
151 #define IKEV1_STATE_IDENT_I_MSG4RCVD (IKEV1_STATE_INITIATOR_IDENT | 4)
152 #define IKEV1_STATE_IDENT_I_MSG5SENT (IKEV1_STATE_INITIATOR_IDENT | IKEV1_STATE_FLAG_VALUE_SENT | 5)
153 #define IKEV1_STATE_IDENT_I_MSG6RCVD (IKEV1_STATE_INITIATOR_IDENT | 6)
155 #define IKEV1_STATE_IDENT_R_START (IKEV1_STATE_RESPONDER_IDENT)
156 #define IKEV1_STATE_IDENT_R_MSG1RCVD (IKEV1_STATE_RESPONDER_IDENT | 1)
157 #define IKEV1_STATE_IDENT_R_MSG2SENT (IKEV1_STATE_RESPONDER_IDENT | IKEV1_STATE_FLAG_VALUE_SENT | 2)
158 #define IKEV1_STATE_IDENT_R_MSG3RCVD (IKEV1_STATE_RESPONDER_IDENT | 3)
159 #define IKEV1_STATE_IDENT_R_MSG4SENT (IKEV1_STATE_RESPONDER_IDENT | IKEV1_STATE_FLAG_VALUE_SENT | 4)
160 #define IKEV1_STATE_IDENT_R_MSG5RCVD (IKEV1_STATE_RESPONDER_IDENT | 5)
162 #define IKEV1_STATE_AGG_I_START (IKEV1_STATE_INITIATOR_AGG)
163 #define IKEV1_STATE_AGG_I_MSG1SENT (IKEV1_STATE_INITIATOR_AGG | IKEV1_STATE_FLAG_VALUE_SENT | 1)
164 #define IKEV1_STATE_AGG_I_MSG2RCVD (IKEV1_STATE_INITIATOR_AGG | 2)
165 #define IKEV1_STATE_AGG_I_MSG3SENT (IKEV1_STATE_INITIATOR_AGG | IKEV1_STATE_FLAG_VALUE_SENT | 3)
166 #define IKEV1_STATE_AGG_R_START (IKEV1_STATE_RESPONDER_AGG)
167 #define IKEV1_STATE_AGG_R_MSG1RCVD (IKEV1_STATE_RESPONDER_AGG | 1)
168 #define IKEV1_STATE_AGG_R_MSG2SENT (IKEV1_STATE_RESPONDER_AGG | IKEV1_STATE_FLAG_VALUE_SENT | 2)
169 #define IKEV1_STATE_AGG_R_MSG3RCVD (IKEV1_STATE_RESPONDER_AGG | 3)
171 #define IKEV1_STATE_QUICK_I_START (IKEV1_STATE_INITIATOR_QUICK)
172 #define IKEV1_STATE_QUICK_I_GETSPISENT (IKEV1_STATE_INITIATOR_QUICK | IKEV1_STATE_FLAG_VALUE_SENT | IKEV1_STATE_FLAG_VALUE_SPI)
173 #define IKEV1_STATE_QUICK_I_GETSPIDONE (IKEV1_STATE_INITIATOR_QUICK | IKEV1_STATE_FLAG_VALUE_SPI)
174 #define IKEV1_STATE_QUICK_I_MSG1SENT (IKEV1_STATE_INITIATOR_QUICK | IKEV1_STATE_FLAG_VALUE_SENT | 1)
175 #define IKEV1_STATE_QUICK_I_MSG2RCVD (IKEV1_STATE_INITIATOR_QUICK | 2)
176 #define IKEV1_STATE_QUICK_I_MSG3SENT (IKEV1_STATE_INITIATOR_QUICK | IKEV1_STATE_FLAG_VALUE_SENT | 3)
177 #define IKEV1_STATE_QUICK_I_ADDSA (IKEV1_STATE_INITIATOR_QUICK | IKEV1_STATE_FLAG_VALUE_ADDSA)
178 #define IKEV1_STATE_QUICK_R_START (IKEV1_STATE_RESPONDER_QUICK)
179 #define IKEV1_STATE_QUICK_R_MSG1RCVD (IKEV1_STATE_RESPONDER_QUICK | 1)
180 #define IKEV1_STATE_QUICK_R_GETSPISENT (IKEV1_STATE_RESPONDER_QUICK | IKEV1_STATE_FLAG_VALUE_SENT | IKEV1_STATE_FLAG_VALUE_SPI)
181 #define IKEV1_STATE_QUICK_R_GETSPIDONE (IKEV1_STATE_RESPONDER_QUICK | IKEV1_STATE_FLAG_VALUE_SPI)
182 #define IKEV1_STATE_QUICK_R_MSG2SENT (IKEV1_STATE_RESPONDER_QUICK | IKEV1_STATE_FLAG_VALUE_SENT | 2)
183 #define IKEV1_STATE_QUICK_R_MSG3RCVD (IKEV1_STATE_RESPONDER_QUICK | 3)
184 #define IKEV1_STATE_QUICK_R_COMMIT (IKEV1_STATE_RESPONDER_QUICK | 4)
185 #define IKEV1_STATE_QUICK_R_ADDSA (IKEV1_STATE_RESPONDER_QUICK | IKEV1_STATE_FLAG_VALUE_ADDSA)
188 extern void fsm_set_state(int *var
, int state
);
189 //================================
190 // Version Agnostic Events
191 //================================
192 extern void fsm_api_handle_connect (struct sockaddr_storage
*remote
, const int connect_mode
);
193 extern void fsm_api_handle_disconnect (struct sockaddr_storage
*remote
, const char *reason
);
195 extern void fsm_pfkey_handle_acquire (phase2_handle_t
*iph2
);
196 extern void fsm_pfkey_getspi_complete (phase2_handle_t
*iph2
);
198 extern void fsm_isakmp_initial_pkt (vchar_t
*msg
, struct sockaddr_storage
*local
, struct sockaddr_storage
*remote
);
200 //================================
202 //================================
204 extern int fsm_ikev1_phase1_process_payloads (phase1_handle_t
*iph1
, vchar_t
*msg
);
205 extern int fsm_ikev1_phase2_process_payloads (phase2_handle_t
*iph2
, vchar_t
*msg
);
206 extern int fsm_ikev1_phase1_send_response(phase1_handle_t
*iph1
, vchar_t
*msg
);
207 extern int fsm_ikev1_phase2_send_response(phase2_handle_t
*iph2
, vchar_t
*msg
);