spdb.c

来自「ipsec vpn」· C语言 代码 · 共 939 行 · 第 1/2 页

C
939
字号
/* Security Policy Data Base (such as it is) * Copyright (C) 1998-2001  D. Hugh Redelmeier. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * for more details. * * RCSID $Id: spdb.c,v 1.120 2005/07/05 22:07:06 mcr Exp $ */#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/queue.h>#include <openswan.h>#include <openswan/ipsec_policy.h>#include "pfkeyv2.h"#include "constants.h"#include "oswlog.h"#include "defs.h"#include "id.h"#include "x509.h"#include "pgp.h"#include "certs.h"#include "smartcard.h"#ifdef XAUTH_USEPAM#include <security/pam_appl.h>#endif#include "connections.h"	/* needs id.h */#include "state.h"#include "packet.h"#include "keys.h"#include "kernel.h"	/* needs connections.h */#include "log.h"#include "spdb.h"#include "whack.h"	/* for RC_LOG_SERIOUS */#include "sha1.h"#include "md5.h"#include "crypto.h" /* requires sha1.h and md5.h */#include "alg_info.h"#include "kernel_alg.h"#include "ike_alg.h"#include "db_ops.h"#define AD(x) x, elemsof(x)	/* Array Description */#define AD_NULL NULL, 0#ifdef NAT_TRAVERSAL#include "nat_traversal.h"#endif/**************** Oakley (main mode) SA database ****************//** * the XAUTH server/client stuff is a bit confusing. *  * XAUTH overloads the RSA/PSK types with four more types which * mean RSA or PSK, but also include whether one is negotiating * that the inititator with be the XAUTH client, or the responder will be * XAUTH client. It seems unusual that the responder would be the one * to undergo XAUTH, since usually it is a roadwarrior to a gateway, * * however, the gateway may decide it needs to do a new phase 1, for * instance. * * So, when reading this, say "I'm an XAUTH client and I'm initiating", * or "I'm an XAUTH server and I'm initiating". Responses for the responder * (and validation of the response by the initiator) are determined by the * parse_sa_isakmp() part, which folds the XAUTH types into their native * types to figure out if it is acceptable to us. * * *//* arrays of attributes for transforms, preshared key */static struct db_attr otpsk1024des3md5[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_MD5 },	{ OAKLEY_AUTHENTICATION_METHOD, OAKLEY_PRESHARED_KEY },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1024 },	};static struct db_attr otpsk1536des3md5[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_MD5 },	{ OAKLEY_AUTHENTICATION_METHOD, OAKLEY_PRESHARED_KEY },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1536 },	};static struct db_attr otpsk1024des3sha[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_SHA },	{ OAKLEY_AUTHENTICATION_METHOD, OAKLEY_PRESHARED_KEY },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1024 },	};static struct db_attr otpsk1536des3sha[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_SHA },	{ OAKLEY_AUTHENTICATION_METHOD, OAKLEY_PRESHARED_KEY },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1536 },	};/* arrays of attributes for transforms, preshared key, Xauth version */#ifdef XAUTHstatic struct db_attr otpsk1024des3md5_xauthc[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_MD5 },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHInitPreShared },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1024 },	};static struct db_attr otpsk1536des3md5_xauthc[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_MD5 },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHInitPreShared },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1536 },	};static struct db_attr otpsk1024des3sha_xauthc[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_SHA },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHInitPreShared },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1024 },	};static struct db_attr otpsk1536des3sha_xauthc[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_SHA },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHInitPreShared },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1536 },	};static struct db_attr otpsk1024des3md5_xauths[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_MD5 },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHRespPreShared },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1024 },	};static struct db_attr otpsk1536des3md5_xauths[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_MD5 },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHRespPreShared },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1536 },	};static struct db_attr otpsk1024des3sha_xauths[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_SHA },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHRespPreShared },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1024 },	};static struct db_attr otpsk1536des3sha_xauths[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_SHA },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHRespPreShared },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1536 },	};#endif/* arrays of attributes for transforms, RSA signatures */static struct db_attr otrsasig1024des3md5[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_MD5 },	{ OAKLEY_AUTHENTICATION_METHOD, OAKLEY_RSA_SIG },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1024 },	};static struct db_attr otrsasig1536des3md5[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_MD5 },	{ OAKLEY_AUTHENTICATION_METHOD, OAKLEY_RSA_SIG },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1536 },	};static struct db_attr otrsasig1024des3sha[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_SHA },	{ OAKLEY_AUTHENTICATION_METHOD, OAKLEY_RSA_SIG },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1024 },	};static struct db_attr otrsasig1536des3sha[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_SHA },	{ OAKLEY_AUTHENTICATION_METHOD, OAKLEY_RSA_SIG },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1536 },	};#ifdef XAUTH/* arrays of attributes for transforms, RSA signatures, with/Xauth *//* xauth c is when Initiator will be the xauth client */static struct db_attr otrsasig1024des3md5_xauthc[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_MD5 },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHInitRSA },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1024 },	};static struct db_attr otrsasig1536des3md5_xauthc[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_MD5 },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHInitRSA },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1536 },	};static struct db_attr otrsasig1024des3sha_xauthc[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_SHA },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHInitRSA },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1024 },	};static struct db_attr otrsasig1536des3sha_xauthc[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_SHA },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHInitRSA },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1536 },	};/* arrays of attributes for transforms, RSA signatures, with/Xauth *//* * xauth s is when the Responder will be the xauth client * the only time we do this is when we are initiating to a client * that we lost contact with. this is rare. */static struct db_attr otrsasig1024des3md5_xauths[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_MD5 },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHRespRSA },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1024 },	};static struct db_attr otrsasig1536des3md5_xauths[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_MD5 },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHInitRSA },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1536 },	};static struct db_attr otrsasig1024des3sha_xauths[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_SHA },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHRespRSA },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1024 },	};static struct db_attr otrsasig1536des3sha_xauths[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_SHA },	{ OAKLEY_AUTHENTICATION_METHOD, XAUTHRespRSA },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1536 },	};#endif/* We won't accept this, but by proposing it, we get to test * our rejection.  We better not propose it to an IKE daemon * that will accept it! */#ifdef TEST_INDECENT_PROPOSALstatic struct db_attr otpsk1024des3tiger[] = {	{ OAKLEY_ENCRYPTION_ALGORITHM, OAKLEY_3DES_CBC },	{ OAKLEY_HASH_ALGORITHM, OAKLEY_TIGER },	{ OAKLEY_AUTHENTICATION_METHOD, OAKLEY_PRESHARED_KEY },	{ OAKLEY_GROUP_DESCRIPTION, OAKLEY_GROUP_MODP1024 },	};#endif /* TEST_INDECENT_PROPOSAL *//* tables of transforms, in preference order (select based on AUTH) */static struct db_trans oakley_trans_psk[] = {#ifdef TEST_INDECENT_PROPOSAL	{ KEY_IKE, AD(otpsk1024des3tiger) },#endif	{ KEY_IKE, AD(otpsk1536des3md5) },	{ KEY_IKE, AD(otpsk1536des3sha) },	{ KEY_IKE, AD(otpsk1024des3sha) },	{ KEY_IKE, AD(otpsk1024des3md5) },    };#ifdef XAUTHstatic struct db_trans oakley_trans_psk_xauthc[] = {	{ KEY_IKE, AD(otpsk1536des3md5_xauthc) },	{ KEY_IKE, AD(otpsk1536des3sha_xauthc) },	{ KEY_IKE, AD(otpsk1024des3sha_xauthc) },	{ KEY_IKE, AD(otpsk1024des3md5_xauthc) },    };static struct db_trans oakley_trans_psk_xauths[] = {	{ KEY_IKE, AD(otpsk1536des3md5_xauths) },	{ KEY_IKE, AD(otpsk1536des3sha_xauths) },	{ KEY_IKE, AD(otpsk1024des3sha_xauths) },	{ KEY_IKE, AD(otpsk1024des3md5_xauths) },    };#endifstatic struct db_trans oakley_trans_rsasig[] = {	{ KEY_IKE, AD(otrsasig1536des3md5) },	{ KEY_IKE, AD(otrsasig1536des3sha) },	{ KEY_IKE, AD(otrsasig1024des3sha) },	{ KEY_IKE, AD(otrsasig1024des3md5) },    };#ifdef XAUTHstatic struct db_trans oakley_trans_rsasig_xauthc[] = {	{ KEY_IKE, AD(otrsasig1536des3md5_xauthc) },	{ KEY_IKE, AD(otrsasig1536des3sha_xauthc) },	{ KEY_IKE, AD(otrsasig1024des3sha_xauthc) },	{ KEY_IKE, AD(otrsasig1024des3md5_xauthc) },    };static struct db_trans oakley_trans_rsasig_xauths[] = {	{ KEY_IKE, AD(otrsasig1536des3md5_xauths) },	{ KEY_IKE, AD(otrsasig1536des3sha_xauths) },	{ KEY_IKE, AD(otrsasig1024des3sha_xauths) },	{ KEY_IKE, AD(otrsasig1024des3md5_xauths) },    };#endif/* In this table, either PSK or RSA sig is accepted. * The order matters, but I don't know what would be best. */static struct db_trans oakley_trans_pskrsasig[] = {#ifdef TEST_INDECENT_PROPOSAL	{ KEY_IKE, AD(otpsk1024des3tiger) },#endif	{ KEY_IKE, AD(otrsasig1536des3md5) },	{ KEY_IKE, AD(otpsk1536des3md5) },	{ KEY_IKE, AD(otrsasig1536des3sha) },	{ KEY_IKE, AD(otpsk1536des3sha) },	{ KEY_IKE, AD(otrsasig1024des3sha) },	{ KEY_IKE, AD(otpsk1024des3sha) },	{ KEY_IKE, AD(otrsasig1024des3md5) },	{ KEY_IKE, AD(otpsk1024des3md5) },    };#ifdef XAUTHstatic struct db_trans oakley_trans_pskrsasig_xauthc[] = {	{ KEY_IKE, AD(otrsasig1536des3md5_xauthc) },	{ KEY_IKE, AD(otpsk1536des3md5_xauthc) },	{ KEY_IKE, AD(otrsasig1536des3sha_xauthc) },	{ KEY_IKE, AD(otpsk1536des3sha_xauthc) },	{ KEY_IKE, AD(otrsasig1024des3sha_xauthc) },	{ KEY_IKE, AD(otpsk1024des3sha_xauthc) },	{ KEY_IKE, AD(otrsasig1024des3md5_xauthc) },	{ KEY_IKE, AD(otpsk1024des3md5_xauthc) },    };static struct db_trans oakley_trans_pskrsasig_xauths[] = {	{ KEY_IKE, AD(otrsasig1536des3md5_xauths) },	{ KEY_IKE, AD(otpsk1536des3md5_xauths) },	{ KEY_IKE, AD(otrsasig1536des3sha_xauths) },	{ KEY_IKE, AD(otpsk1536des3sha_xauths) },	{ KEY_IKE, AD(otrsasig1024des3sha_xauths) },	{ KEY_IKE, AD(otpsk1024des3sha_xauths) },	{ KEY_IKE, AD(otrsasig1024des3md5_xauths) },	{ KEY_IKE, AD(otpsk1024des3md5_xauths) },    };#endif/* * array of proposals to be conjoined (can only be one for Oakley) * AND of protocols. */static struct db_prop oakley_pc_psk[] =    { { PROTO_ISAKMP, AD(oakley_trans_psk) } };static struct db_prop oakley_pc_rsasig[] =    { { PROTO_ISAKMP, AD(oakley_trans_rsasig) } };static struct db_prop oakley_pc_pskrsasig[] =    { { PROTO_ISAKMP, AD(oakley_trans_pskrsasig) } };#ifdef XAUTHstatic struct db_prop oakley_pc_psk_xauths[] =    { { PROTO_ISAKMP, AD(oakley_trans_psk_xauths) } };static struct db_prop oakley_pc_rsasig_xauths[] =    { { PROTO_ISAKMP, AD(oakley_trans_rsasig_xauths) } };static struct db_prop oakley_pc_pskrsasig_xauths[] =    { { PROTO_ISAKMP, AD(oakley_trans_pskrsasig_xauths) } };static struct db_prop oakley_pc_psk_xauthc[] =    { { PROTO_ISAKMP, AD(oakley_trans_psk_xauthc) } };static struct db_prop oakley_pc_rsasig_xauthc[] =    { { PROTO_ISAKMP, AD(oakley_trans_rsasig_xauthc) } };static struct db_prop oakley_pc_pskrsasig_xauthc[] =    { { PROTO_ISAKMP, AD(oakley_trans_pskrsasig_xauthc) } };#endif/* array of proposal conjuncts (can only be one) (OR of protocol) */static struct db_prop_conj oakley_props_psk[] = { { AD(oakley_pc_psk) } };static struct db_prop_conj oakley_props_rsasig[] = { { AD(oakley_pc_rsasig) } };static struct db_prop_conj oakley_props_pskrsasig[] = { { AD(oakley_pc_pskrsasig) } };#ifdef XAUTHstatic struct db_prop_conj oakley_props_psk_xauthc[] = { { AD(oakley_pc_psk_xauthc) } };static struct db_prop_conj oakley_props_rsasig_xauthc[] = { { AD(oakley_pc_rsasig_xauthc) } };static struct db_prop_conj oakley_props_pskrsasig_xauthc[] = { { AD(oakley_pc_pskrsasig_xauthc) } };static struct db_prop_conj oakley_props_psk_xauths[] = { { AD(oakley_pc_psk_xauths) } };static struct db_prop_conj oakley_props_rsasig_xauths[] = { { AD(oakley_pc_rsasig_xauths) } };static struct db_prop_conj oakley_props_pskrsasig_xauths[] = { { AD(oakley_pc_pskrsasig_xauths) } };#endif/* the sadb entry, subscripted by POLICY_PSK and POLICY_RSASIG bits */struct db_sa oakley_sadb[] = {    { AD_NULL },	                /* none */    { AD(oakley_props_psk) },	        /* POLICY_PSK */    { AD(oakley_props_rsasig) },	/* POLICY_RSASIG */    { AD(oakley_props_pskrsasig) },	/* POLICY_PSK + POLICY_RSASIG */#ifdef XAUTH    { AD_NULL },                        /* POLICY_XAUTHSERVER + none */    { AD(oakley_props_psk_xauths) },    /* POLICY_XAUTHSERVER + PSK */    { AD(oakley_props_rsasig_xauths) }, /* POLICY_XAUTHSERVER + RSA */    { AD(oakley_props_pskrsasig_xauths)},/* POLICY_XAUTHSERVER + RSA+PSK */    { AD_NULL },                        /* POLICY_XAUTHCLIENT + none */    { AD(oakley_props_psk_xauthc) },    /* POLICY_XAUTHCLIENT + PSK */    { AD(oakley_props_rsasig_xauthc)},  /* POLICY_XAUTHCLIENT + RSA */    { AD(oakley_props_pskrsasig_xauthc)},/* POLICY_XAUTHCLIENT + RSA+PSK */    { AD_NULL },                        /* XAUTHCLIENT+XAUTHSERVER + none */    { AD_NULL },                        /* XAUTHCLIENT+XAUTHSERVER + PSK */    { AD_NULL },                        /* XAUTHCLIENT+XAUTHSERVER + RSA */    { AD_NULL },                        /* XAUTHCLIENT+XAUTHSERVER + RSA+PSK */#else /* XAUTH */    { AD_NULL },                        /* POLICY_XAUTHSERVER + none */    { AD_NULL },                        /* POLICY_XAUTHSERVER + PSK */    { AD_NULL },                        /* POLICY_XAUTHSERVER + RSA */    { AD_NULL },                        /* POLICY_XAUTHSERVER + RSA+PSK */    { AD_NULL },                        /* POLICY_XAUTHCLIENT + none */    { AD_NULL },                        /* POLICY_XAUTHCLIENT + PSK */    { AD_NULL },                        /* POLICY_XAUTHCLIENT + RSA */    { AD_NULL },                        /* POLICY_XAUTHCLIENT + RSA+PSK */    { AD_NULL },                        /* XAUTHCLIENT+XAUTHSERVER + none */    { AD_NULL },                        /* XAUTHCLIENT+XAUTHSERVER + PSK */    { AD_NULL },                        /* XAUTHCLIENT+XAUTHSERVER + RSA */    { AD_NULL },                        /* XAUTHCLIENT+XAUTHSERVER + RSA+PSK */#endif /* XAUTH */    };#if defined(AGGRESSIVE)/**************** Oakley (aggressive mode) SA database ****************//* * the Aggressive mode attributes must be seperate, because there * can be no choices --- since we must computer keying material,

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?