Merge branch 'master' of gnunet.org:gnunet
[oweals/gnunet.git] / src / transport / gnunet-communicator-udp.c
1 /*
2      This file is part of GNUnet
3      Copyright (C) 2010-2014, 2018, 2019 GNUnet e.V.
4
5      GNUnet is free software: you can redistribute it and/or modify it
6      under the terms of the GNU Affero General Public License as published
7      by the Free Software Foundation, either version 3 of the License,
8      or (at your 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      Affero General Public License for more details.
14
15      You should have received a copy of the GNU Affero General Public License
16      along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18      SPDX-License-Identifier: AGPL3.0-or-later
19  */
20
21 /**
22  * @file transport/gnunet-communicator-udp.c
23  * @brief Transport plugin using UDP.
24  * @author Christian Grothoff
25  *
26  * TODO:
27  * - consider imposing transmission limits in the absence
28  *   of ACKs; or: maybe this should be done at TNG service level?
29  *   (at least the receiver might want to enforce limits on
30  *    KX/DH operations per sender in here) (#5552)
31  * - overall, we should look more into flow control support
32  *   (either in backchannel, or general solution in TNG service)
33  * - handle addresses discovered from broadcasts (#5551)
34  *   (think: what was the story again on address validation?
35  *    where is the API for that!?!)
36  * - support DNS names in BINDTO option (#5528)
37  * - support NAT connection reversal method (#5529)
38  * - support other UDP-specific NAT traversal methods (#)
39  */
40 #include "platform.h"
41 #include "gnunet_util_lib.h"
42 #include "gnunet_protocols.h"
43 #include "gnunet_signatures.h"
44 #include "gnunet_constants.h"
45 #include "gnunet_nt_lib.h"
46 #include "gnunet_nat_service.h"
47 #include "gnunet_statistics_service.h"
48 #include "gnunet_transport_application_service.h"
49 #include "gnunet_transport_communication_service.h"
50
51 /**
52  * How often do we rekey based on time (at least)
53  */
54 #define REKEY_TIME_INTERVAL GNUNET_TIME_UNIT_DAYS
55
56 /**
57  * How long do we wait until we must have received the initial KX?
58  */
59 #define PROTO_QUEUE_TIMEOUT GNUNET_TIME_UNIT_MINUTES
60
61 /**
62  * How often do we broadcast our presence on the LAN?
63  */
64 #define BROADCAST_FREQUENCY GNUNET_TIME_UNIT_MINUTES
65
66 /**
67  * How often do we scan for changes to our network interfaces?
68  */
69 #define INTERFACE_SCAN_FREQUENCY \
70   GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5)
71
72 /**
73  * How long do we believe our addresses to remain up (before
74  * the other peer should revalidate).
75  */
76 #define ADDRESS_VALIDITY_PERIOD GNUNET_TIME_UNIT_HOURS
77
78 /**
79  * AES key size.
80  */
81 #define AES_KEY_SIZE (256 / 8)
82
83 /**
84  * AES (GCM) IV size.
85  */
86 #define AES_IV_SIZE (96 / 8)
87
88 /**
89  * Size of the GCM tag.
90  */
91 #define GCM_TAG_SIZE (128 / 8)
92
93 /**
94  * If we fall below this number of available KCNs,
95  * we generate additional ACKs until we reach
96  * #KCN_TARGET.
97  * Should be large enough that we don't generate ACKs all
98  * the time and still have enough time for the ACK to
99  * arrive before the sender runs out. So really this
100  * should ideally be based on the RTT.
101  */
102 #define KCN_THRESHOLD 92
103
104 /**
105  * How many KCNs do we keep around *after* we hit
106  * the #KCN_THRESHOLD? Should be larger than
107  * #KCN_THRESHOLD so we do not generate just one
108  * ACK at the time.
109  */
110 #define KCN_TARGET 128
111
112 /**
113  * What is the maximum delta between KCN sequence numbers
114  * that we allow. Used to expire 'ancient' KCNs that likely
115  * were dropped by the network.  Must be larger than
116  * KCN_TARGET (otherwise we generate new KCNs all the time),
117  * but not too large (otherwise packet loss may cause
118  * sender to fall back to KX needlessly when sender runs
119  * out of ACK'ed KCNs due to losses).
120  */
121 #define MAX_SQN_DELTA 160
122
123 /**
124  * How many shared master secrets do we keep around
125  * at most per sender?  Should be large enough so
126  * that we generally have a chance of sending an ACK
127  * before the sender already rotated out the master
128  * secret.  Generally values around #KCN_TARGET make
129  * sense. Might make sense to adapt to RTT if we had
130  * a good measurement...
131  */
132 #define MAX_SECRETS 128
133
134 /**
135  * How often do we rekey based on number of bytes transmitted?
136  * (additionally randomized).
137  */
138 #define REKEY_MAX_BYTES (1024LLU * 1024 * 1024 * 4LLU)
139
140 /**
141  * Address prefix used by the communicator.
142  */
143
144 #define COMMUNICATOR_ADDRESS_PREFIX "udp"
145
146 /**
147  * Configuration section used by the communicator.
148  */
149 #define COMMUNICATOR_CONFIG_SECTION "communicator-udp"
150
151 GNUNET_NETWORK_STRUCT_BEGIN
152
153
154 /**
155  * Signature we use to verify that the ephemeral key was really chosen by
156  * the specified sender.  If possible, the receiver should respond with
157  * a `struct UDPAck` (possibly via backchannel).
158  */
159 struct UdpHandshakeSignature
160 {
161   /**
162    * Purpose must be #GNUNET_SIGNATURE_COMMUNICATOR_UDP_HANDSHAKE
163    */
164   struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
165
166   /**
167    * Identity of the inititor of the UDP connection (UDP client).
168    */
169   struct GNUNET_PeerIdentity sender;
170
171   /**
172    * Presumed identity of the target of the UDP connection (UDP server)
173    */
174   struct GNUNET_PeerIdentity receiver;
175
176   /**
177    * Ephemeral key used by the @e sender.
178    */
179   struct GNUNET_CRYPTO_EcdhePublicKey ephemeral;
180
181   /**
182    * Monotonic time of @e sender, to possibly help detect replay attacks
183    * (if receiver persists times by sender).
184    */
185   struct GNUNET_TIME_AbsoluteNBO monotonic_time;
186 };
187
188
189 /**
190  * "Plaintext" header at beginning of KX message. Followed
191  * by encrypted `struct UDPConfirmation`.
192  */
193 struct InitialKX
194 {
195   /**
196    * Ephemeral key for KX.
197    */
198   struct GNUNET_CRYPTO_EcdhePublicKey ephemeral;
199
200   /**
201    * HMAC for the following encrypted message, using GCM.  HMAC uses
202    * key derived from the handshake with sequence number zero.
203    */
204   char gcm_tag[GCM_TAG_SIZE];
205 };
206
207
208 /**
209  * Encrypted continuation of UDP initial handshake, followed
210  * by message header with payload.
211  */
212 struct UDPConfirmation
213 {
214   /**
215    * Sender's identity
216    */
217   struct GNUNET_PeerIdentity sender;
218
219   /**
220    * Sender's signature of type #GNUNET_SIGNATURE_COMMUNICATOR_UDP_HANDSHAKE
221    */
222   struct GNUNET_CRYPTO_EddsaSignature sender_sig;
223
224   /**
225    * Monotonic time of @e sender, to possibly help detect replay attacks
226    * (if receiver persists times by sender).
227    */
228   struct GNUNET_TIME_AbsoluteNBO monotonic_time;
229
230   /* followed by messages */
231
232   /* padding may follow actual messages */
233 };
234
235
236 /**
237  * UDP key acknowledgement.  May be sent via backchannel. Allows the
238  * sender to use `struct UDPBox` with the acknowledge key henceforth.
239  */
240 struct UDPAck
241 {
242   /**
243    * Type is #GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK.
244    */
245   struct GNUNET_MessageHeader header;
246
247   /**
248    * Sequence acknowledgement limit. Specifies current maximum sequence
249    * number supported by receiver.
250    */
251   uint32_t sequence_max GNUNET_PACKED;
252
253   /**
254    * CMAC of the base key being acknowledged.
255    */
256   struct GNUNET_HashCode cmac;
257 };
258
259
260 /**
261  * Signature we use to verify that the broadcast was really made by
262  * the peer that claims to have made it.  Basically, affirms that the
263  * peer is really using this IP address (albeit possibly not in _our_
264  * LAN).  Makes it difficult for peers in the LAN to claim to
265  * be just any global peer -- an attacker must have at least
266  * shared a LAN with the peer they're pretending to be here.
267  */
268 struct UdpBroadcastSignature
269 {
270   /**
271    * Purpose must be #GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST
272    */
273   struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
274
275   /**
276    * Identity of the inititor of the UDP broadcast.
277    */
278   struct GNUNET_PeerIdentity sender;
279
280   /**
281    * Hash of the sender's UDP address.
282    */
283   struct GNUNET_HashCode h_address;
284 };
285
286
287 /**
288  * Broadcast by peer in LAN announcing its presence.  Unusual in that
289  * we don't pad these to full MTU, as we cannot prevent being
290  * recognized in LAN as GNUnet peers if this feature is enabled
291  * anyway.  Also, the entire message is in cleartext.
292  */
293 struct UDPBroadcast
294 {
295   /**
296    * Sender's peer identity.
297    */
298   struct GNUNET_PeerIdentity sender;
299
300   /**
301    * Sender's signature of type
302    * #GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST
303    */
304   struct GNUNET_CRYPTO_EddsaSignature sender_sig;
305 };
306
307
308 /**
309  * UDP message box.  Always sent encrypted, only allowed after
310  * the receiver sent a `struct UDPAck` for the base key!
311  */
312 struct UDPBox
313 {
314   /**
315    * Key and IV identification code. KDF applied to an acknowledged
316    * base key and a sequence number.  Sequence numbers must be used
317    * monotonically increasing up to the maximum specified in
318    * `struct UDPAck`. Without further `struct UDPAck`s, the sender
319    * must fall back to sending handshakes!
320    */
321   struct GNUNET_ShortHashCode kid;
322
323   /**
324    * 128-bit authentication tag for the following encrypted message,
325    * from GCM.  MAC starts at the @e body_start that follows and
326    * extends until the end of the UDP payload.  If the @e hmac is
327    * wrong, the receiver should check if the message might be a
328    * `struct UdpHandshakeSignature`.
329    */
330   char gcm_tag[GCM_TAG_SIZE];
331 };
332
333
334 GNUNET_NETWORK_STRUCT_END
335
336 /**
337  * Shared secret we generated for a particular sender or receiver.
338  */
339 struct SharedSecret;
340
341
342 /**
343  * Pre-generated "kid" code (key and IV identification code) to
344  * quickly derive master key for a `struct UDPBox`.
345  */
346 struct KeyCacheEntry
347 {
348   /**
349    * Kept in a DLL.
350    */
351   struct KeyCacheEntry *next;
352
353   /**
354    * Kept in a DLL.
355    */
356   struct KeyCacheEntry *prev;
357
358   /**
359    * Key and IV identification code. KDF applied to an acknowledged
360    * base key and a sequence number.  Sequence numbers must be used
361    * monotonically increasing up to the maximum specified in
362    * `struct UDPAck`. Without further `struct UDPAck`s, the sender
363    * must fall back to sending handshakes!
364    */
365   struct GNUNET_ShortHashCode kid;
366
367   /**
368    * Corresponding shared secret.
369    */
370   struct SharedSecret *ss;
371
372   /**
373    * Sequence number used to derive this entry from master key.
374    */
375   uint32_t sequence_number;
376 };
377
378
379 /**
380  * Information we track per sender address we have recently been
381  * in contact with (decryption from sender).
382  */
383 struct SenderAddress;
384
385 /**
386  * Information we track per receiving address we have recently been
387  * in contact with (encryption to receiver).
388  */
389 struct ReceiverAddress;
390
391 /**
392  * Shared secret we generated for a particular sender or receiver.
393  */
394 struct SharedSecret
395 {
396   /**
397    * Kept in a DLL.
398    */
399   struct SharedSecret *next;
400
401   /**
402    * Kept in a DLL.
403    */
404   struct SharedSecret *prev;
405
406   /**
407    * Kept in a DLL, sorted by sequence number. Only if we are decrypting.
408    */
409   struct KeyCacheEntry *kce_head;
410
411   /**
412    * Kept in a DLL, sorted by sequence number. Only if we are decrypting.
413    */
414   struct KeyCacheEntry *kce_tail;
415
416   /**
417    * Sender we use this shared secret with, or NULL.
418    */
419   struct SenderAddress *sender;
420
421   /**
422    * Receiver we use this shared secret with, or NULL.
423    */
424   struct ReceiverAddress *receiver;
425
426   /**
427    * Master shared secret.
428    */
429   struct GNUNET_HashCode master;
430
431   /**
432    * CMAC is used to identify @e master in ACKs.
433    */
434   struct GNUNET_HashCode cmac;
435
436   /**
437    * Up to which sequence number did we use this @e master already?
438    * (for encrypting only)
439    */
440   uint32_t sequence_used;
441
442   /**
443    * Up to which sequence number did the other peer allow us to use
444    * this key, or up to which number did we allow the other peer to
445    * use this key?
446    */
447   uint32_t sequence_allowed;
448
449   /**
450    * Number of active KCN entries.
451    */
452   unsigned int active_kce_count;
453 };
454
455
456 /**
457  * Information we track per sender address we have recently been
458  * in contact with (we decrypt messages from the sender).
459  */
460 struct SenderAddress
461 {
462   /**
463    * To whom are we talking to.
464    */
465   struct GNUNET_PeerIdentity target;
466
467   /**
468    * Entry in sender expiration heap.
469    */
470   struct GNUNET_CONTAINER_HeapNode *hn;
471
472   /**
473    * Shared secrets we used with @e target, first used is head.
474    */
475   struct SharedSecret *ss_head;
476
477   /**
478    * Shared secrets we used with @e target, last used is tail.
479    */
480   struct SharedSecret *ss_tail;
481
482   /**
483    * Address of the other peer.
484    */
485   struct sockaddr *address;
486
487   /**
488    * Length of the address.
489    */
490   socklen_t address_len;
491
492   /**
493    * Timeout for this sender.
494    */
495   struct GNUNET_TIME_Absolute timeout;
496
497   /**
498    * Length of the DLL at @a ss_head.
499    */
500   unsigned int num_secrets;
501
502   /**
503    * Which network type does this queue use?
504    */
505   enum GNUNET_NetworkType nt;
506 };
507
508
509 /**
510  * Information we track per receiving address we have recently been
511  * in contact with (encryption to receiver).
512  */
513 struct ReceiverAddress
514 {
515   /**
516    * To whom are we talking to.
517    */
518   struct GNUNET_PeerIdentity target;
519
520   /**
521    * Shared secrets we received from @e target, first used is head.
522    */
523   struct SharedSecret *ss_head;
524
525   /**
526    * Shared secrets we received with @e target, last used is tail.
527    */
528   struct SharedSecret *ss_tail;
529
530   /**
531    * Address of the receiver in the human-readable format
532    * with the #COMMUNICATOR_ADDRESS_PREFIX.
533    */
534   char *foreign_addr;
535
536   /**
537    * Address of the other peer.
538    */
539   struct sockaddr *address;
540
541   /**
542    * Length of the address.
543    */
544   socklen_t address_len;
545
546   /**
547    * Entry in sender expiration heap.
548    */
549   struct GNUNET_CONTAINER_HeapNode *hn;
550
551   /**
552    * Message queue we are providing for the #ch.
553    */
554   struct GNUNET_MQ_Handle *mq;
555
556   /**
557    * handle for this queue with the #ch.
558    */
559   struct GNUNET_TRANSPORT_QueueHandle *qh;
560
561   /**
562    * Timeout for this receiver address.
563    */
564   struct GNUNET_TIME_Absolute timeout;
565
566   /**
567    * MTU we allowed transport for this receiver right now.
568    */
569   size_t mtu;
570
571   /**
572    * Length of the DLL at @a ss_head.
573    */
574   unsigned int num_secrets;
575
576   /**
577    * Number of BOX keys from ACKs we have currently
578    * available for this receiver.
579    */
580   unsigned int acks_available;
581
582   /**
583    * Which network type does this queue use?
584    */
585   enum GNUNET_NetworkType nt;
586 };
587
588
589 /**
590  * Interface we broadcast our presence on.
591  */
592 struct BroadcastInterface
593 {
594   /**
595    * Kept in a DLL.
596    */
597   struct BroadcastInterface *next;
598
599   /**
600    * Kept in a DLL.
601    */
602   struct BroadcastInterface *prev;
603
604   /**
605    * Task for this broadcast interface.
606    */
607   struct GNUNET_SCHEDULER_Task *broadcast_task;
608
609   /**
610    * Sender's address of the interface.
611    */
612   struct sockaddr *sa;
613
614   /**
615    * Broadcast address to use on the interface.
616    */
617   struct sockaddr *ba;
618
619   /**
620    * Message we broadcast on this interface.
621    */
622   struct UDPBroadcast bcm;
623
624   /**
625    * If this is an IPv6 interface, this is the request
626    * we use to join/leave the group.
627    */
628   struct ipv6_mreq mcreq;
629
630   /**
631    * Number of bytes in @e sa.
632    */
633   socklen_t salen;
634
635   /**
636    * Was this interface found in the last #iface_proc() scan?
637    */
638   int found;
639 };
640
641
642 /**
643  * Cache of pre-generated key IDs.
644  */
645 static struct GNUNET_CONTAINER_MultiShortmap *key_cache;
646
647 /**
648  * ID of read task
649  */
650 static struct GNUNET_SCHEDULER_Task *read_task;
651
652 /**
653  * ID of timeout task
654  */
655 static struct GNUNET_SCHEDULER_Task *timeout_task;
656
657 /**
658  * ID of master broadcast task
659  */
660 static struct GNUNET_SCHEDULER_Task *broadcast_task;
661
662 /**
663  * For logging statistics.
664  */
665 static struct GNUNET_STATISTICS_Handle *stats;
666
667 /**
668  * Our environment.
669  */
670 static struct GNUNET_TRANSPORT_CommunicatorHandle *ch;
671
672 /**
673  * Receivers (map from peer identity to `struct ReceiverAddress`)
674  */
675 static struct GNUNET_CONTAINER_MultiPeerMap *receivers;
676
677 /**
678  * Senders (map from peer identity to `struct SenderAddress`)
679  */
680 static struct GNUNET_CONTAINER_MultiPeerMap *senders;
681
682 /**
683  * Expiration heap for senders (contains `struct SenderAddress`)
684  */
685 static struct GNUNET_CONTAINER_Heap *senders_heap;
686
687 /**
688  * Expiration heap for receivers (contains `struct ReceiverAddress`)
689  */
690 static struct GNUNET_CONTAINER_Heap *receivers_heap;
691
692 /**
693  * Broadcast interface tasks. Kept in a DLL.
694  */
695 static struct BroadcastInterface *bi_head;
696
697 /**
698  * Broadcast interface tasks. Kept in a DLL.
699  */
700 static struct BroadcastInterface *bi_tail;
701
702 /**
703  * Our socket.
704  */
705 static struct GNUNET_NETWORK_Handle *udp_sock;
706
707 /**
708  * #GNUNET_YES if #udp_sock supports IPv6.
709  */
710 static int have_v6_socket;
711
712 /**
713  * Our public key.
714  */
715 static struct GNUNET_PeerIdentity my_identity;
716
717 /**
718  * Our private key.
719  */
720 static struct GNUNET_CRYPTO_EddsaPrivateKey *my_private_key;
721
722 /**
723  * Our configuration.
724  */
725 static const struct GNUNET_CONFIGURATION_Handle *cfg;
726
727 /**
728  * Our handle to report addresses for validation to TRANSPORT.
729  */
730 static struct GNUNET_TRANSPORT_ApplicationHandle *ah;
731
732 /**
733  * Network scanner to determine network types.
734  */
735 static struct GNUNET_NT_InterfaceScanner *is;
736
737 /**
738  * Connection to NAT service.
739  */
740 static struct GNUNET_NAT_Handle *nat;
741
742 /**
743  * Port number to which we are actually bound.
744  */
745 static uint16_t my_port;
746
747
748 /**
749  * An interface went away, stop broadcasting on it.
750  *
751  * @param bi entity to close down
752  */
753 static void
754 bi_destroy (struct BroadcastInterface *bi)
755 {
756   if (AF_INET6 == bi->sa->sa_family)
757   {
758     /* Leave the multicast group */
759     if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt (udp_sock,
760                                                        IPPROTO_IPV6,
761                                                        IPV6_LEAVE_GROUP,
762                                                        &bi->mcreq,
763                                                        sizeof(bi->mcreq)))
764     {
765       GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "setsockopt");
766     }
767   }
768   GNUNET_CONTAINER_DLL_remove (bi_head, bi_tail, bi);
769   GNUNET_SCHEDULER_cancel (bi->broadcast_task);
770   GNUNET_free (bi->sa);
771   GNUNET_free_non_null (bi->ba);
772   GNUNET_free (bi);
773 }
774
775
776 /**
777  * Destroys a receiving state due to timeout or shutdown.
778  *
779  * @param receiver entity to close down
780  */
781 static void
782 receiver_destroy (struct ReceiverAddress *receiver)
783 {
784   struct GNUNET_MQ_Handle *mq;
785
786   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
787               "Disconnecting receiver for peer `%s'\n",
788               GNUNET_i2s (&receiver->target));
789   if (NULL != (mq = receiver->mq))
790   {
791     receiver->mq = NULL;
792     GNUNET_MQ_destroy (mq);
793   }
794   if (NULL != receiver->qh)
795   {
796     GNUNET_TRANSPORT_communicator_mq_del (receiver->qh);
797     receiver->qh = NULL;
798   }
799   GNUNET_assert (GNUNET_YES ==
800                  GNUNET_CONTAINER_multipeermap_remove (receivers,
801                                                        &receiver->target,
802                                                        receiver));
803   GNUNET_assert (receiver == GNUNET_CONTAINER_heap_remove_node (receiver->hn));
804   GNUNET_STATISTICS_set (stats,
805                          "# receivers active",
806                          GNUNET_CONTAINER_multipeermap_size (receivers),
807                          GNUNET_NO);
808   GNUNET_free (receiver->address);
809   GNUNET_free (receiver->foreign_addr);
810   GNUNET_free (receiver);
811 }
812
813
814 /**
815  * Free memory used by key cache entry.
816  *
817  * @param kce the key cache entry
818  */
819 static void
820 kce_destroy (struct KeyCacheEntry *kce)
821 {
822   struct SharedSecret *ss = kce->ss;
823
824   ss->active_kce_count--;
825   GNUNET_CONTAINER_DLL_remove (ss->kce_head, ss->kce_tail, kce);
826   GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multishortmap_remove (key_cache,
827                                                                       &kce->kid,
828                                                                       kce));
829   GNUNET_free (kce);
830 }
831
832
833 /**
834  * Compute @a kid.
835  *
836  * @param msec master secret for HMAC calculation
837  * @param serial number for the @a smac calculation
838  * @param kid[out] where to write the key ID
839  */
840 static void
841 get_kid (const struct GNUNET_HashCode *msec,
842          uint32_t serial,
843          struct GNUNET_ShortHashCode *kid)
844 {
845   uint32_t sid = htonl (serial);
846
847   GNUNET_CRYPTO_hkdf (kid,
848                       sizeof(*kid),
849                       GCRY_MD_SHA512,
850                       GCRY_MD_SHA256,
851                       &sid,
852                       sizeof(sid),
853                       msec,
854                       sizeof(*msec),
855                       "UDP-KID",
856                       strlen ("UDP-KID"),
857                       NULL,
858                       0);
859 }
860
861
862 /**
863  * Setup key cache entry for sequence number @a seq and shared secret @a ss.
864  *
865  * @param ss shared secret
866  * @param seq sequence number for the key cache entry
867  */
868 static void
869 kce_generate (struct SharedSecret *ss, uint32_t seq)
870 {
871   struct KeyCacheEntry *kce;
872
873   GNUNET_assert (0 < seq);
874   kce = GNUNET_new (struct KeyCacheEntry);
875   kce->ss = ss;
876   kce->sequence_number = seq;
877   get_kid (&ss->master, seq, &kce->kid);
878   GNUNET_CONTAINER_DLL_insert (ss->kce_head, ss->kce_tail, kce);
879   ss->active_kce_count++;
880   (void) GNUNET_CONTAINER_multishortmap_put (
881     key_cache,
882     &kce->kid,
883     kce,
884     GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
885   GNUNET_STATISTICS_set (stats,
886                          "# KIDs active",
887                          GNUNET_CONTAINER_multishortmap_size (key_cache),
888                          GNUNET_NO);
889 }
890
891
892 /**
893  * Destroy @a ss and associated key cache entries.
894  *
895  * @param ss shared secret to destroy
896  */
897 static void
898 secret_destroy (struct SharedSecret *ss)
899 {
900   struct SenderAddress *sender;
901   struct ReceiverAddress *receiver;
902   struct KeyCacheEntry *kce;
903
904   if (NULL != (sender = ss->sender))
905   {
906     GNUNET_CONTAINER_DLL_remove (sender->ss_head, sender->ss_tail, ss);
907     sender->num_secrets--;
908   }
909   if (NULL != (receiver = ss->receiver))
910   {
911     GNUNET_CONTAINER_DLL_remove (receiver->ss_head, receiver->ss_tail, ss);
912     receiver->num_secrets--;
913     receiver->acks_available -= (ss->sequence_allowed - ss->sequence_used);
914   }
915   while (NULL != (kce = ss->kce_head))
916     kce_destroy (kce);
917   GNUNET_STATISTICS_update (stats, "# Secrets active", -1, GNUNET_NO);
918   GNUNET_STATISTICS_set (stats,
919                          "# KIDs active",
920                          GNUNET_CONTAINER_multishortmap_size (key_cache),
921                          GNUNET_NO);
922   GNUNET_free (ss);
923 }
924
925
926 /**
927  * Functions with this signature are called whenever we need
928  * to close a sender's state due to timeout.
929  *
930  * @param sender entity to close down
931  */
932 static void
933 sender_destroy (struct SenderAddress *sender)
934 {
935   GNUNET_assert (
936     GNUNET_YES ==
937     GNUNET_CONTAINER_multipeermap_remove (senders, &sender->target, sender));
938   GNUNET_assert (sender == GNUNET_CONTAINER_heap_remove_node (sender->hn));
939   GNUNET_STATISTICS_set (stats,
940                          "# senders active",
941                          GNUNET_CONTAINER_multipeermap_size (senders),
942                          GNUNET_NO);
943   GNUNET_free (sender->address);
944   GNUNET_free (sender);
945 }
946
947
948 /**
949  * Compute @a key and @a iv.
950  *
951  * @param msec master secret for calculation
952  * @param serial number for the @a smac calculation
953  * @param key[out] where to write the decrption key
954  * @param iv[out] where to write the IV
955  */
956 static void
957 get_iv_key (const struct GNUNET_HashCode *msec,
958             uint32_t serial,
959             char key[AES_KEY_SIZE],
960             char iv[AES_IV_SIZE])
961 {
962   uint32_t sid = htonl (serial);
963   char res[AES_KEY_SIZE + AES_IV_SIZE];
964
965   GNUNET_CRYPTO_hkdf (res,
966                       sizeof(res),
967                       GCRY_MD_SHA512,
968                       GCRY_MD_SHA256,
969                       &sid,
970                       sizeof(sid),
971                       msec,
972                       sizeof(*msec),
973                       "UDP-IV-KEY",
974                       strlen ("UDP-IV-KEY"),
975                       NULL,
976                       0);
977   memcpy (key, res, AES_KEY_SIZE);
978   memcpy (iv, &res[AES_KEY_SIZE], AES_IV_SIZE);
979 }
980
981
982 /**
983  * Increment sender timeout due to activity.
984  *
985  * @param sender address for which the timeout should be rescheduled
986  */
987 static void
988 reschedule_sender_timeout (struct SenderAddress *sender)
989 {
990   sender->timeout =
991     GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
992   GNUNET_CONTAINER_heap_update_cost (sender->hn, sender->timeout.abs_value_us);
993 }
994
995
996 /**
997  * Increment receiver timeout due to activity.
998  *
999  * @param receiver address for which the timeout should be rescheduled
1000  */
1001 static void
1002 reschedule_receiver_timeout (struct ReceiverAddress *receiver)
1003 {
1004   receiver->timeout =
1005     GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
1006   GNUNET_CONTAINER_heap_update_cost (receiver->hn,
1007                                      receiver->timeout.abs_value_us);
1008 }
1009
1010
1011 /**
1012  * Task run to check #receiver_heap and #sender_heap for timeouts.
1013  *
1014  * @param cls unused, NULL
1015  */
1016 static void
1017 check_timeouts (void *cls)
1018 {
1019   struct GNUNET_TIME_Relative st;
1020   struct GNUNET_TIME_Relative rt;
1021   struct GNUNET_TIME_Relative delay;
1022   struct ReceiverAddress *receiver;
1023   struct SenderAddress *sender;
1024
1025   (void) cls;
1026   timeout_task = NULL;
1027   rt = GNUNET_TIME_UNIT_FOREVER_REL;
1028   while (NULL != (receiver = GNUNET_CONTAINER_heap_peek (receivers_heap)))
1029   {
1030     rt = GNUNET_TIME_absolute_get_remaining (receiver->timeout);
1031     if (0 != rt.rel_value_us)
1032       break;
1033     receiver_destroy (receiver);
1034   }
1035   st = GNUNET_TIME_UNIT_FOREVER_REL;
1036   while (NULL != (sender = GNUNET_CONTAINER_heap_peek (senders_heap)))
1037   {
1038     st = GNUNET_TIME_absolute_get_remaining (sender->timeout);
1039     if (0 != st.rel_value_us)
1040       break;
1041     sender_destroy (sender);
1042   }
1043   delay = GNUNET_TIME_relative_min (rt, st);
1044   if (delay.rel_value_us < GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us)
1045     timeout_task = GNUNET_SCHEDULER_add_delayed (delay, &check_timeouts, NULL);
1046 }
1047
1048
1049 /**
1050  * Calcualte cmac from master in @a ss.
1051  *
1052  * @param ss[in,out] data structure to complete
1053  */
1054 static void
1055 calculate_cmac (struct SharedSecret *ss)
1056 {
1057   GNUNET_CRYPTO_hkdf (&ss->cmac,
1058                       sizeof(ss->cmac),
1059                       GCRY_MD_SHA512,
1060                       GCRY_MD_SHA256,
1061                       "CMAC",
1062                       strlen ("CMAC"),
1063                       &ss->master,
1064                       sizeof(ss->master),
1065                       "UDP-CMAC",
1066                       strlen ("UDP-CMAC"),
1067                       NULL,
1068                       0);
1069 }
1070
1071
1072 /**
1073  * We received @a plaintext_len bytes of @a plaintext from a @a sender.
1074  * Pass it on to CORE.
1075  *
1076  * @param queue the queue that received the plaintext
1077  * @param plaintext the plaintext that was received
1078  * @param plaintext_len number of bytes of plaintext received
1079  */
1080 static void
1081 pass_plaintext_to_core (struct SenderAddress *sender,
1082                         const void *plaintext,
1083                         size_t plaintext_len)
1084 {
1085   const struct GNUNET_MessageHeader *hdr = plaintext;
1086
1087   while (ntohs (hdr->size) < plaintext_len)
1088   {
1089     GNUNET_STATISTICS_update (stats,
1090                               "# bytes given to core",
1091                               ntohs (hdr->size),
1092                               GNUNET_NO);
1093     (void)
1094     GNUNET_TRANSPORT_communicator_receive (ch,
1095                                            &sender->target,
1096                                            hdr,
1097                                            ADDRESS_VALIDITY_PERIOD,
1098                                            NULL   /* no flow control possible */
1099                                            ,
1100                                            NULL);
1101     /* move on to next message, if any */
1102     plaintext_len -= ntohs (hdr->size);
1103     if (plaintext_len < sizeof(*hdr))
1104       break;
1105     hdr = plaintext + ntohs (hdr->size);
1106   }
1107   GNUNET_STATISTICS_update (stats,
1108                             "# bytes padding discarded",
1109                             plaintext_len,
1110                             GNUNET_NO);
1111 }
1112
1113
1114 /**
1115  * Setup @a cipher based on shared secret @a msec and
1116  * serial number @a serial.
1117  *
1118  * @param msec master shared secret
1119  * @param serial serial number of cipher to set up
1120  * @param cipher[out] cipher to initialize
1121  */
1122 static void
1123 setup_cipher (const struct GNUNET_HashCode *msec,
1124               uint32_t serial,
1125               gcry_cipher_hd_t *cipher)
1126 {
1127   char key[AES_KEY_SIZE];
1128   char iv[AES_IV_SIZE];
1129
1130   gcry_cipher_open (cipher,
1131                     GCRY_CIPHER_AES256 /* low level: go for speed */,
1132                     GCRY_CIPHER_MODE_GCM,
1133                     0 /* flags */);
1134   get_iv_key (msec, serial, key, iv);
1135   gcry_cipher_setkey (*cipher, key, sizeof(key));
1136   gcry_cipher_setiv (*cipher, iv, sizeof(iv));
1137 }
1138
1139
1140 /**
1141  * Try to decrypt @a buf using shared secret @a ss and key/iv
1142  * derived using @a serial.
1143  *
1144  * @param ss shared secret
1145  * @param tag GCM authentication tag
1146  * @param serial serial number to use
1147  * @param in_buf input buffer to decrypt
1148  * @param in_buf_size number of bytes in @a in_buf and available in @a out_buf
1149  * @param out_buf where to write the result
1150  * @return #GNUNET_OK on success
1151  */
1152 static int
1153 try_decrypt (const struct SharedSecret *ss,
1154              const char tag[GCM_TAG_SIZE],
1155              uint32_t serial,
1156              const char *in_buf,
1157              size_t in_buf_size,
1158              char *out_buf)
1159 {
1160   gcry_cipher_hd_t cipher;
1161
1162   setup_cipher (&ss->master, serial, &cipher);
1163   GNUNET_assert (
1164     0 ==
1165     gcry_cipher_decrypt (cipher, out_buf, in_buf_size, in_buf, in_buf_size));
1166   if (0 != gcry_cipher_checktag (cipher, tag, GCM_TAG_SIZE))
1167   {
1168     gcry_cipher_close (cipher);
1169     GNUNET_STATISTICS_update (stats,
1170                               "# AEAD authentication failures",
1171                               1,
1172                               GNUNET_NO);
1173     return GNUNET_SYSERR;
1174   }
1175   gcry_cipher_close (cipher);
1176   return GNUNET_OK;
1177 }
1178
1179
1180 /**
1181  * Setup shared secret for decryption.
1182  *
1183  * @param ephemeral ephemeral key we received from the other peer
1184  * @return new shared secret
1185  */
1186 static struct SharedSecret *
1187 setup_shared_secret_dec (const struct GNUNET_CRYPTO_EcdhePublicKey *ephemeral)
1188 {
1189   struct SharedSecret *ss;
1190
1191   ss = GNUNET_new (struct SharedSecret);
1192   GNUNET_CRYPTO_eddsa_ecdh (my_private_key, ephemeral, &ss->master);
1193   return ss;
1194 }
1195
1196
1197 /**
1198  * Setup shared secret for encryption.
1199  *
1200  * @param ephemeral ephemeral key we are sending to the other peer
1201  * @param receiver[in,out] queue to initialize encryption key for
1202  * @return new shared secret
1203  */
1204 static struct SharedSecret *
1205 setup_shared_secret_enc (const struct GNUNET_CRYPTO_EcdhePrivateKey *ephemeral,
1206                          struct ReceiverAddress *receiver)
1207 {
1208   struct SharedSecret *ss;
1209
1210   ss = GNUNET_new (struct SharedSecret);
1211   GNUNET_CRYPTO_ecdh_eddsa (ephemeral,
1212                             &receiver->target.public_key,
1213                             &ss->master);
1214   calculate_cmac (ss);
1215   ss->receiver = receiver;
1216   GNUNET_CONTAINER_DLL_insert (receiver->ss_head, receiver->ss_tail, ss);
1217   receiver->num_secrets++;
1218   GNUNET_STATISTICS_update (stats, "# Secrets active", 1, GNUNET_NO);
1219   return ss;
1220 }
1221
1222
1223 /**
1224  * Setup the MQ for the @a receiver.  If a queue exists,
1225  * the existing one is destroyed.  Then the MTU is
1226  * recalculated and a fresh queue is initialized.
1227  *
1228  * @param receiver receiver to setup MQ for
1229  */
1230 static void
1231 setup_receiver_mq (struct ReceiverAddress *receiver);
1232
1233
1234 /**
1235  * We received an ACK for @a pid. Check if it is for
1236  * the receiver in @a value and if so, handle it and
1237  * return #GNUNET_NO. Otherwise, return #GNUNET_YES.
1238  *
1239  * @param cls a `const struct UDPAck`
1240  * @param pid peer the ACK is from
1241  * @param value a `struct ReceiverAddress`
1242  * @return #GNUNET_YES to continue to iterate
1243  */
1244 static int
1245 handle_ack (void *cls, const struct GNUNET_PeerIdentity *pid, void *value)
1246 {
1247   const struct UDPAck *ack = cls;
1248   struct ReceiverAddress *receiver = value;
1249
1250   (void) pid;
1251   for (struct SharedSecret *ss = receiver->ss_head; NULL != ss; ss = ss->next)
1252   {
1253     if (0 == memcmp (&ack->cmac, &ss->cmac, sizeof(struct GNUNET_HashCode)))
1254     {
1255       uint32_t allowed;
1256
1257       allowed = ntohl (ack->sequence_max);
1258
1259       if (allowed > ss->sequence_allowed)
1260       {
1261         receiver->acks_available += (allowed - ss->sequence_allowed);
1262         if ((allowed - ss->sequence_allowed) == receiver->acks_available)
1263         {
1264           /* we just incremented from zero => MTU change! */
1265           setup_receiver_mq (receiver);
1266         }
1267         ss->sequence_allowed = allowed;
1268         /* move ss to head to avoid discarding it anytime soon! */
1269         GNUNET_CONTAINER_DLL_remove (receiver->ss_head, receiver->ss_tail, ss);
1270         GNUNET_CONTAINER_DLL_insert (receiver->ss_head, receiver->ss_tail, ss);
1271       }
1272       return GNUNET_NO;
1273     }
1274   }
1275   return GNUNET_YES;
1276 }
1277
1278
1279 /**
1280  * Test if we have received a valid message in plaintext.
1281  * If so, handle it.
1282  *
1283  * @param sender peer to process inbound plaintext for
1284  * @param buf buffer we received
1285  * @param buf_size number of bytes in @a buf
1286  */
1287 static void
1288 try_handle_plaintext (struct SenderAddress *sender,
1289                       const void *buf,
1290                       size_t buf_size)
1291 {
1292   const struct GNUNET_MessageHeader *hdr =
1293     (const struct GNUNET_MessageHeader *) buf;
1294   const struct UDPAck *ack = (const struct UDPAck *) buf;
1295   uint16_t type;
1296
1297   if (sizeof(*hdr) > buf_size)
1298     return; /* not even a header */
1299   if (ntohs (hdr->size) > buf_size)
1300     return; /* not even a header */
1301   type = ntohs (hdr->type);
1302   switch (type)
1303   {
1304   case GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK:
1305     /* lookup master secret by 'cmac', then update sequence_max */
1306     GNUNET_CONTAINER_multipeermap_get_multiple (receivers,
1307                                                 &sender->target,
1308                                                 &handle_ack,
1309                                                 (void *) ack);
1310     /* There could be more messages after the ACK, handle those as well */
1311     buf += ntohs (hdr->size);
1312     buf_size -= ntohs (hdr->size);
1313     pass_plaintext_to_core (sender, buf, buf_size);
1314     break;
1315
1316   case GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_PAD:
1317     /* skip padding */
1318     break;
1319
1320   default:
1321     pass_plaintext_to_core (sender, buf, buf_size);
1322   }
1323 }
1324
1325
1326 /**
1327  * We established a shared secret with a sender. We should try to send
1328  * the sender an `struct UDPAck` at the next opportunity to allow the
1329  * sender to use @a ss longer (assuming we did not yet already
1330  * recently).
1331  *
1332  * @param ss shared secret to generate ACKs for
1333  */
1334 static void
1335 consider_ss_ack (struct SharedSecret *ss)
1336 {
1337   GNUNET_assert (NULL != ss->sender);
1338   /* drop ancient KeyCacheEntries */
1339   while ((NULL != ss->kce_head) &&
1340          (MAX_SQN_DELTA <
1341           ss->kce_head->sequence_number - ss->kce_tail->sequence_number))
1342     kce_destroy (ss->kce_tail);
1343   if (ss->active_kce_count < KCN_THRESHOLD)
1344   {
1345     struct UDPAck ack;
1346
1347     while (ss->active_kce_count < KCN_TARGET)
1348       kce_generate (ss, ++ss->sequence_allowed);
1349     ack.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK);
1350     ack.header.size = htons (sizeof(ack));
1351     ack.sequence_max = htonl (ss->sequence_allowed);
1352     ack.cmac = ss->cmac;
1353     GNUNET_TRANSPORT_communicator_notify (ch,
1354                                           &ss->sender->target,
1355                                           COMMUNICATOR_ADDRESS_PREFIX,
1356                                           &ack.header);
1357   }
1358 }
1359
1360
1361 /**
1362  * We received a @a box with matching @a kce.  Decrypt and process it.
1363  *
1364  * @param box the data we received
1365  * @param box_len number of bytes in @a box
1366  * @param kce key index to decrypt @a box
1367  */
1368 static void
1369 decrypt_box (const struct UDPBox *box,
1370              size_t box_len,
1371              struct KeyCacheEntry *kce)
1372 {
1373   struct SharedSecret *ss = kce->ss;
1374   char out_buf[box_len - sizeof(*box)];
1375
1376   GNUNET_assert (NULL != ss->sender);
1377   if (GNUNET_OK != try_decrypt (ss,
1378                                 box->gcm_tag,
1379                                 kce->sequence_number,
1380                                 (const char *) &box[1],
1381                                 sizeof(out_buf),
1382                                 out_buf))
1383   {
1384     GNUNET_STATISTICS_update (stats,
1385                               "# Decryption failures with valid KCE",
1386                               1,
1387                               GNUNET_NO);
1388     kce_destroy (kce);
1389     return;
1390   }
1391   kce_destroy (kce);
1392   GNUNET_STATISTICS_update (stats,
1393                             "# bytes decrypted with BOX",
1394                             sizeof(out_buf),
1395                             GNUNET_NO);
1396   try_handle_plaintext (ss->sender, out_buf, sizeof(out_buf));
1397   consider_ss_ack (ss);
1398 }
1399
1400
1401 /**
1402  * Closure for #find_sender_by_address()
1403  */
1404 struct SearchContext
1405 {
1406   /**
1407    * Address we are looking for.
1408    */
1409   const struct sockaddr *address;
1410
1411   /**
1412    * Number of bytes in @e address.
1413    */
1414   socklen_t address_len;
1415
1416   /**
1417    * Return value to set if we found a match.
1418    */
1419   struct SenderAddress *sender;
1420 };
1421
1422
1423 /**
1424  * Find existing `struct SenderAddress` by matching addresses.
1425  *
1426  * @param cls a `struct SearchContext`
1427  * @param key ignored, must match already
1428  * @param value a `struct SenderAddress`
1429  * @return #GNUNET_YES if not found (continue to search), #GNUNET_NO if found
1430  */
1431 static int
1432 find_sender_by_address (void *cls,
1433                         const struct GNUNET_PeerIdentity *key,
1434                         void *value)
1435 {
1436   struct SearchContext *sc = cls;
1437   struct SenderAddress *sender = value;
1438
1439   if ((sender->address_len == sc->address_len) &&
1440       (0 == memcmp (sender->address, sc->address, sender->address_len)))
1441   {
1442     sc->sender = sender;
1443     return GNUNET_NO;   /* stop iterating! */
1444   }
1445   return GNUNET_YES;
1446 }
1447
1448
1449 /**
1450  * Create sender address for @a target.  Note that we
1451  * might already have one, so a fresh one is only allocated
1452  * if one does not yet exist for @a address.
1453  *
1454  * @param target peer to generate address for
1455  * @param address target address
1456  * @param address_len number of bytes in @a address
1457  * @return data structure to keep track of key material for
1458  *         decrypting data from @a target
1459  */
1460 static struct SenderAddress *
1461 setup_sender (const struct GNUNET_PeerIdentity *target,
1462               const struct sockaddr *address,
1463               socklen_t address_len)
1464 {
1465   struct SenderAddress *sender;
1466   struct SearchContext sc = { .address = address,
1467                               .address_len = address_len,
1468                               .sender = NULL };
1469
1470   GNUNET_CONTAINER_multipeermap_get_multiple (senders,
1471                                               target,
1472                                               &find_sender_by_address,
1473                                               &sc);
1474   if (NULL != sc.sender)
1475   {
1476     reschedule_sender_timeout (sc.sender);
1477     return sc.sender;
1478   }
1479   sender = GNUNET_new (struct SenderAddress);
1480   sender->target = *target;
1481   sender->address = GNUNET_memdup (address, address_len);
1482   sender->address_len = address_len;
1483   (void) GNUNET_CONTAINER_multipeermap_put (
1484     senders,
1485     &sender->target,
1486     sender,
1487     GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
1488   GNUNET_STATISTICS_set (stats,
1489                          "# senders active",
1490                          GNUNET_CONTAINER_multipeermap_size (receivers),
1491                          GNUNET_NO);
1492   sender->timeout =
1493     GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
1494   sender->hn = GNUNET_CONTAINER_heap_insert (senders_heap,
1495                                              sender,
1496                                              sender->timeout.abs_value_us);
1497   sender->nt = GNUNET_NT_scanner_get_type (is, address, address_len);
1498   if (NULL == timeout_task)
1499     timeout_task = GNUNET_SCHEDULER_add_now (&check_timeouts, NULL);
1500   return sender;
1501 }
1502
1503
1504 /**
1505  * Check signature from @a uc against @a ephemeral.
1506  *
1507  * @param ephermal key that is signed
1508  * @param uc signature of claimant
1509  * @return #GNUNET_OK if signature is valid
1510  */
1511 static int
1512 verify_confirmation (const struct GNUNET_CRYPTO_EcdhePublicKey *ephemeral,
1513                      const struct UDPConfirmation *uc)
1514 {
1515   struct UdpHandshakeSignature uhs;
1516
1517   uhs.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_UDP_HANDSHAKE);
1518   uhs.purpose.size = htonl (sizeof(uhs));
1519   uhs.sender = uc->sender;
1520   uhs.receiver = my_identity;
1521   uhs.ephemeral = *ephemeral;
1522   uhs.monotonic_time = uc->monotonic_time;
1523   return GNUNET_CRYPTO_eddsa_verify (
1524     GNUNET_SIGNATURE_COMMUNICATOR_UDP_HANDSHAKE,
1525     &uhs.purpose,
1526     &uc->sender_sig,
1527     &uc->sender.public_key);
1528 }
1529
1530
1531 /**
1532  * Converts @a address to the address string format used by this
1533  * communicator in HELLOs.
1534  *
1535  * @param address the address to convert, must be AF_INET or AF_INET6.
1536  * @param address_len number of bytes in @a address
1537  * @return string representation of @a address
1538  */
1539 static char *
1540 sockaddr_to_udpaddr_string (const struct sockaddr *address,
1541                             socklen_t address_len)
1542 {
1543   char *ret;
1544
1545   switch (address->sa_family)
1546   {
1547   case AF_INET:
1548     GNUNET_asprintf (&ret,
1549                      "%s-%s",
1550                      COMMUNICATOR_ADDRESS_PREFIX,
1551                      GNUNET_a2s (address, address_len));
1552     break;
1553
1554   case AF_INET6:
1555     GNUNET_asprintf (&ret,
1556                      "%s-%s",
1557                      COMMUNICATOR_ADDRESS_PREFIX,
1558                      GNUNET_a2s (address, address_len));
1559     break;
1560
1561   default:
1562     GNUNET_assert (0);
1563   }
1564   return ret;
1565 }
1566
1567
1568 /**
1569  * Socket read task.
1570  *
1571  * @param cls NULL
1572  */
1573 static void
1574 sock_read (void *cls)
1575 {
1576   struct sockaddr_storage sa;
1577   socklen_t salen = sizeof(sa);
1578   char buf[UINT16_MAX];
1579   ssize_t rcvd;
1580
1581   (void) cls;
1582   read_task = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
1583                                              udp_sock,
1584                                              &sock_read,
1585                                              NULL);
1586   rcvd = GNUNET_NETWORK_socket_recvfrom (udp_sock,
1587                                          buf,
1588                                          sizeof(buf),
1589                                          (struct sockaddr *) &sa,
1590                                          &salen);
1591   if (-1 == rcvd)
1592   {
1593     GNUNET_log_strerror (GNUNET_ERROR_TYPE_DEBUG, "recv");
1594     return;
1595   }
1596
1597   /* first, see if it is a UDPBox */
1598   if (rcvd > sizeof(struct UDPBox))
1599   {
1600     const struct UDPBox *box;
1601     struct KeyCacheEntry *kce;
1602
1603     box = (const struct UDPBox *) buf;
1604     kce = GNUNET_CONTAINER_multishortmap_get (key_cache, &box->kid);
1605     if (NULL != kce)
1606     {
1607       decrypt_box (box, (size_t) rcvd, kce);
1608       return;
1609     }
1610   }
1611
1612   /* next, check if it is a broadcast */
1613   if (sizeof(struct UDPBroadcast) == rcvd)
1614   {
1615     const struct UDPBroadcast *ub;
1616     struct UdpBroadcastSignature uhs;
1617
1618     ub = (const struct UDPBroadcast *) buf;
1619     uhs.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST);
1620     uhs.purpose.size = htonl (sizeof(uhs));
1621     uhs.sender = ub->sender;
1622     GNUNET_CRYPTO_hash (&sa, salen, &uhs.h_address);
1623     if (GNUNET_OK ==
1624         GNUNET_CRYPTO_eddsa_verify (GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST,
1625                                     &uhs.purpose,
1626                                     &ub->sender_sig,
1627                                     &ub->sender.public_key))
1628     {
1629       char *addr_s;
1630       enum GNUNET_NetworkType nt;
1631
1632       addr_s =
1633         sockaddr_to_udpaddr_string ((const struct sockaddr *) &sa, salen);
1634       GNUNET_STATISTICS_update (stats, "# broadcasts received", 1, GNUNET_NO);
1635       /* use our own mechanism to determine network type */
1636       nt =
1637         GNUNET_NT_scanner_get_type (is, (const struct sockaddr *) &sa, salen);
1638       GNUNET_TRANSPORT_application_validate (ah, &ub->sender, nt, addr_s);
1639       GNUNET_free (addr_s);
1640       return;
1641     }
1642     /* continue with KX, mostly for statistics... */
1643   }
1644
1645
1646   /* finally, test if it is a KX */
1647   if (rcvd < sizeof(struct UDPConfirmation) + sizeof(struct InitialKX))
1648   {
1649     GNUNET_STATISTICS_update (stats,
1650                               "# messages dropped (no kid, too small for KX)",
1651                               1,
1652                               GNUNET_NO);
1653     return;
1654   }
1655
1656   {
1657     const struct InitialKX *kx;
1658     struct SharedSecret *ss;
1659     char pbuf[rcvd - sizeof(struct InitialKX)];
1660     const struct UDPConfirmation *uc;
1661     struct SenderAddress *sender;
1662
1663     kx = (const struct InitialKX *) buf;
1664     ss = setup_shared_secret_dec (&kx->ephemeral);
1665     if (GNUNET_OK != try_decrypt (ss,
1666                                   kx->gcm_tag,
1667                                   0,
1668                                   &buf[sizeof(*kx)],
1669                                   sizeof(pbuf),
1670                                   pbuf))
1671     {
1672       GNUNET_free (ss);
1673       GNUNET_STATISTICS_update (
1674         stats,
1675         "# messages dropped (no kid, AEAD decryption failed)",
1676         1,
1677         GNUNET_NO);
1678       return;
1679     }
1680     uc = (const struct UDPConfirmation *) pbuf;
1681     if (GNUNET_OK != verify_confirmation (&kx->ephemeral, uc))
1682     {
1683       GNUNET_break_op (0);
1684       GNUNET_free (ss);
1685       GNUNET_STATISTICS_update (stats,
1686                                 "# messages dropped (sender signature invalid)",
1687                                 1,
1688                                 GNUNET_NO);
1689       return;
1690     }
1691     calculate_cmac (ss);
1692     sender = setup_sender (&uc->sender, (const struct sockaddr *) &sa, salen);
1693     ss->sender = sender;
1694     GNUNET_CONTAINER_DLL_insert (sender->ss_head, sender->ss_tail, ss);
1695     sender->num_secrets++;
1696     GNUNET_STATISTICS_update (stats, "# Secrets active", 1, GNUNET_NO);
1697     GNUNET_STATISTICS_update (stats,
1698                               "# messages decrypted without BOX",
1699                               1,
1700                               GNUNET_NO);
1701     try_handle_plaintext (sender, &uc[1], sizeof(pbuf) - sizeof(*uc));
1702     consider_ss_ack (ss);
1703     if (sender->num_secrets > MAX_SECRETS)
1704       secret_destroy (sender->ss_tail);
1705   }
1706 }
1707
1708
1709 /**
1710  * Convert UDP bind specification to a `struct sockaddr *`
1711  *
1712  * @param bindto bind specification to convert
1713  * @param[out] sock_len set to the length of the address
1714  * @return converted bindto specification
1715  */
1716 static struct sockaddr *
1717 udp_address_to_sockaddr (const char *bindto, socklen_t *sock_len)
1718 {
1719   struct sockaddr *in;
1720   unsigned int port;
1721   char dummy[2];
1722   char *colon;
1723   char *cp;
1724
1725   if (1 == sscanf (bindto, "%u%1s", &port, dummy))
1726   {
1727     /* interpreting value as just a PORT number */
1728     if (port > UINT16_MAX)
1729     {
1730       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1731                   "BINDTO specification `%s' invalid: value too large for port\n",
1732                   bindto);
1733       return NULL;
1734     }
1735     if ((GNUNET_NO == GNUNET_NETWORK_test_pf (PF_INET6)) ||
1736         (GNUNET_YES ==
1737          GNUNET_CONFIGURATION_get_value_yesno (cfg,
1738                                                COMMUNICATOR_CONFIG_SECTION,
1739                                                "DISABLE_V6")))
1740     {
1741       struct sockaddr_in *i4;
1742
1743       i4 = GNUNET_malloc (sizeof(struct sockaddr_in));
1744       i4->sin_family = AF_INET;
1745       i4->sin_port = htons ((uint16_t) port);
1746       *sock_len = sizeof(struct sockaddr_in);
1747       in = (struct sockaddr *) i4;
1748     }
1749     else
1750     {
1751       struct sockaddr_in6 *i6;
1752
1753       i6 = GNUNET_malloc (sizeof(struct sockaddr_in6));
1754       i6->sin6_family = AF_INET6;
1755       i6->sin6_port = htons ((uint16_t) port);
1756       *sock_len = sizeof(struct sockaddr_in6);
1757       in = (struct sockaddr *) i6;
1758     }
1759     return in;
1760   }
1761   cp = GNUNET_strdup (bindto);
1762   colon = strrchr (cp, ':');
1763   if (NULL != colon)
1764   {
1765     /* interpet value after colon as port */
1766     *colon = '\0';
1767     colon++;
1768     if (1 == sscanf (colon, "%u%1s", &port, dummy))
1769     {
1770       /* interpreting value as just a PORT number */
1771       if (port > UINT16_MAX)
1772       {
1773         GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1774                     "BINDTO specification `%s' invalid: value too large for port\n",
1775                     bindto);
1776         GNUNET_free (cp);
1777         return NULL;
1778       }
1779     }
1780     else
1781     {
1782       GNUNET_log (
1783         GNUNET_ERROR_TYPE_ERROR,
1784         "BINDTO specification `%s' invalid: last ':' not followed by number\n",
1785         bindto);
1786       GNUNET_free (cp);
1787       return NULL;
1788     }
1789   }
1790   else
1791   {
1792     /* interpret missing port as 0, aka pick any free one */
1793     port = 0;
1794   }
1795   {
1796     /* try IPv4 */
1797     struct sockaddr_in v4;
1798
1799     if (1 == inet_pton (AF_INET, cp, &v4))
1800     {
1801       v4.sin_port = htons ((uint16_t) port);
1802       in = GNUNET_memdup (&v4, sizeof(v4));
1803       *sock_len = sizeof(v4);
1804       GNUNET_free (cp);
1805       return in;
1806     }
1807   }
1808   {
1809     /* try IPv6 */
1810     struct sockaddr_in6 v6;
1811     const char *start;
1812
1813     start = cp;
1814     if (('[' == *cp) && (']' == cp[strlen (cp) - 1]))
1815     {
1816       start++;   /* skip over '[' */
1817       cp[strlen (cp) - 1] = '\0';  /* eat ']' */
1818     }
1819     if (1 == inet_pton (AF_INET6, start, &v6))
1820     {
1821       v6.sin6_port = htons ((uint16_t) port);
1822       in = GNUNET_memdup (&v6, sizeof(v6));
1823       *sock_len = sizeof(v6);
1824       GNUNET_free (cp);
1825       return in;
1826     }
1827   }
1828   /* #5528 FIXME (feature!): maybe also try getnameinfo()? */
1829   GNUNET_free (cp);
1830   return NULL;
1831 }
1832
1833
1834 /**
1835  * Pad @a dgram by @a pad_size using @a out_cipher.
1836  *
1837  * @param out_cipher cipher to use
1838  * @param dgram datagram to pad
1839  * @param pad_size number of bytes of padding to append
1840  */
1841 static void
1842 do_pad (gcry_cipher_hd_t out_cipher, char *dgram, size_t pad_size)
1843 {
1844   char pad[pad_size];
1845
1846   GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, pad, sizeof(pad));
1847   if (sizeof(pad) > sizeof(struct GNUNET_MessageHeader))
1848   {
1849     struct GNUNET_MessageHeader hdr =
1850     { .size = htons (sizeof(pad)),
1851       .type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_PAD) };
1852
1853     memcpy (pad, &hdr, sizeof(hdr));
1854   }
1855   GNUNET_assert (
1856     0 ==
1857     gcry_cipher_encrypt (out_cipher, dgram, sizeof(pad), pad, sizeof(pad)));
1858 }
1859
1860
1861 /**
1862  * Signature of functions implementing the sending functionality of a
1863  * message queue.
1864  *
1865  * @param mq the message queue
1866  * @param msg the message to send
1867  * @param impl_state our `struct ReceiverAddress`
1868  */
1869 static void
1870 mq_send (struct GNUNET_MQ_Handle *mq,
1871          const struct GNUNET_MessageHeader *msg,
1872          void *impl_state)
1873 {
1874   struct ReceiverAddress *receiver = impl_state;
1875   uint16_t msize = ntohs (msg->size);
1876
1877   GNUNET_assert (mq == receiver->mq);
1878   if (msize > receiver->mtu)
1879   {
1880     GNUNET_break (0);
1881     receiver_destroy (receiver);
1882     return;
1883   }
1884   reschedule_receiver_timeout (receiver);
1885
1886   if (0 == receiver->acks_available)
1887   {
1888     /* use KX encryption method */
1889     struct UdpHandshakeSignature uhs;
1890     struct UDPConfirmation uc;
1891     struct InitialKX kx;
1892     struct GNUNET_CRYPTO_EcdhePrivateKey epriv;
1893     char dgram[receiver->mtu + sizeof(uc) + sizeof(kx)];
1894     size_t dpos;
1895     gcry_cipher_hd_t out_cipher;
1896     struct SharedSecret *ss;
1897
1898     /* setup key material */
1899     GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_ecdhe_key_create2 (&epriv));
1900
1901     ss = setup_shared_secret_enc (&epriv, receiver);
1902     setup_cipher (&ss->master, 0, &out_cipher);
1903     /* compute 'uc' */
1904     uc.sender = my_identity;
1905     uc.monotonic_time =
1906       GNUNET_TIME_absolute_hton (GNUNET_TIME_absolute_get_monotonic (cfg));
1907     uhs.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_UDP_HANDSHAKE);
1908     uhs.purpose.size = htonl (sizeof(uhs));
1909     uhs.sender = my_identity;
1910     uhs.receiver = receiver->target;
1911     GNUNET_CRYPTO_ecdhe_key_get_public (&epriv, &uhs.ephemeral);
1912     uhs.monotonic_time = uc.monotonic_time;
1913     GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_eddsa_sign (my_private_key,
1914                                                           &uhs.purpose,
1915                                                           &uc.sender_sig));
1916     /* Leave space for kx */
1917     dpos = sizeof(struct GNUNET_CRYPTO_EcdhePublicKey);
1918     /* Append encrypted uc to dgram */
1919     GNUNET_assert (0 == gcry_cipher_encrypt (out_cipher,
1920                                              &dgram[dpos],
1921                                              sizeof(uc),
1922                                              &uc,
1923                                              sizeof(uc)));
1924     dpos += sizeof(uc);
1925     /* Append encrypted payload to dgram */
1926     GNUNET_assert (
1927       0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize, msg, msize));
1928     dpos += msize;
1929     do_pad (out_cipher, &dgram[dpos], sizeof(dgram) - dpos);
1930     /* Datagram starts with kx */
1931     kx.ephemeral = uhs.ephemeral;
1932     GNUNET_assert (
1933       0 == gcry_cipher_gettag (out_cipher, kx.gcm_tag, sizeof(kx.gcm_tag)));
1934     gcry_cipher_close (out_cipher);
1935     memcpy (dgram, &kx, sizeof(kx));
1936     if (-1 == GNUNET_NETWORK_socket_sendto (udp_sock,
1937                                             dgram,
1938                                             sizeof(dgram),
1939                                             receiver->address,
1940                                             receiver->address_len))
1941       GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send");
1942     GNUNET_MQ_impl_send_continue (mq);
1943     return;
1944   }   /* End of KX encryption method */
1945
1946   /* begin "BOX" encryption method, scan for ACKs from tail! */
1947   for (struct SharedSecret *ss = receiver->ss_tail; NULL != ss; ss = ss->prev)
1948   {
1949     if (ss->sequence_used < ss->sequence_allowed)
1950     {
1951       char dgram[sizeof(struct UDPBox) + receiver->mtu];
1952       struct UDPBox *box;
1953       gcry_cipher_hd_t out_cipher;
1954       size_t dpos;
1955
1956       box = (struct UDPBox *) dgram;
1957       ss->sequence_used++;
1958       get_kid (&ss->master, ss->sequence_used, &box->kid);
1959       setup_cipher (&ss->master, ss->sequence_used, &out_cipher);
1960       /* Append encrypted payload to dgram */
1961       dpos = sizeof(struct UDPBox);
1962       GNUNET_assert (
1963         0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize, msg, msize));
1964       dpos += msize;
1965       do_pad (out_cipher, &dgram[dpos], sizeof(dgram) - dpos);
1966       GNUNET_assert (0 == gcry_cipher_gettag (out_cipher,
1967                                               box->gcm_tag,
1968                                               sizeof(box->gcm_tag)));
1969       gcry_cipher_close (out_cipher);
1970       if (-1 == GNUNET_NETWORK_socket_sendto (udp_sock,
1971                                               dgram,
1972                                               sizeof(dgram),
1973                                               receiver->address,
1974                                               receiver->address_len))
1975         GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send");
1976       GNUNET_MQ_impl_send_continue (mq);
1977       receiver->acks_available--;
1978       if (0 == receiver->acks_available)
1979       {
1980         /* We have no more ACKs => MTU change! */
1981         setup_receiver_mq (receiver);
1982       }
1983       return;
1984     }
1985   }
1986   GNUNET_assert (0);
1987 }
1988
1989
1990 /**
1991  * Signature of functions implementing the destruction of a message
1992  * queue.  Implementations must not free @a mq, but should take care
1993  * of @a impl_state.
1994  *
1995  * @param mq the message queue to destroy
1996  * @param impl_state our `struct ReceiverAddress`
1997  */
1998 static void
1999 mq_destroy (struct GNUNET_MQ_Handle *mq, void *impl_state)
2000 {
2001   struct ReceiverAddress *receiver = impl_state;
2002
2003   if (mq == receiver->mq)
2004   {
2005     receiver->mq = NULL;
2006     receiver_destroy (receiver);
2007   }
2008 }
2009
2010
2011 /**
2012  * Implementation function that cancels the currently sent message.
2013  *
2014  * @param mq message queue
2015  * @param impl_state our `struct RecvierAddress`
2016  */
2017 static void
2018 mq_cancel (struct GNUNET_MQ_Handle *mq, void *impl_state)
2019 {
2020   /* Cancellation is impossible with UDP; bail */
2021   GNUNET_assert (0);
2022 }
2023
2024
2025 /**
2026  * Generic error handler, called with the appropriate
2027  * error code and the same closure specified at the creation of
2028  * the message queue.
2029  * Not every message queue implementation supports an error handler.
2030  *
2031  * @param cls our `struct ReceiverAddress`
2032  * @param error error code
2033  */
2034 static void
2035 mq_error (void *cls, enum GNUNET_MQ_Error error)
2036 {
2037   struct ReceiverAddress *receiver = cls;
2038
2039   GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
2040               "MQ error in queue to %s: %d\n",
2041               GNUNET_i2s (&receiver->target),
2042               (int) error);
2043   receiver_destroy (receiver);
2044 }
2045
2046
2047 /**
2048  * Setup the MQ for the @a receiver.  If a queue exists,
2049  * the existing one is destroyed.  Then the MTU is
2050  * recalculated and a fresh queue is initialized.
2051  *
2052  * @param receiver receiver to setup MQ for
2053  */
2054 static void
2055 setup_receiver_mq (struct ReceiverAddress *receiver)
2056 {
2057   size_t base_mtu;
2058
2059   if (NULL != receiver->qh)
2060   {
2061     GNUNET_TRANSPORT_communicator_mq_del (receiver->qh);
2062     receiver->qh = NULL;
2063   }
2064   GNUNET_assert (NULL == receiver->mq);
2065   switch (receiver->address->sa_family)
2066   {
2067   case AF_INET:
2068     base_mtu = 1480   /* Ethernet MTU, 1500 - Ethernet header - VLAN tag */
2069                - sizeof(struct GNUNET_TUN_IPv4Header)   /* 20 */
2070                - sizeof(struct GNUNET_TUN_UdpHeader) /* 8 */;
2071     break;
2072
2073   case AF_INET6:
2074     base_mtu = 1280   /* Minimum MTU required by IPv6 */
2075                - sizeof(struct GNUNET_TUN_IPv6Header)   /* 40 */
2076                - sizeof(struct GNUNET_TUN_UdpHeader) /* 8 */;
2077     break;
2078
2079   default:
2080     GNUNET_assert (0);
2081     break;
2082   }
2083   if (0 == receiver->acks_available)
2084   {
2085     /* MTU based on full KX messages */
2086     receiver->mtu = base_mtu - sizeof(struct InitialKX)   /* 48 */
2087                     - sizeof(struct UDPConfirmation);   /* 104 */
2088   }
2089   else
2090   {
2091     /* MTU based on BOXed messages */
2092     receiver->mtu = base_mtu - sizeof(struct UDPBox);
2093   }
2094   /* => Effective MTU for CORE will range from 1080 (IPv6 + KX) to
2095      1404 (IPv4 + Box) bytes, depending on circumstances... */
2096   if (NULL == receiver->mq)
2097     receiver->mq = GNUNET_MQ_queue_for_callbacks (&mq_send,
2098                                                   &mq_destroy,
2099                                                   &mq_cancel,
2100                                                   receiver,
2101                                                   NULL,
2102                                                   &mq_error,
2103                                                   receiver);
2104   receiver->qh =
2105     GNUNET_TRANSPORT_communicator_mq_add (ch,
2106                                           &receiver->target,
2107                                           receiver->foreign_addr,
2108                                           receiver->mtu,
2109                                           receiver->nt,
2110                                           GNUNET_TRANSPORT_CS_OUTBOUND,
2111                                           receiver->mq);
2112 }
2113
2114
2115 /**
2116  * Function called by the transport service to initialize a
2117  * message queue given address information about another peer.
2118  * If and when the communication channel is established, the
2119  * communicator must call #GNUNET_TRANSPORT_communicator_mq_add()
2120  * to notify the service that the channel is now up.  It is
2121  * the responsibility of the communicator to manage sane
2122  * retries and timeouts for any @a peer/@a address combination
2123  * provided by the transport service.  Timeouts and retries
2124  * do not need to be signalled to the transport service.
2125  *
2126  * @param cls closure
2127  * @param peer identity of the other peer
2128  * @param address where to send the message, human-readable
2129  *        communicator-specific format, 0-terminated, UTF-8
2130  * @return #GNUNET_OK on success, #GNUNET_SYSERR if the provided address is
2131  * invalid
2132  */
2133 static int
2134 mq_init (void *cls, const struct GNUNET_PeerIdentity *peer, const char *address)
2135 {
2136   struct ReceiverAddress *receiver;
2137   const char *path;
2138   struct sockaddr *in;
2139   socklen_t in_len;
2140
2141   if (0 != strncmp (address,
2142                     COMMUNICATOR_ADDRESS_PREFIX "-",
2143                     strlen (COMMUNICATOR_ADDRESS_PREFIX "-")))
2144   {
2145     GNUNET_break_op (0);
2146     return GNUNET_SYSERR;
2147   }
2148   path = &address[strlen (COMMUNICATOR_ADDRESS_PREFIX "-")];
2149   in = udp_address_to_sockaddr (path, &in_len);
2150
2151   receiver = GNUNET_new (struct ReceiverAddress);
2152   receiver->address = in;
2153   receiver->address_len = in_len;
2154   receiver->target = *peer;
2155   receiver->nt = GNUNET_NT_scanner_get_type (is, in, in_len);
2156   (void) GNUNET_CONTAINER_multipeermap_put (
2157     receivers,
2158     &receiver->target,
2159     receiver,
2160     GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
2161   receiver->timeout =
2162     GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
2163   receiver->hn = GNUNET_CONTAINER_heap_insert (receivers_heap,
2164                                                receiver,
2165                                                receiver->timeout.abs_value_us);
2166   GNUNET_STATISTICS_set (stats,
2167                          "# receivers active",
2168                          GNUNET_CONTAINER_multipeermap_size (receivers),
2169                          GNUNET_NO);
2170   receiver->foreign_addr =
2171     sockaddr_to_udpaddr_string (receiver->address, receiver->address_len);
2172   setup_receiver_mq (receiver);
2173   if (NULL == timeout_task)
2174     timeout_task = GNUNET_SCHEDULER_add_now (&check_timeouts, NULL);
2175   return GNUNET_OK;
2176 }
2177
2178
2179 /**
2180  * Iterator over all receivers to clean up.
2181  *
2182  * @param cls NULL
2183  * @param target unused
2184  * @param value the queue to destroy
2185  * @return #GNUNET_OK to continue to iterate
2186  */
2187 static int
2188 get_receiver_delete_it (void *cls,
2189                         const struct GNUNET_PeerIdentity *target,
2190                         void *value)
2191 {
2192   struct ReceiverAddress *receiver = value;
2193
2194   (void) cls;
2195   (void) target;
2196   receiver_destroy (receiver);
2197   return GNUNET_OK;
2198 }
2199
2200
2201 /**
2202  * Iterator over all senders to clean up.
2203  *
2204  * @param cls NULL
2205  * @param target unused
2206  * @param value the queue to destroy
2207  * @return #GNUNET_OK to continue to iterate
2208  */
2209 static int
2210 get_sender_delete_it (void *cls,
2211                       const struct GNUNET_PeerIdentity *target,
2212                       void *value)
2213 {
2214   struct SenderAddress *sender = value;
2215
2216   (void) cls;
2217   (void) target;
2218   sender_destroy (sender);
2219   return GNUNET_OK;
2220 }
2221
2222
2223 /**
2224  * Shutdown the UNIX communicator.
2225  *
2226  * @param cls NULL (always)
2227  */
2228 static void
2229 do_shutdown (void *cls)
2230 {
2231   if (NULL != nat)
2232   {
2233     GNUNET_NAT_unregister (nat);
2234     nat = NULL;
2235   }
2236   while (NULL != bi_head)
2237     bi_destroy (bi_head);
2238   if (NULL != broadcast_task)
2239   {
2240     GNUNET_SCHEDULER_cancel (broadcast_task);
2241     broadcast_task = NULL;
2242   }
2243   if (NULL != read_task)
2244   {
2245     GNUNET_SCHEDULER_cancel (read_task);
2246     read_task = NULL;
2247   }
2248   if (NULL != udp_sock)
2249   {
2250     GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (udp_sock));
2251     udp_sock = NULL;
2252   }
2253   GNUNET_CONTAINER_multipeermap_iterate (receivers,
2254                                          &get_receiver_delete_it,
2255                                          NULL);
2256   GNUNET_CONTAINER_multipeermap_destroy (receivers);
2257   GNUNET_CONTAINER_multipeermap_iterate (senders, &get_sender_delete_it, NULL);
2258   GNUNET_CONTAINER_multipeermap_destroy (senders);
2259   GNUNET_CONTAINER_multishortmap_destroy (key_cache);
2260   GNUNET_CONTAINER_heap_destroy (senders_heap);
2261   GNUNET_CONTAINER_heap_destroy (receivers_heap);
2262   if (NULL != ch)
2263   {
2264     GNUNET_TRANSPORT_communicator_disconnect (ch);
2265     ch = NULL;
2266   }
2267   if (NULL != ah)
2268   {
2269     GNUNET_TRANSPORT_application_done (ah);
2270     ah = NULL;
2271   }
2272   if (NULL != stats)
2273   {
2274     GNUNET_STATISTICS_destroy (stats, GNUNET_NO);
2275     stats = NULL;
2276   }
2277   if (NULL != my_private_key)
2278   {
2279     GNUNET_free (my_private_key);
2280     my_private_key = NULL;
2281   }
2282   if (NULL != is)
2283   {
2284     GNUNET_NT_scanner_done (is);
2285     is = NULL;
2286   }
2287 }
2288
2289
2290 /**
2291  * Function called when the transport service has received a
2292  * backchannel message for this communicator (!) via a different return
2293  * path. Should be an acknowledgement.
2294  *
2295  * @param cls closure, NULL
2296  * @param sender which peer sent the notification
2297  * @param msg payload
2298  */
2299 static void
2300 enc_notify_cb (void *cls,
2301                const struct GNUNET_PeerIdentity *sender,
2302                const struct GNUNET_MessageHeader *msg)
2303 {
2304   const struct UDPAck *ack;
2305
2306   (void) cls;
2307   if ((ntohs (msg->type) != GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK) ||
2308       (ntohs (msg->size) != sizeof(struct UDPAck)))
2309   {
2310     GNUNET_break_op (0);
2311     return;
2312   }
2313   ack = (const struct UDPAck *) msg;
2314   GNUNET_CONTAINER_multipeermap_get_multiple (receivers,
2315                                               sender,
2316                                               &handle_ack,
2317                                               (void *) ack);
2318 }
2319
2320
2321 /**
2322  * Signature of the callback passed to #GNUNET_NAT_register() for
2323  * a function to call whenever our set of 'valid' addresses changes.
2324  *
2325  * @param cls closure
2326  * @param app_ctx[in,out] location where the app can store stuff
2327  *                  on add and retrieve it on remove
2328  * @param add_remove #GNUNET_YES to add a new public IP address,
2329  *                   #GNUNET_NO to remove a previous (now invalid) one
2330  * @param ac address class the address belongs to
2331  * @param addr either the previous or the new public IP address
2332  * @param addrlen actual length of the @a addr
2333  */
2334 static void
2335 nat_address_cb (void *cls,
2336                 void **app_ctx,
2337                 int add_remove,
2338                 enum GNUNET_NAT_AddressClass ac,
2339                 const struct sockaddr *addr,
2340                 socklen_t addrlen)
2341 {
2342   char *my_addr;
2343   struct GNUNET_TRANSPORT_AddressIdentifier *ai;
2344
2345   if (GNUNET_YES == add_remove)
2346   {
2347     enum GNUNET_NetworkType nt;
2348
2349     GNUNET_asprintf (&my_addr,
2350                      "%s-%s",
2351                      COMMUNICATOR_ADDRESS_PREFIX,
2352                      GNUNET_a2s (addr, addrlen));
2353     nt = GNUNET_NT_scanner_get_type (is, addr, addrlen);
2354     ai =
2355       GNUNET_TRANSPORT_communicator_address_add (ch,
2356                                                  my_addr,
2357                                                  nt,
2358                                                  GNUNET_TIME_UNIT_FOREVER_REL);
2359     GNUNET_free (my_addr);
2360     *app_ctx = ai;
2361   }
2362   else
2363   {
2364     ai = *app_ctx;
2365     GNUNET_TRANSPORT_communicator_address_remove (ai);
2366     *app_ctx = NULL;
2367   }
2368 }
2369
2370
2371 /**
2372  * Broadcast our presence on one of our interfaces.
2373  *
2374  * @param cls a `struct BroadcastInterface`
2375  */
2376 static void
2377 ifc_broadcast (void *cls)
2378 {
2379   struct BroadcastInterface *bi = cls;
2380   struct GNUNET_TIME_Relative delay;
2381
2382   delay = BROADCAST_FREQUENCY;
2383   delay.rel_value_us =
2384     GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, delay.rel_value_us);
2385   bi->broadcast_task =
2386     GNUNET_SCHEDULER_add_delayed (INTERFACE_SCAN_FREQUENCY, &ifc_broadcast, bi);
2387
2388   switch (bi->sa->sa_family)
2389   {
2390   case AF_INET: {
2391       static int yes = 1;
2392       static int no = 0;
2393       ssize_t sent;
2394
2395       if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt (udp_sock,
2396                                                          SOL_SOCKET,
2397                                                          SO_BROADCAST,
2398                                                          &yes,
2399                                                          sizeof(int)))
2400         GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "setsockopt");
2401       sent = GNUNET_NETWORK_socket_sendto (udp_sock,
2402                                            &bi->bcm,
2403                                            sizeof(bi->bcm),
2404                                            bi->ba,
2405                                            bi->salen);
2406       if (-1 == sent)
2407         GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "sendto");
2408       if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt (udp_sock,
2409                                                          SOL_SOCKET,
2410                                                          SO_BROADCAST,
2411                                                          &no,
2412                                                          sizeof(int)))
2413         GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "setsockopt");
2414       break;
2415     }
2416
2417   case AF_INET6: {
2418       ssize_t sent;
2419       struct sockaddr_in6 dst;
2420
2421       dst.sin6_family = AF_INET6;
2422       dst.sin6_port = htons (my_port);
2423       dst.sin6_addr = bi->mcreq.ipv6mr_multiaddr;
2424       dst.sin6_scope_id = ((struct sockaddr_in6 *) bi->ba)->sin6_scope_id;
2425
2426       sent = GNUNET_NETWORK_socket_sendto (udp_sock,
2427                                            &bi->bcm,
2428                                            sizeof(bi->bcm),
2429                                            (const struct sockaddr *) &dst,
2430                                            sizeof(dst));
2431       if (-1 == sent)
2432         GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "sendto");
2433       break;
2434     }
2435
2436   default:
2437     GNUNET_break (0);
2438     break;
2439   }
2440 }
2441
2442
2443 /**
2444  * Callback function invoked for each interface found.
2445  * Activates/deactivates broadcast interfaces.
2446  *
2447  * @param cls NULL
2448  * @param name name of the interface (can be NULL for unknown)
2449  * @param isDefault is this presumably the default interface
2450  * @param addr address of this interface (can be NULL for unknown or unassigned)
2451  * @param broadcast_addr the broadcast address (can be NULL for unknown or
2452  * unassigned)
2453  * @param netmask the network mask (can be NULL for unknown or unassigned)
2454  * @param addrlen length of the address
2455  * @return #GNUNET_OK to continue iteration, #GNUNET_SYSERR to abort
2456  */
2457 static int
2458 iface_proc (void *cls,
2459             const char *name,
2460             int isDefault,
2461             const struct sockaddr *addr,
2462             const struct sockaddr *broadcast_addr,
2463             const struct sockaddr *netmask,
2464             socklen_t addrlen)
2465 {
2466   struct BroadcastInterface *bi;
2467   enum GNUNET_NetworkType network;
2468   struct UdpBroadcastSignature ubs;
2469
2470   (void) cls;
2471   (void) netmask;
2472   if (NULL == addr)
2473     return GNUNET_YES; /* need to know our address! */
2474   network = GNUNET_NT_scanner_get_type (is, addr, addrlen);
2475   if (GNUNET_NT_LOOPBACK == network)
2476   {
2477     /* Broadcasting on loopback does not make sense */
2478     return GNUNET_YES;
2479   }
2480   for (bi = bi_head; NULL != bi; bi = bi->next)
2481   {
2482     if ((bi->salen == addrlen) && (0 == memcmp (addr, bi->sa, addrlen)))
2483     {
2484       bi->found = GNUNET_YES;
2485       return GNUNET_OK;
2486     }
2487   }
2488
2489   if ((AF_INET6 == addr->sa_family) && (NULL == broadcast_addr))
2490     return GNUNET_OK; /* broadcast_addr is required for IPv6! */
2491   if ((AF_INET6 == addr->sa_family) && (GNUNET_YES != have_v6_socket))
2492     return GNUNET_OK; /* not using IPv6 */
2493
2494   bi = GNUNET_new (struct BroadcastInterface);
2495   bi->sa = GNUNET_memdup (addr, addrlen);
2496   if (NULL != broadcast_addr)
2497     bi->ba = GNUNET_memdup (broadcast_addr, addrlen);
2498   bi->salen = addrlen;
2499   bi->found = GNUNET_YES;
2500   bi->bcm.sender = my_identity;
2501   ubs.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST);
2502   ubs.purpose.size = htonl (sizeof(ubs));
2503   ubs.sender = my_identity;
2504   GNUNET_CRYPTO_hash (addr, addrlen, &ubs.h_address);
2505   GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_eddsa_sign (my_private_key,
2506                                                         &ubs.purpose,
2507                                                         &bi->bcm.sender_sig));
2508   bi->broadcast_task = GNUNET_SCHEDULER_add_now (&ifc_broadcast, bi);
2509   GNUNET_CONTAINER_DLL_insert (bi_head, bi_tail, bi);
2510   if ((AF_INET6 == addr->sa_family) && (NULL != broadcast_addr))
2511   {
2512     /* Create IPv6 multicast request */
2513     const struct sockaddr_in6 *s6 =
2514       (const struct sockaddr_in6 *) broadcast_addr;
2515
2516     GNUNET_assert (
2517       1 == inet_pton (AF_INET6, "FF05::13B", &bi->mcreq.ipv6mr_multiaddr));
2518
2519     /* http://tools.ietf.org/html/rfc2553#section-5.2:
2520      *
2521      * IPV6_JOIN_GROUP
2522      *
2523      * Join a multicast group on a specified local interface.  If the
2524      * interface index is specified as 0, the kernel chooses the local
2525      * interface.  For example, some kernels look up the multicast
2526      * group in the normal IPv6 routing table and using the resulting
2527      * interface; we do this for each interface, so no need to use
2528      * zero (anymore...).
2529      */
2530     bi->mcreq.ipv6mr_interface = s6->sin6_scope_id;
2531
2532     /* Join the multicast group */
2533     if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt (udp_sock,
2534                                                        IPPROTO_IPV6,
2535                                                        IPV6_JOIN_GROUP,
2536                                                        &bi->mcreq,
2537                                                        sizeof(bi->mcreq)))
2538     {
2539       GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "setsockopt");
2540     }
2541   }
2542   return GNUNET_OK;
2543 }
2544
2545
2546 /**
2547  * Scan interfaces to broadcast our presence on the LAN.
2548  *
2549  * @param cls NULL, unused
2550  */
2551 static void
2552 do_broadcast (void *cls)
2553 {
2554   struct BroadcastInterface *bin;
2555
2556   (void) cls;
2557   for (struct BroadcastInterface *bi = bi_head; NULL != bi; bi = bi->next)
2558     bi->found = GNUNET_NO;
2559   GNUNET_OS_network_interfaces_list (&iface_proc, NULL);
2560   for (struct BroadcastInterface *bi = bi_head; NULL != bi; bi = bin)
2561   {
2562     bin = bi->next;
2563     if (GNUNET_NO == bi->found)
2564       bi_destroy (bi);
2565   }
2566   broadcast_task = GNUNET_SCHEDULER_add_delayed (INTERFACE_SCAN_FREQUENCY,
2567                                                  &do_broadcast,
2568                                                  NULL);
2569 }
2570
2571
2572 /**
2573  * Setup communicator and launch network interactions.
2574  *
2575  * @param cls NULL (always)
2576  * @param args remaining command-line arguments
2577  * @param cfgfile name of the configuration file used (for saving, can be NULL!)
2578  * @param c configuration
2579  */
2580 static void
2581 run (void *cls,
2582      char *const *args,
2583      const char *cfgfile,
2584      const struct GNUNET_CONFIGURATION_Handle *c)
2585 {
2586   char *bindto;
2587   struct sockaddr *in;
2588   socklen_t in_len;
2589   struct sockaddr_storage in_sto;
2590   socklen_t sto_len;
2591
2592   (void) cls;
2593   cfg = c;
2594   if (GNUNET_OK !=
2595       GNUNET_CONFIGURATION_get_value_filename (cfg,
2596                                                COMMUNICATOR_CONFIG_SECTION,
2597                                                "BINDTO",
2598                                                &bindto))
2599   {
2600     GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
2601                                COMMUNICATOR_CONFIG_SECTION,
2602                                "BINDTO");
2603     return;
2604   }
2605
2606   in = udp_address_to_sockaddr (bindto, &in_len);
2607   if (NULL == in)
2608   {
2609     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
2610                 "Failed to setup UDP socket address with path `%s'\n",
2611                 bindto);
2612     GNUNET_free (bindto);
2613     return;
2614   }
2615   udp_sock =
2616     GNUNET_NETWORK_socket_create (in->sa_family, SOCK_DGRAM, IPPROTO_UDP);
2617   if (NULL == udp_sock)
2618   {
2619     GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket");
2620     GNUNET_free (in);
2621     GNUNET_free (bindto);
2622     return;
2623   }
2624   if (AF_INET6 == in->sa_family)
2625     have_v6_socket = GNUNET_YES;
2626   if (GNUNET_OK != GNUNET_NETWORK_socket_bind (udp_sock, in, in_len))
2627   {
2628     GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "bind", bindto);
2629     GNUNET_NETWORK_socket_close (udp_sock);
2630     udp_sock = NULL;
2631     GNUNET_free (in);
2632     GNUNET_free (bindto);
2633     return;
2634   }
2635   /* We might have bound to port 0, allowing the OS to figure it out;
2636      thus, get the real IN-address from the socket */
2637   sto_len = sizeof(in_sto);
2638   if (0 != getsockname (GNUNET_NETWORK_get_fd (udp_sock),
2639                         (struct sockaddr *) &in_sto,
2640                         &sto_len))
2641   {
2642     memcpy (&in_sto, in, in_len);
2643     sto_len = in_len;
2644   }
2645   GNUNET_free (in);
2646   GNUNET_free (bindto);
2647   in = (struct sockaddr *) &in_sto;
2648   in_len = sto_len;
2649   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2650               "Bound to `%s'\n",
2651               GNUNET_a2s ((const struct sockaddr *) &in_sto, sto_len));
2652   switch (in->sa_family)
2653   {
2654   case AF_INET:
2655     my_port = ntohs (((struct sockaddr_in *) in)->sin_port);
2656     break;
2657
2658   case AF_INET6:
2659     my_port = ntohs (((struct sockaddr_in6 *) in)->sin6_port);
2660     break;
2661
2662   default:
2663     GNUNET_break (0);
2664     my_port = 0;
2665   }
2666   stats = GNUNET_STATISTICS_create ("C-UDP", cfg);
2667   senders = GNUNET_CONTAINER_multipeermap_create (32, GNUNET_YES);
2668   receivers = GNUNET_CONTAINER_multipeermap_create (32, GNUNET_YES);
2669   senders_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
2670   receivers_heap =
2671     GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
2672   key_cache = GNUNET_CONTAINER_multishortmap_create (1024, GNUNET_YES);
2673   GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL);
2674   is = GNUNET_NT_scanner_init ();
2675   my_private_key = GNUNET_CRYPTO_eddsa_key_create_from_configuration (cfg);
2676   if (NULL == my_private_key)
2677   {
2678     GNUNET_log (
2679       GNUNET_ERROR_TYPE_ERROR,
2680       _ (
2681         "Transport service is lacking key configuration settings. Exiting.\n"));
2682     GNUNET_SCHEDULER_shutdown ();
2683     return;
2684   }
2685   GNUNET_CRYPTO_eddsa_key_get_public (my_private_key, &my_identity.public_key);
2686   /* start reading */
2687   read_task = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
2688                                              udp_sock,
2689                                              &sock_read,
2690                                              NULL);
2691   ch = GNUNET_TRANSPORT_communicator_connect (cfg,
2692                                               COMMUNICATOR_CONFIG_SECTION,
2693                                               COMMUNICATOR_ADDRESS_PREFIX,
2694                                               GNUNET_TRANSPORT_CC_UNRELIABLE,
2695                                               &mq_init,
2696                                               NULL,
2697                                               &enc_notify_cb,
2698                                               NULL);
2699   if (NULL == ch)
2700   {
2701     GNUNET_break (0);
2702     GNUNET_SCHEDULER_shutdown ();
2703     return;
2704   }
2705   ah = GNUNET_TRANSPORT_application_init (cfg);
2706   if (NULL == ah)
2707   {
2708     GNUNET_break (0);
2709     GNUNET_SCHEDULER_shutdown ();
2710     return;
2711   }
2712   /* start broadcasting */
2713   if (GNUNET_YES !=
2714       GNUNET_CONFIGURATION_get_value_yesno (cfg,
2715                                             COMMUNICATOR_CONFIG_SECTION,
2716                                             "DISABLE_BROADCAST"))
2717   {
2718     broadcast_task = GNUNET_SCHEDULER_add_now (&do_broadcast, NULL);
2719   }
2720   nat = GNUNET_NAT_register (cfg,
2721                              COMMUNICATOR_CONFIG_SECTION,
2722                              IPPROTO_UDP,
2723                              1 /* one address */,
2724                              (const struct sockaddr **) &in,
2725                              &in_len,
2726                              &nat_address_cb,
2727                              NULL /* FIXME: support reversal: #5529 */,
2728                              NULL /* closure */);
2729 }
2730
2731
2732 /**
2733  * The main function for the UNIX communicator.
2734  *
2735  * @param argc number of arguments from the command line
2736  * @param argv command line arguments
2737  * @return 0 ok, 1 on error
2738  */
2739 int
2740 main (int argc, char *const *argv)
2741 {
2742   static const struct GNUNET_GETOPT_CommandLineOption options[] = {
2743     GNUNET_GETOPT_OPTION_END
2744   };
2745   int ret;
2746
2747   if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
2748     return 2;
2749
2750   ret = (GNUNET_OK == GNUNET_PROGRAM_run (argc,
2751                                           argv,
2752                                           "gnunet-communicator-udp",
2753                                           _ ("GNUnet UDP communicator"),
2754                                           options,
2755                                           &run,
2756                                           NULL))
2757         ? 0
2758         : 1;
2759   GNUNET_free ((void *) argv);
2760   return ret;
2761 }
2762
2763
2764 /* end of gnunet-communicator-udp.c */