trying to make KX logic slightly more readable
[oweals/gnunet.git] / src / cadet / cadet_protocol.h
index 2df652e3476ce1de51fa03e85e442c6deec6f136..e2d6f9d0bfdcae8d0a3447ee1e6dd5bf5fd6a5fd 100644 (file)
@@ -47,15 +47,21 @@ extern "C"
 
 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) +
+   * Size: sizeof (struct GNUNET_CADET_ConnectionCreateMessage) +
    *       path_length * sizeof (struct GNUNET_PeerIdentity)
    */
   struct GNUNET_MessageHeader header;
@@ -64,11 +70,11 @@ struct GNUNET_CADET_ConnectionCreate
    * For alignment.
    */
   uint32_t reserved GNUNET_PACKED;
-  
+
   /**
    * ID of the connection
    */
-  struct GNUNET_CADET_Hash cid;
+  struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
 
   /**
    * path_length structs defining the *whole* path from the origin [0] to the
@@ -81,10 +87,33 @@ struct GNUNET_CADET_ConnectionCreate
 /**
  * Message for ack'ing a connection
  */
-struct GNUNET_CADET_ConnectionACK
+struct GNUNET_CADET_ConnectionCreateAckMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE_ACK
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * For alignment.
+   */
+  uint32_t reserved GNUNET_PACKED;
+
+  /**
+   * ID of the connection.
+   */
+  struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
+
+};
+
+
+/**
+ * Message for notifying a disconnection in a path
+ */
+struct GNUNET_CADET_ConnectionBrokenMessage
 {
   /**
-   * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_ACK
+   * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN.
    */
   struct GNUNET_MessageHeader header;
 
@@ -96,21 +125,30 @@ struct GNUNET_CADET_ConnectionACK
   /**
    * ID of the connection.
    */
-  struct GNUNET_CADET_Hash cid;
+  struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
 
+  /**
+   * ID of the endpoint
+   */
+  struct GNUNET_PeerIdentity peer1;
+
+  /**
+   * ID of the endpoint
+   */
+  struct GNUNET_PeerIdentity peer2;
 };
 
 
 /**
- * Message for encapsulation of a Key eXchange message in a connection.
+ * Message to destroy a connection.
  */
-struct GNUNET_CADET_KX
+struct GNUNET_CADET_ConnectionDestroyMessage
 {
   /**
-   * Type: #GNUNET_MESSAGE_TYPE_CADET_KX.
+   * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY
    */
   struct GNUNET_MessageHeader header;
-  
+
   /**
    * For alignment.
    */
@@ -119,45 +157,71 @@ struct GNUNET_CADET_KX
   /**
    * ID of the connection.
    */
-  struct GNUNET_CADET_Hash cid;
+  struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
+};
 
-  /* Specific KX message follows. */
+
+/******************************************************************************/
+/*******************************   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.
+   */
+  uint32_t pid GNUNET_PACKED;
 };
 
 
 /**
- * Flags to be used in GNUNET_CADET_AX_KX.
+ * Flags to be used in GNUNET_CADET_KX.
  */
