📄 spi.c
字号:
++pfkey_seq, getpid()))) { fprintf(stderr, "%s: Trouble building message header, error=%d.\n", program_name, error); pfkey_extensions_free(extensions); return(1); } if((error = pfkey_msg_build(&pfkey_msg, extensions, EXT_BITS_IN))) { fprintf(stderr, "%s: Trouble building pfkey message, error=%d.\n", program_name, error); pfkey_extensions_free(extensions); pfkey_msg_free(&pfkey_msg); return(1); } if(write(pfkey_sock, pfkey_msg, pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) != pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) { /* cleanup code here */ fprintf(stderr, "%s: Trouble writing to channel PF_KEY.\n", program_name); pfkey_extensions_free(extensions); pfkey_msg_free(&pfkey_msg); return(1); } pfkey_extensions_free(extensions); pfkey_msg_free(&pfkey_msg); return(0);}static struct option const longopts[] ={ {"ah", 1, 0, 'H'}, {"esp", 1, 0, 'P'}, {"comp", 1, 0, 'Z'}, {"ip4", 0, 0, '4'}, {"ip6", 0, 0, '6'}, {"del", 0, 0, 'd'}, {"authkey", 1, 0, 'A'}, {"enckey", 1, 0, 'E'}, {"edst", 1, 0, 'e'}, {"spi", 1, 0, 's'}, {"proto", 1, 0, 'p'}, {"af", 1, 0, 'a'}, {"replay_window", 1, 0, 'w'}, {"iv", 1, 0, 'i'}, {"dst", 1, 0, 'D'}, {"src", 1, 0, 'S'}, {"said", 1, 0, 'I'}, {"help", 0, 0, 'h'}, {"version", 0, 0, 'v'}, {"clear", 0, 0, 'c'}, {"label", 1, 0, 'l'}, {"debug", 0, 0, 'g'}, {"optionsfrom", 1, 0, '+'}, {"life", 1, 0, 'f'}, {0, 0, 0, 0}};intmain(int argc, char *argv[]){ char *endptr; __u32 spi = 0; int c, previous = -1;/* int ret; */ ip_said said; size_t sa_len; const char* error_s; char ipaddr_txt[ADDRTOT_BUF]; char ipsaid_txt[SATOT_BUF]; int error = 0; int argcount = argc; unsigned char authalg, encryptalg; struct sadb_ext *extensions[SADB_EXT_MAX + 1]; struct sadb_msg *pfkey_msg; char *iv_opt, *akey_opt, *ekey_opt, *alg_opt, *edst_opt, *spi_opt, *proto_opt, *af_opt, *said_opt, *dst_opt, *src_opt;#if 0 ip_address pfkey_address_p_ska; ip_address pfkey_ident_s_ska; ip_address pfkey_ident_d_ska;#endif uint32_t life[life_maxsever][life_maxtype]; char *life_opt[life_maxsever][life_maxtype]; program_name = argv[0]; memset(&said, 0, sizeof(said)); iv_opt = akey_opt = ekey_opt = alg_opt = edst_opt = spi_opt = proto_opt = af_opt = said_opt = dst_opt = src_opt = NULL; { int i,j; for(i = 0; i < life_maxsever; i++) { for(j = 0; j < life_maxtype; j++) { life_opt[i][j] = NULL; life[i][j] = 0; } } } while((c = getopt_long(argc, argv, ""/*"H:P:Z:46dcA:E:e:s:a:w:i:D:S:hvgl:+:f:"*/, longopts, 0)) != EOF) { switch(c) { case 'g': debug = 1; pfkey_lib_debug = 1; argcount--; break; case 'l': program_name = malloc(strlen(argv[0]) + 10 /* update this when changing the sprintf() */ + strlen(optarg)); sprintf(program_name, "%s --label %s", argv[0], optarg); argcount -= 2; break; case 'H': if(alg) { fprintf(stderr, "%s: Only one of '--ah', '--esp', '--comp', '--ip4', '--ip6', '--del' or '--clear' options permitted.\n", program_name); exit(1); } if (!strcmp(optarg, "hmac-md5-96")) { alg = XF_AHHMACMD5; } else if(!strcmp(optarg, "hmac-sha1-96")) { alg = XF_AHHMACSHA1; } else { fprintf(stderr, "%s: Unknown authentication algorithm '%s' follows '--ah' option.\n", program_name, optarg); exit(1); } if(debug) { fprintf(stdout, "Algorithm %d selected.\n", alg); } alg_opt = optarg; break; case 'P': if(alg) { fprintf(stderr, "%s: Only one of '--ah', '--esp', '--comp', '--ip4', '--ip6', '--del' or '--clear' options permitted.\n", program_name); exit(1); } if (!strcmp(optarg, "3des-md5-96")) { alg = XF_ESP3DESMD596; } else if(!strcmp(optarg, "3des-sha1-96")) { alg = XF_ESP3DESSHA196; } else if(!strcmp(optarg, "3des")) { alg = XF_ESP3DES;#ifndef NO_KERNEL_ALG } else if((alg_info=alg_info_esp_create_from_str(optarg, &alg_err))) { int esp_ealg_id, esp_aalg_id; alg = XF_OTHER_ALG; if (alg_info->alg_info_cnt>1) { fprintf(stderr, "%s: Invalid encryption algorithm '%s' " "follows '--esp' option: lead too many(%d) " "transforms\n", program_name, optarg, alg_info->alg_info_cnt); exit(1); } alg_string=optarg; esp_info=&alg_info->esp[0]; if (debug) { fprintf(stdout, "%s: alg_info: cnt=%d ealg[0]=%d aalg[0]=%d\n", program_name, alg_info->alg_info_cnt, esp_info->encryptalg, esp_info->authalg); } esp_ealg_id=esp_info->esp_ealg_id; esp_aalg_id=esp_info->esp_aalg_id; if (kernel_alg_proc_read()==0) { proc_read_ok++; if (!kernel_alg_esp_enc_ok(esp_ealg_id, 0, 0)) { fprintf(stderr, "%s: ESP encryptalg=%d (\"%s\") " "not present\n", program_name, esp_ealg_id, enum_name(&esp_transformid_names, esp_ealg_id)); exit(1); } if (!kernel_alg_esp_auth_ok(esp_aalg_id, 0)) { fprintf(stderr, "%s: ESP authalg=%d (\"%s\")" "not present\n", program_name, esp_aalg_id, enum_name(&auth_alg_names, esp_aalg_id)); exit(1); } }#endif /* NO_KERNEL_ALG */ } else { fprintf(stderr, "%s: Invalid encryption algorithm '%s' follows '--esp' option.\n", program_name, optarg); exit(1); } if(debug) { fprintf(stdout, "Algorithm %d selected.\n", alg); } alg_opt = optarg; break; case 'Z': if(alg) { fprintf(stderr, "%s: Only one of '--ah', '--esp', '--comp', '--ip4', '--ip6', '--del' or '--clear' options permitted.\n", program_name); exit(1); } if (!strcmp(optarg, "deflate")) { alg = XF_COMPDEFLATE; } else { fprintf(stderr, "%s: Unknown compression algorithm '%s' follows '--comp' option.\n", program_name, optarg); exit(1); } if(debug) { fprintf(stdout, "Algorithm %d selected.\n", alg); } alg_opt = optarg; break; case '4': if(alg) { fprintf(stderr, "%s: Only one of '--ah', '--esp', '--comp', '--ip4', '--ip6', '--del' or '--clear' options permitted.\n", program_name); exit(1); } alg = XF_IP4; address_family = AF_INET; if(debug) { fprintf(stdout, "Algorithm %d selected.\n", alg); } alg_opt = optarg; break; case '6': if(alg) { fprintf(stderr, "%s: Only one of '--ah', '--esp', '--comp', '--ip4', '--ip6', '--del' or '--clear' options permitted.\n", program_name); exit(1); } alg = XF_IP6; address_family = AF_INET6; if(debug) { fprintf(stdout, "Algorithm %d selected.\n", alg); } alg_opt = optarg; break; case 'd': if(alg) { fprintf(stderr, "%s: Only one of '--ah', '--esp', '--comp', '--ip4', '--ip6', '--del' or '--clear' options permitted.\n", program_name); exit(1); } alg = XF_DEL; if(debug) { fprintf(stdout, "Algorithm %d selected.\n", alg); } alg_opt = optarg; break; case 'c': if(alg) { fprintf(stderr, "%s: Only one of '--ah', '--esp', '--comp', '--ip4', '--ip6', '--del' or '--clear' options permitted.\n", program_name); exit(1); } alg = XF_CLR; if(debug) { fprintf(stdout, "Algorithm %d selected.\n", alg); } alg_opt = optarg; break; case 'e': if(said_opt) { fprintf(stderr, "%s: Error, EDST parameter redefined:%s, already defined in SA:%s\n", program_name, optarg, said_opt); exit (1); } if(edst_opt) { fprintf(stderr, "%s: Error, EDST parameter redefined:%s, already defined as:%s\n", program_name, optarg, edst_opt); exit (1); } error_s = ttoaddr(optarg, 0, address_family, &edst); if(error_s != NULL) { if(error_s) { fprintf(stderr, "%s: Error, %s converting --edst argument:%s\n", program_name, error_s, optarg); exit (1); } } edst_opt = optarg; if(debug) { addrtot(&edst, 0, ipaddr_txt, sizeof(ipaddr_txt)); fprintf(stdout, "edst=%s.\n", ipaddr_txt); } break; case 's': if(said_opt) { fprintf(stderr, "%s: Error, SPI parameter redefined:%s, already defined in SA:%s\n", program_name, optarg, said_opt); exit (1); } if(spi_opt) { fprintf(stderr, "%s: Error, SPI parameter redefined:%s, already defined as:%s\n", program_name, optarg, spi_opt); exit (1); } spi = strtoul(optarg, &endptr, 0); if(!(endptr == optarg + strlen(optarg))) { fprintf(stderr, "%s: Invalid character in SPI parameter: %s\n", program_name, optarg); exit (1); } if(spi < 0x100) { fprintf(stderr, "%s: Illegal reserved spi: %s => 0x%x Must be larger than 0x100.\n", program_name, optarg, spi); exit(1); } spi_opt = optarg; break; case 'p': if(said_opt) { fprintf(stderr, "%s: Error, PROTO parameter redefined:%s, already defined in SA:%s\n", program_name, optarg, said_opt); exit (1); } if(proto_opt) { fprintf(stderr, "%s: Error, PROTO parameter redefined:%s, already defined as:%s\n", program_name, optarg, proto_opt); exit (1); } if(!strcmp(optarg, "ah")) proto = SA_AH; if(!strcmp(optarg, "esp")) proto = SA_ESP; if(!strcmp(optarg, "tun")) proto = SA_IPIP; if(!strcmp(optarg, "comp")) proto = SA_COMP; if(proto == 0) { fprintf(stderr, "%s: Invalid PROTO parameter: %s\n", program_name, optarg); exit (1); } proto_opt = optarg; break; case 'a': if(said_opt) { fprintf(stderr, "%s: Error, ADDRESS FAMILY parameter redefined:%s, already defined in SA:%s\n", program_name, optarg, said_opt); exit (1); } if(af_opt) { fprintf(stderr, "%s: Error, ADDRESS FAMILY parameter redefined:%s, already defined as:%s\n", program_name, optarg, af_opt); exit (1); } if(strcmp(optarg, "inet") == 0) { address_family = AF_INET; /* currently we ensure that all addresses belong to the same address family */ anyaddr(address_family, &dst); anyaddr(address_family, &edst); anyaddr(address_family, &src); } if(strcmp(optarg, "inet6") == 0) { address_family = AF_INET6; /* currently we ensure that all addresses belong to the same address family */ anyaddr(address_family, &dst); anyaddr(address_family, &edst); anyaddr(address_family, &src); } if((strcmp(optarg, "inet") != 0) && (strcmp(optarg, "inet6") != 0)) { fprintf(stderr, "%s: Invalid ADDRESS FAMILY parameter: %s.\n", program_name, optarg); exit (1); } af_opt = optarg; break; case 'I': if(said_opt) { fprintf(stderr, "%s: Error, SAID parameter redefined:%s, already defined in SA:%s\n", program_name, optarg, said_opt); exit (1); } if(proto_opt) { fprintf(stderr, "%s: Error, PROTO parameter redefined in SA:%s, already defined as:%s\n", program_name, optarg, proto_opt); exit (1); } if(edst_opt) { fprintf(stderr, "%s: Error, EDST parameter redefined in SA:%s, already defined as:%s\n", program_name, optarg, edst_opt); exit (1); } if(spi_opt) { fprintf(stderr, "%s: Error, SPI parameter redefined in SA:%s, already defined as:%s\n", program_name, optarg, spi_opt); exit (1); } error_s = ttosa(optarg, 0, &said); if(error_s != NULL) { fprintf(stderr, "%s: Error, %s converting --sa argument:%s\n", program_name, error_s, optarg); exit (1); } if(debug) { satot(&said, 0, ipsaid_txt, sizeof(ipsaid_txt)); fprintf(stdout, "said=%s.\n", ipsaid_txt); } /* init the src and dst with the same address family */ if(address_family == 0) { address_family = addrtypeof(&said.dst); } else if(address_family != addrtypeof(&said.dst)) { fprintf(stderr, "%s: Error, specified address family (%d) is different that of SAID: %s\n", program_name, address_family, optarg); exit (1); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -