📄 spi.c
字号:
anyaddr(address_family, &dst); anyaddr(address_family, &edst); anyaddr(address_family, &src); said_opt = optarg; break; case 'A': if(optarg[0] == '0') { switch(optarg[1]) { case 't': case 'x': case 's': break; default: fprintf(stderr, "%s: Authentication key must have a '0x', '0t' or '0s' prefix to select the format: %s\n", program_name, optarg); exit(1); } } authkeylen = atodata(optarg, 0, NULL, 0); if(!authkeylen) { fprintf(stderr, "%s: unknown format or syntax error in authentication key: %s\n", program_name, optarg); exit (1); } authkey = malloc(authkeylen); if(authkey == NULL) { fprintf(stderr, "%s: Memory allocation error.\n", program_name); exit(1); } memset(authkey, 0, authkeylen); authkeylen = atodata(optarg, 0, authkey, authkeylen); akey_opt = optarg; break; case 'E': if(optarg[0] == '0') { switch(optarg[1]) { case 't': case 'x': case 's': break; default: fprintf(stderr, "%s: Encryption key must have a '0x', '0t' or '0s' prefix to select the format: %s\n", program_name, optarg); exit(1); } } enckeylen = atodata(optarg, 0, NULL, 0); if(!enckeylen) { fprintf(stderr, "%s: unknown format or syntax error in encryption key: %s\n", program_name, optarg); exit (1); } enckey = malloc(enckeylen); if(enckey == NULL) { fprintf(stderr, "%s: Memory allocation error.\n", program_name); exit(1); } memset(enckey, 0, enckeylen); enckeylen = atodata(optarg, 0, enckey, enckeylen); ekey_opt = optarg; break; case 'w': replay_window = strtoul(optarg, &endptr, 0); if(!(endptr == optarg + strlen(optarg))) { fprintf(stderr, "%s: Invalid character in replay_window parameter: %s\n", program_name, optarg); exit (1); } if((replay_window < 0x1) || (replay_window > 64)) { fprintf(stderr, "%s: Failed -- Illegal window size: arg=%s, replay_window=%d, must be 1 <= size <= 64.\n", program_name, optarg, replay_window); exit(1); } break; case 'i': if(optarg[0] == '0') { switch(optarg[1]) { case 't': case 'x': case 's': break; default: fprintf(stderr, "%s: IV must have a '0x', '0t' or '0s' prefix to select the format, found '%c'.\n", program_name, optarg[1]); exit(1); } } ivlen = atodata(optarg, 0, NULL, 0); if(!ivlen) { fprintf(stderr, "%s: unknown format or syntax error in IV: %s\n", program_name, optarg); exit (1); } iv = malloc(ivlen); if(iv == NULL) { fprintf(stderr, "%s: Memory allocation error.\n", program_name); exit(1); } memset(iv, 0, ivlen); ivlen = atodata(optarg, 0, iv, ivlen); iv_opt = optarg; break; case 'D': if(dst_opt) { fprintf(stderr, "%s: Error, DST parameter redefined:%s, already defined as:%s\n", program_name, optarg, dst_opt); exit (1); } error_s = ttoaddr(optarg, 0, address_family, &dst); if(error_s != NULL) { fprintf(stderr, "%s: Error, %s converting --dst argument:%s\n", program_name, error_s, optarg); exit (1); } dst_opt = optarg; if(debug) { addrtot(&dst, 0, ipaddr_txt, sizeof(ipaddr_txt)); fprintf(stdout, "dst=%s.\n", ipaddr_txt); } break; case 'S': if(src_opt) { fprintf(stderr, "%s: Error, SRC parameter redefined:%s, already defined as:%s\n", program_name, optarg, src_opt); exit (1); } error_s = ttoaddr(optarg, 0, address_family, &src); if(error_s != NULL) { fprintf(stderr, "%s: Error, %s converting --src argument:%s\n", program_name, error_s, optarg); exit (1); } src_opt = optarg; if(debug) { addrtot(&src, 0, ipaddr_txt, sizeof(ipaddr_txt)); fprintf(stdout, "src=%s.\n", ipaddr_txt); } break; case 'h': usage(program_name, stdout); exit(0); case '?': usage(program_name, stderr); exit(1); case 'v': fprintf(stdout, "%s %s\n", me, ipsec_version_code()); fprintf(stdout, "See `ipsec --copyright' for copyright information.\n"); exit(1); case '+': /* optionsfrom */ optionsfrom(optarg, &argc, &argv, optind, stderr); /* no return on error */ break; case 'f': if(parse_life_options(life, life_opt, optarg) != 0) { exit(1); }; break; default: fprintf(stderr, "%s: unrecognized option '%c', update option processing.\n", program_name, c); exit(1); } previous = c; } if(debug) { fprintf(stdout, "All options processed.\n"); } if(argcount == 1) { system("cat /proc/net/ipsec_spi"); exit(0); } switch(alg) {#ifndef NO_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, 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 /* NO_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, "SA valid.\n"); } 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:#ifndef NO_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, "Algorithm ok.\n"); } if((pfkey_sock = socket(PF_KEY, SOCK_RAW, PF_KEY_V2) ) < 0) { fprintf(stderr, "%s: Trouble openning 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 SIGS_FROM_BELOW { struct sigaction sig_act; int sig_act_err; memset(&sig_act, 0, sizeof(sig_act)); sig_act.sa_handler = pfkey_sig_handler; sigemptyset(&sig_act.sa_mask); sig_act.sa_flags = SA_RESTART; sig_act_err = sigaction(SIGIO, &sig_act, NULL); if(sig_act_err < 0) { fprintf(stderr, "Signal handler registration error.\n", sig_act_err); exit(1); } }#endif /* SIGS_FROM_BELOW */ #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=%p &extensions=%p extensions[0]=%p &extensions[0]=%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, getpid()))) { 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=%p &extensions=%p extensions[0]=%p &extensions[0]=%p set w/msghdr.\n", program_name, extensions, &extensions,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -