X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fcadet%2Fcadet_protocol.h;h=de0cec5d0b772097a0a75d7a3538d4fe9ad131f9;hb=503717fce30f57907482678fb1abfe468309d7b1;hp=d034c63b0529d16050b43ce0fa2b1e233000de3d;hpb=f7f26f6ca1b76d2734463d4989b9541df48a6773;p=oweals%2Fgnunet.git diff --git a/src/cadet/cadet_protocol.h b/src/cadet/cadet_protocol.h index d034c63b0..de0cec5d0 100644 --- a/src/cadet/cadet_protocol.h +++ b/src/cadet/cadet_protocol.h @@ -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 @@ -19,8 +19,10 @@ */ /** - * @author Bartlomiej Polot * @file cadet/cadet_protocol.h + * @brief P2P messages used by CADET + * @author Bartlomiej Polot + * @author Christian Grothoff */ #ifndef CADET_PROTOCOL_H_ @@ -56,25 +58,28 @@ GNUNET_NETWORK_STRUCT_BEGIN /** * 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 */ - struct GNUNET_CADET_Hash cid; + struct GNUNET_CADET_ConnectionTunnelIdentifier cid; /** * path_length structs defining the *whole* path from the origin [0] to the @@ -87,10 +92,10 @@ struct GNUNET_CADET_ConnectionCreate /** * 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; @@ -102,7 +107,7 @@ struct GNUNET_CADET_ConnectionACK /** * ID of the connection. */ - struct GNUNET_CADET_Hash cid; + struct GNUNET_CADET_ConnectionTunnelIdentifier cid; }; @@ -110,10 +115,10 @@ struct GNUNET_CADET_ConnectionACK /** * 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; @@ -125,7 +130,7 @@ struct GNUNET_CADET_ConnectionBroken /** * ID of the connection. */ - struct GNUNET_CADET_Hash cid; + struct GNUNET_CADET_ConnectionTunnelIdentifier cid; /** * ID of the endpoint @@ -142,7 +147,7 @@ struct GNUNET_CADET_ConnectionBroken /** * Message to destroy a connection. */ -struct GNUNET_CADET_ConnectionDestroy +struct GNUNET_CADET_ConnectionDestroyMessage { /** * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY @@ -157,60 +162,31 @@ struct GNUNET_CADET_ConnectionDestroy /** * ID of the connection. */ - struct GNUNET_CADET_Hash cid; + struct GNUNET_CADET_ConnectionTunnelIdentifier cid; }; -/** - * 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_Hash 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_Hash cid; - }; - -/******************************************************************************/ -/******************************* TUNNEL ***********************************/ -/******************************************************************************/ - /** * Flags to be used in GNUNET_CADET_KX. */ @@ -231,10 +207,12 @@ enum GNUNET_CADET_KX_Flags { /** * 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; @@ -247,7 +225,7 @@ struct GNUNET_CADET_KX /** * ID of the connection. */ - struct GNUNET_CADET_Hash cid; + struct GNUNET_CADET_ConnectionTunnelIdentifier cid; /** * Sender's ephemeral public ECC key encoded in a @@ -262,37 +240,37 @@ struct GNUNET_CADET_KX * 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; /** - * ID of the connection. + * KDF-proof that sender could compute the 3-DH, used in lieu of a + * signature or payload data. */ - struct GNUNET_CADET_Hash cid; + struct GNUNET_HashCode auth; + +}; - /** - * 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 ****************/ +/** + * 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. @@ -309,7 +287,41 @@ struct GNUNET_CADET_Encrypted */ 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. @@ -317,18 +329,18 @@ struct GNUNET_CADET_Encrypted }; - /******************************************************************************/ /******************************* 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; @@ -338,54 +350,100 @@ struct GNUNET_CADET_ChannelCreate 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 */ - CADET_ChannelNumber chid GNUNET_PACKED; + 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; }; /** - * 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 */ - CADET_ChannelNumber chid GNUNET_PACKED; + struct GNUNET_CADET_ChannelTunnelNumber ctn; +}; + + +/** + * 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 */ - CADET_ChannelNumber chid GNUNET_PACKED; + struct GNUNET_CADET_ChannelTunnelNumber ctn; /** * Payload follows @@ -396,33 +454,34 @@ 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 - * 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; }; - GNUNET_NETWORK_STRUCT_END #if 0 /* keep Emacsens' auto-indent happy */