gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r35611 - gnunet/src/cadet


From: gnunet
Subject: [GNUnet-SVN] r35611 - gnunet/src/cadet
Date: Mon, 27 Apr 2015 21:15:00 +0200

Author: bartpolot
Date: 2015-04-27 21:14:59 +0200 (Mon, 27 Apr 2015)
New Revision: 35611

Modified:
   gnunet/src/cadet/gnunet-service-cadet_tunnel.c
Log:
- refactor otr
- use signed axolotl ECDH
- doxygen
- log
- minor fixes

Modified: gnunet/src/cadet/gnunet-service-cadet_tunnel.c
===================================================================
--- gnunet/src/cadet/gnunet-service-cadet_tunnel.c      2015-04-27 19:14:58 UTC 
(rev 35610)
+++ gnunet/src/cadet/gnunet-service-cadet_tunnel.c      2015-04-27 19:14:59 UTC 
(rev 35611)
@@ -132,7 +132,7 @@
    * Task for delayed destruction of the Key eXchange context, to allow delayed
    * messages with the old key to be decrypted successfully.
    */
-  struct GNUNET_SCHEDULER_Task * finish_task;
+  struct GNUNET_SCHEDULER_Task *finish_task;
 };
 
 /**
@@ -416,6 +416,28 @@
 };
 
 
+/**
+ * Cached Axolotl key with signature.
+ */
+struct CadetAxolotlSignedKey
+{
+  /**
+   * Information about what is being signed (@a permanent_key).
+   */
+  struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
+
+  /**
+   * Permanent public ECDH key.
+   */
+  struct GNUNET_CRYPTO_EcdhePublicKey permanent_key;
+
+  /**
+   * An EdDSA signature of the permanent ECDH key with the Peer's ID key.
+   */
+  struct GNUNET_CRYPTO_EddsaSignature signature;
+} GNUNET_PACKED;
+
+
 
/******************************************************************************/
 /*******************************   GLOBALS  
***********************************/
 
/******************************************************************************/
@@ -453,33 +475,41 @@
  */
 static unsigned long long default_ttl;
 
+
 /**
- * Own private key.
+ * Own Peer ID private key.
  */
-const static struct GNUNET_CRYPTO_EddsaPrivateKey *my_private_key;
+const static struct GNUNET_CRYPTO_EddsaPrivateKey *id_key;
 
+/********************************  AXOLOTL 
************************************/
+
+static struct GNUNET_CRYPTO_EcdhePrivateKey *ax_key;
+
 /**
- * Own Axolotl private key (derived from @a my_private_key).
+ * Own Axolotl permanent public key (cache).
  */
-const struct GNUNET_CRYPTO_EcdhePrivateKey *ax_identity;
+static struct CadetAxolotlSignedKey ax_identity;
 
+/********************************    OTR   ***********************************/
+
+
 /**
- * Own OTR ephemeral private key.
+ * Own global OTR ephemeral private key.
  */
-static struct GNUNET_CRYPTO_EcdhePrivateKey *my_ephemeral_key;
+static struct GNUNET_CRYPTO_EcdhePrivateKey *otr_ephemeral_key;
 
 /**
- * Cached message used to perform a key exchange.
+ * Cached message used to perform a OTR key exchange.
  */
-static struct GNUNET_CADET_KX_Ephemeral kx_msg;
+static struct GNUNET_CADET_KX_Ephemeral otr_kx_msg;
 
 /**
- * Task to generate a new ephemeral key.
+ * Task to generate a new OTR ephemeral key.
  */
-static struct GNUNET_SCHEDULER_Task * rekey_task;
+static struct GNUNET_SCHEDULER_Task *rekey_task;
 
 /**
- * Rekey period.
+ * OTR Rekey period.
  */
 static struct GNUNET_TIME_Relative rekey_period;
 
@@ -602,7 +632,7 @@
  *
  * @return Size of the part of the ephemeral key message that must be signed.
  */
-size_t
+static size_t
 ephemeral_purpose_size (void)
 {
   return sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
@@ -614,11 +644,24 @@
 
 
 /**
+ * Ephemeral key message purpose size.
+ *
+ * @return Size of the part of the ephemeral key message that must be signed.
+ */
+static size_t
+ax_purpose_size (void)
+{
+  return sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
+         sizeof (struct GNUNET_CRYPTO_EcdhePublicKey);
+}
+
+
+/**
  * Size of the encrypted part of a ping message.
  *
  * @return Size of the encrypted part of a ping message.
  */
-size_t
+static size_t
 ping_encryption_size (void)
 {
   return sizeof (uint32_t);
@@ -1095,7 +1138,7 @@
                      const struct GNUNET_CRYPTO_EcdhePublicKey *ephemeral_key)
 {
   if (GNUNET_OK !=
-      GNUNET_CRYPTO_ecc_ecdh (my_ephemeral_key,
+      GNUNET_CRYPTO_ecc_ecdh (otr_ephemeral_key,
                               ephemeral_key,
                               key_material))
   {
@@ -1145,7 +1188,7 @@
   derive_symmertic (&t->d_key, GCP_get_id (t->peer), &my_full_id, &km);
   #if DUMP_KEYS_TO_STDERR
   LOG (GNUNET_ERROR_TYPE_INFO, "ME: %s\n",
-       GNUNET_h2s ((struct GNUNET_HashCode *) &kx_msg.ephemeral_key));
+       GNUNET_h2s ((struct GNUNET_HashCode *) &otr_kx_msg.ephemeral_key));
   LOG (GNUNET_ERROR_TYPE_INFO, "PE: %s\n",
        GNUNET_h2s ((struct GNUNET_HashCode *) &t->peers_ephemeral_key));
   LOG (GNUNET_ERROR_TYPE_INFO, "KM: %s\n", GNUNET_h2s (&km));
@@ -1698,14 +1741,14 @@
     return;
   }
 
-  kx_msg.sender_status = htonl (t->estate);
-  kx_msg.iv = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, 
UINT32_MAX);
-  kx_msg.nonce = t->kx_ctx->challenge;
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "  send nonce c %u\n", kx_msg.nonce);
-  t_encrypt (t, &kx_msg.nonce, &kx_msg.nonce,
-             ping_encryption_size(), kx_msg.iv, GNUNET_YES);
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "  send nonce e %u\n", kx_msg.nonce);
-  t->ephm_h = send_kx (t, &kx_msg.header);
+  otr_kx_msg.sender_status = htonl (t->estate);
+  otr_kx_msg.iv = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, 
UINT32_MAX);
+  otr_kx_msg.nonce = t->kx_ctx->challenge;
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "  send nonce c %u\n", otr_kx_msg.nonce);
+  t_encrypt (t, &otr_kx_msg.nonce, &otr_kx_msg.nonce,
+             ping_encryption_size(), otr_kx_msg.iv, GNUNET_YES);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "  send nonce e %u\n", otr_kx_msg.nonce);
+  t->ephm_h = send_kx (t, &otr_kx_msg.header);
 }
 
 
@@ -1866,22 +1909,22 @@
   if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
     return;
 
-  GNUNET_free_non_null (my_ephemeral_key);
-  my_ephemeral_key = GNUNET_CRYPTO_ecdhe_key_create ();
+  GNUNET_free_non_null (otr_ephemeral_key);
+  otr_ephemeral_key = GNUNET_CRYPTO_ecdhe_key_create ();
 
   time = GNUNET_TIME_absolute_get ();
-  kx_msg.creation_time = GNUNET_TIME_absolute_hton (time);
+  otr_kx_msg.creation_time = GNUNET_TIME_absolute_hton (time);
   time = GNUNET_TIME_absolute_add (time, rekey_period);
   time = GNUNET_TIME_absolute_add (time, GNUNET_TIME_UNIT_MINUTES);
-  kx_msg.expiration_time = GNUNET_TIME_absolute_hton (time);
-  GNUNET_CRYPTO_ecdhe_key_get_public (my_ephemeral_key, &kx_msg.ephemeral_key);
+  otr_kx_msg.expiration_time = GNUNET_TIME_absolute_hton (time);
+  GNUNET_CRYPTO_ecdhe_key_get_public (otr_ephemeral_key, 
&otr_kx_msg.ephemeral_key);
   LOG (GNUNET_ERROR_TYPE_INFO, "GLOBAL OTR RE-KEY, NEW EPHM: %s\n",
-       GNUNET_h2s ((struct GNUNET_HashCode *) &kx_msg.ephemeral_key));
+       GNUNET_h2s ((struct GNUNET_HashCode *) &otr_kx_msg.ephemeral_key));
 
   GNUNET_assert (GNUNET_OK ==
-                 GNUNET_CRYPTO_eddsa_sign (my_private_key,
-                                           &kx_msg.purpose,
-                                           &kx_msg.signature));
+                 GNUNET_CRYPTO_eddsa_sign (id_key,
+                                           &otr_kx_msg.purpose,
+                                           &otr_kx_msg.signature));
 
   n = (long) GNUNET_CONTAINER_multipeermap_size (tunnels);
   GNUNET_CONTAINER_multipeermap_iterate (tunnels, &rekey_iterator, (void *) n);
