X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fcadet%2Fcadet_protocol.h;h=de0cec5d0b772097a0a75d7a3538d4fe9ad131f9;hb=503717fce30f57907482678fb1abfe468309d7b1;hp=6a6099e978d5f44a6aa998f4c7141b7c2042198f;hpb=9f1d39a86ddb227f91ad75f740d59adeb9b6ee31;p=oweals%2Fgnunet.git diff --git a/src/cadet/cadet_protocol.h b/src/cadet/cadet_protocol.h index 6a6099e97..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,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