Fix memory leaks in cadet tests
[oweals/gnunet.git] / src / cadet / cadet_protocol.h
index 6a6099e978d5f44a6aa998f4c7141b7c2042198f..de0cec5d0b772097a0a75d7a3538d4fe9ad131f9 100644 (file)
@@ -1,6 +1,6 @@
 /*
      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
 */
 
 /**
- * @author Bartlomiej Polot
  * @file cadet/cadet_protocol.h
+ * @brief P2P messages used by CADET
+ * @author Bartlomiej Polot
+ * @author Christian Grothoff
  */
 
 #ifndef CADET_PROTOCOL_H_
@@ -67,9 +69,12 @@ struct GNUNET_CADET_ConnectionCreateMessage
   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
@@ -87,7 +92,7 @@ struct GNUNET_CADET_ConnectionCreateMessage
 /**
  * Message for ack'ing a connection
  */
-struct GNUNET_CADET_ConnectionCreateMessageAckMessage
+struct GNUNET_CADET_ConnectionCreateAckMessage
 {
   /**
    * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE_ACK
@@ -113,7 +118,7 @@ struct GNUNET_CADET_ConnectionCreateMessageAckMessage
 struct GNUNET_CADET_ConnectionBrokenMessage
 {
   /**
-   * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN
+   * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN.
    */
   struct GNUNET_MessageHeader header;
 
@@ -161,11 +166,15 @@ struct GNUNET_CADET_ConnectionDestroyMessage
 };
 
 
+/******************************************************************************/
+/*******************************   TUNNEL   ***********************************/
+/******************************************************************************/
+
 /**
  * Unique identifier (counter) for an encrypted message in a channel.
- * Used to match #GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED_HOP_BY_HOP_ACK
- * and  #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_HOP_BY_HOP_POLL messages
- * against the respective  #GNUNET_MESSAGE_TYPE_CONNECTION_ENCRYPTED
+ * 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
@@ -179,123 +188,122 @@ struct CadetEncryptedMessageIdentifier
 
 
 /**
- * Message to acknowledge cadet encrypted traffic.
+ * Flags to be used in GNUNET_CADET_KX.
  */
