📄 algoinfo.c
字号:
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 + -