@@ -2329,40 +2372,6 @@
 
 
 /**
- * WARNING! DANGER! Do not use this if you don't know what you are doing!
- * Ask Christian Grothoff, Werner Koch, Dan Bernstein and $GOD!
- *
- * Transform a private EdDSA key (peer's key) into a key usable by DH.
- *
- * @param k Private EdDSA key to transform.
- *
- * @return Private key for EC Diffie-Hellman.
- */
-static const struct GNUNET_CRYPTO_EcdhePrivateKey *
-get_private_ecdhe_from_eddsa (const struct GNUNET_CRYPTO_EddsaPrivateKey *k)
-{
-  return (const struct GNUNET_CRYPTO_EcdhePrivateKey *) k;
-}
-
-
-/**
- * WARNING! DANGER! Do not use this if you don't know what you are doing!
- * Ask Christian Grothoff, Werner Koch, Dan Bernstein and $GOD!
- *
- * Transform a public EdDSA key (peer's key) into a key usable by DH.
- *
- * @param k Public EdDSA key to transform (peer's ID).
- *
- * @return Public key for EC Diffie-Hellman.
- */
-static const struct GNUNET_CRYPTO_EcdhePublicKey *
-get_public_ecdhe_from_id (const struct GNUNET_PeerIdentity *id)
-{
-  return (const struct GNUNET_CRYPTO_EcdhePublicKey *) id;
-}
-
-
-/**
  * Handle Axolotl handshake.
  *
  * @param t Tunnel this message came on.
@@ -2378,7 +2387,7 @@
   const struct GNUNET_CRYPTO_EcdhePrivateKey *priv;
   const char salt[] = "CADET Axolotl salt";
   const struct GNUNET_PeerIdentity *pid;
-  int is_alice;
+  int am_I_alice;
 
   LOG (GNUNET_ERROR_TYPE_INFO, "<=== AX_KX on %s\n", GCT_2s (t));
 
@@ -2390,44 +2399,51 @@
     return;
   }
 
+  if (GNUNET_OK != GCP_check_key (t->peer, &msg->permanent_key,
+                                  &msg->purpose, &msg->signature))
+  {
+    GNUNET_break_op (0);
+    return;
+  }
+
   pid = GCT_get_destination (t);
   if (0 > GNUNET_CRYPTO_cmp_peer_identity (&my_full_id, pid))
-    is_alice = GNUNET_YES;
+    am_I_alice = GNUNET_YES;
   else if (0 < GNUNET_CRYPTO_cmp_peer_identity (&my_full_id, pid))
-    is_alice = GNUNET_NO;
+    am_I_alice = GNUNET_NO;
   else
   {
     GNUNET_break_op (0);
     return;
   }
 
-  LOG (GNUNET_ERROR_TYPE_INFO, " is Alice? %s\n", is_alice ? "YES" : "NO");
+  LOG (GNUNET_ERROR_TYPE_INFO, " is Alice? %s\n", am_I_alice ? "YES" : "NO");
 
   ax = t->ax;
   ax->DHRr = msg->ratchet_key;
 
   /* ECDH A B0 */
-  if (GNUNET_YES == is_alice)
+  if (GNUNET_YES == am_I_alice)
   {
-    priv = get_private_ecdhe_from_eddsa (my_private_key);       /* A */
+    priv = ax_key;                                              /* A */
     pub = &msg->ephemeral_key;                                  /* B0 */
   }
   else
   {
     priv = ax->kx_0;                                            /* B0 */
-    pub = get_public_ecdhe_from_id (pid);                       /* A */
+    pub = &msg->permanent_key;                                  /* A */
   }
   GNUNET_CRYPTO_ecc_ecdh (priv, pub, &key_material[0]);
 
   /* ECDH A0 B */
