X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fcadet%2Fcadet_protocol.h;h=de0cec5d0b772097a0a75d7a3538d4fe9ad131f9;hb=503717fce30f57907482678fb1abfe468309d7b1;hp=c45c4c68458c4f8396f1385f535cfdb1af99d377;hpb=a1bd2dcc29c126023dbd1ddf83d7514859d1775b;p=oweals%2Fgnunet.git diff --git a/src/cadet/cadet_protocol.h b/src/cadet/cadet_protocol.h index c45c4c684..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 @@ -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,56 +166,27 @@ struct GNUNET_CADET_ConnectionDestroyMessage }; -/** - * Message to acknowledge cadet encrypted traffic. - */ -struct GNUNET_CADET_ConnectionEncryptedAckMessage -{ - /** - * Type: #GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED_HOP_BY_HOP_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_ConnectionHopByHopPollMessage +struct CadetEncryptedMessageIdentifier { /** - * Type: #GNUNET_MESSAGE_TYPE_CADET_CONNECTION_HOP_BY_HOP_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. */ @@ -234,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; @@ -262,37 +240,37 @@ struct GNUNET_CADET_TunnelKeyExchangeMessage * 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_ConnectionEncryptedMessage +struct GNUNET_CADET_TunnelKeyExchangeAuthMessage { - /** - * Type: #GNUNET_MESSAGE_TYPE_CONNECTION_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_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. @@ -309,7 +287,41 @@ struct GNUNET_CADET_ConnectionEncryptedMessage */ 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,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; @@ -340,57 +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. */ - uint32_t mid GNUNET_PACKED; + struct ChannelMessageIdentifier mid; /** * ID of the channel */ - struct GNUNET_CADET_ChannelNumber chid; + struct GNUNET_CADET_ChannelTunnelNumber ctn; /** * Payload follows @@ -404,29 +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. */ - uint32_t mid GNUNET_PACKED; + struct ChannelMessageIdentifier mid; }; -#endif GNUNET_NETWORK_STRUCT_END