/*
This file is part of GNUnet.
- (C) 2001 - 2011 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2001 - 2011 GNUnet e.V.
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
You should have received a copy of the GNU General Public License
along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
*/
/**
GNUNET_NETWORK_STRUCT_BEGIN
+
+/******************************************************************************/
+/***************************** CONNECTION **********************************/
+/******************************************************************************/
+
+
/**
* Message for cadet connection creation.
*/
-struct GNUNET_CADET_ConnectionCreate
+struct GNUNET_CADET_ConnectionCreateMessage
{
- /**
- * Type: GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE
- *
- * Size: sizeof (struct GNUNET_CADET_ConnectionCreate) +
- * path_length * sizeof (struct GNUNET_PeerIdentity)
- */
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE
+ *
+ * Size: sizeof (struct GNUNET_CADET_ConnectionCreateMessage) +
+ * path_length * sizeof (struct GNUNET_PeerIdentity)
+ */
struct GNUNET_MessageHeader header;
- /**
- * ID of the connection
- */
- struct GNUNET_CADET_Hash cid;
+ /**
+ * For alignment.
+ */
+ uint32_t reserved GNUNET_PACKED;
+
+ /**
+ * ID of the connection
+ */
+ struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
- /**
- * path_length structs defining the *whole* path from the origin [0] to the
- * final destination [path_length-1].
- */
+ /**
+ * path_length structs defining the *whole* path from the origin [0] to the
+ * final destination [path_length-1].
+ */
/* struct GNUNET_PeerIdentity peers[path_length]; */
};
+
/**
* Message for ack'ing a connection
*/
-struct GNUNET_CADET_ConnectionACK
+struct GNUNET_CADET_ConnectionCreateAckMessage
{
- /**
- * Type: GNUNET_MESSAGE_TYPE_CADET_CONNECTION_ACK
- */
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE_ACK
+ */
struct GNUNET_MessageHeader header;
- /**
- * ID of the connection.
- */
- struct GNUNET_CADET_Hash cid;
+ /**
+ * For alignment.
+ */
+ uint32_t reserved GNUNET_PACKED;
+
+ /**
+ * ID of the connection.
+ */
+ struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
};
/**
- * Message for encapsulation of a Key eXchange message in a connection.
+ * Message for notifying a disconnection in a path
*/
-struct GNUNET_CADET_KX
+struct GNUNET_CADET_ConnectionBrokenMessage
{
- /**
- * Type: GNUNET_MESSAGE_TYPE_CADET_KX.
- */
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN.
+ */
struct GNUNET_MessageHeader header;
- /**
- * ID of the connection.
- */
- struct GNUNET_CADET_Hash cid;
+ /**
+ * For alignment.
+ */
+ uint32_t reserved GNUNET_PACKED;
+
+ /**
+ * ID of the connection.
+ */
+ struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
- /* Specific KX message follows. */
+ /**
+ * ID of the endpoint
+ */
+ struct GNUNET_PeerIdentity peer1;
+
+ /**
+ * ID of the endpoint
+ */
+ struct GNUNET_PeerIdentity peer2;
};
/**
- * Message transmitted with the signed ephemeral key of a peer. The
- * session key is then derived from the two ephemeral keys (ECDHE).
- *
- * As far as possible, same as CORE's EphemeralKeyMessage.
+ * Message to destroy a connection.
*/
-struct GNUNET_CADET_KX_Ephemeral
+struct GNUNET_CADET_ConnectionDestroyMessage
{
-
/**
- * Message type is GNUNET_MESSAGE_TYPE_CADET_KX_EPHEMERAL.
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY
*/
struct GNUNET_MessageHeader header;
/**
- * Status of the sender (should be in "enum PeerStateMachine"), nbo.
+ * For alignment.
+ */
+ uint32_t reserved GNUNET_PACKED;
+
+ /**
+ * ID of the connection.
+ */
+ struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
+};
+
+
+/******************************************************************************/
+/******************************* TUNNEL ***********************************/
+/******************************************************************************/
+
+/**
+ * Unique identifier (counter) for an encrypted message in a channel.
+ * Used to match #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_HOP_BY_HOP_ENCRYPTED_ACK
+ * and #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_ENCRYPTED_POLL messages
+ * against the respective #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_ENCRYPTED
+ * messages.
+ */
+struct CadetEncryptedMessageIdentifier
+{
+ /**
+ * This number is incremented by one per message. It may wrap around.
+ * In network byte order.
*/
- int32_t sender_status GNUNET_PACKED;
+ uint32_t pid GNUNET_PACKED;
+};
+
+
+/**
+ * Flags to be used in GNUNET_CADET_KX.
+ */
+enum GNUNET_CADET_KX_Flags {
/**
- * An ECC signature of the 'origin' asserting the validity of
- * the given ephemeral key.
+ * Should the peer reply with its KX details?
*/
- struct GNUNET_CRYPTO_EddsaSignature signature;
+ GNUNET_CADET_KX_FLAG_NONE = 0,
/**
- * Information about what is being signed.
+ * The peer should reply with its KX details?
*/
- struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
+ GNUNET_CADET_KX_FLAG_FORCE_REPLY = 1
+};
+
+
+/**
+ * Message for a Key eXchange for a tunnel.
+ */
+struct GNUNET_CADET_TunnelKeyExchangeMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_KX or
+ * #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_KX_AUTH as part
+ * of `struct GNUNET_CADET_TunnelKeyExchangeAuthMessage`.
+ */
+ struct GNUNET_MessageHeader header;
/**
- * At what time was this key created (beginning of validity).
+ * Flags for the key exchange in NBO, based on
+ * `enum GNUNET_CADET_KX_Flags`.
*/
- struct GNUNET_TIME_AbsoluteNBO creation_time;
+ uint32_t flags GNUNET_PACKED;
/**
- * When does the given ephemeral key expire (end of validity).
+ * ID of the connection.
*/
- struct GNUNET_TIME_AbsoluteNBO expiration_time;
+ struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
/**
- * Ephemeral public ECC key (always for NIST P-521) encoded in a format
- * suitable for network transmission as created using 'gcry_sexp_sprint'.
+ * Sender's ephemeral public ECC key encoded in a
+ * format suitable for network transmission, as created
+ * using 'gcry_sexp_sprint'.
*/
struct GNUNET_CRYPTO_EcdhePublicKey ephemeral_key;
/**
- * Public key of the signing peer
- * (persistent version, not the ephemeral public key).
+ * Sender's next ephemeral public ECC key encoded in a
+ * format suitable for network transmission, as created
+ * using 'gcry_sexp_sprint'.
*/
- struct GNUNET_PeerIdentity origin_identity;
+ struct GNUNET_CRYPTO_EcdhePublicKey ratchet_key;
+
+};
+
+
+/**
+ * Message for a Key eXchange for a tunnel, with authentication.
+ * Used as a response to the initial KX as well as for rekeying.
+ */
+struct GNUNET_CADET_TunnelKeyExchangeAuthMessage
+{
/**
- * Seed for the IV of nonce.
+ * Message header with key material.
*/
- uint32_t iv GNUNET_PACKED;
+ struct GNUNET_CADET_TunnelKeyExchangeMessage kx;
/**
- * Nonce to check liveness of peer.
+ * KDF-proof that sender could compute the 3-DH, used in lieu of a
+ * signature or payload data.
*/
- uint32_t nonce GNUNET_PACKED;
+ struct GNUNET_HashCode auth;
+
};
/**
- * Response to a PING. Includes data from the original PING.
+ * Encrypted axolotl header with numbers that identify which
+ * keys in which ratchet are to be used to decrypt the body.
*/
-struct GNUNET_CADET_KX_Pong
+struct GNUNET_CADET_AxHeader
{
+
/**
- * Message type is GNUNET_MESSAGE_TYPE_CADET_KX_PONG.
+ * Number of messages sent with the current ratchet key.
*/
- struct GNUNET_MessageHeader header;
+ uint32_t Ns GNUNET_PACKED;
/**
- * Seed for the IV
+ * Number of messages sent with the previous ratchet key.
*/
- uint32_t iv GNUNET_PACKED;
+ uint32_t PNs GNUNET_PACKED;
/**
- * Same nonce as in the reve.
+ * Current ratchet key.
*/
- uint32_t nonce GNUNET_PACKED;
+ struct GNUNET_CRYPTO_EcdhePublicKey DHRs;
+
};
/**
- * Tunnel(ed) message.
+ * Axolotl-encrypted tunnel message with application payload.
*/
-struct GNUNET_CADET_Encrypted
+struct GNUNET_CADET_TunnelEncryptedMessage
{
/**
- * Type: GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_ENCRYPTED
*/
struct GNUNET_MessageHeader header;
+#if NEW_CADET
/**
- * ID of the connection.
+ * Reserved, for alignment.
*/
- struct GNUNET_CADET_Hash cid;
+ uint32_t reserved GNUNET_PACKED;
+#else
+ /**
+ * Maximum packet ID authorized.
+ */
+ struct CadetEncryptedMessageIdentifier cemi;
+#endif
/**
- * ID of the packet (hop by hop).
+ * ID of the connection.
*/
- uint32_t pid GNUNET_PACKED;
+ struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
/**
- * Number of hops to live.
+ * MAC of the encrypted message, used to verify message integrity.
+ * Everything after this value will be encrypted with the header key
+ * and authenticated.
*/
- uint32_t ttl GNUNET_PACKED;
+ struct GNUNET_ShortHashCode hmac;
+ #if NEW_CADET
/**
- * Initialization Vector for payload encryption.
+ * Axolotl-header that specifies which keys to use in which ratchet
+ * to decrypt the body that follows.
*/
- uint32_t iv GNUNET_PACKED;
+ struct GNUNET_CADET_AxHeader ax_header;
+#else
+ /**
+ * Number of messages sent with the current ratchet key.
+ */
+ uint32_t Ns GNUNET_PACKED;
/**
- * MAC of the encrypted message, used to verify message integrity.
- * Everything after this value will be encrypted and authenticated.
+ * Number of messages sent with the previous ratchet key.
*/
- struct GNUNET_CADET_Hash hmac;
+ uint32_t PNs GNUNET_PACKED;
+ /**
+ * Current ratchet key.
+ */
+ struct GNUNET_CRYPTO_EcdhePublicKey DHRs;
+#endif
/**
* Encrypted content follows.
*/
};
+#ifndef NEW_CADET
+
/**
- * Message to create a Channel.
+ * Message to query a peer about its Flow Control status regarding a tunnel.
+ *
+ * It is NOT yet clear if we need this.
*/
-struct GNUNET_CADET_ChannelCreate
+struct GNUNET_CADET_ConnectionHopByHopPollMessage
{
/**
- * Type: GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_ENCRYPTED_POLL
*/
struct GNUNET_MessageHeader header;
/**
- * ID of the channel
+ * Last packet sent.
*/
- CADET_ChannelNumber chid GNUNET_PACKED;
+ struct CadetEncryptedMessageIdentifier cemi;
/**
- * Destination port.
+ * ID of the connection.
+ */
+ struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
+
+};
+
+
+/**
+ * Message to acknowledge cadet encrypted traffic, used for
+ * flow-control on a hop-by-hop basis on the connection-level. Note
+ * that we do use the @e cemi from the tunnel layer as the connection
+ * layer's header is included/shared with the tunnel layer messages,
+ * and we only do flow control for the payload.
+ */
+struct GNUNET_CADET_ConnectionEncryptedAckMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_HOP_BY_HOP_ENCRYPTED_ACK
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Maximum packet ID authorized.
+ */
+ struct CadetEncryptedMessageIdentifier cemi_max;
+
+ /**
+ * ID of the connection.
+ */
+ struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
+};
+
+#endif
+
+
+/******************************************************************************/
+/******************************* CHANNEL ***********************************/
+/******************************************************************************/
+
+
+/**
+ * Message to create a Channel.
+ */
+struct GNUNET_CADET_ChannelOpenMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_OPEN
*/
- uint32_t port GNUNET_PACKED;
+ struct GNUNET_MessageHeader header;
/**
* Channel options.
*/
uint32_t opt GNUNET_PACKED;
+
+ /**
+ * Destination port.
+ */
+ struct GNUNET_HashCode port;
+
+ /**
+ * ID of the channel within the tunnel.
+ */
+ struct GNUNET_CADET_ChannelTunnelNumber ctn;
};
/**
- * Message to manage a Channel (ACK, NACK, Destroy).
+ * Message to manage a Channel
+ * (#GNUNET_MESSAGE_TYPE_CADET_CHANNEL_OPEN_ACK,
+ * #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY).
*/
-struct GNUNET_CADET_ChannelManage
+struct GNUNET_CADET_ChannelManageMessage
{
/**
- * Type: GNUNET_MESSAGE_TYPE_CADET_CHANNEL_{ACK|NACK|DESTROY}
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_OPEN_ACK or
+ * #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY
*/
struct GNUNET_MessageHeader header;
+#ifdef NEW_CADET
+ /**
+ * For alignment.
+ */
+ uint32_t reserved GNUNET_PACKED;
+#endif
+
/**
* ID of the channel
*/
- CADET_ChannelNumber chid GNUNET_PACKED;
+ struct GNUNET_CADET_ChannelTunnelNumber ctn;
};
+#ifndef NEW_CADET
+
/**
* Message for cadet data traffic.
*/
-struct GNUNET_CADET_Data
+struct GNUNET_CADET_ChannelAppDataMessage
{
- /**
- * Type: GNUNET_MESSAGE_TYPE_CADET_UNICAST,
- * GNUNET_MESSAGE_TYPE_CADET_TO_ORIGIN
- */
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_UNICAST,
+ * #GNUNET_MESSAGE_TYPE_CADET_TO_ORIGIN
+ */
struct GNUNET_MessageHeader header;
- /**
- * Unique ID of the payload message
- */
+ /**
+ * Unique ID of the payload message
+ */
+ /* NEW: struct ChannelMessageIdentifier */
uint32_t mid GNUNET_PACKED;
- /**
- * ID of the channel
- */
- CADET_ChannelNumber chid GNUNET_PACKED;
+ /**
+ * ID of the channel
+ */
+ struct GNUNET_CADET_ChannelTunnelNumber ctn;
- /**
- * Payload follows
- */
+ /**
+ * Payload follows
+ */
};
/**
* Message to acknowledge end-to-end data.
*/
-struct GNUNET_CADET_DataACK
+struct GNUNET_CADET_ChannelDataAckMessage
{
/**
- * Type: GNUNET_MESSAGE_TYPE_CADET_DATA_ACK
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_APP_DATA_ACK
*/
struct GNUNET_MessageHeader header;
/**
* ID of the channel
*/
- CADET_ChannelNumber chid GNUNET_PACKED;
+ struct GNUNET_CADET_ChannelTunnelNumber ctn;
/**
- * Bitfield of already-received newer messages
+ * Bitfield of already-received messages past @e mid.
* pid + 1 @ LSB
* pid + 64 @ MSB
*/
/**
* Last message ID received.
*/
+ /* NEW: struct ChannelMessageIdentifier */
uint32_t mid GNUNET_PACKED;
};
+#else
+
/**
- * Message to acknowledge cadet encrypted traffic.
+ * Number used to uniquely identify messages in a CADET Channel.
*/
-struct GNUNET_CADET_ACK
+struct ChannelMessageIdentifier
{
- /**
- * Type: GNUNET_MESSAGE_TYPE_CADET_ACK
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Maximum packet ID authorized.
- */
- uint32_t ack GNUNET_PACKED;
-
- /**
- * ID of the connection.
- */
- struct GNUNET_CADET_Hash cid;
+ /**
+ * Unique ID of the message, cycles around, in NBO.
+ */
+ uint32_t mid GNUNET_PACKED;
};
/**
- * Message to query a peer about its Flow Control status regarding a tunnel.
+ * Message for cadet data traffic.
*/
-struct GNUNET_CADET_Poll
+struct GNUNET_CADET_ChannelAppDataMessage
{
- /**
- * Type: GNUNET_MESSAGE_TYPE_CADET_POLL
- */
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_APP_DATA.
+ */
struct GNUNET_MessageHeader header;
- /**
- * Last packet sent.
- */
- uint32_t pid GNUNET_PACKED;
+ /**
+ * Unique ID of the payload message.
+ */
+ struct ChannelMessageIdentifier mid;
- /**
- * ID of the connection.
- */
- struct GNUNET_CADET_Hash cid;
+ /**
+ * ID of the channel
+ */
+ struct GNUNET_CADET_ChannelTunnelNumber ctn;
+ /**
+ * Payload follows
+ */
};
/**
- * Message for notifying a disconnection in a path
+ * Message to acknowledge end-to-end data.
*/
-struct GNUNET_CADET_ConnectionBroken
+struct GNUNET_CADET_ChannelDataAckMessage
{
- /**
- * Type: GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN
- */
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_APP_DATA_ACK
+ */
struct GNUNET_MessageHeader header;
- /**
- * ID of the connection.
- */
- struct GNUNET_CADET_Hash cid;
+ /**
+ * ID of the channel
+ */
+ struct GNUNET_CADET_ChannelTunnelNumber ctn;
- /**
- * ID of the endpoint
- */
- struct GNUNET_PeerIdentity peer1;
+ /**
+ * Bitfield of already-received newer messages. Note that bit 0
+ * corresponds to @e mid + 1.
+ *
+ * pid + 0 @ LSB
+ * pid + 63 @ MSB
+ */
+ uint64_t futures GNUNET_PACKED;
- /**
- * ID of the endpoint
- */
- struct GNUNET_PeerIdentity peer2;
+ /**
+ * Next message ID expected.
+ */
+ struct ChannelMessageIdentifier mid;
};
-/**
- * Message to destroy a connection.
- */
-struct GNUNET_CADET_ConnectionDestroy
-{
- /**
- * Type: GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * ID of the connection.
- */
- struct GNUNET_CADET_Hash cid;
-};
-
+#endif
GNUNET_NETWORK_STRUCT_END