📄 spi.c
字号:
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 negociated */ /* Register the fact that I can negociate AH SA's */ pfkey_extensions_init(extensions); if((error = pfkey_msg_hdr_build(&extensions[0], SADB_REGISTER, SADB_SATYPE_AH, 0, ++pfkey_seq, getpid()))) { fprintf(stderr, "%s: Trouble building message header, error=%d.\n", program_name, error); pfkey_extensions_free(extensions); exit(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); exit(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); exit(1); } pfkey_extensions_free(extensions); pfkey_msg_free(&pfkey_msg); /* Register the fact that I can negociate ESP SA's */ pfkey_extensions_init(extensions); if((error = pfkey_msg_hdr_build(&extensions[0], SADB_REGISTER, SADB_SATYPE_ESP, 0, ++pfkey_seq, getpid()))) { fprintf(stderr, "%s: Trouble building message header, error=%d.\n", program_name, error); pfkey_extensions_free(extensions); exit(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); exit(1); } if(write(pfkey_sock, pfkey_msg, pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) != pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) { fprintf(stderr, "%s: Trouble writing to channel PF_KEY.\n", program_name); /* cleanup code here */ pfkey_extensions_free(extensions); pfkey_msg_free(&pfkey_msg); exit(1); } pfkey_extensions_free(extensions); pfkey_msg_free(&pfkey_msg); /* Register the fact that I can negociate IPIP SA's */ pfkey_extensions_init(extensions); if((error = pfkey_msg_hdr_build(&extensions[0], SADB_REGISTER, SADB_X_SATYPE_IPIP, 0, ++pfkey_seq, getpid()))) { fprintf(stderr, "%s: Trouble building message header, error=%d.\n", program_name, error); pfkey_extensions_free(extensions); exit(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); exit(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); exit(1); } pfkey_extensions_free(extensions); pfkey_msg_free(&pfkey_msg); /* Register the fact that I can negociate COMP SA's */ pfkey_extensions_init(extensions); if((error = pfkey_msg_hdr_build(&extensions[0], SADB_REGISTER, SADB_X_SATYPE_COMP, 0, ++pfkey_seq, getpid()))) { fprintf(stderr, "%s: Trouble building message header, error=%d.\n", program_name, error); pfkey_extensions_free(extensions); exit(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); exit(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); exit(1); } pfkey_extensions_free(extensions); pfkey_msg_free(&pfkey_msg);#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, 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; 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; 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]=%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); } #ifdef PFKEY_LIFETIME if((error = pfkey_lifetime_build(&extension[SADB_EXT_LIFETIME_SOFT], SADB_EXT_LIFETIME_SOFT, -1, -1, -1, -1))) { 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((error = pfkey_lifetime_build(&extensions[SADB_EXT_LIFETIME_HARD], SADB_EXT_LIFETIME_HARD, -1, -1, -1, -1))) { 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); }#endif /* PFKEY_LIFETIME */ 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) { case XF_AHHMACMD5: case XF_ESP3DESMD596: case XF_AHHMACSHA1: case XF_ESP3DESSHA196: if((error = pfkey_key_build(&extensions[SADB_EXT_KEY_AUTH], SADB_EXT_KEY_AUTH, authkeylen * 8, authkey))) { fprintf(stderr, "%s: Trouble building key_a extension, error=%d.\n", program_name, error); pfkey_extensions_free(extensions); exit(1); } if(debug) { fprintf(stdout, "%s: key_a extension assembled.\n", program_name); } break; default: } switch(alg) { case XF_ESP3DES: case XF_ESP3DESMD596: case XF_ESP3DESSHA196: if((error = pfkey_key_build(&extensions[SADB_EXT_KEY_ENCRYPT], SADB_EXT_KEY_ENCRYPT, enckeylen * 8, enckey))) { fprintf(stderr, "%s: Trouble building key_e extension, error=%d.\n", program_name, error); pfkey_extensions_free(extensions); exit(1); } if(debug) { fprintf(stdout, "%s: key_e extension assembled.\n", program_name); } break; default: } #ifdef PFKEY_IDENT /* GG: looks wired, not touched */ if((pfkey_ident_build(&extensions[SADB_EXT_IDENTITY_SRC], SADB_EXT_IDENTITY_SRC, SADB_IDENTTYPE_PREFIX, 0, pfkey_ident_s_ska))) { fprintf(stderr, "%s: Trouble building ident_s extension, error=%d.\n", program_name, error); pfkey_extensions_free(extensions); exit(1); } if(subnettoa(addr, mask, format, pfkey_ident_s_ska, sizeof(pfkey_ident_s_ska) ) != sizeof(pfkey_ident_s_ska) ) { } if((error = pfkey_ident_build(&extensions[SADB_EXT_IDENTITY_DST], SADB_EXT_IDENTITY_DST, SADB_IDENTTYPE_PREFIX, 0, pfkey_ident_d_ska))) { fprintf(stderr, "%s: Trouble building ident_d extension, error=%d.\n", program_name, error); pfkey_extensions_free(extensions); exit(1); } if(subnettoa(addr, mask, format, pfkey_ident_d_ska, sizeof(pfkey_ident_d_ska) ) != sizeof(pfkey_ident_d_ska) ) { } if(debug) { fprintf(stdout, "%s: ident extensions assembled.\n", program_name); }#endif /* PFKEY_IDENT */ } if(debug) { fprintf(stdout, "%s: assembling pfkey msg....\n", program_name); } 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); exit(1); } if(debug) { fprintf(stdout, "%s: assembled.\n", program_name);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -