updates.
authorPekka Riikonen <priikone@silcnet.org>
Sat, 1 Dec 2001 14:32:47 +0000 (14:32 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sat, 1 Dec 2001 14:32:47 +0000 (14:32 +0000)
18 files changed:
CHANGES
apps/silcd/command.c
apps/silcd/idlist.c
apps/silcd/packet_receive.c
apps/silcd/packet_send.c
apps/silcd/protocol.c
apps/silcd/server.c
lib/silcclient/protocol.c
lib/silccore/silccommand.c
lib/silccore/silcidcache.c
lib/silccrypt/rsa.c
lib/silccrypt/rsa_internal.h
lib/silccrypt/silcpkcs.c
lib/silcsim/Makefile.am
lib/silcske/groups.c
lib/silcske/groups.h
lib/silcske/groups_internal.h
lib/silcske/silcske.c

diff --git a/CHANGES b/CHANGES
index 388e17c7a79428c4600ccb7e86f4a72f621dcae2..4cbc242e052e97ee31d2eb1dd6b178e8b1b40fe6 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,21 @@
+Sat Dec  1 12:52:39 EET 2001  Pekka Riikonen <priikone@silcnet.org>
+
+       * Memory leak fixes in:
+
+         lib/silcutil/silcsockconn.c
+         lib/silcske/silcske.c
+         lib/silcske/groups.c
+         lib/silccrypt/rsa.c
+         lib/silccrypt/silcpkcs.c
+         lib/silccore/silccommand.c
+         lib/silccore/silcidcache.c
+         silcd/idlist.c
+         silcd/packet_send.c
+         silcd/command.c
+
+       * ROBOdoc documented the lib/silcske/groups.h file and a
+         bit changed the interface for better.
+
 Thu Nov 29 22:12:50 EET 2001  Pekka Riikonen <priikone@silcnet.org>'
 
        * Update the client entry context in the ID cache after
index 25b642f4ec18016c9c4cfdbb0dfed33d87bf5105..5316ee9965259e988237db8958ceb041aedd87e9 100644 (file)
@@ -2194,6 +2194,9 @@ SILC_SERVER_CMD_FUNC(list)
   silc_server_command_list_send_reply(cmd, lchannels, lch_count, 
                                      gchannels, gch_count);
 
+  silc_free(lchannels);
+  silc_free(gchannels);
+
  out:
   silc_server_command_free(cmd);
 }
@@ -4031,7 +4034,7 @@ SILC_SERVER_CMD_FUNC(cmode)
     
   silc_buffer_free(packet);
   silc_free(channel_id);
-  silc_free(cidp);
+  silc_buffer_free(cidp);
 
  out:
   silc_server_command_free(cmd);
index 4dbe844d60badf99b4144a627cecf3f1899e839b..fa084ec69496e6349eacc35489e03431b6c57ee8 100644 (file)
@@ -71,6 +71,8 @@ void silc_idlist_del_data(void *entry)
     silc_hmac_free(idata->hmac_send);
   if (idata->hmac_receive)
     silc_hmac_free(idata->hmac_receive);
+  if (idata->hash)
+    silc_hash_free(idata->hash);
   if (idata->public_key)
     silc_pkcs_public_key_free(idata->public_key);
 }
@@ -361,6 +363,7 @@ int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry)
     silc_free(entry->username);
     silc_free(entry->userinfo);
     silc_free(entry->id);
+    silc_hash_table_free(entry->channels);
 
     memset(entry, 'F', sizeof(*entry));
     silc_free(entry);
