- don't break if connection is empty (no messages to dequeue/call callback)
[oweals/gnunet.git] / src / cadet / gnunet-service-cadet_tunnel.c
1 /*
2      This file is part of GNUnet.
3      (C) 2013 Christian Grothoff (and other contributing authors)
4
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.
9
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.
14
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.
19 */
20
21 #include "platform.h"
22 #include "gnunet_util_lib.h"
23
24 #include "gnunet_signatures.h"
25 #include "gnunet_statistics_service.h"
26
27 #include "cadet_protocol.h"
28 #include "cadet_path.h"
29
30 #include "gnunet-service-cadet_tunnel.h"
31 #include "gnunet-service-cadet_connection.h"
32 #include "gnunet-service-cadet_channel.h"
33 #include "gnunet-service-cadet_peer.h"
34
35 #define LOG(level, ...) GNUNET_log_from(level,"cadet-tun",__VA_ARGS__)
36 #define LOG2(level, ...) GNUNET_log_from_nocheck(level,"cadet-tun",__VA_ARGS__)
37
38 #define REKEY_WAIT GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 5)
39
40 #define CONNECTIONS_PER_TUNNEL 3
41
42 #if !defined(GNUNET_CULL_LOGGING)
43 #define DUMP_KEYS_TO_STDERR GNUNET_YES
44 #else
45 #define DUMP_KEYS_TO_STDERR GNUNET_NO
46 #endif
47
48 /******************************************************************************/
49 /********************************   STRUCTS  **********************************/
50 /******************************************************************************/
51
52 struct CadetTChannel
53 {
54   struct CadetTChannel *next;
55   struct CadetTChannel *prev;
56   struct CadetChannel *ch;
57 };
58
59
60 /**
61  * Connection list and metadata.
62  */
63 struct CadetTConnection
64 {
65   /**
66    * Next in DLL.
67    */
68   struct CadetTConnection *next;
69
70   /**
71    * Prev in DLL.
72    */
73   struct CadetTConnection *prev;
74
75   /**
76    * Connection handle.
77    */
78   struct CadetConnection *c;
79
80   /**
81    * Creation time, to keep oldest connection alive.
82    */
83   struct GNUNET_TIME_Absolute created;
84
85   /**
86    * Connection throughput, to keep fastest connection alive.
87    */
88   uint32_t throughput;
89 };
90
91 /**
92  * Structure used during a Key eXchange.
93  */
94 struct CadetTunnelKXCtx
95 {
96   /**
97    * Encryption ("our") old "confirmed" key, for encrypting traffic sent by us
98    * end before the key exchange is finished or times out.
99    */
100   struct GNUNET_CRYPTO_SymmetricSessionKey e_key_old;
101
102   /**
103    * Decryption ("their") old "confirmed" key, for decrypting traffic sent by
104    * the other end before the key exchange started.
105    */
106   struct GNUNET_CRYPTO_SymmetricSessionKey d_key_old;
107
108   /**
109    * Challenge to send in a ping and expect in the pong.
110    */
111   uint32_t challenge;
112
113   /**
114    * When the rekey started. One minute after this the new key will be used.
115    */
116   struct GNUNET_TIME_Absolute rekey_start_time;
117
118   /**
119    * Task for delayed destruction of the Key eXchange context, to allow delayed
120    * messages with the old key to be decrypted successfully.
121    */
122   GNUNET_SCHEDULER_TaskIdentifier finish_task;
123 };
124
125 /**
126  * Struct containing all information regarding a tunnel to a peer.
127  */
128 struct CadetTunnel
129 {
130     /**
131      * Endpoint of the tunnel.
132      */
133   struct CadetPeer *peer;
134
135     /**
136      * State of the tunnel connectivity.
137      */
138   enum CadetTunnelCState cstate;
139
140   /**
141    * State of the tunnel encryption.
142    */
143   enum CadetTunnelEState estate;
144
145   /**
146    * Key eXchange context.
147    */
148   struct CadetTunnelKXCtx *kx_ctx;
149
150   /**
151    * Peer's ephemeral key, to recreate @c e_key and @c d_key when own ephemeral
152    * key changes.
153    */
154   struct GNUNET_CRYPTO_EcdhePublicKey peers_ephemeral_key;
155
156   /**
157    * Encryption ("our") key. It is only "confirmed" if kx_ctx is NULL.
158    */
159   struct GNUNET_CRYPTO_SymmetricSessionKey e_key;
160
161   /**
162    * Decryption ("their") key. It is only "confirmed" if kx_ctx is NULL.
163    */
164   struct GNUNET_CRYPTO_SymmetricSessionKey d_key;
165
166   /**
167    * Task to start the rekey process.
168    */
169   GNUNET_SCHEDULER_TaskIdentifier rekey_task;
170
171   /**
172    * Paths that are actively used to reach the destination peer.
173    */
174   struct CadetTConnection *connection_head;
175   struct CadetTConnection *connection_tail;
176
177   /**
178    * Next connection number.
179    */
180   uint32_t next_cid;
181
182   /**
183    * Channels inside this tunnel.
184    */
185   struct CadetTChannel *channel_head;
186   struct CadetTChannel *channel_tail;
187
188   /**
189    * Channel ID for the next created channel.
190    */
191   CADET_ChannelNumber next_chid;
192
193   /**
194    * Destroy flag: if true, destroy on last message.
195    */
196   GNUNET_SCHEDULER_TaskIdentifier destroy_task;
197
198   /**
199    * Queued messages, to transmit once tunnel gets connected.
200    */
201   struct CadetTunnelDelayed *tq_head;
202   struct CadetTunnelDelayed *tq_tail;
203
204   /**
205    * Task to trim connections if too many are present.
206    */
207   GNUNET_SCHEDULER_TaskIdentifier trim_connections_task;
208 };
209
210
211 /**
212  * Struct used to save messages in a non-ready tunnel to send once connected.
213  */
214 struct CadetTunnelDelayed
215 {
216   /**
217    * DLL
218    */
219   struct CadetTunnelDelayed *next;
220   struct CadetTunnelDelayed *prev;
221
222   /**
223    * Tunnel.
224    */
225   struct CadetTunnel *t;
226
227   /**
228    * Tunnel queue given to the channel to cancel request. Update on send_queued.
229    */
230   struct CadetTunnelQueue *tq;
231
232   /**
233    * Message to send.
234    */
235   /* struct GNUNET_MessageHeader *msg; */
236 };
237
238
239 /**
240  * Handle for messages queued but not yet sent.
241  */
242 struct CadetTunnelQueue
243 {
244   /**
245    * Connection queue handle, to cancel if necessary.
246    */
247   struct CadetConnectionQueue *cq;
248
249   /**
250    * Handle in case message hasn't been given to a connection yet.
251    */
252   struct CadetTunnelDelayed *tqd;
253
254   /**
255    * Continuation to call once sent.
256    */
257   GCT_sent cont;
258
259   /**
260    * Closure for @c cont.
261    */
262   void *cont_cls;
263 };
264
265
266 /******************************************************************************/
267 /*******************************   GLOBALS  ***********************************/
268 /******************************************************************************/
269
270 /**
271  * Global handle to the statistics service.
272  */
273 extern struct GNUNET_STATISTICS_Handle *stats;
274
275 /**
276  * Local peer own ID (memory efficient handle).
277  */
278 extern GNUNET_PEER_Id myid;
279
280 /**
281  * Local peer own ID (full value).
282  */
283 extern struct GNUNET_PeerIdentity my_full_id;
284
285
286 /**
287  * Don't try to recover tunnels if shutting down.
288  */
289 extern int shutting_down;
290
291
292 /**
293  * Set of all tunnels, in order to trigger a new exchange on rekey.
294  * Indexed by peer's ID.
295  */
296 static struct GNUNET_CONTAINER_MultiPeerMap *tunnels;
297
298 /**
299  * Default TTL for payload packets.
300  */
301 static unsigned long long default_ttl;
302
303 /**
304  * Own private key.
305  */
306 const static struct GNUNET_CRYPTO_EddsaPrivateKey *my_private_key;
307
308 /**
309  * Own ephemeral private key.
310  */
311 static struct GNUNET_CRYPTO_EcdhePrivateKey *my_ephemeral_key;
312
313 /**
314  * Cached message used to perform a key exchange.
315  */
316 static struct GNUNET_CADET_KX_Ephemeral kx_msg;
317
318 /**
319  * Task to generate a new ephemeral key.
320  */
321 static GNUNET_SCHEDULER_TaskIdentifier rekey_task;
322
323 /**
324  * Rekey period.
325  */
326 static struct GNUNET_TIME_Relative rekey_period;
327
328 /******************************************************************************/
329 /********************************   STATIC  ***********************************/
330 /******************************************************************************/
331
332 /**
333  * Get string description for tunnel connectivity state.
334  *
335  * @param cs Tunnel state.
336  *
337  * @return String representation.
338  */
339 static const char *
340 cstate2s (enum CadetTunnelCState cs)
341 {
342   static char buf[32];
343
344   switch (cs)
345   {
346     case CADET_TUNNEL_NEW:
347       return "CADET_TUNNEL_NEW";
348     case CADET_TUNNEL_SEARCHING:
349       return "CADET_TUNNEL_SEARCHING";
350     case CADET_TUNNEL_WAITING:
351       return "CADET_TUNNEL_WAITING";
352     case CADET_TUNNEL_READY:
353       return "CADET_TUNNEL_READY";
354     case CADET_TUNNEL_SHUTDOWN:
355       return "CADET_TUNNEL_SHUTDOWN";
356     default:
357       SPRINTF (buf, "%u (UNKNOWN STATE)", cs);
358       return buf;
359   }
360   return "";
361 }
362
363
364 /**
365  * Get string description for tunnel encryption state.
366  *
367  * @param es Tunnel state.
368  *
369  * @return String representation.
370  */
371 static const char *
372 estate2s (enum CadetTunnelEState es)
373 {
374   static char buf[32];
375
376   switch (es)
377   {
378     case CADET_TUNNEL_KEY_UNINITIALIZED:
379       return "CADET_TUNNEL_KEY_UNINITIALIZED";
380     case CADET_TUNNEL_KEY_SENT:
381       return "CADET_TUNNEL_KEY_SENT";
382     case CADET_TUNNEL_KEY_PING:
383       return "CADET_TUNNEL_KEY_PING";
384     case CADET_TUNNEL_KEY_OK:
385       return "CADET_TUNNEL_KEY_OK";
386     case CADET_TUNNEL_KEY_REKEY:
387       return "CADET_TUNNEL_KEY_REKEY";
388     default:
389       SPRINTF (buf, "%u (UNKNOWN STATE)", es);
390       return buf;
391   }
392   return "";
393 }
394
395
396 /**
397  * @brief Check if tunnel is ready to send traffic.
398  *
399  * Tunnel must be connected and with encryption correctly set up.
400  *
401  * @param t Tunnel to check.
402  *
403  * @return #GNUNET_YES if ready, #GNUNET_NO otherwise
404  */
405 static int
406 is_ready (struct CadetTunnel *t)
407 {
408   int ready;
409
410   GCT_debug (t, GNUNET_ERROR_TYPE_DEBUG);
411   ready = CADET_TUNNEL_READY == t->cstate
412           && (CADET_TUNNEL_KEY_OK == t->estate
413               || CADET_TUNNEL_KEY_REKEY == t->estate);
414   ready = ready || GCT_is_loopback (t);
415   return ready;
416 }
417
418
419 /**
420  * Check if a key is invalid (NULL pointer or all 0)
421  *
422  * @param key Key to check.
423  *
424  * @return #GNUNET_YES if key is null, #GNUNET_NO if exists and is not 0.
425  */
426 static int
427 is_key_null (struct GNUNET_CRYPTO_SymmetricSessionKey *key)
428 {
429   struct GNUNET_CRYPTO_SymmetricSessionKey null_key;
430
431   if (NULL == key)
432     return GNUNET_YES;
433
434   memset (&null_key, 0, sizeof (null_key));
435   if (0 == memcmp (key, &null_key, sizeof (null_key)))
436     return GNUNET_YES;
437   return GNUNET_NO;
438 }
439
440
441 /**
442  * Ephemeral key message purpose size.
443  *
444  * @return Size of the part of the ephemeral key message that must be signed.
445  */
446 size_t
447 ephemeral_purpose_size (void)
448 {
449   return sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
450          sizeof (struct GNUNET_TIME_AbsoluteNBO) +
451          sizeof (struct GNUNET_TIME_AbsoluteNBO) +
452          sizeof (struct GNUNET_CRYPTO_EcdhePublicKey) +
453          sizeof (struct GNUNET_PeerIdentity);
454 }
455
456
457 /**
458  * Size of the encrypted part of a ping message.
459  *
460  * @return Size of the encrypted part of a ping message.
461  */
462 size_t
463 ping_encryption_size (void)
464 {
465   return sizeof (struct GNUNET_PeerIdentity) + sizeof (uint32_t);
466 }
467
468
469 /**
470  * Get the channel's buffer. ONLY FOR NON-LOOPBACK CHANNELS!!
471  *
472  * @param tch Tunnel's channel handle.
473  *
474  * @return Amount of messages the channel can still buffer towards the client.
475  */
476 static unsigned int
477 get_channel_buffer (const struct CadetTChannel *tch)
478 {
479   int fwd;
480
481   /* If channel is outgoing, is origin in the FWD direction and fwd is YES */
482   fwd = GCCH_is_origin (tch->ch, GNUNET_YES);
483
484   return GCCH_get_buffer (tch->ch, fwd);
485 }
486
487
488 /**
489  * Get the channel's allowance status.
490  *
491  * @param tch Tunnel's channel handle.
492  *
493  * @return #GNUNET_YES if we allowed the client to send data to us.
494  */
495 static int
496 get_channel_allowed (const struct CadetTChannel *tch)
497 {
498   int fwd;
499
500   /* If channel is outgoing, is origin in the FWD direction and fwd is YES */
501   fwd = GCCH_is_origin (tch->ch, GNUNET_YES);
502
503   return GCCH_get_allowed (tch->ch, fwd);
504 }
505
506
507 /**
508  * Get the connection's buffer.
509  *
510  * @param tc Tunnel's connection handle.
511  *
512  * @return Amount of messages the connection can still buffer.
513  */
514 static unsigned int
515 get_connection_buffer (const struct CadetTConnection *tc)
516 {
517   int fwd;
518
519   /* If connection is outgoing, is origin in the FWD direction and fwd is YES */
520   fwd = GCC_is_origin (tc->c, GNUNET_YES);
521
522   return GCC_get_buffer (tc->c, fwd);
523 }
524
525
526 /**
527  * Get the connection's allowance.
528  *
529  * @param tc Tunnel's connection handle.
530  *
531  * @return Amount of messages we have allowed the next peer to send us.
532  */
533 static unsigned int
534 get_connection_allowed (const struct CadetTConnection *tc)
535 {
536   int fwd;
537
538   /* If connection is outgoing, is origin in the FWD direction and fwd is YES */
539   fwd = GCC_is_origin (tc->c, GNUNET_YES);
540
541   return GCC_get_allowed (tc->c, fwd);
542 }
543
544
545 /**
546  * Check that a ephemeral key message s well formed and correctly signed.
547  *
548  * @param t Tunnel on which the message came.
549  * @param msg The ephemeral key message.
550  *
551  * @return GNUNET_OK if message is fine, GNUNET_SYSERR otherwise.
552  */
553 int
554 check_ephemeral (struct CadetTunnel *t,
555                  const struct GNUNET_CADET_KX_Ephemeral *msg)
556 {
557   /* Check message size */
558   if (ntohs (msg->header.size) != sizeof (struct GNUNET_CADET_KX_Ephemeral))
559     return GNUNET_SYSERR;
560
561   /* Check signature size */
562   if (ntohl (msg->purpose.size) != ephemeral_purpose_size ())
563     return GNUNET_SYSERR;
564
565   /* Check origin */
566   if (0 != memcmp (&msg->origin_identity,
567                    GCP_get_id (t->peer),
568                    sizeof (struct GNUNET_PeerIdentity)))
569     return GNUNET_SYSERR;
570
571   /* Check signature */
572   if (GNUNET_OK !=
573       GNUNET_CRYPTO_eddsa_verify (GNUNET_SIGNATURE_PURPOSE_CADET_KX,
574                                   &msg->purpose,
575                                   &msg->signature,
576                                   &msg->origin_identity.public_key))
577     return GNUNET_SYSERR;
578
579   return GNUNET_OK;
580 }
581
582
583 /**
584  * Select the best key to use for encryption (send), based on KX status.
585  *
586  * Normally, return the current key. If there is a KX in progress and the old
587  * key is fresh enough, return the old key.
588  *
589  * @param t Tunnel to choose the key from.
590  *
591  * @return The optimal key to encrypt/hmac outgoing traffic.
592  */
593 static const struct GNUNET_CRYPTO_SymmetricSessionKey *
594 select_key (const struct CadetTunnel *t)
595 {
596   const struct GNUNET_CRYPTO_SymmetricSessionKey *key;
597
598   if (NULL != t->kx_ctx
599       && GNUNET_SCHEDULER_NO_TASK == t->kx_ctx->finish_task)
600   {
601     struct GNUNET_TIME_Relative age;
602
603     age = GNUNET_TIME_absolute_get_duration (t->kx_ctx->rekey_start_time);
604     LOG (GNUNET_ERROR_TYPE_DEBUG,
605          "  key exchange in progress, started %s ago\n",
606          GNUNET_STRINGS_relative_time_to_string (age, GNUNET_YES));
607     // FIXME make duration of old keys configurable
608     if (age.rel_value_us < GNUNET_TIME_UNIT_MINUTES.rel_value_us)
609     {
610       LOG (GNUNET_ERROR_TYPE_DEBUG, "  using old key\n");
611       key = &t->kx_ctx->e_key_old;
612     }
613     else
614     {
615       LOG (GNUNET_ERROR_TYPE_DEBUG, "  using new key (old key too old)\n");
616       key = &t->e_key;
617     }
618   }
619   else
620   {
621     LOG (GNUNET_ERROR_TYPE_DEBUG, "  no KX: using current key\n");
622     key = &t->e_key;
623   }
624   return key;
625 }
626
627
628 /**
629  * Calculate HMAC.
630  *
631  * @param plaintext Content to HMAC.
632  * @param size Size of @c plaintext.
633  * @param iv Initialization vector for the message.
634  * @param key Key to use.
635  * @param hmac[out] Destination to store the HMAC.
636  */
637 static void
638 t_hmac (const void *plaintext, size_t size,
639         uint32_t iv, const struct GNUNET_CRYPTO_SymmetricSessionKey *key,
640         struct GNUNET_CADET_Hash *hmac)
641 {
642   static const char ctx[] = "cadet authentication key";
643   struct GNUNET_CRYPTO_AuthKey auth_key;
644   struct GNUNET_HashCode hash;
645
646 #if DUMP_KEYS_TO_STDERR
647   LOG (GNUNET_ERROR_TYPE_INFO, "  HMAC with key %s\n",
648        GNUNET_h2s ((struct GNUNET_HashCode *) key));
649 #endif
650   GNUNET_CRYPTO_hmac_derive_key (&auth_key, key,
651                                  &iv, sizeof (iv),
652                                  key, sizeof (*key),
653                                  ctx, sizeof (ctx),
654                                  NULL);
655   /* Two step: CADET_Hash is only 256 bits, HashCode is 512. */
656   GNUNET_CRYPTO_hmac (&auth_key, plaintext, size, &hash);
657   memcpy (hmac, &hash, sizeof (*hmac));
658 }
659
660
661 /**
662  * Encrypt daforce_newest_keyta with the tunnel key.
663  *
664  * @param t Tunnel whose key to use.
665  * @param dst Destination for the encrypted data.
666  * @param src Source of the plaintext. Can overlap with @c dst.
667  * @param size Size of the plaintext.
668  * @param iv Initialization Vector to use.
669  * @param force_newest_key Force the use of the newest key, otherwise
670  *                         CADET will use the old key when allowed.
671  *                         This can happen in the case when a KX is going on
672  *                         and the old one hasn't expired.
673  */
674 static int
675 t_encrypt (struct CadetTunnel *t, void *dst, const void *src,
676            size_t size, uint32_t iv, int force_newest_key)
677 {
678   struct GNUNET_CRYPTO_SymmetricInitializationVector siv;
679   const struct GNUNET_CRYPTO_SymmetricSessionKey *key;
680   size_t out_size;
681
682   LOG (GNUNET_ERROR_TYPE_DEBUG, "  t_encrypt start\n");
683
684   key = GNUNET_YES == force_newest_key ? &t->e_key : select_key (t);
685   #if DUMP_KEYS_TO_STDERR
686   LOG (GNUNET_ERROR_TYPE_INFO, "  ENC with key %s\n",
687        GNUNET_h2s ((struct GNUNET_HashCode *) key));
688   #endif
689   GNUNET_CRYPTO_symmetric_derive_iv (&siv, key, &iv, sizeof (iv), NULL);
690   LOG (GNUNET_ERROR_TYPE_DEBUG, "  t_encrypt IV derived\n");
691   out_size = GNUNET_CRYPTO_symmetric_encrypt (src, size, key, &siv, dst);
692   LOG (GNUNET_ERROR_TYPE_DEBUG, "  t_encrypt end\n");
693
694   return out_size;
695 }
696
697
698 /**
699  * Decrypt and verify data with the appropriate tunnel key.
700  *
701  * @param key Key to use.
702  * @param dst Destination for the plaintext.
703  * @param src Source of the encrypted data. Can overlap with @c dst.
704  * @param size Size of the encrypted data.
705  * @param iv Initialization Vector to use.
706  *
707  * @return Size of the decrypted data, -1 if an error was encountered.
708  */
709 static int
710 decrypt (const struct GNUNET_CRYPTO_SymmetricSessionKey *key,
711          void *dst, const void *src, size_t size, uint32_t iv)
712 {
713   struct GNUNET_CRYPTO_SymmetricInitializationVector siv;
714   size_t out_size;
715
716   LOG (GNUNET_ERROR_TYPE_DEBUG, "  decrypt start\n");
717   LOG (GNUNET_ERROR_TYPE_DEBUG, "  decrypt iv\n");
718   GNUNET_CRYPTO_symmetric_derive_iv (&siv, key, &iv, sizeof (iv), NULL);
719   LOG (GNUNET_ERROR_TYPE_DEBUG, "  decrypt iv done\n");
720   out_size = GNUNET_CRYPTO_symmetric_decrypt (src, size, key, &siv, dst);
721   LOG (GNUNET_ERROR_TYPE_DEBUG, "  decrypt end\n");
722
723   return out_size;
724 }
725
726
727 /**
728  * Decrypt and verify data with the most recent tunnel key.
729  *
730  * @param t Tunnel whose key to use.
731  * @param dst Destination for the plaintext.
732  * @param src Source of the encrypted data. Can overlap with @c dst.
733  * @param size Size of the encrypted data.
734  * @param iv Initialization Vector to use.
735  *
736  * @return Size of the decrypted data, -1 if an error was encountered.
737  */
738 static int
739 t_decrypt (struct CadetTunnel *t, void *dst, const void *src,
740            size_t size, uint32_t iv)
741 {
742   size_t out_size;
743
744 #if DUMP_KEYS_TO_STDERR
745   LOG (GNUNET_ERROR_TYPE_DEBUG, "  t_decrypt with %s\n",
746        GNUNET_h2s ((struct GNUNET_HashCode *) &t->d_key));
747 #endif
748   if (CADET_TUNNEL_KEY_UNINITIALIZED == t->estate)
749   {
750     GNUNET_STATISTICS_update (stats, "# non decryptable data", 1, GNUNET_NO);
751     LOG (GNUNET_ERROR_TYPE_WARNING,
752          "got data on %s without a valid key\n",
753          GCT_2s (t));
754     GCT_debug (t, GNUNET_ERROR_TYPE_WARNING);
755     return -1;
756   }
757
758   out_size = decrypt (&t->d_key, dst, src, size, iv);
759
760   return out_size;
761 }
762
763
764 /**
765  * Decrypt and verify data with the appropriate tunnel key and verify that the
766  * data has not been altered since it was sent by the remote peer.
767  *
768  * @param t Tunnel whose key to use.
769  * @param dst Destination for the plaintext.
770  * @param src Source of the encrypted data. Can overlap with @c dst.
771  * @param size Size of the encrypted data.
772  * @param iv Initialization Vector to use.
773  * @param msg_hmac HMAC of the message, cannot be NULL.
774  *
775  * @return Size of the decrypted data, -1 if an error was encountered.
776  */
777 static int
778 t_decrypt_and_validate (struct CadetTunnel *t,
779                         void *dst, const void *src,
780                         size_t size, uint32_t iv,
781                         const struct GNUNET_CADET_Hash *msg_hmac)
782 {
783   struct GNUNET_CRYPTO_SymmetricSessionKey *key;
784   struct GNUNET_CADET_Hash hmac;
785   int decrypted_size;
786
787   /* Try primary (newest) key */
788   key = &t->d_key;
789   decrypted_size = decrypt (key, dst, src, size, iv);
790   t_hmac (src, size, iv, key, &hmac);
791   if (0 == memcmp (msg_hmac, &hmac, sizeof (hmac)))
792     return decrypted_size;
793
794   /* If no key exchange is going on, we just failed */
795   if (NULL == t->kx_ctx)
796   {
797     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
798                 "Failed checksum validation on tunnel %s with no KX\n",
799                 GCT_2s (t));
800     GNUNET_STATISTICS_update (stats, "# wrong HMAC", 1, GNUNET_NO);
801     return -1;
802   }
803
804   /* Try secondary (from previous KX period) key */
805   key = &t->kx_ctx->d_key_old;
806   decrypted_size = decrypt (key, dst, src, size, iv);
807   t_hmac (src, size, iv, key, &hmac);
808   if (0 == memcmp (msg_hmac, &hmac, sizeof (hmac)))
809     return decrypted_size;
810
811   GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
812               "Failed checksum validation on tunnel %s with KX\n",
813               GCT_2s (t));
814   GNUNET_STATISTICS_update (stats, "# wrong HMAC", 1, GNUNET_NO);
815   return -1;
816 }
817
818
819 /**
820  * Create key material by doing ECDH on the local and remote ephemeral keys.
821  *
822  * @param key_material Where to store the key material.
823  * @param ephemeral_key Peer's public ephemeral key.
824  */
825 void
826 derive_key_material (struct GNUNET_HashCode *key_material,
827                      const struct GNUNET_CRYPTO_EcdhePublicKey *ephemeral_key)
828 {
829   if (GNUNET_OK !=
830       GNUNET_CRYPTO_ecc_ecdh (my_ephemeral_key,
831                               ephemeral_key,
832                               key_material))
833   {
834     GNUNET_break (0);
835   }
836 }
837
838
839 /**
840  * Create a symmetic key from the identities of both ends and the key material
841  * from ECDH.
842  *
843  * @param key Destination for the generated key.
844  * @param sender ID of the peer that will encrypt with @c key.
845  * @param receiver ID of the peer that will decrypt with @c key.
846  * @param key_material Hash created with ECDH with the ephemeral keys.
847  */
848 void
849 derive_symmertic (struct GNUNET_CRYPTO_SymmetricSessionKey *key,
850                   const struct GNUNET_PeerIdentity *sender,
851                   const struct GNUNET_PeerIdentity *receiver,
852                   const struct GNUNET_HashCode *key_material)
853 {
854   const char salt[] = "CADET kx salt";
855
856   GNUNET_CRYPTO_kdf (key, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
857                      salt, sizeof (salt),
858                      key_material, sizeof (struct GNUNET_HashCode),
859                      sender, sizeof (struct GNUNET_PeerIdentity),
860                      receiver, sizeof (struct GNUNET_PeerIdentity),
861                      NULL);
862 }
863
864
865 /**
866  * Create a new Key eXchange context for the tunnel.
867  *
868  * If the old keys were verified, keep them for old traffic. Create a new KX
869  * timestamp and a new nonce.
870  *
871  * @param t Tunnel for which to create the KX ctx.
872  */
873 static void
874 create_kx_ctx (struct CadetTunnel *t)
875 {
876   LOG (GNUNET_ERROR_TYPE_INFO, "  new kx ctx for %s\n", GCT_2s (t));
877
878   if (NULL != t->kx_ctx)
879   {
880     if (GNUNET_SCHEDULER_NO_TASK != t->kx_ctx->finish_task)
881     {
882       LOG (GNUNET_ERROR_TYPE_INFO, "  resetting exisiting finish task\n");
883       GNUNET_SCHEDULER_cancel (t->kx_ctx->finish_task);
884       t->kx_ctx->finish_task = GNUNET_SCHEDULER_NO_TASK;
885     }
886   }
887   else
888   {
889     t->kx_ctx = GNUNET_new (struct CadetTunnelKXCtx);
890   }
891
892   t->kx_ctx->challenge = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE,
893                                                    UINT32_MAX);
894   if (CADET_TUNNEL_KEY_OK == t->estate)
895   {
896     t->kx_ctx->d_key_old = t->d_key;
897     t->kx_ctx->e_key_old = t->e_key;
898   }
899   t->kx_ctx->rekey_start_time = GNUNET_TIME_absolute_get ();
900 }
901
902
903 /**
904  * @brief Finish the Key eXchange and destroy the old keys.
905  *
906  * @param cls Closure (Tunnel for which to finish the KX).
907  * @param tc Task context.
908  */
909 static void
910 finish_kx (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
911 {
912   struct CadetTunnel *t = cls;
913
914   LOG (GNUNET_ERROR_TYPE_INFO, "finish KX for %s\n", GCT_2s (t));
915
916   if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
917   {
918     LOG (GNUNET_ERROR_TYPE_INFO, "  shutdown\n");
919     return;
920   }
921
922   GNUNET_free (t->kx_ctx);
923   t->kx_ctx = NULL;
924 }
925
926
927 /**
928  * Destroy a Key eXchange context for the tunnel. This function only schedules
929  * the destruction, the freeing of the memory (and clearing of old key material)
930  * happens after a delay!
931  *
932  * @param t Tunnel whose KX ctx to destroy.
933  */
934 static void
935 destroy_kx_ctx (struct CadetTunnel *t)
936 {
937   struct GNUNET_TIME_Relative delay;
938
939   if (NULL == t->kx_ctx || GNUNET_SCHEDULER_NO_TASK != t->kx_ctx->finish_task)
940     return;
941
942   if (is_key_null (&t->kx_ctx->e_key_old))
943   {
944     t->kx_ctx->finish_task = GNUNET_SCHEDULER_add_now (finish_kx, t);
945     return;
946   }
947
948   delay = GNUNET_TIME_relative_divide (rekey_period, 4);
949   delay = GNUNET_TIME_relative_min (delay, GNUNET_TIME_UNIT_MINUTES);
950
951   t->kx_ctx->finish_task = GNUNET_SCHEDULER_add_delayed (delay, finish_kx, t);
952 }
953
954
955 /**
956  * Derive the tunnel's keys using our own and the peer's ephemeral keys.
957  *
958  * @param t Tunnel for which to create the keys.
959  */
960 static void
961 create_keys (struct CadetTunnel *t)
962 {
963   struct GNUNET_HashCode km;
964
965   derive_key_material (&km, &t->peers_ephemeral_key);
966   derive_symmertic (&t->e_key, &my_full_id, GCP_get_id (t->peer), &km);
967   derive_symmertic (&t->d_key, GCP_get_id (t->peer), &my_full_id, &km);
968 #if DUMP_KEYS_TO_STDERR
969   LOG (GNUNET_ERROR_TYPE_INFO, "ME: %s\n",
970        GNUNET_h2s ((struct GNUNET_HashCode *) &kx_msg.ephemeral_key));
971   LOG (GNUNET_ERROR_TYPE_INFO, "PE: %s\n",
972        GNUNET_h2s ((struct GNUNET_HashCode *) &t->peers_ephemeral_key));
973   LOG (GNUNET_ERROR_TYPE_INFO, "KM: %s\n", GNUNET_h2s (&km));
974   LOG (GNUNET_ERROR_TYPE_INFO, "EK: %s\n",
975        GNUNET_h2s ((struct GNUNET_HashCode *) &t->e_key));
976   LOG (GNUNET_ERROR_TYPE_INFO, "DK: %s\n",
977        GNUNET_h2s ((struct GNUNET_HashCode *) &t->d_key));
978 #endif
979 }
980
981
982 /**
983  * Pick a connection on which send the next data message.
984  *
985  * @param t Tunnel on which to send the message.
986  *
987  * @return The connection on which to send the next message.
988  */
989 static struct CadetConnection *
990 tunnel_get_connection (struct CadetTunnel *t)
991 {
992   struct CadetTConnection *iter;
993   struct CadetConnection *best;
994   unsigned int qn;
995   unsigned int lowest_q;
996
997   LOG (GNUNET_ERROR_TYPE_DEBUG, "tunnel_get_connection %s\n", GCT_2s (t));
998   best = NULL;
999   lowest_q = UINT_MAX;
1000   for (iter = t->connection_head; NULL != iter; iter = iter->next)
1001   {
1002     LOG (GNUNET_ERROR_TYPE_DEBUG, "  connection %s: %u\n",
1003          GCC_2s (iter->c), GCC_get_state (iter->c));
1004     if (CADET_CONNECTION_READY == GCC_get_state (iter->c))
1005     {
1006       qn = GCC_get_qn (iter->c, GCC_is_origin (iter->c, GNUNET_YES));
1007       LOG (GNUNET_ERROR_TYPE_DEBUG, "    q_n %u, \n", qn);
1008       if (qn < lowest_q)
1009       {
1010         best = iter->c;
1011         lowest_q = qn;
1012       }
1013     }
1014   }
1015   LOG (GNUNET_ERROR_TYPE_DEBUG, " selected: connection %s\n", GCC_2s (best));
1016   return best;
1017 }
1018
1019
1020 /**
1021  * Callback called when a queued message is sent.
1022  *
1023  * Calculates the average time and connection packet tracking.
1024  *
1025  * @param cls Closure (TunnelQueue handle).
1026  * @param c Connection this message was on.
1027  * @param q Connection queue handle (unused).
1028  * @param type Type of message sent.
1029  * @param fwd Was this a FWD going message?
1030  * @param size Size of the message.
1031  */
1032 static void
1033 tun_message_sent (void *cls,
1034               struct CadetConnection *c,
1035               struct CadetConnectionQueue *q,
1036               uint16_t type, int fwd, size_t size)
1037 {
1038   struct CadetTunnelQueue *qt = cls;
1039   struct CadetTunnel *t;
1040
1041   LOG (GNUNET_ERROR_TYPE_DEBUG, "tun_message_sent\n");
1042
1043   GNUNET_assert (NULL != qt->cont);
1044   t = NULL == c ? NULL : GCC_get_tunnel (c);
1045   qt->cont (qt->cont_cls, t, qt, type, size);
1046   GNUNET_free (qt);
1047 }
1048
1049
1050 static unsigned int
1051 count_queued_data (const struct CadetTunnel *t)
1052 {
1053   struct CadetTunnelDelayed *iter;
1054   unsigned int count;
1055
1056   for (count = 0, iter = t->tq_head; iter != NULL; iter = iter->next)
1057     count++;
1058
1059   return count;
1060 }
1061
1062 /**
1063  * Delete a queued message: either was sent or the channel was destroyed
1064  * before the tunnel's key exchange had a chance to finish.
1065  *
1066  * @param tqd Delayed queue handle.
1067  */
1068 static void
1069 unqueue_data (struct CadetTunnelDelayed *tqd)
1070 {
1071   GNUNET_CONTAINER_DLL_remove (tqd->t->tq_head, tqd->t->tq_tail, tqd);
1072   GNUNET_free (tqd);
1073 }
1074
1075
1076 /**
1077  * Cache a message to be sent once tunnel is online.
1078  *
1079  * @param t Tunnel to hold the message.
1080  * @param msg Message itself (copy will be made).
1081  */
1082 static struct CadetTunnelDelayed *
1083 queue_data (struct CadetTunnel *t, const struct GNUNET_MessageHeader *msg)
1084 {
1085   struct CadetTunnelDelayed *tqd;
1086   uint16_t size = ntohs (msg->size);
1087
1088   LOG (GNUNET_ERROR_TYPE_DEBUG, "queue data on Tunnel %s\n", GCT_2s (t));
1089
1090   if (GNUNET_YES == is_ready (t))
1091   {
1092     GNUNET_break (0);
1093     return NULL;
1094   }
1095
1096   tqd = GNUNET_malloc (sizeof (struct CadetTunnelDelayed) + size);
1097
1098   tqd->t = t;
1099   memcpy (&tqd[1], msg, size);
1100   GNUNET_CONTAINER_DLL_insert_tail (t->tq_head, t->tq_tail, tqd);
1101   return tqd;
1102 }
1103
1104
1105 /**
1106  * Sends an already built message on a tunnel, encrypting it and
1107  * choosing the best connection.
1108  *
1109  * @param message Message to send. Function modifies it.
1110  * @param t Tunnel on which this message is transmitted.
1111  * @param c Connection to use (autoselect if NULL).
1112  * @param force Force the tunnel to take the message (buffer overfill).
1113  * @param cont Continuation to call once message is really sent.
1114  * @param cont_cls Closure for @c cont.
1115  * @param existing_q In case this a transmission of previously queued data,
1116  *                   this should be TunnelQueue given to the client.
1117  *                   Otherwise, NULL.
1118  *
1119  * @return Handle to cancel message.
1120  *         NULL if @c cont is NULL or an error happens and message is dropped.
1121  */
1122 static struct CadetTunnelQueue *
1123 send_prebuilt_message (const struct GNUNET_MessageHeader *message,
1124                        struct CadetTunnel *t, struct CadetConnection *c,
1125                        int force, GCT_sent cont, void *cont_cls,
1126                        struct CadetTunnelQueue *existing_q)
1127 {
1128   struct CadetTunnelQueue *tq;
1129   struct GNUNET_CADET_Encrypted *msg;
1130   size_t size = ntohs (message->size);
1131   char cbuf[sizeof (struct GNUNET_CADET_Encrypted) + size];
1132   uint32_t mid;
1133   uint32_t iv;
1134   uint16_t type;
1135   int fwd;
1136
1137   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT Send on Tunnel %s\n", GCT_2s (t));
1138
1139   if (GNUNET_NO == is_ready (t))
1140   {
1141     struct CadetTunnelDelayed *tqd;
1142     /* A non null existing_q indicates sending of queued data.
1143      * Should only happen after tunnel becomes ready.
1144      */
1145     GNUNET_assert (NULL == existing_q);
1146     tqd = queue_data (t, message);
1147     if (NULL == cont)
1148       return NULL;
1149     tq = GNUNET_new (struct CadetTunnelQueue);
1150     tq->tqd = tqd;
1151     tqd->tq = tq;
1152     tq->cont = cont;
1153     tq->cont_cls = cont_cls;
1154     return tq;
1155   }
1156
1157   GNUNET_assert (GNUNET_NO == GCT_is_loopback (t));
1158
1159   iv = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX);
1160   msg = (struct GNUNET_CADET_Encrypted *) cbuf;
1161   msg->header.type = htons (GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED);
1162   msg->iv = iv;
1163   GNUNET_assert (t_encrypt (t, &msg[1], message, size, iv, GNUNET_NO) == size);
1164   t_hmac (&msg[1], size, iv, select_key (t), &msg->hmac);
1165   msg->header.size = htons (sizeof (struct GNUNET_CADET_Encrypted) + size);
1166
1167   if (NULL == c)
1168     c = tunnel_get_connection (t);
1169   if (NULL == c)
1170   {
1171     /* Why is tunnel 'ready'? Should have been queued! */
1172     if (GNUNET_SCHEDULER_NO_TASK != t->destroy_task)
1173     {
1174       GNUNET_break (0);
1175       GCT_debug (t, GNUNET_ERROR_TYPE_WARNING);
1176     }
1177     return NULL; /* Drop... */
1178   }
1179
1180   mid = 0;
1181   type = ntohs (message->type);
1182   switch (type)
1183   {
1184     case GNUNET_MESSAGE_TYPE_CADET_DATA:
1185     case GNUNET_MESSAGE_TYPE_CADET_DATA_ACK:
1186       if (GNUNET_MESSAGE_TYPE_CADET_DATA == type)
1187         mid = ntohl (((struct GNUNET_CADET_Data *) message)->mid);
1188       else
1189         mid = ntohl (((struct GNUNET_CADET_DataACK *) message)->mid);
1190       /* Fall thru */
1191     case GNUNET_MESSAGE_TYPE_CADET_KEEPALIVE:
1192     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE:
1193     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY:
1194     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_ACK:
1195     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_NACK:
1196       msg->cid = *GCC_get_id (c);
1197       msg->ttl = htonl (default_ttl);
1198       break;
1199     default:
1200       GNUNET_break (0);
1201       LOG (GNUNET_ERROR_TYPE_ERROR, "type %s not valid\n", GC_m2s (type));
1202   }
1203   LOG (GNUNET_ERROR_TYPE_DEBUG, "type %s\n", GC_m2s (type));
1204
1205   fwd = GCC_is_origin (c, GNUNET_YES);
1206
1207   if (NULL == cont)
1208   {
1209     GNUNET_break (NULL == GCC_send_prebuilt_message (&msg->header, type, mid, c,
1210                                                      fwd, force, NULL, NULL));
1211     return NULL;
1212   }
1213   if (NULL == existing_q)
1214   {
1215     tq = GNUNET_new (struct CadetTunnelQueue); /* FIXME valgrind: leak*/
1216   }
1217   else
1218   {
1219     tq = existing_q;
1220     tq->tqd = NULL;
1221   }
1222   tq->cq = GCC_send_prebuilt_message (&msg->header, type, mid, c, fwd, force,
1223                                       &tun_message_sent, tq);
1224   GNUNET_assert (NULL != tq->cq);
1225   tq->cont = cont;
1226   tq->cont_cls = cont_cls;
1227
1228   return tq;
1229 }
1230
1231
1232 /**
1233  * Send all cached messages that we can, tunnel is online.
1234  *
1235  * @param t Tunnel that holds the messages. Cannot be loopback.
1236  */
1237 static void
1238 send_queued_data (struct CadetTunnel *t)
1239 {
1240   struct CadetTunnelDelayed *tqd;
1241   struct CadetTunnelDelayed *next;
1242   unsigned int room;
1243
1244   LOG (GNUNET_ERROR_TYPE_DEBUG,
1245        "GCT_send_queued_data on tunnel %s\n",
1246        GCT_2s (t));
1247
1248   if (GCT_is_loopback (t))
1249   {
1250     GNUNET_break (0);
1251     return;
1252   }
1253
1254   if (GNUNET_NO == is_ready (t))
1255   {
1256     LOG (GNUNET_ERROR_TYPE_DEBUG, "  not ready yet: %s/%s\n",
1257          estate2s (t->estate), cstate2s (t->cstate));
1258     return;
1259   }
1260
1261   room = GCT_get_connections_buffer (t);
1262   LOG (GNUNET_ERROR_TYPE_DEBUG, "  buffer space: %u\n", room);
1263   LOG (GNUNET_ERROR_TYPE_DEBUG, "  tq head: %p\n", t->tq_head);
1264   for (tqd = t->tq_head; NULL != tqd && room > 0; tqd = next)
1265   {
1266     LOG (GNUNET_ERROR_TYPE_DEBUG, " sending queued data\n");
1267     next = tqd->next;
1268     room--;
1269     send_prebuilt_message ((struct GNUNET_MessageHeader *) &tqd[1],
1270                            tqd->t, NULL, GNUNET_YES,
1271                            NULL != tqd->tq ? tqd->tq->cont : NULL,
1272                            NULL != tqd->tq ? tqd->tq->cont_cls : NULL,
1273                            tqd->tq);
1274     unqueue_data (tqd);
1275   }
1276   LOG (GNUNET_ERROR_TYPE_DEBUG, "GCT_send_queued_data end\n", GCP_2s (t->peer));
1277 }
1278
1279
1280 /**
1281  * Sends key exchange message on a tunnel, choosing the best connection.
1282  * Should not be called on loopback tunnels.
1283  *
1284  * @param t Tunnel on which this message is transmitted.
1285  * @param message Message to send. Function modifies it.
1286  */
1287 static void
1288 send_kx (struct CadetTunnel *t,
1289          const struct GNUNET_MessageHeader *message)
1290 {
1291   struct CadetConnection *c;
1292   struct GNUNET_CADET_KX *msg;
1293   size_t size = ntohs (message->size);
1294   char cbuf[sizeof (struct GNUNET_CADET_KX) + size];
1295   uint16_t type;
1296   int fwd;
1297
1298   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT KX on Tunnel %s\n", GCT_2s (t));
1299
1300   /* Avoid loopback. */
1301   if (GCT_is_loopback (t))
1302   {
1303     LOG (GNUNET_ERROR_TYPE_DEBUG, "  loopback!\n");
1304     GNUNET_break (0);
1305     return;
1306   }
1307   type = ntohs (message->type);
1308
1309   /* Even if tunnel is being destroyed, send anyway.
1310    * Could be a response to a rekey initiated by remote peer,
1311    * who is trying to create a new channel!
1312    */
1313
1314   /* Must have a connection, or be looking for one. */
1315   if (NULL == t->connection_head)
1316   {
1317     if (CADET_TUNNEL_SEARCHING != t->cstate)
1318     {
1319       LOG (GNUNET_ERROR_TYPE_ERROR, "\n\n\n");
1320       GNUNET_break (0);
1321       LOG (GNUNET_ERROR_TYPE_ERROR, "no connection, sending %s\n", GC_m2s (type));
1322       GCT_debug (t, GNUNET_ERROR_TYPE_ERROR);
1323       GCP_debug (t->peer, GNUNET_ERROR_TYPE_ERROR);
1324       LOG (GNUNET_ERROR_TYPE_ERROR, "\n\n\n");
1325     }
1326     return;
1327   }
1328
1329   msg = (struct GNUNET_CADET_KX *) cbuf;
1330   msg->header.type = htons (GNUNET_MESSAGE_TYPE_CADET_KX);
1331   msg->header.size = htons (sizeof (struct GNUNET_CADET_KX) + size);
1332   c = tunnel_get_connection (t);
1333   if (NULL == c)
1334   {
1335     if (GNUNET_SCHEDULER_NO_TASK == t->destroy_task
1336         && CADET_TUNNEL_READY == t->cstate)
1337     {
1338       GNUNET_break (0);
1339       GCT_debug (t, GNUNET_ERROR_TYPE_ERROR);
1340     }
1341     return;
1342   }
1343   switch (type)
1344   {
1345     case GNUNET_MESSAGE_TYPE_CADET_KX_EPHEMERAL:
1346     case GNUNET_MESSAGE_TYPE_CADET_KX_PING:
1347     case GNUNET_MESSAGE_TYPE_CADET_KX_PONG:
1348       memcpy (&msg[1], message, size);
1349       break;
1350     default:
1351       LOG (GNUNET_ERROR_TYPE_DEBUG, "unkown type %s\n",
1352            GC_m2s (type));
1353       GNUNET_break (0);
1354   }
1355
1356   fwd = GCC_is_origin (t->connection_head->c, GNUNET_YES);
1357   /* TODO save handle and cancel in case of a unneeded retransmission */
1358   GNUNET_assert (NULL == GCC_send_prebuilt_message (&msg->header, type, 0, c,
1359                                                     fwd, GNUNET_YES,
1360                                                     NULL, NULL));
1361 }
1362
1363
1364 /**
1365  * Send the ephemeral key on a tunnel.
1366  *
1367  * @param t Tunnel on which to send the key.
1368  */
1369 static void
1370 send_ephemeral (struct CadetTunnel *t)
1371 {
1372   LOG (GNUNET_ERROR_TYPE_INFO, "===> EPHM for %s\n", GCT_2s (t));
1373
1374   kx_msg.sender_status = htonl (t->estate);
1375   send_kx (t, &kx_msg.header);
1376 }
1377
1378 /**
1379  * Send a ping message on a tunnel.
1380  *
1381  * @param t Tunnel on which to send the ping.
1382  */
1383 static void
1384 send_ping (struct CadetTunnel *t)
1385 {
1386   struct GNUNET_CADET_KX_Ping msg;
1387
1388   LOG (GNUNET_ERROR_TYPE_INFO, "===> PING for %s\n", GCT_2s (t));
1389   msg.header.size = htons (sizeof (msg));
1390   msg.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_KX_PING);
1391   msg.iv = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX);
1392   msg.target = *GCP_get_id (t->peer);
1393   msg.nonce = t->kx_ctx->challenge;
1394
1395   LOG (GNUNET_ERROR_TYPE_DEBUG, "  sending %u\n", msg.nonce);
1396   LOG (GNUNET_ERROR_TYPE_DEBUG, "  towards %s\n", GNUNET_i2s (&msg.target));
1397   t_encrypt (t, &msg.target, &msg.target,
1398              ping_encryption_size(), msg.iv, GNUNET_YES);
1399   LOG (GNUNET_ERROR_TYPE_DEBUG, "  e sending %u\n", msg.nonce);
1400   LOG (GNUNET_ERROR_TYPE_DEBUG, "  e towards %s\n", GNUNET_i2s (&msg.target));
1401
1402   send_kx (t, &msg.header);
1403 }
1404
1405
1406 /**
1407  * Send a pong message on a tunnel.
1408  *d_
1409  * @param t Tunnel on which to send the pong.
1410  * @param challenge Value sent in the ping that we have to send back.
1411  */
1412 static void
1413 send_pong (struct CadetTunnel *t, uint32_t challenge)
1414 {
1415   struct GNUNET_CADET_KX_Pong msg;
1416
1417   LOG (GNUNET_ERROR_TYPE_INFO, "===> PONG for %s\n", GCT_2s (t));
1418   msg.header.size = htons (sizeof (msg));
1419   msg.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_KX_PONG);
1420   msg.iv = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX);
1421   msg.nonce = challenge;
1422   LOG (GNUNET_ERROR_TYPE_DEBUG, "  sending %u\n", msg.nonce);
1423   t_encrypt (t, &msg.nonce, &msg.nonce,
1424              sizeof (msg.nonce), msg.iv, GNUNET_YES);
1425   LOG (GNUNET_ERROR_TYPE_DEBUG, "  e sending %u\n", msg.nonce);
1426
1427   send_kx (t, &msg.header);
1428 }
1429
1430
1431 /**
1432  * Initiate a rekey with the remote peer.
1433  *
1434  * @param cls Closure (tunnel).
1435  * @param tc TaskContext.
1436  */
1437 static void
1438 rekey_tunnel (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1439 {
1440   struct CadetTunnel *t = cls;
1441
1442   t->rekey_task = GNUNET_SCHEDULER_NO_TASK;
1443
1444   LOG (GNUNET_ERROR_TYPE_INFO, "Re-key Tunnel %s\n", GCT_2s (t));
1445   if (NULL != tc && 0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
1446     return;
1447
1448   create_kx_ctx (t);
1449
1450   if (NULL == t->kx_ctx)
1451   {
1452     create_keys (t);
1453   }
1454   else
1455   {
1456     struct GNUNET_TIME_Relative duration;
1457
1458     duration = GNUNET_TIME_absolute_get_duration (t->kx_ctx->rekey_start_time);
1459     LOG (GNUNET_ERROR_TYPE_DEBUG, " kx started %s ago\n",
1460          GNUNET_STRINGS_relative_time_to_string (duration, GNUNET_YES));
1461
1462     // FIXME make duration of old keys configurable
1463     if (duration.rel_value_us >= GNUNET_TIME_UNIT_MINUTES.rel_value_us)
1464     {
1465       LOG (GNUNET_ERROR_TYPE_DEBUG, " deleting old keys\n");
1466       memset (&t->kx_ctx->d_key_old, 0, sizeof (t->kx_ctx->d_key_old));
1467       memset (&t->kx_ctx->e_key_old, 0, sizeof (t->kx_ctx->e_key_old));
1468     }
1469   }
1470
1471   send_ephemeral (t);
1472
1473   switch (t->estate)
1474   {
1475     case CADET_TUNNEL_KEY_UNINITIALIZED:
1476       GCT_change_estate (t, CADET_TUNNEL_KEY_SENT);
1477       break;
1478     case CADET_TUNNEL_KEY_SENT:
1479       break;
1480     case CADET_TUNNEL_KEY_OK:
1481       GCT_change_estate (t, CADET_TUNNEL_KEY_REKEY);
1482       /* fall-thru */
1483     case CADET_TUNNEL_KEY_PING:
1484     case CADET_TUNNEL_KEY_REKEY:
1485       send_ping (t);
1486       break;
1487     default:
1488       LOG (GNUNET_ERROR_TYPE_DEBUG, "Unexpected state %u\n", t->estate);
1489   }
1490
1491   // FIXME exponential backoff
1492   struct GNUNET_TIME_Relative delay;
1493
1494   delay = GNUNET_TIME_relative_divide (rekey_period, 16);
1495   delay = GNUNET_TIME_relative_min (delay, REKEY_WAIT);
1496   LOG (GNUNET_ERROR_TYPE_DEBUG, "  next call in %s\n",
1497        GNUNET_STRINGS_relative_time_to_string (delay, GNUNET_YES));
1498   t->rekey_task = GNUNET_SCHEDULER_add_delayed (delay, &rekey_tunnel, t);
1499 }
1500
1501
1502 /**
1503  * Our ephemeral key has changed, create new session key on all tunnels.
1504  *
1505  * Each tunnel will start the Key Exchange with a random delay between
1506  * 0 and number_of_tunnels*100 milliseconds, so there are 10 key exchanges
1507  * per second, on average.
1508  *
1509  * @param cls Closure (size of the hashmap).
1510  * @param key Current public key.
1511  * @param value Value in the hash map (tunnel).
1512  *
1513  * @return #GNUNET_YES, so we should continue to iterate,
1514  */
1515 static int
1516 rekey_iterator (void *cls,
1517                 const struct GNUNET_PeerIdentity *key,
1518                 void *value)
1519 {
1520   struct CadetTunnel *t = value;
1521   struct GNUNET_TIME_Relative delay;
1522   long n = (long) cls;
1523   uint32_t r;
1524
1525   if (GNUNET_SCHEDULER_NO_TASK != t->rekey_task)
1526     return GNUNET_YES;
1527
1528   if (GNUNET_YES == GCT_is_loopback (t))
1529     return GNUNET_YES;
1530
1531   r = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, (uint32_t) n * 100);
1532   delay = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, r);
1533   t->rekey_task = GNUNET_SCHEDULER_add_delayed (delay, &rekey_tunnel, t);
1534
1535   return GNUNET_YES;
1536 }
1537
1538
1539 /**
1540  * Create a new ephemeral key and key message, schedule next rekeying.
1541  *
1542  * @param cls Closure (unused).
1543  * @param tc TaskContext.
1544  */
1545 static void
1546 rekey (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1547 {
1548   struct GNUNET_TIME_Absolute time;
1549   long n;
1550
1551   rekey_task = GNUNET_SCHEDULER_NO_TASK;
1552
1553   if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
1554     return;
1555
1556   GNUNET_free_non_null (my_ephemeral_key);
1557   my_ephemeral_key = GNUNET_CRYPTO_ecdhe_key_create ();
1558
1559   time = GNUNET_TIME_absolute_get ();
1560   kx_msg.creation_time = GNUNET_TIME_absolute_hton (time);
1561   time = GNUNET_TIME_absolute_add (time, rekey_period);
1562   time = GNUNET_TIME_absolute_add (time, GNUNET_TIME_UNIT_MINUTES);
1563   kx_msg.expiration_time = GNUNET_TIME_absolute_hton (time);
1564   GNUNET_CRYPTO_ecdhe_key_get_public (my_ephemeral_key, &kx_msg.ephemeral_key);
1565   LOG (GNUNET_ERROR_TYPE_INFO, "GLOBAL RE-KEY, NEW EPHM: %s\n",
1566        GNUNET_h2s ((struct GNUNET_HashCode *) &kx_msg.ephemeral_key));
1567
1568   GNUNET_assert (GNUNET_OK ==
1569                  GNUNET_CRYPTO_eddsa_sign (my_private_key,
1570                                            &kx_msg.purpose,
1571                                            &kx_msg.signature));
1572
1573   n = (long) GNUNET_CONTAINER_multipeermap_size (tunnels);
1574   GNUNET_CONTAINER_multipeermap_iterate (tunnels, &rekey_iterator, (void *) n);
1575
1576   rekey_task = GNUNET_SCHEDULER_add_delayed (rekey_period, &rekey, NULL);
1577 }
1578
1579
1580 /**
1581  * Called only on shutdown, destroy every tunnel.
1582  *
1583  * @param cls Closure (unused).
1584  * @param key Current public key.
1585  * @param value Value in the hash map (tunnel).
1586  *
1587  * @return #GNUNET_YES, so we should continue to iterate,
1588  */
1589 static int
1590 destroy_iterator (void *cls,
1591                 const struct GNUNET_PeerIdentity *key,
1592                 void *value)
1593 {
1594   struct CadetTunnel *t = value;
1595
1596   LOG (GNUNET_ERROR_TYPE_DEBUG, "GCT_shutdown destroying tunnel at %p\n", t);
1597   GCT_destroy (t);
1598   return GNUNET_YES;
1599 }
1600
1601
1602 /**
1603  * Notify remote peer that we don't know a channel he is talking about,
1604  * probably CHANNEL_DESTROY was missed.
1605  *
1606  * @param t Tunnel on which to notify.
1607  * @param gid ID of the channel.
1608  */
1609 static void
1610 send_channel_destroy (struct CadetTunnel *t, unsigned int gid)
1611 {
1612   struct GNUNET_CADET_ChannelManage msg;
1613
1614   msg.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY);
1615   msg.header.size = htons (sizeof (msg));
1616   msg.chid = htonl (gid);
1617
1618   LOG (GNUNET_ERROR_TYPE_DEBUG,
1619        "WARNING destroying unknown channel %u on tunnel %s\n",
1620        gid, GCT_2s (t));
1621   send_prebuilt_message (&msg.header, t, NULL, GNUNET_YES, NULL, NULL, NULL);
1622 }
1623
1624
1625 /**
1626  * Demultiplex data per channel and call appropriate channel handler.
1627  *
1628  * @param t Tunnel on which the data came.
1629  * @param msg Data message.
1630  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
1631  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
1632  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
1633  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
1634  */
1635 static void
1636 handle_data (struct CadetTunnel *t,
1637              const struct GNUNET_CADET_Data *msg,
1638              int fwd)
1639 {
1640   struct CadetChannel *ch;
1641   size_t size;
1642
1643   /* Check size */
1644   size = ntohs (msg->header.size);
1645   if (size <
1646       sizeof (struct GNUNET_CADET_Data) +
1647       sizeof (struct GNUNET_MessageHeader))
1648   {
1649     GNUNET_break (0);
1650     return;
1651   }
1652   LOG (GNUNET_ERROR_TYPE_DEBUG, " payload of type %s\n",
1653               GC_m2s (ntohs (msg[1].header.type)));
1654
1655   /* Check channel */
1656   ch = GCT_get_channel (t, ntohl (msg->chid));
1657   if (NULL == ch)
1658   {
1659     GNUNET_STATISTICS_update (stats, "# data on unknown channel",
1660                               1, GNUNET_NO);
1661     LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING channel 0x%X unknown\n",
1662          ntohl (msg->chid));
1663     send_channel_destroy (t, ntohl (msg->chid));
1664     return;
1665   }
1666
1667   GCCH_handle_data (ch, msg, fwd);
1668 }
1669
1670
1671 /**
1672  * Demultiplex data ACKs per channel and update appropriate channel buffer info.
1673  *
1674  * @param t Tunnel on which the DATA ACK came.
1675  * @param msg DATA ACK message.
1676  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
1677  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
1678  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
1679  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
1680  */
1681 static void
1682 handle_data_ack (struct CadetTunnel *t,
1683                  const struct GNUNET_CADET_DataACK *msg,
1684                  int fwd)
1685 {
1686   struct CadetChannel *ch;
1687   size_t size;
1688
1689   /* Check size */
1690   size = ntohs (msg->header.size);
1691   if (size != sizeof (struct GNUNET_CADET_DataACK))
1692   {
1693     GNUNET_break (0);
1694     return;
1695   }
1696
1697   /* Check channel */
1698   ch = GCT_get_channel (t, ntohl (msg->chid));
1699   if (NULL == ch)
1700   {
1701     GNUNET_STATISTICS_update (stats, "# data ack on unknown channel",
1702                               1, GNUNET_NO);
1703     LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING channel %u unknown\n",
1704          ntohl (msg->chid));
1705     return;
1706   }
1707
1708   GCCH_handle_data_ack (ch, msg, fwd);
1709 }
1710
1711
1712 /**
1713  * Handle channel create.
1714  *
1715  * @param t Tunnel on which the data came.
1716  * @param msg Data message.
1717  */
1718 static void
1719 handle_ch_create (struct CadetTunnel *t,
1720                   const struct GNUNET_CADET_ChannelCreate *msg)
1721 {
1722   struct CadetChannel *ch;
1723   size_t size;
1724
1725   /* Check size */
1726   size = ntohs (msg->header.size);
1727   if (size != sizeof (struct GNUNET_CADET_ChannelCreate))
1728   {
1729     GNUNET_break (0);
1730     return;
1731   }
1732
1733   /* Check channel */
1734   ch = GCT_get_channel (t, ntohl (msg->chid));
1735   if (NULL != ch && ! GCT_is_loopback (t))
1736   {
1737     /* Probably a retransmission, safe to ignore */
1738     LOG (GNUNET_ERROR_TYPE_DEBUG, "   already exists...\n");
1739   }
1740   ch = GCCH_handle_create (t, msg);
1741   if (NULL != ch)
1742     GCT_add_channel (t, ch);
1743 }
1744
1745
1746
1747 /**
1748  * Handle channel NACK: check correctness and call channel handler for NACKs.
1749  *
1750  * @param t Tunnel on which the NACK came.
1751  * @param msg NACK message.
1752  */
1753 static void
1754 handle_ch_nack (struct CadetTunnel *t,
1755                 const struct GNUNET_CADET_ChannelManage *msg)
1756 {
1757   struct CadetChannel *ch;
1758   size_t size;
1759
1760   /* Check size */
1761   size = ntohs (msg->header.size);
1762   if (size != sizeof (struct GNUNET_CADET_ChannelManage))
1763   {
1764     GNUNET_break (0);
1765     return;
1766   }
1767
1768   /* Check channel */
1769   ch = GCT_get_channel (t, ntohl (msg->chid));
1770   if (NULL == ch)
1771   {
1772     GNUNET_STATISTICS_update (stats, "# channel NACK on unknown channel",
1773                               1, GNUNET_NO);
1774     LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING channel %u unknown\n",
1775          ntohl (msg->chid));
1776     return;
1777   }
1778
1779   GCCH_handle_nack (ch);
1780 }
1781
1782
1783 /**
1784  * Handle a CHANNEL ACK (SYNACK/ACK).
1785  *
1786  * @param t Tunnel on which the CHANNEL ACK came.
1787  * @param msg CHANNEL ACK message.
1788  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
1789  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
1790  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
1791  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
1792  */
1793 static void
1794 handle_ch_ack (struct CadetTunnel *t,
1795                const struct GNUNET_CADET_ChannelManage *msg,
1796                int fwd)
1797 {
1798   struct CadetChannel *ch;
1799   size_t size;
1800
1801   /* Check size */
1802   size = ntohs (msg->header.size);
1803   if (size != sizeof (struct GNUNET_CADET_ChannelManage))
1804   {
1805     GNUNET_break (0);
1806     return;
1807   }
1808
1809   /* Check channel */
1810   ch = GCT_get_channel (t, ntohl (msg->chid));
1811   if (NULL == ch)
1812   {
1813     GNUNET_STATISTICS_update (stats, "# channel ack on unknown channel",
1814                               1, GNUNET_NO);
1815     LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING channel %u unknown\n",
1816          ntohl (msg->chid));
1817     return;
1818   }
1819
1820   GCCH_handle_ack (ch, msg, fwd);
1821 }
1822
1823
1824 /**
1825  * Handle a channel destruction message.
1826  *
1827  * @param t Tunnel on which the message came.
1828  * @param msg Channel destroy message.
1829  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
1830  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
1831  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
1832  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
1833  */
1834 static void
1835 handle_ch_destroy (struct CadetTunnel *t,
1836                    const struct GNUNET_CADET_ChannelManage *msg,
1837                    int fwd)
1838 {
1839   struct CadetChannel *ch;
1840   size_t size;
1841
1842   /* Check size */
1843   size = ntohs (msg->header.size);
1844   if (size != sizeof (struct GNUNET_CADET_ChannelManage))
1845   {
1846     GNUNET_break (0);
1847     return;
1848   }
1849
1850   /* Check channel */
1851   ch = GCT_get_channel (t, ntohl (msg->chid));
1852   if (NULL == ch)
1853   {
1854     /* Probably a retransmission, safe to ignore */
1855     return;
1856   }
1857
1858   GCCH_handle_destroy (ch, msg, fwd);
1859 }
1860
1861
1862 /**
1863  * The peer's ephemeral key has changed: update the symmetrical keys.
1864  *
1865  * @param t Tunnel this message came on.
1866  * @param msg Key eXchange message.
1867  */
1868 static void
1869 handle_ephemeral (struct CadetTunnel *t,
1870                   const struct GNUNET_CADET_KX_Ephemeral *msg)
1871 {
1872   LOG (GNUNET_ERROR_TYPE_INFO, "<=== EPHM for %s\n", GCT_2s (t));
1873
1874   if (GNUNET_OK != check_ephemeral (t, msg))
1875   {
1876     GNUNET_break_op (0);
1877     return;
1878   }
1879
1880   /**
1881    * If the key is different from what we know, derive the new E/D keys.
1882    * Else destroy the rekey ctx (duplicate EPHM after successful KX).
1883    */
1884   if (0 != memcmp (&t->peers_ephemeral_key, &msg->ephemeral_key,
1885                    sizeof (msg->ephemeral_key)))
1886   {
1887     #if DUMP_KEYS_TO_STDERR
1888     LOG (GNUNET_ERROR_TYPE_INFO, "OLD: %s\n",
1889          GNUNET_h2s ((struct GNUNET_HashCode *) &t->peers_ephemeral_key));
1890     LOG (GNUNET_ERROR_TYPE_INFO, "NEW: %s\n",
1891          GNUNET_h2s ((struct GNUNET_HashCode *) &msg->ephemeral_key));
1892     #endif
1893     t->peers_ephemeral_key = msg->ephemeral_key;
1894     create_kx_ctx (t);
1895     create_keys (t);
1896     if (CADET_TUNNEL_KEY_OK == t->estate)
1897     {
1898       GCT_change_estate (t, CADET_TUNNEL_KEY_REKEY);
1899     }
1900     if (GNUNET_SCHEDULER_NO_TASK != t->rekey_task)
1901       GNUNET_SCHEDULER_cancel (t->rekey_task);
1902     t->rekey_task = GNUNET_SCHEDULER_add_now (rekey_tunnel, t);
1903   }
1904   if (CADET_TUNNEL_KEY_SENT == t->estate)
1905   {
1906     LOG (GNUNET_ERROR_TYPE_DEBUG, "  our key was sent, sending ping\n");
1907     send_ping (t);
1908     GCT_change_estate (t, CADET_TUNNEL_KEY_PING);
1909   }
1910 }
1911
1912
1913 /**
1914  * Peer wants to check our symmetrical keys by sending an encrypted challenge.
1915  * Answer with by retransmitting the challenge with the "opposite" key.
1916  *
1917  * @param t Tunnel this message came on.
1918  * @param msg Key eXchange Ping message.
1919  */
1920 static void
1921 handle_ping (struct CadetTunnel *t,
1922              const struct GNUNET_CADET_KX_Ping *msg)
1923 {
1924   struct GNUNET_CADET_KX_Ping res;
1925
1926   if (ntohs (msg->header.size) != sizeof (res))
1927   {
1928     GNUNET_break_op (0);
1929     return;
1930   }
1931
1932   LOG (GNUNET_ERROR_TYPE_INFO, "<=== PING for %s\n", GCT_2s (t));
1933   t_decrypt (t, &res.target, &msg->target, ping_encryption_size (), msg->iv);
1934   if (0 != memcmp (&my_full_id, &res.target, sizeof (my_full_id)))
1935   {
1936     /* probably peer hasn't got our new EPHM yet and derived the wrong keys */
1937     GNUNET_STATISTICS_update (stats, "# malformed PINGs", 1, GNUNET_NO);
1938     LOG (GNUNET_ERROR_TYPE_INFO, "  malformed PING on %s\n", GCT_2s (t));
1939     LOG (GNUNET_ERROR_TYPE_DEBUG, "  e got %u\n", msg->nonce);
1940     LOG (GNUNET_ERROR_TYPE_DEBUG, "  e towards %s\n", GNUNET_i2s (&msg->target));
1941     LOG (GNUNET_ERROR_TYPE_DEBUG, "  got %u\n", res.nonce);
1942     LOG (GNUNET_ERROR_TYPE_DEBUG, "  towards %s\n", GNUNET_i2s (&res.target));
1943     create_kx_ctx (t);
1944     send_ephemeral (t);
1945     send_ping (t);
1946     return;
1947   }
1948
1949   send_pong (t, res.nonce);
1950 }
1951
1952
1953 /**
1954  * Peer has answer to our challenge.
1955  * If answer is successful, consider the key exchange finished and clean
1956  * up all related state.
1957  *
1958  * @param t Tunnel this message came on.
1959  * @param msg Key eXchange Pong message.
1960  */
1961 static void
1962 handle_pong (struct CadetTunnel *t,
1963              const struct GNUNET_CADET_KX_Pong *msg)
1964 {
1965   uint32_t challenge;
1966
1967   LOG (GNUNET_ERROR_TYPE_INFO, "<=== PONG for %s\n", GCT_2s (t));
1968   if (GNUNET_SCHEDULER_NO_TASK == t->rekey_task)
1969   {
1970     GNUNET_STATISTICS_update (stats, "# duplicate PONG messages", 1, GNUNET_NO);
1971     return;
1972   }
1973   t_decrypt (t, &challenge, &msg->nonce, sizeof (uint32_t), msg->iv);
1974
1975   if (challenge != t->kx_ctx->challenge)
1976   {
1977     LOG (GNUNET_ERROR_TYPE_WARNING, "Wrong PONG challenge on %s\n", GCT_2s (t));
1978     LOG (GNUNET_ERROR_TYPE_DEBUG, "PONG: %u (e: %u). Expected: %u.\n",
1979          challenge, msg->nonce, t->kx_ctx->challenge);
1980     send_ephemeral (t);
1981     send_ping (t);
1982     return;
1983   }
1984   GNUNET_SCHEDULER_cancel (t->rekey_task);
1985   t->rekey_task = GNUNET_SCHEDULER_NO_TASK;
1986
1987   /* Don't free the old keys right away, but after a delay.
1988    * Rationale: the KX could have happened over a very fast connection,
1989    * with payload traffic still signed with the old key stuck in a slower
1990    * connection.
1991    * Don't keep the keys longer than 1/4 the rekey period, and no longer than
1992    * one minute.
1993    */
1994   destroy_kx_ctx (t);
1995   GCT_change_estate (t, CADET_TUNNEL_KEY_OK);
1996 }
1997
1998
1999 /**
2000  * Demultiplex by message type and call appropriate handler for a message
2001  * towards a channel of a local tunnel.
2002  *
2003  * @param t Tunnel this message came on.
2004  * @param msgh Message header.
2005  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
2006  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
2007  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
2008  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
2009  */
2010 static void
2011 handle_decrypted (struct CadetTunnel *t,
2012                   const struct GNUNET_MessageHeader *msgh,
2013                   int fwd)
2014 {
2015   uint16_t type;
2016
2017   type = ntohs (msgh->type);
2018   LOG (GNUNET_ERROR_TYPE_INFO, "<=== %s on %s\n", GC_m2s (type), GCT_2s (t));
2019
2020   switch (type)
2021   {
2022     case GNUNET_MESSAGE_TYPE_CADET_KEEPALIVE:
2023       /* Do nothing, connection aleady got updated. */
2024       GNUNET_STATISTICS_update (stats, "# keepalives received", 1, GNUNET_NO);
2025       break;
2026
2027     case GNUNET_MESSAGE_TYPE_CADET_DATA:
2028       /* Don't send hop ACK, wait for client to ACK */
2029       handle_data (t, (struct GNUNET_CADET_Data *) msgh, fwd);
2030       break;
2031
2032     case GNUNET_MESSAGE_TYPE_CADET_DATA_ACK:
2033       handle_data_ack (t, (struct GNUNET_CADET_DataACK *) msgh, fwd);
2034       break;
2035
2036     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE:
2037       handle_ch_create (t,
2038                         (struct GNUNET_CADET_ChannelCreate *) msgh);
2039       break;
2040
2041     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_NACK:
2042       handle_ch_nack (t,
2043                       (struct GNUNET_CADET_ChannelManage *) msgh);
2044       break;
2045
2046     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_ACK:
2047       handle_ch_ack (t,
2048                      (struct GNUNET_CADET_ChannelManage *) msgh,
2049                      fwd);
2050       break;
2051
2052     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY:
2053       handle_ch_destroy (t,
2054                          (struct GNUNET_CADET_ChannelManage *) msgh,
2055                          fwd);
2056       break;
2057
2058     default:
2059       GNUNET_break_op (0);
2060       LOG (GNUNET_ERROR_TYPE_WARNING,
2061            "end-to-end message not known (%u)\n",
2062            ntohs (msgh->type));
2063       GCT_debug (t, GNUNET_ERROR_TYPE_WARNING);
2064   }
2065 }
2066
2067 /******************************************************************************/
2068 /********************************    API    ***********************************/
2069 /******************************************************************************/
2070
2071 /**
2072  * Decrypt and demultiplex by message type. Call appropriate handler
2073  * for every message.
2074  *
2075  * @param t Tunnel this message came on.
2076  * @param msg Encrypted message.
2077  */
2078 void
2079 GCT_handle_encrypted (struct CadetTunnel *t,
2080                       const struct GNUNET_CADET_Encrypted *msg)
2081 {
2082   size_t size = ntohs (msg->header.size);
2083   size_t payload_size = size - sizeof (struct GNUNET_CADET_Encrypted);
2084   int decrypted_size;
2085   char cbuf [payload_size];
2086   struct GNUNET_MessageHeader *msgh;
2087   unsigned int off;
2088
2089   decrypted_size = t_decrypt_and_validate (t, cbuf, &msg[1], payload_size,
2090                                            msg->iv, &msg->hmac);
2091
2092   if (-1 == decrypted_size)
2093   {
2094     GNUNET_break_op (0);
2095     return;
2096   }
2097
2098   off = 0;
2099   while (off < decrypted_size)
2100   {
2101     uint16_t msize;
2102
2103     msgh = (struct GNUNET_MessageHeader *) &cbuf[off];
2104     msize = ntohs (msgh->size);
2105     if (msize < sizeof (struct GNUNET_MessageHeader))
2106     {
2107       GNUNET_break_op (0);
2108       return;
2109     }
2110     handle_decrypted (t, msgh, GNUNET_SYSERR);
2111     off += msize;
2112   }
2113 }
2114
2115
2116 /**
2117  * Demultiplex an encapsulated KX message by message type.
2118  *
2119  * @param t Tunnel on which the message came.
2120  * @param message Payload of KX message.
2121  */
2122 void
2123 GCT_handle_kx (struct CadetTunnel *t,
2124                const struct GNUNET_MessageHeader *message)
2125 {
2126   uint16_t type;
2127
2128   type = ntohs (message->type);
2129   LOG (GNUNET_ERROR_TYPE_DEBUG, "kx message received\n", type);
2130   switch (type)
2131   {
2132     case GNUNET_MESSAGE_TYPE_CADET_KX_EPHEMERAL:
2133       handle_ephemeral (t, (struct GNUNET_CADET_KX_Ephemeral *) message);
2134       break;
2135
2136     case GNUNET_MESSAGE_TYPE_CADET_KX_PING:
2137       handle_ping (t, (struct GNUNET_CADET_KX_Ping *) message);
2138       break;
2139
2140     case GNUNET_MESSAGE_TYPE_CADET_KX_PONG:
2141       handle_pong (t, (struct GNUNET_CADET_KX_Pong *) message);
2142       break;
2143
2144     default:
2145       GNUNET_break_op (0);
2146       LOG (GNUNET_ERROR_TYPE_DEBUG, "kx message not known (%u)\n", type);
2147   }
2148 }
2149
2150
2151 /**
2152  * Initialize the tunnel subsystem.
2153  *
2154  * @param c Configuration handle.
2155  * @param key ECC private key, to derive all other keys and do crypto.
2156  */
2157 void
2158 GCT_init (const struct GNUNET_CONFIGURATION_Handle *c,
2159           const struct GNUNET_CRYPTO_EddsaPrivateKey *key)
2160 {
2161   int expected_overhead;
2162
2163   LOG (GNUNET_ERROR_TYPE_DEBUG, "init\n");
2164
2165   expected_overhead =
2166     sizeof (struct GNUNET_CADET_Encrypted) + sizeof (struct GNUNET_CADET_Data);
2167   GNUNET_assert (GNUNET_CONSTANTS_CADET_P2P_OVERHEAD == expected_overhead);
2168
2169   if (GNUNET_OK !=
2170       GNUNET_CONFIGURATION_get_value_number (c, "CADET", "DEFAULT_TTL",
2171                                              &default_ttl))
2172   {
2173     GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_WARNING,
2174                                "CADET", "DEFAULT_TTL", "USING DEFAULT");
2175     default_ttl = 64;
2176   }
2177   if (GNUNET_OK !=
2178       GNUNET_CONFIGURATION_get_value_time (c, "CADET", "REKEY_PERIOD",
2179                                            &rekey_period))
2180   {
2181     rekey_period = GNUNET_TIME_UNIT_DAYS;
2182   }
2183
2184   my_private_key = key;
2185   kx_msg.header.size = htons (sizeof (kx_msg));
2186   kx_msg.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_KX_EPHEMERAL);
2187   kx_msg.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CADET_KX);
2188   kx_msg.purpose.size = htonl (ephemeral_purpose_size ());
2189   kx_msg.origin_identity = my_full_id;
2190   rekey_task = GNUNET_SCHEDULER_add_now (&rekey, NULL);
2191
2192   tunnels = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_YES);
2193 }
2194
2195
2196 /**
2197  * Shut down the tunnel subsystem.
2198  */
2199 void
2200 GCT_shutdown (void)
2201 {
2202   if (GNUNET_SCHEDULER_NO_TASK != rekey_task)
2203   {
2204     GNUNET_SCHEDULER_cancel (rekey_task);
2205     rekey_task = GNUNET_SCHEDULER_NO_TASK;
2206   }
2207   GNUNET_CONTAINER_multipeermap_iterate (tunnels, &destroy_iterator, NULL);
2208   GNUNET_CONTAINER_multipeermap_destroy (tunnels);
2209 }
2210
2211
2212 /**
2213  * Create a tunnel.
2214  *
2215  * @param destination Peer this tunnel is towards.
2216  */
2217 struct CadetTunnel *
2218 GCT_new (struct CadetPeer *destination)
2219 {
2220   struct CadetTunnel *t;
2221
2222   t = GNUNET_new (struct CadetTunnel);
2223   t->next_chid = 0;
2224   t->peer = destination;
2225
2226   if (GNUNET_OK !=
2227       GNUNET_CONTAINER_multipeermap_put (tunnels, GCP_get_id (destination), t,
2228                                          GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
2229   {
2230     GNUNET_break (0);
2231     GNUNET_free (t);
2232     return NULL;
2233   }
2234   return t;
2235 }
2236
2237
2238 /**
2239  * Change the tunnel's connection state.
2240  *
2241  * @param t Tunnel whose connection state to change.
2242  * @param cstate New connection state.
2243  */
2244 void
2245 GCT_change_cstate (struct CadetTunnel* t, enum CadetTunnelCState cstate)
2246 {
2247   if (NULL == t)
2248     return;
2249   LOG (GNUNET_ERROR_TYPE_DEBUG, "Tunnel %s cstate %s => %s\n",
2250        GCP_2s (t->peer), cstate2s (t->cstate), cstate2s (cstate));
2251   if (myid != GCP_get_short_id (t->peer) &&
2252       CADET_TUNNEL_READY != t->cstate &&
2253       CADET_TUNNEL_READY == cstate)
2254   {
2255     t->cstate = cstate;
2256     if (CADET_TUNNEL_KEY_OK == t->estate)
2257     {
2258       LOG (GNUNET_ERROR_TYPE_DEBUG, "  cstate triggered send queued data\n");
2259       send_queued_data (t);
2260     }
2261     else if (CADET_TUNNEL_KEY_UNINITIALIZED == t->estate)
2262     {
2263       LOG (GNUNET_ERROR_TYPE_DEBUG, "  cstate triggered rekey\n");
2264       if (GNUNET_SCHEDULER_NO_TASK != t->rekey_task)
2265         GNUNET_SCHEDULER_cancel (t->rekey_task);
2266       rekey_tunnel (t, NULL);
2267     }
2268   }
2269   t->cstate = cstate;
2270
2271   if (CADET_TUNNEL_READY == cstate
2272       && CONNECTIONS_PER_TUNNEL <= GCT_count_connections (t))
2273   {
2274     LOG (GNUNET_ERROR_TYPE_DEBUG, "  cstate triggered stop dht\n");
2275     GCP_stop_search (t->peer);
2276   }
2277 }
2278
2279
2280 /**
2281  * Change the tunnel encryption state.
2282  *
2283  * @param t Tunnel whose encryption state to change, or NULL.
2284  * @param state New encryption state.
2285  */
2286 void
2287 GCT_change_estate (struct CadetTunnel* t, enum CadetTunnelEState state)
2288 {
2289   if (NULL == t)
2290     return;
2291
2292   LOG (GNUNET_ERROR_TYPE_DEBUG, "Tunnel %s estate was %s\n",
2293        GCP_2s (t->peer), estate2s (t->estate));
2294   LOG (GNUNET_ERROR_TYPE_DEBUG, "Tunnel %s estate is now %s\n",
2295        GCP_2s (t->peer), estate2s (state));
2296
2297   /* Send queued data if enc state changes to OK */
2298   if (myid != GCP_get_short_id (t->peer) &&
2299       CADET_TUNNEL_KEY_OK != t->estate && CADET_TUNNEL_KEY_OK == state)
2300   {
2301     send_queued_data (t);
2302   }
2303
2304   t->estate = state;
2305 }
2306
2307
2308 /**
2309  * @brief Check if tunnel has too many connections, and remove one if necessary.
2310  *
2311  * Currently this means the newest connection, unless it is a direct one.
2312  * Implemented as a task to avoid freeing a connection that is in the middle
2313  * of being created/processed.
2314  *
2315  * @param cls Closure (Tunnel to check).
2316  * @param tc Task context.
2317  */
2318 static void
2319 trim_connections (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
2320 {
2321   struct CadetTunnel *t = cls;
2322
2323   t->trim_connections_task = GNUNET_SCHEDULER_NO_TASK;
2324
2325   if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
2326     return;
2327
2328   if (GCT_count_connections (t) > 2 * CONNECTIONS_PER_TUNNEL)
2329   {
2330     struct CadetTConnection *iter;
2331     struct CadetTConnection *c;
2332
2333     for (c = iter = t->connection_head; NULL != iter; iter = iter->next)
2334     {
2335       if ((NULL == c || iter->created.abs_value_us > c->created.abs_value_us)
2336           && GNUNET_NO == GCC_is_direct (iter->c))
2337       {
2338         c = iter;
2339       }
2340     }
2341     if (NULL != c)
2342     {
2343       LOG (GNUNET_ERROR_TYPE_DEBUG, "Too many connections on tunnel %s\n",
2344            GCT_2s (t));
2345       LOG (GNUNET_ERROR_TYPE_DEBUG, "Destroying connection %s\n",
2346            GCC_2s (c->c));
2347       GCC_destroy (c->c);
2348     }
2349     else
2350     {
2351       GNUNET_break (0);
2352     }
2353   }
2354 }
2355
2356
2357 /**
2358  * Add a connection to a tunnel.
2359  *
2360  * @param t Tunnel.
2361  * @param c Connection.
2362  */
2363 void
2364 GCT_add_connection (struct CadetTunnel *t, struct CadetConnection *c)
2365 {
2366   struct CadetTConnection *aux;
2367
2368   GNUNET_assert (NULL != c);
2369
2370   LOG (GNUNET_ERROR_TYPE_DEBUG, "add connection %s\n", GCC_2s (c));
2371   LOG (GNUNET_ERROR_TYPE_DEBUG, " to tunnel %s\n", GCT_2s (t));
2372   for (aux = t->connection_head; aux != NULL; aux = aux->next)
2373     if (aux->c == c)
2374       return;
2375
2376   aux = GNUNET_new (struct CadetTConnection);
2377   aux->c = c;
2378   aux->created = GNUNET_TIME_absolute_get ();
2379
2380   GNUNET_CONTAINER_DLL_insert (t->connection_head, t->connection_tail, aux);
2381
2382   if (CADET_TUNNEL_SEARCHING == t->cstate)
2383     GCT_change_estate (t, CADET_TUNNEL_WAITING);
2384
2385   if (GNUNET_SCHEDULER_NO_TASK != t->trim_connections_task)
2386     t->trim_connections_task = GNUNET_SCHEDULER_add_now (&trim_connections, t);
2387 }
2388
2389
2390 /**
2391  * Remove a connection from a tunnel.
2392  *
2393  * @param t Tunnel.
2394  * @param c Connection.
2395  */
2396 void
2397 GCT_remove_connection (struct CadetTunnel *t,
2398                        struct CadetConnection *c)
2399 {
2400   struct CadetTConnection *aux;
2401   struct CadetTConnection *next;
2402   unsigned int conns;
2403
2404   LOG (GNUNET_ERROR_TYPE_DEBUG, "Removing connection %s from tunnel %s\n",
2405        GCC_2s (c), GCT_2s (t));
2406   for (aux = t->connection_head; aux != NULL; aux = next)
2407   {
2408     next = aux->next;
2409     if (aux->c == c)
2410     {
2411       GNUNET_CONTAINER_DLL_remove (t->connection_head, t->connection_tail, aux);
2412       GNUNET_free (aux);
2413     }
2414   }
2415
2416   conns = GCT_count_connections (t);
2417   if (0 == conns
2418       && GNUNET_SCHEDULER_NO_TASK == t->destroy_task
2419       && CADET_TUNNEL_SHUTDOWN != t->cstate
2420       && GNUNET_NO == shutting_down)
2421   {
2422     if (0 == GCT_count_any_connections (t))
2423       GCT_change_cstate (t, CADET_TUNNEL_SEARCHING);
2424     else
2425       GCT_change_cstate (t, CADET_TUNNEL_WAITING);
2426   }
2427
2428   /* Start new connections if needed */
2429   if (CONNECTIONS_PER_TUNNEL > conns
2430       && GNUNET_SCHEDULER_NO_TASK == t->destroy_task
2431       && CADET_TUNNEL_SHUTDOWN != t->cstate
2432       && GNUNET_NO == shutting_down)
2433   {
2434     LOG (GNUNET_ERROR_TYPE_DEBUG, "  too few connections, getting new ones\n");
2435     GCP_connect (t->peer); /* Will change cstate to WAITING when possible */
2436     return;
2437   }
2438
2439   /* If not marked as ready, no change is needed */
2440   if (CADET_TUNNEL_READY != t->cstate)
2441     return;
2442
2443   /* Check if any connection is ready to maintain cstate */
2444   for (aux = t->connection_head; aux != NULL; aux = aux->next)
2445     if (CADET_CONNECTION_READY == GCC_get_state (aux->c))
2446       return;
2447 }
2448
2449
2450 /**
2451  * Add a channel to a tunnel.
2452  *
2453  * @param t Tunnel.
2454  * @param ch Channel.
2455  */
2456 void
2457 GCT_add_channel (struct CadetTunnel *t, struct CadetChannel *ch)
2458 {
2459   struct CadetTChannel *aux;
2460
2461   GNUNET_assert (NULL != ch);
2462
2463   LOG (GNUNET_ERROR_TYPE_DEBUG, "Adding channel %p to tunnel %p\n", ch, t);
2464
2465   for (aux = t->channel_head; aux != NULL; aux = aux->next)
2466   {
2467     LOG (GNUNET_ERROR_TYPE_DEBUG, "  already there %p\n", aux->ch);
2468     if (aux->ch == ch)
2469       return;
2470   }
2471
2472   aux = GNUNET_new (struct CadetTChannel);
2473   aux->ch = ch;
2474   LOG (GNUNET_ERROR_TYPE_DEBUG, " adding %p to %p\n", aux, t->channel_head);
2475   GNUNET_CONTAINER_DLL_insert_tail (t->channel_head, t->channel_tail, aux);
2476
2477   if (GNUNET_SCHEDULER_NO_TASK != t->destroy_task)
2478   {
2479     GNUNET_SCHEDULER_cancel (t->destroy_task);
2480     t->destroy_task = GNUNET_SCHEDULER_NO_TASK;
2481     LOG (GNUNET_ERROR_TYPE_DEBUG, " undo destroy!\n");
2482   }
2483 }
2484
2485
2486 /**
2487  * Remove a channel from a tunnel.
2488  *
2489  * @param t Tunnel.
2490  * @param ch Channel.
2491  */
2492 void
2493 GCT_remove_channel (struct CadetTunnel *t, struct CadetChannel *ch)
2494 {
2495   struct CadetTChannel *aux;
2496
2497   LOG (GNUNET_ERROR_TYPE_DEBUG, "Removing channel %p from tunnel %p\n", ch, t);
2498   for (aux = t->channel_head; aux != NULL; aux = aux->next)
2499   {
2500     if (aux->ch == ch)
2501     {
2502       LOG (GNUNET_ERROR_TYPE_DEBUG, " found! %s\n", GCCH_2s (ch));
2503       GNUNET_CONTAINER_DLL_remove (t->channel_head, t->channel_tail, aux);
2504       GNUNET_free (aux);
2505       return;
2506     }
2507   }
2508 }
2509
2510
2511 /**
2512  * Search for a channel by global ID.
2513  *
2514  * @param t Tunnel containing the channel.
2515  * @param chid Public channel number.
2516  *
2517  * @return channel handler, NULL if doesn't exist
2518  */
2519 struct CadetChannel *
2520 GCT_get_channel (struct CadetTunnel *t, CADET_ChannelNumber chid)
2521 {
2522   struct CadetTChannel *iter;
2523
2524   if (NULL == t)
2525     return NULL;
2526
2527   for (iter = t->channel_head; NULL != iter; iter = iter->next)
2528   {
2529     if (GCCH_get_id (iter->ch) == chid)
2530       break;
2531   }
2532
2533   return NULL == iter ? NULL : iter->ch;
2534 }
2535
2536
2537 /**
2538  * @brief Destroy a tunnel and free all resources.
2539  *
2540  * Should only be called a while after the tunnel has been marked as destroyed,
2541  * in case there is a new channel added to the same peer shortly after marking
2542  * the tunnel. This way we avoid a new public key handshake.
2543  *
2544  * @param cls Closure (tunnel to destroy).
2545  * @param tc Task context.
2546  */
2547 static void
2548 delayed_destroy (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
2549 {
2550   struct CadetTunnel *t = cls;
2551   struct CadetTConnection *iter;
2552
2553   LOG (GNUNET_ERROR_TYPE_DEBUG, "delayed destroying tunnel %p\n", t);
2554   if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
2555   {
2556     LOG (GNUNET_ERROR_TYPE_WARNING,
2557          "Not destroying tunnel, due to shutdown. "
2558          "Tunnel at %p should have been freed by GCT_shutdown\n", t);
2559     return;
2560   }
2561   t->destroy_task = GNUNET_SCHEDULER_NO_TASK;
2562   t->cstate = CADET_TUNNEL_SHUTDOWN;
2563
2564   for (iter = t->connection_head; NULL != iter; iter = iter->next)
2565   {
2566     GCC_send_destroy (iter->c);
2567   }
2568   GCT_destroy (t);
2569 }
2570
2571
2572 /**
2573  * Tunnel is empty: destroy it.
2574  *
2575  * Notifies all connections about the destruction.
2576  *
2577  * @param t Tunnel to destroy.
2578  */
2579 void
2580 GCT_destroy_empty (struct CadetTunnel *t)
2581 {
2582   if (GNUNET_YES == shutting_down)
2583     return; /* Will be destroyed immediately anyway */
2584
2585   if (GNUNET_SCHEDULER_NO_TASK != t->destroy_task)
2586   {
2587     LOG (GNUNET_ERROR_TYPE_WARNING,
2588          "Tunnel %s is already scheduled for destruction. Tunnel debug dump:\n",
2589          GCT_2s (t));
2590     GCT_debug (t, GNUNET_ERROR_TYPE_WARNING);
2591     GNUNET_break (0);
2592     /* should never happen, tunnel can only become empty once, and the
2593      * task identifier should be NO_TASK (cleaned when the tunnel was created
2594      * or became un-empty)
2595      */
2596     return;
2597   }
2598
2599   LOG (GNUNET_ERROR_TYPE_DEBUG, "Tunnel %s empty: destroying scheduled\n",
2600        GCT_2s (t));
2601
2602   // FIXME make delay a config option
2603   t->destroy_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
2604                                                   &delayed_destroy, t);
2605   LOG (GNUNET_ERROR_TYPE_DEBUG, "Scheduled destroy of %p as %llX\n",
2606        t, t->destroy_task);
2607 }
2608
2609
2610 /**
2611  * Destroy tunnel if empty (no more channels).
2612  *
2613  * @param t Tunnel to destroy if empty.
2614  */
2615 void
2616 GCT_destroy_if_empty (struct CadetTunnel *t)
2617 {
2618   LOG (GNUNET_ERROR_TYPE_DEBUG, "Tunnel %s destroy if empty\n", GCT_2s (t));
2619   if (1 < GCT_count_channels (t))
2620     return;
2621
2622   GCT_destroy_empty (t);
2623 }
2624
2625
2626 /**
2627  * Destroy the tunnel.
2628  *
2629  * This function does not generate any warning traffic to clients or peers.
2630  *
2631  * Tasks:
2632  * Cancel messages belonging to this tunnel queued to neighbors.
2633  * Free any allocated resources linked to the tunnel.
2634  *
2635  * @param t The tunnel to destroy.
2636  */
2637 void
2638 GCT_destroy (struct CadetTunnel *t)
2639 {
2640   struct CadetTConnection *iter_c;
2641   struct CadetTConnection *next_c;
2642   struct CadetTChannel *iter_ch;
2643   struct CadetTChannel *next_ch;
2644
2645   if (NULL == t)
2646     return;
2647
2648   LOG (GNUNET_ERROR_TYPE_DEBUG, "destroying tunnel %s\n", GCP_2s (t->peer));
2649
2650   GNUNET_break (GNUNET_YES ==
2651                 GNUNET_CONTAINER_multipeermap_remove (tunnels,
2652                                                       GCP_get_id (t->peer), t));
2653
2654   for (iter_c = t->connection_head; NULL != iter_c; iter_c = next_c)
2655   {
2656     next_c = iter_c->next;
2657     GCC_destroy (iter_c->c);
2658   }
2659   for (iter_ch = t->channel_head; NULL != iter_ch; iter_ch = next_ch)
2660   {
2661     next_ch = iter_ch->next;
2662     GCCH_destroy (iter_ch->ch);
2663     /* Should only happen on shutdown, but it's ok. */
2664   }
2665
2666   if (GNUNET_SCHEDULER_NO_TASK != t->destroy_task)
2667   {
2668     LOG (GNUNET_ERROR_TYPE_DEBUG, "cancelling dest: %llX\n", t->destroy_task);
2669     GNUNET_SCHEDULER_cancel (t->destroy_task);
2670     t->destroy_task = GNUNET_SCHEDULER_NO_TASK;
2671   }
2672
2673   if (GNUNET_SCHEDULER_NO_TASK != t->trim_connections_task)
2674   {
2675     LOG (GNUNET_ERROR_TYPE_DEBUG, "cancelling trim: %llX\n",
2676          t->trim_connections_task);
2677     GNUNET_SCHEDULER_cancel (t->trim_connections_task);
2678     t->trim_connections_task = GNUNET_SCHEDULER_NO_TASK;
2679   }
2680
2681   GNUNET_STATISTICS_update (stats, "# tunnels", -1, GNUNET_NO);
2682   GCP_set_tunnel (t->peer, NULL);
2683
2684   if (GNUNET_SCHEDULER_NO_TASK != t->rekey_task)
2685   {
2686     GNUNET_SCHEDULER_cancel (t->rekey_task);
2687     t->rekey_task = GNUNET_SCHEDULER_NO_TASK;
2688   }
2689   if (NULL != t->kx_ctx)
2690   {
2691     if (GNUNET_SCHEDULER_NO_TASK != t->kx_ctx->finish_task)
2692       GNUNET_SCHEDULER_cancel (t->kx_ctx->finish_task);
2693     GNUNET_free (t->kx_ctx);
2694   }
2695   GNUNET_free (t);
2696 }
2697
2698
2699 /**
2700  * @brief Use the given path for the tunnel.
2701  * Update the next and prev hops (and RCs).
2702  * (Re)start the path refresh in case the tunnel is locally owned.
2703  *
2704  * @param t Tunnel to update.
2705  * @param p Path to use.
2706  *
2707  * @return Connection created.
2708  */
2709 struct CadetConnection *
2710 GCT_use_path (struct CadetTunnel *t, struct CadetPeerPath *p)
2711 {
2712   struct CadetConnection *c;
2713   struct GNUNET_CADET_Hash cid;
2714   unsigned int own_pos;
2715
2716   if (NULL == t || NULL == p)
2717   {
2718     GNUNET_break (0);
2719     return NULL;
2720   }
2721
2722   if (CADET_TUNNEL_SHUTDOWN == t->cstate)
2723   {
2724     GNUNET_break (0);
2725     return NULL;
2726   }
2727
2728   for (own_pos = 0; own_pos < p->length; own_pos++)
2729   {
2730     if (p->peers[own_pos] == myid)
2731       break;
2732   }
2733   if (own_pos >= p->length)
2734   {
2735     GNUNET_break_op (0);
2736     return NULL;
2737   }
2738
2739   GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_NONCE, &cid, sizeof (cid));
2740   c = GCC_new (&cid, t, p, own_pos);
2741   if (NULL == c)
2742   {
2743     /* Path was flawed */
2744     return NULL;
2745   }
2746   GCT_add_connection (t, c);
2747   return c;
2748 }
2749
2750
2751 /**
2752  * Count all created connections of a tunnel. Not necessarily ready connections!
2753  *
2754  * @param t Tunnel on which to count.
2755  *
2756  * @return Number of connections created, either being established or ready.
2757  */
2758 unsigned int
2759 GCT_count_any_connections (struct CadetTunnel *t)
2760 {
2761   struct CadetTConnection *iter;
2762   unsigned int count;
2763
2764   if (NULL == t)
2765     return 0;
2766
2767   for (count = 0, iter = t->connection_head; NULL != iter; iter = iter->next)
2768     count++;
2769
2770   return count;
2771 }
2772
2773
2774 /**
2775  * Count established (ready) connections of a tunnel.
2776  *
2777  * @param t Tunnel on which to count.
2778  *
2779  * @return Number of connections.
2780  */
2781 unsigned int
2782 GCT_count_connections (struct CadetTunnel *t)
2783 {
2784   struct CadetTConnection *iter;
2785   unsigned int count;
2786
2787   if (NULL == t)
2788     return 0;
2789
2790   for (count = 0, iter = t->connection_head; NULL != iter; iter = iter->next)
2791     if (CADET_CONNECTION_DESTROYED != GCC_get_state (iter->c))
2792       count++;
2793
2794   return count;
2795 }
2796
2797
2798 /**
2799  * Count channels of a tunnel.
2800  *
2801  * @param t Tunnel on which to count.
2802  *
2803  * @return Number of channels.
2804  */
2805 unsigned int
2806 GCT_count_channels (struct CadetTunnel *t)
2807 {
2808   struct CadetTChannel *iter;
2809   unsigned int count;
2810
2811   for (count = 0, iter = t->channel_head;
2812        NULL != iter;
2813        iter = iter->next, count++) /* skip */;
2814
2815   return count;
2816 }
2817
2818
2819 /**
2820  * Get the connectivity state of a tunnel.
2821  *
2822  * @param t Tunnel.
2823  *
2824  * @return Tunnel's connectivity state.
2825  */
2826 enum CadetTunnelCState
2827 GCT_get_cstate (struct CadetTunnel *t)
2828 {
2829   if (NULL == t)
2830   {
2831     GNUNET_assert (0);
2832     return (enum CadetTunnelCState) -1;
2833   }
2834   return t->cstate;
2835 }
2836
2837
2838 /**
2839  * Get the encryption state of a tunnel.
2840  *
2841  * @param t Tunnel.
2842  *
2843  * @return Tunnel's encryption state.
2844  */
2845 enum CadetTunnelEState
2846 GCT_get_estate (struct CadetTunnel *t)
2847 {
2848   if (NULL == t)
2849   {
2850     GNUNET_break (0);
2851     return (enum CadetTunnelEState) -1;
2852   }
2853   return t->estate;
2854 }
2855
2856 /**
2857  * Get the maximum buffer space for a tunnel towards a local client.
2858  *
2859  * @param t Tunnel.
2860  *
2861  * @return Biggest buffer space offered by any channel in the tunnel.
2862  */
2863 unsigned int
2864 GCT_get_channels_buffer (struct CadetTunnel *t)
2865 {
2866   struct CadetTChannel *iter;
2867   unsigned int buffer;
2868   unsigned int ch_buf;
2869
2870   if (NULL == t->channel_head)
2871   {
2872     /* Probably getting buffer for a channel create/handshake. */
2873     return 64;
2874   }
2875
2876   buffer = 0;
2877   for (iter = t->channel_head; NULL != iter; iter = iter->next)
2878   {
2879     ch_buf = get_channel_buffer (iter);
2880     if (ch_buf > buffer)
2881       buffer = ch_buf;
2882   }
2883   return buffer;
2884 }
2885
2886
2887 /**
2888  * Get the total buffer space for a tunnel for P2P traffic.
2889  *
2890  * @param t Tunnel.
2891  *
2892  * @return Buffer space offered by all connections in the tunnel.
2893  */
2894 unsigned int
2895 GCT_get_connections_buffer (struct CadetTunnel *t)
2896 {
2897   struct CadetTConnection *iter;
2898   unsigned int buffer;
2899
2900   if (GNUNET_NO == is_ready (t))
2901   {
2902     if (count_queued_data (t) > 3)
2903       return 0;
2904     else
2905       return 1;
2906   }
2907
2908   buffer = 0;
2909   for (iter = t->connection_head; NULL != iter; iter = iter->next)
2910   {
2911     if (GCC_get_state (iter->c) != CADET_CONNECTION_READY)
2912     {
2913       continue;
2914     }
2915     buffer += get_connection_buffer (iter);
2916   }
2917
2918   return buffer;
2919 }
2920
2921
2922 /**
2923  * Get the tunnel's destination.
2924  *
2925  * @param t Tunnel.
2926  *
2927  * @return ID of the destination peer.
2928  */
2929 const struct GNUNET_PeerIdentity *
2930 GCT_get_destination (struct CadetTunnel *t)
2931 {
2932   return GCP_get_id (t->peer);
2933 }
2934
2935
2936 /**
2937  * Get the tunnel's next free global channel ID.
2938  *
2939  * @param t Tunnel.
2940  *
2941  * @return GID of a channel free to use.
2942  */
2943 CADET_ChannelNumber
2944 GCT_get_next_chid (struct CadetTunnel *t)
2945 {
2946   CADET_ChannelNumber chid;
2947   CADET_ChannelNumber mask;
2948   int result;
2949
2950   /* Set bit 30 depending on the ID relationship. Bit 31 is always 0 for GID.
2951    * If our ID is bigger or loopback tunnel, start at 0, bit 30 = 0
2952    * If peer's ID is bigger, start at 0x4... bit 30 = 1
2953    */
2954   result = GNUNET_CRYPTO_cmp_peer_identity (&my_full_id, GCP_get_id (t->peer));
2955   if (0 > result)
2956     mask = 0x40000000;
2957   else
2958     mask = 0x0;
2959   t->next_chid |= mask;
2960
2961   while (NULL != GCT_get_channel (t, t->next_chid))
2962   {
2963     LOG (GNUNET_ERROR_TYPE_DEBUG, "Channel %u exists...\n", t->next_chid);
2964     t->next_chid = (t->next_chid + 1) & ~GNUNET_CADET_LOCAL_CHANNEL_ID_CLI;
2965     t->next_chid |= mask;
2966   }
2967   chid = t->next_chid;
2968   t->next_chid = (t->next_chid + 1) & ~GNUNET_CADET_LOCAL_CHANNEL_ID_CLI;
2969   t->next_chid |= mask;
2970
2971   return chid;
2972 }
2973
2974
2975 /**
2976  * Send ACK on one or more channels due to buffer in connections.
2977  *
2978  * @param t Channel which has some free buffer space.
2979  */
2980 void
2981 GCT_unchoke_channels (struct CadetTunnel *t)
2982 {
2983   struct CadetTChannel *iter;
2984   unsigned int buffer;
2985   unsigned int channels = GCT_count_channels (t);
2986   unsigned int choked_n;
2987   struct CadetChannel *choked[channels];
2988
2989   LOG (GNUNET_ERROR_TYPE_DEBUG, "GCT_unchoke_channels on %s\n", GCT_2s (t));
2990   LOG (GNUNET_ERROR_TYPE_DEBUG, " head: %p\n", t->channel_head);
2991   if (NULL != t->channel_head)
2992     LOG (GNUNET_ERROR_TYPE_DEBUG, " head ch: %p\n", t->channel_head->ch);
2993
2994   /* Get buffer space */
2995   buffer = GCT_get_connections_buffer (t);
2996   if (0 == buffer)
2997   {
2998     return;
2999   }
3000
3001   /* Count and remember choked channels */
3002   choked_n = 0;
3003   for (iter = t->channel_head; NULL != iter; iter = iter->next)
3004   {
3005     if (GNUNET_NO == get_channel_allowed (iter))
3006     {
3007       choked[choked_n++] = iter->ch;
3008     }
3009   }
3010
3011   /* Unchoke random channels */
3012   while (0 < buffer && 0 < choked_n)
3013   {
3014     unsigned int r = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
3015                                                choked_n);
3016     GCCH_allow_client (choked[r], GCCH_is_origin (choked[r], GNUNET_YES));
3017     choked_n--;
3018     buffer--;
3019     choked[r] = choked[choked_n];
3020   }
3021 }
3022
3023
3024 /**
3025  * Send ACK on one or more connections due to buffer space to the client.
3026  *
3027  * Iterates all connections of the tunnel and sends ACKs appropriately.
3028  *
3029  * @param t Tunnel.
3030  */
3031 void
3032 GCT_send_connection_acks (struct CadetTunnel *t)
3033 {
3034   struct CadetTConnection *iter;
3035   uint32_t allowed;
3036   uint32_t to_allow;
3037   uint32_t allow_per_connection;
3038   unsigned int cs;
3039   unsigned int buffer;
3040
3041   LOG (GNUNET_ERROR_TYPE_DEBUG, "Tunnel send connection ACKs on %s\n",
3042        GCT_2s (t));
3043
3044   if (NULL == t)
3045   {
3046     GNUNET_break (0);
3047     return;
3048   }
3049
3050   buffer = GCT_get_channels_buffer (t);
3051   LOG (GNUNET_ERROR_TYPE_DEBUG, "  buffer %u\n", buffer);
3052
3053   /* Count connections, how many messages are already allowed */
3054   cs = GCT_count_connections (t);
3055   for (allowed = 0, iter = t->connection_head; NULL != iter; iter = iter->next)
3056   {
3057     allowed += get_connection_allowed (iter);
3058   }
3059   LOG (GNUNET_ERROR_TYPE_DEBUG, "  allowed %u\n", allowed);
3060
3061   /* Make sure there is no overflow */
3062   if (allowed > buffer)
3063   {
3064     return;
3065   }
3066
3067   /* Authorize connections to send more data */
3068   to_allow = buffer; /* - allowed; */
3069
3070   for (iter = t->connection_head;
3071        NULL != iter && to_allow > 0;
3072        iter = iter->next)
3073   {
3074     allow_per_connection = to_allow/cs;
3075     to_allow -= allow_per_connection;
3076     cs--;
3077     if (get_connection_allowed (iter) > 64 / 3)
3078     {
3079       continue;
3080     }
3081     GCC_allow (iter->c, allow_per_connection,
3082                GCC_is_origin (iter->c, GNUNET_NO));
3083   }
3084
3085   GNUNET_break (to_allow == 0); //FIXME tripped
3086 }
3087
3088
3089 /**
3090  * Cancel a previously sent message while it's in the queue.
3091  *
3092  * ONLY can be called before the continuation given to the send function
3093  * is called. Once the continuation is called, the message is no longer in the
3094  * queue.
3095  *
3096  * @param q Handle to the queue.
3097  */
3098 void
3099 GCT_cancel (struct CadetTunnelQueue *q)
3100 {
3101   if (NULL != q->cq)
3102   {
3103     GCC_cancel (q->cq);
3104     /* tun_message_sent() will be called and free q */
3105   }
3106   else if (NULL != q->tqd)
3107   {
3108     unqueue_data (q->tqd);
3109     q->tqd = NULL;
3110     if (NULL != q->cont)
3111       q->cont (q->cont_cls, NULL, q, 0, 0);
3112     GNUNET_free (q);
3113   }
3114   else
3115   {
3116     GNUNET_break (0);
3117   }
3118 }
3119
3120
3121 /**
3122  * Sends an already built message on a tunnel, encrypting it and
3123  * choosing the best connection if not provided.
3124  *
3125  * @param message Message to send. Function modifies it.
3126  * @param t Tunnel on which this message is transmitted.
3127  * @param c Connection to use (autoselect if NULL).
3128  * @param force Force the tunnel to take the message (buffer overfill).
3129  * @param cont Continuation to call once message is really sent.
3130  * @param cont_cls Closure for @c cont.
3131  *
3132  * @return Handle to cancel message. NULL if @c cont is NULL.
3133  */
3134 struct CadetTunnelQueue *
3135 GCT_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
3136                            struct CadetTunnel *t, struct CadetConnection *c,
3137                            int force, GCT_sent cont, void *cont_cls)
3138 {
3139   return send_prebuilt_message (message, t, c, force, cont, cont_cls, NULL);
3140 }
3141
3142 /**
3143  * Sends an already built and encrypted message on a tunnel, choosing the best
3144  * connection. Useful for re-queueing messages queued on a destroyed connection.
3145  *
3146  * @param message Message to send. Function modifies it.
3147  * @param t Tunnel on which this message is transmitted.
3148  */
3149 void
3150 GCT_resend_message (const struct GNUNET_MessageHeader *message,
3151                     struct CadetTunnel *t)
3152 {
3153   struct CadetConnection *c;
3154   int fwd;
3155
3156   c = tunnel_get_connection (t);
3157   if (NULL == c)
3158   {
3159     /* TODO queue in tunnel, marked as encrypted */
3160     LOG (GNUNET_ERROR_TYPE_DEBUG, "No connection available, dropping.\n");
3161     return;
3162   }
3163   fwd = GCC_is_origin (c, GNUNET_YES);
3164   GNUNET_break (NULL == GCC_send_prebuilt_message (message, 0, 0, c, fwd,
3165                                                    GNUNET_YES, NULL, NULL));
3166 }
3167
3168
3169 /**
3170  * Is the tunnel directed towards the local peer?
3171  *
3172  * @param t Tunnel.
3173  *
3174  * @return #GNUNET_YES if it is loopback.
3175  */
3176 int
3177 GCT_is_loopback (const struct CadetTunnel *t)
3178 {
3179   return (myid == GCP_get_short_id (t->peer));
3180 }
3181
3182
3183 /**
3184  * Is the tunnel this path already?
3185  *
3186  * @param t Tunnel.
3187  * @param p Path.
3188  *
3189  * @return #GNUNET_YES a connection uses this path.
3190  */
3191 int
3192 GCT_is_path_used (const struct CadetTunnel *t, const struct CadetPeerPath *p)
3193 {
3194   struct CadetTConnection *iter;
3195
3196   for (iter = t->connection_head; NULL != iter; iter = iter->next)
3197     if (GCC_get_path (iter->c) == p)
3198       return GNUNET_YES;
3199
3200   return GNUNET_NO;
3201 }
3202
3203
3204 /**
3205  * Get a cost of a path for a tunnel considering existing connections.
3206  *
3207  * @param t Tunnel.
3208  * @param path Candidate path.
3209  *
3210  * @return Cost of the path (path length + number of overlapping nodes)
3211  */
3212 unsigned int
3213 GCT_get_path_cost (const struct CadetTunnel *t,
3214                    const struct CadetPeerPath *path)
3215 {
3216   struct CadetTConnection *iter;
3217   const struct CadetPeerPath *aux;
3218   unsigned int overlap;
3219   unsigned int i;
3220   unsigned int j;
3221
3222   if (NULL == path)
3223     return 0;
3224
3225   overlap = 0;
3226   GNUNET_assert (NULL != t);
3227
3228   for (i = 0; i < path->length; i++)
3229   {
3230     for (iter = t->connection_head; NULL != iter; iter = iter->next)
3231     {
3232       aux = GCC_get_path (iter->c);
3233       if (NULL == aux)
3234         continue;
3235
3236       for (j = 0; j < aux->length; j++)
3237       {
3238         if (path->peers[i] == aux->peers[j])
3239         {
3240           overlap++;
3241           break;
3242         }
3243       }
3244     }
3245   }
3246   return path->length + overlap;
3247 }
3248
3249
3250 /**
3251  * Get the static string for the peer this tunnel is directed.
3252  *
3253  * @param t Tunnel.
3254  *
3255  * @return Static string the destination peer's ID.
3256  */
3257 const char *
3258 GCT_2s (const struct CadetTunnel *t)
3259 {
3260   if (NULL == t)
3261     return "(NULL)";
3262
3263   return GCP_2s (t->peer);
3264 }
3265
3266
3267 /******************************************************************************/
3268 /*****************************    INFO/DEBUG    *******************************/
3269 /******************************************************************************/
3270
3271 /**
3272  * Log all possible info about the tunnel state.
3273  *
3274  * @param t Tunnel to debug.
3275  * @param level Debug level to use.
3276  */
3277 void
3278 GCT_debug (const struct CadetTunnel *t, enum GNUNET_ErrorType level)
3279 {
3280   struct CadetTChannel *iterch;
3281   struct CadetTConnection *iterc;
3282   int do_log;
3283
3284   do_log = GNUNET_get_log_call_status (level & (~GNUNET_ERROR_TYPE_BULK),
3285                                        "cadet-tun",
3286                                        __FILE__, __FUNCTION__, __LINE__);
3287   if (0 == do_log)
3288     return;
3289
3290   LOG2 (level, "TTT DEBUG TUNNEL TOWARDS %s\n", GCT_2s (t));
3291   LOG2 (level, "TTT  cstate %s, estate %s\n",
3292        cstate2s (t->cstate), estate2s (t->estate));
3293   LOG2 (level, "TTT  kx_ctx %p, rekey_task %u, finish task %u\n",
3294         t->kx_ctx, t->rekey_task, t->kx_ctx ? t->kx_ctx->finish_task : 0);
3295 #if DUMP_KEYS_TO_STDERR
3296   LOG2 (level, "TTT  my EPHM\t %s\n",
3297         GNUNET_h2s ((struct GNUNET_HashCode *) &kx_msg.ephemeral_key));
3298   LOG2 (level, "TTT  peers EPHM:\t %s\n",
3299         GNUNET_h2s ((struct GNUNET_HashCode *) &t->peers_ephemeral_key));
3300   LOG2 (level, "TTT  ENC key:\t %s\n",
3301         GNUNET_h2s ((struct GNUNET_HashCode *) &t->e_key));
3302   LOG2 (level, "TTT  DEC key:\t %s\n",
3303         GNUNET_h2s ((struct GNUNET_HashCode *) &t->d_key));
3304   if (t->kx_ctx)
3305   {
3306     LOG2 (level, "TTT  OLD ENC key:\t %s\n",
3307           GNUNET_h2s ((struct GNUNET_HashCode *) &t->kx_ctx->e_key_old));
3308     LOG2 (level, "TTT  OLD DEC key:\t %s\n",
3309           GNUNET_h2s ((struct GNUNET_HashCode *) &t->kx_ctx->d_key_old));
3310   }
3311 #endif
3312   LOG2 (level, "TTT  tq_head %p, tq_tail %p\n", t->tq_head, t->tq_tail);
3313   LOG2 (level, "TTT  destroy %u\n", t->destroy_task);
3314
3315   LOG2 (level, "TTT  channels:\n");
3316   for (iterch = t->channel_head; NULL != iterch; iterch = iterch->next)
3317   {
3318     LOG2 (level, "TTT  - %s\n", GCCH_2s (iterch->ch));
3319   }
3320
3321   LOG2 (level, "TTT  connections:\n");
3322   for (iterc = t->connection_head; NULL != iterc; iterc = iterc->next)
3323   {
3324     GCC_debug (iterc->c, level);
3325   }
3326
3327   LOG2 (level, "TTT DEBUG TUNNEL END\n");
3328 }
3329
3330
3331 /**
3332  * Iterate all tunnels.
3333  *
3334  * @param iter Iterator.
3335  * @param cls Closure for @c iter.
3336  */
3337 void
3338 GCT_iterate_all (GNUNET_CONTAINER_PeerMapIterator iter, void *cls)
3339 {
3340   GNUNET_CONTAINER_multipeermap_iterate (tunnels, iter, cls);
3341 }
3342
3343
3344 /**
3345  * Count all tunnels.
3346  *
3347  * @return Number of tunnels to remote peers kept by this peer.
3348  */
3349 unsigned int
3350 GCT_count_all (void)
3351 {
3352   return GNUNET_CONTAINER_multipeermap_size (tunnels);
3353 }
3354
3355
3356 /**
3357  * Iterate all connections of a tunnel.
3358  *
3359  * @param t Tunnel whose connections to iterate.
3360  * @param iter Iterator.
3361  * @param cls Closure for @c iter.
3362  */
3363 void
3364 GCT_iterate_connections (struct CadetTunnel *t, GCT_conn_iter iter, void *cls)
3365 {
3366   struct CadetTConnection *ct;
3367
3368   for (ct = t->connection_head; NULL != ct; ct = ct->next)
3369     iter (cls, ct->c);
3370 }
3371
3372
3373 /**
3374  * Iterate all channels of a tunnel.
3375  *
3376  * @param t Tunnel whose channels to iterate.
3377  * @param iter Iterator.
3378  * @param cls Closure for @c iter.
3379  */
3380 void
3381 GCT_iterate_channels (struct CadetTunnel *t, GCT_chan_iter iter, void *cls)
3382 {
3383   struct CadetTChannel *cht;
3384
3385   for (cht = t->channel_head; NULL != cht; cht = cht->next)
3386     iter (cls, cht->ch);
3387 }