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