summaryrefslogtreecommitdiff
path: root/keyexchange/isakmpd-20041012/message.h
diff options
context:
space:
mode:
Diffstat (limited to 'keyexchange/isakmpd-20041012/message.h')
-rw-r--r--keyexchange/isakmpd-20041012/message.h205
1 files changed, 205 insertions, 0 deletions
diff --git a/keyexchange/isakmpd-20041012/message.h b/keyexchange/isakmpd-20041012/message.h
new file mode 100644
index 0000000..14b1d9a
--- /dev/null
+++ b/keyexchange/isakmpd-20041012/message.h
@@ -0,0 +1,205 @@
+/* $OpenBSD: message.h,v 1.22 2004/08/10 15:59:10 ho Exp $ */
+/* $EOM: message.h,v 1.51 2000/10/10 12:36:39 provos Exp $ */
+
+/*
+ * Copyright (c) 1998, 1999 Niklas Hallqvist. All rights reserved.
+ * Copyright (c) 1999 Angelos D. Keromytis. All rights reserved.
+ * Copyright (c) 2001, 2004 Håkan Olsson. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This code was written under funding by Ericsson Radio Systems.
+ */
+
+#ifndef _MESSAGE_H_
+#define _MESSAGE_H_
+
+#include <sys/param.h>
+#include <sys/queue.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
+
+#include "isakmp.h"
+
+struct event;
+struct message;
+struct proto;
+struct sa;
+struct transport;
+
+struct payload {
+ /* Link all payloads of the same type through here. */
+ TAILQ_ENTRY(payload) link;
+
+ /* The pointer to the actual payload data. */
+ u_int8_t *p;
+
+ /*
+ * A pointer to the parent payload, used for proposal and transform
+ * payloads.
+ */
+ struct payload *context;
+
+ /* Payload flags described below. */
+ int flags;
+};
+
+/* Payload flags. */
+
+/*
+ * Set this when a payload has been handled, so we later can sweep over
+ * unhandled ones.
+ */
+#define PL_MARK 1
+
+/* A post-send chain of functions to be called. */
+struct post_send {
+ /* Link to the next function in the chain. */
+ TAILQ_ENTRY(post_send) link;
+
+ /* The actual function. */
+ void (*func) (struct message *);
+};
+
+struct message {
+ /* Link message in send queues via this link. */
+ TAILQ_ENTRY(message) link;
+
+ /* Message flags described below. */
+ u_int flags;
+
+ /*
+ * This is the transport the message either arrived on or will be sent
+ * to.
+ */
+ struct transport *transport;
+
+ /*
+ * This is the ISAKMP SA protecting this message.
+ * XXX Needs to be redone to some keystate pointer or something.
+ */
+ struct sa *isakmp_sa;
+
+ /* This is the exchange where this message appears. */
+ struct exchange *exchange;
+
+ /*
+ * A segmented buffer structure holding the messages raw contents. On
+ * input only segment 0 will be filled, holding all of the message.
+ * On output, as long as the message body is unencrypted each segment
+ * will be one payload, after encryption segment 0 will be the
+ * unencrypted header, and segment 1 will be the encrypted payloads,
+ * all of them.
+ */
+ struct iovec *iov;
+
+ /* The segment count. */
+ u_int iovlen;
+
+ /* Pointer to the last "next payload" field. */
+ u_int8_t *nextp;
+
+ /* "Smart" pointers to each payload, sorted by type. */
+ TAILQ_HEAD(payload_head, payload) *payload;
+
+ /* Number of times this message has been sent. */
+ int xmits;
+
+ /* The timeout event causing retransmission of this message. */
+ struct event *retrans;
+
+ /* The (possibly encrypted) message text, used for duplicate testing. */
+ u_int8_t *orig;
+ size_t orig_sz;
+
+ /*
+ * Extra baggage needed to travel with the message. Used transiently
+ * in context sensitive ways.
+ */
+ void *extra;
+
+ /*
+ * Hooks for stuff needed to be done after the message has gone out to
+ * the wire.
+ */
+ TAILQ_HEAD(post_send_head, post_send) post_send;
+};
+
+/* Message flags. */
+
+/*
+ * This is the last message of an exchange, meaning it should not be
+ * retransmitted other than if we see duplicates from our peer's last
+ * message.
+ */
+#define MSG_LAST 0x01
+
+/* The message has already been encrypted. */
+#define MSG_ENCRYPTED 0x02
+
+/* The message is on the send queue. */
+#define MSG_IN_TRANSIT 0x04
+
+/* This message should be kept on the prioritized sendq. */
+#define MSG_PRIORITIZED 0x08
+
+/* This message has successfully been authenticated. */
+#define MSG_AUTHENTICATED 0x10
+
+TAILQ_HEAD(msg_head, message);
+
+/* The number of different ISAKMP payloads supported. */
+extern u_int8_t payload_index_max;
+
+extern int message_add_payload(struct message *, u_int8_t, u_int8_t *,
+ size_t, int);
+extern int message_add_sa_payload(struct message *);
+extern struct message *message_alloc(struct transport *, u_int8_t *, size_t);
+extern struct message *message_alloc_reply(struct message *);
+extern u_int8_t *message_copy(struct message *, size_t, size_t *);
+extern void message_drop(struct message *, int, struct proto *, int, int);
+extern void message_dump_raw(char *, struct message *, int);
+extern void message_free(struct message *);
+extern void message_init(void);
+extern int message_negotiate_sa(struct message *,
+ int (*)(struct exchange *, struct sa *, struct sa *));
+extern int message_recv(struct message *);
+extern int message_register_post_send(struct message *,
+ void (*) (struct message *));
+extern void message_post_send(struct message *);
+extern void message_send(struct message *);
+extern void message_send_expire(struct message *);
+extern void message_send_delete(struct sa *);
+extern int message_send_info(struct message *);
+extern void message_send_notification(struct message *, struct sa *,
+ u_int16_t, struct proto *, int);
+extern void message_setup_header(struct message *, u_int8_t, u_int8_t,
+ u_int8_t *);
+struct payload *payload_first(struct message *, u_int8_t);
+struct payload *payload_last(struct message *, u_int8_t);
+
+#if defined (USE_DPD)
+extern void message_send_dpd_notify(struct sa*, u_int16_t, u_int32_t);
+#endif
+
+#endif /* _MESSAGE_H_ */