-  if (GNUNET_YES == is_alice)
+  if (GNUNET_YES == am_I_alice)
   {
     priv = ax->kx_0;                                            /* A0 */
-    pub = get_public_ecdhe_from_id (pid);                       /* B */
+    pub = &msg->permanent_key;                                  /* B */
   }
   else
   {
-    priv = get_private_ecdhe_from_eddsa (my_private_key);       /* B */
+    priv = ax_key;                                              /* B */
     pub = &msg->ephemeral_key;                                  /* A0 */
   }
   GNUNET_CRYPTO_ecc_ecdh (priv, pub, &key_material[1]);
@@ -2449,10 +2465,10 @@
   /* KDF */
   GNUNET_CRYPTO_kdf (keys, sizeof (keys),
                      salt, sizeof (salt),
-                     key_material, sizeof (key_material), NULL);
+                     &key_material, sizeof (key_material), NULL);
 
   ax->RK = keys[0];
-  if (GNUNET_YES == is_alice)
+  if (GNUNET_YES == am_I_alice)
   {
     ax->HKr = keys[1];
     ax->NHKs = keys[2];
@@ -2632,7 +2648,6 @@
   }
 }
 
-
 /**
  * Initialize the tunnel subsystem.
  *
@@ -2668,15 +2683,24 @@
     rekey_period = GNUNET_TIME_UNIT_DAYS;
   }
 
-  my_private_key = key;
+  id_key = key;
 
-  kx_msg.header.size = htons (sizeof (kx_msg));
-  kx_msg.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_KX_EPHEMERAL);
-  kx_msg.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CADET_KX);
-  kx_msg.purpose.size = htonl (ephemeral_purpose_size ());
-  kx_msg.origin_identity = my_full_id;
+  otr_kx_msg.header.size = htons (sizeof (otr_kx_msg));
+  otr_kx_msg.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_KX_EPHEMERAL);
+  otr_kx_msg.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CADET_KX);
+  otr_kx_msg.purpose.size = htonl (ephemeral_purpose_size ());
+  otr_kx_msg.origin_identity = my_full_id;
   rekey_task = GNUNET_SCHEDULER_add_now (&global_otr_rekey, NULL);
 
+  ax_key = GNUNET_CRYPTO_ecdhe_key_create ();
+  GNUNET_CRYPTO_ecdhe_key_get_public (ax_key, &ax_identity.permanent_key);
+  ax_identity.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CADET_AXKX);
+  ax_identity.purpose.size = htonl (ax_purpose_size ());
+  GNUNET_assert (GNUNET_OK ==
+                 GNUNET_CRYPTO_eddsa_sign (id_key,
+                                           &ax_identity.purpose,
+                                           &ax_identity.signature));
+
   tunnels = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_YES);
 }
 
@@ -2694,6 +2718,7 @@
   }
   GNUNET_CONTAINER_multipeermap_iterate (tunnels, &destroy_iterator, NULL);
   GNUNET_CONTAINER_multipeermap_destroy (tunnels);
+  GNUNET_free (ax_key);
 }
 
 
@@ -3660,6 +3685,9 @@
 
   msg.header.size = htons (sizeof (msg));
   msg.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_AX_KX);
+  msg.permanent_key = ax_identity.permanent_key;
+  msg.purpose = ax_identity.purpose;
+  msg.signature = ax_identity.signature;
   GNUNET_CRYPTO_ecdhe_key_get_public (t->ax->kx_0, &msg.ephemeral_key);
   GNUNET_CRYPTO_ecdhe_key_get_public (t->ax->DHRs, &msg.ratchet_key);
 
@@ -3822,7 +3850,7 @@
         t->kx_ctx, t->rekey_task, t->kx_ctx ? t->kx_ctx->finish_task : 0);
 #if DUMP_KEYS_TO_STDERR
   LOG2 (level, "TTT  my EPHM\t %s\n",
-        GNUNET_h2s ((struct GNUNET_HashCode *) &kx_msg.ephemeral_key));
+        GNUNET_h2s ((struct GNUNET_HashCode *) &otr_kx_msg.ephemeral_key));
   LOG2 (level, "TTT  peers EPHM:\t %s\n",
         GNUNET_h2s ((struct GNUNET_HashCode *) &t->peers_ephemeral_key));
   LOG2 (level, "TTT  ENC key:\t %s\n",




reply via email to

[Prev in Thread] Current Thread [Next in Thread]