X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fcadet%2Fcadet_protocol.h;h=de0cec5d0b772097a0a75d7a3538d4fe9ad131f9;hb=503717fce30f57907482678fb1abfe468309d7b1;hp=5ec34f7d719061a54893d00eb22ed43b1b8c005f;hpb=fdaf23f67b365e78c06724ae6c48464d5131d4e1;p=oweals%2Fgnunet.git diff --git a/src/cadet/cadet_protocol.h b/src/cadet/cadet_protocol.h index 5ec34f7d7..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_ @@ -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 @@ -205,7 +210,9 @@ enum GNUNET_CADET_KX_Flags { struct GNUNET_CADET_TunnelKeyExchangeMessage { /** - * Type: #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_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; @@ -234,50 +241,36 @@ struct GNUNET_CADET_TunnelKeyExchangeMessage */ struct GNUNET_CRYPTO_EcdhePublicKey ratchet_key; -#ifdef NEW_CADET - /** - * Proof that sender could compute the 3-DH, in lieu of a signature. - */ - struct GNUNET_HashCode triple_dh_proof; -#endif }; /** - * 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_TunnelEncryptedMessage +struct GNUNET_CADET_TunnelKeyExchangeAuthMessage { - /** - * Type: #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_ENCRYPTED - */ - struct GNUNET_MessageHeader header; -#if NEW_CADET /** - * Reserved, for alignment. + * Message header with key material. */ - uint32_t reserved GNUNET_PACKED; -#else - /** - * Maximum packet ID authorized. - */ - struct CadetEncryptedMessageIdentifier cemi; -#endif + 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_ConnectionTunnelIdentifier 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_ShortHashCode 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. @@ -294,68 +287,47 @@ struct GNUNET_CADET_TunnelEncryptedMessage */ struct GNUNET_CRYPTO_EcdhePublicKey DHRs; - /**************** AX_HEADER end ****************/ - - /** - * Encrypted content follows. - */ }; -#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. + * Axolotl-encrypted tunnel message with application payload. */ -struct GNUNET_CADET_ConnectionHopByHopPollMessage +struct GNUNET_CADET_TunnelEncryptedMessage { /** - * Type: #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_ENCRYPTED_POLL + * Type: #GNUNET_MESSAGE_TYPE_CADET_TUNNEL_ENCRYPTED */ struct GNUNET_MessageHeader header; /** - * Last packet sent. + * Reserved, for alignment. */ - struct CadetEncryptedMessageIdentifier cemi; + uint32_t reserved GNUNET_PACKED; /** * 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 + * 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_MessageHeader header; + struct GNUNET_ShortHashCode hmac; /** - * Maximum packet ID authorized. + * Axolotl-header that specifies which keys to use in which ratchet + * to decrypt the body that follows. */ - struct CadetEncryptedMessageIdentifier cemi_max; + struct GNUNET_CADET_AxHeader ax_header; /** - * ID of the connection. + * Encrypted content follows. */ - struct GNUNET_CADET_ConnectionTunnelIdentifier cid; }; -#endif - /******************************************************************************/ /******************************* CHANNEL ***********************************/ @@ -378,9 +350,9 @@ struct GNUNET_CADET_ChannelOpenMessage 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. @@ -390,93 +362,56 @@ struct GNUNET_CADET_ChannelOpenMessage /** - * Message to manage a Channel - * (#GNUNET_MESSAGE_TYPE_CADET_CHANNEL_OPEN_ACK, - * #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY). + * Message to acknowledge opening a channel of type + * #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_OPEN_ACK. */ -struct GNUNET_CADET_ChannelManageMessage +struct GNUNET_CADET_ChannelOpenAckMessage { /** - * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_OPEN_ACK or - * #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY + * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_OPEN_ACK */ struct GNUNET_MessageHeader header; -#ifdef NEW_CADET /** * For alignment. */ uint32_t reserved GNUNET_PACKED; -#endif /** * ID of the channel */ struct GNUNET_CADET_ChannelTunnelNumber ctn; -}; - - -#ifndef NEW_CADET - -/** - * Message for cadet data traffic. - */ -struct GNUNET_CADET_ChannelAppDataMessage -{ - /** - * Type: #GNUNET_MESSAGE_TYPE_CADET_UNICAST, - * #GNUNET_MESSAGE_TYPE_CADET_TO_ORIGIN - */ - struct GNUNET_MessageHeader header; - - /** - * Unique ID of the payload message - */ - /* NEW: struct ChannelMessageIdentifier */ - uint32_t mid GNUNET_PACKED; /** - * ID of the channel - */ - struct GNUNET_CADET_ChannelTunnelNumber ctn; - - /** - * Payload follows + * Port number of the channel, used to prove to the + * initiator that the receiver knows the port. */ + struct GNUNET_HashCode port; }; /** - * Message to acknowledge end-to-end data. + * Message to destroy a channel of type + * #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY. */ -struct GNUNET_CADET_ChannelDataAckMessage +struct GNUNET_CADET_ChannelDestroyMessage { /** - * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_APP_DATA_ACK + * Type: #GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY */ struct GNUNET_MessageHeader header; /** - * ID of the channel - */ - struct GNUNET_CADET_ChannelTunnelNumber ctn; - - /** - * Bitfield of already-received newer messages - * pid + 1 @ LSB - * pid + 64 @ MSB + * For alignment. */ - uint64_t futures GNUNET_PACKED; + uint32_t reserved GNUNET_PACKED; /** - * Last message ID received. + * ID of the channel */ - /* NEW: struct ChannelMessageIdentifier */ - uint32_t mid GNUNET_PACKED; + struct GNUNET_CADET_ChannelTunnelNumber ctn; }; -#else - /** * Number used to uniquely identify messages in a CADET Channel. @@ -532,21 +467,21 @@ struct GNUNET_CADET_ChannelDataAckMessage struct GNUNET_CADET_ChannelTunnelNumber ctn; /** - * Bitfield of already-received messages past @e mid. - * 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. */ struct ChannelMessageIdentifier mid; }; -#endif - GNUNET_NETWORK_STRUCT_END #if 0 /* keep Emacsens' auto-indent happy */