move GNUNET_TRANSPORT_ATS_ to GNUNET_ATS_
[oweals/gnunet.git] / src / core / gnunet-service-core_kx.c
1 /*
2      This file is part of GNUnet.
3      (C) 2009, 2010, 2011 Christian Grothoff (and other contributing authors)
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      option) any later version.
9
10      GNUnet is distributed in the hope that it will be useful, but
11      WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20
21 /**
22  * @file core/gnunet-service-core_kx.c
23  * @brief code for managing the key exchange (SET_KEY, PING, PONG) with other peers
24  * @author Christian Grothoff
25  */
26 #include "platform.h"
27 #include "gnunet-service-core_kx.h"
28 #include "gnunet-service-core.h"
29 #include "gnunet-service-core_clients.h"
30 #include "gnunet-service-core_neighbours.h"
31 #include "gnunet-service-core_sessions.h"
32 #include "gnunet_statistics_service.h"
33 #include "gnunet_peerinfo_service.h"
34 #include "gnunet_hello_lib.h"
35 #include "gnunet_constants.h"
36 #include "gnunet_signatures.h"
37 #include "gnunet_protocols.h"
38 #include "core.h"
39
40 /**
41  * How long do we wait for SET_KEY confirmation initially?
42  */
43 #define INITIAL_SET_KEY_RETRY_FREQUENCY GNUNET_TIME_relative_multiply (MAX_SET_KEY_DELAY, 1)
44
45 /**
46  * What is the minimum frequency for a PING message?
47  */
48 #define MIN_PING_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
49
50 /**
51  * What is the maximum age of a message for us to consider processing
52  * it?  Note that this looks at the timestamp used by the other peer,
53  * so clock skew between machines does come into play here.  So this
54  * should be picked high enough so that a little bit of clock skew
55  * does not prevent peers from connecting to us.
56  */
57 #define MAX_MESSAGE_AGE GNUNET_TIME_UNIT_DAYS
58
59 /**
60  * What is the maximum delay for a SET_KEY message?
61  */
62 #define MAX_SET_KEY_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
63
64
65 /**
66  * We're sending an (encrypted) PING to the other peer to check if he
67  * can decrypt.  The other peer should respond with a PONG with the
68  * same content, except this time encrypted with the receiver's key.
69  */
70 struct PingMessage
71 {
72   /**
73    * Message type is CORE_PING.
74    */
75   struct GNUNET_MessageHeader header;
76
77   /**
78    * Seed for the IV
79    */
80   uint32_t iv_seed GNUNET_PACKED;
81
82   /**
83    * Intended target of the PING, used primarily to check
84    * that decryption actually worked.
85    */
86   struct GNUNET_PeerIdentity target;
87
88   /**
89    * Random number chosen to make reply harder.
90    */
91   uint32_t challenge GNUNET_PACKED;
92 };
93
94
95 /**
96  * Response to a PING.  Includes data from the original PING.
97  */
98 struct PongMessage
99 {
100   /**
101    * Message type is CORE_PONG.
102    */
103   struct GNUNET_MessageHeader header;
104
105   /**
106    * Seed for the IV
107    */
108   uint32_t iv_seed GNUNET_PACKED;
109
110   /**
111    * Random number to make faking the reply harder.  Must be
112    * first field after header (this is where we start to encrypt!).
113    */
114   uint32_t challenge GNUNET_PACKED;
115  
116   /**
117    * Reserved, always 'GNUNET_BANDWIDTH_VALUE_MAX'.
118    */
119   struct GNUNET_BANDWIDTH_Value32NBO reserved;
120
121   /**
122    * Intended target of the PING, used primarily to check
123    * that decryption actually worked.
124    */
125   struct GNUNET_PeerIdentity target;
126 };
127
128
129 /**
130  * Message transmitted to set (or update) a session key.
131  */
132 struct SetKeyMessage
133 {
134
135   /**
136    * Message type is either CORE_SET_KEY.
137    */
138   struct GNUNET_MessageHeader header;
139
140   /**
141    * Status of the sender (should be in "enum PeerStateMachine"), nbo.
142    */
143   int32_t sender_status GNUNET_PACKED;
144
145   /**
146    * Purpose of the signature, will be
147    * GNUNET_SIGNATURE_PURPOSE_SET_KEY.
148    */
149   struct GNUNET_CRYPTO_RsaSignaturePurpose purpose;
150
151   /**
152    * At what time was this key created?
153    */
154   struct GNUNET_TIME_AbsoluteNBO creation_time;
155
156   /**
157    * The encrypted session key.
158    */
159   struct GNUNET_CRYPTO_RsaEncryptedData encrypted_key;
160
161   /**
162    * Who is the intended recipient?
163    */
164   struct GNUNET_PeerIdentity target;
165
166   /**
167    * Signature of the stuff above (starting at purpose).
168    */
169   struct GNUNET_CRYPTO_RsaSignature signature;
170
171 };
172
173
174 /**
175  * Encapsulation for encrypted messages exchanged between
176  * peers.  Followed by the actual encrypted data.
177  */
178 struct EncryptedMessage
179 {
180   /**
181    * Message type is either CORE_ENCRYPTED_MESSAGE.
182    */
183   struct GNUNET_MessageHeader header;
184
185   /**
186    * Random value used for IV generation.
187    */
188   uint32_t iv_seed GNUNET_PACKED;
189
190   /**
191    * MAC of the encrypted message (starting at 'sequence_number'),
192    * used to verify message integrity. Everything after this value
193    * (excluding this value itself) will be encrypted and authenticated.
194    * ENCRYPTED_HEADER_SIZE must be set to the offset of the *next* field.
195    */
196   GNUNET_HashCode hmac;
197
198   /**
199    * Sequence number, in network byte order.  This field
200    * must be the first encrypted/decrypted field
201    */
202   uint32_t sequence_number GNUNET_PACKED;
203
204   /**
205    * Reserved, always 'GNUNET_BANDWIDTH_VALUE_MAX'.
206    */
207   struct GNUNET_BANDWIDTH_Value32NBO reserved;
208
209   /**
210    * Timestamp.  Used to prevent reply of ancient messages
211    * (recent messages are caught with the sequence number).
212    */
213   struct GNUNET_TIME_AbsoluteNBO timestamp;
214
215 };
216
217 /**
218  * Number of bytes (at the beginning) of "struct EncryptedMessage"
219  * that are NOT encrypted.
220  */
221 #define ENCRYPTED_HEADER_SIZE (offsetof(struct EncryptedMessage, sequence_number))
222
223
224 /**
225  * State machine for our P2P encryption handshake.  Everyone starts in
226  * "DOWN", if we receive the other peer's key (other peer initiated)
227  * we start in state RECEIVED (since we will immediately send our
228  * own); otherwise we start in SENT.  If we get back a PONG from
229  * within either state, we move up to CONFIRMED (the PONG will always
230  * be sent back encrypted with the key we sent to the other peer).
231  */
232 enum KxStateMachine
233 {
234   /**
235    * No handshake yet.
236    */
237   KX_STATE_DOWN,
238
239   /**
240    * We've sent our session key.
241    */
242   KX_STATE_KEY_SENT,
243
244   /**
245    * We've received the other peers session key.
246    */
247   KX_STATE_KEY_RECEIVED,
248
249   /**
250    * The other peer has confirmed our session key with a message
251    * encrypted with his session key (which we got).  Key exchange
252    * is done.
253    */
254   KX_STATE_UP
255 };
256
257
258 /**
259  * Information about the status of a key exchange with another peer.
260  */
261 struct GSC_KeyExchangeInfo
262 {
263   /**
264    * Identity of the peer.
265    */
266   struct GNUNET_PeerIdentity peer;
267
268   /**
269    * SetKeyMessage to transmit (initialized the first
270    * time our status goes past 'KX_STATE_KEY_SENT').
271    */
272   struct SetKeyMessage skm;
273
274   /**
275    * PING message we transmit to the other peer.
276    */
277   struct PingMessage ping;
278
279   /**
280    * SetKeyMessage we received and did not process yet.
281    */
282   struct SetKeyMessage *skm_received;
283
284   /**
285    * PING message we received from the other peer and
286    * did not process yet (or NULL).
287    */
288   struct PingMessage *ping_received;
289
290   /**
291    * PONG message we received from the other peer and
292    * did not process yet (or NULL).
293    */
294   struct PongMessage *pong_received;
295
296   /**
297    * Encrypted message we received from the other peer and
298    * did not process yet (or NULL).
299    */
300   struct EncryptedMessage *emsg_received;
301
302   /**
303    * Non-NULL if we are currently looking up HELLOs for this peer.
304    * for this peer.
305    */
306   struct GNUNET_PEERINFO_IteratorContext *pitr;
307
308   /**
309    * Public key of the neighbour, NULL if we don't have it yet.
310    */
311   struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *public_key;
312
313   /**
314    * We received a PONG message before we got the "public_key"
315    * (or the SET_KEY).  We keep it here until we have a key
316    * to decrypt it.  NULL if no PONG is pending.
317    */
318   struct PongMessage *pending_pong;
319
320   /**
321    * Key we use to encrypt our messages for the other peer
322    * (initialized by us when we do the handshake).
323    */
324   struct GNUNET_CRYPTO_AesSessionKey encrypt_key;
325
326   /**
327    * Key we use to decrypt messages from the other peer
328    * (given to us by the other peer during the handshake).
329    */
330   struct GNUNET_CRYPTO_AesSessionKey decrypt_key;
331
332   /**
333    * At what time did we generate our encryption key?
334    */
335   struct GNUNET_TIME_Absolute encrypt_key_created;
336
337   /**
338    * At what time did the other peer generate the decryption key?
339    */
340   struct GNUNET_TIME_Absolute decrypt_key_created;
341
342   /**
343    * When should the session time out (if there are no PONGs)?
344    */
345   struct GNUNET_TIME_Absolute timeout;
346
347   /**
348    * At what frequency are we currently re-trying SET_KEY messages?
349    */
350   struct GNUNET_TIME_Relative set_key_retry_frequency;
351
352   /**
353    * ID of task used for re-trying SET_KEY and PING message.
354    */
355   GNUNET_SCHEDULER_TaskIdentifier retry_set_key_task;
356
357   /**
358    * ID of task used for sending keep-alive pings.
359    */
360   GNUNET_SCHEDULER_TaskIdentifier keep_alive_task;
361
362   /**
363    * Bit map indicating which of the 32 sequence numbers before the last
364    * were received (good for accepting out-of-order packets and
365    * estimating reliability of the connection)
366    */
367   unsigned int last_packets_bitmap;
368
369   /**
370    * last sequence number received on this connection (highest)
371    */
372   uint32_t last_sequence_number_received;
373
374   /**
375    * last sequence number transmitted
376    */
377   uint32_t last_sequence_number_sent;
378
379   /**
380    * What was our PING challenge number (for this peer)?
381    */
382   uint32_t ping_challenge;
383
384   /**
385    * What is our connection status?
386    */
387   enum KxStateMachine status;
388
389 };
390
391
392
393 /**
394  * Handle to peerinfo service.
395  */
396 static struct GNUNET_PEERINFO_Handle *peerinfo;
397
398 /**
399  * Our private key.
400  */
401 static struct GNUNET_CRYPTO_RsaPrivateKey *my_private_key;
402
403 /**
404  * Our public key.
405  */
406 static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded my_public_key;
407
408 /**
409  * Our message stream tokenizer (for encrypted payload).
410  */
411 static struct GNUNET_SERVER_MessageStreamTokenizer *mst;
412
413
414
415 /**
416  * Derive an authentication key from "set key" information
417  */
418 static void
419 derive_auth_key (struct GNUNET_CRYPTO_AuthKey *akey,
420                  const struct GNUNET_CRYPTO_AesSessionKey *skey, uint32_t seed,
421                  struct GNUNET_TIME_Absolute creation_time)
422 {
423   static const char ctx[] = "authentication key";
424   struct GNUNET_TIME_AbsoluteNBO ctbe;
425
426
427   ctbe = GNUNET_TIME_absolute_hton (creation_time);
428   GNUNET_CRYPTO_hmac_derive_key (akey, skey, &seed, sizeof (seed), &skey->key,
429                                  sizeof (skey->key), &ctbe, sizeof (ctbe), ctx,
430                                  sizeof (ctx), NULL);
431 }
432
433
434 /**
435  * Derive an IV from packet information
436  */
437 static void
438 derive_iv (struct GNUNET_CRYPTO_AesInitializationVector *iv,
439            const struct GNUNET_CRYPTO_AesSessionKey *skey, uint32_t seed,
440            const struct GNUNET_PeerIdentity *identity)
441 {
442   static const char ctx[] = "initialization vector";
443
444   GNUNET_CRYPTO_aes_derive_iv (iv, skey, &seed, sizeof (seed),
445                                &identity->hashPubKey.bits,
446                                sizeof (identity->hashPubKey.bits), ctx,
447                                sizeof (ctx), NULL);
448 }
449
450 /**
451  * Derive an IV from pong packet information
452  */
453 static void
454 derive_pong_iv (struct GNUNET_CRYPTO_AesInitializationVector *iv,
455                 const struct GNUNET_CRYPTO_AesSessionKey *skey, uint32_t seed,
456                 uint32_t challenge, const struct GNUNET_PeerIdentity *identity)
457 {
458   static const char ctx[] = "pong initialization vector";
459
460   GNUNET_CRYPTO_aes_derive_iv (iv, skey, &seed, sizeof (seed),
461                                &identity->hashPubKey.bits,
462                                sizeof (identity->hashPubKey.bits), &challenge,
463                                sizeof (challenge), ctx, sizeof (ctx), NULL);
464 }
465
466
467 /**
468  * Encrypt size bytes from in and write the result to out.  Use the
469  * key for outbound traffic of the given neighbour.
470  *
471  * @param kx key information context
472  * @param iv initialization vector to use
473  * @param in ciphertext
474  * @param out plaintext
475  * @param size size of in/out
476  * @return GNUNET_OK on success
477  */
478 static int
479 do_encrypt (struct GSC_KeyExchangeInfo *kx,
480             const struct GNUNET_CRYPTO_AesInitializationVector *iv,
481             const void *in, void *out, size_t size)
482 {
483   if (size != (uint16_t) size)
484   {
485     GNUNET_break (0);
486     return GNUNET_NO;
487   }
488   GNUNET_assert (size ==
489                  GNUNET_CRYPTO_aes_encrypt (in, (uint16_t) size,
490                                             &kx->encrypt_key, iv, out));
491   GNUNET_STATISTICS_update (GSC_stats, gettext_noop ("# bytes encrypted"), size,
492                             GNUNET_NO);
493 #if DEBUG_CORE > 2
494   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
495               "Encrypted %u bytes for `%4s' using key %u, IV %u\n",
496               (unsigned int) size, GNUNET_i2s (&kx->peer),
497               (unsigned int) kx->encrypt_key.crc32, GNUNET_CRYPTO_crc32_n (iv,
498                                                                           sizeof
499                                                                           (iv)));
500 #endif
501   return GNUNET_OK;
502 }
503
504
505
506
507 /**
508  * Decrypt size bytes from in and write the result to out.  Use the
509  * key for inbound traffic of the given neighbour.  This function does
510  * NOT do any integrity-checks on the result.
511  *
512  * @param kx key information context
513  * @param iv initialization vector to use
514  * @param in ciphertext
515  * @param out plaintext
516  * @param size size of in/out
517  * @return GNUNET_OK on success
518  */
519 static int
520 do_decrypt (struct GSC_KeyExchangeInfo *kx,
521             const struct GNUNET_CRYPTO_AesInitializationVector *iv,
522             const void *in, void *out, size_t size)
523 {
524   if (size != (uint16_t) size)
525   {
526     GNUNET_break (0);
527     return GNUNET_NO;
528   }
529   if ((kx->status != KX_STATE_KEY_RECEIVED) &&
530       (kx->status != KX_STATE_UP))
531   {
532     GNUNET_break_op (0);
533     return GNUNET_SYSERR;
534   }
535   if (size !=
536       GNUNET_CRYPTO_aes_decrypt (in, (uint16_t) size, &kx->decrypt_key, iv, out))
537   {
538     GNUNET_break (0);
539     return GNUNET_SYSERR;
540   }
541   GNUNET_STATISTICS_update (GSC_stats, gettext_noop ("# bytes decrypted"), size,
542                             GNUNET_NO);
543 #if DEBUG_CORE > 1
544   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
545               "Decrypted %u bytes from `%4s' using key %u, IV %u\n",
546               (unsigned int) size, GNUNET_i2s (&kx->peer),
547               (unsigned int) kx->decrypt_key.crc32, GNUNET_CRYPTO_crc32_n (iv,
548                                                                           sizeof
549                                                                           (*iv)));
550 #endif
551   return GNUNET_OK;
552 }
553
554
555 /**
556  * Send our key (and encrypted PING) to the other peer.
557  *
558  * @param kx key exchange context
559  */
560 static void
561 send_key (struct GSC_KeyExchangeInfo *kx);
562
563
564 /**
565  * Task that will retry "send_key" if our previous attempt failed.
566  *
567  * @param cls our 'struct GSC_KeyExchangeInfo'
568  * @param tc scheduler context
569  */
570 static void
571 set_key_retry_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
572 {
573   struct GSC_KeyExchangeInfo *kx = cls;
574
575   kx->retry_set_key_task = GNUNET_SCHEDULER_NO_TASK;
576   kx->set_key_retry_frequency = GNUNET_TIME_relative_multiply (kx->set_key_retry_frequency, 2);
577   send_key (kx);
578 }
579
580
581 /**
582  * PEERINFO is giving us a HELLO for a peer.  Add the public key to
583  * the neighbour's struct and continue with the key exchange.  Or, if
584  * we did not get a HELLO, just do nothing.
585  *
586  * @param cls the 'struct GSC_KeyExchangeInfo' to retry sending the key for
587  * @param peer the peer for which this is the HELLO
588  * @param hello HELLO message of that peer
589  * @param err_msg NULL if successful, otherwise contains error message
590  */
591 static void
592 process_hello (void *cls, const struct GNUNET_PeerIdentity *peer,
593                const struct GNUNET_HELLO_Message *hello,
594                const char *err_msg)
595 {
596   struct GSC_KeyExchangeInfo *kx = cls;
597   struct SetKeyMessage *skm;
598
599   if (err_msg != NULL)
600   {
601     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
602                 _("Error in communication with PEERINFO service\n"));
603     kx->pitr = NULL;
604     return;
605   }
606   if (peer == NULL)
607   {
608     kx->pitr = NULL;
609     if (kx->public_key != NULL)
610       return; /* done here */
611 #if DEBUG_CORE
612     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
613                 "Failed to obtain public key for peer `%4s', delaying processing of SET_KEY\n",
614                 GNUNET_i2s (&kx->peer));
615 #endif
616     GNUNET_STATISTICS_update (GSC_stats,
617                               gettext_noop
618                               ("# Delayed connecting due to lack of public key"),
619                               1, GNUNET_NO);
620     kx->retry_set_key_task =
621       GNUNET_SCHEDULER_add_delayed (kx->set_key_retry_frequency,
622                                     &set_key_retry_task, kx);
623     return;
624   }
625   if (kx->public_key != NULL)
626   {
627     /* already have public key, why are we here? */
628     GNUNET_break (0);
629     return;
630   }
631   GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == kx->retry_set_key_task);
632   kx->public_key =
633       GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded));
634   if (GNUNET_OK != GNUNET_HELLO_get_key (hello, kx->public_key))
635   {
636     GNUNET_break (0);
637     GNUNET_free (kx->public_key);
638     kx->public_key = NULL;
639     return;
640   }
641   send_key (kx);
642   if (NULL != kx->skm_received)
643   {
644     skm = kx->skm_received;
645     kx->skm_received = NULL;
646     GSC_KX_handle_set_key (kx, &skm->header);
647     GNUNET_free (skm);
648   }
649 }
650
651
652 /**
653  * Start the key exchange with the given peer.
654  *
655  * @param pid identity of the peer to do a key exchange with
656  * @return key exchange information context
657  */
658 struct GSC_KeyExchangeInfo *
659 GSC_KX_start (const struct GNUNET_PeerIdentity *pid)
660 {
661   struct GSC_KeyExchangeInfo *kx;
662
663 #if DEBUG_CORE
664   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
665               "Initiating key exchange with `%s'\n",
666               GNUNET_i2s (pid));
667 #endif
668   kx = GNUNET_malloc (sizeof (struct GSC_KeyExchangeInfo));
669   kx->peer = *pid;
670   kx->set_key_retry_frequency = INITIAL_SET_KEY_RETRY_FREQUENCY;
671   kx->pitr = GNUNET_PEERINFO_iterate (peerinfo,
672                                       pid,
673                                       GNUNET_TIME_UNIT_FOREVER_REL /* timeout? */,
674                                       &process_hello,
675                                       kx);  
676   return kx;
677 }
678
679
680 /**
681  * Stop key exchange with the given peer.  Clean up key material.
682  *
683  * @param kx key exchange to stop
684  */
685 void
686 GSC_KX_stop (struct GSC_KeyExchangeInfo *kx)
687 {
688   if (kx->pitr != NULL)
689   {
690     GNUNET_PEERINFO_iterate_cancel (kx->pitr);
691     kx->pitr = NULL;
692   }
693   if (kx->retry_set_key_task != GNUNET_SCHEDULER_NO_TASK)
694   {
695     GNUNET_SCHEDULER_cancel (kx->retry_set_key_task);
696     kx->retry_set_key_task = GNUNET_SCHEDULER_NO_TASK;
697   }
698   if (kx->keep_alive_task != GNUNET_SCHEDULER_NO_TASK)
699   {
700     GNUNET_SCHEDULER_cancel (kx->keep_alive_task);
701     kx->keep_alive_task = GNUNET_SCHEDULER_NO_TASK;
702   }
703   GNUNET_free_non_null (kx->skm_received);
704   GNUNET_free_non_null (kx->ping_received);
705   GNUNET_free_non_null (kx->pong_received);
706   GNUNET_free_non_null (kx->emsg_received);
707   GNUNET_free_non_null (kx->public_key);
708   GNUNET_free (kx);
709 }
710
711
712 /**
713  * We received a SET_KEY message.  Validate and update
714  * our key material and status.
715  *
716  * @param kx key exchange status for the corresponding peer
717  * @param msg the set key message we received
718  */
719 void
720 GSC_KX_handle_set_key (struct GSC_KeyExchangeInfo *kx,
721                        const struct GNUNET_MessageHeader *msg)
722 {
723   const struct SetKeyMessage *m;
724   struct GNUNET_TIME_Absolute t;
725   struct GNUNET_CRYPTO_AesSessionKey k;
726   struct PingMessage *ping;
727   struct PongMessage *pong;
728   enum KxStateMachine sender_status;
729   uint16_t size;
730   
731   size = ntohs (msg->size);
732   if (size != sizeof (struct SetKeyMessage))
733     {
734       GNUNET_break_op (0);
735       return;
736     }
737   m = (const struct SetKeyMessage*) msg;
738   GNUNET_STATISTICS_update (GSC_stats, gettext_noop ("# session keys received"),
739                             1, GNUNET_NO);
740
741 #if DEBUG_CORE
742   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
743               "Core service receives `%s' request from `%4s'.\n", "SET_KEY",
744               GNUNET_i2s (&kx->peer));
745 #endif
746   if (kx->public_key == NULL)
747   {
748     GNUNET_free_non_null (kx->skm_received);
749     kx->skm_received = (struct SetKeyMessage*) GNUNET_copy_message (msg);
750     return;
751   }
752   if (0 !=
753       memcmp (&m->target, &GSC_my_identity, sizeof (struct GNUNET_PeerIdentity)))
754   {
755     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
756                 _("`%s' is for `%s', not for me.  Ignoring.\n"),
757                 "SET_KEY", GNUNET_i2s (&m->target));
758     return;
759   }
760   if ((ntohl (m->purpose.size) !=
761        sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) +
762        sizeof (struct GNUNET_TIME_AbsoluteNBO) +
763        sizeof (struct GNUNET_CRYPTO_RsaEncryptedData) +
764        sizeof (struct GNUNET_PeerIdentity)) ||
765       (GNUNET_OK !=
766        GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_SET_KEY, &m->purpose,
767                                  &m->signature, kx->public_key)))
768   {
769     /* invalid signature */
770     GNUNET_break_op (0);
771     return;
772   }
773   t = GNUNET_TIME_absolute_ntoh (m->creation_time);
774   if (((kx->status == KX_STATE_KEY_RECEIVED) ||
775        (kx->status == KX_STATE_UP)) &&
776       (t.abs_value < kx->decrypt_key_created.abs_value))
777   {
778     /* this could rarely happen due to massive re-ordering of
779      * messages on the network level, but is most likely either
780      * a bug or some adversary messing with us.  Report. */
781     GNUNET_break_op (0);
782     return;
783   }
784   if ((GNUNET_CRYPTO_rsa_decrypt
785        (my_private_key, &m->encrypted_key, &k,
786         sizeof (struct GNUNET_CRYPTO_AesSessionKey)) !=
787        sizeof (struct GNUNET_CRYPTO_AesSessionKey)) ||
788       (GNUNET_OK != GNUNET_CRYPTO_aes_check_session_key (&k)))
789   {
790     /* failed to decrypt !? */
791     GNUNET_break_op (0);
792     return;
793   }
794   GNUNET_STATISTICS_update (GSC_stats,
795                             gettext_noop ("# SET_KEY messages decrypted"), 1,
796                             GNUNET_NO);
797 #if DEBUG_CORE
798   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
799               "Received SET_KEY from `%s'\n",
800               GNUNET_i2s (&kx->peer));
801 #endif
802   kx->decrypt_key = k;
803   if (kx->decrypt_key_created.abs_value != t.abs_value)
804   {
805     /* fresh key, reset sequence numbers */
806     kx->last_sequence_number_received = 0;
807     kx->last_packets_bitmap = 0;
808     kx->decrypt_key_created = t;
809   }
810   sender_status = (enum KxStateMachine) ntohl (m->sender_status);
811
812   switch (kx->status)
813   {
814   case KX_STATE_DOWN:
815     kx->status = KX_STATE_KEY_RECEIVED;
816     /* we're not up, so we are already doing 'send_key' */
817     break;
818   case KX_STATE_KEY_SENT:
819     kx->status = KX_STATE_KEY_RECEIVED;
820     /* we're not up, so we are already doing 'send_key' */
821     break;
822   case KX_STATE_KEY_RECEIVED:
823     /* we're not up, so we are already doing 'send_key' */
824     break;
825   case KX_STATE_UP:
826     if ( (sender_status == KX_STATE_DOWN) ||
827          (sender_status == KX_STATE_KEY_SENT) )
828       send_key (kx); /* we are up, but other peer is not! */
829     break;
830   default:
831     GNUNET_break (0);
832     break;
833   }
834   if (kx->ping_received != NULL)
835   {
836     ping = kx->ping_received;
837     kx->ping_received = NULL;
838     GSC_KX_handle_ping (kx, &ping->header);
839     GNUNET_free (ping);
840   }
841   if (kx->pong_received != NULL)
842   {
843     pong = kx->pong_received;
844     kx->pong_received = NULL;
845     GSC_KX_handle_pong (kx, &pong->header);
846     GNUNET_free (pong);
847   }
848 }
849
850
851 /**
852  * We received a PING message.  Validate and transmit
853  * a PONG message.
854  *
855  * @param kx key exchange status for the corresponding peer
856  * @param msg the encrypted PING message itself
857  */
858 void
859 GSC_KX_handle_ping (struct GSC_KeyExchangeInfo *kx,
860                     const struct GNUNET_MessageHeader *msg)
861 {
862   const struct PingMessage *m;
863   struct PingMessage t;
864   struct PongMessage tx;
865   struct PongMessage tp;
866   struct GNUNET_CRYPTO_AesInitializationVector iv;
867   uint16_t msize;
868
869   msize = ntohs (msg->size);
870   if (msize != sizeof (struct PingMessage))
871     {
872       GNUNET_break_op (0);
873       return;
874     }
875   GNUNET_STATISTICS_update (GSC_stats, 
876                             gettext_noop ("# PING messages received"),
877                             1, GNUNET_NO);
878   if ( (kx->status != KX_STATE_KEY_RECEIVED) &&
879        (kx->status != KX_STATE_UP) )
880     {
881       /* defer */
882       GNUNET_free_non_null (kx->ping_received);
883       kx->ping_received = (struct PingMessage*) GNUNET_copy_message (msg);
884       return;
885     }
886   m = (const struct PingMessage*) msg;
887 #if DEBUG_CORE
888   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
889               "Core service receives `%s' request from `%4s'.\n", "PING",
890               GNUNET_i2s (&kx->peer));
891 #endif
892   derive_iv (&iv, &kx->decrypt_key, m->iv_seed, &GSC_my_identity);
893   if (GNUNET_OK !=
894       do_decrypt (kx, &iv, &m->target, &t.target,
895                   sizeof (struct PingMessage) - ((void *) &m->target -
896                                                  (void *) m)))
897   {
898     GNUNET_break_op (0);
899     return;
900   }
901   if (0 !=
902       memcmp (&t.target, &GSC_my_identity, sizeof (struct GNUNET_PeerIdentity)))
903   {
904     char sender[9];
905     char peer[9];
906
907     GNUNET_snprintf (sender, sizeof (sender), "%8s", GNUNET_i2s (&kx->peer));
908     GNUNET_snprintf (peer, sizeof (peer), "%8s", GNUNET_i2s (&t.target));
909     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
910                 _("Received PING from `%s' for different identity: I am `%s', PONG identity: `%s'\n"),
911                 sender, GNUNET_i2s (&GSC_my_identity), peer);
912     GNUNET_break_op (0);
913     return;
914   }
915 #if DEBUG_CORE
916   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
917               "Received PING from `%s'\n",
918               GNUNET_i2s (&kx->peer));
919 #endif
920   /* construct PONG */
921   tx.reserved = GNUNET_BANDWIDTH_VALUE_MAX;
922   tx.challenge = t.challenge;
923   tx.target = t.target;
924   tp.header.type = htons (GNUNET_MESSAGE_TYPE_CORE_PONG);
925   tp.header.size = htons (sizeof (struct PongMessage));
926   tp.iv_seed =
927       GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX);
928   derive_pong_iv (&iv, &kx->encrypt_key, tp.iv_seed, t.challenge, &kx->peer);
929   do_encrypt (kx, &iv, &tx.challenge, &tp.challenge,
930               sizeof (struct PongMessage) - ((void *) &tp.challenge -
931                                              (void *) &tp));
932   GNUNET_STATISTICS_update (GSC_stats, 
933                             gettext_noop ("# PONG messages created"), 1,
934                             GNUNET_NO);
935   GSC_NEIGHBOURS_transmit (&kx->peer,
936                            &tp.header,
937                            GNUNET_TIME_UNIT_FOREVER_REL /* FIXME: timeout */);
938 }
939
940
941 /**
942  * Create a fresh SET KEY message for transmission to the other peer.
943  * Also creates a new key.
944  *
945  * @param kx key exchange context to create SET KEY message for
946  */
947 static void
948 setup_fresh_setkey (struct GSC_KeyExchangeInfo *kx)
949 {
950   struct SetKeyMessage *skm;
951
952   GNUNET_CRYPTO_aes_create_session_key (&kx->encrypt_key);
953   kx->encrypt_key_created = GNUNET_TIME_absolute_get ();
954   skm = &kx->skm;
955   skm->header.size = htons (sizeof (struct SetKeyMessage));
956   skm->header.type = htons (GNUNET_MESSAGE_TYPE_CORE_SET_KEY);
957   skm->purpose.size =
958     htonl (sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) +
959            sizeof (struct GNUNET_TIME_AbsoluteNBO) +
960            sizeof (struct GNUNET_CRYPTO_RsaEncryptedData) +
961            sizeof (struct GNUNET_PeerIdentity));
962   skm->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_SET_KEY);
963   skm->creation_time = GNUNET_TIME_absolute_hton (kx->encrypt_key_created);
964   skm->target = kx->peer;
965   GNUNET_assert (GNUNET_OK ==
966                  GNUNET_CRYPTO_rsa_encrypt (&kx->encrypt_key,
967                                             sizeof (struct
968                                                     GNUNET_CRYPTO_AesSessionKey),
969                                             kx->public_key, &skm->encrypted_key));
970   GNUNET_assert (GNUNET_OK ==
971                  GNUNET_CRYPTO_rsa_sign (my_private_key, &skm->purpose,
972                                          &skm->signature));
973 }
974
975
976 /**
977  * Create a fresh PING message for transmission to the other peer.
978  *
979  * @param kx key exchange context to create PING for
980  */
981 static void
982 setup_fresh_ping (struct GSC_KeyExchangeInfo *kx)
983 {
984   struct PingMessage pp;
985   struct PingMessage *pm;
986   struct GNUNET_CRYPTO_AesInitializationVector iv;
987
988   pm = &kx->ping;
989   pm->header.size = htons (sizeof (struct PingMessage));
990   pm->header.type = htons (GNUNET_MESSAGE_TYPE_CORE_PING);
991   pm->iv_seed =
992     GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX);
993   derive_iv (&iv, &kx->encrypt_key, pm->iv_seed, &kx->peer);
994   pp.challenge = kx->ping_challenge;
995   pp.target = kx->peer;
996   do_encrypt (kx, &iv, &pp.target, &pm->target,
997               sizeof (struct PingMessage) - ((void *) &pm->target -
998                                              (void *) pm));
999 }
1000
1001
1002 /**
1003  * Task triggered when a neighbour entry is about to time out
1004  * (and we should prevent this by sending a PING).
1005  *
1006  * @param cls the 'struct GSC_KeyExchangeInfo'
1007  * @param tc scheduler context (not used)
1008  */
1009 static void
1010 send_keep_alive (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1011 {
1012   struct GSC_KeyExchangeInfo *kx = cls;
1013   struct GNUNET_TIME_Relative retry;
1014   struct GNUNET_TIME_Relative left;
1015
1016   kx->keep_alive_task = GNUNET_SCHEDULER_NO_TASK;
1017   left = GNUNET_TIME_absolute_get_remaining (kx->timeout);
1018   if (left.rel_value == 0)
1019   {    
1020     GSC_SESSIONS_end (&kx->peer);
1021     kx->status = KX_STATE_DOWN;
1022     return;
1023   }
1024 #if DEBUG_CORE
1025   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1026               "Sending KEEPALIVE to `%s'\n",
1027               GNUNET_i2s (&kx->peer));
1028 #endif
1029   setup_fresh_ping (kx);
1030   GSC_NEIGHBOURS_transmit (&kx->peer,
1031                            &kx->ping.header,
1032                            kx->set_key_retry_frequency);
1033   retry =
1034       GNUNET_TIME_relative_max (GNUNET_TIME_relative_divide (left, 2),
1035                                 MIN_PING_FREQUENCY);
1036   kx->keep_alive_task =
1037     GNUNET_SCHEDULER_add_delayed (retry, &send_keep_alive, kx);
1038 }
1039
1040
1041 /**
1042  * We've seen a valid message from the other peer.
1043  * Update the time when the session would time out
1044  * and delay sending our keep alive message further.
1045  *
1046  * @param kx key exchange where we saw activity
1047  */
1048 static void
1049 update_timeout (struct GSC_KeyExchangeInfo *kx)
1050 {
1051   kx->timeout = GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
1052   if (kx->keep_alive_task != GNUNET_SCHEDULER_NO_TASK)
1053     GNUNET_SCHEDULER_cancel (kx->keep_alive_task);
1054   kx->keep_alive_task =
1055     GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_divide
1056                                   (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
1057                                    2), &send_keep_alive, kx);
1058 }
1059
1060
1061 /**
1062  * We received a PONG message.  Validate and update our status.
1063  *
1064  * @param kx key exchange context for the the PONG
1065  * @param m the encrypted PONG message itself
1066  */
1067 void
1068 GSC_KX_handle_pong (struct GSC_KeyExchangeInfo *kx, const struct GNUNET_MessageHeader *msg)
1069 {
1070   const struct PongMessage *m;
1071   struct PongMessage t;
1072   struct EncryptedMessage *emsg;
1073   struct GNUNET_CRYPTO_AesInitializationVector iv;
1074   uint16_t msize;
1075
1076   msize = ntohs (msg->size);
1077   if (msize != sizeof (struct PongMessage))
1078   {
1079     GNUNET_break_op (0);
1080     return;
1081   }
1082   GNUNET_STATISTICS_update (GSC_stats, gettext_noop ("# PONG messages received"),
1083                             1, GNUNET_NO);
1084   if ( (kx->status != KX_STATE_KEY_RECEIVED) &&
1085        (kx->status != KX_STATE_UP) )
1086   {
1087     if (kx->status == KX_STATE_KEY_SENT)
1088     {
1089       GNUNET_free_non_null (kx->pong_received);
1090       kx->pong_received = (struct PongMessage*) GNUNET_copy_message (msg);
1091     }
1092     return;
1093   }
1094   m = (const struct PongMessage*) msg;
1095 #if DEBUG_HANDSHAKE
1096   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1097               "Core service receives `%s' response from `%4s'.\n", "PONG",
1098               GNUNET_i2s (&kx->peer));
1099 #endif
1100   /* mark as garbage, just to be sure */
1101   memset (&t, 255, sizeof (t));
1102   derive_pong_iv (&iv, &kx->decrypt_key, m->iv_seed, kx->ping_challenge,
1103                   &GSC_my_identity);
1104   if (GNUNET_OK !=
1105       do_decrypt (kx, &iv, &m->challenge, &t.challenge,
1106                   sizeof (struct PongMessage) - ((void *) &m->challenge -
1107                                                  (void *) m)))
1108   {
1109     GNUNET_break_op (0);
1110     return;
1111   }
1112   GNUNET_STATISTICS_update (GSC_stats, gettext_noop ("# PONG messages decrypted"),
1113                             1, GNUNET_NO);
1114   if ((0 != memcmp (&t.target, &kx->peer, sizeof (struct GNUNET_PeerIdentity)))
1115       || (kx->ping_challenge != t.challenge))
1116   {
1117     /* PONG malformed */
1118 #if DEBUG_CORE
1119     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1120                 "Received malformed `%s' wanted sender `%4s' with challenge %u\n",
1121                 "PONG", GNUNET_i2s (&kx->peer),
1122                 (unsigned int) kx->ping_challenge);
1123     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1124                 "Received malformed `%s' received from `%4s' with challenge %u\n",
1125                 "PONG", GNUNET_i2s (&t.target), (unsigned int) t.challenge);
1126 #endif
1127     return;
1128   }
1129 #if DEBUG_CORE
1130   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1131               "Received PONG from `%s'\n",
1132               GNUNET_i2s (&kx->peer));
1133 #endif
1134   switch (kx->status)
1135   {
1136   case KX_STATE_DOWN:
1137     GNUNET_break (0);           /* should be impossible */
1138     return;
1139   case KX_STATE_KEY_SENT:
1140     GNUNET_break (0);           /* should be impossible */
1141     return;
1142   case KX_STATE_KEY_RECEIVED:
1143     GNUNET_STATISTICS_update (GSC_stats,
1144                               gettext_noop
1145                               ("# Session keys confirmed via PONG"), 1,
1146                               GNUNET_NO);
1147     kx->status = KX_STATE_UP;
1148     GSC_SESSIONS_create (&kx->peer, kx);
1149     GNUNET_assert (kx->retry_set_key_task != GNUNET_SCHEDULER_NO_TASK);
1150     GNUNET_SCHEDULER_cancel (kx->retry_set_key_task);
1151     kx->retry_set_key_task = GNUNET_SCHEDULER_NO_TASK;
1152     GNUNET_assert (kx->keep_alive_task == GNUNET_SCHEDULER_NO_TASK);
1153     if (kx->emsg_received != NULL)
1154     {
1155       emsg = kx->emsg_received;
1156       kx->emsg_received = NULL;
1157       GSC_KX_handle_encrypted_message (kx, &emsg->header, NULL, 0 /* FIXME: ATSI */);
1158       GNUNET_free (emsg);
1159     }
1160     update_timeout (kx);
1161     break;
1162   case KX_STATE_UP:
1163     update_timeout (kx);
1164     break;
1165   default:
1166     GNUNET_break (0);
1167     break;
1168   }
1169 }
1170
1171
1172 /**
1173  * Send our key (and encrypted PING) to the other peer.
1174  *
1175  * @param kx key exchange context
1176  */
1177 static void
1178 send_key (struct GSC_KeyExchangeInfo *kx)
1179 {
1180   GNUNET_assert (kx->retry_set_key_task == GNUNET_SCHEDULER_NO_TASK);
1181   if (KX_STATE_UP == kx->status) 
1182     return; /* nothing to do */
1183   if (kx->public_key == NULL)
1184   {
1185     /* lookup public key, then try again */
1186 #if DEBUG_CORE
1187     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1188                 "Trying to obtain public key for `%s'\n",
1189                 GNUNET_i2s (&kx->peer));
1190 #endif
1191     kx->pitr =
1192       GNUNET_PEERINFO_iterate (peerinfo, &kx->peer,
1193                                GNUNET_TIME_UNIT_FOREVER_REL /* timeout? */,
1194                                &process_hello, kx);
1195     return;
1196   }
1197
1198   /* update status */
1199   switch (kx->status)
1200   {
1201   case KX_STATE_DOWN:
1202     kx->status = KX_STATE_KEY_SENT;    
1203     /* setup SET KEY message */
1204     setup_fresh_setkey (kx);
1205     setup_fresh_ping (kx);
1206     GNUNET_STATISTICS_update (GSC_stats,
1207                               gettext_noop
1208                               ("# SET_KEY and PING messages created"), 1,
1209                               GNUNET_NO);
1210     break;
1211   case KX_STATE_KEY_SENT:
1212     break;
1213   case KX_STATE_KEY_RECEIVED:
1214     break;
1215   case KX_STATE_UP:
1216     GNUNET_break (0);
1217     return;
1218   default:
1219     GNUNET_break (0);
1220     return;
1221   }
1222
1223   /* always update sender status in SET KEY message */
1224   kx->skm.sender_status = htonl ((int32_t) kx->status);
1225 #if DEBUG_CORE
1226   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1227               "Sending SET_KEY and PING to `%s'\n",
1228               GNUNET_i2s (&kx->peer));
1229 #endif
1230   GSC_NEIGHBOURS_transmit (&kx->peer,
1231                            &kx->skm.header,
1232                            kx->set_key_retry_frequency);
1233   GSC_NEIGHBOURS_transmit (&kx->peer,
1234                            &kx->ping.header,
1235                            kx->set_key_retry_frequency);
1236   kx->retry_set_key_task =
1237     GNUNET_SCHEDULER_add_delayed (kx->set_key_retry_frequency,
1238                                   &set_key_retry_task, kx);
1239 }
1240
1241
1242 /**
1243  * Encrypt and transmit a message with the given payload.
1244  *
1245  * @param kx key exchange context
1246  * @param payload payload of the message
1247  * @param payload_size number of bytes in 'payload'
1248  */
1249 void
1250 GSC_KX_encrypt_and_transmit (struct GSC_KeyExchangeInfo *kx,
1251                              const void *payload,
1252                              size_t payload_size)
1253 {
1254   size_t used = payload_size + sizeof (struct EncryptedMessage);
1255   char pbuf[used]; /* plaintext */
1256   char cbuf[used]; /* ciphertext */
1257   struct EncryptedMessage *em;  /* encrypted message */
1258   struct EncryptedMessage *ph;  /* plaintext header */
1259   struct GNUNET_CRYPTO_AesInitializationVector iv;
1260   struct GNUNET_CRYPTO_AuthKey auth_key;
1261
1262   ph = (struct EncryptedMessage*) pbuf;
1263   ph->iv_seed =
1264       htonl (GNUNET_CRYPTO_random_u32
1265              (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX));
1266   ph->sequence_number = htonl (++kx->last_sequence_number_sent);
1267   ph->reserved = GNUNET_BANDWIDTH_VALUE_MAX;
1268   ph->timestamp = GNUNET_TIME_absolute_hton (GNUNET_TIME_absolute_get ());
1269   memcpy (&ph[1], payload, payload_size);
1270
1271   em = (struct EncryptedMessage *) cbuf;
1272   em->header.size = htons (used);
1273   em->header.type = htons (GNUNET_MESSAGE_TYPE_CORE_ENCRYPTED_MESSAGE);
1274   em->iv_seed = ph->iv_seed;
1275   derive_iv (&iv, &kx->encrypt_key, ph->iv_seed, &kx->peer);
1276   GNUNET_assert (GNUNET_OK ==
1277                  do_encrypt (kx, &iv, &ph->sequence_number, &em->sequence_number,
1278                              used - ENCRYPTED_HEADER_SIZE));
1279 #if DEBUG_CORE
1280   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1281               "Encrypted %u bytes for %s\n",
1282               used - ENCRYPTED_HEADER_SIZE,
1283               GNUNET_i2s (&kx->peer));
1284 #endif
1285   derive_auth_key (&auth_key, &kx->encrypt_key, ph->iv_seed,
1286                    kx->encrypt_key_created);
1287   GNUNET_CRYPTO_hmac (&auth_key, &em->sequence_number,
1288                       used - ENCRYPTED_HEADER_SIZE, &em->hmac);
1289   GSC_NEIGHBOURS_transmit (&kx->peer,
1290                            &em->header,
1291                            GNUNET_TIME_UNIT_FOREVER_REL);
1292 }                  
1293
1294
1295 /**
1296  * Closure for 'deliver_message'
1297  */
1298 struct DeliverMessageContext
1299 {
1300   
1301   /**
1302    * Performance information for the connection.
1303    */
1304   const struct GNUNET_ATS_Information *atsi;
1305
1306   /**
1307    * Sender of the message.
1308    */
1309   const struct GNUNET_PeerIdentity *peer;
1310
1311   /**
1312    * Number of entries in 'atsi' array.
1313    */
1314   uint32_t atsi_count;
1315 };
1316
1317   
1318 /**
1319  * We received an encrypted message.  Decrypt, validate and
1320  * pass on to the appropriate clients.
1321  *
1322  * @param kx key exchange context for encrypting the message
1323  * @param m encrypted message
1324  * @param atsi performance data
1325  * @param atsi_count number of entries in ats (excluding 0-termination)
1326  */
1327 void
1328 GSC_KX_handle_encrypted_message (struct GSC_KeyExchangeInfo *kx, 
1329                                  const struct GNUNET_MessageHeader *msg,
1330                                  const struct GNUNET_ATS_Information *atsi,
1331                                  uint32_t atsi_count)
1332 {
1333   const struct EncryptedMessage *m;
1334   struct EncryptedMessage *pt;  /* plaintext */
1335   GNUNET_HashCode ph;
1336   uint32_t snum;
1337   struct GNUNET_TIME_Absolute t;
1338   struct GNUNET_CRYPTO_AesInitializationVector iv;
1339   struct GNUNET_CRYPTO_AuthKey auth_key;
1340   struct DeliverMessageContext dmc;
1341   uint16_t size = ntohs (msg->size);
1342   char buf[size];
1343
1344   if (size <
1345       sizeof (struct EncryptedMessage) + sizeof (struct GNUNET_MessageHeader))
1346   {
1347     GNUNET_break_op (0);
1348     return;
1349   }
1350   m = (const struct EncryptedMessage*) msg;
1351   if ( (kx->status != KX_STATE_KEY_RECEIVED) &&
1352        (kx->status != KX_STATE_UP) )
1353   {
1354     GNUNET_STATISTICS_update (GSC_stats,
1355                               gettext_noop
1356                               ("# failed to decrypt message (no session key)"),
1357                               1, GNUNET_NO);
1358     return;
1359   }
1360   if (kx->status == KX_STATE_KEY_RECEIVED)
1361   {
1362     /* defer */
1363     GNUNET_free_non_null (kx->ping_received);
1364     kx->emsg_received = (struct EncryptedMessage*) GNUNET_copy_message (msg);
1365     return;
1366   }
1367   /* validate hash */
1368   derive_auth_key (&auth_key, &kx->decrypt_key, m->iv_seed,
1369                    kx->decrypt_key_created);
1370   GNUNET_CRYPTO_hmac (&auth_key, &m->sequence_number,
1371                       size - ENCRYPTED_HEADER_SIZE, &ph);
1372   if (0 != memcmp (&ph, &m->hmac, sizeof (GNUNET_HashCode)))
1373   {
1374     /* checksum failed */
1375     GNUNET_break_op (0);
1376     return;
1377   }
1378   derive_iv (&iv, &kx->decrypt_key, m->iv_seed, &GSC_my_identity);
1379   /* decrypt */
1380   if (GNUNET_OK !=
1381       do_decrypt (kx, &iv, &m->sequence_number, &buf[ENCRYPTED_HEADER_SIZE],
1382                   size - ENCRYPTED_HEADER_SIZE))
1383     return;
1384 #if DEBUG_CORE
1385   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1386               "Decrypted %u bytes from %s\n",
1387               size - ENCRYPTED_HEADER_SIZE,
1388               GNUNET_i2s (&kx->peer));
1389 #endif
1390   pt = (struct EncryptedMessage *) buf;
1391
1392   /* validate sequence number */
1393   snum = ntohl (pt->sequence_number);
1394   if (kx->last_sequence_number_received == snum)
1395   {
1396     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1397                 "Received duplicate message, ignoring.\n");
1398     /* duplicate, ignore */
1399     GNUNET_STATISTICS_update (GSC_stats,
1400                               gettext_noop ("# bytes dropped (duplicates)"),
1401                               size, GNUNET_NO);
1402     return;
1403   }
1404   if ((kx->last_sequence_number_received > snum) &&
1405       (kx->last_sequence_number_received - snum > 32))
1406   {
1407     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1408                 "Received ancient out of sequence message, ignoring.\n");
1409     /* ancient out of sequence, ignore */
1410     GNUNET_STATISTICS_update (GSC_stats,
1411                               gettext_noop
1412                               ("# bytes dropped (out of sequence)"), size,
1413                               GNUNET_NO);
1414     return;
1415   }
1416   if (kx->last_sequence_number_received > snum)
1417   {
1418     unsigned int rotbit = 1 << (kx->last_sequence_number_received - snum - 1);
1419
1420     if ((kx->last_packets_bitmap & rotbit) != 0)
1421     {
1422       GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1423                   "Received duplicate message, ignoring.\n");
1424       GNUNET_STATISTICS_update (GSC_stats,
1425                                 gettext_noop ("# bytes dropped (duplicates)"),
1426                                 size, GNUNET_NO);
1427       /* duplicate, ignore */
1428       return;
1429     }
1430     kx->last_packets_bitmap |= rotbit;
1431   }
1432   if (kx->last_sequence_number_received < snum)
1433   {
1434     unsigned int shift = (snum - kx->last_sequence_number_received);
1435
1436     if (shift >= 8 * sizeof (kx->last_packets_bitmap))
1437       kx->last_packets_bitmap = 0;
1438     else
1439       kx->last_packets_bitmap <<= shift;
1440     kx->last_sequence_number_received = snum;
1441   }
1442
1443   /* check timestamp */
1444   t = GNUNET_TIME_absolute_ntoh (pt->timestamp);
1445   if (GNUNET_TIME_absolute_get_duration (t).rel_value >
1446       MAX_MESSAGE_AGE.rel_value)
1447   {
1448     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1449                 _("Message received far too old (%llu ms). Content ignored.\n"),
1450                 GNUNET_TIME_absolute_get_duration (t).rel_value);
1451     GNUNET_STATISTICS_update (GSC_stats,
1452                               gettext_noop
1453                               ("# bytes dropped (ancient message)"), size,
1454                               GNUNET_NO);
1455     return;
1456   }
1457
1458   /* process decrypted message(s) */
1459   update_timeout (kx);
1460   GNUNET_STATISTICS_update (GSC_stats,
1461                             gettext_noop ("# bytes of payload decrypted"),
1462                             size - sizeof (struct EncryptedMessage), GNUNET_NO);
1463   dmc.atsi = atsi;
1464   dmc.atsi_count = atsi_count;
1465   dmc.peer = &kx->peer;
1466   if (GNUNET_OK !=
1467       GNUNET_SERVER_mst_receive (mst, &dmc, &buf[sizeof (struct EncryptedMessage)],
1468                                  size - sizeof (struct EncryptedMessage),
1469                                  GNUNET_YES, GNUNET_NO))
1470     GNUNET_break_op (0);
1471 }
1472
1473
1474 /**
1475  * Deliver P2P message to interested clients.
1476  * Invokes send twice, once for clients that want the full message, and once
1477  * for clients that only want the header 
1478  *
1479  * @param cls always NULL
1480  * @param client who sent us the message (struct GSC_KeyExchangeInfo)
1481  * @param m the message
1482  */
1483 static void
1484 deliver_message (void *cls, void *client, const struct GNUNET_MessageHeader *m)
1485 {
1486   struct DeliverMessageContext *dmc = client;
1487
1488   switch (ntohs (m->type))
1489   {
1490   case GNUNET_MESSAGE_TYPE_CORE_BINARY_TYPE_MAP:
1491   case GNUNET_MESSAGE_TYPE_CORE_COMPRESSED_TYPE_MAP:
1492     GSC_SESSIONS_set_typemap (dmc->peer,
1493                               m); 
1494     return;
1495   default:
1496     GSC_CLIENTS_deliver_message (dmc->peer,
1497                                  dmc->atsi, dmc->atsi_count,
1498                                  m,
1499                                  ntohs (m->size),
1500                                  GNUNET_CORE_OPTION_SEND_FULL_INBOUND);
1501     GSC_CLIENTS_deliver_message (dmc->peer,
1502                                  dmc->atsi, dmc->atsi_count,
1503                                  m,
1504                                  sizeof (struct GNUNET_MessageHeader),
1505                                  GNUNET_CORE_OPTION_SEND_HDR_INBOUND);
1506   }
1507 }
1508
1509
1510 /**
1511  * Initialize KX subsystem.
1512  *
1513  * @return GNUNET_OK on success, GNUNET_SYSERR on failure
1514  */
1515 int 
1516 GSC_KX_init ()
1517 {
1518   char *keyfile;
1519
1520   if (GNUNET_OK !=
1521       GNUNET_CONFIGURATION_get_value_filename (GSC_cfg, "GNUNETD", "HOSTKEY",
1522                                                &keyfile))
1523   {
1524     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1525                 _("Core service is lacking HOSTKEY configuration setting.  Exiting.\n"));
1526     return GNUNET_SYSERR;
1527   }
1528   my_private_key = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile);
1529   GNUNET_free (keyfile);
1530   if (my_private_key == NULL)
1531   {
1532     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1533                 _("Core service could not access hostkey.  Exiting.\n"));
1534     return GNUNET_SYSERR;
1535   }
1536   GNUNET_CRYPTO_rsa_key_get_public (my_private_key, &my_public_key);
1537   GNUNET_CRYPTO_hash (&my_public_key, sizeof (my_public_key),
1538                       &GSC_my_identity.hashPubKey);
1539   peerinfo = GNUNET_PEERINFO_connect (GSC_cfg);
1540   if (NULL == peerinfo)
1541   {
1542     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1543                 _("Could not access PEERINFO service.  Exiting.\n"));
1544     GNUNET_CRYPTO_rsa_key_free (my_private_key);
1545     my_private_key = NULL;
1546     return GNUNET_SYSERR;
1547   }
1548   mst = GNUNET_SERVER_mst_create (&deliver_message, NULL);
1549   return GNUNET_OK;
1550 }
1551
1552
1553 /**
1554  * Shutdown KX subsystem.
1555  */
1556 void 
1557 GSC_KX_done ()
1558 {
1559   if (my_private_key != NULL)
1560   {
1561     GNUNET_CRYPTO_rsa_key_free (my_private_key);
1562     my_private_key = NULL;
1563   }
1564   if (peerinfo != NULL)
1565   {
1566     GNUNET_PEERINFO_disconnect (peerinfo);
1567     peerinfo = NULL;
1568   }
1569   if (mst != NULL)
1570   {
1571     GNUNET_SERVER_mst_destroy (mst);
1572     mst = NULL;
1573   }
1574 }
1575
1576 /* end of gnunet-service-core_kx.c */