updates.
[silc.git] / lib / silcske / silcske.c
index 2838a68589dfb543745f56e9edc389853b1793d2..e69fc0f9df52914c69fc0bff33ff2023944d40ed 100644 (file)
@@ -2,7 +2,7 @@
 
   silcske.c
 
-  Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
+  Author: Pekka Riikonen <priikone@silcnet.org>
 
   Copyright (C) 2000 - 2001 Pekka Riikonen
 
@@ -23,7 +23,7 @@
 #include "silcske.h"
 #include "groups_internal.h"
 
-/* Structure to hold all SKE callbacks-> */
+/* Structure to hold all SKE callbacks. */
 struct SilcSKECallbacksStruct {
   SilcSKESendPacketCb send_packet;
   SilcSKECb payload_receive;
@@ -216,6 +216,7 @@ SilcSKEStatus silc_ske_initiator_phase_1(SilcSKE ske,
   status = silc_ske_payload_start_decode(ske, start_payload, &payload);
   if (status != SILC_SKE_STATUS_OK) {
     ske->status = status;
+    silc_ske_payload_start_free(ske->start_payload);
     return status;
   }
 
@@ -418,18 +419,17 @@ static void silc_ske_initiator_finish_final(SilcSKE ske,
   if (ske->status == SILC_SKE_STATUS_FREED) {
     silc_ske_free(ske);
     return;
-  } else {
-    ske->users--;
   }
 
-  payload = ske->ke2_payload;
-
   /* If the caller returns PENDING status SKE library will assume that
      the caller will re-call this callback when it is not anymore in
      PENDING status. */
   if (status == SILC_SKE_STATUS_PENDING)
     return;
 
+  ske->users--;
+  payload = ske->ke2_payload;
+
   /* If the status is an error then the public key that was verified
      by the caller is not authentic. */
   if (status != SILC_SKE_STATUS_OK) {
@@ -580,6 +580,7 @@ SilcSKEStatus silc_ske_initiator_finish(SilcSKE ske,
   }
 
   /* Continue to final state */
+  ske->users++;
   silc_ske_initiator_finish_final(ske, SILC_SKE_STATUS_OK, NULL);
 
   return SILC_SKE_STATUS_OK;
@@ -762,18 +763,17 @@ static void silc_ske_responder_phase2_final(SilcSKE ske,
   if (ske->status == SILC_SKE_STATUS_FREED) {
     silc_ske_free(ske);
     return;
-  } else {
-    ske->users--;
   }
 
-  recv_payload = ske->ke1_payload;
-
   /* If the caller returns PENDING status SKE library will assume that
      the caller will re-call this callback when it is not anymore in
      PENDING status. */
   if (status == SILC_SKE_STATUS_PENDING)
     return;
 
+  ske->users--;
+  recv_payload = ske->ke1_payload;
+
   /* If the status is an error then the public key that was verified
      by the caller is not authentic. */
   if (status != SILC_SKE_STATUS_OK) {
@@ -934,6 +934,7 @@ SilcSKEStatus silc_ske_responder_phase_2(SilcSKE ske,
   }
 
   /* Continue to final state */
+  ske->users++;
   silc_ske_responder_phase2_final(ske, SILC_SKE_STATUS_OK, NULL);
 
   return SILC_SKE_STATUS_OK;
@@ -1715,7 +1716,7 @@ silc_ske_process_key_material_data(unsigned char *data,
                       SILC_STR_END);
     memset(k2, 0, sizeof(k2));
     silc_hash_make(hash, dist->data, dist->len, k2);
-    
+
     /* Take third round */
     dist = silc_buffer_realloc(dist, data_len + hash_len + hash_len);
     silc_buffer_pull_tail(dist, hash_len);
@@ -1731,7 +1732,7 @@ silc_ske_process_key_material_data(unsigned char *data,
     dtmp = silc_calloc((3 * hash_len), sizeof(unsigned char));
     memcpy(dtmp, k1, hash_len);
     memcpy(dtmp + hash_len, k2, hash_len);
-    memcpy(dtmp + hash_len, k3, hash_len);
+    memcpy(dtmp + hash_len + hash_len, k3, hash_len);
 
     key->send_enc_key = silc_calloc(enc_key_len, sizeof(unsigned char));
     memcpy(key->send_enc_key, dtmp, enc_key_len);
@@ -1791,7 +1792,7 @@ silc_ske_process_key_material_data(unsigned char *data,
     dtmp = silc_calloc((3 * hash_len), sizeof(unsigned char));
     memcpy(dtmp, k1, hash_len);
     memcpy(dtmp + hash_len, k2, hash_len);
-    memcpy(dtmp + hash_len, k3, hash_len);
+    memcpy(dtmp + hash_len + hash_len, k3, hash_len);
 
     key->receive_enc_key = silc_calloc(enc_key_len, sizeof(unsigned char));
     memcpy(key->receive_enc_key, dtmp, enc_key_len);