/*
This file is part of GNUnet.
- Copyright (C) 2001 - 2011 GNUnet e.V.
+ Copyright (C) 2007 - 2017 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
- by the Free Software Foundation; either version 3, or (at your
- option) any later version.
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
GNUnet is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
+ Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
- 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., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
+ SPDX-License-Identifier: AGPL3.0-or-later
*/
/**
- * @author Bartlomiej Polot
* @file cadet/cadet_protocol.h
+ * @brief P2P messages used by CADET
+ * @author Bartlomiej Polot
+ * @author Christian Grothoff
*/
#ifndef CADET_PROTOCOL_H_
#define CADET_PROTOCOL_H_
+/**
+ * At best, enable when debugging #5328!
+ */
+#define DEBUG_KX 0
+#if DEBUG_KX
+#warning NEVER run this in production! KX debugging is on!
+#endif
+
#include "platform.h"
#include "gnunet_util_lib.h"
#include "cadet.h"
/**
* 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) +
+ * Size: sizeof (struct GNUNET_CADET_ConnectionCreateMessage) +
* path_length * sizeof (struct GNUNET_PeerIdentity)
*/
struct GNUNET_MessageHeader header;
/**
- * For alignment.
+ * Connection options in network byte order.
+ * #GNUNET_CADET_OPTION_DEFAULT for buffered;
+ * #GNUNET_CADET_OPTION_NOBUFFER for unbuffered.
+ * Other flags are ignored and should not be set at this level.
*/
- uint32_t reserved GNUNET_PACKED;
+ uint32_t options GNUNET_PACKED;
/**
* ID of the connection
/**
* 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;
/**
* Message for notifying a disconnection in a path
*/
-struct GNUNET_CADET_ConnectionBroken
+struct GNUNET_CADET_ConnectionBrokenMessage
{
/**
- * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN.
*/
struct GNUNET_MessageHeader header;
/**
* Message to destroy a connection.
*/
-struct GNUNET_CADET_ConnectionDestroy
+struct GNUNET_CADET_ConnectionDestroyMessage
{
/**
* Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY
};
-/**
- * Message to acknowledge cadet encrypted traffic.
- */
-struct GNUNET_CADET_ACK
-{
- /**
- * 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_ConnectionTunnelIdentifier cid;
-};
-
+/******************************************************************************/
+/******************************* TUNNEL ***********************************/
+/******************************************************************************/
/**
- * Message to query a peer about its Flow Control status regarding a 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 GNUNET_CADET_Poll
+struct CadetEncryptedMessageIdentifier
{
/**
- * Type: #GNUNET_MESSAGE_TYPE_CADET_POLL
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Last packet sent.
+ * This number is incremented by one per message. It may wrap around.
+ * In network byte order.
*/
uint32_t pid GNUNET_PACKED;
-
- /**
- * ID of the connection.
- */
- struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
-
};
-
-/******************************************************************************/
-/******************************* TUNNEL ***********************************/
-/******************************************************************************/
-
/**
* Flags to be used in GNUNET_CADET_KX.
*/
/**
* Message for a Key eXchange for a tunnel.
*/
-struct GNUNET_CADET_KX
+struct GNUNET_CADET_TunnelKeyExchangeMessage
{
/**
- * Type: #GNUNET_MESSAGE_TYPE_CADET_KX.
+ * 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;
*/
struct GNUNET_CRYPTO_EcdhePublicKey ephemeral_key;
+#if DEBUG_KX
+ /**
+ * Sender's ephemeral public ECC key encoded in a
+ * format suitable for network transmission, as created
+ * using 'gcry_sexp_sprint'.
+ */
+ struct GNUNET_CRYPTO_EcdhePrivateKey ephemeral_key_XXX; // for debugging KX-crypto!
+
+ /**
+ * Sender's ephemeral public ECC key encoded in a
+ * format suitable for network transmission, as created
+ * using 'gcry_sexp_sprint'.
+ */
+ struct GNUNET_CRYPTO_EddsaPrivateKey private_key_XXX; // for debugging KX-crypto!
+#endif
+
/**
* Sender's next ephemeral public ECC key encoded in a
* format suitable for network transmission, as created
* using 'gcry_sexp_sprint'.
*/
struct GNUNET_CRYPTO_EcdhePublicKey ratchet_key;
+
};
/**
- * Axolotl tunnel message.
+ * 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_Encrypted
+struct GNUNET_CADET_TunnelKeyExchangeAuthMessage
{
- /**
- * Type: #GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED
- */
- struct GNUNET_MessageHeader header;
/**
- * ID of the packet (hop by hop).
+ * Message header with key material.
*/
- uint32_t pid GNUNET_PACKED;
+ struct GNUNET_CADET_TunnelKeyExchangeMessage kx;
+#if DEBUG_KX
/**
- * ID of the connection.
+ * Received ephemeral public ECC key encoded in a
+ * format suitable for network transmission, as created
+ * using 'gcry_sexp_sprint'.
*/
- struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
+ struct GNUNET_CRYPTO_EcdhePublicKey r_ephemeral_key_XXX; // for debugging KX-crypto!
+#endif
/**
- * MAC of the encrypted message, used to verify message integrity.
- * Everything after this value will be encrypted with the header key
- * and authenticated.
+ * KDF-proof that sender could compute the 3-DH, used in lieu of a
+ * signature or payload data.
*/
- struct GNUNET_ShortHashCode hmac;
+ struct GNUNET_HashCode auth;
+
+};
+
- /**************** AX_HEADER start ****************/
+/**
+ * Encrypted axolotl header with numbers that identify which
+ * keys in which ratchet are to be used to decrypt the body.
+ */
+struct GNUNET_CADET_AxHeader
+{
/**
* Number of messages sent with the current ratchet key.
*/
struct GNUNET_CRYPTO_EcdhePublicKey DHRs;
- /**************** AX_HEADER end ****************/
+};
+
+
+/**
+ * Axolotl-encrypted tunnel message with application payload.
+ */
+struct GNUNET_CADET_TunnelEncryptedMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_ENCRYPTED
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * Reserved, for alignment.
+ */
+ uint32_t reserved GNUNET_PACKED;
+
+ /**
+ * ID of the connection.
+ */
+ struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
+
+ /**
+ * MAC of the encrypted message, used to verify message integrity.
+ * Everything after this value will be encrypted with the header key
+ * and authenticated.
+ */
+ struct GNUNET_ShortHashCode hmac;
+
+ /**
+ * Axolotl-header that specifies which keys to use in which ratchet
+ * to decrypt the body that follows.
+ */
+ struct GNUNET_CADET_AxHeader ax_header;
/**
* Encrypted content follows.
};
-
/******************************************************************************/
/******************************* CHANNEL ***********************************/
/******************************************************************************/
-#ifndef NEW_CADET
/**
* Message to create a Channel.
*/
-struct GNUNET_CADET_ChannelCreate
+struct GNUNET_CADET_ChannelOpenMessage
{
/**
- * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_OPEN
*/
struct GNUNET_MessageHeader header;
uint32_t opt GNUNET_PACKED;
/**
- * Destination port.
+ * Hash of destination port and listener.
*/
- struct GNUNET_HashCode port;
+ struct GNUNET_HashCode h_port;
+
+ /**
+ * ID of the channel within the tunnel.
+ */
+ struct GNUNET_CADET_ChannelTunnelNumber ctn;
+};
+
+
+/**
+ * Message to acknowledge opening a channel of type
+ * #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_OPEN_ACK.
+ */
+struct GNUNET_CADET_ChannelOpenAckMessage
+{
+ /**
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_OPEN_ACK
+ */
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * For alignment.
+ */
+ uint32_t reserved GNUNET_PACKED;
/**
* ID of the channel
*/
- struct GNUNET_CADET_ChannelNumber chid;
+ struct GNUNET_CADET_ChannelTunnelNumber ctn;
+
+ /**
+ * Port number of the channel, used to prove to the
+ * initiator that the receiver knows the port.
+ */
+ struct GNUNET_HashCode port;
};
-#endif
/**
- * Message to manage a Channel (ACK, NACK, Destroy).
+ * Message to destroy a channel of type
+ * #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY.
*/
-struct GNUNET_CADET_ChannelManage
+struct GNUNET_CADET_ChannelDestroyMessage
{
/**
- * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_{ACK|NACK|DESTROY}
+ * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY
*/
struct GNUNET_MessageHeader header;
+ /**
+ * For alignment.
+ */
+ uint32_t reserved GNUNET_PACKED;
+
/**
* ID of the channel
*/
- struct GNUNET_CADET_ChannelNumber chid;
+ struct GNUNET_CADET_ChannelTunnelNumber ctn;
};
-#ifndef NEW_CADET
+/**
+ * Number used to uniquely identify messages in a CADET Channel.
+ */
+struct ChannelMessageIdentifier
+{
+ /**
+ * Unique ID of the message, cycles around, in NBO.
+ */
+ uint32_t mid GNUNET_PACKED;
+};
+
/**
* 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_CHANNEL_APP_DATA.
*/
struct GNUNET_MessageHeader header;
/**
- * Unique ID of the payload message
+ * Unique ID of the payload message.
*/
- uint32_t mid GNUNET_PACKED;
+ struct ChannelMessageIdentifier mid;
/**
* ID of the channel
*/
- struct GNUNET_CADET_ChannelNumber chid;
+ struct GNUNET_CADET_ChannelTunnelNumber ctn;
/**
* 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
*/
- struct GNUNET_CADET_ChannelNumber chid;
+ struct GNUNET_CADET_ChannelTunnelNumber ctn;
/**
- * Bitfield of already-received newer messages
- * pid + 1 @ LSB
- * pid + 64 @ MSB
+ * 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;
/**
- * Last message ID received.
+ * Next message ID expected.
*/
- uint32_t mid GNUNET_PACKED;
+ struct ChannelMessageIdentifier mid;
};
-#endif
GNUNET_NETWORK_STRUCT_END