1 /* $NetBSD: remoteconf.h,v 1.16 2011/03/14 15:50:36 vanhu Exp $ */ 2 3 /* Id: remoteconf.h,v 1.26 2006/05/06 15:52:44 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 _REMOTECONF_H 35 #define _REMOTECONF_H 36 37 /* remote configuration */ 38 39 #include <sys/queue.h> 40 #include "genlist.h" 41 #ifdef ENABLE_HYBRID 42 #include "isakmp_var.h" 43 #include "isakmp_xauth.h" 44 #endif 45 46 struct ph1handle; 47 struct secprotospec; 48 49 struct etypes { 50 int type; 51 struct etypes *next; 52 }; 53 54 /* ISAKMP SA specification */ 55 struct isakmpsa { 56 int prop_no; 57 int trns_no; 58 time_t lifetime; 59 size_t lifebyte; 60 int enctype; 61 int encklen; 62 int authmethod; 63 int hashtype; 64 int vendorid; 65 #ifdef HAVE_GSSAPI 66 vchar_t *gssid; 67 #endif 68 int dh_group; /* don't use it if aggressive mode */ 69 struct dhgroup *dhgrp; /* don't use it if aggressive mode */ 70 71 struct isakmpsa *next; /* next transform */ 72 }; 73 74 /* Certificate information */ 75 struct rmconf_cert { 76 vchar_t *data; /* certificate payload */ 77 char *filename; /* name of local file */ 78 }; 79 80 /* Script hooks */ 81 #define SCRIPT_PHASE1_UP 0 82 #define SCRIPT_PHASE1_DOWN 1 83 #define SCRIPT_PHASE1_DEAD 2 84 #define SCRIPT_MAX 2 85 extern char *script_names[SCRIPT_MAX + 1]; 86 87 struct remoteconf { 88 char *name; /* remote configuration name */ 89 struct sockaddr *remote; /* remote IP address */ 90 /* if family is AF_UNSPEC, that is 91 * for anonymous configuration. */ 92 93 struct etypes *etypes; /* exchange type list. the head 94 * is a type to be sent first. */ 95 int doitype; /* doi type */ 96 int sittype; /* situation type */ 97 98 int idvtype; /* my identifier type */ 99 vchar_t *idv; /* my identifier */ 100 vchar_t *key; /* my pre-shared key */ 101 struct genlist *idvl_p; /* peer's identifiers list */ 102 103 char *myprivfile; /* file name of my private key file */ 104 char *mycertfile; /* file name of my certificate */ 105 vchar_t *mycert; /* my certificate */ 106 char *peerscertfile; /* file name of peer's certifcate */ 107 vchar_t *peerscert; /* peer's certificate */ 108 char *cacertfile; /* file name of CA */ 109 vchar_t *cacert; /* CA certificate */ 110 111 int send_cert; /* send to CERT or not */ 112 int send_cr; /* send to CR or not */ 113 int match_empty_cr; /* does this match if CR is empty */ 114 int verify_cert; /* verify a CERT strictly */ 115 int verify_identifier; /* vefify the peer's identifier */ 116 int nonce_size; /* the number of bytes of nonce */ 117 int passive; /* never initiate */ 118 int ike_frag; /* IKE fragmentation */ 119 int esp_frag; /* ESP fragmentation */ 120 int mode_cfg; /* Gets config through mode config */ 121 int support_proxy; /* support mip6/proxy */ 122 #define GENERATE_POLICY_NONE 0 123 #define GENERATE_POLICY_REQUIRE 1 124 #define GENERATE_POLICY_UNIQUE 2 125 int gen_policy; /* generate policy if no policy found */ 126 int ini_contact; /* initial contact */ 127 int pcheck_level; /* level of propocl checking */ 128 int nat_traversal; /* NAT-Traversal */ 129 vchar_t *script[SCRIPT_MAX + 1];/* script hooks paths */ 130 int dh_group; /* use it when only aggressive mode */ 131 struct dhgroup *dhgrp; /* use it when only aggressive mode */ 132 /* above two can't be defined by user*/ 133 134 int dpd; /* Negociate DPD support ? */ 135 int dpd_retry; /* in seconds */ 136 int dpd_interval; /* in seconds */ 137 int dpd_maxfails; 138 139 int rekey; /* rekey ph1 when active ph2s? */ 140 #define REKEY_OFF FALSE 141 #define REKEY_ON TRUE 142 #define REKEY_FORCE 2 143 144 uint32_t ph1id; /* ph1id to be matched with sainfo sections */ 145 146 int weak_phase1_check; /* act on unencrypted deletions ? */ 147 148 struct isakmpsa *proposal; /* proposal list */ 149 struct remoteconf *inherited_from; /* the original rmconf 150 from which this one 151 was inherited */ 152 153 time_t lifetime; /* for isakmp/ipsec */ 154 int lifebyte; /* for isakmp/ipsec */ 155 struct secprotospec *spspec; /* the head is always current spec. */ 156 157 struct genlist *rsa_private, /* lists of PlainRSA keys to use */ 158 *rsa_public; 159 160 #ifdef ENABLE_HYBRID 161 struct xauth_rmconf *xauth; 162 #endif 163 164 TAILQ_ENTRY(remoteconf) chain; /* next remote conf */ 165 }; 166 167 #define RMCONF_NONCE_SIZE(rmconf) \ 168 (rmconf != NULL ? rmconf->nonce_size : DEFAULT_NONCE_SIZE) 169 170 struct dhgroup; 171 172 struct idspec { 173 int idtype; /* identifier type */ 174 vchar_t *id; /* identifier */ 175 }; 176 177 struct rmconfselector { 178 int flags; 179 struct sockaddr *remote; 180 int etype; 181 struct isakmpsa *approval; 182 vchar_t *identity; 183 vchar_t *certificate_request; 184 }; 185 186 extern void rmconf_selector_from_ph1 __P((struct rmconfselector *rmsel, 187 struct ph1handle *iph1)); 188 extern int enumrmconf __P((struct rmconfselector *rmsel, 189 int (* enum_func)(struct remoteconf *rmconf, void *arg), 190 void *enum_arg)); 191 192 #define GETRMCONF_F_NO_ANONYMOUS 0x0001 193 #define GETRMCONF_F_NO_PASSIVE 0x0002 194 195 #define RMCONF_ERR_MULTIPLE ((struct remoteconf *) -1) 196 197 extern int rmconf_match_identity __P((struct remoteconf *rmconf, 198 vchar_t *id_p)); 199 extern struct remoteconf *getrmconf __P((struct sockaddr *remote, int flags)); 200 extern struct remoteconf *getrmconf_by_ph1 __P((struct ph1handle *iph1)); 201 extern struct remoteconf *getrmconf_by_name __P((const char *name)); 202 203 extern struct remoteconf *newrmconf __P((void)); 204 extern struct remoteconf *duprmconf_shallow __P((struct remoteconf *)); 205 extern int duprmconf_finish __P((struct remoteconf *)); 206 extern void delrmconf __P((struct remoteconf *)); 207 extern void deletypes __P((struct etypes *)); 208 extern struct etypes * dupetypes __P((struct etypes *)); 209 extern void insrmconf __P((struct remoteconf *)); 210 extern void remrmconf __P((struct remoteconf *)); 211 extern void flushrmconf __P((void)); 212 extern void dupspspec_list __P((struct remoteconf *, struct remoteconf *)); 213 extern void flushspspec __P((struct remoteconf *)); 214 extern void initrmconf __P((void)); 215 extern void rmconf_start_reload __P((void)); 216 extern void rmconf_finish_reload __P((void)); 217 218 extern int check_etypeok __P((struct remoteconf *, void *)); 219 220 extern struct isakmpsa *newisakmpsa __P((void)); 221 extern struct isakmpsa *dupisakmpsa __P((struct isakmpsa *)); 222 extern void delisakmpsa __P((struct isakmpsa *)); 223 extern void insisakmpsa __P((struct isakmpsa *, struct remoteconf *)); 224 #ifdef ENABLE_HYBRID 225 extern int isakmpsa_switch_authmethod __P((int authmethod)); 226 #else 227 static inline int isakmpsa_switch_authmethod(int authmethod) 228 { 229 return authmethod; 230 } 231 #endif 232 extern struct isakmpsa * checkisakmpsa __P((int pcheck, 233 struct isakmpsa *proposal, 234 struct isakmpsa *acceptable)); 235 236 237 extern void dumprmconf __P((void)); 238 239 extern struct idspec *newidspec __P((void)); 240 241 extern vchar_t *script_path_add __P((vchar_t *)); 242 243 #endif /* _REMOTECONF_H */ 244