removed debug statement
[strongswan.git] / src / whack / whack.h
1 /* Structure of messages from whack to Pluto proper.
2 * Copyright (C) 1998-2001 D. Hugh Redelmeier.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * for more details.
13 *
14 * RCSID $Id$
15 */
16
17 #ifndef _WHACK_H
18 #define _WHACK_H
19
20 #include <freeswan.h>
21
22 #include <smartcard.h>
23
24 /* Since the message remains on one host, native representation is used.
25 * Think of this as horizontal microcode: all selected operations are
26 * to be done (in the order declared here).
27 *
28 * MAGIC is used to help detect version mismatches between whack and Pluto.
29 * Whenever the interface (i.e. this struct) changes in form or
30 * meaning, change this value (probably by changing the last number).
31 *
32 * If the command only requires basic actions (status or shutdown),
33 * it is likely that the relevant part of the message changes less frequently.
34 * Whack uses WHACK_BASIC_MAGIC in those cases.
35 *
36 * NOTE: no value of WHACK_BASIC_MAGIC may equal any value of WHACK_MAGIC.
37 * Otherwise certain version mismatches will not be detected.
38 */
39
40 #define WHACK_BASIC_MAGIC (((((('w' << 8) + 'h') << 8) + 'k') << 8) + 24)
41 #define WHACK_MAGIC (((((('w' << 8) + 'h') << 8) + 'k') << 8) + 26)
42
43 typedef struct whack_end whack_end_t;
44
45 /* struct whack_end is a lot like connection.h's struct end
46 * It differs because it is going to be shipped down a socket
47 * and because whack is a separate program from pluto.
48 */
49 struct whack_end {
50 char *id; /* id string (if any) -- decoded by pluto */
51 char *cert; /* path string (if any) -- loaded by pluto */
52 char *ca; /* distinguished name string (if any) -- parsed by pluto */
53 char *groups; /* access control groups (if any) -- parsed by pluto */
54 ip_address
55 host_addr,
56 host_nexthop,
57 host_srcip;
58 ip_subnet client;
59
60 bool key_from_DNS_on_demand;
61 bool has_client;
62 bool has_client_wildcard;
63 bool has_port_wildcard;
64 bool has_srcip;
65 bool has_natip;
66 bool modecfg;
67 bool hostaccess;
68 bool allow_any;
69 certpolicy_t sendcert;
70 char *updown; /* string */
71 u_int16_t host_port; /* host order */
72 u_int16_t port; /* host order */
73 u_int8_t protocol;
74 char *virt;
75 };
76
77 typedef struct whack_message whack_message_t;
78
79 struct whack_message {
80 unsigned int magic;
81
82 /* for WHACK_STATUS: */
83 bool whack_status;
84 bool whack_statusall;
85
86
87 /* for WHACK_SHUTDOWN */
88 bool whack_shutdown;
89
90 /* END OF BASIC COMMANDS
91 * If you change anything earlier in this struct, update WHACK_BASIC_MAGIC.
92 */
93
94 /* name is used in connection, ca and initiate */
95 size_t name_len; /* string 1 */
96 char *name;
97
98 /* for WHACK_OPTIONS: */
99
100 bool whack_options;
101
102 lset_t debugging; /* only used #ifdef DEBUG, but don't want layout to change */
103
104 /* for WHACK_CONNECTION */
105
106 bool whack_connection;
107 bool whack_async;
108 bool ikev1;
109
110 lset_t policy;
111 time_t sa_ike_life_seconds;
112 time_t sa_ipsec_life_seconds;
113 time_t sa_rekey_margin;
114 unsigned long sa_rekey_fuzz;
115 unsigned long sa_keying_tries;
116
117 /* For DPD 3706 - Dead Peer Detection */
118 time_t dpd_delay;
119 time_t dpd_timeout;
120 dpd_action_t dpd_action;
121
122 /* note that each end contains string 2/5.id, string 3/6 cert,
123 * and string 4/7 updown
124 */
125 whack_end_t left;
126 whack_end_t right;
127
128 /* note: if the client is the gateway, the following must be equal */
129 sa_family_t addr_family; /* between gateways */
130 sa_family_t tunnel_addr_family; /* between clients */
131
132 char *ike; /* ike algo string (separated by commas) */
133 char *pfsgroup; /* pfsgroup will be "encapsulated" in esp string for pluto */
134 char *esp; /* esp algo string (separated by commas) */
135
136 /* for WHACK_KEY: */
137 bool whack_key;
138 bool whack_addkey;
139 char *keyid; /* string 8 */
140 enum pubkey_alg pubkey_alg;
141 chunk_t keyval; /* chunk */
142
143 /* for WHACK_MYID: */
144 bool whack_myid;
145 char *myid; /* string 7 */
146
147 /* for WHACK_ROUTE: */
148 bool whack_route;
149
150 /* for WHACK_UNROUTE: */
151 bool whack_unroute;
152
153 /* for WHACK_INITIATE: */
154 bool whack_initiate;
155
156 /* for WHACK_OPINITIATE */
157 bool whack_oppo_initiate;
158 ip_address oppo_my_client, oppo_peer_client;
159
160 /* for WHACK_TERMINATE: */
161 bool whack_terminate;
162
163 /* for WHACK_DELETE: */
164 bool whack_delete;
165
166 /* for WHACK_DELETESTATE: */
167 bool whack_deletestate;
168 so_serial_t whack_deletestateno;
169
170 /* for WHACK_LISTEN: */
171 bool whack_listen, whack_unlisten;
172
173 /* for WHACK_CRASH - note if a remote peer is known to have rebooted */
174 bool whack_crash;
175 ip_address whack_crash_peer;
176
177 /* for WHACK_LIST */
178 bool whack_utc;
179 lset_t whack_list;
180
181 /* for WHACK_PURGEOCSP */
182 bool whack_purgeocsp;
183
184 /* for WHACK_REREAD */
185 u_char whack_reread;
186
187 /* for WHACK_CA */
188 bool whack_ca;
189 bool whack_strict;
190
191 char *cacert;
192 char *ldaphost;
193 char *ldapbase;
194 char *crluri;
195 char *crluri2;
196 char *ocspuri;
197
198 /* for WHACK_SC_OP */
199 sc_op_t whack_sc_op;
200 int inbase, outbase;
201 char *sc_data;
202
203 /* space for strings (hope there is enough room):
204 * Note that pointers don't travel on wire.
205 * 1 connection name [name_len]
206 * 2 left's name [left.host.name.len]
207 * 3 left's cert
208 * 4 left's ca
209 * 5 left's groups
210 * 6 left's updown
211 * 7 right's name [left.host.name.len]
212 * 8 right's cert
213 * 9 right's ca
214 * 10 right's groups
215 * 11 right's updown
216 * 12 keyid
217 * 13 myid
218 * 14 cacert
219 * 15 ldaphost
220 * 16 ldapbase
221 * 17 crluri
222 * 18 crluri2
223 * 19 ocspuri
224 * 20 ike
225 " 21 esp
226 * 22 rsa_data
227 * plus keyval (limit: 8K bits + overhead), a chunk.
228 */
229 size_t str_size;
230 char string[2048];
231 };
232
233 /* Codes for status messages returned to whack.
234 * These are 3 digit decimal numerals. The structure
235 * is inspired by section 4.2 of RFC959 (FTP).
236 * Since these will end up as the exit status of whack, they
237 * must be less than 256.
238 * NOTE: ipsec_auto(8) knows about some of these numbers -- change carefully.
239 */
240 enum rc_type {
241 RC_COMMENT, /* non-commital utterance (does not affect exit status) */
242 RC_WHACK_PROBLEM, /* whack-detected problem */
243 RC_LOG, /* message aimed at log (does not affect exit status) */
244 RC_LOG_SERIOUS, /* serious message aimed at log (does not affect exit status) */
245 RC_SUCCESS, /* success (exit status 0) */
246
247 /* failure, but not definitive */
248
249 RC_RETRANSMISSION = 10,
250
251 /* improper request */
252
253 RC_DUPNAME = 20, /* attempt to reuse a connection name */
254 RC_UNKNOWN_NAME, /* connection name unknown or state number */
255 RC_ORIENT, /* cannot orient connection: neither end is us */
256 RC_CLASH, /* clash between two Road Warrior connections OVERLOADED */
257 RC_DEAF, /* need --listen before --initiate */
258 RC_ROUTE, /* cannot route */
259 RC_RTBUSY, /* cannot unroute: route busy */
260 RC_BADID, /* malformed --id */
261 RC_NOKEY, /* no key found through DNS */
262 RC_NOPEERIP, /* cannot initiate when peer IP is unknown */
263 RC_INITSHUNT, /* cannot initiate a shunt-oly connection */
264 RC_WILDCARD, /* cannot initiate when ID has wildcards */
265 RC_NOVALIDPIN, /* cannot initiate without valid PIN */
266
267 /* permanent failure */
268
269 RC_BADWHACKMESSAGE = 30,
270 RC_NORETRANSMISSION,
271 RC_INTERNALERR,
272 RC_OPPOFAILURE, /* Opportunism failed */
273
274 /* entry of secrets */
275 RC_ENTERSECRET = 40,
276
277 /* progress: start of range for successful state transition.
278 * Actual value is RC_NEW_STATE plus the new state code.
279 */
280 RC_NEW_STATE = 100,
281
282 /* start of range for notification.
283 * Actual value is RC_NOTIFICATION plus code for notification
284 * that should be generated by this Pluto.
285 */
286 RC_NOTIFICATION = 200 /* as per IKE notification messages */
287 };
288
289 /* options of whack --list*** command */
290
291 #define LIST_NONE 0x0000 /* don't list anything */
292 #define LIST_ALGS 0x0001 /* list all registered IKE algorithms */
293 #define LIST_PUBKEYS 0x0002 /* list all public keys */
294 #define LIST_CERTS 0x0004 /* list all host/user certs */
295 #define LIST_CACERTS 0x0008 /* list all ca certs */
296 #define LIST_ACERTS 0x0010 /* list all attribute certs */
297 #define LIST_AACERTS 0x0020 /* list all aa certs */
298 #define LIST_OCSPCERTS 0x0040 /* list all ocsp certs */
299 #define LIST_GROUPS 0x0080 /* list all access control groups */
300 #define LIST_CAINFOS 0x0100 /* list all ca information records */
301 #define LIST_CRLS 0x0200 /* list all crls */
302 #define LIST_OCSP 0x0400 /* list all ocsp cache entries */
303 #define LIST_CARDS 0x0800 /* list all smartcard records */
304
305 #define LIST_ALL LRANGES(LIST_ALGS, LIST_CARDS) /* all list options */
306
307 /* options of whack --reread*** command */
308
309 #define REREAD_NONE 0x00 /* don't reread anything */
310 #define REREAD_SECRETS 0x01 /* reread /etc/ipsec.secrets */
311 #define REREAD_CACERTS 0x02 /* reread certs in /etc/ipsec.d/cacerts */
312 #define REREAD_AACERTS 0x04 /* reread certs in /etc/ipsec.d/aacerts */
313 #define REREAD_OCSPCERTS 0x08 /* reread certs in /etc/ipsec.d/ocspcerts */
314 #define REREAD_ACERTS 0x10 /* reread certs in /etc/ipsec.d/acerts */
315 #define REREAD_CRLS 0x20 /* reread crls in /etc/ipsec.d/crls */
316
317 #define REREAD_ALL LRANGES(REREAD_SECRETS, REREAD_CRLS) /* all reread options */
318
319 #endif /* _WHACK_H */