-struct GNUNET_CADET_ConnectionEncryptedAckMessage
-{
-  /**
-   * Type: #GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED_HOP_BY_HOP_ACK
-   */
-  struct GNUNET_MessageHeader header;
+enum GNUNET_CADET_KX_Flags {
 
   /**
-   * Maximum packet ID authorized.
+   * Should the peer reply with its KX details?
    */
-  struct CadetEncryptedMessageIdentifier cemi;
+  GNUNET_CADET_KX_FLAG_NONE = 0,
 
   /**
-   * ID of the connection.
+   * The peer should reply with its KX details?
    */
-  struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
+  GNUNET_CADET_KX_FLAG_FORCE_REPLY = 1
 };
 
 
 /**
- * Message to query a peer about its Flow Control status regarding a tunnel.
+ * Message for a Key eXchange for a tunnel.
  */
-struct GNUNET_CADET_ConnectionHopByHopPollMessage
+struct GNUNET_CADET_TunnelKeyExchangeMessage
 {
   /**
-   * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_HOP_BY_HOP_POLL
+   * 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;
 
   /**
-   * Last packet sent.
+   * Flags for the key exchange in NBO, based on
+   * `enum GNUNET_CADET_KX_Flags`.
    */
-  struct CadetEncryptedMessageIdentifier cemi;
+  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
+   * using 'gcry_sexp_sprint'.
+   */
+  struct GNUNET_CRYPTO_EcdhePublicKey ephemeral_key;
 
+  /**
+   * 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;
 
+};
 
-/******************************************************************************/
-/*******************************   TUNNEL   ***********************************/
-/******************************************************************************/
 
 /**
- * Flags to be used in GNUNET_CADET_KX.
+ * Message for a Key eXchange for a tunnel, with authentication.
+ * Used as a response to the initial KX as well as for rekeying.
  */
-enum GNUNET_CADET_KX_Flags {
+struct GNUNET_CADET_TunnelKeyExchangeAuthMessage
+{
 
   /**
-   * Should the peer reply with its KX details?
+   * Message header with key material.
    */
-  GNUNET_CADET_KX_FLAG_NONE = 0,
+  struct GNUNET_CADET_TunnelKeyExchangeMessage kx;
 
   /**
-   * The peer should reply with its KX details?
+   * KDF-proof that sender could compute the 3-DH, used in lieu of a
+   * signature or payload data.
    */
-  GNUNET_CADET_KX_FLAG_FORCE_REPLY = 1
+  struct GNUNET_HashCode auth;
+
 };
 
 
 /**
- * Message for a Key eXchange for a tunnel.
+ * Encrypted axolotl header with numbers that identify which
+ * keys in which ratchet are to be used to decrypt the body.
  */
-struct GNUNET_CADET_TunnelKeyExchangeMessage
+struct GNUNET_CADET_AxHeader
 {
-  /**
-   * Type: #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_KX.
-   */
-  struct GNUNET_MessageHeader header;
 
   /**
-   * Flags for the key exchange in NBO, based on
-   * `enum GNUNET_CADET_KX_Flags`.
+   * Number of messages sent with the current ratchet key.
    */
-  uint32_t flags GNUNET_PACKED;
+  uint32_t Ns GNUNET_PACKED;
 
   /**
-   * ID of the connection.
+   * Number of messages sent with the previous ratchet key.
    */
-  struct GNUNET_CADET_ConnectionTunnelIdentifier cid;
+  uint32_t PNs GNUNET_PACKED;
 
   /**
-   * Sender's ephemeral public ECC key encoded in a
-   * format suitable for network transmission, as created
-   * using 'gcry_sexp_sprint'.
+   * Current ratchet key.
    */
-  struct GNUNET_CRYPTO_EcdhePublicKey ephemeral_key;
+  struct GNUNET_CRYPTO_EcdhePublicKey DHRs;
 
-  /**
-   * 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.
+ * Axolotl-encrypted tunnel message with application payload.
  */
-struct GNUNET_CADET_ConnectionEncryptedMessage
+struct GNUNET_CADET_TunnelEncryptedMessage
 {
   /**
-   * Type: #GNUNET_MESSAGE_TYPE_CONNECTION_ENCRYPTED
+   * Type: #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_ENCRYPTED
    */
   struct GNUNET_MessageHeader header;
 
   /**
-   * ID of the packet (hop by hop).
+   * Reserved, for alignment.
    */
-  struct CadetEncryptedMessageIdentifier cemi;
+  uint32_t reserved GNUNET_PACKED;
 
   /**
    * ID of the connection.
@@ -309,24 +317,11 @@ struct GNUNET_CADET_ConnectionEncryptedMessage
    */
   struct GNUNET_ShortHashCode hmac;
 
-  /**************** AX_HEADER start ****************/
-
   /**
-   * Number of messages sent with the current ratchet key.
+   * Axolotl-header that specifies which keys to use in which ratchet
+   * to decrypt the body that follows.
    */
-  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;
-
-  /**************** AX_HEADER  end  ****************/
+  struct GNUNET_CADET_AxHeader ax_header;
 
   /**
    * Encrypted content follows.
@@ -334,20 +329,18 @@ struct GNUNET_CADET_ConnectionEncryptedMessage
 };
 
 
-
 /******************************************************************************/
 /*******************************   CHANNEL  ***********************************/
 /******************************************************************************/
 
-#ifndef NEW_CADET
 
 /**
  * Message to create a Channel.
  */
-struct GNUNET_CADET_ChannelCreateMessage
+struct GNUNET_CADET_ChannelOpenMessage
 {
   /**
-   * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE
+   * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_OPEN
    */
   struct GNUNET_MessageHeader header;
 
@@ -357,58 +350,100 @@ struct GNUNET_CADET_ChannelCreateMessage
   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_ChannelManageMessage
+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_ChannelDataMessage
+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.
    */
-  /* NEW: struct ChannelMessageIdentifier */
-  uint32_t mid GNUNET_PACKED;
+  struct ChannelMessageIdentifier mid;
 
   /**
    * ID of the channel
    */
-  struct GNUNET_CADET_ChannelNumber chid;
+  struct GNUNET_CADET_ChannelTunnelNumber ctn;
 
   /**
    * Payload follows
@@ -422,30 +457,30 @@ struct GNUNET_CADET_ChannelDataMessage
 struct GNUNET_CADET_ChannelDataAckMessage
 {
   /**
-   * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_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.
    */
-  /* NEW: struct ChannelMessageIdentifier */
-  uint32_t mid GNUNET_PACKED;
+  struct ChannelMessageIdentifier mid;
 };
 
-#endif
 
 GNUNET_NETWORK_STRUCT_END