From: Pekka Riikonen Date: Wed, 4 Apr 2001 14:36:21 +0000 (+0000) Subject: updates. X-Git-Tag: SILC.0.1~51 X-Git-Url: http://git.silcnet.org/gitweb/?a=commitdiff_plain;h=1b71837125fbc3111617cab6f22a6244508b7ed2;p=silc.git updates. --- diff --git a/apps/silcd/idlist.c b/apps/silcd/idlist.c index ba9eaf66..eba17160 100644 --- a/apps/silcd/idlist.c +++ b/apps/silcd/idlist.c @@ -36,7 +36,9 @@ void silc_idlist_add_data(void *entry, SilcIDListData idata) SilcIDListData data = (SilcIDListData)entry; data->send_key = idata->send_key; data->receive_key = idata->receive_key; - data->rekey = idata->rekey; + data->send_enc_key = idata->send_enc_key; + data->enc_key_len = idata->enc_key_len; + data->pfs = idata->pfs; data->hash = idata->hash; data->hmac = idata->hmac; data->public_key = idata->public_key; @@ -54,12 +56,9 @@ void silc_idlist_del_data(void *entry) silc_cipher_free(idata->send_key); if (idata->receive_key) silc_cipher_free(idata->receive_key); - if (idata->rekey) { - if (idata->rekey->send_enc_key) { - memset(idata->rekey->send_enc_key, 0, idata->rekey->enc_key_len); - silc_free(idata->rekey->send_enc_key); - } - silc_free(idata->rekey); + if (idata->send_enc_key) { + memset(idata->send_enc_key, 0, idata->enc_key_len); + silc_free(idata->send_enc_key); } if (idata->hmac) silc_hmac_free(idata->hmac); @@ -252,8 +251,6 @@ silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id, int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry) { - SILC_LOG_DEBUG(("Start")); - if (entry) { /* Remove from cache */ if (entry->id) @@ -325,8 +322,6 @@ silc_idlist_add_client(SilcIDList id_list, unsigned char *nickname, int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry) { - SILC_LOG_DEBUG(("Start")); - if (entry) { /* Remove from cache */ if (entry->id) @@ -615,8 +610,6 @@ silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode, int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry) { - SILC_LOG_DEBUG(("Start")); - if (entry) { SilcChannelClientEntry chl; diff --git a/apps/silcd/idlist.h b/apps/silcd/idlist.h index 803392f2..73035241 100644 --- a/apps/silcd/idlist.h +++ b/apps/silcd/idlist.h @@ -40,17 +40,6 @@ typedef struct { uint32 key_len; } *SilcServerChannelRekey; -/* Generic rekey context for connections */ -typedef struct { - /* Current sending encryption key, provided for re-key. The `pfs' - is TRUE if the Perfect Forward Secrecy is performed in re-key. */ - unsigned char *send_enc_key; - uint32 enc_key_len; - bool pfs; - uint32 timeout; - void *context; -} *SilcServerRekey; - /* Generic ID list data structure. @@ -69,8 +58,11 @@ typedef struct { SilcCipher send_key; SilcCipher receive_key; - /* Re-key context */ - SilcServerRekey rekey; + /* Current sending encryption key, provided for re-key. The `pfs' + is TRUE if the Perfect Forward Secrecy is performed in re-key. */ + unsigned char *send_enc_key; + uint32 enc_key_len; + bool pfs; /* Hash selected in the SKE protocol, NULL if not needed at all */ SilcHash hash; diff --git a/apps/silcd/protocol.c b/apps/silcd/protocol.c index 339f9881..d31955fe 100644 --- a/apps/silcd/protocol.c +++ b/apps/silcd/protocol.c @@ -71,6 +71,9 @@ int silc_server_protocol_ke_set_keys(SilcSKE ske, conn_data = silc_calloc(1, sizeof(*conn_data)); idata = (SilcIDListData)conn_data; + if (ske->start_payload->flags & SILC_SKE_SP_FLAG_PFS) + idata->pfs = TRUE; + /* Allocate cipher to be used in the communication */ if (!silc_cipher_alloc(cipher->cipher->name, &idata->send_key)) { silc_free(conn_data); @@ -98,16 +101,10 @@ int silc_server_protocol_ke_set_keys(SilcSKE ske, } /* Note that for responder the initiator's sending key is receiving key */ - idata->rekey = silc_calloc(1, sizeof(*idata->rekey)); - idata->rekey->send_enc_key = - silc_calloc(keymat->enc_key_len / 8, - sizeof(*idata->rekey->send_enc_key)); - memcpy(idata->rekey->send_enc_key, - keymat->send_enc_key, keymat->enc_key_len / 8); - idata->rekey->enc_key_len = keymat->enc_key_len / 8; - - if (ske->start_payload->flags & SILC_SKE_SP_FLAG_PFS) - idata->rekey->pfs = TRUE; + idata->send_enc_key = silc_calloc(keymat->enc_key_len / 8, + sizeof(*idata->send_enc_key)); + memcpy(idata->send_enc_key, keymat->send_enc_key, keymat->enc_key_len / 8); + idata->enc_key_len = keymat->enc_key_len / 8; /* Save the remote host's public key */ silc_pkcs_public_key_decode(ske->ke1_payload->pk_data, @@ -1012,8 +1009,8 @@ void silc_server_protocol_rekey_generate(SilcServer server, /* Generate the new key */ keymat = silc_calloc(1, sizeof(*keymat)); - silc_ske_process_key_material_data(idata->rekey->send_enc_key, - idata->rekey->enc_key_len, + silc_ske_process_key_material_data(idata->send_enc_key, + idata->enc_key_len, 16, key_len, hash_len, idata->hash, keymat); @@ -1038,14 +1035,12 @@ void silc_server_protocol_rekey_generate(SilcServer server, silc_hmac_set_key(idata->hmac, keymat->hmac_key, keymat->hmac_key_len); /* Save the current sending encryption key */ - memset(idata->rekey->send_enc_key, 0, idata->rekey->enc_key_len); - silc_free(idata->rekey->send_enc_key); - idata->rekey->send_enc_key = - silc_calloc(keymat->enc_key_len / 8, - sizeof(*idata->rekey->send_enc_key)); - memcpy(idata->rekey->send_enc_key, keymat->send_enc_key, - keymat->enc_key_len / 8); - idata->rekey->enc_key_len = keymat->enc_key_len / 8; + memset(idata->send_enc_key, 0, idata->enc_key_len); + silc_free(idata->send_enc_key); + idata->send_enc_key = silc_calloc(keymat->enc_key_len / 8, + sizeof(*idata->send_enc_key)); + memcpy(idata->send_enc_key, keymat->send_enc_key, keymat->enc_key_len / 8); + idata->enc_key_len = keymat->enc_key_len / 8; silc_ske_free_key_material(keymat); } diff --git a/apps/silcd/server.c b/apps/silcd/server.c index 579f5033..786566f0 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -925,7 +925,8 @@ SILC_TASK_CALLBACK(silc_server_connect_to_router_final) silc_server_perform_heartbeat, server->timeout_queue); - /* Registed re-key timeout */ + /* Register re-key timeout */ + /* XXX this leaks memory as this is not freed anywhere, currently */ rekey = silc_calloc(1, sizeof(*rekey)); rekey->server = server; rekey->sock = sock;