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

📄 algoinfo.c

📁 This a good VPN source
💻 C
📖 第 1 页 / 共 4 页
字号:
				program_name, c);			exit(1);		}		previous = c;	}	if(debug) {		fprintf(stdout, "%s: All options processed.\n",				program_name);	}	if(argcount == 1) {		system("cat /proc/net/ipsec_spi");		exit(0);	}	switch(alg) {#ifdef KERNEL_ALG	case XF_OTHER_ALG: 		/* validate keysizes */		if (proc_read_ok) {		       const struct sadb_alg *alg_p;		       int keylen, minbits, maxbits;		       alg_p=kernel_alg_sadb_alg_get(SADB_SATYPE_ESP,SADB_EXT_SUPPORTED_ENCRYPT, 				       esp_info->encryptalg);		       assert(alg_p);		       keylen=enckeylen * 8;		       if (alg_p->sadb_alg_id==ESP_3DES || alg_p->sadb_alg_id==ESP_DES) {			       maxbits=minbits=alg_p->sadb_alg_minbits * 8 /7;		       } else {			       minbits=alg_p->sadb_alg_minbits;			       maxbits=alg_p->sadb_alg_maxbits;		       }		       /* 			* if explicit keylen told in encrypt algo, eg "aes128"			* check actual keylen "equality"			*/		       if (esp_info->esp_ealg_keylen &&			       esp_info->esp_ealg_keylen!=keylen) {			       fprintf(stderr, "%s: invalid encryption keylen=%d, "					       "required %d by encrypt algo string=\"%s\"\n",				       program_name, 				       keylen,				       (int)esp_info->esp_ealg_keylen,				       alg_string);			       exit(1);		       }		       /* thanks DES for this sh*t */		       if (minbits > keylen || maxbits < keylen) {			       fprintf(stderr, "%s: invalid encryption keylen=%d, "					       "must be between %d and %d bits\n",					       program_name, 					       keylen, minbits, maxbits);			       exit(1);		       }		       alg_p=kernel_alg_sadb_alg_get(SADB_SATYPE_ESP,SADB_EXT_SUPPORTED_AUTH, 				       esp_info->authalg);		       assert(alg_p);		       keylen=authkeylen * 8;		       minbits=alg_p->sadb_alg_minbits;		       maxbits=alg_p->sadb_alg_maxbits;		       if (minbits > keylen || maxbits < keylen) {			       fprintf(stderr, "%s: invalid auth keylen=%d, "					       "must be between %d and %d bits\n",					       program_name, 					       keylen, minbits, maxbits);			       exit(1);		       }		}#endif /* KERNEL_ALG */	case XF_IP4:	case XF_IP6:	case XF_DEL:	case XF_AHHMACMD5:	case XF_AHHMACSHA1:	case XF_ESP3DESMD596:	case XF_ESP3DESSHA196:	case XF_ESP3DES:	case XF_COMPDEFLATE:		if(!said_opt) {			if(isanyaddr(&edst)) {				fprintf(stderr, "%s: SA destination not specified.\n",					program_name);				exit(1);			}			if(!spi) {				fprintf(stderr, "%s: SA SPI not specified.\n",					program_name);				exit(1);			}			if(!proto) {				fprintf(stderr, "%s: SA PROTO not specified.\n",					program_name);				exit(1);			}			initsaid(&edst, htonl(spi), proto, &said);		} else {			proto = said.proto;			spi = ntohl(said.spi);			edst = said.dst;		}		if((address_family != 0) && (address_family != addrtypeof(&said.dst))) {			fprintf(stderr, "%s: Defined address family and address family of SA missmatch.\n",				program_name);			exit(1);		}		sa_len = satot(&said, 0, sa, sizeof(sa));		if(debug) {			fprintf(stdout, "%s: SA valid.\n",				program_name);		}		break;	case XF_CLR:		break;	default:		fprintf(stderr, "%s: No action chosen.  See '%s --help' for usage.\n",			program_name, program_name);		exit(1);	}	switch(alg) {	case XF_CLR:	case XF_DEL:	case XF_IP4:	case XF_IP6:	case XF_AHHMACMD5:	case XF_AHHMACSHA1:	case XF_ESP3DESMD596:	case XF_ESP3DESSHA196:	case XF_ESP3DES:	case XF_COMPDEFLATE:#ifdef KERNEL_ALG	case XF_OTHER_ALG:#endif /* NO_KERNEL_ALG */		break;	default:		fprintf(stderr, "%s: No action chosen.  See '%s --help' for usage.\n",			program_name, program_name);		exit(1);	}	if(debug) {		fprintf(stdout, "%s: Algorithm ok.\n",			program_name);	}	if((pfkey_sock = socket(PF_KEY, SOCK_RAW, PF_KEY_V2) ) < 0) {		fprintf(stderr, "%s: Trouble opening PF_KEY family socket with error: ",			program_name);		switch(errno) {		case ENOENT:			fprintf(stderr, "device does not exist.  See FreeS/WAN installation procedure.\n");			break;		case EACCES:			fprintf(stderr, "access denied.  ");			if(getuid() == 0) {				fprintf(stderr, "Check permissions.  Should be 600.\n");			} else {				fprintf(stderr, "You must be root to open this file.\n");			}			break;		case EUNATCH:			fprintf(stderr, "Netlink not enabled OR KLIPS not loaded.\n");			break;		case ENODEV:			fprintf(stderr, "KLIPS not loaded or enabled.\n");			break;		case EBUSY:			fprintf(stderr, "KLIPS is busy.  Most likely a serious internal error occured in a previous command.  Please report as much detail as possible to development team.\n");			break;		case EINVAL:			fprintf(stderr, "Invalid argument, KLIPS not loaded or check kernel log messages for specifics.\n");			break;		case ENOBUFS:			fprintf(stderr, "No kernel memory to allocate SA.\n");			break;		case ESOCKTNOSUPPORT:			fprintf(stderr, "Algorithm support not available in the kernel.  Please compile in support.\n");			break;		case EEXIST:			fprintf(stderr, "SA already in use.  Delete old one first.\n");			break;		case ENXIO:			fprintf(stderr, "SA does not exist.  Cannot delete.\n");			break;		case EAFNOSUPPORT:			fprintf(stderr, "KLIPS not loaded or enabled.\n");			break;		default:			fprintf(stderr, "Unknown file open error %d.  Please report as much detail as possible to development team.\n", errno);		}		exit(1);	}#ifdef MANUAL_IS_NOT_ABLE_TO_NEGOTIATE	/* for registering SA types that can be negotiated */	if(pfkey_register(SADB_SATYPE_AH) != 0) {		exit(1);	}	if(pfkey_register(SADB_SATYPE_ESP) != 0) {		exit(1);	}	if(pfkey_register(SADB_X_SATYPE_IPIP) != 0) {		exit(1);	}	if(pfkey_register(SADB_X_SATYPE_COMP) != 0) {		exit(1);	}#endif /* MANUAL_IS_NOT_ABLE_TO_NEGOTIATE */	/* Build an SADB_ADD message to send down. */	/* It needs <base, SA, address(SD), key(AE)> minimum. */	/*   Lifetime(HS) could be added before addresses. */	pfkey_extensions_init(extensions);	if(debug) {		fprintf(stdout, "%s: extensions=0p%p &extensions=0p%p extensions[0]=0p%p &extensions[0]=0p%p cleared.\n",			program_name,			extensions,			&extensions,			extensions[0],			&extensions[0]);	}	if((error = pfkey_msg_hdr_build(&extensions[0],					(alg == XF_DEL ? SADB_DELETE : alg == XF_CLR ? SADB_FLUSH : SADB_ADD),					proto2satype(proto),					0,					++pfkey_seq,					mypid))) {		fprintf(stderr, "%s: Trouble building message header, error=%d.\n",			program_name, error);		pfkey_extensions_free(extensions);		exit(1);	}	if(debug) {		fprintf(stdout, "%s: extensions=0p%p &extensions=0p%p extensions[0]=0p%p &extensions[0]=0p%p set w/msghdr.\n",			program_name,			extensions,			&extensions,			extensions[0],			&extensions[0]);	}	if(debug) {		fprintf(stdout, "%s: base message assembled.\n", program_name);	}		switch(alg) {	case XF_AHHMACMD5:	case XF_ESP3DESMD596:		authalg = SADB_AALG_MD5HMAC;		break;	case XF_AHHMACSHA1:	case XF_ESP3DESSHA196:		authalg = SADB_AALG_SHA1HMAC;		break;#ifdef KERNEL_ALG	case XF_OTHER_ALG:		authalg= esp_info->authalg;		if(debug) {			fprintf(stdout, "%s: debug: authalg=%d\n",				program_name, authalg);		}		break;#endif /* KERNEL_ALG */	case XF_ESP3DESMD5:	default:		authalg = SADB_AALG_NONE;	}	switch(alg) {	case XF_ESP3DES:	case XF_ESP3DESMD596:	case XF_ESP3DESSHA196:		encryptalg = SADB_EALG_3DESCBC;		break;	case XF_COMPDEFLATE:		encryptalg = SADB_X_CALG_DEFLATE;		break;#ifdef KERNEL_ALG	case XF_OTHER_ALG:		encryptalg= esp_info->encryptalg;		if(debug) {			fprintf(stdout, "%s: debug: encryptalg=%d\n",				program_name, encryptalg);		}		break;#endif /* KERNEL_ALG */	default:		encryptalg = SADB_EALG_NONE;	}	if(!(alg == XF_CLR /* IE: pfkey_msg->sadb_msg_type == SADB_FLUSH */)) {		if((error = pfkey_sa_build(&extensions[SADB_EXT_SA],					   SADB_EXT_SA,					   htonl(spi), /* in network order */					   replay_window,					   SADB_SASTATE_MATURE,					   authalg,					   encryptalg,					   0))) {			fprintf(stderr, "%s: Trouble building sa extension, error=%d.\n",				program_name, error);			pfkey_extensions_free(extensions);			exit(1);		}		if(debug) {			fprintf(stdout, "%s: extensions[0]=0p%p previously set with msg_hdr.\n",				program_name,				extensions[0]);		}		if(debug) {			fprintf(stdout, "%s: assembled SA extension, pfkey msg authalg=%d encalg=%d.\n",				program_name,				authalg,				encryptalg);		}				if(debug) {			int i,j;			for(i = 0; i < life_maxsever; i++) {				for(j = 0; j < life_maxtype; j++) {					fprintf(stdout, "%s: i=%d, j=%d, life_opt[%d][%d]=0p%p, life[%d][%d]=%d\n",						program_name,						i, j, i, j, life_opt[i][j], i, j, life[i][j]);				}			}		}		if(life_opt[life_soft][life_alloc] != NULL ||		   life_opt[life_soft][life_bytes] != NULL ||		   life_opt[life_soft][life_addtime] != NULL ||		   life_opt[life_soft][life_usetime] != NULL ||		   life_opt[life_soft][life_packets] != NULL) {			if((error = pfkey_lifetime_build(&extensions[SADB_EXT_LIFETIME_SOFT],							 SADB_EXT_LIFETIME_SOFT,							 life[life_soft][life_alloc],/*-1,*/		/*allocations*/							 life[life_soft][life_bytes],/*-1,*/		/*bytes*/							 life[life_soft][life_addtime],/*-1,*/		/*addtime*/							 life[life_soft][life_usetime],/*-1,*/		/*usetime*/							 life[life_soft][life_packets]/*-1*/))) {	/*packets*/				fprintf(stderr, "%s: Trouble building lifetime_s extension, error=%d.\n",					program_name, error);				pfkey_extensions_free(extensions);				exit(1);			}			if(debug) {				fprintf(stdout, "%s: lifetime_s extension assembled.\n",					program_name);			}		}		if(life_opt[life_hard][life_alloc] != NULL ||		   life_opt[life_hard][life_bytes] != NULL ||		   life_opt[life_hard][life_addtime] != NULL ||		   life_opt[life_hard][life_usetime] != NULL ||		   life_opt[life_hard][life_packets] != NULL) {			if((error = pfkey_lifetime_build(&extensions[SADB_EXT_LIFETIME_HARD],							 SADB_EXT_LIFETIME_HARD,							 life[life_hard][life_alloc],/*-1,*/		/*allocations*/							 life[life_hard][life_bytes],/*-1,*/		/*bytes*/							 life[life_hard][life_addtime],/*-1,*/		/*addtime*/							 life[life_hard][life_usetime],/*-1,*/		/*usetime*/							 life[life_hard][life_packets]/*-1*/))) {	/*packets*/				fprintf(stderr, "%s: Trouble building lifetime_h extension, error=%d.\n",					program_name, error);				pfkey_extensions_free(extensions);				exit(1);			}			if(debug) {				fprintf(stdout, "%s: lifetime_h extension assembled.\n",					program_name);			}		}				if(debug) {                	addrtot(&src, 0, ipaddr_txt, sizeof(ipaddr_txt));			fprintf(stdout, "%s: assembling address_s extension (%s).\n",				program_name, ipaddr_txt);		}			if((error = pfkey_address_build(&extensions[SADB_EXT_ADDRESS_SRC],						SADB_EXT_ADDRESS_SRC,						0,						0,						sockaddrof(&src)))) {                	addrtot(&src, 0, ipaddr_txt, sizeof(ipaddr_txt));			fprintf(stderr, "%s: Trouble building address_s extension (%s), error=%d.\n",				program_name, ipaddr_txt, error);			pfkey_extensions_free(extensions);			exit(1);		}		if(debug) {			ip_address temp_addr;						switch(address_family) {				case AF_INET:					initaddr((const unsigned char *)&(((struct sockaddr_in*)( ((struct sadb_address*)(extensions[SADB_EXT_ADDRESS_SRC])) + 1))->sin_addr),						sockaddrlenof(&src), address_family, &temp_addr);					break;				case AF_INET6:					initaddr((const unsigned char *)&(((struct sockaddr_in6*)( ((struct sadb_address*)(extensions[SADB_EXT_ADDRESS_SRC])) + 1))->sin6_addr),						sockaddrlenof(&src), address_family, &temp_addr);					break;				default:					fprintf(stdout, "%s: unknown address family (%d).\n",						program_name, address_family);					exit(1);			}                	addrtot(&temp_addr, 0, ipaddr_txt, sizeof(ipaddr_txt));			fprintf(stdout, "%s: address_s extension assembled (%s).\n",				program_name, ipaddr_txt);		}			if(debug) {                	addrtot(&edst, 0, ipaddr_txt, sizeof(ipaddr_txt));			fprintf(stdout, "%s: assembling address_d extension (%s).\n",				program_name, ipaddr_txt);		}			if((error = pfkey_address_build(&extensions[SADB_EXT_ADDRESS_DST],						SADB_EXT_ADDRESS_DST,						0,						0,						sockaddrof(&edst)))) {                	addrtot(&edst, 0, ipaddr_txt, sizeof(ipaddr_txt));			fprintf(stderr, "%s: Trouble building address_d extension (%s), error=%d.\n",				program_name, ipaddr_txt, error);			pfkey_extensions_free(extensions);			exit(1);		}		if(debug) {			ip_address temp_addr;			switch(address_family) {				case AF_INET:					initaddr((const unsigned char *)&(((struct sockaddr_in*)( ((struct sadb_address*)(extensions[SADB_EXT_ADDRESS_DST])) + 1))->sin_addr),						4, address_family, &temp_addr);					break;				case AF_INET6:					initaddr((const unsigned char *)&(((struct sockaddr_in6*)( ((struct sadb_address*)(extensions[SADB_EXT_ADDRESS_DST])) + 1))->sin6_addr),						16, address_family, &temp_addr);					break;				default:					fprintf(stdout, "%s: unknown address family (%d).\n",						program_name, address_family);					exit(1);			}                	addrtot(&temp_addr, 0, ipaddr_txt, sizeof(ipaddr_txt));			fprintf(stdout, "%s: address_d extension assembled (%s).\n",				program_name, ipaddr_txt);		}#if PFKEY_PROXY		anyaddr(address_family, &pfkey_address_p_ska);		if((error = pfkey_address_build(&extensions[SADB_EXT_ADDRESS_PROXY],						SADB_EXT_ADDRESS_PROXY,						0,						0,						sockaddrof(&pfkey_address_p_ska)))) {			fprintf(stderr, "%s: Trouble building address_p extension, error=%d.\n",				program_name, error);			pfkey_extensions_free(extensions);			exit(1);		}		if(debug) {			fprintf(stdout, "%s: address_p extension assembled.\n", program_name);		}#endif /* PFKEY_PROXY */				switch(alg) {#ifdef KERNEL_ALG

⌨️ 快捷键说明

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