2 This file is part of GNUnet.
3 Copyright (C) 2001 - 2011 Christian Grothoff (and other contributing authors)
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
22 * @author Bartlomiej Polot
23 * @file cadet/cadet_protocol.h
26 #ifndef CADET_PROTOCOL_H_
27 #define CADET_PROTOCOL_H_
30 #include "gnunet_util_lib.h"
35 struct GNUNET_CADET_TunnelMessage;
39 /* keep Emacsens' auto-indent happy */
44 /******************************************************************************/
45 /******************** CADET NETWORK MESSAGES **************************/
46 /******************************************************************************/
48 GNUNET_NETWORK_STRUCT_BEGIN
51 * Message for cadet connection creation.
53 struct GNUNET_CADET_ConnectionCreate
56 * Type: GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE
58 * Size: sizeof (struct GNUNET_CADET_ConnectionCreate) +
59 * path_length * sizeof (struct GNUNET_PeerIdentity)
61 struct GNUNET_MessageHeader header;
64 * ID of the connection
66 struct GNUNET_CADET_Hash cid;
69 * path_length structs defining the *whole* path from the origin [0] to the
70 * final destination [path_length-1].
72 /* struct GNUNET_PeerIdentity peers[path_length]; */
77 * Message for ack'ing a connection
79 struct GNUNET_CADET_ConnectionACK
82 * Type: GNUNET_MESSAGE_TYPE_CADET_CONNECTION_ACK
84 struct GNUNET_MessageHeader header;
87 * ID of the connection.
89 struct GNUNET_CADET_Hash cid;
95 * Message for encapsulation of a Key eXchange message in a connection.
97 struct GNUNET_CADET_KX
100 * Type: GNUNET_MESSAGE_TYPE_CADET_KX.
102 struct GNUNET_MessageHeader header;
105 * ID of the connection.
107 struct GNUNET_CADET_Hash cid;
109 /* Specific KX message follows. */
115 * Message for encapsulation of a Key eXchange message in a connection.
117 struct GNUNET_CADET_AX_KX
120 * Type: GNUNET_MESSAGE_TYPE_CADET_AX_KX.
122 struct GNUNET_MessageHeader header;
125 * Sender's ephemeral public ECC key (always for NIST P-521) encoded in a
126 * format suitable for network transmission, as created
127 * using 'gcry_sexp_sprint'.
129 struct GNUNET_CRYPTO_EcdhePublicKey ephemeral_key;
132 * Sender's next ephemeral public ECC key (always for NIST P-521) encoded in a
133 * format suitable for network transmission, as created
134 * using 'gcry_sexp_sprint'.
136 struct GNUNET_CRYPTO_EcdhePublicKey ratchet_key;
139 * Receiver's ephemeral public ECC key (always for NIST P-521) encoded in a
140 * format suitable for network transmission, as created
141 * using 'gcry_sexp_sprint'.
143 struct GNUNET_CRYPTO_EcdhePublicKey peers_key;
149 * Message transmitted with the signed ephemeral key of a peer. The
150 * session key is then derived from the two ephemeral keys (ECDHE).
152 * As far as possible, same as CORE's EphemeralKeyMessage.
154 struct GNUNET_CADET_KX_Ephemeral
158 * Message type is GNUNET_MESSAGE_TYPE_CADET_KX_EPHEMERAL.
160 struct GNUNET_MessageHeader header;
163 * Status of the sender (should be in "enum PeerStateMachine"), nbo.
165 int32_t sender_status GNUNET_PACKED;
168 * An ECC signature of the 'origin' asserting the validity of
169 * the given ephemeral key.
171 struct GNUNET_CRYPTO_EddsaSignature signature;
174 * Information about what is being signed.
176 struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
179 * At what time was this key created (beginning of validity).
181 struct GNUNET_TIME_AbsoluteNBO creation_time;
184 * When does the given ephemeral key expire (end of validity).
186 struct GNUNET_TIME_AbsoluteNBO expiration_time;
189 * Ephemeral public ECC key (always for NIST P-521) encoded in a format
190 * suitable for network transmission as created using 'gcry_sexp_sprint'.
192 struct GNUNET_CRYPTO_EcdhePublicKey ephemeral_key;
195 * Public key of the signing peer
196 * (persistent version, not the ephemeral public key).
198 struct GNUNET_PeerIdentity origin_identity;
201 * Seed for the IV of nonce.
203 uint32_t iv GNUNET_PACKED;
206 * Nonce to check liveness of peer.
208 uint32_t nonce GNUNET_PACKED;
213 * Response to a PING. Includes data from the original PING.
215 struct GNUNET_CADET_KX_Pong
218 * Message type is GNUNET_MESSAGE_TYPE_CADET_KX_PONG.
220 struct GNUNET_MessageHeader header;
225 uint32_t iv GNUNET_PACKED;
228 * Same nonce as in the reve.
230 uint32_t nonce GNUNET_PACKED;
235 * Tunnel(ed) message.
237 struct GNUNET_CADET_Encrypted
240 * Type: GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED
242 struct GNUNET_MessageHeader header;
245 * ID of the connection.
247 struct GNUNET_CADET_Hash cid;
250 * ID of the packet (hop by hop).
252 uint32_t pid GNUNET_PACKED;
255 * Number of hops to live.
257 uint32_t ttl GNUNET_PACKED;
260 * Initialization Vector for payload encryption.
262 uint32_t iv GNUNET_PACKED;
265 * MAC of the encrypted message, used to verify message integrity.
266 * Everything after this value will be encrypted and authenticated.
268 struct GNUNET_CADET_Hash hmac;
271 * Encrypted content follows.
277 * Axolotl tunnel message.
279 struct GNUNET_CADET_AX
282 * Type: GNUNET_MESSAGE_TYPE_CADET_AXOLOTL_DATA
284 struct GNUNET_MessageHeader header;
287 * ID of the connection.
289 struct GNUNET_CADET_Hash cid;
292 * ID of the packet (hop by hop).
294 uint32_t pid GNUNET_PACKED;
297 * Number of hops to live.
299 uint32_t ttl GNUNET_PACKED;
302 * Initialization Vector for payload encryption.
304 uint32_t iv GNUNET_PACKED;
307 * MAC of the encrypted message, used to verify message integrity.
308 * Everything after this value will be encrypted and authenticated.
310 struct GNUNET_CADET_Hash hmac;
313 * Encrypted content follows.
319 * Message to create a Channel.
321 struct GNUNET_CADET_ChannelCreate
324 * Type: GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE
326 struct GNUNET_MessageHeader header;
331 CADET_ChannelNumber chid GNUNET_PACKED;
336 uint32_t port GNUNET_PACKED;
341 uint32_t opt GNUNET_PACKED;
346 * Message to manage a Channel (ACK, NACK, Destroy).
348 struct GNUNET_CADET_ChannelManage
351 * Type: GNUNET_MESSAGE_TYPE_CADET_CHANNEL_{ACK|NACK|DESTROY}
353 struct GNUNET_MessageHeader header;
358 CADET_ChannelNumber chid GNUNET_PACKED;
363 * Message for cadet data traffic.
365 struct GNUNET_CADET_Data
368 * Type: GNUNET_MESSAGE_TYPE_CADET_UNICAST,
369 * GNUNET_MESSAGE_TYPE_CADET_TO_ORIGIN
371 struct GNUNET_MessageHeader header;
374 * Unique ID of the payload message
376 uint32_t mid GNUNET_PACKED;
381 CADET_ChannelNumber chid GNUNET_PACKED;
390 * Message to acknowledge end-to-end data.
392 struct GNUNET_CADET_DataACK
395 * Type: GNUNET_MESSAGE_TYPE_CADET_DATA_ACK
397 struct GNUNET_MessageHeader header;
402 CADET_ChannelNumber chid GNUNET_PACKED;
405 * Bitfield of already-received newer messages
409 uint64_t futures GNUNET_PACKED;
412 * Last message ID received.
414 uint32_t mid GNUNET_PACKED;
419 * Message to acknowledge cadet encrypted traffic.
421 struct GNUNET_CADET_ACK
424 * Type: GNUNET_MESSAGE_TYPE_CADET_ACK
426 struct GNUNET_MessageHeader header;
429 * Maximum packet ID authorized.
431 uint32_t ack GNUNET_PACKED;
434 * ID of the connection.
436 struct GNUNET_CADET_Hash cid;
441 * Message to query a peer about its Flow Control status regarding a tunnel.
443 struct GNUNET_CADET_Poll
446 * Type: GNUNET_MESSAGE_TYPE_CADET_POLL
448 struct GNUNET_MessageHeader header;
453 uint32_t pid GNUNET_PACKED;
456 * ID of the connection.
458 struct GNUNET_CADET_Hash cid;
464 * Message for notifying a disconnection in a path
466 struct GNUNET_CADET_ConnectionBroken
469 * Type: GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN
471 struct GNUNET_MessageHeader header;
474 * ID of the connection.
476 struct GNUNET_CADET_Hash cid;
481 struct GNUNET_PeerIdentity peer1;
486 struct GNUNET_PeerIdentity peer2;
491 * Message to destroy a connection.
493 struct GNUNET_CADET_ConnectionDestroy
496 * Type: GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY
498 struct GNUNET_MessageHeader header;
501 * ID of the connection.
503 struct GNUNET_CADET_Hash cid;
507 GNUNET_NETWORK_STRUCT_END
509 #if 0 /* keep Emacsens' auto-indent happy */
516 /* ifndef CADET_PROTOCOL_H */
518 /* end of cadet_protocol.h */