⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pfkey_v2_parse.c

📁 This a good VPN source
💻 C
📖 第 1 页 / 共 4 页
字号:
		"pfkey_address_parse: successful.\n"); errlab:	return error;}DEBUG_NO_STATIC intpfkey_key_parse(struct sadb_ext *pfkey_ext){	int error = 0;	struct sadb_key *pfkey_key = (struct sadb_key *)pfkey_ext;	/* sanity checks... */	if(!pfkey_key) {		ERROR(			"pfkey_key_parse: "			"NULL pointer passed in.\n");		SENDERR(EINVAL);	}	if(pfkey_key->sadb_key_len < sizeof(struct sadb_key) / IPSEC_PFKEYv2_ALIGN) {		ERROR(			  "pfkey_key_parse: "			  "size wrong ext_len=%d, key_ext_len=%d.\n",			  pfkey_key->sadb_key_len,			  (int)sizeof(struct sadb_key));		SENDERR(EINVAL);	}	if(!pfkey_key->sadb_key_bits) {		ERROR(			"pfkey_key_parse: "			"key length set to zero, must be non-zero.\n");		SENDERR(EINVAL);	}	if(pfkey_key->sadb_key_len !=	   DIVUP(sizeof(struct sadb_key) * OCTETBITS + pfkey_key->sadb_key_bits,		 PFKEYBITS)) {		ERROR(			"pfkey_key_parse: "			"key length=%d does not agree with extension length=%d.\n",			pfkey_key->sadb_key_bits,			pfkey_key->sadb_key_len);		SENDERR(EINVAL);	}		if(pfkey_key->sadb_key_reserved) {		ERROR(			"pfkey_key_parse: "			"res=%d, must be zero.\n",			pfkey_key->sadb_key_reserved);		SENDERR(EINVAL);	}	if(! ( (pfkey_key->sadb_key_exttype == SADB_EXT_KEY_AUTH) ||	       (pfkey_key->sadb_key_exttype == SADB_EXT_KEY_ENCRYPT))) {		ERROR(			"pfkey_key_parse: "			"expecting extension type AUTH or ENCRYPT, got %d.\n",			pfkey_key->sadb_key_exttype);		SENDERR(EINVAL);	}	DEBUGGING(PF_KEY_DEBUG_PARSE_STRUCT,		  "pfkey_key_parse: "		  "success, found len=%d exttype=%d(%s) bits=%d reserved=%d.\n",		  pfkey_key->sadb_key_len,		  pfkey_key->sadb_key_exttype,		  pfkey_v2_sadb_ext_string(pfkey_key->sadb_key_exttype),		  pfkey_key->sadb_key_bits,		  pfkey_key->sadb_key_reserved);errlab:	return error;}DEBUG_NO_STATIC intpfkey_ident_parse(struct sadb_ext *pfkey_ext){	int error = 0;	struct sadb_ident *pfkey_ident = (struct sadb_ident *)pfkey_ext;	/* sanity checks... */	if(pfkey_ident->sadb_ident_len < sizeof(struct sadb_ident) / IPSEC_PFKEYv2_ALIGN) {		ERROR(			  "pfkey_ident_parse: "			  "size wrong ext_len=%d, key_ext_len=%d.\n",			  pfkey_ident->sadb_ident_len,			  (int)sizeof(struct sadb_ident));		SENDERR(EINVAL);	}	if(pfkey_ident->sadb_ident_type > SADB_IDENTTYPE_MAX) {		ERROR(			"pfkey_ident_parse: "			"ident_type=%d out of range, must be less than %d.\n",			pfkey_ident->sadb_ident_type,			SADB_IDENTTYPE_MAX);		SENDERR(EINVAL);	}	if(pfkey_ident->sadb_ident_reserved) {		ERROR(			"pfkey_ident_parse: "			"res=%d, must be zero.\n",			pfkey_ident->sadb_ident_reserved);		SENDERR(EINVAL);	}	/* string terminator/padding must be zero */	if(pfkey_ident->sadb_ident_len > sizeof(struct sadb_ident) / IPSEC_PFKEYv2_ALIGN) {		if(*((char*)pfkey_ident + pfkey_ident->sadb_ident_len * IPSEC_PFKEYv2_ALIGN - 1)) {			ERROR(				"pfkey_ident_parse: "				"string padding must be zero, last is 0x%02x.\n",				*((char*)pfkey_ident +				  pfkey_ident->sadb_ident_len * IPSEC_PFKEYv2_ALIGN - 1));			SENDERR(EINVAL);		}	}		if( ! ((pfkey_ident->sadb_ident_exttype == SADB_EXT_IDENTITY_SRC) ||	       (pfkey_ident->sadb_ident_exttype == SADB_EXT_IDENTITY_DST))) {		ERROR(			"pfkey_key_parse: "			"expecting extension type IDENTITY_SRC or IDENTITY_DST, got %d.\n",			pfkey_ident->sadb_ident_exttype);		SENDERR(EINVAL);	}errlab:	return error;}DEBUG_NO_STATIC intpfkey_sens_parse(struct sadb_ext *pfkey_ext){	int error = 0;	struct sadb_sens *pfkey_sens = (struct sadb_sens *)pfkey_ext;	/* sanity checks... */	if(pfkey_sens->sadb_sens_len < sizeof(struct sadb_sens) / IPSEC_PFKEYv2_ALIGN) {		DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,			  "pfkey_sens_parse: "			  "size wrong ext_len=%d, key_ext_len=%d.\n",			  pfkey_sens->sadb_sens_len,			  (int)sizeof(struct sadb_sens));		SENDERR(EINVAL);	}	DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,		"pfkey_sens_parse: "		"Sorry, I can't parse exttype=%d yet.\n",		pfkey_ext->sadb_ext_type);#if 0	SENDERR(EINVAL); /* don't process these yet */#endiferrlab:	return error;}DEBUG_NO_STATIC intpfkey_prop_parse(struct sadb_ext *pfkey_ext){	int error = 0;	int i, num_comb;	struct sadb_prop *pfkey_prop = (struct sadb_prop *)pfkey_ext;	struct sadb_comb *pfkey_comb = (struct sadb_comb *)((char*)pfkey_ext + sizeof(struct sadb_prop));	/* sanity checks... */	if((pfkey_prop->sadb_prop_len < sizeof(struct sadb_prop) / IPSEC_PFKEYv2_ALIGN) || 	   (((pfkey_prop->sadb_prop_len * IPSEC_PFKEYv2_ALIGN) - sizeof(struct sadb_prop)) % sizeof(struct sadb_comb))) {		DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,			  "pfkey_prop_parse: "			  "size wrong ext_len=%d, prop_ext_len=%d comb_ext_len=%d.\n",			  pfkey_prop->sadb_prop_len,			  (int)sizeof(struct sadb_prop),			  (int)sizeof(struct sadb_comb));		SENDERR(EINVAL);	}	if(pfkey_prop->sadb_prop_replay > 64) {		DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,			"pfkey_prop_parse: "			"replay window size: %d -- must be 0 <= size <= 64\n",			pfkey_prop->sadb_prop_replay);		SENDERR(EINVAL);	}		for(i=0; i<3; i++) {		if(pfkey_prop->sadb_prop_reserved[i]) {			DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,				"pfkey_prop_parse: "				"res[%d]=%d, must be zero.\n",				i, pfkey_prop->sadb_prop_reserved[i]);			SENDERR(EINVAL);		}	}	num_comb = ((pfkey_prop->sadb_prop_len * IPSEC_PFKEYv2_ALIGN) - sizeof(struct sadb_prop)) / sizeof(struct sadb_comb);	for(i = 0; i < num_comb; i++) {		if(pfkey_comb->sadb_comb_auth > SADB_AALG_MAX) {			DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,				"pfkey_prop_parse: "				"pfkey_comb[%d]->sadb_comb_auth=%d > SADB_AALG_MAX=%d.\n",				i,				pfkey_comb->sadb_comb_auth,				SADB_AALG_MAX);			SENDERR(EINVAL);		}		if(pfkey_comb->sadb_comb_auth) {			if(!pfkey_comb->sadb_comb_auth_minbits) {				DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,					"pfkey_prop_parse: "					"pfkey_comb[%d]->sadb_comb_auth_minbits=0, fatal.\n",					i);				SENDERR(EINVAL);			}			if(!pfkey_comb->sadb_comb_auth_maxbits) {				DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,					"pfkey_prop_parse: "					"pfkey_comb[%d]->sadb_comb_auth_maxbits=0, fatal.\n",					i);				SENDERR(EINVAL);			}			if(pfkey_comb->sadb_comb_auth_minbits > pfkey_comb->sadb_comb_auth_maxbits) {				DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,					"pfkey_prop_parse: "					"pfkey_comb[%d]->sadb_comb_auth_minbits=%d > maxbits=%d, fatal.\n",					i,					pfkey_comb->sadb_comb_auth_minbits,					pfkey_comb->sadb_comb_auth_maxbits);				SENDERR(EINVAL);			}		} else {			if(pfkey_comb->sadb_comb_auth_minbits) {				DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,					"pfkey_prop_parse: "					"pfkey_comb[%d]->sadb_comb_auth_minbits=%d != 0, fatal.\n",					i,					pfkey_comb->sadb_comb_auth_minbits);				SENDERR(EINVAL);			}			if(pfkey_comb->sadb_comb_auth_maxbits) {				DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,					"pfkey_prop_parse: "					"pfkey_comb[%d]->sadb_comb_auth_maxbits=%d != 0, fatal.\n",					i,					pfkey_comb->sadb_comb_auth_maxbits);				SENDERR(EINVAL);			}		}#if SADB_EALG_MAX < 255			if(pfkey_comb->sadb_comb_encrypt > SADB_EALG_MAX) {			DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,				"pfkey_comb_parse: "				"pfkey_comb[%d]->sadb_comb_encrypt=%d > SADB_EALG_MAX=%d.\n",				i,				pfkey_comb->sadb_comb_encrypt,				SADB_EALG_MAX);			SENDERR(EINVAL);		}#endif		if(pfkey_comb->sadb_comb_encrypt) {			if(!pfkey_comb->sadb_comb_encrypt_minbits) {				DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,					"pfkey_prop_parse: "					"pfkey_comb[%d]->sadb_comb_encrypt_minbits=0, fatal.\n",					i);				SENDERR(EINVAL);			}			if(!pfkey_comb->sadb_comb_encrypt_maxbits) {				DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,					"pfkey_prop_parse: "					"pfkey_comb[%d]->sadb_comb_encrypt_maxbits=0, fatal.\n",					i);				SENDERR(EINVAL);			}			if(pfkey_comb->sadb_comb_encrypt_minbits > pfkey_comb->sadb_comb_encrypt_maxbits) {				DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,					"pfkey_prop_parse: "					"pfkey_comb[%d]->sadb_comb_encrypt_minbits=%d > maxbits=%d, fatal.\n",					i,					pfkey_comb->sadb_comb_encrypt_minbits,					pfkey_comb->sadb_comb_encrypt_maxbits);				SENDERR(EINVAL);			}		} else {			if(pfkey_comb->sadb_comb_encrypt_minbits) {				DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,					"pfkey_prop_parse: "					"pfkey_comb[%d]->sadb_comb_encrypt_minbits=%d != 0, fatal.\n",					i,					pfkey_comb->sadb_comb_encrypt_minbits);				SENDERR(EINVAL);			}			if(pfkey_comb->sadb_comb_encrypt_maxbits) {				DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,					"pfkey_prop_parse: "					"pfkey_comb[%d]->sadb_comb_encrypt_maxbits=%d != 0, fatal.\n",					i,					pfkey_comb->sadb_comb_encrypt_maxbits);				SENDERR(EINVAL);			}		}		/* XXX do sanity check on flags */		if(pfkey_comb->sadb_comb_hard_allocations && pfkey_comb->sadb_comb_soft_allocations > pfkey_comb->sadb_comb_hard_allocations) {			DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,				  "pfkey_prop_parse: "				  "pfkey_comb[%d]->sadb_comb_soft_allocations=%d > hard_allocations=%d, fatal.\n",				  i,				  pfkey_comb->sadb_comb_soft_allocations,				  pfkey_comb->sadb_comb_hard_allocations);			SENDERR(EINVAL);		}		if(pfkey_comb->sadb_comb_hard_bytes && pfkey_comb->sadb_comb_soft_bytes > pfkey_comb->sadb_comb_hard_bytes) {			DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,				  "pfkey_prop_parse: "				  "pfkey_comb[%d]->sadb_comb_soft_bytes=%Ld > hard_bytes=%Ld, fatal.\n",				  i,				  (unsigned long long int)pfkey_comb->sadb_comb_soft_bytes,				  (unsigned long long int)pfkey_comb->sadb_comb_hard_bytes);			SENDERR(EINVAL);		}		if(pfkey_comb->sadb_comb_hard_addtime && pfkey_comb->sadb_comb_soft_addtime > pfkey_comb->sadb_comb_hard_addtime) {			DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,				  "pfkey_prop_parse: "				  "pfkey_comb[%d]->sadb_comb_soft_addtime=%Ld > hard_addtime=%Ld, fatal.\n",				  i,				  (unsigned long long int)pfkey_comb->sadb_comb_soft_addtime,				  (unsigned long long int)pfkey_comb->sadb_comb_hard_addtime);			SENDERR(EINVAL);		}		if(pfkey_comb->sadb_comb_hard_usetime && pfkey_comb->sadb_comb_soft_usetime > pfkey_comb->sadb_comb_hard_usetime) {			DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,				  "pfkey_prop_parse: "				  "pfkey_comb[%d]->sadb_comb_soft_usetime=%Ld > hard_usetime=%Ld, fatal.\n",				  i,				  (unsigned long long int)pfkey_comb->sadb_comb_soft_usetime,				  (unsigned long long int)pfkey_comb->sadb_comb_hard_usetime);			SENDERR(EINVAL);		}		if(pfkey_comb->sadb_x_comb_hard_packets && pfkey_comb->sadb_x_comb_soft_packets > pfkey_comb->sadb_x_comb_hard_packets) {			DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,				"pfkey_prop_parse: "				"pfkey_comb[%d]->sadb_x_comb_soft_packets=%d > hard_packets=%d, fatal.\n",				i,				pfkey_comb->sadb_x_comb_soft_packets,				pfkey_comb->sadb_x_comb_hard_packets);			SENDERR(EINVAL);		}		if(pfkey_comb->sadb_comb_reserved) {			DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,				"pfkey_prop_parse: "				"comb[%d].res=%d, must be zero.\n",				i,				pfkey_comb->sadb_comb_reserved);			SENDERR(EINVAL);		}		pfkey_comb++;	}errlab:	return error;}DEBUG_NO_STATIC intpfkey_supported_parse(struct sadb_ext *pfkey_ext){	int error = 0;	unsigned int i, num_alg;	struct sadb_supported *pfkey_supported = (struct sadb_supported *)pfkey_ext;	struct sadb_alg *pfkey_alg = (struct sadb_alg*)((char*)pfkey_ext + sizeof(struct sadb_supported));	/* sanity checks... */	if((pfkey_supported->sadb_supported_len <	   sizeof(struct sadb_supported) / IPSEC_PFKEYv2_ALIGN) ||	   (((pfkey_supported->sadb_supported_len * IPSEC_PFKEYv2_ALIGN) -	     sizeof(struct sadb_supported)) % sizeof(struct sadb_alg))) {		DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,			  "pfkey_supported_parse: "			  "size wrong ext_len=%d, supported_ext_len=%d alg_ext_len=%d.\n",			  pfkey_supported->sadb_supported_len,			  (int)sizeof(struct sadb_supported),			  (int)sizeof(struct sadb_alg));		SENDERR(EINVAL);	}	if(pfkey_supported->sadb_supported_reserved) {		DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,			"pfkey_supported_parse: "			"res=%d, must be zero.\n",			pfkey_supported->sadb_supported_reserved);		SENDERR(EINVAL);	}	num_alg = ((pfkey_supported->sadb_supported_len * IPSEC_PFKEYv2_ALIGN) - sizeof(struct sadb_supported)) / sizeof(struct sadb_alg);	for(i = 0; i < num_alg; i++) {		/* process algo description */		if(pfkey_alg->sadb_alg_reserved) {			DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,				"pfkey_supported_parse: "				"alg[%d], id=%d, ivlen=%d, minbits=%d, maxbits=%d, res=%d, must be zero.\n",				i,				pfkey_alg->sadb_alg_id,				pfkey_alg->sadb_alg_ivlen,				pfkey_alg->sadb_alg_minbits,				pfkey_alg->sadb_alg_maxbits,				pfkey_alg->sadb_alg_reserved);			SENDERR(EINVAL);		}		/* XXX can alg_id auth/enc be determined from info given?		   Yes, but OpenBSD's method does not iteroperate with rfc2367.		   rgb, 2000-04-06 */		switch(pfkey_supported->sadb_supported_exttype) {		case SADB_EXT_SUPPORTED_AUTH:			if(pfkey_alg->sadb_alg_id > SADB_AALG_MAX) {				DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,					"pfkey_supported_parse: "					"alg[%d], alg_id=%d > SADB_AALG_MAX=%d, fatal.\n",					i,					pfkey_alg->sadb_alg_id,					SADB_AALG_MAX);				SENDERR(EINVAL);			}			break;		case SADB_EXT_SUPPORTED_ENCRYPT:#if SADB_EALG_MAX < 255				if(pfkey_alg->sadb_alg_id > SADB_EALG_MAX) {				DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,					"pfkey_supported_parse: "					"alg[%d], alg_id=%d > SADB_EALG_MAX=%d, fatal.\n",					i,					pfkey_alg->sadb_alg_id,					SADB_EALG_MAX);				SENDERR(EINVAL);			}#endif			break;		default:			DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM,				"pfkey_supported_parse: "				"alg[%d], alg_id=%d > SADB_EALG_MAX=%d, fatal.\n",

⌨️ 快捷键说明

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