-enum GNUNET_CADET_AX_KX_Flags {
+enum GNUNET_CADET_KX_Flags {
 
   /**
    * Should the peer reply with its KX details?
    */
-  GNUNET_CADET_AX_KX_FLAG_NONE = 0,
+  GNUNET_CADET_KX_FLAG_NONE = 0,
 
   /**
    * The peer should reply with its KX details?
    */
-  GNUNET_CADET_AX_KX_FLAG_FORCE_REPLY = 1
+  GNUNET_CADET_KX_FLAG_FORCE_REPLY = 1
 };
 
 
 /**
- * Message for encapsulation of a Key eXchange message in a connection.
+ * Message for a Key eXchange for a tunnel.
  */
-struct GNUNET_CADET_AX_KX
+struct GNUNET_CADET_TunnelKeyExchangeMessage
 {
   /**
-   * Type: #GNUNET_MESSAGE_TYPE_CADET_AX_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;
 
   /**
    * Flags for the key exchange in NBO, based on
-   * `enum GNUNET_CADET_AX_KX_Flags`.
+   * `enum GNUNET_CADET_KX_Flags`.
    */
   uint32_t flags GNUNET_PACKED;
 
+  /**
+   * ID of the connection.
+   */
+  struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
+
   /**
    * Sender's ephemeral public ECC key encoded in a
    * format suitable for network transmission, as created
@@ -171,38 +235,97 @@ struct GNUNET_CADET_AX_KX
    * using 'gcry_sexp_sprint'.
    */
   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
+{
+
+  /**
+   * Message header with key material.
+   */
+  struct GNUNET_CADET_TunnelKeyExchangeMessage kx;
+
+  /**
+   * KDF-proof that sender could compute the 3-DH, used in lieu of a
+   * signature or payload data.
+   */
+  struct GNUNET_HashCode auth;
+
 };
 
 
 /**
- * Axolotl tunnel message.
+ * Encrypted axolotl header with numbers that identify which
+ * keys in which ratchet are to be used to decrypt the body.
  */
-struct GNUNET_CADET_AX
+struct GNUNET_CADET_AxHeader
 {
+
   /**
-   * Type: #GNUNET_MESSAGE_TYPE_CADET_AXOLOTL_DATA
+   * Number of messages sent with the current ratchet key.
+   */
+  uint32_t Ns GNUNET_PACKED;
+
+  /**
+   * Number of messages sent with the previous ratchet key.
+   */
+  uint32_t PNs GNUNET_PACKED;
+
+  /**
+   * Current ratchet key.
+   */
+  struct GNUNET_CRYPTO_EcdhePublicKey DHRs;
+
+};
+
+
+/**
+ * Axolotl-encrypted tunnel message with application payload.
+ */
+struct GNUNET_CADET_TunnelEncryptedMessage
+{
+  /**
+   * Type: #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_ENCRYPTED
    */
   struct GNUNET_MessageHeader header;
 
+#if NEW_CADET
   /**
-   * ID of the packet (hop by hop).
+   * Reserved, for alignment.
    */
-  uint32_t pid GNUNET_PACKED;
+  uint32_t reserved GNUNET_PACKED;
+#else
+  /**
+   * Maximum packet ID authorized.
+   */
+  struct CadetEncryptedMessageIdentifier cemi;
+#endif
 
   /**
    * ID of the connection.
    */
-  struct GNUNET_CADET_Hash cid;
+  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_CADET_Hash hmac;
-
-  /**************** AX_HEADER start ****************/
+  struct GNUNET_ShortHashCode hmac;
 
+  #if NEW_CADET
+  /**
+   * Axolotl-header that specifies which keys to use in which ratchet
+   * to decrypt the body that follows.
+   */
+  struct GNUNET_CADET_AxHeader ax_header;
+#else
   /**
    * Number of messages sent with the current ratchet key.
    */
@@ -217,22 +340,80 @@ struct GNUNET_CADET_AX
    * Current ratchet key.
    */
   struct GNUNET_CRYPTO_EcdhePublicKey DHRs;
+#endif
+  /**
+   * Encrypted content follows.
+   */
+};
 
-  /**************** AX_HEADER  end  ****************/
 
+#ifndef NEW_CADET
+
+/**
+ * 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_ConnectionHopByHopPollMessage
+{
   /**
-   * Encrypted content follows.
+   * Type: #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_ENCRYPTED_POLL
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Last packet sent.
+   */
+  struct CadetEncryptedMessageIdentifier cemi;
+
+  /**
+   * 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_ChannelCreate
+struct GNUNET_CADET_ChannelOpenMessage
 {
   /**
-   * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE
+   * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_OPEN
    */
   struct GNUNET_MessageHeader header;
 
@@ -247,33 +428,45 @@ struct GNUNET_CADET_ChannelCreate
   struct GNUNET_HashCode port;
 
   /**
-   * ID of the channel
+   * ID of the channel within the tunnel.
    */
-  CADET_ChannelNumber chid GNUNET_PACKED;
+  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,
@@ -284,12 +477,13 @@ struct GNUNET_CADET_Data
   /**
    * Unique ID of the payload message
    */
+  /* NEW: struct ChannelMessageIdentifier */
   uint32_t mid GNUNET_PACKED;
 
   /**
    * ID of the channel
    */
-  CADET_ChannelNumber chid GNUNET_PACKED;
+  struct GNUNET_CADET_ChannelTunnelNumber ctn;
 
   /**
    * Payload follows
@@ -300,20 +494,20 @@ struct GNUNET_CADET_Data
 /**
  * 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
    */
@@ -322,108 +516,83 @@ struct GNUNET_CADET_DataACK
   /**
    * 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.
+   * Unique ID of the message, cycles around, in NBO.
    */
-  uint32_t ack GNUNET_PACKED;
-
-  /**
-   * ID of the connection.
-   */
-  struct GNUNET_CADET_Hash cid;
+  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.
+   * Unique ID of the payload message.
    */
-  uint32_t pid GNUNET_PACKED;
+  struct ChannelMessageIdentifier mid;
 
   /**
-   * ID of the connection.
+   * ID of the channel
    */
-  struct GNUNET_CADET_Hash cid;
+  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;
 
   /**
-   * For alignment.
-   */
-  uint32_t reserved GNUNET_PACKED;
-
-  /**
-   * ID of the connection.
+   * ID of the channel
    */
-  struct GNUNET_CADET_Hash cid;
+  struct GNUNET_CADET_ChannelTunnelNumber ctn;
 
   /**
-   * ID of the endpoint
+   * Bitfield of already-received newer messages.  Note that bit 0
+   * corresponds to @e mid + 1.
+   *
+   * pid +  0 @ LSB
+   * pid + 63 @ MSB
    */
-  struct GNUNET_PeerIdentity peer1;
+  uint64_t futures GNUNET_PACKED;
 
   /**
-   * ID of the endpoint
+   * Next message ID expected.
    */
-  struct GNUNET_PeerIdentity peer2;
+  struct ChannelMessageIdentifier mid;
 };
 
 
-/**
- * Message to destroy a connection.
- */
-struct GNUNET_CADET_ConnectionDestroy
-{
-  /**
-   * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY
-   */
-  struct GNUNET_MessageHeader header;
-
-  /**
-   * For alignment.
-   */
-  uint32_t reserved GNUNET_PACKED;
-
-  /**
-   * ID of the connection.
-   */
-  struct GNUNET_CADET_Hash cid;
-};
-
+#endif
 
 GNUNET_NETWORK_STRUCT_END