print-isakmp.c

来自「TCPDUMP的C语言源代码,是在数据链路层的应用」· C语言 代码 · 共 2,402 行 · 第 1/4 页

C
2,402
字号
#define NOTIFY_ERROR_STR(x) \	STR_OR_ID((x), notify_error_str)/* 8192 - 16383 */#define IPSEC_NOTIFY_ERROR_STR(x) \	STR_OR_ID((u_int)((x) - 8192), ipsec_notify_error_str)/* 16384 - 24575 */#define NOTIFY_STATUS_STR(x) \	STR_OR_ID((u_int)((x) - 16384), notify_status_str)/* 24576 - 32767 */#define IPSEC_NOTIFY_STATUS_STR(x) \	STR_OR_ID((u_int)((x) - 24576), ipsec_notify_status_str)	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_N)));	p = (struct ikev1_pl_n *)ext;	ND_TCHECK(*p);	safememcpy(&n, ext, sizeof(n));	doi = ntohl(n.doi);	proto = n.prot_id;	if (doi != 1) {		ND_PRINT((ndo," doi=%d", doi));		ND_PRINT((ndo," proto=%d", proto));		if (ntohs(n.type) < 8192)			ND_PRINT((ndo," type=%s", NOTIFY_ERROR_STR(ntohs(n.type))));		else if (ntohs(n.type) < 16384)			ND_PRINT((ndo," type=%s", numstr(ntohs(n.type))));		else if (ntohs(n.type) < 24576)			ND_PRINT((ndo," type=%s", NOTIFY_STATUS_STR(ntohs(n.type))));		else			ND_PRINT((ndo," type=%s", numstr(ntohs(n.type))));		if (n.spi_size) {			ND_PRINT((ndo," spi="));			if (!rawprint(ndo, (caddr_t)(p + 1), n.spi_size))				goto trunc;		}		return (u_char *)(p + 1) + n.spi_size;	}	ND_PRINT((ndo," doi=ipsec"));	ND_PRINT((ndo," proto=%s", PROTOIDSTR(proto)));	if (ntohs(n.type) < 8192)		ND_PRINT((ndo," type=%s", NOTIFY_ERROR_STR(ntohs(n.type))));	else if (ntohs(n.type) < 16384)		ND_PRINT((ndo," type=%s", IPSEC_NOTIFY_ERROR_STR(ntohs(n.type))));	else if (ntohs(n.type) < 24576)		ND_PRINT((ndo," type=%s", NOTIFY_STATUS_STR(ntohs(n.type))));	else if (ntohs(n.type) < 32768)		ND_PRINT((ndo," type=%s", IPSEC_NOTIFY_STATUS_STR(ntohs(n.type))));	else		ND_PRINT((ndo," type=%s", numstr(ntohs(n.type))));	if (n.spi_size) {		ND_PRINT((ndo," spi="));		if (!rawprint(ndo, (caddr_t)(p + 1), n.spi_size))			goto trunc;	}	cp = (u_char *)(p + 1) + n.spi_size;	ep2 = (u_char *)p + item_len;	if (cp < ep) {		ND_PRINT((ndo," orig=("));		switch (ntohs(n.type)) {		case IPSECDOI_NTYPE_RESPONDER_LIFETIME:		    {			const struct attrmap *map = oakley_t_map;			size_t nmap = sizeof(oakley_t_map)/sizeof(oakley_t_map[0]);			while (cp < ep && cp < ep2) {				cp = ikev1_attrmap_print(ndo, cp,					(ep < ep2) ? ep : ep2, map, nmap);			}			break;		    }		case IPSECDOI_NTYPE_REPLAY_STATUS:			ND_PRINT((ndo,"replay detection %sabled",				  (*(u_int32_t *)cp) ? "en" : "dis"));			break;		case ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN:			if (ikev1_sub_print(ndo, ISAKMP_NPTYPE_SA,					    (struct isakmp_gen *)cp, ep, phase, doi, proto,					    depth) == NULL)				return NULL;			break;		default:			/* NULL is dummy */			isakmp_print(ndo, cp,				     item_len - sizeof(*p) - n.spi_size,				     NULL);		}		ND_PRINT((ndo,")"));	}	return (u_char *)ext + item_len;trunc:	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_N)));	return NULL;}static const u_char *ikev1_d_print(netdissect_options *ndo, u_char tpay _U_,	      const struct isakmp_gen *ext, u_int item_len _U_,	      const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi0 _U_,	      u_int32_t proto0 _U_, int depth _U_){	const struct ikev1_pl_d *p;	struct ikev1_pl_d d;	const u_int8_t *q;	u_int32_t doi;	u_int32_t proto;	int i;	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_D)));	p = (struct ikev1_pl_d *)ext;	ND_TCHECK(*p);	safememcpy(&d, ext, sizeof(d));	doi = ntohl(d.doi);	proto = d.prot_id;	if (doi != 1) {		ND_PRINT((ndo," doi=%u", doi));		ND_PRINT((ndo," proto=%u", proto));	} else {		ND_PRINT((ndo," doi=ipsec"));		ND_PRINT((ndo," proto=%s", PROTOIDSTR(proto)));	}	ND_PRINT((ndo," spilen=%u", d.spi_size));	ND_PRINT((ndo," nspi=%u", ntohs(d.num_spi)));	ND_PRINT((ndo," spi="));	q = (u_int8_t *)(p + 1);	for (i = 0; i < ntohs(d.num_spi); i++) {		if (i != 0)			ND_PRINT((ndo,","));		if (!rawprint(ndo, (caddr_t)q, d.spi_size))			goto trunc;		q += d.spi_size;	}	return q;trunc:	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_D)));	return NULL;}static const u_char *ikev1_vid_print(netdissect_options *ndo, u_char tpay _U_,		const struct isakmp_gen *ext,		u_int item_len _U_, const u_char *ep _U_,		u_int32_t phase _U_, u_int32_t doi _U_,		u_int32_t proto _U_, int depth _U_){	struct isakmp_gen e;	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_VID)));	ND_TCHECK(*ext);	safememcpy(&e, ext, sizeof(e));	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {		ND_PRINT((ndo," "));		if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))			goto trunc;	}	return (u_char *)ext + ntohs(e.len);trunc:	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_VID)));	return NULL;}/************************************************************//*                                                          *//*              IKE v2 - rfc4306 - dissector                *//*                                                          *//************************************************************/static voidikev2_pay_print(netdissect_options *ndo, const char *payname, int critical){	ND_PRINT((ndo,"%s%s:", payname, critical&0x80 ? "[C]" : ""));}static const u_char *ikev2_gen_print(netdissect_options *ndo, u_char tpay,		const struct isakmp_gen *ext){	struct isakmp_gen e;	ND_TCHECK(*ext);	safememcpy(&e, ext, sizeof(e));	ikev2_pay_print(ndo, NPSTR(tpay), e.critical);	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {		ND_PRINT((ndo," "));		if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))			goto trunc;	}	return (u_char *)ext + ntohs(e.len);trunc:	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));	return NULL;}static const u_char *ikev2_t_print(netdissect_options *ndo, u_char tpay _U_, int pcount,	      const struct isakmp_gen *ext, u_int item_len,	      const u_char *ep, u_int32_t phase _U_, u_int32_t doi _U_,	      u_int32_t proto _U_, int depth _U_){	const struct ikev2_t *p;	struct ikev2_t t;	u_int16_t  t_id;	const u_char *cp;	const char *idstr;	const struct attrmap *map;	size_t nmap;	const u_char *ep2;	p = (struct ikev2_t *)ext;	ND_TCHECK(*p);	safememcpy(&t, ext, sizeof(t));	ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_T), t.h.critical);	t_id = ntohs(t.t_id);		map = NULL;	nmap = 0;	switch (t.t_type) {	case IV2_T_ENCR:		idstr = STR_OR_ID(t_id, esp_p_map);		map = encr_t_map;		nmap = sizeof(encr_t_map)/sizeof(encr_t_map[0]);		break;	case IV2_T_PRF:		idstr = STR_OR_ID(t_id, prf_p_map);		break;	case IV2_T_INTEG:		idstr = STR_OR_ID(t_id, integ_p_map);		break;	case IV2_T_DH:		idstr = STR_OR_ID(t_id, dh_p_map);		break;	case IV2_T_ESN:		idstr = STR_OR_ID(t_id, esn_p_map);		break;	default:		idstr = NULL;		break;	}	if (idstr)		ND_PRINT((ndo," #%u type=%s id=%s ", pcount,			  STR_OR_ID(t.t_type, ikev2_t_type_map),			  idstr));	else		ND_PRINT((ndo," #%u type=%s id=%u ", pcount,			  STR_OR_ID(t.t_type, ikev2_t_type_map),			  t.t_id));	cp = (u_char *)(p + 1);	ep2 = (u_char *)p + item_len;	while (cp < ep && cp < ep2) {		if (map && nmap) {			cp = ikev1_attrmap_print(ndo, cp, (ep < ep2) ? ep : ep2,				map, nmap);		} else			cp = ikev1_attr_print(ndo, cp, (ep < ep2) ? ep : ep2);	}	if (ep < ep2)		ND_PRINT((ndo,"..."));	return cp;trunc:	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_T)));	return NULL;}static const u_char *ikev2_p_print(netdissect_options *ndo, u_char tpay _U_, int pcount _U_,	      const struct isakmp_gen *ext, u_int item_len _U_,	       const u_char *ep, u_int32_t phase, u_int32_t doi0,	       u_int32_t proto0 _U_, int depth){	const struct ikev2_p *p;	struct ikev2_p prop;	const u_char *cp;	p = (struct ikev2_p *)ext;	ND_TCHECK(*p);	safememcpy(&prop, ext, sizeof(prop));	ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_P), prop.h.critical);	ND_PRINT((ndo," #%u protoid=%s transform=%d",		  prop.p_no, PROTOIDSTR(prop.prot_id), prop.num_t));	if (prop.spi_size) {		ND_PRINT((ndo," spi="));		if (!rawprint(ndo, (caddr_t)(p + 1), prop.spi_size))			goto trunc;	}	ext = (struct isakmp_gen *)((u_char *)(p + 1) + prop.spi_size);	ND_TCHECK(*ext);		cp = ikev2_sub_print(ndo, ISAKMP_NPTYPE_T, ext, ep, phase, doi0,			     prop.prot_id, depth);		return cp;trunc:	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_P)));	return NULL;}static const u_char *ikev2_sa_print(netdissect_options *ndo, u_char tpay, 		const struct isakmp_gen *ext1,		u_int item_len _U_, const u_char *ep _U_,		u_int32_t phase _U_, u_int32_t doi _U_,		u_int32_t proto _U_, int depth _U_){	struct isakmp_gen e;	int    osa_len, sa_len;	ND_TCHECK(*ext1);	safememcpy(&e, ext1, sizeof(e));	ikev2_pay_print(ndo, "sa", e.critical);	osa_len= ntohs(e.len);	sa_len = osa_len - 4;	ND_PRINT((ndo," len=%d", sa_len));	ikev2_sub_print(ndo, ISAKMP_NPTYPE_P,			ext1+1, ep,			0, 0, 0, depth);	return (u_char *)ext1 + osa_len;trunc:	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));	return NULL;}static const u_char *ikev2_ke_print(netdissect_options *ndo, u_char tpay, 		const struct isakmp_gen *ext,		u_int item_len _U_, const u_char *ep _U_,		u_int32_t phase _U_, u_int32_t doi _U_,		u_int32_t proto _U_, int depth _U_){	struct ikev2_ke ke;	struct ikev2_ke *k;	k = (struct ikev2_ke *)ext;	ND_TCHECK(*ext);	safememcpy(&ke, ext, sizeof(ke));	ikev2_pay_print(ndo, NPSTR(tpay), ke.h.critical);	ND_PRINT((ndo," len=%u group=%s", ntohs(ke.h.len) - 8,		  STR_OR_ID(ntohs(ke.ke_group), dh_p_map)));		 	if (2 < ndo->ndo_vflag && 8 < ntohs(ke.h.len)) {		ND_PRINT((ndo," "));		if (!rawprint(ndo, (caddr_t)(k + 1), ntohs(ke.h.len) - 8))			goto trunc;	}	return (u_char *)ext + ntohs(ke.h.len);trunc:	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));	return NULL;}static const u_char *ikev2_ID_print(netdissect_options *ndo, u_char tpay, 		const struct isakmp_gen *ext,		u_int item_len _U_, const u_char *ep _U_,		u_int32_t phase _U_, u_int32_t doi _U_,		u_int32_t proto _U_, int depth _U_){	return ikev2_gen_print(ndo, tpay, ext);}static const u_char *ikev2_cert_print(netdissect_options *ndo, u_char tpay, 		const struct isakmp_gen *ext,		u_int item_len _U_, const u_char *ep _U_,		u_int32_t phase _U_, u_int32_t doi _U_,		u_int32_t proto _U_, int depth _U_){	return ikev2_gen_print(ndo, tpay, ext);}static const u_char *ikev2_cr_print(netdissect_options *ndo, u_char tpay, 		const struct isakmp_gen *ext,		u_int item_len _U_, const u_char *ep _U_,		u_int32_t phase _U_, u_int32_t doi _U_,		u_int32_t proto _U_, int depth _U_){	return ikev2_gen_print(ndo, tpay, ext);}static const u_char *ikev2_auth_print(netdissect_options *ndo, u_char tpay, 		const struct isakmp_gen *ext,		u_int item_len _U_, const u_char *ep _U_,		u_int32_t phase _U_, u_int32_t doi _U_,		u_int32_t proto _U_, int depth _U_){	struct ikev2_auth e;	const char *v2_auth[]={ "invalid", "rsasig",				"shared-secret", "dsssig" };	ND_TCHECK(*ext);	safememcpy(&e, ext, sizeof(e));	ikev2_pay_print(ndo, NPSTR(tpay), e.h.critical);	ND_PRINT((ndo," len=%d method=%s", ntohs(e.h.len) - 4, 		  STR_OR_ID(e.auth_method, v2_auth)));	if (1 < ndo->ndo_vflag && 4 < ntohs(e.h.len)) {		ND_PRINT((ndo," authdata=("));		if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.h.len) - 4))			goto trunc;		ND_PRINT((ndo,") "));	} else if(ndo->ndo_vflag && 4 < ntohs(e.h.len)) {		if(!ike_show_somedata(ndo, (const u_char *)(ext+1), ep)) goto trunc;	}	return (u_char *)ext + ntohs(e.h.len);trunc:	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));	return NULL;}static const u_char *ikev2_nonce_print(netdissect_options *ndo, u_char tpay, 		const struct isakmp_gen *ext,		u_int item_len _U_, const u_char *ep _U_,		u_int32_t phase _U_, u_int32_t doi _U_,		u_int32_t proto _U_, int depth _U_){	struct isakmp_gen e;	ND_TCHECK(*ext);	safememcpy(&e, ext, sizeof(e));	ikev2_pay_print(ndo, "nonce", e.critical);	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));	if (1 < ndo->ndo_vflag && 4 < ntohs(e.len)) {		ND_PRINT((ndo," nonce=("));		if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))			goto trunc;		ND_PRINT((ndo,") "));	} else if(ndo->ndo_vflag && 4 < ntohs(e.len)) {		if(!ike_show_somedata(ndo, (const u_char *)(ext+1), ep)) goto trunc;	}	return (u_char *)ext + ntohs(e.len);trunc:	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));	return NULL;}/* notify payloads */static const u_char *ikev2_n_print(netdissect_options *ndo, u_char tpay _U_, 		const struct isakmp_gen *ext,		u_int item_len _U_, const u_char *ep _U_,		u_int32_t phase _U_, u_int32_t doi _U_,		u_int32_t proto _U_, int depth _U_){	struct ikev2_n *p, n;	const u_char *cp;	u_char *ep2;	u_char showspi, showdata, showsomedata;	const char *notify_name;	u_int32_t type;	p = (struct ikev2_n *)ext;	ND_TCHECK(*p);	safememcpy(&n, ext, sizeof(n));	ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_N), n.h.critical);	showspi = 1;	showdata = 0;	showsomedata=0;	notify_name=NULL;	ND_PRINT((ndo," prot_id=%s", PROTOIDSTR(n.prot_id)));	type = ntohs(n.type);	/* notify space is annoying sparse */	switch(type) {	case IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD:		notify_name = "unsupported_critical_payload";		showspi = 0;		break;	case IV2_NOTIFY_INVALID_IKE_SPI:		notify_name = "invalid_ike_spi";		showspi = 1;		break;	case IV2_NOTIFY_INVALID_MAJOR_VERSION:		notify_name = "invalid_major_version";		showspi = 0;		break;	case IV2_NOTIFY_INVALID_SYNTAX:		notify_name = "invalid_syntax";		showspi = 1;		break;	case IV2_NOTIFY_INVALID_MESSAGE_ID:		notify_name = "invalid_message_id";		showspi = 1;		break;	case IV2_NOTIFY_INVALID_SPI:		notify_name = "invalid_spi";		showspi = 1;		break;	case IV2_NOTIFY_NO_PROPOSAL_CHOSEN:		notify_name = "no_protocol_chosen";		showspi = 1;		break;	case IV2_NOTIFY_INVALID_KE_PAYLOAD:		notify_name = "invalid_ke_payload";		showspi = 1;		break;	case IV2_NOTIFY_AUTHENTICATION_FAILED:		notify_name = "authentication_failed";		showspi = 1;		break;	case IV2_NOTIFY_SINGLE_PAIR_REQUIRED:		notify_name = "single_pair_required";		showspi = 1;		break;	case IV2_NOTIFY_NO_ADDITIONAL_SAS:		notify_name = "no_additional_sas";		showspi = 0;		break;	case IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE:		notify_name = "internal_address_failure";		showspi = 0;		break;	case IV2_NOTIFY_FAILED_CP_REQUIRED: 		notify_name = "failed:cp_required";		showspi = 0;		break;	case IV2_NOTIFY_INVALID_SELECTORS:		notify_name = "invalid_selectors";		showspi = 0;		break;	case IV2_NOTIFY_INITIAL_CONTACT:		notify_name = "initial_contact";		showspi = 0;		break;	case IV2_NOTIFY_SET_WINDOW_SIZE:   		notify_name = "set_window_size";		showspi = 0;		break;	case IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE:		notify_name = "additional_ts_possible";		showspi = 0;		break;	case IV2_NOTIFY_IPCOMP_SUPPORTED: 		notify_name = "ipcomp_supported";		showspi = 0;		break;	case IV2_NOTIFY_NAT_DETECTION_SOURCE_IP:		notify_name = "nat_detection_source_ip";		showspi = 1;		break;	case IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP:		notify_name = "nat_detection_destination_ip";		showspi = 1;		break;	case IV2_NOTIFY_COOKIE:		notify_name = "cookie";		showspi = 1;		showsomedata= 1;		showdata= 0;		break;

⌨️ 快捷键说明

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