亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? print-esp.c

?? TCPDUMP的C語言源代碼,是在數(shù)據(jù)鏈路層的應(yīng)用
?? C
字號:
/*	$NetBSD: print-ah.c,v 1.4 1996/05/20 00:41:16 fvdl Exp $	*//* * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that: (1) source code distributions * retain the above copyright notice and this paragraph in its entirety, (2) * distributions including binary code include the above copyright notice and * this paragraph in its entirety in the documentation or other materials * provided with the distribution, and (3) all advertising materials mentioning * features or use of this software display the following acknowledgement: * ``This product includes software developed by the University of California, * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of * the University nor the names of its contributors may be used to endorse * or promote products derived from this software without specific prior * written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */#ifndef lintstatic const char rcsid[] _U_ =    "@(#) $Header: /tcpdump/master/tcpdump/print-esp.c,v 1.56 2005-04-21 06:44:40 guy Exp $ (LBL)";#endif#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <string.h>#include <tcpdump-stdinc.h>#include <stdlib.h>#ifdef HAVE_LIBCRYPTO#ifdef HAVE_OPENSSL_EVP_H#include <openssl/evp.h>#endif#endif#include <stdio.h>#include "ip.h"#include "esp.h"#ifdef INET6#include "ip6.h"#endif#include "netdissect.h"#include "addrtoname.h"#include "extract.h"#ifndef HAVE_SOCKADDR_STORAGE#ifdef INET6struct sockaddr_storage {	union {		struct sockaddr_in sin;		struct sockaddr_in6 sin6;	} un;};#else#define sockaddr_storage sockaddr#endif#endif /* HAVE_SOCKADDR_STORAGE */#ifdef HAVE_LIBCRYPTOstruct sa_list {	struct sa_list	*next;	struct sockaddr_storage daddr;	u_int32_t	spi;	const EVP_CIPHER *evp;	int		ivlen;	int		authlen;	u_char		secret[256];  /* is that big enough for all secrets? */	int		secretlen;};static void esp_print_addsa(netdissect_options *ndo,			    struct sa_list *sa, int sa_def){	/* copy the "sa" */	struct sa_list *nsa;	nsa = (struct sa_list *)malloc(sizeof(struct sa_list));	if (nsa == NULL)		(*ndo->ndo_error)(ndo, "ran out of memory to allocate sa structure");	*nsa = *sa;	if (sa_def)		ndo->ndo_sa_default = nsa;	nsa->next = ndo->ndo_sa_list_head;	ndo->ndo_sa_list_head = nsa;}static u_int hexdigit(netdissect_options *ndo, char hex){	if (hex >= '0' && hex <= '9')		return (hex - '0');	else if (hex >= 'A' && hex <= 'F')		return (hex - 'A' + 10);	else if (hex >= 'a' && hex <= 'f')		return (hex - 'a' + 10);	else {		(*ndo->ndo_error)(ndo, "invalid hex digit %c in espsecret\n", hex);		return 0;	}}static u_int hex2byte(netdissect_options *ndo, char *hexstring){	u_int byte;	byte = (hexdigit(ndo, hexstring[0]) << 4) + hexdigit(ndo, hexstring[1]);	return byte;}/* * decode the form:    SPINUM@IP <tab> ALGONAME:0xsecret * * special form: file /name * causes us to go read from this file instead. * */static void esp_print_decode_onesecret(netdissect_options *ndo, char *line){	struct sa_list sa1;	int sa_def;	char *spikey;	char *decode;	spikey = strsep(&line, " \t");	sa_def = 0;	memset(&sa1, 0, sizeof(struct sa_list));	/* if there is only one token, then it is an algo:key token */	if (line == NULL) {		decode = spikey;		spikey = NULL;		/* memset(&sa1.daddr, 0, sizeof(sa1.daddr)); */		/* sa1.spi = 0; */		sa_def    = 1;	} else		decode = line;	if (spikey && strcasecmp(spikey, "file") == 0) {		/* open file and read it */		FILE *secretfile;		char  fileline[1024];		char  *nl;		secretfile = fopen(line, FOPEN_READ_TXT);		if (secretfile == NULL) {			perror(line);			exit(3);		}		while (fgets(fileline, sizeof(fileline)-1, secretfile) != NULL) {			/* remove newline from the line */			nl = strchr(fileline, '\n');			if (nl)				*nl = '\0';			if (fileline[0] == '#') continue;			if (fileline[0] == '\0') continue;			esp_print_decode_onesecret(ndo, fileline);		}		fclose(secretfile);		return;	}	if (spikey) {		char *spistr, *foo;		u_int32_t spino;		struct sockaddr_in *sin;#ifdef INET6		struct sockaddr_in6 *sin6;#endif		spistr = strsep(&spikey, "@");		spino = strtoul(spistr, &foo, 0);		if (spistr == foo || !spikey) {			(*ndo->ndo_warning)(ndo, "print_esp: failed to decode spi# %s\n", foo);			return;		}		sa1.spi = spino;		sin = (struct sockaddr_in *)&sa1.daddr;#ifdef INET6		sin6 = (struct sockaddr_in6 *)&sa1.daddr;		if (inet_pton(AF_INET6, spikey, &sin6->sin6_addr) == 1) {#ifdef HAVE_SOCKADDR_SA_LEN			sin6->sin6_len = sizeof(struct sockaddr_in6);#endif			sin6->sin6_family = AF_INET6;		} else#endif		if (inet_pton(AF_INET, spikey, &sin->sin_addr) == 1) {#ifdef HAVE_SOCKADDR_SA_LEN			sin->sin_len = sizeof(struct sockaddr_in);#endif			sin->sin_family = AF_INET;		} else {			(*ndo->ndo_warning)(ndo, "print_esp: can not decode IP# %s\n", spikey);			return;		}	}	if (decode) {		char *colon, *p;		u_char espsecret_key[256];		int len;		size_t i;		const EVP_CIPHER *evp;		int authlen = 0;		/* skip any blank spaces */		while (isspace((unsigned char)*decode))			decode++;		colon = strchr(decode, ':');		if (colon == NULL) {			(*ndo->ndo_warning)(ndo, "failed to decode espsecret: %s\n", decode);			return;		}		*colon = '\0';		len = colon - decode;		if (strlen(decode) > strlen("-hmac96") &&		    !strcmp(decode + strlen(decode) - strlen("-hmac96"),		    "-hmac96")) {			p = strstr(decode, "-hmac96");			*p = '\0';			authlen = 12;		}		if (strlen(decode) > strlen("-cbc") &&		    !strcmp(decode + strlen(decode) - strlen("-cbc"), "-cbc")) {			p = strstr(decode, "-cbc");			*p = '\0';		}		evp = EVP_get_cipherbyname(decode);		if (!evp) {			(*ndo->ndo_warning)(ndo, "failed to find cipher algo %s\n", decode);			sa1.evp = NULL;			sa1.authlen = 0;			sa1.ivlen = 0;			return;		}		sa1.evp = evp;		sa1.authlen = authlen;		sa1.ivlen = EVP_CIPHER_iv_length(evp);		colon++;		if (colon[0] == '0' && colon[1] == 'x') {			/* decode some hex! */			colon += 2;			len = strlen(colon) / 2;			if (len > 256) {				(*ndo->ndo_warning)(ndo, "secret is too big: %d\n", len);				return;			}			i = 0;			while (colon[0] != '\0' && colon[1]!='\0') {				espsecret_key[i] = hex2byte(ndo, colon);				colon += 2;				i++;			}			memcpy(sa1.secret, espsecret_key, i);			sa1.secretlen = i;		} else {			i = strlen(colon);			if (i < sizeof(sa1.secret)) {				memcpy(sa1.secret, colon, i);				sa1.secretlen = i;			} else {				memcpy(sa1.secret, colon, sizeof(sa1.secret));				sa1.secretlen = sizeof(sa1.secret);			}		}	}	esp_print_addsa(ndo, &sa1, sa_def);}static void esp_print_decodesecret(netdissect_options *ndo){	char *line;	char *p;	p = ndo->ndo_espsecret;	while (ndo->ndo_espsecret && ndo->ndo_espsecret[0] != '\0') {		/* pick out the first line or first thing until a comma */		if ((line = strsep(&ndo->ndo_espsecret, "\n,")) == NULL) {			line = ndo->ndo_espsecret;			ndo->ndo_espsecret = NULL;		}		esp_print_decode_onesecret(ndo, line);	}}static void esp_init(netdissect_options *ndo _U_){	OpenSSL_add_all_algorithms();	EVP_add_cipher_alias(SN_des_ede3_cbc, "3des");}#endifintesp_print(netdissect_options *ndo,	  const u_char *bp, const int length, const u_char *bp2#ifndef HAVE_LIBCRYPTO	_U_#endif	,	int *nhdr#ifndef HAVE_LIBCRYPTO	_U_#endif	,	int *padlen#ifndef HAVE_LIBCRYPTO	_U_#endif	){	register const struct newesp *esp;	register const u_char *ep;#ifdef HAVE_LIBCRYPTO	struct ip *ip;	struct sa_list *sa = NULL;	int espsecret_keylen;#ifdef INET6	struct ip6_hdr *ip6 = NULL;#endif	int advance;	int len;	u_char *secret;	int ivlen = 0;	u_char *ivoff;	u_char *p;	EVP_CIPHER_CTX ctx;	int blocksz;	static int initialized = 0;#endif	esp = (struct newesp *)bp;#ifdef HAVE_LIBCRYPTO	secret = NULL;	advance = 0;	if (!initialized) {		esp_init(ndo);		initialized = 1;	}#endif#if 0	/* keep secret out of a register */	p = (u_char *)&secret;#endif	/* 'ep' points to the end of available data. */	ep = ndo->ndo_snapend;	if ((u_char *)(esp + 1) >= ep) {		fputs("[|ESP]", stdout);		goto fail;	}	(*ndo->ndo_printf)(ndo, "ESP(spi=0x%08x", EXTRACT_32BITS(&esp->esp_spi));	(*ndo->ndo_printf)(ndo, ",seq=0x%x)", EXTRACT_32BITS(&esp->esp_seq));        (*ndo->ndo_printf)(ndo, ", length %u", length);#ifndef HAVE_LIBCRYPTO	goto fail;#else	/* initiailize SAs */	if (ndo->ndo_sa_list_head == NULL) {		if (!ndo->ndo_espsecret)			goto fail;		esp_print_decodesecret(ndo);	}	if (ndo->ndo_sa_list_head == NULL)		goto fail;	ip = (struct ip *)bp2;	switch (IP_V(ip)) {#ifdef INET6	case 6:		ip6 = (struct ip6_hdr *)bp2;		/* we do not attempt to decrypt jumbograms */		if (!EXTRACT_16BITS(&ip6->ip6_plen))			goto fail;		/* if we can't get nexthdr, we do not need to decrypt it */		len = sizeof(struct ip6_hdr) + EXTRACT_16BITS(&ip6->ip6_plen);		/* see if we can find the SA, and if so, decode it */		for (sa = ndo->ndo_sa_list_head; sa != NULL; sa = sa->next) {			struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&sa->daddr;			if (sa->spi == ntohl(esp->esp_spi) &&			    sin6->sin6_family == AF_INET6 &&			    memcmp(&sin6->sin6_addr, &ip6->ip6_dst,				   sizeof(struct in6_addr)) == 0) {				break;			}		}		break;#endif /*INET6*/	case 4:		/* nexthdr & padding are in the last fragment */		if (EXTRACT_16BITS(&ip->ip_off) & IP_MF)			goto fail;		len = EXTRACT_16BITS(&ip->ip_len);		/* see if we can find the SA, and if so, decode it */		for (sa = ndo->ndo_sa_list_head; sa != NULL; sa = sa->next) {			struct sockaddr_in *sin = (struct sockaddr_in *)&sa->daddr;			if (sa->spi == ntohl(esp->esp_spi) &&			    sin->sin_family == AF_INET &&			    sin->sin_addr.s_addr == ip->ip_dst.s_addr) {				break;			}		}		break;	default:		goto fail;	}	/* if we didn't find the specific one, then look for	 * an unspecified one.	 */	if (sa == NULL)		sa = ndo->ndo_sa_default;		/* if not found fail */	if (sa == NULL)		goto fail;	/* if we can't get nexthdr, we do not need to decrypt it */	if (ep - bp2 < len)		goto fail;	if (ep - bp2 > len) {		/* FCS included at end of frame (NetBSD 1.6 or later) */		ep = bp2 + len;	}	ivoff = (u_char *)(esp + 1) + 0;	ivlen = sa->ivlen;	secret = sa->secret;	espsecret_keylen = sa->secretlen;	ep = ep - sa->authlen;	if (sa->evp) {		memset(&ctx, 0, sizeof(ctx));		if (EVP_CipherInit(&ctx, sa->evp, secret, NULL, 0) < 0)			(*ndo->ndo_warning)(ndo, "espkey init failed");		blocksz = EVP_CIPHER_CTX_block_size(&ctx);		p = ivoff;		EVP_CipherInit(&ctx, NULL, NULL, p, 0);		EVP_Cipher(&ctx, p + ivlen, p + ivlen, ep - (p + ivlen));		advance = ivoff - (u_char *)esp + ivlen;	} else		advance = sizeof(struct newesp);	/* sanity check for pad length */	if (ep - bp < *(ep - 2))		goto fail;	if (padlen)		*padlen = *(ep - 2) + 2;	if (nhdr)		*nhdr = *(ep - 1);	(ndo->ndo_printf)(ndo, ": ");	return advance;#endiffail:	return -1;}/* * Local Variables: * c-style: whitesmith * c-basic-offset: 8 * End: */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美日韩一区二区| 久久综合999| 一区二区视频免费在线观看| 99久久久无码国产精品| 亚洲靠逼com| 欧美在线观看18| 日本伊人精品一区二区三区观看方式| 欧美蜜桃一区二区三区| 日韩电影在线观看网站| 日韩欧美国产综合| 国产激情偷乱视频一区二区三区| 国产喷白浆一区二区三区| 处破女av一区二区| 亚洲一区二区三区爽爽爽爽爽| 欧洲国内综合视频| 蜜臀av亚洲一区中文字幕| 久久蜜桃av一区二区天堂 | 国产精品99精品久久免费| 久久久亚洲精品一区二区三区| 成人av网址在线| 亚洲大片在线观看| 久久久久国产精品人| 91在线精品秘密一区二区| 午夜不卡av免费| 久久日韩精品一区二区五区| 99久久精品免费看| 日本美女一区二区三区视频| 欧美激情一区在线| 欧美日韩视频在线第一区| 国产麻豆欧美日韩一区| 一区二区三区在线免费播放| 日韩你懂的在线播放| 99精品在线观看视频| 蜜臂av日日欢夜夜爽一区| 国产精品久久久久久久浪潮网站 | 欧美一区二区在线视频| 国产成人亚洲精品青草天美 | 奇米影视在线99精品| 国产精品久久久久永久免费观看| 欧美久久久久久蜜桃| 懂色一区二区三区免费观看| 天天综合网 天天综合色| 国产婷婷一区二区| 4438x亚洲最大成人网| av电影在线观看一区| 久久aⅴ国产欧美74aaa| 亚洲一区二区中文在线| 日本一区二区三区免费乱视频 | 色拍拍在线精品视频8848| 久久精品国产99| 亚洲超碰精品一区二区| 国产精品久久毛片a| 精品日韩成人av| 欧美日韩在线精品一区二区三区激情 | 成人黄色网址在线观看| 激情偷乱视频一区二区三区| 亚洲精品日韩专区silk| 一区视频在线播放| 中文字幕欧美日本乱码一线二线| 日韩女同互慰一区二区| 欧美日韩一卡二卡| 在线观看av一区| 99久久99久久精品国产片果冻| 国产福利一区二区三区在线视频| 日韩黄色小视频| 亚洲电影视频在线| 亚洲男人都懂的| 中文字幕一区视频| 亚洲欧美综合在线精品| 国产精品免费视频一区| 久久一夜天堂av一区二区三区| 69久久夜色精品国产69蝌蚪网 | 欧美丰满嫩嫩电影| 欧美日韩精品欧美日韩精品一综合| 91麻豆国产福利在线观看| 99精品国产一区二区三区不卡| 国产福利一区在线| 国产iv一区二区三区| 丁香亚洲综合激情啪啪综合| 国产成人精品一区二| 国产精品亚洲专一区二区三区| 国产尤物一区二区| 国产成人在线看| 成人国产精品免费观看视频| 成人午夜激情在线| 一本色道综合亚洲| 欧美天天综合网| 欧美一区二区三区小说| 欧美岛国在线观看| 国产日韩欧美a| 成人欧美一区二区三区在线播放| 亚洲少妇最新在线视频| 夜夜亚洲天天久久| 亚洲va韩国va欧美va精品| 蜜臀av一区二区三区| 国产麻豆精品视频| 99精品视频一区二区三区| 色哟哟国产精品免费观看| 欧美日韩电影在线| 欧美成人r级一区二区三区| 久久婷婷成人综合色| 国产精品伦理一区二区| 亚洲一区二区三区中文字幕| 日韩中文字幕一区二区三区| 国产在线不卡视频| 97精品久久久午夜一区二区三区| 欧美性高清videossexo| 26uuu国产电影一区二区| 亚洲欧洲精品一区二区精品久久久| 夜夜夜精品看看| 精品综合免费视频观看| 风间由美一区二区三区在线观看 | 国产天堂亚洲国产碰碰| 亚洲免费观看在线观看| 麻豆91在线播放| 成人午夜视频免费看| 欧美日韩高清不卡| 欧美经典三级视频一区二区三区| 一区二区久久久久久| 久久se这里有精品| 欧美性色黄大片| 国产日韩欧美亚洲| 日韩精品一二区| 97超碰欧美中文字幕| 日韩免费视频一区| 亚洲精品国产一区二区精华液| 麻豆免费精品视频| 91免费国产在线观看| 欧美成人性福生活免费看| 亚洲精品va在线观看| 国产在线乱码一区二区三区| 在线观看日韩精品| 久久久久久99精品| 日韩av不卡在线观看| 色综合久久六月婷婷中文字幕| 亚洲精品一区在线观看| 亚洲一卡二卡三卡四卡| 成人精品免费视频| 欧美α欧美αv大片| 婷婷丁香久久五月婷婷| 色婷婷综合五月| 国产日韩精品一区二区三区 | 在线精品亚洲一区二区不卡| 久久久精品免费网站| 日韩和欧美一区二区三区| 在线观看成人免费视频| 国产精品国产自产拍在线| 国产精品自产自拍| 日韩久久精品一区| 五月婷婷综合网| 欧洲色大大久久| 亚洲免费在线视频| 色综合夜色一区| 日本一区二区动态图| 国产精品18久久久久久vr| 日韩欧美亚洲另类制服综合在线| 亚洲国产精品综合小说图片区| 99国产精品国产精品毛片| 欧美国产综合色视频| 国产成人精品免费在线| 国产人成亚洲第一网站在线播放 | 高清国产午夜精品久久久久久| 久久一区二区三区国产精品| 免费高清在线一区| 91精品国产全国免费观看| 婷婷国产v国产偷v亚洲高清| 欧美日韩和欧美的一区二区| 亚洲一区二区视频在线| 欧美艳星brazzers| 偷窥少妇高潮呻吟av久久免费| 欧美在线视频不卡| 亚洲成人动漫精品| 91精品国产综合久久久蜜臀粉嫩 | 久久蜜臀中文字幕| 国产成人精品影视| 中文字幕 久热精品 视频在线 | 精品国产欧美一区二区| 国产一区二区在线观看视频| 亚洲精品一区二区三区99| 国产一区二区三区免费| 久久久91精品国产一区二区精品 | 亚洲线精品一区二区三区| 色综合久久综合| 肉肉av福利一精品导航| 91精品国产福利在线观看| 激情综合色播激情啊| 久久久国产精华| 99国产精品久久久久| 亚洲成人中文在线| 精品88久久久久88久久久| proumb性欧美在线观看| 亚洲无人区一区| 精品国产123| 一本久久精品一区二区| 日韩国产欧美一区二区三区| 亚洲精品一线二线三线无人区| 成人18视频在线播放| 手机精品视频在线观看| 欧美白人最猛性xxxxx69交| av电影一区二区|