Annotation of embedaddon/libnet/src/libnet_build_ipsec.c, revision 1.1
1.1 ! misho 1: /*
! 2: * $Id: libnet_build_ipsec.c,v 1.11 2004/01/21 19:01:29 mike Exp $
! 3: *
! 4: * libnet
! 5: * libnet_build_ipsec.c - IP packet assembler
! 6: *
! 7: * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
! 8: * Copyright (c) 2002 Jose Nazario <jose@crimelabs.net>
! 9: * All rights reserved.
! 10: *
! 11: * Redistribution and use in source and binary forms, with or without
! 12: * modification, are permitted provided that the following conditions
! 13: * are met:
! 14: * 1. Redistributions of source code must retain the above copyright
! 15: * notice, this list of conditions and the following disclaimer.
! 16: * 2. Redistributions in binary form must reproduce the above copyright
! 17: * notice, this list of conditions and the following disclaimer in the
! 18: * documentation and/or other materials provided with the distribution.
! 19: *
! 20: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
! 21: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 22: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 23: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
! 24: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 25: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 26: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 27: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 28: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 29: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 30: * SUCH DAMAGE.
! 31: *
! 32: */
! 33:
! 34: #if (HAVE_CONFIG_H)
! 35: #include "../include/config.h"
! 36: #endif
! 37: #if (!(_WIN32) || (__CYGWIN__))
! 38: #include "../include/libnet.h"
! 39: #else
! 40: #include "../include/win32/libnet.h"
! 41: #endif
! 42:
! 43:
! 44: libnet_ptag_t
! 45: libnet_build_ipsec_esp_hdr(u_int32_t spi, u_int32_t seq, u_int32_t iv,
! 46: u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
! 47: {
! 48: u_int32_t n, h;
! 49: libnet_pblock_t *p;
! 50: struct libnet_esp_hdr esp_hdr;
! 51:
! 52: if (l == NULL)
! 53: {
! 54: return (-1);
! 55: }
! 56:
! 57: n = LIBNET_IPSEC_ESP_HDR_H + payload_s;/* size of memory block */
! 58: h = 0;
! 59:
! 60: memset(&esp_hdr, 0, sizeof(esp_hdr));
! 61: esp_hdr.esp_spi = htonl(spi); /* SPI */
! 62: esp_hdr.esp_seq = htonl(seq); /* ESP sequence number */
! 63: esp_hdr.esp_iv = htonl(iv); /* initialization vector */
! 64:
! 65: /*
! 66: * Find the existing protocol block if a ptag is specified, or create
! 67: * a new one.
! 68: */
! 69: p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_IPSEC_ESP_HDR_H);
! 70: if (p == NULL)
! 71: {
! 72: return (-1);
! 73: }
! 74:
! 75: n = libnet_pblock_append(l, p, (u_int8_t *)&esp_hdr, LIBNET_IPSEC_ESP_HDR_H);
! 76: if (n == -1)
! 77: {
! 78: goto bad;
! 79: }
! 80:
! 81: if ((payload && !payload_s) || (!payload && payload_s))
! 82: {
! 83: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
! 84: "%s(): payload inconsistency\n", __func__);
! 85: goto bad;
! 86: }
! 87:
! 88: if (payload && payload_s)
! 89: {
! 90: n = libnet_pblock_append(l, p, payload, payload_s);
! 91: if (n == -1)
! 92: {
! 93: goto bad;
! 94: }
! 95: }
! 96:
! 97: return (ptag ? ptag : libnet_pblock_update(l, p, h,
! 98: LIBNET_PBLOCK_IPSEC_ESP_HDR_H));
! 99: bad:
! 100: libnet_pblock_delete(l, p);
! 101: return (-1);
! 102: }
! 103:
! 104:
! 105: libnet_ptag_t
! 106: libnet_build_ipsec_esp_ftr(u_int8_t len, u_int8_t nh, int8_t *auth,
! 107: u_int8_t *payload, u_int32_t payload_s, libnet_t *l,
! 108: libnet_ptag_t ptag)
! 109: {
! 110: /* XXX we need to know the size of auth */
! 111: u_int32_t n, h;
! 112: libnet_pblock_t *p;
! 113: struct libnet_esp_ftr esp_ftr;
! 114:
! 115: if (l == NULL)
! 116: {
! 117: return (-1);
! 118: }
! 119:
! 120: n = LIBNET_IPSEC_ESP_FTR_H + payload_s;/* size of memory block */
! 121: h = 0;
! 122:
! 123: memset(&esp_ftr, 0, sizeof(esp_ftr));
! 124: esp_ftr.esp_pad_len = len; /* pad length */
! 125: esp_ftr.esp_nh = nh; /* next header pointer */
! 126: esp_ftr.esp_auth = auth; /* authentication data */
! 127:
! 128: /*
! 129: * Find the existing protocol block if a ptag is specified, or create
! 130: * a new one.
! 131: */
! 132: p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_IPSEC_ESP_FTR_H);
! 133: if (p == NULL)
! 134: {
! 135: return (-1);
! 136: }
! 137:
! 138: n = libnet_pblock_append(l, p, (u_int8_t *)&esp_ftr, LIBNET_IPSEC_ESP_FTR_H);
! 139: if (n == -1)
! 140: {
! 141: goto bad;
! 142: }
! 143:
! 144: if ((payload && !payload_s) || (!payload && payload_s))
! 145: {
! 146: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
! 147: "%s(): payload inconsistency\n", __func__);
! 148: goto bad;
! 149: }
! 150:
! 151: if (payload && payload_s)
! 152: {
! 153: n = libnet_pblock_append(l, p, payload, payload_s);
! 154: if (n == -1)
! 155: {
! 156: goto bad;
! 157: }
! 158: }
! 159:
! 160: return (ptag ? ptag : libnet_pblock_update(l, p, h,
! 161: LIBNET_PBLOCK_IPSEC_ESP_FTR_H));
! 162: bad:
! 163: libnet_pblock_delete(l, p);
! 164: return (-1);
! 165: }
! 166:
! 167:
! 168: libnet_ptag_t
! 169: libnet_build_ipsec_ah(u_int8_t nh, u_int8_t len, u_int16_t res,
! 170: u_int32_t spi, u_int32_t seq, u_int32_t auth, u_int8_t *payload,
! 171: u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
! 172: {
! 173: u_int32_t n, h;
! 174: libnet_pblock_t *p;
! 175: struct libnet_ah_hdr ah_hdr;
! 176:
! 177: if (l == NULL)
! 178: {
! 179: return (-1);
! 180: }
! 181:
! 182: n = LIBNET_IPSEC_AH_H + payload_s;/* size of memory block */
! 183: h = 0;
! 184:
! 185: /*
! 186: * Find the existing protocol block if a ptag is specified, or create
! 187: * a new one.
! 188: */
! 189: p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_IPSEC_AH_H);
! 190: if (p == NULL)
! 191: {
! 192: return (-1);
! 193: }
! 194:
! 195: memset(&ah_hdr, 0, sizeof(ah_hdr));
! 196: ah_hdr.ah_nh = nh; /* next header */
! 197: ah_hdr.ah_len = len; /* length */
! 198: ah_hdr.ah_res = (res ? htons(res) : 0);
! 199: ah_hdr.ah_spi = htonl(spi); /* SPI */
! 200: ah_hdr.ah_seq = htonl(seq); /* AH sequence number */
! 201: ah_hdr.ah_auth = htonl(auth); /* authentication data */
! 202:
! 203: n = libnet_pblock_append(l, p, (u_int8_t *)&ah_hdr, LIBNET_IPSEC_AH_H);
! 204: if (n == -1)
! 205: {
! 206: goto bad;
! 207: }
! 208:
! 209: if ((payload && !payload_s) || (!payload && payload_s))
! 210: {
! 211: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
! 212: "%s(): payload inconsistency\n", __func__);
! 213: goto bad;
! 214: }
! 215:
! 216: if (payload && payload_s)
! 217: {
! 218: n = libnet_pblock_append(l, p, payload, payload_s);
! 219: if (n == -1)
! 220: {
! 221: goto bad;
! 222: }
! 223: }
! 224:
! 225: return (ptag ? ptag : libnet_pblock_update(l, p, h,
! 226: LIBNET_PBLOCK_IPSEC_AH_H));
! 227: bad:
! 228: libnet_pblock_delete(l, p);
! 229: return (-1);
! 230: }
! 231:
! 232: /* EOF */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>