updates.
[silc.git] / CHANGES
diff --git a/CHANGES b/CHANGES
index 2657723ced7fcf900afd814f4ed356fc1bde2d4d..47f3c148a4db95c6c1df3682ec353ac7120a527d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,722 @@
+Thu Mar  8 21:39:03 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added assert()s to buffer formatting and unformatting routines
+         to assert (if --enable-debug) when error occurs.  Affected
+         file: lib/silcutil/silcbuffmt.c.
+
+       * Changed to auto-reconnect to check whether the remote host is
+         router and register the re-connect timeout if it is.  It used 
+         to check that whether we are normal server, but router must do
+         auto-reconnect with another router as well.  Affected file
+         silcd/server.c.
+
+       * Removed the [<key len>] option from CMODE command as the cipher
+         name decides the key length, nowadays.  See the defined ciphers
+         from the protocol specification.
+
+       * Added [<hmac>] option to the CMODE command to define the HMAC
+         for the channel.  Added SILC_CMODE_HMAC channel mode.
+
+       * Added [<hmac>] option for the JOIN command so that user can
+         select which HMAC is used to compute the MACs of the channel
+         messages.
+
+       * Added Hmac field to the Channel Message Payload.  The integrity
+         of plaintext channel messages are now protected by computing
+         MAC of the message and attaching the MAC to the payload.  The
+         MAC is not encrypted.  Now, it is clear that this causes some
+         overhead to the size of the packet but rationale for this is that
+         now the receiver can verify whether the channel message decrypted
+         correctly and also when private keys are set for the channel the
+         receiver can decrypt the packet with several keys and check from
+         the MAC which key decrypted the message correctly.
+
+       * Added silc_cipher_encrypt and silc_cipher_decrypt into the
+         lib/silccrypt/silccipher.[ch].
+
+       * Added silc_hash_len to return the digest length into the
+         lib/silcrypt/silchash.[ch].
+
+       * Rewrote parts of Silc Channel Payload interface in the
+         lib/silccore/silcchannel.[ch].  The encode function now also
+         encrypts the packet and parse function decrypts it.
+
+       * Channel message delivery between routers was broken after the
+         channel key distribution was fixed earlier.  The channel key
+         was used be to distributed to other routers as well which is not
+         allowed by the protocol.  Now this is fixed and channel keys
+         really are cell specific and the channel message delivery between
+         routers comply with the protocol specification.
+
+Wed Mar  7 20:58:50 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Fixed a minor formatting bug in the SKE's key material processing.
+         It actually might have processed the keys wrong way resulting
+         into wrong keys.
+
+       * Redefined the mandatory HMAC algorithms and added new algorithms.
+         Added hmac-sha1-96 and hmac-md5-96 which are normal hmac-sha1
+         and hmac-md5 truncated to 96 bits.  The mandatory is now 
+         hmac-sha1-96.  Rest are optional (including the one that used
+         to be mandatory).  Rationale for this is that the truncated HMAC
+         length is sufficient from security point of view and can actually
+         make the attack against the HMAC harder.  Also, the truncated
+         HMAC causes less overhead to the packets.  See the RFC2104 for
+         more information.
+
+       * Added new [hmac] configuration section.  The SKE used to use
+         the hash names (md5 and sha1) in the SKE proposal as HMCAS which
+         is of course wrong.  The official names that must be proposed in
+         the SKE are the ones defined in the protocol specification
+         (hmac-sha1-96 for example).  The user can configure any hmac
+         using any hash function configured in the [hash] section.  At
+         least, the mandatory must be configured.
+
+         Rewrote the HMAC interface in lib/silccrypt/silchmac.[ch].
+
+       * Added HMAC list to the SKE proposal list.  It has now both
+         hash algorithm list and HMAC list.  This makes the protocol
+         incompatible with previous versions.  The SKE now seems to work
+         the way it is supposed to work, for the first time actually.
+
+       * Defined plain Hash algorithms to the protocol specification.
+         Added sha1 and md5.
+
+Tue Mar  6 15:36:11 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Implemented support for key agreement packets into the server.
+         Added functions silc_server_key_agreement and
+         silc_server_send_key_agreement.  Other than these functions,
+         server has nothing to do with this packet.
+
+       * Added support for private message key packets into the server.
+         Added functions silc_server_private_message_key and
+         silc_server_send_private_message_key.
+
+       * Updated TODO.
+
+       * Changed the silc_[client|server]_protocol_ke_set_keys to be
+         called in the protocol's final callback instead in the END
+         protocol state.  This makes a little more sense and in the same
+         time in client we can use the same protocol routines for normal
+         key exchange and to key agreement packet handling as well.
+
+       * Added to both client's and server's KE protocol context the
+         SilcSKEKeyMaterial pointer to save the key material.  We will
+         bring the key material to the protocol's final callback by doing
+         this.  The final callback must free the key material.
+
+       * Added SKE's packet_send callback into client's KE protocol
+         context so that the caller can choose what packet sending function
+         is used.  This way we can use different packet sending when
+         doing normal SKE when doing key agreement packet handling (in
+         the key agreement packet handling we do not want to encrypt
+         the packets).
+
+       * Implemented the responder side of the key agreement routines
+         in the client.  The client can now bind to specified port and
+         accept incoming key negotiation.  The key material is passed
+         to the application after the protocol is over.
+
+       * Implemented the processing of incoming Key Agreement packet
+         in the client.  Added function silc_client_key_agreement to
+         process the packet.
+
+       * Implemented the intiator side of the key agreement routines
+         in the client.  The client can now initiate key agreement with
+         another remote client.  The key material is passed to the
+         application after the protocol is over.
+
+       * Created client_keyagr.c to include all the key agreement 
+         routines.
+
+       * Added macro SILC_TASK_CALLBACK_GLOBAL which is equal to the
+         SILC_TASK_CALLBACK except that it is not static.
+
+       * Created client_notify.c and moved the Notify packet handling
+         from the client.[ch] into that file.
+
+       * Created client_prvmsg.c and moved all private message and
+         private message key routines from the client.[ch] into that file.
+
+       * Create client_channel.c and moved all channel message and
+         channel private key routines from the client.[ch] into that file.
+
+       * Changed silc_client_get_client_by_id_resolve to resolve with
+         WHOIS command instead of IDENTIFY command, in the file
+         lib/silclient/idlist.c.
+
+Mon Mar  5 18:39:49 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Implemented the SKE's responder side to the Client library.
+
+       * When FAILURE is received to the protocol do not trust it
+         blindly.  Register a timeout to wait whether the remote closes
+         the connection as it should do it, only after that process the
+         actual failure.  This was changed to both client and server.
+
+       * Added client_internal.h to include some of the structures
+         there instead of client.h in lib/silcclient/.
+
+       * Added function silc_task_unregister_by_callback to unregister
+         timeouts by the callback function.
+
+Sat Mar  3 19:15:43 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Some "Incomplete WHOIS info" errors has been appearing on the
+         log files.  Took away the entry->userinfo check from WHOIS
+         reply sending.  The entry->userinfo is now " " if client did not
+         provide one.  I thought this was fixed earlier but something
+         is wrong still.  Let's see if the error still appears.
+
+Wed Feb 28 20:56:29 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Fixed a minor bug in the login when the channel key is
+         re-generated in the server.  It used to generate the key in
+         wrong order and thus caused problems in the channel traffic.
+
+       * Fixed a minor bug in channel key distsribution after
+         KICK command.  The key was not sent to the router even though
+         it should've been.
+
+Tue Feb 27 20:24:25 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added silc_ske_process_key_material_data as generic routine
+         to process any key material as the SILC protocol dictates.  The
+         function is used by the actual SKE library but can be used by
+         applications as well.  This relates to the private message keys
+         and the channel private keys since they must be processed the
+         same way the normal SILC session keys.  The protocol dictates
+         this.  Affected files: lib/silcske/silcske.[ch].
+
+         Added also silc_ske_free_key_material to free the
+         SilcSKEKeyMaterial structure.
+
+       * Defined silc_cipher_set_key function to set the key for
+         cipher without using the object's method function.  The affected
+         files: lib/silccrypt/silccipher.[ch].
+
+       * Implemented silc silc_client_add_private_message_key,
+         silc_client_add_private_message_key_ske, 
+         silc_client_del_private_message_key,
+         silc_client_list_private_message_keys and
+         silc_client_free_private_message_keys functions in the
+         client library.
+
+         Added functions silc_client_send_private_message_key to send
+         the Private Message Key payload and silc_client_private_message_key
+         to handle incoming Private Message Key payload.
+
+       * Added Cipher field to the Private Message Key payload to set
+         the cipher to be used.  If ignored, the default cipher defined
+         in the SILC protocol (aes-256-cbc) is used.
+
+Tue Feb 27 13:30:52 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Removed lib/silcclient/ops.h file.
+
+         Redefined parts of the SILC Client Library API. Created new
+         file silcapi.h that deprecates the ops.h file and defines the
+         published Client Library API.  Defined also private message key
+         API and channel private key API into the file.
+
+         This is the file that the application must include from the
+         SILC Client Library.  Other files need not be included by
+         the application anymore.
+
+       * Added new key_agreement client operation callback and also
+         defined the Key Agreement library API for the application.
+
+Tue Feb 27 11:28:31 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added new packet type: SILC_PACKET_KEY_AGREEMENT.  This packet
+          is used by clients to request key negotiation  between another
+          client in the SILC network.  If the negotiation is started it
+          is performed using the SKE protocol.  The result of the
+          negotiation, the secret key material, can be used for example
+          as private message key.
+
+         Implemented the Key Agreement payload into the files
+         lib/silccore/silauth.[ch].
+
+Mon Feb 26 12:13:58 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Redefined ciphers for the SILC protocol.  Added some new ciphers
+         and defined the key lengths for the algorithms.  Changed the
+         code accordingly.  The default key length is now 256 bits.
+
+       * Fixed SKE key distribution function silc_ske_process_key_material
+         when the key length is more than 128 bits.  The default key 
+         length in SILC is now 256 bits.
+
+       * Added new command status type: SILC_STATUS_ERR_UNKOWN_ALGORITHM
+         to indicate unsupported algorithm.
+
+       * Renamed rijndael.c to aes.c and all functions as well.
+
+       * Fixed a long standing channel key setting bug in client library.
+         Weird that it has never surfaced before.
+
+       * Fixed bug in channel deletion.  If the entire channel is removed
+         then it must also delete the references of the channel entry
+         from the client's channel list as the client's channel entry and
+         the channel's client entry share same memory.
+
+Sun Feb 25 20:47:29 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Implemented CONNECT and SHUTDOWN commands in the client.
+
+       * Implemented CLOSE command to the client.
+
+       * Added the function silc_idlist_find_server_by_name into the
+         files silcd/idlist.[ch].
+
+         Added the function silc_idlist_find_server_by_conn into the
+         files silcd/idlist.[ch].
+
+Sat Feb 24 23:45:49 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * DIE command was renamed to SHUTDOWN.  Updated the both code
+         and protocol specs.
+
+       * Defined SILC_UMODE_NONE, SILC_UMODE_SERVER_OPERATOR and
+         SILC_UMODE_ROUTER_OPERATOR modes into lib/silccore/silcmode.h.
+
+       * Implemented CONNECT, CLOSE and SHUTDOWN commands to the server
+         side.
+
+       * Added function silc_server_create_connection function to create
+         connection to remote router.  My server implementation actually
+         does not allow router to connect to normal server (it expects
+         that normal server always initiates the connection to the router)
+         so the CONNECT command is only good for connecting to another
+         router.
+
+Sat Feb 24 16:03:45 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added SILC_NOTIFY_TYPE_KICKED to indicate that the client
+         or some other client was kicked from the channel.
+
+         Implemented the handling of the notify type to both client
+         and server.
+
+         Implemented silc_server_send_notify_kicked to send the KICKED
+         notify.  It is used to send it to the server's primary router.
+
+       * Implemented the KICK command into server and client.
+
+       * Added `query' argument to the silc_idlist_get_client function
+         to indicate whether to query the client from server or not if
+         it was not found.
+
+       * Added new command status type SILC_STATUS_ERR_NO_CHANNEL_FOPRIV
+         to indicate that the client is not channel founder.
+
+       * Updated TODO.
+
+Sat Feb 24 00:00:55 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Removed the rng context from SilcPacketContext structure and
+         changed that the packet routine uses the Global RNG API.
+
+Fri Feb 23 11:22:57 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added support for quit message that client can "leave" on the
+         channel when it quits the SILC.  It is ditributed inside the
+         SILC_NOTIFY_TYPE_SIGNOFF notify type.
+
+         Added silc_server_free_client_data that will take the
+         signoff message as argument.
+
+       * Changed SKE routines to use the silc_pkcs_sign/verify routines.
+
+Thu Feb 22 23:05:36 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Updated parts of the protocol specification to keep it up
+         to date.
+
+Thu Feb 22 15:08:20 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added List flag (SILC_PACKET_FLAG_LIST) to indicate list of
+         payloads in one packet.
+
+       * Deprecated following packet types: NEW_ID_LIST, NEW_CHANNEL_LIST,
+         NEW_CHANNEL_USER_LIST, SET_MODE and SET_MODE_LIST.  List packets
+         use now the new List flag.
+
+       * Also deprecated the following packet types: REPLACE_ID,
+         NEW_CHANNEL_USER and REMOVE_CHANNEL_USER packet types.
+        
+       * Added list support for Notify packet in server.
+
+       * Added silc_server_send_notify_channel_change to send the
+         CHANNEL_CHANGE notify type to replace channel ID's.  Deprecates
+         the silc_server_send_replace_id.
+
+       * Added silc_server_send_notify_nick_change to send the
+         NICK_CHANGE notify type.  Deprecates the function
+         silc_server_send_replace_id.
+
+       * Added silc_server_send_notify_join to send the JOIN notify type.
+         Deprecates the function silc_server_send_new_channel_user.
+
+       * Added silc_server_send_notify_leave to send LEAVE notify type.
+         Deprecates the function silc_server_send_remove_channel_user.
+
+       * Added silc_server_send_notify_cmode and 
+         silc_server_send_notify_cumode to send CMODE and CUMODE notify
+         types.  Deprecates the silc_server_send_set_mode function.
+
+       * Added SERVER_SIGNOFF notify type to indicate that server has
+         quit.  This means that all clients on the channel from that 
+         server will drop.  This can be also used when netsplit happens.
+
+         Deprecated REMOVE_ID packet type since it is not needed anymore
+         even from server.
+
+         Added silc_server_send_notify_server_signoff to send the
+         SERVER_SIGNOFF notify type.  Deprecates the function
+         silc_server_send_remove_id.
+
+         Added also silc_server_send_notify_signoff to send the
+         SIGNOFF notify type.
+
+       * Employed the PKCS #1. It is the mandatory way to do RSA in the
+         SILC protocol from this day on.  Changed the protocol 
+         specification as well.
+
+       * Added silc_server_send_notify_topic_set to send TOPIC_SET
+         notify type.  It is used between routers to notify about
+         topic changes on a channel.
+
+       * Added silc_id_dup into lib/silccore/id.[ch] to duplicate
+         ID data.
+
+       * Partly updated the protocol specification to comply with the
+         changes now made.  It is still though a bit outdated.
+
+       * The JOIN notify type now takes one extra argument <Channel ID>.
+         The packet used to be destined to the channel but now the
+         JOIN type may be sent as list thus it is impossible to 
+         destine it to any specific channel.  By adding this argument
+         it is again possible.
+
+Wed Feb 21 22:39:30 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added CREDITS file.  The CHANGES and CREDITS file will appear
+         in the distribution as well.
+
+Wed Feb 21 14:17:04 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Implemented CMODE_CHANGE, CUMODE_CHANGE and TOPIC_SET notify
+         types in the server's silcd/packet_receive.c.
+
+       * Implemented CMODE and CUMODE to work in router environment.
+
+       * Fixed minor encoding and decoding buglet from the
+         lib/silccore/silcmode.c.
+
+       * Fixed buffer overflow from lib/silcclient/command.c in USERS
+         command parsing.
+
+Wed Feb 21 12:44:00 EET 2001  Mika Boström <bostik@lut.fi>
+
+       * Changed all SilcConfigServer* and silc_config_server* to
+         SilcServerConfig* and silc_server_config*, respectively.
+         Patch by Bostik.
+
+Wed Feb 21 00:10:00 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Associated the ID (client or server ID) to the Authentication
+         Payload to avoid any possibility of forging.  Updated the
+         protocol specification and the code accordingly.
+
+Tue Feb 20 14:14:14 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * The RSA key length is now save to the RsaKey context in the
+         key generation process in lib/silccrypt/rsa.c.  The key length
+         is now used to figure out the maximum size of the block allowed
+         to be encrypted/signed.
+
+       * Added silc_mp_mp2bin_noalloc into lib/silcmath/mpbin.[ch].  It
+         is equivalent to the silc_mp_mp2bin but does not allocate any
+         memory.
+
+       * Changed silc_mp_mp2bin API to take length argument.  If it is
+         non-zero then the buffer is allocated that large.  If zero, then
+         the size is approximated using silc_mp_sizeinbase, which however
+         is not relieable.
+
+       * Created Global RNG API which is global RNG that application can
+         initialize.  After initializing, any routine anywhere in the
+         code (including library) can use RNG without allocating a new
+         RNG object.  This was done to allow this sort of use of the 
+         RNG in code that has no chance to allocate RNG object.  All
+         applications currently allocate this and many routines in the
+         library use this.  Affected file lib/silccrypt/silcrng.[ch].
+
+       * Removed the RNG kludge from lib/silcmath/primegen.c and changed
+         it to use the Global RNG API.
+
+       * Defined Authentication Payload into protocol specification that
+         is used during SILC session to authenticate entities.  It is
+         used for example by client to authenticate itself to the server
+         to obtain server operator privileges.
+
+         Implemented this payload into the lib/silccore/silcauth.[ch].
+         Implemented also routines for public key based authentication
+         as the new protocol specification dictates.
+
+         Moved definitions of different authentication methods from
+         lib/silccore/silcprotocol.h into lib/silccore/silcauth.h.
+
+       * Added silc_pkcs_encrypt, silc_pkcs_decrypt, silc_pkcs_sign,
+         silc_pkcs_verify and silc_pkcs_sign_with_hash and
+         silc_pkcs_verify_with_hash functions into the file 
+         lib/silccrypt/silcpkcs.[ch].
+
+Mon Feb 19 19:59:28 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * The client entry's userinfo pointer must be always valid. 
+         Otherwise the [<unknown>] bug will surface beacuse the WHOIS
+         will fail since it requires the userinfo.  Now, the userinfo
+         is allocated as "" if actual userinfo does not exist.  Actually,
+         it must exist and it is totally Ok to drop client connections
+         that does not announce the userinfo.  However, we will make
+         this workaround for now.
+
+       * Added silc_net_get_remote_port into lib/silcutil/silcnet.[ch]
+         to return the remote port by socket.
+
+Mon Feb 19 14:26:49 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Changed SILC_SERVER_COMMAND_EXEC_PENDING macro to the name
+         SILC_SERVER_PENDING_EXEC and added an new macro
+         SILC_SERVER_PENDING_DESTRUCTOR which is called to free the
+         data or when error occurs while processing the pending command.
+
+         Added new argument `destructor' into silc_server_command_pending
+         and to the SilcServerCommandPending object.  This destructor is
+         now called after calling the pending callback or if error occurs
+         immediately.  If error occurs the actual pending callback won't
+         be called at all - only the destructor.  The destructor may be
+         NULL if destructor is not needed.
+
+         All this applies for client library code as well.  Similar
+         changes were made there as well for the pending commands.
+
+         In the client, the application must now allocate the 
+         SilcClientCommandContext with the silc_client_command_alloc
+         function.
+
+       * Added reference counter to the SilcServerCommandContext.  Added
+         function silc_server_command_alloc and silc_server_command_dup 
+         functions.
+
+         Same type of functions added to the client library for the same
+         purpose as well.
+
+       * Removed the cmd_ident from IDListData away since it is now 
+         global for all connections.  It is the command identifier used
+         in command sending and with pending commands.  The affected file
+         is silcd/idlist.h.
+
+       * Added reference counter to the SilcSocketConnection objecet to
+         indicate the usage count of the object.  The object won't be
+         freed untill the reference counter hits zero.  Currently only
+         server uses this, and client ignores it.  The client must be
+         set to use this too later.  The affected files are
+         lib/silccore/silcsockconn.[ch].  Added also the function
+         silc_socket_dup to increase the reference counter.
+
+         This was mainly added because it is possible that the socket
+         is removed underneath of pending command or other async
+         operation.  Now it won't be free'd and proper DISCONNECTING
+         flags, etc. can be set to avoid sending data to connection that
+         is not valid anymore.
+
+       * Added SILC_SET_DISCONNECTING to server.c when EOF is read from
+         the connection.  After that it sets SILC_SET_DISCONNECTED.
+         It is, however, possible that the socket data is not still freed.
+         The silc_server_packet_process now checks that data is not
+         read or written to connection that is DISCONNECTED.  The socket
+         get's freed when the reference counter hits zero.
+
+Mon Feb 19 00:50:57 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Changed the client operation API: channel_message operation's
+         `sender' is now the client entry of the sender, not the nickname
+         and the `channel' is the channel entry, not the channel name.
+
+         In the private_message operation the `sender' is now also the
+         client entry of the sender not the nickname.
+
+         Affected file is lib/silcclient/ops.h and all applications
+         using the client operations.
+
+Sat Feb 17 22:11:50 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Moved the calling of ops->connect() from connect_to_server_final
+         into receive_new_id functin since that is the point when the
+         client is actually allowed to send traffic to network.  The
+         affected file is lib/silcclient/client.c.
+
+Sat Feb 17 13:15:35 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * When receiving NEW_CHANNEL_LIST, NEW_CHANNEL_USER_LIST,
+         NEW_ID_LIST and SET_MODE_LIST packets, broadcast the list packet
+         (if needs broadcasting) instead of broadcasting the packets one
+         by one which would make a burst in the network traffic.
+
+       * Added `broadcast' argument to the functions in silcd/server.[ch]
+         silc_server_create_new_channel[_with_id] to indicate whether
+         to send New Channel packet to primary router.
+
+Sat Feb 17 01:06:44 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added new function into the silcd/server.[ch] files:
+         silc_server_create_new_channel_with_id to create new channel with
+         already existing Channel ID.
+
+       * Added new packet type SILC_PACKET_SET_MODE_LIST into the file
+         lib/silccore/silcpacket.h.  This packet is used t send list of
+         Set Mode payloads inside one packet.  Server uses this to set
+         the modes for the channels and clients on those channels, that it
+         announced to the router when it connected to it.  The protocol
+         specification has been updated accordingly.
+
+       * The silc_server_new_channel did not handle the packet coming
+         from normal server as it normally does not send that.  However,
+         when it announces its channels it does send it.  Implemented
+         the support for that.
+
+       * Added SILC_ID_CHANNEL_COMPARE macro to compare to Channel ID's
+         into the file lib/silccore/id.h.
+
+Fri Feb 16 23:57:29 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Fixed memory leaks in the functions silc_idlist_del_client,
+         silc_idlist_del_channel and silc_idlist_del_server in the file
+         silcd/idlist.c.  All of those leaked like a sieve.
+
+       * Fixed some small memory leaks in the client's function
+         silc_client_notify_by_server.
+
+       * Added functions into silcd/server.c: silc_server_announce_clients,
+         silc_server_announce_channels and silc_server_announce_server.
+         These functions are used by normal and router server to announce
+         to its primary router about clients, channels and servers (when
+         router) that we own.  This is done after we've connected to the
+         router.
+
+         These functions effectively implements the following packet types:
+         SILC_PACKET_NEW_CHANNEL_LIST, SILC_PACKET_NEW_CHANNEL_USER_LIST
+         and SILC_PACKET_NEW_ID_LIST.
+
+       * Added new functions into the silcd/packet_receive.[ch]:
+         silc_server_new_id_list, silc_server_new_channel_list and
+         silc_server_new_channel_user_list to handle the incoming 
+         NEW_ID_LIST, NEW_CHANNEL_LIST and NEW_CHANNEL_USER_LIST packets.
+
+       * Added support of changing Channel ID in the function
+         silc_server_replace_id.  If the server that announces a channel
+         to the router already exists in the router (with same name but
+         with different Channel ID), router is responsible to send
+         Replace ID packet to the server and force the server to change
+         the Channel ID to the one router has.
+
+       * Added new notify type SILC_NOTIFY_TYPE_CHANNEL_CHANGE to notify
+         client that the Channel ID has been changed by the router.  The
+         normal server sends this to the client.  Client must start using
+         the new Channel ID as the channel's ID.
+
+         Implemented handling of this new type into lib/silcclient/client.c
+         into the function silc_client_notify_by_server.
+
+       * Added new function silc_idlist_replace_channel_id into the files
+         silcd/idlist.[ch] to replace the Channel ID.
+
+Fri Feb 16 14:14:00 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Call silc_server_command_identify_check always when processing
+         the IDENTIFY command in silcd/command.c
+
+Thu Feb 15 20:07:37 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added new packet type SILC_PACKET_HEARTBEAT that is used to
+         send keepalive packets.  The packet can be sent by clients, 
+         servers and routers.
+
+         Added function silc_socket_set_heartbeat into the file
+         lib/silccore/silcsockconn.[ch] to set the heartbeat timeout.
+         If not set, the heartbeat is not performed.  The actual 
+         heartbeat is implemented in the low level socket connection
+         library.  However, application is responsible of actually
+         sending the packet.
+
+         Added silc_server_send_heartbeat to send the actual heartbeat
+         packet into silcd/packet_send.[ch].  Server now performs
+         keepalive with all connections.
+
+       * Added silc_task_get_first function into lib/silcutil/silctask.c
+         to return the timeout task with shortest timeout.  There was a bug
+         in task unregistration that caused problems.  TODO has been
+         updated to include that task system must be rewritten.
+
+       * The client library will now resolve the client information when
+         receiving JOIN notify from server for client that we know but
+         have incomplete information.
+
+       * Rewrote parts of silc_server_remove_from_channels and
+         silc_server_remove_from_one_channel as they did not remove the
+         channel in some circumstances even though they should've.
+
+       * Encryption problem encountered in server:
+
+         The LEAVE command used to send the Channel Key packet to the
+         router immediately after generating it.  However, the code
+         had earlier sent Remove Channel user packet but not immediately,
+         ie. it was put to queue.  The order of packets in the router
+         was that Channel Key packet was first and Remove Channel User
+         packet was second, even though they were encrypted in the
+         reverse order.  For this reason, MAC check failed.  Now, this
+         is fixed by not sending the Channel Key packet immediately but
+         putting it to queue.  However, this is more fundamental problem:
+         packets that are in queue should actually not be encrypted 
+         because packets that are sent immediately gets encrypted
+         actually with wrong IV (and thus MAC check fails).  So, packets
+         that are in queue should be encrypted when they are sent to
+         the wire and not when they put to the queue.
+
+         However, the problem is that the current system has not been
+         designed to work that way.  Instead, the packet is encrypted
+         as soon as possible and left to the queue.  The queue is then
+         just purged into wire.  There won't be any fixes for this
+         any time soon.  So, the current semantic for packet sending
+         is as follows:
+
+         o If you send packet to remote host and do not force the send
+         (the packet will be in queue) then all subsequent packets to the
+         same remote host must also be put to the queue.  Only after the
+         queue has been purged is it safe again to force the packet
+         send immediately.
+
+         o If you send all packets immediately then it safe to send
+         any of subsequent packets through the queue, however, after
+         the first packet is put to queue then any subsequent packets
+         must also be put to the queue.
+
+         Follow these rules and everything works fine.
+
+Thu Feb 15 14:24:32 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added new function silc_server_remove_clients_by_server to
+         remove all client entries from ID list when the server connection
+         is lost.  In this case it is also important to invalidate all
+         client entires as they hold the invalid server entry.  This
+         fixes fatal bug when server has lost connection and will reconnect
+         again.
+
 Wed Feb 14 16:03:25 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
 
        * Made some sanity checks to silc_server_daemonise like to check