@@ -533,18 +536,13 @@ void silc_idlist_client_destructor(SilcIDCache cache,
 {
   SilcClientEntry client;
 
-  SILC_LOG_DEBUG(("Start"));
-
   client = (SilcClientEntry)entry->context;
   if (client) {
-    if (client->nickname)
-      silc_free(client->nickname);
-    if (client->username)
-      silc_free(client->username);
-    if (client->userinfo)
-      silc_free(client->userinfo);
-    if (client->id)
-      silc_free(client->id);
+    silc_free(client->nickname);
+    silc_free(client->username);
+    silc_free(client->userinfo);
+    silc_free(client->id);
+    silc_hash_table_free(client->channels);
 
     memset(client, 'F', sizeof(*client));
     silc_free(client);
@@ -634,6 +632,8 @@ int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry)
       silc_free(entry->key);
     }
     silc_free(entry->cipher);
+    if (entry->hmac)
+      silc_hmac_free(entry->hmac);
     silc_free(entry->hmac_name);
     silc_free(entry->rekey);
 
index 3b11de0f82800e4682eced94663caacefb25087f..f09bccb6dc4d7910c847e52d2d79001dc20ec545 100644 (file)
@@ -1444,6 +1444,7 @@ SilcClientEntry silc_server_new_client(SilcServer server,
   SilcClientID *client_id;
   SilcBuffer reply;
   SilcIDListData idata;
+  SilcIDCacheEntry id_cache = NULL;
   char *username = NULL, *realname = NULL, *id_string;
   uint32 id_len;
   int ret;
@@ -1459,7 +1460,7 @@ SilcClientEntry silc_server_new_client(SilcServer server,
   client = (SilcClientEntry)sock->user_data;
   idata = (SilcIDListData)client;
 
-  /* Remove the old cache entry */
+  /* Remove the old cache entry. */
   if (!silc_idcache_del_by_context(server->local_list->clients, client)) {
     SILC_LOG_ERROR(("Lost client's cache entry - bad thing"));
     silc_server_disconnect_remote(server, sock, "Server closed connection: "
@@ -2517,4 +2518,3 @@ void silc_server_ftp(SilcServer server,
                           idata->hmac_send, idata->psn_send++,
                           packet, FALSE);
 }
-
index 0956bdbdaa56a1e20e0f7a446cb3738f3361df4d..3c71557c8a3ef9dadcefe29a39e052296205df83 100644 (file)
@@ -1604,6 +1604,7 @@ void silc_server_send_notify_on_channels(SilcServer server,
   silc_free(routed);
   silc_free(sent_clients);
   silc_free(packetdata.src_id);
+  silc_buffer_free(packet);
   va_end(ap);
 }
 
index 50caf2403a30142a903c0948733449d92280a6da..5bf971010d58ec8fabd3816fcfb8088080c1ba91 100644 (file)
@@ -1410,7 +1410,7 @@ SILC_TASK_CALLBACK(silc_server_protocol_rekey)
          ctx->ske = silc_ske_alloc();
          ctx->ske->rng = server->rng;
          ctx->ske->prop = silc_calloc(1, sizeof(*ctx->ske->prop));
-         silc_ske_get_group_by_number(idata->rekey->ske_group,
+         silc_ske_group_get_by_number(idata->rekey->ske_group,
                                       &ctx->ske->prop->group);
 
          silc_ske_set_callbacks(ctx->ske, 
@@ -1466,7 +1466,7 @@ SILC_TASK_CALLBACK(silc_server_protocol_rekey)
          ctx->ske = silc_ske_alloc();
          ctx->ske->rng = server->rng;
          ctx->ske->prop = silc_calloc(1, sizeof(*ctx->ske->prop));
-         silc_ske_get_group_by_number(idata->rekey->ske_group,
+         silc_ske_group_get_by_number(idata->rekey->ske_group,
                                       &ctx->ske->prop->group);
 
          silc_ske_set_callbacks(ctx->ske, 
index c831c1586bcede4b0cbd29d08c0e300e8054fa98..86b0a3dc048bb11b5ff537dd8cbbd69855c388d9 100644 (file)
@@ -111,7 +111,7 @@ void silc_server_free(SilcServer server)
 
 int silc_server_init(SilcServer server)
 {
-  int *sock = NULL, sock_count = 0, i;
+  int *sock = NULL, sock_count, i;
   SilcServerID *id;
   SilcServerEntry id_entry;
   SilcIDListPurge purge;
@@ -181,6 +181,7 @@ int silc_server_init(SilcServer server)
 
     tmp = silc_net_create_server(server->config->listen_port->port,
                                 server->config->listen_port->listener_ip);
+
     if (tmp < 0) {
       SILC_LOG_ERROR(("Could not create server listener: %s on %d",
                      server->config->listen_port->listener_ip,
@@ -188,7 +189,7 @@ int silc_server_init(SilcServer server)
       goto err0;
     }
 
-    sock = silc_realloc(sock, (sizeof(int *) * (sock_count + 1)));
+    sock = silc_realloc(sock, sizeof(*sock) * (sock_count + 1));
     sock[sock_count] = tmp;
     sock_count++;
     listen = listen->next;
index 40bffdf826450a9eaf58004961ce7d7e213dd42b..f70506e936df572d4f2fa9b2bc75092c94c189be 100644 (file)
@@ -918,7 +918,7 @@ SILC_TASK_CALLBACK(silc_client_protocol_rekey)
          ctx->ske = silc_ske_alloc();
          ctx->ske->rng = client->rng;
          ctx->ske->prop = silc_calloc(1, sizeof(*ctx->ske->prop));
-         silc_ske_get_group_by_number(conn->rekey->ske_group,
+         silc_ske_group_get_by_number(conn->rekey->ske_group,
                                       &ctx->ske->prop->group);
 
          silc_ske_set_callbacks(ctx->ske, 
@@ -975,7 +975,7 @@ SILC_TASK_CALLBACK(silc_client_protocol_rekey)
          ctx->ske = silc_ske_alloc();
          ctx->ske->rng = client->rng;
          ctx->ske->prop = silc_calloc(1, sizeof(*ctx->ske->prop));
-         silc_ske_get_group_by_number(conn->rekey->ske_group,
+         silc_ske_group_get_by_number(conn->rekey->ske_group,
                                       &ctx->ske->prop->group);
 
          silc_ske_set_callbacks(ctx->ske, 
index ba029871df1814d1b8fdb8d040191fb647a4b347..e1c2fc2bf1fe3a6a9e6db0677c74be1516ed9799 100644 (file)
@@ -130,7 +130,7 @@ SilcBuffer silc_command_payload_encode(SilcCommand cmd,
                       SILC_STR_UI_XNSTRING(args->data, args->len),
                       SILC_STR_END);
     silc_buffer_push(buffer, SILC_COMMAND_PAYLOAD_LEN);
-    silc_free(args);
+    silc_buffer_free(args);
   }
 
   return buffer;
@@ -173,7 +173,7 @@ SilcBuffer silc_command_payload_encode_payload(SilcCommandPayload payload)
                       SILC_STR_UI_XNSTRING(args->data, args->len),
                       SILC_STR_END);
     silc_buffer_push(buffer, SILC_COMMAND_PAYLOAD_LEN);
-    silc_free(args);
+    silc_buffer_free(args);
   }
 
   return buffer;
index b922beb7f9cdfca9af3529062572c11b9c6b421b..c4b658e80ed02f3827d06ad687de3c154e9577e1 100644 (file)
@@ -198,6 +198,8 @@ bool silc_idcache_del(SilcIDCache cache, SilcIDCacheEntry old)
     ret = silc_hash_table_del(cache->context_table, old->context);
   if (old->id)
     ret = silc_hash_table_del(cache->id_table, old->id);
+  else
+    silc_free(old);
 
   return ret;
 }
@@ -263,6 +265,8 @@ bool silc_idcache_del_by_context(SilcIDCache cache, void *context)
     ret = silc_hash_table_del(cache->context_table, c->context);
   if (c->id)
     ret = silc_hash_table_del_by_context(cache->id_table, c->id, c);
+  else
+    silc_free(c);
 
   return ret;
 }
index 66aea06a875c825b232e6f1af6c0bec6f99af2ba..ec47e6ddd3e0fdbe7295410fa20ed94d056f40eb 100644 (file)
@@ -220,6 +220,12 @@ SILC_PKCS_API_SET_PUBLIC_KEY(rsa)
   unsigned char tmp[4];
   uint32 e_len, n_len;
 
+  if (key->pub_set) {
+    silc_mp_uninit(&key->e);
+    silc_mp_uninit(&key->e);
+    key->pub_set = FALSE;
+  }
+
   silc_mp_init(&key->e);
   silc_mp_init(&key->n);
 
@@ -244,6 +250,7 @@ SILC_PKCS_API_SET_PUBLIC_KEY(rsa)
   silc_mp_bin2mp(key_data + 4 + e_len + 4, n_len, &key->n);
 
   key->bits = n_len * 8;
+  key->pub_set = TRUE;
 
   return key->bits;
 }
@@ -258,6 +265,17 @@ SILC_PKCS_API_SET_PRIVATE_KEY(rsa)
   unsigned char tmp[4];
   uint32 e_len, n_len, d_len;
 
+  if (key->prv_set) {
+    silc_mp_uninit(&key->d);
+    key->prv_set = FALSE;
+  }
+
+  if (key->pub_set) {
+    silc_mp_uninit(&key->e);
+    silc_mp_uninit(&key->n);
+    key->pub_set = FALSE;
+  }
+
   silc_mp_init(&key->e);
   silc_mp_init(&key->n);
   silc_mp_init(&key->d);
@@ -267,6 +285,7 @@ SILC_PKCS_API_SET_PRIVATE_KEY(rsa)
   if (e_len > key_len) {
     silc_mp_uninit(&key->e);
     silc_mp_uninit(&key->n);
+    silc_mp_uninit(&key->d);
     return FALSE;
   }
 
@@ -277,6 +296,7 @@ SILC_PKCS_API_SET_PRIVATE_KEY(rsa)
   if (e_len + n_len > key_len) {
     silc_mp_uninit(&key->e);
     silc_mp_uninit(&key->n);
+    silc_mp_uninit(&key->d);
     return FALSE;
   }
 
@@ -287,12 +307,15 @@ SILC_PKCS_API_SET_PRIVATE_KEY(rsa)
   if (e_len + n_len + d_len > key_len) {
     silc_mp_uninit(&key->e);
     silc_mp_uninit(&key->n);
+    silc_mp_uninit(&key->d);
     return FALSE;
   }
 
   silc_mp_bin2mp(key_data + 4 + e_len + 4 + n_len + 4, d_len, &key->d);
 
   key->bits = n_len * 8;
+  key->prv_set = TRUE;
+  key->pub_set = TRUE;
 
   return TRUE;
 }
@@ -464,8 +487,6 @@ void rsa_generate_keys(RsaKey *key, uint32 bits,
   SilcMPInt pm1, qm1;
   
   /* Initialize variables */
-  silc_mp_init(&key->p);
-  silc_mp_init(&key->q);
   silc_mp_init(&key->n);
   silc_mp_init(&key->e);
   silc_mp_init(&key->d);
@@ -479,16 +500,12 @@ void rsa_generate_keys(RsaKey *key, uint32 bits,
   /* Set modulus length */
   key->bits = bits;
 
-  /* Set the primes */
-  silc_mp_set(&key->p, p);
-  silc_mp_set(&key->q, q);
-
   /* Compute modulus, n = p * q */
-  silc_mp_mul(&key->n, &key->p, &key->q);
+  silc_mp_mul(&key->n, p, q);
   
   /* phi = (p - 1) * (q - 1) */
-  silc_mp_sub_ui(&pm1, &key->p, 1);
-  silc_mp_sub_ui(&qm1, &key->q, 1);
+  silc_mp_sub_ui(&pm1, p, 1);
+  silc_mp_sub_ui(&qm1, q, 1);
   silc_mp_mul(&phi, &pm1, &qm1);
   
   /* Set e, the public exponent. We try to use same public exponent
@@ -522,11 +539,12 @@ void rsa_generate_keys(RsaKey *key, uint32 bits,
 void rsa_clear_keys(RsaKey *key)
 {
   key->bits = 0;
-  silc_mp_uninit(&key->p);
-  silc_mp_uninit(&key->q);
-  silc_mp_uninit(&key->n);
-  silc_mp_uninit(&key->e);
-  silc_mp_uninit(&key->d);
+  if (key->pub_set) {
+    silc_mp_uninit(&key->n);
+    silc_mp_uninit(&key->e);
+  }
+  if (key->prv_set)
+    silc_mp_uninit(&key->d);
 }
 
 /* RSA encrypt/decrypt function. cm = ciphertext or plaintext,
index 33ffd88a6cf19bee3dfb5cf1324423d38acfde10..c4feb3158d341d773f545269d1c4ff900f995597 100644 (file)
@@ -24,8 +24,8 @@
 /* RSA Keys, includes both Private and Public key */
 typedef struct {
   int bits;                    /* bits in key */
-  SilcMPInt p;                 /* prime p */
-  SilcMPInt q;                 /* prime q */
+  char pub_set;                        /* TRUE is n and e is set */
+  char prv_set;                        /* TRUE if d is set */
   SilcMPInt n;                 /* modulus */
   SilcMPInt e;                 /* public exponent */
   SilcMPInt d;                 /* private exponent */
index 866662b3e911256f58047c8d363a992c2be503f7..d843428e7e7f73d4f9fa91dbd45a54a5403279aa 100644 (file)
@@ -152,8 +152,10 @@ bool silc_pkcs_alloc(const unsigned char *name, SilcPKCS *new_pkcs)
 
 void silc_pkcs_free(SilcPKCS pkcs)
 {
-  if (pkcs)
+  if (pkcs) {
+    pkcs->pkcs->clear_keys(pkcs->context);
     silc_free(pkcs->context);
+  }
   silc_free(pkcs);
 }
 
index 799c85918375403bafd2c26c514b5b15ea42c423..ac9d278d171a38c2acad0efa38a23d942c3e6098 100644 (file)
@@ -60,12 +60,12 @@ endif
 $(SIM_CIPHER_OBJS): ../silccrypt/libsilccrypt.a
        $(LTCOMPILE) -c $(srcdir)/../silccrypt/$*.c
        $(LIBTOOL) --mode=link $(LINK) -rpath $(silc_modulesdir) -o lib$*.la $*.lo
-       cd $(srcdir)/$(SIM_MODULES_DIR) && $(LN_S) $(srcdir)/../.libs/lib$*.so $(srcdir)/$*.sim.so
+       cd $(srcdir)/$(SIM_MODULES_DIR) && $(LN_S) -f $(srcdir)/../.libs/lib$*.so $(srcdir)/$*.sim.so
 
 $(SIM_HASH_OBJS): ../silccrypt/libsilccrypt.a
        $(LTCOMPILE) -c $(srcdir)/../silccrypt/$*.c
        $(LIBTOOL) --mode=link $(LINK) -rpath $(silc_modulesdir) -o lib$*.la $*.lo
-       cd $(srcdir)/$(SIM_MODULES_DIR) && $(LN_S) $(srcdir)/../.libs/lib$*.so $(srcdir)/$*.sim.so
+       cd $(srcdir)/$(SIM_MODULES_DIR) && $(LN_S) -f $(srcdir)/../.libs/lib$*.so $(srcdir)/$*.sim.so
 
 CLEANFILES = $(SIM_MODULES_DIR)/*.sim.so *.la
 
index 0c83343dc4b945aea813b00f31b9448c6392eadf..c5a947e8866cd96c01304e76efef8b339717e21c 100644 (file)
@@ -72,7 +72,7 @@ const struct SilcSKEDiffieHellmanGroupDefStruct silc_ske_groups[] =
 
 /* Returns Diffie Hellman group by group number */
 
-SilcSKEStatus silc_ske_get_group_by_number(int number,
+SilcSKEStatus silc_ske_group_get_by_number(int number,
                                           SilcSKEDiffieHellmanGroup *ret)
 {
   int i;
@@ -106,7 +106,7 @@ SilcSKEStatus silc_ske_get_group_by_number(int number,
 
 /* Returns Diffie Hellman group by name */
 
-SilcSKEStatus silc_ske_get_group_by_name(const char *name,
+SilcSKEStatus silc_ske_group_get_by_name(const char *name,
                                         SilcSKEDiffieHellmanGroup *ret)
 {
   int i;
@@ -138,6 +138,16 @@ SilcSKEStatus silc_ske_get_group_by_name(const char *name,
   return SILC_SKE_STATUS_OK;
 }
 
+/* Free group */
+
+void silc_ske_group_free(SilcSKEDiffieHellmanGroup group)
+{
+  silc_mp_uninit(&group->group);
+  silc_mp_uninit(&group->group_order);
+  silc_mp_uninit(&group->generator);
+  silc_free(group);
+}
+
 /* Returns comma separated list of supported groups */
 
 char *silc_ske_get_supported_groups()
@@ -167,3 +177,10 @@ int silc_ske_group_get_number(SilcSKEDiffieHellmanGroup group)
 {
   return group->number;
 }
+
+/* Returns the name of the `group'. */
+
+const char *silc_ske_group_get_name(SilcSKEDiffieHellmanGroup group)
+{
+  return group->name;
+}
index 1e36c5dec556bf1c22e35dff542cd137807f2fb5..724bc3d5f86f1dec73ab9c022f485e6024a78e44 100644 (file)
 
 */
 
+/****h* silcske/SilcSKEGroups
+ *
+ * DESCRIPTION
+ *
+ * This interface defines the Diffie Hellman group management and utility
+ * functions for the SKE.  They can be used find DH groups by group number,
+ * and group name.  These routines are used during the SKE session.
+ *
+ ***/
+
 #ifndef GROUPS_H
 #define GROUPS_H
 
 #include "silcske_status.h"
 
-/* Forward declaration */
+/****s* silcske/SilcSKEGroups/SilcSKEDiffieHellmanGroup
+ *
+ * NAME
+ * 
+ *    typedef struct SilcSKEDiffieHellmanGroupStruct 
+ *                     *SilcSKEDiffieHellmanGroup;
+ *
+ * DESCRIPTION
+ *
+ *    This context represents one Diffie Hellman group, and is returned
+ *    by the utility functions for finding correct groups.  The context
+ *    is freed by calling the silc_ske_group_free function.
+ *
+ ***/
 typedef struct SilcSKEDiffieHellmanGroupStruct *SilcSKEDiffieHellmanGroup;
 
-/* List of defined groups. */
-extern const struct SilcSKEDiffieHellmanGroupDefStruct silc_ske_groups[];
-
 /* Prototypes */
-SilcSKEStatus silc_ske_get_group_by_number(int number,
+
+/****f* silcske/SilcSKEGroups/silc_ske_group_get_by_number
+ *
+ * SYNOPSIS
+ *
+ *    SilcSKEStatus 
+ *    silc_ske_group_get_by_number(int number,
+ *                                 SilcSKEDiffieHellmanGroup *ret);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the Diffie Hellman group into the `ret' pointer by
+ *    group number indicated by the `number'.  Returns error status
+ *    if the group was not found.
+ *
+ ***/
+SilcSKEStatus silc_ske_group_get_by_number(int number,
                                           SilcSKEDiffieHellmanGroup *ret);
-SilcSKEStatus silc_ske_get_group_by_name(const char *name,
+
+/****f* silcske/SilcSKEGroups/silc_ske_group_get_by_name
+ *
+ * SYNOPSIS
+ *
+ *    SilcSKEStatus 
+ *    silc_ske_get_group_by_name(const char *name,
+ *                               SilcSKEDiffieHellmanGroup *ret);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the Diffie Hellman group into the `ret' pointer by
+ *    group name indicated by the `name'.  Returns error status
+ *    if the group was not found.
+ *
+ ***/
+SilcSKEStatus silc_ske_group_get_by_name(const char *name,
                                         SilcSKEDiffieHellmanGroup *ret);
+
+/****f* silcske/SilcSKEGroups/silc_ske_group_free
+ *
+ * SYNOPSIS
+ *
+ *    void silc_ske_group_free(SilcSKEDiffieHellmanGroup group);
+ *
+ * DESCRIPTION
+ *
+ *    Free the Diffie Hellman group indicated by the `group'.
+ *
+ ***/
+void silc_ske_group_free(SilcSKEDiffieHellmanGroup group);
+
+/****f* silcske/SilcSKEGroups/silc_ske_get_supported_groups
+ *
+ * SYNOPSIS
+ *
+ *    char *silc_ske_get_supported_groups();
+ *
+ * DESCRIPTION
+ *
+ *    Returns a comma separated list of support Diffie Hellman groups.
+ *    This can be used to get the list of supported groups for SKE
+ *    packets.
+ *
+ ***/
 char *silc_ske_get_supported_groups();
+
+/****f* silcske/SilcSKEGroups/silc_ske_group_get_number
+ *
+ * SYNOPSIS
+ *
+ *    int silc_ske_group_get_number(SilcSKEDiffieHellmanGroup group);
+ *
+ * DESCRIPTION
+ *
+ *    Return the group number of the group indicated by the `group'.
+ *
+ ***/
 int silc_ske_group_get_number(SilcSKEDiffieHellmanGroup group);
 
+/****f* silcske/SilcSKEGroups/silc_ske_group_get_name
+ *
+ * SYNOPSIS
+ *
+ *    const char *silc_ske_group_get_name(SilcSKEDiffieHellmanGroup group);
+ *
+ * DESCRIPTION
+ *
+ *    Return the group name of the group indicated by the `group'.
+ *
+ ***/
+const char *silc_ske_group_get_name(SilcSKEDiffieHellmanGroup group);
+
 #endif
index ab2787b4751fe3a5fcbff79aef3d7fc6bd812e03..eb62758365bc6434ac12b1775db3a4ed6adb1cf7 100644 (file)
@@ -39,4 +39,7 @@ struct SilcSKEDiffieHellmanGroupStruct {
   SilcMPInt generator;
 };
 
+/* List of defined groups. */
+extern const struct SilcSKEDiffieHellmanGroupDefStruct silc_ske_groups[];
+
 #endif
index 612abd81dea4f09920e12746caf2d11b85e7f47e..c3c14297046ff717531664f662183b5f33de0fac 100644 (file)
@@ -72,7 +72,8 @@ void silc_ske_free(SilcSKE ske)
 
     /* Free rest */
     if (ske->prop) {
-      silc_free(ske->prop->group);
+      if (ske->prop->group)
+       silc_ske_group_free(ske->prop->group);
       if (ske->prop->pkcs)
        silc_pkcs_free(ske->prop->pkcs);
       if (ske->prop->cipher)
@@ -249,7 +250,7 @@ SilcSKEStatus silc_ske_initiator_phase_1(SilcSKE ske,
      the callback function. */
   ske->prop = prop = silc_calloc(1, sizeof(*prop));
   prop->flags = payload->flags;
-  status = silc_ske_get_group_by_name(payload->ke_grp_list, &group);
+  status = silc_ske_group_get_by_name(payload->ke_grp_list, &group);
   if (status != SILC_SKE_STATUS_OK)
     goto err;
 
@@ -288,7 +289,7 @@ SilcSKEStatus silc_ske_initiator_phase_1(SilcSKE ske,
   if (payload)
     silc_ske_payload_start_free(payload);
 
-  silc_free(group);
+  silc_ske_group_free(group);
 
   if (prop->pkcs)
     silc_pkcs_free(prop->pkcs);
@@ -695,7 +696,7 @@ SilcSKEStatus silc_ske_responder_phase_1(SilcSKE ske,
      only for this negotiation and will be free'd after KE is over. */
   ske->prop = prop = silc_calloc(1, sizeof(*prop));
   prop->flags = start_payload->flags;
-  status = silc_ske_get_group_by_name(start_payload->ke_grp_list, &group);
+  status = silc_ske_group_get_by_name(start_payload->ke_grp_list, &group);
   if (status != SILC_SKE_STATUS_OK)
     goto err;
 
@@ -741,7 +742,7 @@ SilcSKEStatus silc_ske_responder_phase_1(SilcSKE ske,
 
  err:
   if (group)
-    silc_free(group);
+    silc_ske_group_free(group);
 
   if (prop->pkcs)
     silc_pkcs_free(prop->pkcs);
@@ -1217,7 +1218,7 @@ silc_ske_select_security_properties(SilcSKE ske,
 
       SILC_LOG_DEBUG(("Proposed KE group `%s'", item));
 
-      if (silc_ske_get_group_by_name(item, NULL) == SILC_SKE_STATUS_OK) {
+      if (silc_ske_group_get_by_name(item, NULL) == SILC_SKE_STATUS_OK) {
        SILC_LOG_DEBUG(("Found KE group `%s'", item));
 
        payload->ke_grp_len = len;