📄 spi.c
字号:
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;#ifndef NO_KERNEL_ALG case XF_OTHER_ALG: authalg= esp_info->authalg; if(debug) { fprintf(stdout, "%s: debug: authalg=%d\n", program_name, authalg); } break;#endif /* NO_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;#ifndef NO_KERNEL_ALG case XF_OTHER_ALG: encryptalg= esp_info->encryptalg; if(debug) { fprintf(stdout, "%s: debug: encryptalg=%d\n", program_name, encryptalg); } break;#endif /* NO_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]=%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 1 /* def PFKEY_LIFETIME */ if(debug) { int i,j; for(i = 0; i < life_maxsever; i++) { for(j = 0; j < life_maxtype; j++) { fprintf(stdout, "i=%d, j=%d, life_opt[%d][%d]=%p, life[%d][%d]=%d\n", 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); } }#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) {#ifndef NO_KERNEL_ALG /* Allow no auth ... after all is local root decision 8) */ case XF_OTHER_ALG: if (!authalg) break;#endif /* NO_KERNEL_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:#ifndef NO_KERNEL_ALG case XF_OTHER_ALG:#endif /* NO_KERNEL_ALG */ 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 wierd, not touched */ if((pfkey_ident_build(&extensions[SADB_EXT_IDENTITY_SRC], SADB_EXT_IDENTITY_SRC, SADB_IDENTTYPE_PREFIX, 0, strlen(pfkey_ident_s_ska), 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) ) { exit (1); } if((error = pfkey_ident_build(&extensions[SADB_EXT_IDENTITY_DST], SADB_EXT_IDENTITY_DST, SADB_IDENTTYPE_PREFIX, 0, strlen(pfkey_ident_d_ska), 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) ) { exit (1); } 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); } if(debug) { fprintf(stdout, "%s: writing pfkey msg.\n", program_name); } if((error = write(pfkey_sock, pfkey_msg, pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN)) != pfkey_msg->sadb_msg_len * IPSEC_PFKEYv2_ALIGN) { fprintf(stderr, "%s: pfkey write failed, returning %d with errno=%d.\n", program_name, error, errno); pfkey_extensions_free(extensions); pfkey_msg_free(&pfkey_msg); switch(errno) { 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 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, check kernel log messages for specifics.\n"); break; case ENODEV: fprintf(stderr, "KLIPS not loaded or enabled.\n"); fprintf(stderr, "No device?!?\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 ENOENT: fprintf(stderr, "device does not exist. See FreeS/WAN installation procedure.\n"); break; case ENXIO: case ESRCH: fprintf(stderr, "SA does not exist. Cannot delete.\n"); break; default: fprintf(stderr, "Unknown socket write error %d. Please report as much detail as possible to development team.\n", errno); }/* fprintf(stderr, "%s: socket write returned errno %d\n", program_name, errno);*/ exit(1); } if(debug) { fprintf(stdout, "%s: pfkey command written to socket.\n", program_name); } #if 0 /* use write() rather than sendmsg() */ error = sendmsg(/* int */pfkey_sock, /* const void* */msg, /* int */len, /* unsigned int flags MSG_OOB|MSG_DONTROUTE */ 0); if( error == -1 ) { fprintf(stderr, "%s: pfkey sendmsg failed.\n", program_name); switch(errno) { case EINVAL: fprintf(stderr, "bad data error, since this should not happen, advise the maintainer.\n"); exit(1); case EBADF: case ENOTSOCK: case EFAULT: case EMSGSIZE: case EWOULDBLOCK: case ENOBUFS: fprintf(stderr, "system error:%d\n", error);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -