tighten formatting rules
[oweals/gnunet.git] / src / transport / gnunet-communicator-tcp.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-tcp.c
23  * @brief Transport plugin using TCP.
24  * @author Christian Grothoff
25  *
26  * TODO:
27  * - support DNS names in BINDTO option (#5528)
28  * - support NAT connection reversal method (#5529)
29  * - support other TCP-specific NAT traversal methods (#5531)
30  * - add replay protection support to the protocol by
31  *   adding a nonce in the KX and requiring (!) a
32  *   nounce ACK to be send within the first X bytes of
33  *   data (#5530)
34  */
35 #include "platform.h"
36 #include "gnunet_util_lib.h"
37 #include "gnunet_protocols.h"
38 #include "gnunet_signatures.h"
39 #include "gnunet_constants.h"
40 #include "gnunet_nt_lib.h"
41 #include "gnunet_nat_service.h"
42 #include "gnunet_statistics_service.h"
43 #include "gnunet_transport_communication_service.h"
44
45 /**
46  * How long do we believe our addresses to remain up (before
47  * the other peer should revalidate).
48  */
49 #define ADDRESS_VALIDITY_PERIOD \
50   GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 4)
51
52 /**
53  * How many messages do we keep at most in the queue to the
54  * transport service before we start to drop (default,
55  * can be changed via the configuration file).
56  * Should be _below_ the level of the communicator API, as
57  * otherwise we may read messages just to have them dropped
58  * by the communicator API.
59  */
60 #define DEFAULT_MAX_QUEUE_LENGTH 8
61
62 /**
63  * Size of our IO buffers for ciphertext data. Must be at
64  * least UINT_MAX + sizeof (struct TCPBox).
65  */
66 #define BUF_SIZE (2 * 64 * 1024 + sizeof(struct TCPBox))
67
68 /**
69  * How often do we rekey based on time (at least)
70  */
71 #define REKEY_TIME_INTERVAL GNUNET_TIME_UNIT_DAYS
72
73 /**
74  * How long do we wait until we must have received the initial KX?
75  */
76 #define PROTO_QUEUE_TIMEOUT GNUNET_TIME_UNIT_MINUTES
77
78 /**
79  * How often do we rekey based on number of bytes transmitted?
80  * (additionally randomized).
81  */
82 #define REKEY_MAX_BYTES (1024LLU * 1024 * 1024 * 4LLU)
83
84 /**
85  * Size of the initial key exchange message sent first in both
86  * directions.
87  */
88 #define INITIAL_KX_SIZE                           \
89   (sizeof(struct GNUNET_CRYPTO_EcdhePublicKey)   \
90    + sizeof(struct TCPConfirmation))
91
92
93 /**
94  * Address prefix used by the communicator.
95  */
96 #define COMMUNICATOR_ADDRESS_PREFIX "tcp"
97
98 /**
99  * Configuration section used by the communicator.
100  */
101 #define COMMUNICATOR_CONFIG_SECTION "communicator-tcp"
102
103 GNUNET_NETWORK_STRUCT_BEGIN
104
105
106 /**
107  * Signature we use to verify that the ephemeral key was really chosen by
108  * the specified sender.
109  */
110 struct TcpHandshakeSignature
111 {
112   /**
113    * Purpose must be #GNUNET_SIGNATURE_COMMUNICATOR_TCP_HANDSHAKE
114    */
115   struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
116
117   /**
118    * Identity of the inititor of the TCP connection (TCP client).
119    */
120   struct GNUNET_PeerIdentity sender;
121
122   /**
123    * Presumed identity of the target of the TCP connection (TCP server)
124    */
125   struct GNUNET_PeerIdentity receiver;
126
127   /**
128    * Ephemeral key used by the @e sender.
129    */
130   struct GNUNET_CRYPTO_EcdhePublicKey ephemeral;
131
132   /**
133    * Monotonic time of @e sender, to possibly help detect replay attacks
134    * (if receiver persists times by sender).
135    */
136   struct GNUNET_TIME_AbsoluteNBO monotonic_time;
137 };
138
139
140 /**
141  * Encrypted continuation of TCP initial handshake.
142  */
143 struct TCPConfirmation
144 {
145   /**
146    * Sender's identity
147    */
148   struct GNUNET_PeerIdentity sender;
149
150   /**
151    * Sender's signature of type #GNUNET_SIGNATURE_COMMUNICATOR_TCP_HANDSHAKE
152    */
153   struct GNUNET_CRYPTO_EddsaSignature sender_sig;
154
155   /**
156    * Monotonic time of @e sender, to possibly help detect replay attacks
157    * (if receiver persists times by sender).
158    */
159   struct GNUNET_TIME_AbsoluteNBO monotonic_time;
160 };
161
162
163 /**
164  * TCP message box.  Always sent encrypted!
165  */
166 struct TCPBox
167 {
168   /**
169    * Type is #GNUNET_MESSAGE_TYPE_COMMUNICATOR_TCP_BOX.  Warning: the
170    * header size EXCLUDES the size of the `struct TCPBox`. We usually
171    * never do this, but here the payload may truly be 64k *after* the
172    * TCPBox (as we have no MTU)!!
173    */
174   struct GNUNET_MessageHeader header;
175
176   /**
177    * HMAC for the following encrypted message.  Yes, we MUST use
178    * mac-then-encrypt here, as we want to hide the message sizes on
179    * the wire (zero plaintext design!).  Using CTR mode, padding oracle
180    * attacks do not apply.  Besides, due to the use of ephemeral keys
181    * (hopefully with effective replay protection from monotonic time!)
182    * the attacker is limited in using the oracle.
183    */
184   struct GNUNET_ShortHashCode hmac;
185
186   /* followed by as may bytes of payload as indicated in @e header,
187      excluding the TCPBox itself! */
188 };
189
190
191 /**
192  * TCP rekey message box.  Always sent encrypted!  Data after
193  * this message will use the new key.
194  */
195 struct TCPRekey
196 {
197   /**
198    * Type is #GNUNET_MESSAGE_TYPE_COMMUNICATOR_TCP_REKEY.
199    */
200   struct GNUNET_MessageHeader header;
201
202   /**
203    * HMAC for the following encrypted message.  Yes, we MUST use
204    * mac-then-encrypt here, as we want to hide the message sizes on
205    * the wire (zero plaintext design!).  Using CTR mode padding oracle
206    * attacks do not apply.  Besides, due to the use of ephemeral keys
207    * (hopefully with effective replay protection from monotonic time!)
208    * the attacker is limited in using the oracle.
209    */
210   struct GNUNET_ShortHashCode hmac;
211
212   /**
213    * New ephemeral key.
214    */
215   struct GNUNET_CRYPTO_EcdhePublicKey ephemeral;
216
217   /**
218    * Sender's signature of type #GNUNET_SIGNATURE_COMMUNICATOR_TCP_REKEY
219    */
220   struct GNUNET_CRYPTO_EddsaSignature sender_sig;
221
222   /**
223    * Monotonic time of @e sender, to possibly help detect replay attacks
224    * (if receiver persists times by sender).
225    */
226   struct GNUNET_TIME_AbsoluteNBO monotonic_time;
227 };
228
229
230 /**
231  * TCP finish. Sender asks for the connection to be closed.
232  * Needed/useful in case we drop RST/FIN packets on the GNUnet
233  * port due to the possibility of malicious RST/FIN injection.
234  */
235 struct TCPFinish
236 {
237   /**
238    * Type is #GNUNET_MESSAGE_TYPE_COMMUNICATOR_TCP_FINISH.
239    */
240   struct GNUNET_MessageHeader header;
241
242   /**
243    * HMAC for the following encrypted message.  Yes, we MUST use
244    * mac-then-encrypt here, as we want to hide the message sizes on
245    * the wire (zero plaintext design!).  Using CTR mode padding oracle
246    * attacks do not apply.  Besides, due to the use of ephemeral keys
247    * (hopefully with effective replay protection from monotonic time!)
248    * the attacker is limited in using the oracle.
249    */
250   struct GNUNET_ShortHashCode hmac;
251 };
252
253
254 GNUNET_NETWORK_STRUCT_END
255
256
257 /**
258  * Handle for a queue.
259  */
260 struct Queue
261 {
262   /**
263    * To whom are we talking to.
264    */
265   struct GNUNET_PeerIdentity target;
266
267   /**
268    * socket that we transmit all data with on this queue
269    */
270   struct GNUNET_NETWORK_Handle *sock;
271
272   /**
273    * cipher for decryption of incoming data.
274    */
275   gcry_cipher_hd_t in_cipher;
276
277   /**
278    * cipher for encryption of outgoing data.
279    */
280   gcry_cipher_hd_t out_cipher;
281
282   /**
283    * Shared secret for HMAC verification on incoming data.
284    */
285   struct GNUNET_HashCode in_hmac;
286
287   /**
288    * Shared secret for HMAC generation on outgoing data, ratcheted after
289    * each operation.
290    */
291   struct GNUNET_HashCode out_hmac;
292
293   /**
294    * Our ephemeral key. Stored here temporarily during rekeying / key
295    * generation.
296    */
297   struct GNUNET_CRYPTO_EcdhePrivateKey ephemeral;
298
299   /**
300    * ID of read task for this connection.
301    */
302   struct GNUNET_SCHEDULER_Task *read_task;
303
304   /**
305    * ID of write task for this connection.
306    */
307   struct GNUNET_SCHEDULER_Task *write_task;
308
309   /**
310    * Address of the other peer.
311    */
312   struct sockaddr *address;
313
314   /**
315    * How many more bytes may we sent with the current @e out_cipher
316    * before we should rekey?
317    */
318   uint64_t rekey_left_bytes;
319
320   /**
321    * Until what time may we sent with the current @e out_cipher
322    * before we should rekey?
323    */
324   struct GNUNET_TIME_Absolute rekey_time;
325
326   /**
327    * Length of the address.
328    */
329   socklen_t address_len;
330
331   /**
332    * Message queue we are providing for the #ch.
333    */
334   struct GNUNET_MQ_Handle *mq;
335
336   /**
337    * handle for this queue with the #ch.
338    */
339   struct GNUNET_TRANSPORT_QueueHandle *qh;
340
341   /**
342    * Number of bytes we currently have in our write queue.
343    */
344   unsigned long long bytes_in_queue;
345
346   /**
347    * Buffer for reading ciphertext from network into.
348    */
349   char cread_buf[BUF_SIZE];
350
351   /**
352    * buffer for writing ciphertext to network.
353    */
354   char cwrite_buf[BUF_SIZE];
355
356   /**
357    * Plaintext buffer for decrypted plaintext.
358    */
359   char pread_buf[UINT16_MAX + 1 + sizeof(struct TCPBox)];
360
361   /**
362    * Plaintext buffer for messages to be encrypted.
363    */
364   char pwrite_buf[UINT16_MAX + 1 + sizeof(struct TCPBox)];
365
366   /**
367    * At which offset in the ciphertext read buffer should we
368    * append more ciphertext for transmission next?
369    */
370   size_t cread_off;
371
372   /**
373    * At which offset in the ciphertext write buffer should we
374    * append more ciphertext from reading next?
375    */
376   size_t cwrite_off;
377
378   /**
379    * At which offset in the plaintext input buffer should we
380    * append more plaintext from decryption next?
381    */
382   size_t pread_off;
383
384   /**
385    * At which offset in the plaintext output buffer should we
386    * append more plaintext for encryption next?
387    */
388   size_t pwrite_off;
389
390   /**
391    * Timeout for this queue.
392    */
393   struct GNUNET_TIME_Absolute timeout;
394
395   /**
396    * How may messages did we pass from this queue to CORE for which we
397    * have yet to receive an acknoweldgement that CORE is done with
398    * them? If "large" (or even just non-zero), we should throttle
399    * reading to provide flow control.  See also #DEFAULT_MAX_QUEUE_LENGTH
400    * and #max_queue_length.
401    */
402   unsigned int backpressure;
403
404   /**
405    * Which network type does this queue use?
406    */
407   enum GNUNET_NetworkType nt;
408
409   /**
410    * Is MQ awaiting a #GNUNET_MQ_impl_send_continue() call?
411    */
412   int mq_awaits_continue;
413
414   /**
415    * Did we enqueue a finish message and are closing down the queue?
416    */
417   int finishing;
418
419   /**
420    * Did we technically destroy this queue, but kept the allocation
421    * around because of @e backpressure not being zero yet? Used
422    * simply to delay the final #GNUNET_free() operation until
423    * #core_read_finished_cb() has been called.
424    */
425   int destroyed;
426
427   /**
428    * #GNUNET_YES if we just rekeyed and must thus possibly
429    * re-decrypt ciphertext.
430    */
431   int rekeyed;
432 };
433
434
435 /**
436  * Handle for an incoming connection where we do not yet have enough
437  * information to setup a full queue.
438  */
439 struct ProtoQueue
440 {
441   /**
442    * Kept in a DLL.
443    */
444   struct ProtoQueue *next;
445
446   /**
447    * Kept in a DLL.
448    */
449   struct ProtoQueue *prev;
450
451   /**
452    * socket that we transmit all data with on this queue
453    */
454   struct GNUNET_NETWORK_Handle *sock;
455
456   /**
457    * ID of read task for this connection.
458    */
459   struct GNUNET_SCHEDULER_Task *read_task;
460
461   /**
462    * Address of the other peer.
463    */
464   struct sockaddr *address;
465
466   /**
467    * Length of the address.
468    */
469   socklen_t address_len;
470
471   /**
472    * Timeout for this protoqueue.
473    */
474   struct GNUNET_TIME_Absolute timeout;
475
476   /**
477    * Buffer for reading all the information we need to upgrade from
478    * protoqueue to queue.
479    */
480   char ibuf[INITIAL_KX_SIZE];
481
482   /**
483    * Current offset for reading into @e ibuf.
484    */
485   size_t ibuf_off;
486 };
487
488
489 /**
490  * ID of listen task
491  */
492 static struct GNUNET_SCHEDULER_Task *listen_task;
493
494 /**
495  * Maximum queue length before we stop reading towards the transport service.
496  */
497 static unsigned long long max_queue_length;
498
499 /**
500  * For logging statistics.
501  */
502 static struct GNUNET_STATISTICS_Handle *stats;
503
504 /**
505  * Our environment.
506  */
507 static struct GNUNET_TRANSPORT_CommunicatorHandle *ch;
508
509 /**
510  * Queues (map from peer identity to `struct Queue`)
511  */
512 static struct GNUNET_CONTAINER_MultiPeerMap *queue_map;
513
514 /**
515  * Listen socket.
516  */
517 static struct GNUNET_NETWORK_Handle *listen_sock;
518
519 /**
520  * Our public key.
521  */
522 static struct GNUNET_PeerIdentity my_identity;
523
524 /**
525  * Our private key.
526  */
527 static struct GNUNET_CRYPTO_EddsaPrivateKey *my_private_key;
528
529 /**
530  * Our configuration.
531  */
532 static const struct GNUNET_CONFIGURATION_Handle *cfg;
533
534 /**
535  * Network scanner to determine network types.
536  */
537 static struct GNUNET_NT_InterfaceScanner *is;
538
539 /**
540  * Connection to NAT service.
541  */
542 static struct GNUNET_NAT_Handle *nat;
543
544 /**
545  * Protoqueues DLL head.
546  */
547 static struct ProtoQueue *proto_head;
548
549 /**
550  * Protoqueues DLL tail.
551  */
552 static struct ProtoQueue *proto_tail;
553
554
555 /**
556  * We have been notified that our listen socket has something to
557  * read. Do the read and reschedule this function to be called again
558  * once more is available.
559  *
560  * @param cls NULL
561  */
562 static void
563 listen_cb (void *cls);
564
565
566 /**
567  * Functions with this signature are called whenever we need
568  * to close a queue due to a disconnect or failure to
569  * establish a connection.
570  *
571  * @param queue queue to close down
572  */
573 static void
574 queue_destroy (struct Queue *queue)
575 {
576   struct GNUNET_MQ_Handle *mq;
577
578   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
579               "Disconnecting queue for peer `%s'\n",
580               GNUNET_i2s (&queue->target));
581   if (NULL != (mq = queue->mq))
582   {
583     queue->mq = NULL;
584     GNUNET_MQ_destroy (mq);
585   }
586   if (NULL != queue->qh)
587   {
588     GNUNET_TRANSPORT_communicator_mq_del (queue->qh);
589     queue->qh = NULL;
590   }
591   GNUNET_assert (
592     GNUNET_YES ==
593     GNUNET_CONTAINER_multipeermap_remove (queue_map, &queue->target, queue));
594   GNUNET_STATISTICS_set (stats,
595                          "# queues active",
596                          GNUNET_CONTAINER_multipeermap_size (queue_map),
597                          GNUNET_NO);
598   if (NULL != queue->read_task)
599   {
600     GNUNET_SCHEDULER_cancel (queue->read_task);
601     queue->read_task = NULL;
602   }
603   if (NULL != queue->write_task)
604   {
605     GNUNET_SCHEDULER_cancel (queue->write_task);
606     queue->write_task = NULL;
607   }
608   GNUNET_NETWORK_socket_close (queue->sock);
609   gcry_cipher_close (queue->in_cipher);
610   gcry_cipher_close (queue->out_cipher);
611   GNUNET_free (queue->address);
612   if (0 != queue->backpressure)
613     queue->destroyed = GNUNET_YES;
614   else
615     GNUNET_free (queue);
616   if (NULL == listen_task)
617     listen_task = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
618                                                  listen_sock,
619                                                  &listen_cb,
620                                                  NULL);
621 }
622
623
624 /**
625  * Compute @a mac over @a buf, and ratched the @a hmac_secret.
626  *
627  * @param[in,out] hmac_secret secret for HMAC calculation
628  * @param buf buffer to MAC
629  * @param buf_size number of bytes in @a buf
630  * @param smac[out] where to write the HMAC
631  */
632 static void
633 calculate_hmac (struct GNUNET_HashCode *hmac_secret,
634                 const void *buf,
635                 size_t buf_size,
636                 struct GNUNET_ShortHashCode *smac)
637 {
638   struct GNUNET_HashCode mac;
639
640   GNUNET_CRYPTO_hmac_raw (hmac_secret,
641                           sizeof(struct GNUNET_HashCode),
642                           buf,
643                           buf_size,
644                           &mac);
645   /* truncate to `struct GNUNET_ShortHashCode` */
646   memcpy (smac, &mac, sizeof(struct GNUNET_ShortHashCode));
647   /* ratchet hmac key */
648   GNUNET_CRYPTO_hash (hmac_secret,
649                       sizeof(struct GNUNET_HashCode),
650                       hmac_secret);
651 }
652
653
654 /**
655  * Append a 'finish' message to the outgoing transmission. Once the
656  * finish has been transmitted, destroy the queue.
657  *
658  * @param queue queue to shut down nicely
659  */
660 static void
661 queue_finish (struct Queue *queue)
662 {
663   struct TCPFinish fin;
664
665   memset (&fin, 0, sizeof(fin));
666   fin.header.size = htons (sizeof(fin));
667   fin.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_TCP_FINISH);
668   calculate_hmac (&queue->out_hmac, &fin, sizeof(fin), &fin.hmac);
669   /* if there is any message left in pwrite_buf, we
670      overwrite it (possibly dropping the last message
671      from CORE hard here) */
672   memcpy (queue->pwrite_buf, &fin, sizeof(fin));
673   queue->pwrite_off = sizeof(fin);
674   /* This flag will ensure that #queue_write() no longer
675      notifies CORE about the possibility of sending
676      more data, and that #queue_write() will call
677   #queue_destroy() once the @c fin was fully written. */
678   queue->finishing = GNUNET_YES;
679 }
680
681
682 /**
683  * Increment queue timeout due to activity.  We do not immediately
684  * notify the monitor here as that might generate excessive
685  * signalling.
686  *
687  * @param queue queue for which the timeout should be rescheduled
688  */
689 static void
690 reschedule_queue_timeout (struct Queue *queue)
691 {
692   queue->timeout =
693     GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
694 }
695
696
697 /**
698  * Queue read task. If we hit the timeout, disconnect it
699  *
700  * @param cls the `struct Queue *` to disconnect
701  */
702 static void
703 queue_read (void *cls);
704
705
706 /**
707  * Core tells us it is done processing a message that transport
708  * received on a queue with status @a success.
709  *
710  * @param cls a `struct Queue *` where the message originally came from
711  * @param success #GNUNET_OK on success
712  */
713 static void
714 core_read_finished_cb (void *cls, int success)
715 {
716   struct Queue *queue = cls;
717
718   if (GNUNET_OK != success)
719     GNUNET_STATISTICS_update (stats,
720                               "# messages lost in communicator API towards CORE",
721                               1,
722                               GNUNET_NO);
723   queue->backpressure--;
724   /* handle deferred queue destruction */
725   if ((queue->destroyed) && (0 == queue->backpressure))
726   {
727     GNUNET_free (queue);
728     return;
729   }
730   reschedule_queue_timeout (queue);
731   /* possibly unchoke reading, now that CORE made progress */
732   if (NULL == queue->read_task)
733     queue->read_task =
734       GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_absolute_get_remaining (
735                                        queue->timeout),
736                                      queue->sock,
737                                      &queue_read,
738                                      queue);
739 }
740
741
742 /**
743  * We received @a plaintext_len bytes of @a plaintext on @a queue.
744  * Pass it on to CORE.  If transmission is actually happening,
745  * increase backpressure counter.
746  *
747  * @param queue the queue that received the plaintext
748  * @param plaintext the plaintext that was received
749  * @param plaintext_len number of bytes of plaintext received
750  */
751 static void
752 pass_plaintext_to_core (struct Queue *queue,
753                         const void *plaintext,
754                         size_t plaintext_len)
755 {
756   const struct GNUNET_MessageHeader *hdr = plaintext;
757   int ret;
758
759   if (ntohs (hdr->size) != plaintext_len)
760   {
761     /* NOTE: If we ever allow multiple CORE messages in one
762        BOX, this will have to change! */
763     GNUNET_break (0);
764     return;
765   }
766   ret = GNUNET_TRANSPORT_communicator_receive (ch,
767                                                &queue->target,
768                                                hdr,
769                                                ADDRESS_VALIDITY_PERIOD,
770                                                &core_read_finished_cb,
771                                                queue);
772   if (GNUNET_OK == ret)
773     queue->backpressure++;
774   GNUNET_break (GNUNET_NO != ret);  /* backpressure not working!? */
775   if (GNUNET_SYSERR == ret)
776     GNUNET_STATISTICS_update (stats,
777                               "# bytes lost due to CORE not running",
778                               plaintext_len,
779                               GNUNET_NO);
780 }
781
782
783 /**
784  * Setup @a cipher based on shared secret @a dh and decrypting
785  * peer @a pid.
786  *
787  * @param dh shared secret
788  * @param pid decrypting peer's identity
789  * @param cipher[out] cipher to initialize
790  * @param hmac_key[out] HMAC key to initialize
791  */
792 static void
793 setup_cipher (const struct GNUNET_HashCode *dh,
794               const struct GNUNET_PeerIdentity *pid,
795               gcry_cipher_hd_t *cipher,
796               struct GNUNET_HashCode *hmac_key)
797 {
798   char key[256 / 8];
799   char ctr[128 / 8];
800
801   gcry_cipher_open (cipher,
802                     GCRY_CIPHER_AES256 /* low level: go for speed */,
803                     GCRY_CIPHER_MODE_CTR,
804                     0 /* flags */);
805   GNUNET_assert (GNUNET_YES == GNUNET_CRYPTO_kdf (key,
806                                                   sizeof(key),
807                                                   "TCP-key",
808                                                   strlen ("TCP-key"),
809                                                   dh,
810                                                   sizeof(*dh),
811                                                   pid,
812                                                   sizeof(*pid),
813                                                   NULL,
814                                                   0));
815   gcry_cipher_setkey (*cipher, key, sizeof(key));
816   GNUNET_assert (GNUNET_YES == GNUNET_CRYPTO_kdf (ctr,
817                                                   sizeof(ctr),
818                                                   "TCP-ctr",
819                                                   strlen ("TCP-ctr"),
820                                                   dh,
821                                                   sizeof(*dh),
822                                                   pid,
823                                                   sizeof(*pid),
824                                                   NULL,
825                                                   0));
826   gcry_cipher_setctr (*cipher, ctr, sizeof(ctr));
827   GNUNET_assert (GNUNET_YES ==
828                  GNUNET_CRYPTO_kdf (hmac_key,
829                                     sizeof(struct GNUNET_HashCode),
830                                     "TCP-hmac",
831                                     strlen ("TCP-hmac"),
832                                     dh,
833                                     sizeof(*dh),
834                                     pid,
835                                     sizeof(*pid),
836                                     NULL,
837                                     0));
838 }
839
840
841 /**
842  * Setup cipher of @a queue for decryption.
843  *
844  * @param ephemeral ephemeral key we received from the other peer
845  * @param queue[in,out] queue to initialize decryption cipher for
846  */
847 static void
848 setup_in_cipher (const struct GNUNET_CRYPTO_EcdhePublicKey *ephemeral,
849                  struct Queue *queue)
850 {
851   struct GNUNET_HashCode dh;
852
853   GNUNET_CRYPTO_eddsa_ecdh (my_private_key, ephemeral, &dh);
854   setup_cipher (&dh, &my_identity, &queue->in_cipher, &queue->in_hmac);
855 }
856
857
858 /**
859  * Handle @a rekey message on @a queue. The message was already
860  * HMAC'ed, but we should additionally still check the signature.
861  * Then we need to stop the old cipher and start afresh.
862  *
863  * @param queue the queue @a rekey was received on
864  * @param rekey the rekey message
865  */
866 static void
867 do_rekey (struct Queue *queue, const struct TCPRekey *rekey)
868 {
869   struct TcpHandshakeSignature thp;
870
871   thp.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_TCP_REKEY);
872   thp.purpose.size = htonl (sizeof(thp));
873   thp.sender = queue->target;
874   thp.receiver = my_identity;
875   thp.ephemeral = rekey->ephemeral;
876   thp.monotonic_time = rekey->monotonic_time;
877   /* FIXME: check monotonic time is monotonic... */
878   if (GNUNET_OK !=
879       GNUNET_CRYPTO_eddsa_verify (GNUNET_SIGNATURE_COMMUNICATOR_TCP_REKEY,
880                                   &thp.purpose,
881                                   &rekey->sender_sig,
882                                   &queue->target.public_key))
883   {
884     GNUNET_break (0);
885     queue_finish (queue);
886     return;
887   }
888   gcry_cipher_close (queue->in_cipher);
889   queue->rekeyed = GNUNET_YES;
890   setup_in_cipher (&rekey->ephemeral, queue);
891 }
892
893
894 /**
895  * Test if we have received a full message in plaintext.
896  * If so, handle it.
897  *
898  * @param queue queue to process inbound plaintext for
899  * @return number of bytes of plaintext handled, 0 for none
900  */
901 static size_t
902 try_handle_plaintext (struct Queue *queue)
903 {
904   const struct GNUNET_MessageHeader *hdr =
905     (const struct GNUNET_MessageHeader *) queue->pread_buf;
906   const struct TCPBox *box = (const struct TCPBox *) queue->pread_buf;
907   const struct TCPRekey *rekey = (const struct TCPRekey *) queue->pread_buf;
908   const struct TCPFinish *fin = (const struct TCPFinish *) queue->pread_buf;
909   struct TCPRekey rekeyz;
910   struct TCPFinish finz;
911   struct GNUNET_ShortHashCode tmac;
912   uint16_t type;
913   size_t size = 0; /* make compiler happy */
914
915   if (sizeof(*hdr) > queue->pread_off)
916     return 0; /* not even a header */
917   type = ntohs (hdr->type);
918   switch (type)
919   {
920   case GNUNET_MESSAGE_TYPE_COMMUNICATOR_TCP_BOX:
921     /* Special case: header size excludes box itself! */
922     if (ntohs (hdr->size) + sizeof(struct TCPBox) > queue->pread_off)
923       return 0;
924     calculate_hmac (&queue->in_hmac, &box[1], ntohs (hdr->size), &tmac);
925     if (0 != memcmp (&tmac, &box->hmac, sizeof(tmac)))
926     {
927       GNUNET_break_op (0);
928       queue_finish (queue);
929       return 0;
930     }
931     pass_plaintext_to_core (queue, (const void *) &box[1], ntohs (hdr->size));
932     size = ntohs (hdr->size) + sizeof(*box);
933     break;
934
935   case GNUNET_MESSAGE_TYPE_COMMUNICATOR_TCP_REKEY:
936     if (sizeof(*rekey) > queue->pread_off)
937       return 0;
938     if (ntohs (hdr->size) != sizeof(*rekey))
939     {
940       GNUNET_break_op (0);
941       queue_finish (queue);
942       return 0;
943     }
944     rekeyz = *rekey;
945     memset (&rekeyz.hmac, 0, sizeof(rekeyz.hmac));
946     calculate_hmac (&queue->in_hmac, &rekeyz, sizeof(rekeyz), &tmac);
947     if (0 != memcmp (&tmac, &box->hmac, sizeof(tmac)))
948     {
949       GNUNET_break_op (0);
950       queue_finish (queue);
951       return 0;
952     }
953     do_rekey (queue, rekey);
954     size = ntohs (hdr->size);
955     break;
956
957   case GNUNET_MESSAGE_TYPE_COMMUNICATOR_TCP_FINISH:
958     if (sizeof(*fin) > queue->pread_off)
959       return 0;
960     if (ntohs (hdr->size) != sizeof(*fin))
961     {
962       GNUNET_break_op (0);
963       queue_finish (queue);
964       return 0;
965     }
966     finz = *fin;
967     memset (&finz.hmac, 0, sizeof(finz.hmac));
968     calculate_hmac (&queue->in_hmac, &rekeyz, sizeof(rekeyz), &tmac);
969     if (0 != memcmp (&tmac, &fin->hmac, sizeof(tmac)))
970     {
971       GNUNET_break_op (0);
972       queue_finish (queue);
973       return 0;
974     }
975     /* handle FINISH by destroying queue */
976     queue_destroy (queue);
977     break;
978
979   default:
980     GNUNET_break_op (0);
981     queue_finish (queue);
982     return 0;
983   }
984   GNUNET_assert (0 != size);
985   return size;
986 }
987
988
989 /**
990  * Queue read task. If we hit the timeout, disconnect it
991  *
992  * @param cls the `struct Queue *` to disconnect
993  */
994 static void
995 queue_read (void *cls)
996 {
997   struct Queue *queue = cls;
998   struct GNUNET_TIME_Relative left;
999   ssize_t rcvd;
1000
1001   queue->read_task = NULL;
1002   rcvd = GNUNET_NETWORK_socket_recv (queue->sock,
1003                                      &queue->cread_buf[queue->cread_off],
1004                                      BUF_SIZE - queue->cread_off);
1005   if (-1 == rcvd)
1006   {
1007     if ((EAGAIN != errno) && (EINTR != errno))
1008     {
1009       GNUNET_log_strerror (GNUNET_ERROR_TYPE_DEBUG, "recv");
1010       queue_finish (queue);
1011       return;
1012     }
1013     /* try again */
1014     queue->read_task =
1015       GNUNET_SCHEDULER_add_read_net (left, queue->sock, &queue_read, queue);
1016     return;
1017   }
1018   if (0 != rcvd)
1019     reschedule_queue_timeout (queue);
1020   queue->cread_off += rcvd;
1021   while ((queue->pread_off < sizeof(queue->pread_buf)) &&
1022          (queue->cread_off > 0))
1023   {
1024     size_t max = GNUNET_MIN (sizeof(queue->pread_buf) - queue->pread_off,
1025                              queue->cread_off);
1026     size_t done;
1027     size_t total;
1028
1029     GNUNET_assert (0 ==
1030                    gcry_cipher_decrypt (queue->in_cipher,
1031                                         &queue->pread_buf[queue->pread_off],
1032                                         max,
1033                                         queue->cread_buf,
1034                                         max));
1035     queue->pread_off += max;
1036     total = 0;
1037     while ((GNUNET_NO == queue->rekeyed) &&
1038            (0 != (done = try_handle_plaintext (queue))))
1039     {
1040       /* 'done' bytes of plaintext were used, shift buffer */
1041       GNUNET_assert (done <= queue->pread_off);
1042       /* NOTE: this memmove() could possibly sometimes be
1043          avoided if we pass 'total' into try_handle_plaintext()
1044          and use it at an offset into the buffer there! */
1045       memmove (queue->pread_buf,
1046                &queue->pread_buf[done],
1047                queue->pread_off - done);
1048       queue->pread_off -= done;
1049       total += done;
1050     }
1051     /* when we encounter a rekey message, the decryption above uses the
1052        wrong key for everything after the rekey; in that case, we have
1053        to re-do the decryption at 'total' instead of at 'max'. If there
1054        is no rekey and the last message is incomplete (max > total),
1055        it is safe to keep the decryption so we shift by 'max' */if (GNUNET_YES == queue->rekeyed)
1056     {
1057       max = total;
1058       queue->rekeyed = GNUNET_NO;
1059     }
1060     memmove (queue->cread_buf, &queue->cread_buf[max], queue->cread_off - max);
1061     queue->cread_off -= max;
1062   }
1063
1064   if (BUF_SIZE == queue->cread_off)
1065     return; /* buffer full, suspend reading */
1066   left = GNUNET_TIME_absolute_get_remaining (queue->timeout);
1067   if (0 != left.rel_value_us)
1068   {
1069     if (max_queue_length < queue->backpressure)
1070     {
1071       /* continue reading */
1072       queue->read_task =
1073         GNUNET_SCHEDULER_add_read_net (left, queue->sock, &queue_read, queue);
1074     }
1075     return;
1076   }
1077   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1078               "Queue %p was idle for %s, disconnecting\n",
1079               queue,
1080               GNUNET_STRINGS_relative_time_to_string (
1081                 GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
1082                 GNUNET_YES));
1083   queue_finish (queue);
1084 }
1085
1086
1087 /**
1088  * Convert TCP bind specification to a `struct sockaddr *`
1089  *
1090  * @param bindto bind specification to convert
1091  * @param[out] sock_len set to the length of the address
1092  * @return converted bindto specification
1093  */
1094 static struct sockaddr *
1095 tcp_address_to_sockaddr (const char *bindto, socklen_t *sock_len)
1096 {
1097   struct sockaddr *in;
1098   unsigned int port;
1099   char dummy[2];
1100   char *colon;
1101   char *cp;
1102
1103   if (1 == sscanf (bindto, "%u%1s", &port, dummy))
1104   {
1105     /* interpreting value as just a PORT number */
1106     if (port > UINT16_MAX)
1107     {
1108       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1109                   "BINDTO specification `%s' invalid: value too large for port\n",
1110                   bindto);
1111       return NULL;
1112     }
1113     if ((GNUNET_NO == GNUNET_NETWORK_test_pf (PF_INET6)) ||
1114         (GNUNET_YES ==
1115          GNUNET_CONFIGURATION_get_value_yesno (cfg,
1116                                                COMMUNICATOR_CONFIG_SECTION,
1117                                                "DISABLE_V6")))
1118     {
1119       struct sockaddr_in *i4;
1120
1121       i4 = GNUNET_malloc (sizeof(struct sockaddr_in));
1122       i4->sin_family = AF_INET;
1123       i4->sin_port = htons ((uint16_t) port);
1124       *sock_len = sizeof(struct sockaddr_in);
1125       in = (struct sockaddr *) i4;
1126     }
1127     else
1128     {
1129       struct sockaddr_in6 *i6;
1130
1131       i6 = GNUNET_malloc (sizeof(struct sockaddr_in6));
1132       i6->sin6_family = AF_INET6;
1133       i6->sin6_port = htons ((uint16_t) port);
1134       *sock_len = sizeof(struct sockaddr_in6);
1135       in = (struct sockaddr *) i6;
1136     }
1137     return in;
1138   }
1139   cp = GNUNET_strdup (bindto);
1140   colon = strrchr (cp, ':');
1141   if (NULL != colon)
1142   {
1143     /* interpet value after colon as port */
1144     *colon = '\0';
1145     colon++;
1146     if (1 == sscanf (colon, "%u%1s", &port, dummy))
1147     {
1148       /* interpreting value as just a PORT number */
1149       if (port > UINT16_MAX)
1150       {
1151         GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1152                     "BINDTO specification `%s' invalid: value too large for port\n",
1153                     bindto);
1154         GNUNET_free (cp);
1155         return NULL;
1156       }
1157     }
1158     else
1159     {
1160       GNUNET_log (
1161         GNUNET_ERROR_TYPE_ERROR,
1162         "BINDTO specification `%s' invalid: last ':' not followed by number\n",
1163         bindto);
1164       GNUNET_free (cp);
1165       return NULL;
1166     }
1167   }
1168   else
1169   {
1170     /* interpret missing port as 0, aka pick any free one */
1171     port = 0;
1172   }
1173   {
1174     /* try IPv4 */
1175     struct sockaddr_in v4;
1176
1177     if (1 == inet_pton (AF_INET, cp, &v4))
1178     {
1179       v4.sin_port = htons ((uint16_t) port);
1180       in = GNUNET_memdup (&v4, sizeof(v4));
1181       *sock_len = sizeof(v4);
1182       GNUNET_free (cp);
1183       return in;
1184     }
1185   }
1186   {
1187     /* try IPv6 */
1188     struct sockaddr_in6 v6;
1189     const char *start;
1190
1191     start = cp;
1192     if (('[' == *cp) && (']' == cp[strlen (cp) - 1]))
1193     {
1194       start++;   /* skip over '[' */
1195       cp[strlen (cp) - 1] = '\0';  /* eat ']' */
1196     }
1197     if (1 == inet_pton (AF_INET6, start, &v6))
1198     {
1199       v6.sin6_port = htons ((uint16_t) port);
1200       in = GNUNET_memdup (&v6, sizeof(v6));
1201       *sock_len = sizeof(v6);
1202       GNUNET_free (cp);
1203       return in;
1204     }
1205   }
1206   /* #5528 FIXME (feature!): maybe also try getnameinfo()? */
1207   GNUNET_free (cp);
1208   return NULL;
1209 }
1210
1211
1212 /**
1213  * Setup cipher for outgoing data stream based on target and
1214  * our ephemeral private key.
1215  *
1216  * @param queue queue to setup outgoing (encryption) cipher for
1217  */
1218 static void
1219 setup_out_cipher (struct Queue *queue)
1220 {
1221   struct GNUNET_HashCode dh;
1222
1223   GNUNET_CRYPTO_ecdh_eddsa (&queue->ephemeral, &queue->target.public_key, &dh);
1224   /* we don't need the private key anymore, drop it! */
1225   memset (&queue->ephemeral, 0, sizeof(queue->ephemeral));
1226   setup_cipher (&dh, &queue->target, &queue->out_cipher, &queue->out_hmac);
1227   queue->rekey_time = GNUNET_TIME_relative_to_absolute (REKEY_TIME_INTERVAL);
1228   queue->rekey_left_bytes =
1229     GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, REKEY_MAX_BYTES);
1230 }
1231
1232
1233 /**
1234  * Inject a `struct TCPRekey` message into the queue's plaintext
1235  * buffer.
1236  *
1237  * @param queue queue to perform rekeying on
1238  */
1239 static void
1240 inject_rekey (struct Queue *queue)
1241 {
1242   struct TCPRekey rekey;
1243   struct TcpHandshakeSignature thp;
1244
1245   GNUNET_assert (0 == queue->pwrite_off);
1246   memset (&rekey, 0, sizeof(rekey));
1247   GNUNET_assert (GNUNET_OK ==
1248                  GNUNET_CRYPTO_ecdhe_key_create2 (&queue->ephemeral));
1249   rekey.header.type = ntohs (GNUNET_MESSAGE_TYPE_COMMUNICATOR_TCP_REKEY);
1250   rekey.header.size = ntohs (sizeof(rekey));
1251   GNUNET_CRYPTO_ecdhe_key_get_public (&queue->ephemeral, &rekey.ephemeral);
1252   rekey.monotonic_time =
1253     GNUNET_TIME_absolute_hton (GNUNET_TIME_absolute_get_monotonic (cfg));
1254   thp.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_TCP_REKEY);
1255   thp.purpose.size = htonl (sizeof(thp));
1256   thp.sender = my_identity;
1257   thp.receiver = queue->target;
1258   thp.ephemeral = rekey.ephemeral;
1259   thp.monotonic_time = rekey.monotonic_time;
1260   GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_eddsa_sign (my_private_key,
1261                                                         &thp.purpose,
1262                                                         &rekey.sender_sig));
1263   calculate_hmac (&queue->out_hmac, &rekey, sizeof(rekey), &rekey.hmac);
1264   memcpy (queue->pwrite_buf, &rekey, sizeof(rekey));
1265   queue->pwrite_off = sizeof(rekey);
1266 }
1267
1268
1269 /**
1270  * We have been notified that our socket is ready to write.
1271  * Then reschedule this function to be called again once more is available.
1272  *
1273  * @param cls a `struct Queue`
1274  */
1275 static void
1276 queue_write (void *cls)
1277 {
1278   struct Queue *queue = cls;
1279   ssize_t sent;
1280
1281   queue->write_task = NULL;
1282   if (0 != queue->cwrite_off)
1283   {
1284     sent = GNUNET_NETWORK_socket_send (queue->sock,
1285                                        queue->cwrite_buf,
1286                                        queue->cwrite_off);
1287     if ((-1 == sent) && (EAGAIN != errno) && (EINTR != errno))
1288     {
1289       GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send");
1290       queue_destroy (queue);
1291       return;
1292     }
1293     if (sent > 0)
1294     {
1295       size_t usent = (size_t) sent;
1296
1297       memmove (queue->cwrite_buf,
1298                &queue->cwrite_buf[usent],
1299                queue->cwrite_off - usent);
1300       reschedule_queue_timeout (queue);
1301     }
1302   }
1303   /* can we encrypt more? (always encrypt full messages, needed
1304      such that #mq_cancel() can work!) */
1305   if ((0 < queue->rekey_left_bytes) &&
1306       (queue->cwrite_off + queue->pwrite_off <= BUF_SIZE))
1307   {
1308     GNUNET_assert (0 ==
1309                    gcry_cipher_encrypt (queue->out_cipher,
1310                                         &queue->cwrite_buf[queue->cwrite_off],
1311                                         queue->pwrite_off,
1312                                         queue->pwrite_buf,
1313                                         queue->pwrite_off));
1314     if (queue->rekey_left_bytes > queue->pwrite_off)
1315       queue->rekey_left_bytes -= queue->pwrite_off;
1316     else
1317       queue->rekey_left_bytes = 0;
1318     queue->cwrite_off += queue->pwrite_off;
1319     queue->pwrite_off = 0;
1320   }
1321   if ((0 == queue->pwrite_off) &&
1322       ((0 == queue->rekey_left_bytes) ||
1323        (0 ==
1324         GNUNET_TIME_absolute_get_remaining (queue->rekey_time).rel_value_us)))
1325   {
1326     gcry_cipher_close (queue->out_cipher);
1327     setup_out_cipher (queue);
1328     inject_rekey (queue);
1329   }
1330   if ((0 == queue->pwrite_off) && (! queue->finishing) &&
1331       (queue->mq_awaits_continue))
1332   {
1333     queue->mq_awaits_continue = GNUNET_NO;
1334     GNUNET_MQ_impl_send_continue (queue->mq);
1335   }
1336   /* did we just finish writing 'finish'? */
1337   if ((0 == queue->cwrite_off) && (GNUNET_YES == queue->finishing))
1338   {
1339     queue_destroy (queue);
1340     return;
1341   }
1342   /* do we care to write more? */
1343   if ((0 < queue->cwrite_off) || (0 < queue->pwrite_off))
1344     queue->write_task =
1345       GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_UNIT_FOREVER_REL,
1346                                       queue->sock,
1347                                       &queue_write,
1348                                       queue);
1349 }
1350
1351
1352 /**
1353  * Signature of functions implementing the sending functionality of a
1354  * message queue.
1355  *
1356  * @param mq the message queue
1357  * @param msg the message to send
1358  * @param impl_state our `struct Queue`
1359  */
1360 static void
1361 mq_send (struct GNUNET_MQ_Handle *mq,
1362          const struct GNUNET_MessageHeader *msg,
1363          void *impl_state)
1364 {
1365   struct Queue *queue = impl_state;
1366   uint16_t msize = ntohs (msg->size);
1367   struct TCPBox box;
1368
1369   GNUNET_assert (mq == queue->mq);
1370   if (GNUNET_YES == queue->finishing)
1371     return; /* this queue is dying, drop msg */
1372   GNUNET_assert (0 == queue->pread_off);
1373   box.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_TCP_BOX);
1374   box.header.size = htons (msize);
1375   calculate_hmac (&queue->out_hmac, msg, msize, &box.hmac);
1376   memcpy (&queue->pread_buf[queue->pread_off], &box, sizeof(box));
1377   queue->pread_off += sizeof(box);
1378   memcpy (&queue->pread_buf[queue->pread_off], msg, msize);
1379   queue->pread_off += msize;
1380   GNUNET_assert (NULL != queue->sock);
1381   if (NULL == queue->write_task)
1382     queue->write_task =
1383       GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_UNIT_FOREVER_REL,
1384                                       queue->sock,
1385                                       &queue_write,
1386                                       queue);
1387 }
1388
1389
1390 /**
1391  * Signature of functions implementing the destruction of a message
1392  * queue.  Implementations must not free @a mq, but should take care
1393  * of @a impl_state.
1394  *
1395  * @param mq the message queue to destroy
1396  * @param impl_state our `struct Queue`
1397  */
1398 static void
1399 mq_destroy (struct GNUNET_MQ_Handle *mq, void *impl_state)
1400 {
1401   struct Queue *queue = impl_state;
1402
1403   if (mq == queue->mq)
1404   {
1405     queue->mq = NULL;
1406     queue_finish (queue);
1407   }
1408 }
1409
1410
1411 /**
1412  * Implementation function that cancels the currently sent message.
1413  *
1414  * @param mq message queue
1415  * @param impl_state our `struct Queue`
1416  */
1417 static void
1418 mq_cancel (struct GNUNET_MQ_Handle *mq, void *impl_state)
1419 {
1420   struct Queue *queue = impl_state;
1421
1422   GNUNET_assert (0 != queue->pwrite_off);
1423   queue->pwrite_off = 0;
1424 }
1425
1426
1427 /**
1428  * Generic error handler, called with the appropriate
1429  * error code and the same closure specified at the creation of
1430  * the message queue.
1431  * Not every message queue implementation supports an error handler.
1432  *
1433  * @param cls our `struct Queue`
1434  * @param error error code
1435  */
1436 static void
1437 mq_error (void *cls, enum GNUNET_MQ_Error error)
1438 {
1439   struct Queue *queue = cls;
1440
1441   GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1442               "MQ error in queue to %s: %d\n",
1443               GNUNET_i2s (&queue->target),
1444               (int) error);
1445   queue_finish (queue);
1446 }
1447
1448
1449 /**
1450  * Add the given @a queue to our internal data structure.  Setup the
1451  * MQ processing and inform transport that the queue is ready.  Must
1452  * be called after the KX for outgoing messages has been bootstrapped.
1453  *
1454  * @param queue queue to boot
1455  */
1456 static void
1457 boot_queue (struct Queue *queue, enum GNUNET_TRANSPORT_ConnectionStatus cs)
1458 {
1459   queue->nt =
1460     GNUNET_NT_scanner_get_type (is, queue->address, queue->address_len);
1461   (void) GNUNET_CONTAINER_multipeermap_put (
1462     queue_map,
1463     &queue->target,
1464     queue,
1465     GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
1466   GNUNET_STATISTICS_set (stats,
1467                          "# queues active",
1468                          GNUNET_CONTAINER_multipeermap_size (queue_map),
1469                          GNUNET_NO);
1470   queue->timeout =
1471     GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
1472   queue->mq = GNUNET_MQ_queue_for_callbacks (&mq_send,
1473                                              &mq_destroy,
1474                                              &mq_cancel,
1475                                              queue,
1476                                              NULL,
1477                                              &mq_error,
1478                                              queue);
1479   {
1480     char *foreign_addr;
1481
1482     switch (queue->address->sa_family)
1483     {
1484     case AF_INET:
1485       GNUNET_asprintf (&foreign_addr,
1486                        "%s-%s",
1487                        COMMUNICATOR_ADDRESS_PREFIX,
1488                        GNUNET_a2s (queue->address, queue->address_len));
1489       break;
1490
1491     case AF_INET6:
1492       GNUNET_asprintf (&foreign_addr,
1493                        "%s-%s",
1494                        COMMUNICATOR_ADDRESS_PREFIX,
1495                        GNUNET_a2s (queue->address, queue->address_len));
1496       break;
1497
1498     default:
1499       GNUNET_assert (0);
1500     }
1501     queue->qh = GNUNET_TRANSPORT_communicator_mq_add (ch,
1502                                                       &queue->target,
1503                                                       foreign_addr,
1504                                                       0 /* no MTU */,
1505                                                       queue->nt,
1506                                                       cs,
1507                                                       queue->mq);
1508     GNUNET_free (foreign_addr);
1509   }
1510 }
1511
1512
1513 /**
1514  * Generate and transmit our ephemeral key and the signature for
1515  * the initial KX with the other peer.  Must be called first, before
1516  * any other bytes are ever written to the output buffer.  Note that
1517  * our cipher must already be initialized when calling this function.
1518  * Helper function for #start_initial_kx_out().
1519  *
1520  * @param queue queue to do KX for
1521  * @param epub our public key for the KX
1522  */
1523 static void
1524 transmit_kx (struct Queue *queue,
1525              const struct GNUNET_CRYPTO_EcdhePublicKey *epub)
1526 {
1527   struct TcpHandshakeSignature ths;
1528   struct TCPConfirmation tc;
1529
1530   memcpy (queue->cwrite_buf, epub, sizeof(*epub));
1531   queue->cwrite_off = sizeof(epub);
1532   /* compute 'tc' and append in encrypted format to cwrite_buf */
1533   tc.sender = my_identity;
1534   tc.monotonic_time =
1535     GNUNET_TIME_absolute_hton (GNUNET_TIME_absolute_get_monotonic (cfg));
1536   ths.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_TCP_HANDSHAKE);
1537   ths.purpose.size = htonl (sizeof(ths));
1538   ths.sender = my_identity;
1539   ths.receiver = queue->target;
1540   ths.ephemeral = *epub;
1541   ths.monotonic_time = tc.monotonic_time;
1542   GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_eddsa_sign (my_private_key,
1543                                                         &ths.purpose,
1544                                                         &tc.sender_sig));
1545   GNUNET_assert (0 ==
1546                  gcry_cipher_encrypt (queue->out_cipher,
1547                                       &queue->cwrite_buf[queue->cwrite_off],
1548                                       sizeof(tc),
1549                                       &tc,
1550                                       sizeof(tc)));
1551   queue->cwrite_off += sizeof(tc);
1552 }
1553
1554
1555 /**
1556  * Initialize our key material for outgoing transmissions and
1557  * inform the other peer about it. Must be called first before
1558  * any data is sent.
1559  *
1560  * @param queue the queue to setup
1561  */
1562 static void
1563 start_initial_kx_out (struct Queue *queue)
1564 {
1565   struct GNUNET_CRYPTO_EcdhePublicKey epub;
1566
1567   GNUNET_assert (GNUNET_OK ==
1568                  GNUNET_CRYPTO_ecdhe_key_create2 (&queue->ephemeral));
1569   GNUNET_CRYPTO_ecdhe_key_get_public (&queue->ephemeral, &epub);
1570   setup_out_cipher (queue);
1571   transmit_kx (queue, &epub);
1572 }
1573
1574
1575 /**
1576  * We have received the first bytes from the other side on a @a queue.
1577  * Decrypt the @a tc contained in @a ibuf and check the signature.
1578  * Note that #setup_in_cipher() must have already been called.
1579  *
1580  * @param queue queue to decrypt initial bytes from other peer for
1581  * @param tc[out] where to store the result
1582  * @param ibuf incoming data, of size
1583  *        `INITIAL_KX_SIZE`
1584  * @return #GNUNET_OK if the signature was OK, #GNUNET_SYSERR if not
1585  */
1586 static int
1587 decrypt_and_check_tc (struct Queue *queue,
1588                       struct TCPConfirmation *tc,
1589                       char *ibuf)
1590 {
1591   struct TcpHandshakeSignature ths;
1592
1593   GNUNET_assert (
1594     0 ==
1595     gcry_cipher_decrypt (queue->in_cipher,
1596                          tc,
1597                          sizeof(*tc),
1598                          &ibuf[sizeof(struct GNUNET_CRYPTO_EcdhePublicKey)],
1599                          sizeof(tc)));
1600   ths.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_TCP_HANDSHAKE);
1601   ths.purpose.size = htonl (sizeof(ths));
1602   ths.sender = tc->sender;
1603   ths.receiver = my_identity;
1604   memcpy (&ths.ephemeral, ibuf, sizeof(struct GNUNET_CRYPTO_EcdhePublicKey));
1605   ths.monotonic_time = tc->monotonic_time;
1606   /* FIXME: check monotonic time against previous mono times
1607      from this sender! */
1608   return GNUNET_CRYPTO_eddsa_verify (
1609     GNUNET_SIGNATURE_COMMUNICATOR_TCP_HANDSHAKE,
1610     &ths.purpose,
1611     &tc->sender_sig,
1612     &tc->sender.public_key);
1613 }
1614
1615
1616 /**
1617  * Closes socket and frees memory associated with @a pq.
1618  *
1619  * @param pq proto queue to free
1620  */
1621 static void
1622 free_proto_queue (struct ProtoQueue *pq)
1623 {
1624   GNUNET_NETWORK_socket_close (pq->sock);
1625   GNUNET_free (pq->address);
1626   GNUNET_CONTAINER_DLL_remove (proto_head, proto_tail, pq);
1627   GNUNET_free (pq);
1628 }
1629
1630
1631 /**
1632  * Read from the socket of the proto queue until we have enough data
1633  * to upgrade to full queue.
1634  *
1635  * @param cls a `struct ProtoQueue`
1636  */
1637 static void
1638 proto_read_kx (void *cls)
1639 {
1640   struct ProtoQueue *pq = cls;
1641   ssize_t rcvd;
1642   struct GNUNET_TIME_Relative left;
1643   struct Queue *queue;
1644   struct TCPConfirmation tc;
1645
1646   pq->read_task = NULL;
1647   left = GNUNET_TIME_absolute_get_remaining (pq->timeout);
1648   if (0 == left.rel_value_us)
1649   {
1650     free_proto_queue (pq);
1651     return;
1652   }
1653   rcvd = GNUNET_NETWORK_socket_recv (pq->sock,
1654                                      &pq->ibuf[pq->ibuf_off],
1655                                      sizeof(pq->ibuf) - pq->ibuf_off);
1656   if (-1 == rcvd)
1657   {
1658     if ((EAGAIN != errno) && (EINTR != errno))
1659     {
1660       GNUNET_log_strerror (GNUNET_ERROR_TYPE_DEBUG, "recv");
1661       free_proto_queue (pq);
1662       return;
1663     }
1664     /* try again */
1665     pq->read_task =
1666       GNUNET_SCHEDULER_add_read_net (left, pq->sock, &proto_read_kx, pq);
1667     return;
1668   }
1669   pq->ibuf_off += rcvd;
1670   if (pq->ibuf_off > sizeof(pq->ibuf))
1671   {
1672     /* read more */
1673     pq->read_task =
1674       GNUNET_SCHEDULER_add_read_net (left, pq->sock, &proto_read_kx, pq);
1675     return;
1676   }
1677   /* we got all the data, let's find out who we are talking to! */
1678   queue = GNUNET_new (struct Queue);
1679   setup_in_cipher ((const struct GNUNET_CRYPTO_EcdhePublicKey *) pq->ibuf,
1680                    queue);
1681   if (GNUNET_OK != decrypt_and_check_tc (queue, &tc, pq->ibuf))
1682   {
1683     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1684                 "Invalid TCP KX received from %s\n",
1685                 GNUNET_a2s (queue->address, queue->address_len));
1686     gcry_cipher_close (queue->in_cipher);
1687     GNUNET_free (queue);
1688     free_proto_queue (pq);
1689     return;
1690   }
1691   queue->address = pq->address; /* steals reference */
1692   queue->address_len = pq->address_len;
1693   queue->target = tc.sender;
1694   start_initial_kx_out (queue);
1695   boot_queue (queue, GNUNET_TRANSPORT_CS_INBOUND);
1696   queue->read_task =
1697     GNUNET_SCHEDULER_add_read_net (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
1698                                    queue->sock,
1699                                    &queue_read,
1700                                    queue);
1701   queue->write_task =
1702     GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_UNIT_FOREVER_REL,
1703                                     queue->sock,
1704                                     &queue_write,
1705                                     queue);
1706   GNUNET_CONTAINER_DLL_remove (proto_head, proto_tail, pq);
1707   GNUNET_free (pq);
1708 }
1709
1710
1711 /**
1712  * We have been notified that our listen socket has something to
1713  * read. Do the read and reschedule this function to be called again
1714  * once more is available.
1715  *
1716  * @param cls NULL
1717  */
1718 static void
1719 listen_cb (void *cls)
1720 {
1721   struct sockaddr_storage in;
1722   socklen_t addrlen;
1723   struct GNUNET_NETWORK_Handle *sock;
1724   struct ProtoQueue *pq;
1725
1726   listen_task = NULL;
1727   GNUNET_assert (NULL != listen_sock);
1728   addrlen = sizeof(in);
1729   memset (&in, 0, sizeof(in));
1730   sock = GNUNET_NETWORK_socket_accept (listen_sock,
1731                                        (struct sockaddr *) &in,
1732                                        &addrlen);
1733   if ((NULL == sock) && ((EMFILE == errno) || (ENFILE == errno)))
1734     return; /* system limit reached, wait until connection goes down */
1735   listen_task = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
1736                                                listen_sock,
1737                                                &listen_cb,
1738                                                NULL);
1739   if ((NULL == sock) && ((EAGAIN == errno) || (ENOBUFS == errno)))
1740     return;
1741   if (NULL == sock)
1742   {
1743     GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "accept");
1744     return;
1745   }
1746   pq = GNUNET_new (struct ProtoQueue);
1747   pq->address_len = addrlen;
1748   pq->address = GNUNET_memdup (&in, addrlen);
1749   pq->timeout = GNUNET_TIME_relative_to_absolute (PROTO_QUEUE_TIMEOUT);
1750   pq->sock = sock;
1751   pq->read_task = GNUNET_SCHEDULER_add_read_net (PROTO_QUEUE_TIMEOUT,
1752                                                  pq->sock,
1753                                                  &proto_read_kx,
1754                                                  pq);
1755   GNUNET_CONTAINER_DLL_insert (proto_head, proto_tail, pq);
1756 }
1757
1758
1759 /**
1760  * Read from the socket of the queue until we have enough data
1761  * to initialize the decryption logic and can switch to regular
1762  * reading.
1763  *
1764  * @param cls a `struct Queue`
1765  */
1766 static void
1767 queue_read_kx (void *cls)
1768 {
1769   struct Queue *queue = cls;
1770   ssize_t rcvd;
1771   struct GNUNET_TIME_Relative left;
1772   struct TCPConfirmation tc;
1773
1774   queue->read_task = NULL;
1775   left = GNUNET_TIME_absolute_get_remaining (queue->timeout);
1776   if (0 == left.rel_value_us)
1777   {
1778     queue_destroy (queue);
1779     return;
1780   }
1781   rcvd = GNUNET_NETWORK_socket_recv (queue->sock,
1782                                      &queue->cread_buf[queue->cread_off],
1783                                      BUF_SIZE - queue->cread_off);
1784   if (-1 == rcvd)
1785   {
1786     if ((EAGAIN != errno) && (EINTR != errno))
1787     {
1788       GNUNET_log_strerror (GNUNET_ERROR_TYPE_DEBUG, "recv");
1789       queue_destroy (queue);
1790       return;
1791     }
1792     queue->read_task =
1793       GNUNET_SCHEDULER_add_read_net (left, queue->sock, &queue_read_kx, queue);
1794     return;
1795   }
1796   queue->cread_off += rcvd;
1797   if (queue->cread_off < INITIAL_KX_SIZE)
1798   {
1799     /* read more */
1800     queue->read_task =
1801       GNUNET_SCHEDULER_add_read_net (left, queue->sock, &queue_read_kx, queue);
1802     return;
1803   }
1804   /* we got all the data, let's find out who we are talking to! */
1805   setup_in_cipher ((const struct GNUNET_CRYPTO_EcdhePublicKey *)
1806                    queue->cread_buf,
1807                    queue);
1808   if (GNUNET_OK != decrypt_and_check_tc (queue, &tc, queue->cread_buf))
1809   {
1810     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1811                 "Invalid TCP KX received from %s\n",
1812                 GNUNET_a2s (queue->address, queue->address_len));
1813     queue_destroy (queue);
1814     return;
1815   }
1816   if (0 !=
1817       memcmp (&tc.sender, &queue->target, sizeof(struct GNUNET_PeerIdentity)))
1818   {
1819     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
1820                 "Invalid sender in TCP KX received from %s\n",
1821                 GNUNET_a2s (queue->address, queue->address_len));
1822     queue_destroy (queue);
1823     return;
1824   }
1825
1826   /* update queue timeout */
1827   reschedule_queue_timeout (queue);
1828   /* prepare to continue with regular read task immediately */
1829   memmove (queue->cread_buf,
1830            &queue->cread_buf[INITIAL_KX_SIZE],
1831            queue->cread_off - (INITIAL_KX_SIZE));
1832   queue->cread_off -= INITIAL_KX_SIZE;
1833   queue->read_task = GNUNET_SCHEDULER_add_now (&queue_read, queue);
1834 }
1835
1836
1837 /**
1838  * Function called by the transport service to initialize a
1839  * message queue given address information about another peer.
1840  * If and when the communication channel is established, the
1841  * communicator must call #GNUNET_TRANSPORT_communicator_mq_add()
1842  * to notify the service that the channel is now up.  It is
1843  * the responsibility of the communicator to manage sane
1844  * retries and timeouts for any @a peer/@a address combination
1845  * provided by the transport service.  Timeouts and retries
1846  * do not need to be signalled to the transport service.
1847  *
1848  * @param cls closure
1849  * @param peer identity of the other peer
1850  * @param address where to send the message, human-readable
1851  *        communicator-specific format, 0-terminated, UTF-8
1852  * @return #GNUNET_OK on success, #GNUNET_SYSERR if the provided address is
1853  * invalid
1854  */
1855 static int
1856 mq_init (void *cls, const struct GNUNET_PeerIdentity *peer, const char *address)
1857 {
1858   struct Queue *queue;
1859   const char *path;
1860   struct sockaddr *in;
1861   socklen_t in_len;
1862   struct GNUNET_NETWORK_Handle *sock;
1863
1864   if (0 != strncmp (address,
1865                     COMMUNICATOR_ADDRESS_PREFIX "-",
1866                     strlen (COMMUNICATOR_ADDRESS_PREFIX "-")))
1867   {
1868     GNUNET_break_op (0);
1869     return GNUNET_SYSERR;
1870   }
1871   path = &address[strlen (COMMUNICATOR_ADDRESS_PREFIX "-")];
1872   in = tcp_address_to_sockaddr (path, &in_len);
1873
1874   sock = GNUNET_NETWORK_socket_create (in->sa_family, SOCK_STREAM, IPPROTO_TCP);
1875   if (NULL == sock)
1876   {
1877     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
1878                 "socket(%d) failed: %s",
1879                 in->sa_family,
1880                 strerror (errno));
1881     GNUNET_free (in);
1882     return GNUNET_SYSERR;
1883   }
1884   if (GNUNET_OK != GNUNET_NETWORK_socket_connect (sock, in, in_len))
1885   {
1886     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
1887                 "connect to `%s' failed: %s",
1888                 address,
1889                 strerror (errno));
1890     GNUNET_NETWORK_socket_close (sock);
1891     GNUNET_free (in);
1892     return GNUNET_SYSERR;
1893   }
1894
1895   queue = GNUNET_new (struct Queue);
1896   queue->target = *peer;
1897   queue->address = in;
1898   queue->address_len = in_len;
1899   queue->sock = sock;
1900   boot_queue (queue, GNUNET_TRANSPORT_CS_OUTBOUND);
1901   queue->read_task =
1902     GNUNET_SCHEDULER_add_read_net (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
1903                                    queue->sock,
1904                                    &queue_read_kx,
1905                                    queue);
1906   start_initial_kx_out (queue);
1907   queue->write_task =
1908     GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_UNIT_FOREVER_REL,
1909                                     queue->sock,
1910                                     &queue_write,
1911                                     queue);
1912   return GNUNET_OK;
1913 }
1914
1915
1916 /**
1917  * Iterator over all message queues to clean up.
1918  *
1919  * @param cls NULL
1920  * @param target unused
1921  * @param value the queue to destroy
1922  * @return #GNUNET_OK to continue to iterate
1923  */
1924 static int
1925 get_queue_delete_it (void *cls,
1926                      const struct GNUNET_PeerIdentity *target,
1927                      void *value)
1928 {
1929   struct Queue *queue = value;
1930
1931   (void) cls;
1932   (void) target;
1933   queue_destroy (queue);
1934   return GNUNET_OK;
1935 }
1936
1937
1938 /**
1939  * Shutdown the UNIX communicator.
1940  *
1941  * @param cls NULL (always)
1942  */
1943 static void
1944 do_shutdown (void *cls)
1945 {
1946   while (NULL != proto_head)
1947     free_proto_queue (proto_head);
1948   if (NULL != nat)
1949   {
1950     GNUNET_NAT_unregister (nat);
1951     nat = NULL;
1952   }
1953   if (NULL != listen_task)
1954   {
1955     GNUNET_SCHEDULER_cancel (listen_task);
1956     listen_task = NULL;
1957   }
1958   if (NULL != listen_sock)
1959   {
1960     GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (listen_sock));
1961     listen_sock = NULL;
1962   }
1963   GNUNET_CONTAINER_multipeermap_iterate (queue_map, &get_queue_delete_it, NULL);
1964   GNUNET_CONTAINER_multipeermap_destroy (queue_map);
1965   if (NULL != ch)
1966   {
1967     GNUNET_TRANSPORT_communicator_disconnect (ch);
1968     ch = NULL;
1969   }
1970   if (NULL != stats)
1971   {
1972     GNUNET_STATISTICS_destroy (stats, GNUNET_NO);
1973     stats = NULL;
1974   }
1975   if (NULL != my_private_key)
1976   {
1977     GNUNET_free (my_private_key);
1978     my_private_key = NULL;
1979   }
1980   if (NULL != is)
1981   {
1982     GNUNET_NT_scanner_done (is);
1983     is = NULL;
1984   }
1985 }
1986
1987
1988 /**
1989  * Function called when the transport service has received an
1990  * acknowledgement for this communicator (!) via a different return
1991  * path.
1992  *
1993  * Not applicable for TCP.
1994  *
1995  * @param cls closure
1996  * @param sender which peer sent the notification
1997  * @param msg payload
1998  */
1999 static void
2000 enc_notify_cb (void *cls,
2001                const struct GNUNET_PeerIdentity *sender,
2002                const struct GNUNET_MessageHeader *msg)
2003 {
2004   (void) cls;
2005   (void) sender;
2006   (void) msg;
2007   GNUNET_break_op (0);
2008 }
2009
2010
2011 /**
2012  * Signature of the callback passed to #GNUNET_NAT_register() for
2013  * a function to call whenever our set of 'valid' addresses changes.
2014  *
2015  * @param cls closure
2016  * @param app_ctx[in,out] location where the app can store stuff
2017  *                  on add and retrieve it on remove
2018  * @param add_remove #GNUNET_YES to add a new public IP address,
2019  *                   #GNUNET_NO to remove a previous (now invalid) one
2020  * @param ac address class the address belongs to
2021  * @param addr either the previous or the new public IP address
2022  * @param addrlen actual length of the @a addr
2023  */
2024 static void
2025 nat_address_cb (void *cls,
2026                 void **app_ctx,
2027                 int add_remove,
2028                 enum GNUNET_NAT_AddressClass ac,
2029                 const struct sockaddr *addr,
2030                 socklen_t addrlen)
2031 {
2032   char *my_addr;
2033   struct GNUNET_TRANSPORT_AddressIdentifier *ai;
2034
2035   if (GNUNET_YES == add_remove)
2036   {
2037     enum GNUNET_NetworkType nt;
2038
2039     GNUNET_asprintf (&my_addr,
2040                      "%s-%s",
2041                      COMMUNICATOR_ADDRESS_PREFIX,
2042                      GNUNET_a2s (addr, addrlen));
2043     nt = GNUNET_NT_scanner_get_type (is, addr, addrlen);
2044     ai =
2045       GNUNET_TRANSPORT_communicator_address_add (ch,
2046                                                  my_addr,
2047                                                  nt,
2048                                                  GNUNET_TIME_UNIT_FOREVER_REL);
2049     GNUNET_free (my_addr);
2050     *app_ctx = ai;
2051   }
2052   else
2053   {
2054     ai = *app_ctx;
2055     GNUNET_TRANSPORT_communicator_address_remove (ai);
2056     *app_ctx = NULL;
2057   }
2058 }
2059
2060
2061 /**
2062  * Setup communicator and launch network interactions.
2063  *
2064  * @param cls NULL (always)
2065  * @param args remaining command-line arguments
2066  * @param cfgfile name of the configuration file used (for saving, can be NULL!)
2067  * @param c configuration
2068  */
2069 static void
2070 run (void *cls,
2071      char *const *args,
2072      const char *cfgfile,
2073      const struct GNUNET_CONFIGURATION_Handle *c)
2074 {
2075   char *bindto;
2076   struct sockaddr *in;
2077   socklen_t in_len;
2078   struct sockaddr_storage in_sto;
2079   socklen_t sto_len;
2080
2081   (void) cls;
2082   cfg = c;
2083   if (GNUNET_OK !=
2084       GNUNET_CONFIGURATION_get_value_filename (cfg,
2085                                                COMMUNICATOR_CONFIG_SECTION,
2086                                                "BINDTO",
2087                                                &bindto))
2088   {
2089     GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
2090                                COMMUNICATOR_CONFIG_SECTION,
2091                                "BINDTO");
2092     return;
2093   }
2094   if (GNUNET_OK !=
2095       GNUNET_CONFIGURATION_get_value_number (cfg,
2096                                              COMMUNICATOR_CONFIG_SECTION,
2097                                              "MAX_QUEUE_LENGTH",
2098                                              &max_queue_length))
2099     max_queue_length = DEFAULT_MAX_QUEUE_LENGTH;
2100
2101   in = tcp_address_to_sockaddr (bindto, &in_len);
2102   if (NULL == in)
2103   {
2104     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
2105                 "Failed to setup TCP socket address with path `%s'\n",
2106                 bindto);
2107     GNUNET_free (bindto);
2108     return;
2109   }
2110   listen_sock =
2111     GNUNET_NETWORK_socket_create (in->sa_family, SOCK_STREAM, IPPROTO_TCP);
2112   if (NULL == listen_sock)
2113   {
2114     GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket");
2115     GNUNET_free (in);
2116     GNUNET_free (bindto);
2117     return;
2118   }
2119   if (GNUNET_OK != GNUNET_NETWORK_socket_bind (listen_sock, in, in_len))
2120   {
2121     GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "bind", bindto);
2122     GNUNET_NETWORK_socket_close (listen_sock);
2123     listen_sock = NULL;
2124     GNUNET_free (in);
2125     GNUNET_free (bindto);
2126     return;
2127   }
2128   /* We might have bound to port 0, allowing the OS to figure it out;
2129      thus, get the real IN-address from the socket */
2130   sto_len = sizeof(in_sto);
2131   if (0 != getsockname (GNUNET_NETWORK_get_fd (listen_sock),
2132                         (struct sockaddr *) &in_sto,
2133                         &sto_len))
2134   {
2135     memcpy (&in_sto, in, in_len);
2136     sto_len = in_len;
2137   }
2138   GNUNET_free (in);
2139   GNUNET_free (bindto);
2140   in = (struct sockaddr *) &in_sto;
2141   in_len = sto_len;
2142   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2143               "Bound to `%s'\n",
2144               GNUNET_a2s ((const struct sockaddr *) &in_sto, sto_len));
2145   stats = GNUNET_STATISTICS_create ("C-TCP", cfg);
2146   GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL);
2147   is = GNUNET_NT_scanner_init ();
2148   my_private_key = GNUNET_CRYPTO_eddsa_key_create_from_configuration (cfg);
2149   if (NULL == my_private_key)
2150   {
2151     GNUNET_log (
2152       GNUNET_ERROR_TYPE_ERROR,
2153       _ (
2154         "Transport service is lacking key configuration settings. Exiting.\n"));
2155     GNUNET_SCHEDULER_shutdown ();
2156     return;
2157   }
2158   GNUNET_CRYPTO_eddsa_key_get_public (my_private_key, &my_identity.public_key);
2159   /* start listening */
2160   listen_task = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
2161                                                listen_sock,
2162                                                &listen_cb,
2163                                                NULL);
2164   queue_map = GNUNET_CONTAINER_multipeermap_create (10, GNUNET_NO);
2165   ch = GNUNET_TRANSPORT_communicator_connect (cfg,
2166                                               COMMUNICATOR_CONFIG_SECTION,
2167                                               COMMUNICATOR_ADDRESS_PREFIX,
2168                                               GNUNET_TRANSPORT_CC_RELIABLE,
2169                                               &mq_init,
2170                                               NULL,
2171                                               &enc_notify_cb,
2172                                               NULL);
2173   if (NULL == ch)
2174   {
2175     GNUNET_break (0);
2176     GNUNET_SCHEDULER_shutdown ();
2177     return;
2178   }
2179   nat = GNUNET_NAT_register (cfg,
2180                              COMMUNICATOR_CONFIG_SECTION,
2181                              IPPROTO_TCP,
2182                              1 /* one address */,
2183                              (const struct sockaddr **) &in,
2184                              &in_len,
2185                              &nat_address_cb,
2186                              NULL /* FIXME: support reversal: #5529 */,
2187                              NULL /* closure */);
2188 }
2189
2190
2191 /**
2192  * The main function for the UNIX communicator.
2193  *
2194  * @param argc number of arguments from the command line
2195  * @param argv command line arguments
2196  * @return 0 ok, 1 on error
2197  */
2198 int
2199 main (int argc, char *const *argv)
2200 {
2201   static const struct GNUNET_GETOPT_CommandLineOption options[] = {
2202     GNUNET_GETOPT_OPTION_END
2203   };
2204   int ret;
2205
2206   if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
2207     return 2;
2208
2209   ret = (GNUNET_OK == GNUNET_PROGRAM_run (argc,
2210                                           argv,
2211                                           "gnunet-communicator-tcp",
2212                                           _ ("GNUnet TCP communicator"),
2213                                           options,
2214                                           &run,
2215                                           NULL))
2216         ? 0
2217         : 1;
2218   GNUNET_free ((void *) argv);
2219   return ret;
2220 }
2221
2222
2223 /* end of gnunet-communicator-tcp.c */